tithon 0.2.2__tar.gz → 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (285) hide show
  1. tithon-0.2.4/.git-blame-ignore-revs +9 -0
  2. tithon-0.2.4/.github/ISSUE_TEMPLATE/bug_report.yml +100 -0
  3. tithon-0.2.4/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. tithon-0.2.4/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
  5. tithon-0.2.4/.github/workflows/ci.yml +87 -0
  6. {tithon-0.2.2 → tithon-0.2.4}/.gitignore +0 -3
  7. tithon-0.2.4/.release-please-manifest.json +4 -0
  8. tithon-0.2.4/.vscode/extensions.json +3 -0
  9. tithon-0.2.4/.vscode/settings.json +28 -0
  10. {tithon-0.2.2 → tithon-0.2.4}/CHANGELOG.md +32 -0
  11. tithon-0.2.4/CONTRIBUTING.md +209 -0
  12. {tithon-0.2.2 → tithon-0.2.4}/PKG-INFO +37 -2
  13. {tithon-0.2.2 → tithon-0.2.4}/README.md +35 -1
  14. {tithon-0.2.2 → tithon-0.2.4}/docs/SPEC.md +356 -99
  15. {tithon-0.2.2 → tithon-0.2.4}/extension/CHANGELOG.md +23 -0
  16. {tithon-0.2.2 → tithon-0.2.4}/extension/README.md +19 -2
  17. tithon-0.2.4/extension/biome.json +39 -0
  18. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/runTest.ts +8 -4
  19. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/seed.ts +3 -3
  20. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/addcell.test.ts +5 -2
  21. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/autoopen.test.ts +41 -15
  22. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/autostart.test.ts +31 -12
  23. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_addmd.test.ts +11 -5
  24. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_editsave.test.ts +13 -5
  25. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_emptycell.test.ts +47 -13
  26. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_imageorder.test.ts +31 -9
  27. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_input_hang.test.ts +52 -15
  28. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_insert_reconnect.test.ts +52 -19
  29. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_insertheader.test.ts +6 -4
  30. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_kerneldeath.test.ts +14 -5
  31. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_mdsave.test.ts +5 -3
  32. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_rerun.test.ts +50 -18
  33. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_rerun_reconnect.test.ts +56 -18
  34. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_runall_error.test.ts +33 -10
  35. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_runall_md.test.ts +15 -5
  36. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_staleedit.test.ts +43 -14
  37. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/celltoggle.test.ts +54 -21
  38. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/clearspinner.test.ts +34 -15
  39. tithon-0.2.4/extension/integration/suite/closedsession.test.ts +161 -0
  40. tithon-0.2.4/extension/integration/suite/confirmdestructive.test.ts +175 -0
  41. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/crosscell.test.ts +40 -14
  42. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/demo.test.ts +70 -26
  43. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/disposeflush.test.ts +28 -14
  44. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/dupcode.test.ts +18 -7
  45. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/editedcell.test.ts +6 -7
  46. tithon-0.2.4/extension/integration/suite/editorpin.test.ts +465 -0
  47. tithon-0.2.4/extension/integration/suite/index.ts +44 -0
  48. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/interrupt.test.ts +48 -13
  49. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/live.test.ts +19 -10
  50. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/livedisplay.test.ts +16 -9
  51. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/livereconnect.test.ts +57 -18
  52. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lsp.test.ts +45 -23
  53. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lspdef.test.ts +26 -13
  54. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lspinlay.test.ts +63 -24
  55. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lsproundtrip.test.ts +37 -19
  56. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/multicell.test.ts +29 -13
  57. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/opentextshot.test.ts +6 -10
  58. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/orphanrestore.test.ts +18 -7
  59. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnect.test.ts +48 -19
  60. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnectprogress.test.ts +41 -17
  61. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnectstates.test.ts +54 -19
  62. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reopen.test.ts +24 -9
  63. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reopenafterroundtrip.test.ts +38 -15
  64. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restartdaemon.test.ts +45 -18
  65. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restartkernel.test.ts +27 -10
  66. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restore.test.ts +2 -4
  67. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/richoutputs.test.ts +73 -31
  68. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/runcell.test.ts +14 -4
  69. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/screenshot.test.ts +23 -11
  70. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/trainloop.test.ts +41 -18
  71. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/trainsync.test.ts +89 -35
  72. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/twofiles.test.ts +22 -8
  73. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widget.test.ts +31 -11
  74. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widgetdisposeflush.test.ts +24 -8
  75. {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widgetlive.test.ts +33 -10
  76. {tithon-0.2.2 → tithon-0.2.4}/extension/package-lock.json +303 -7
  77. {tithon-0.2.2 → tithon-0.2.4}/extension/package.json +71 -8
  78. {tithon-0.2.2 → tithon-0.2.4}/extension/src/cellAttach.ts +9 -8
  79. {tithon-0.2.2 → tithon-0.2.4}/extension/src/codeLens.ts +5 -4
  80. {tithon-0.2.2 → tithon-0.2.4}/extension/src/daemonClient.ts +30 -15
  81. {tithon-0.2.2 → tithon-0.2.4}/extension/src/daemonProcess.ts +50 -25
  82. tithon-0.2.4/extension/src/extension.ts +681 -0
  83. {tithon-0.2.2 → tithon-0.2.4}/extension/src/liveSync.ts +11 -13
  84. {tithon-0.2.2 → tithon-0.2.4}/extension/src/notebookSerializer.ts +6 -12
  85. tithon-0.2.4/extension/src/notify.ts +69 -0
  86. {tithon-0.2.2 → tithon-0.2.4}/extension/src/outputFold.ts +19 -3
  87. {tithon-0.2.2 → tithon-0.2.4}/extension/src/richOutput.ts +25 -15
  88. {tithon-0.2.2 → tithon-0.2.4}/extension/src/serializer.ts +7 -7
  89. {tithon-0.2.2 → tithon-0.2.4}/extension/src/sessionClient.ts +95 -39
  90. {tithon-0.2.2 → tithon-0.2.4}/extension/src/sessionController.ts +340 -155
  91. {tithon-0.2.2 → tithon-0.2.4}/extension/src/tracebackFormatter.ts +3 -2
  92. {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetRender.ts +7 -9
  93. {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetRendererEntry.ts +18 -19
  94. {tithon-0.2.2 → tithon-0.2.4}/extension/test/artifactCache.test.ts +16 -4
  95. {tithon-0.2.2 → tithon-0.2.4}/extension/test/cellAttach.test.ts +23 -5
  96. tithon-0.2.4/extension/test/closedSession.test.ts +98 -0
  97. tithon-0.2.4/extension/test/daemonProcess.test.ts +33 -0
  98. {tithon-0.2.2 → tithon-0.2.4}/extension/test/fakeDaemon.ts +19 -7
  99. {tithon-0.2.2 → tithon-0.2.4}/extension/test/kernelGeneration.test.ts +38 -15
  100. {tithon-0.2.2 → tithon-0.2.4}/extension/test/liveDaemon.ts +3 -3
  101. {tithon-0.2.2 → tithon-0.2.4}/extension/test/liveSync.test.ts +46 -15
  102. tithon-0.2.4/extension/test/notify.test.ts +86 -0
  103. {tithon-0.2.2 → tithon-0.2.4}/extension/test/outputFold.test.ts +79 -23
  104. {tithon-0.2.2 → tithon-0.2.4}/extension/test/reconnectClient.test.ts +7 -4
  105. {tithon-0.2.2 → tithon-0.2.4}/extension/test/restore.test.ts +5 -4
  106. {tithon-0.2.2 → tithon-0.2.4}/extension/test/richDaemon.test.ts +12 -6
  107. {tithon-0.2.2 → tithon-0.2.4}/extension/test/richOutput.test.ts +50 -12
  108. {tithon-0.2.2 → tithon-0.2.4}/extension/test/serializer.test.ts +15 -24
  109. {tithon-0.2.2 → tithon-0.2.4}/extension/test/setup.ts +1 -5
  110. {tithon-0.2.2 → tithon-0.2.4}/extension/test/tracebackFormatter.test.ts +8 -4
  111. tithon-0.2.4/extension/test/vscodeMock.ts +75 -0
  112. {tithon-0.2.2 → tithon-0.2.4}/extension/test/widget.test.ts +6 -5
  113. {tithon-0.2.2 → tithon-0.2.4}/extension/test/widgetBuffers.test.ts +24 -9
  114. {tithon-0.2.2 → tithon-0.2.4}/extension/test/widgetEvents.test.ts +26 -11
  115. tithon-0.2.4/extension/vitest.config.ts +24 -0
  116. {tithon-0.2.2 → tithon-0.2.4}/pyproject.toml +28 -2
  117. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_input_bridge.py +3 -1
  118. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_interrupt_priority.py +24 -14
  119. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_kernel_death.py +17 -6
  120. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_multi.py +73 -37
  121. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v1.py +4 -1
  122. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v2.py +1 -0
  123. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v3.py +2 -3
  124. {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v5.py +3 -6
  125. {tithon-0.2.2 → tithon-0.2.4}/scripts/_clear_client.py +8 -4
  126. tithon-0.2.4/scripts/_clone_client.py +75 -0
  127. {tithon-0.2.2 → tithon-0.2.4}/scripts/_lastseq.py +1 -0
  128. {tithon-0.2.2 → tithon-0.2.4}/scripts/_multi_client.py +17 -7
  129. {tithon-0.2.2 → tithon-0.2.4}/scripts/_stalled_client.py +1 -0
  130. {tithon-0.2.2 → tithon-0.2.4}/scripts/_workdir_client.py +18 -8
  131. {tithon-0.2.2 → tithon-0.2.4}/scripts/lib.sh +1 -1
  132. {tithon-0.2.2 → tithon-0.2.4}/scripts/run_verify.sh +10 -10
  133. {tithon-0.2.2 → tithon-0.2.4}/scripts/v39.sh +2 -2
  134. tithon-0.2.4/scripts/v61.sh +98 -0
  135. tithon-0.2.4/scripts/v62.sh +78 -0
  136. tithon-0.2.4/scripts/v63.sh +41 -0
  137. tithon-0.2.4/scripts/v64.sh +95 -0
  138. tithon-0.2.4/scripts/v65.sh +61 -0
  139. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/__main__.py +1 -0
  140. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/artifacts.py +1 -0
  141. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/cli.py +15 -6
  142. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/daemon.py +385 -134
  143. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/folding.py +36 -8
  144. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/journal.py +164 -39
  145. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/kernel.py +17 -23
  146. tithon-0.2.4/src/tithon/sidecar.py +258 -0
  147. {tithon-0.2.2 → tithon-0.2.4}/src/tithon/widgets.py +8 -4
  148. {tithon-0.2.2 → tithon-0.2.4}/test/test_artifacts.py +17 -6
  149. {tithon-0.2.2 → tithon-0.2.4}/test/test_backpressure.py +1 -2
  150. {tithon-0.2.2 → tithon-0.2.4}/test/test_barrier.py +11 -5
  151. {tithon-0.2.2 → tithon-0.2.4}/test/test_clear.py +4 -3
  152. tithon-0.2.4/test/test_closed_by_user.py +87 -0
  153. {tithon-0.2.2 → tithon-0.2.4}/test/test_comm_ordering.py +16 -4
  154. {tithon-0.2.2 → tithon-0.2.4}/test/test_display_registry.py +7 -10
  155. {tithon-0.2.2 → tithon-0.2.4}/test/test_folding.py +165 -79
  156. {tithon-0.2.2 → tithon-0.2.4}/test/test_gc.py +1 -0
  157. {tithon-0.2.2 → tithon-0.2.4}/test/test_inflight_recovery.py +20 -19
  158. {tithon-0.2.2 → tithon-0.2.4}/test/test_journal_origin.py +21 -5
  159. {tithon-0.2.2 → tithon-0.2.4}/test/test_kernel_group_kill.py +2 -1
  160. {tithon-0.2.2 → tithon-0.2.4}/test/test_kill_restart_race.py +1 -0
  161. {tithon-0.2.2 → tithon-0.2.4}/test/test_liveness.py +7 -7
  162. {tithon-0.2.2 → tithon-0.2.4}/test/test_lost_state.py +10 -5
  163. {tithon-0.2.2 → tithon-0.2.4}/test/test_orphan.py +5 -2
  164. {tithon-0.2.2 → tithon-0.2.4}/test/test_payload.py +1 -0
  165. {tithon-0.2.2 → tithon-0.2.4}/test/test_rebuild_mirror_streaming.py +29 -12
  166. {tithon-0.2.2 → tithon-0.2.4}/test/test_restart_drain.py +4 -4
  167. {tithon-0.2.2 → tithon-0.2.4}/test/test_runall_batch.py +5 -9
  168. {tithon-0.2.2 → tithon-0.2.4}/test/test_session_layout.py +5 -4
  169. tithon-0.2.4/test/test_sidecar.py +547 -0
  170. {tithon-0.2.2 → tithon-0.2.4}/test/test_widget_buffer_delta.py +36 -11
  171. {tithon-0.2.2 → tithon-0.2.4}/test/test_widgets.py +46 -20
  172. {tithon-0.2.2 → tithon-0.2.4}/uv.lock +30 -1
  173. tithon-0.2.2/.claude/settings.local.json +0 -5
  174. tithon-0.2.2/.release-please-manifest.json +0 -4
  175. tithon-0.2.2/docs/vscode-jupyter-comparison.md +0 -451
  176. tithon-0.2.2/extension/integration/suite/index.ts +0 -25
  177. tithon-0.2.2/extension/src/extension.ts +0 -499
  178. tithon-0.2.2/extension/vitest.config.ts +0 -14
  179. {tithon-0.2.2 → tithon-0.2.4}/.gitattributes +0 -0
  180. {tithon-0.2.2 → tithon-0.2.4}/.github/scripts/format-release-pr-body.js +0 -0
  181. {tithon-0.2.2 → tithon-0.2.4}/.github/scripts/format-release-pr-body.test.js +0 -0
  182. {tithon-0.2.2 → tithon-0.2.4}/.github/workflows/release-please.yml +0 -0
  183. {tithon-0.2.2 → tithon-0.2.4}/LICENSE +0 -0
  184. {tithon-0.2.2 → tithon-0.2.4}/docs/demo.gif +0 -0
  185. {tithon-0.2.2 → tithon-0.2.4}/docs/demo.mp4 +0 -0
  186. {tithon-0.2.2 → tithon-0.2.4}/docs/how-it-works.png +0 -0
  187. {tithon-0.2.2 → tithon-0.2.4}/docs/index.html +0 -0
  188. {tithon-0.2.2 → tithon-0.2.4}/docs/known_issue.md +0 -0
  189. {tithon-0.2.2 → tithon-0.2.4}/extension/.vscodeignore +0 -0
  190. {tithon-0.2.2 → tithon-0.2.4}/extension/LICENSE +0 -0
  191. {tithon-0.2.2 → tithon-0.2.4}/extension/esbuild.mjs +0 -0
  192. {tithon-0.2.2 → tithon-0.2.4}/extension/icon.png +0 -0
  193. {tithon-0.2.2 → tithon-0.2.4}/extension/src/artifactCache.ts +0 -0
  194. {tithon-0.2.2 → tithon-0.2.4}/extension/src/css.d.ts +0 -0
  195. {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetTheme.css +0 -0
  196. {tithon-0.2.2 → tithon-0.2.4}/extension/test/fixtures/tqdm_widget_state.json +0 -0
  197. {tithon-0.2.2 → tithon-0.2.4}/extension/tsconfig.integration.json +0 -0
  198. {tithon-0.2.2 → tithon-0.2.4}/extension/tsconfig.json +0 -0
  199. {tithon-0.2.2 → tithon-0.2.4}/release-please-config.json +0 -0
  200. {tithon-0.2.2 → tithon-0.2.4}/scripts/Makefile +0 -0
  201. {tithon-0.2.2 → tithon-0.2.4}/scripts/bughunt.sh +0 -0
  202. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/_gen.py +0 -0
  203. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/dup_run.py +0 -0
  204. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/editsave.py +0 -0
  205. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/editsave_crlf.py +0 -0
  206. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/empty_cells.py +0 -0
  207. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/header.py +0 -0
  208. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/imageorder.py +0 -0
  209. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/input_hang.py +0 -0
  210. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/kerneldeath.py +0 -0
  211. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/mdcell.py +0 -0
  212. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/one_cell.py +0 -0
  213. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/rerun.py +0 -0
  214. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/runall_error.py +0 -0
  215. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/runall_md.py +0 -0
  216. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/two_cell.py +0 -0
  217. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/crlf_mixed.py +0 -0
  218. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/crlf_string_marker.py +0 -0
  219. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/empty_cells.py +0 -0
  220. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/magics_markdown.py +0 -0
  221. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/mixed_indent.py +0 -0
  222. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/module_header.py +0 -0
  223. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/no_final_newline.py +0 -0
  224. {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/string_marker.py +0 -0
  225. {tithon-0.2.2 → tithon-0.2.4}/scripts/demo_reconnect.sh +0 -0
  226. {tithon-0.2.2 → tithon-0.2.4}/scripts/record_demo.sh +0 -0
  227. {tithon-0.2.2 → tithon-0.2.4}/scripts/shot.sh +0 -0
  228. {tithon-0.2.2 → tithon-0.2.4}/scripts/shotlsp.sh +0 -0
  229. {tithon-0.2.2 → tithon-0.2.4}/scripts/v1.sh +0 -0
  230. {tithon-0.2.2 → tithon-0.2.4}/scripts/v10.sh +0 -0
  231. {tithon-0.2.2 → tithon-0.2.4}/scripts/v11.sh +0 -0
  232. {tithon-0.2.2 → tithon-0.2.4}/scripts/v12.sh +0 -0
  233. {tithon-0.2.2 → tithon-0.2.4}/scripts/v13.sh +0 -0
  234. {tithon-0.2.2 → tithon-0.2.4}/scripts/v14.sh +0 -0
  235. {tithon-0.2.2 → tithon-0.2.4}/scripts/v15.sh +0 -0
  236. {tithon-0.2.2 → tithon-0.2.4}/scripts/v16.sh +0 -0
  237. {tithon-0.2.2 → tithon-0.2.4}/scripts/v17.sh +0 -0
  238. {tithon-0.2.2 → tithon-0.2.4}/scripts/v18.sh +0 -0
  239. {tithon-0.2.2 → tithon-0.2.4}/scripts/v19.sh +0 -0
  240. {tithon-0.2.2 → tithon-0.2.4}/scripts/v2.sh +0 -0
  241. {tithon-0.2.2 → tithon-0.2.4}/scripts/v20.sh +0 -0
  242. {tithon-0.2.2 → tithon-0.2.4}/scripts/v21.sh +0 -0
  243. {tithon-0.2.2 → tithon-0.2.4}/scripts/v22.sh +0 -0
  244. {tithon-0.2.2 → tithon-0.2.4}/scripts/v23.sh +0 -0
  245. {tithon-0.2.2 → tithon-0.2.4}/scripts/v24.sh +0 -0
  246. {tithon-0.2.2 → tithon-0.2.4}/scripts/v26.sh +0 -0
  247. {tithon-0.2.2 → tithon-0.2.4}/scripts/v27.sh +0 -0
  248. {tithon-0.2.2 → tithon-0.2.4}/scripts/v28.sh +0 -0
  249. {tithon-0.2.2 → tithon-0.2.4}/scripts/v29.sh +0 -0
  250. {tithon-0.2.2 → tithon-0.2.4}/scripts/v3.sh +0 -0
  251. {tithon-0.2.2 → tithon-0.2.4}/scripts/v30.sh +0 -0
  252. {tithon-0.2.2 → tithon-0.2.4}/scripts/v31.sh +0 -0
  253. {tithon-0.2.2 → tithon-0.2.4}/scripts/v32.sh +0 -0
  254. {tithon-0.2.2 → tithon-0.2.4}/scripts/v33.sh +0 -0
  255. {tithon-0.2.2 → tithon-0.2.4}/scripts/v34.sh +0 -0
  256. {tithon-0.2.2 → tithon-0.2.4}/scripts/v35.sh +0 -0
  257. {tithon-0.2.2 → tithon-0.2.4}/scripts/v37.sh +0 -0
  258. {tithon-0.2.2 → tithon-0.2.4}/scripts/v38.sh +0 -0
  259. {tithon-0.2.2 → tithon-0.2.4}/scripts/v4.sh +0 -0
  260. {tithon-0.2.2 → tithon-0.2.4}/scripts/v40.sh +0 -0
  261. {tithon-0.2.2 → tithon-0.2.4}/scripts/v41.sh +0 -0
  262. {tithon-0.2.2 → tithon-0.2.4}/scripts/v42.sh +0 -0
  263. {tithon-0.2.2 → tithon-0.2.4}/scripts/v43.sh +0 -0
  264. {tithon-0.2.2 → tithon-0.2.4}/scripts/v44.sh +0 -0
  265. {tithon-0.2.2 → tithon-0.2.4}/scripts/v45.sh +0 -0
  266. {tithon-0.2.2 → tithon-0.2.4}/scripts/v46.sh +0 -0
  267. {tithon-0.2.2 → tithon-0.2.4}/scripts/v47.sh +0 -0
  268. {tithon-0.2.2 → tithon-0.2.4}/scripts/v48.sh +0 -0
  269. {tithon-0.2.2 → tithon-0.2.4}/scripts/v49.sh +0 -0
  270. {tithon-0.2.2 → tithon-0.2.4}/scripts/v5.sh +0 -0
  271. {tithon-0.2.2 → tithon-0.2.4}/scripts/v50.sh +0 -0
  272. {tithon-0.2.2 → tithon-0.2.4}/scripts/v51.sh +0 -0
  273. {tithon-0.2.2 → tithon-0.2.4}/scripts/v52.sh +0 -0
  274. {tithon-0.2.2 → tithon-0.2.4}/scripts/v53.sh +0 -0
  275. {tithon-0.2.2 → tithon-0.2.4}/scripts/v54.sh +0 -0
  276. {tithon-0.2.2 → tithon-0.2.4}/scripts/v55.sh +0 -0
  277. {tithon-0.2.2 → tithon-0.2.4}/scripts/v56.sh +0 -0
  278. {tithon-0.2.2 → tithon-0.2.4}/scripts/v57.sh +0 -0
  279. {tithon-0.2.2 → tithon-0.2.4}/scripts/v58.sh +0 -0
  280. {tithon-0.2.2 → tithon-0.2.4}/scripts/v59.sh +0 -0
  281. {tithon-0.2.2 → tithon-0.2.4}/scripts/v6.sh +0 -0
  282. {tithon-0.2.2 → tithon-0.2.4}/scripts/v60.sh +0 -0
  283. {tithon-0.2.2 → tithon-0.2.4}/scripts/v7.sh +0 -0
  284. {tithon-0.2.2 → tithon-0.2.4}/scripts/v8.sh +0 -0
  285. {tithon-0.2.2 → tithon-0.2.4}/scripts/v9.sh +0 -0
@@ -0,0 +1,9 @@
1
+ # Commits that only reformat. `git blame` skips these so it lands on the
2
+ # commit that last changed the code, not the one that moved the whitespace.
3
+ #
4
+ # Enable locally with:
5
+ # git config blame.ignoreRevsFile .git-blame-ignore-revs
6
+ # (GitHub honours this file automatically.)
7
+
8
+ # style: format the tree with ruff and biome
9
+ f6c1838afe7dc977d6f08e8b65f548db1f1091d3
@@ -0,0 +1,100 @@
1
+ name: Bug report
2
+ description: Something behaved differently than you expected
3
+ labels: ["bug"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Thanks for the report. The daemon outlives the client, so what the UI
9
+ showed is rarely enough to locate the fault — the log and the sequence
10
+ of session events below are what make a bug fixable.
11
+
12
+ Please write in English so the history stays searchable for everyone.
13
+
14
+ - type: textarea
15
+ id: what-happened
16
+ attributes:
17
+ label: What happened
18
+ description: What you expected, and what you got instead.
19
+ validations:
20
+ required: true
21
+
22
+ - type: textarea
23
+ id: repro
24
+ attributes:
25
+ label: Steps to reproduce
26
+ description: >
27
+ As a sequence of session events. Whether the client disconnected, and
28
+ whether the daemon or the host restarted, are usually the decisive
29
+ details.
30
+ placeholder: |
31
+ 1. start the daemon
32
+ 2. run a cell that prints for 30s
33
+ 3. close the VSCode window while it runs
34
+ 4. reopen the file after it would have finished
35
+ 5. the output up to the disconnect is missing
36
+ validations:
37
+ required: true
38
+
39
+ - type: textarea
40
+ id: log
41
+ attributes:
42
+ label: Daemon log
43
+ description: >
44
+ From `$TITHON_HOME/daemon.log` (`~/.tithon/daemon.log` by default). The
45
+ interesting window usually starts at the last `attach` before things
46
+ went wrong. Feel free to trim anything sensitive.
47
+ render: text
48
+ validations:
49
+ required: false
50
+
51
+ - type: textarea
52
+ id: status
53
+ attributes:
54
+ label: tithon status
55
+ description: Output of `tithon status`, if the daemon was still up.
56
+ render: text
57
+ validations:
58
+ required: false
59
+
60
+ - type: input
61
+ id: versions
62
+ attributes:
63
+ label: Versions
64
+ description: Tithon (`pip show tithon`), the VSCode extension, VSCode, and Python.
65
+ placeholder: "tithon 0.2.3 / extension 0.2.3 / VSCode 1.99.0 / Python 3.12.4"
66
+ validations:
67
+ required: true
68
+
69
+ - type: dropdown
70
+ id: connection
71
+ attributes:
72
+ label: How do you connect to the host?
73
+ description: Tithon's job is surviving a flaky link, so its shape is diagnostic.
74
+ options:
75
+ - Local (same machine)
76
+ - VSCode Tunnel
77
+ - Remote-SSH
78
+ - WSL
79
+ - Container / devcontainer
80
+ - Other (describe below)
81
+ validations:
82
+ required: true
83
+
84
+ - type: input
85
+ id: environment
86
+ attributes:
87
+ label: OS / host
88
+ description: "`uname -a`, or the platform if that doesn't apply."
89
+ validations:
90
+ required: true
91
+
92
+ - type: checkboxes
93
+ id: checked
94
+ attributes:
95
+ label: Before submitting
96
+ options:
97
+ - label: I checked [docs/known_issue.md](https://github.com/rnoro/tithon/blob/main/docs/known_issue.md) and the open issues.
98
+ required: true
99
+ - label: This is a failure I actually observed, not one I expect could happen.
100
+ required: true
@@ -0,0 +1,8 @@
1
+ blank_issues_enabled: true
2
+ contact_links:
3
+ - name: Question or open-ended discussion
4
+ url: https://github.com/rnoro/tithon/discussions
5
+ about: Usage questions, setups that don't fit a bug report, and half-formed ideas.
6
+ - name: Contributing guide
7
+ url: https://github.com/rnoro/tithon/blob/main/CONTRIBUTING.md
8
+ about: Development setup, how changes are verified, and how to propose a design change.
@@ -0,0 +1,60 @@
1
+ name: Feature request / idea
2
+ description: Propose a capability, a change in behavior, or a design change
3
+ labels: ["enhancement"]
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Ideas are welcome, including ones that change how Tithon works
9
+ internally — [docs/SPEC.md](https://github.com/rnoro/tithon/blob/main/docs/SPEC.md)
10
+ describes today's design, it is not a fence around it. Making the case
11
+ here first is how a change gets agreed before anyone writes code.
12
+
13
+ Please write in English so the history stays searchable for everyone.
14
+
15
+ - type: textarea
16
+ id: problem
17
+ attributes:
18
+ label: The problem
19
+ description: >
20
+ What you were trying to do, and where Tithon got in the way. Concrete
21
+ workflows persuade more than abstract capabilities.
22
+ validations:
23
+ required: true
24
+
25
+ - type: textarea
26
+ id: proposal
27
+ attributes:
28
+ label: What you'd like instead
29
+ description: The behavior you want. A rough sketch is fine.
30
+ validations:
31
+ required: true
32
+
33
+ - type: textarea
34
+ id: design-impact
35
+ attributes:
36
+ label: Does this touch the current design?
37
+ description: >
38
+ If it changes something Tithon currently relies on — how kernels are
39
+ spawned, how sessions are scoped, how messages are journaled, how sync
40
+ or storage works, what the daemon binds to — say which property it
41
+ would replace and what would protect the same guarantee afterwards.
42
+ Unsure is a fine answer; say so and we'll work it out.
43
+ validations:
44
+ required: false
45
+
46
+ - type: textarea
47
+ id: alternatives
48
+ attributes:
49
+ label: Alternatives you considered
50
+ description: Including workarounds you are using today.
51
+ validations:
52
+ required: false
53
+
54
+ - type: checkboxes
55
+ id: participation
56
+ attributes:
57
+ label: Participation
58
+ options:
59
+ - label: I'd be willing to work on this if we agree on the approach.
60
+ required: false
@@ -0,0 +1,87 @@
1
+ name: ci
2
+
3
+ # The hermetic verification bundle (`make -C scripts fast`) drives real daemons
4
+ # and detached kernels and is NOT run here — contributors run it locally and
5
+ # paste its summary table into the pull request (see CONTRIBUTING.md).
6
+
7
+ on:
8
+ pull_request:
9
+ push:
10
+ branches:
11
+ - main
12
+ - develop
13
+
14
+ permissions:
15
+ contents: read
16
+
17
+ concurrency:
18
+ group: ci-${{ github.workflow }}-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ python:
23
+ name: python ${{ matrix.python-version }}
24
+ runs-on: ubuntu-latest
25
+ strategy:
26
+ fail-fast: false
27
+ matrix:
28
+ python-version: ["3.11", "3.13"]
29
+ steps:
30
+ - uses: actions/checkout@v4
31
+
32
+ - uses: astral-sh/setup-uv@v5
33
+ with:
34
+ enable-cache: true
35
+ python-version: ${{ matrix.python-version }}
36
+
37
+ - run: uv sync
38
+
39
+ - name: ruff check
40
+ if: matrix.python-version == '3.11'
41
+ run: uv run ruff check .
42
+
43
+ - name: ruff format --check
44
+ if: matrix.python-version == '3.11'
45
+ run: uv run ruff format --check .
46
+
47
+ - name: pytest
48
+ run: uv run pytest -q
49
+
50
+ extension:
51
+ name: extension
52
+ runs-on: ubuntu-latest
53
+ defaults:
54
+ run:
55
+ working-directory: extension
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+
59
+ - uses: actions/setup-node@v4
60
+ with:
61
+ node-version: "20"
62
+ cache: npm
63
+ cache-dependency-path: extension/package-lock.json
64
+
65
+ - run: npm ci
66
+
67
+ - name: biome
68
+ run: npm run lint
69
+
70
+ - name: tsc
71
+ run: npm run build
72
+
73
+ - name: vitest
74
+ run: npm test
75
+
76
+ release-scripts:
77
+ name: release scripts
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v4
81
+
82
+ - uses: actions/setup-node@v4
83
+ with:
84
+ node-version: "20"
85
+
86
+ # A plain assert script: `node --test` on the directory does not run it.
87
+ - run: node .github/scripts/format-release-pr-body.test.js
@@ -67,8 +67,5 @@ Thumbs.db
67
67
  *.swp
68
68
  *~
69
69
 
70
- # vendored upstream reference checkout (docs/vscode-jupyter-comparison.md)
71
- vscode-jupyter/
72
-
73
70
  # demo recording work area (published assets live in docs/)
74
71
  scripts/demo/
@@ -0,0 +1,4 @@
1
+ {
2
+ ".": "0.2.4",
3
+ "extension": "0.2.4"
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "recommendations": ["charliermarsh.ruff", "biomejs.biome"]
3
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "[python]": {
3
+ "editor.defaultFormatter": "charliermarsh.ruff",
4
+ "editor.formatOnSave": true,
5
+ "editor.codeActionsOnSave": {
6
+ "source.organizeImports.ruff": "explicit"
7
+ }
8
+ },
9
+ "[typescript]": {
10
+ "editor.defaultFormatter": "biomejs.biome",
11
+ "editor.formatOnSave": true,
12
+ "editor.codeActionsOnSave": {
13
+ "source.organizeImports.biome": "explicit"
14
+ }
15
+ },
16
+ "[javascript]": {
17
+ "editor.defaultFormatter": "biomejs.biome",
18
+ "editor.formatOnSave": true
19
+ },
20
+ "[json]": {
21
+ "editor.defaultFormatter": "biomejs.biome",
22
+ "editor.formatOnSave": true
23
+ },
24
+ "[jsonc]": {
25
+ "editor.defaultFormatter": "biomejs.biome",
26
+ "editor.formatOnSave": true
27
+ }
28
+ }
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.2.4](https://github.com/rnoro/tithon/compare/v0.2.3...v0.2.4) (2026-09-29)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **daemon:** inspect processes portably on macOS ([#18](https://github.com/rnoro/tithon/issues/18)) ([060da5b](https://github.com/rnoro/tithon/commit/060da5b81a8b68a30d741cb62e3586223d72eb1e))
9
+
10
+
11
+ ### Documentation
12
+
13
+ * add a contributing guide, CI, and issue templates ([5c8300d](https://github.com/rnoro/tithon/commit/5c8300deb3708a0c3c81dfb3b12c75b1d6015b5c))
14
+ * remove unused document ([0e316fd](https://github.com/rnoro/tithon/commit/0e316fd07af46c8ccdfad30f2a0d37d2bb1391c5))
15
+
16
+ ## [0.2.3](https://github.com/rnoro/tithon/compare/v0.2.2...v0.2.3) (2026-08-16)
17
+
18
+
19
+ ### Features
20
+
21
+ * **extension:** let "open as Notebook" stick, per file ([08ba8c1](https://github.com/rnoro/tithon/commit/08ba8c157988a027edcdd71ee5be831b703ed48b))
22
+ * share cell outputs through the project, not the journal ([1ba9d24](https://github.com/rnoro/tithon/commit/1ba9d24a7612bbc530a40da007517d4315be7651))
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * clear the lint backlog and undo two formatter regressions ([7cd4e10](https://github.com/rnoro/tithon/commit/7cd4e107269ca735d145cb9e2cf8b6b51346ff68))
28
+
29
+
30
+ ### Documentation
31
+
32
+ * fix guide for Windows in readme ([bd77e14](https://github.com/rnoro/tithon/commit/bd77e14dd4a39c871a476d1139fc5191736c475e))
33
+ * state invariants instead of naming the ledger ([35e4913](https://github.com/rnoro/tithon/commit/35e4913e696817d4bddd67ff8c7861bf54401aea))
34
+
3
35
  ## [0.2.2](https://github.com/rnoro/tithon/compare/v0.2.1...v0.2.2) (2026-08-12)
4
36
 
5
37
 
@@ -0,0 +1,209 @@
1
+ # Contributing to Tithon
2
+
3
+ Thanks for being here. Tithon keeps a Python session alive on a remote host
4
+ independently of the client, so most of its interesting failures only show up on
5
+ someone else's machine and under someone else's workflow — the things you hit
6
+ that we never would are the point of this file.
7
+
8
+ Tithon is alpha software with a written design: [docs/SPEC.md](docs/SPEC.md)
9
+ describes how it currently works and why. It is a description of today's system,
10
+ not a fence around it — see [Changing the design](#changing-the-design).
11
+
12
+ **Everything here is in English** — issues, pull requests, commit messages, code
13
+ comments, and docs
14
+
15
+ ## Open an issue first
16
+
17
+ - **Bugs, questions, ideas** — [open an issue][issues]. Always welcome, no
18
+ ceremony needed.
19
+ - **Code changes** — please sketch the approach in an issue before writing the
20
+ patch. This is about saving your time, not gatekeeping: a change that crosses
21
+ the daemon / journal / fold boundary is a design conversation, and it is
22
+ unfair to discover that after you have written the code.
23
+ - Small, self-evident fixes (a typo, a broken link, a crash with a traceback
24
+ attached) can go straight to a pull request.
25
+
26
+ Some rough edges are already tracked in
27
+ [docs/known_issue.md](docs/known_issue.md) — worth a look first.
28
+
29
+ ## Reporting a bug
30
+
31
+ The daemon outlives the client, so "what the UI showed" is rarely enough to
32
+ locate the fault. Useful reports include:
33
+
34
+ - **The daemon log** — `$TITHON_HOME/daemon.log` (`~/.tithon/daemon.log` by
35
+ default). The interesting window usually starts at the last `attach` before
36
+ things went wrong.
37
+ - **`tithon status`** output.
38
+ - **Versions** — Tithon (`pip show tithon`), the VSCode extension, VSCode, and
39
+ Python.
40
+ - **Environment** — OS and how you connect: local, Tunnel, Remote-SSH, WSL,
41
+ container, cluster login node. Tithon's whole job is surviving a flaky link
42
+ between client and host, so how yours is shaped is diagnostic information.
43
+ - **Reproduction as a sequence of session events** — "start daemon → run a cell
44
+ that prints for 30s → close the window → reopen after it finishes → output is
45
+ missing". Whether the client disconnected, and whether the daemon or the host
46
+ restarted, are usually the decisive details.
47
+
48
+ If you are on a platform Tithon does not support yet, say so in the issue rather
49
+ than assuming it is out of scope — that is how support gets planned.
50
+
51
+ ## Development setup
52
+
53
+ You need Python **3.11 or newer** and Node for the extension. The repo is set up
54
+ for [uv](https://docs.astral.sh/uv/) and npm, but nothing stops you using
55
+ another toolchain as long as the checks below pass.
56
+
57
+ Python — from the repo root:
58
+
59
+ ```bash
60
+ uv sync # runtime deps + the dev group (pytest, ruff, matplotlib, tqdm, ipywidgets)
61
+ uv run pytest -q
62
+ uv run ruff check . && uv run ruff format --check .
63
+ ```
64
+
65
+ `uv sync` provisions a matching interpreter for you, so an older default
66
+ `python3` on your machine is not a problem. Run the CLI through `uv run tithon`
67
+ (or the project venv) to be sure you are testing the tree and not an installed
68
+ copy.
69
+
70
+ VSCode extension — from `extension/`:
71
+
72
+ ```bash
73
+ npm ci
74
+ npm run lint # biome
75
+ npm run build # tsc
76
+ npm test # vitest unit tests
77
+ ```
78
+
79
+ The daemon runs in the foreground, so while debugging it is easiest to background
80
+ it and tail the log rather than tie up a terminal.
81
+
82
+ ## Verifying a change
83
+
84
+ Unit tests are not the whole safety net here. Most regressions in Tithon are
85
+ cross-process — a kernel that should have survived, a snapshot that arrives one
86
+ message short — and those are caught by the verification suite in
87
+ [scripts/](scripts/), which drives real daemons and real kernels. It is grouped
88
+ into topic bundles:
89
+
90
+ ```bash
91
+ make -C scripts fast # every hermetic test — the required gate
92
+ make -C scripts restore # just the reconnect/restore bundle, etc.
93
+ ```
94
+
95
+ Topics: `core` `serializer` `backpressure` `widgets` `restore` `livesync`
96
+ `kernels` `richoutputs` `notebook`. Meta bundles: `fast` (all hermetic),
97
+ `vscode` (all real-VSCode), `all` (both). `scripts/run_verify.sh` documents what
98
+ is in each.
99
+
100
+ **What a pull request needs:**
101
+
102
+ 1. `make -C scripts fast` green, plus the topic bundle covering the area you
103
+ touched.
104
+ 2. That suite's summary table pasted into the PR body — "tests pass" without the
105
+ output is not something a reviewer can check.
106
+ 3. The language gates for the side you touched: `ruff check` / `ruff format
107
+ --check` for Python, `npm run lint` / `npm run build` for the extension.
108
+
109
+ `make -C scripts vscode` drives a real VSCode instance and needs a display
110
+ (xvfb) plus network, so it is a nice-to-have rather than a requirement — just
111
+ say in the PR whether you could run it.
112
+
113
+ New behavior should arrive with a test. If the behavior is cross-process, that
114
+ means a script in `scripts/` and an entry in its bundle; if it is pure logic, a
115
+ unit test is fine. Adding a case that fails before your fix and passes after is
116
+ the most persuasive thing in a PR.
117
+
118
+ One practical note: the scripts spawn **detached** kernels under a temporary
119
+ `/tmp/tithon-*` home, so an interrupted run can leave some behind and make later
120
+ runs flaky. Clear them with:
121
+
122
+ ```bash
123
+ pkill -f '[i]pykernel_launcher.*-f /tmp/tithon'
124
+ ```
125
+
126
+ The `[i]` character class is deliberate — a bare pattern also matches `pkill`'s
127
+ own command line.
128
+
129
+ ## Changing the design
130
+
131
+ Tithon's current behavior rests on a handful of decisions that a lot of the code
132
+ quietly depends on. They are listed here so you can tell the difference between
133
+ *changing* one and *breaking* one by accident — not to put them beyond
134
+ discussion. Each exists for a reason, and a better reason supersedes it.
135
+
136
+ - The kernel is spawned **detached** rather than as a child of the daemon, with
137
+ its connection file persisted, so it survives the daemon and can be
138
+ re-attached.
139
+ - Sessions are **per file (uri)**, isolated from one another and created lazily.
140
+ - Messages from the kernel are journaled **verbatim**, with a folded
141
+ per-execution snapshot derived from them, so a reconnecting client can be
142
+ served without replaying everything.
143
+ - Client sync is **snapshot + delta over a monotonic sequence number**, which is
144
+ what makes a reconnect lossless rather than best-effort.
145
+ - Rich output is stored as **files with references in the journal**, not
146
+ base64 inline, which is what keeps a long-running live plot from growing
147
+ without bound.
148
+ - The client-facing binding is a **unix domain socket with 0600 permissions**,
149
+ which is what keeps a session on a shared host private.
150
+
151
+ If you think one of these should change — a different transport, a different
152
+ storage model, a platform that needs a different process model — that is a
153
+ welcome conversation. Open an issue, make the case against the property it
154
+ currently protects, and update [docs/SPEC.md](docs/SPEC.md) in the same PR that
155
+ changes the behavior. The thing to avoid is a patch that silently invalidates
156
+ one of them while the spec still claims it holds.
157
+
158
+ ## Keeping the tests honest
159
+
160
+ The verification suite is only worth anything if it can still fail. Bug fixes,
161
+ stronger assertions, better isolation, and new cases are all welcome. What is
162
+ not: hardcoding a pass, skipping a test to get green, hiding a race by
163
+ lengthening a `sleep`, or replacing a real-process check with a mock. If a
164
+ script is wrong, fix the script and explain the reasoning in the PR — a test
165
+ that no longer detects its failure is worse than no test.
166
+
167
+ ## Commits and pull requests
168
+
169
+ Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/):
170
+ `type(scope): summary`, where type is `feat` / `fix` / `refactor` / `test` /
171
+ `docs` / `build` / `chore` and scope is optional (`daemon`, `extension`,
172
+ `verify`, …).
173
+
174
+ ```text
175
+ feat(extension): render ipywidget outputs
176
+ fix(daemon): re-attach the kernel after a socket reset
177
+ ```
178
+
179
+ This is load-bearing, not cosmetic:
180
+ [release-please](https://github.com/googleapis/release-please) derives the
181
+ version bump and the CHANGELOG from these subjects, so a malformed one shows up
182
+ verbatim in a release note.
183
+
184
+ - Keep subjects to 72 characters or fewer; bodies optional and short.
185
+ - Investigation history belongs in the PR discussion, not in the permanent log.
186
+ - Please leave AI model, provider, and reviewer names out of commit subjects and
187
+ bodies.
188
+ - `main` is the release branch — base your work on `develop` unless the issue
189
+ says otherwise, and tidy up "fix typo" commits before asking for review.
190
+
191
+ ## Using AI tools
192
+
193
+ You are welcome to use them. If you point an agent at this repo, give it this
194
+ file and [docs/SPEC.md](docs/SPEC.md) — the design rationale is what an agent
195
+ cannot infer from the code, and it is what keeps a patch from quietly
196
+ invalidating a property something else depends on.
197
+
198
+ The bar is the same either way, and it is on you rather than the tool: **run the
199
+ bundles yourself and read the output before you submit.** A patch whose tests
200
+ were never executed, or a bug report that is a model's speculation rather than
201
+ an observed failure, costs more to review than it saves — those will be closed
202
+ with a request for the missing evidence.
203
+
204
+ ## License
205
+
206
+ Tithon is [MIT](LICENSE) licensed. By contributing you agree that your
207
+ contribution is licensed under the same terms.
208
+
209
+ [issues]: https://github.com/rnoro/tithon/issues
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tithon
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Tithon - The immortal Python REPL that will set you free.
5
5
  Project-URL: Homepage, https://github.com/rnoro/tithon
6
6
  Project-URL: Documentation, https://tithon.readthedocs.io/
@@ -47,6 +47,7 @@ Classifier: Topic :: Text Processing :: Linguistic
47
47
  Requires-Python: >=3.11
48
48
  Requires-Dist: ipykernel>=6
49
49
  Requires-Dist: jupyter-client>=8
50
+ Requires-Dist: psutil>=5.9
50
51
  Requires-Dist: websockets>=12
51
52
  Description-Content-Type: text/markdown
52
53
 
@@ -105,7 +106,8 @@ moves it to the host.
105
106
  remote, connect over a Tunnel or Remote-SSH — the notebook then works exactly
106
107
  as it does locally.
107
108
 
108
- > Windows is not currently supported.
109
+ > On Windows, we recommend running Tithon inside WSL and connecting with VS Code using the WSL extension.
110
+ > Native Windows is not currently supported.
109
111
 
110
112
  ## Install
111
113
 
@@ -241,6 +243,39 @@ Outputs live in `$TITHON_HOME/sessions/<session>/journal.db` (raw messages plus
241
243
  folded snapshots), with rich outputs written as files under
242
244
  `<workdir>/.tithon/outputs/` and referenced from the journal.
243
245
 
246
+ ### Sharing a notebook's outputs
247
+
248
+ A percent-format `.py` holds only code, and the journal above is machine-local
249
+ (binary, unbounded, unmergeable). So alongside it the daemon keeps the _folded_
250
+ output state as text in your project:
251
+
252
+ ```
253
+ <project>/.tithon/
254
+ cells/<relpath>.json # what each cell currently shows
255
+ outputs/ # its images, sha256-deduplicated
256
+ ```
257
+
258
+ Commit that directory and whoever clones the repository opens the file with your
259
+ results already in it — what `.ipynb` gives you, without the outputs living in
260
+ the `.py`. Images are referenced rather than embedded, so a plot redrawn every
261
+ step of a training loop still commits one file, not one per frame. Leave the
262
+ directory uncommitted (or `.gitignore` it) to keep your outputs to yourself;
263
+ nothing else depends on it, and your own session restores from the journal
264
+ either way.
265
+
266
+ Terminating a kernel yourself (`tithon kill`, or **Tithon: Terminate Kernel…**)
267
+ means you are done with that session, so reopening the file no longer restores
268
+ its cells. The history is kept — **Tithon: Restore Previous Outputs** brings it
269
+ back. Every involuntary loss (daemon restart, host reboot, dropped tunnel, idle
270
+ GC) still restores automatically.
271
+
272
+ ## Contributing
273
+
274
+ Bug reports are especially welcome — Tithon's job is surviving disconnects, and
275
+ the ones that matter happen on setups we don't have. See
276
+ [CONTRIBUTING.md](CONTRIBUTING.md) for what makes a report actionable, how to
277
+ set up a development environment, and how to propose a change to the design.
278
+
244
279
  ## License
245
280
 
246
281
  [MIT](LICENSE).
@@ -53,7 +53,8 @@ moves it to the host.
53
53
  remote, connect over a Tunnel or Remote-SSH — the notebook then works exactly
54
54
  as it does locally.
55
55
 
56
- > Windows is not currently supported.
56
+ > On Windows, we recommend running Tithon inside WSL and connecting with VS Code using the WSL extension.
57
+ > Native Windows is not currently supported.
57
58
 
58
59
  ## Install
59
60
 
@@ -189,6 +190,39 @@ Outputs live in `$TITHON_HOME/sessions/<session>/journal.db` (raw messages plus
189
190
  folded snapshots), with rich outputs written as files under
190
191
  `<workdir>/.tithon/outputs/` and referenced from the journal.
191
192
 
193
+ ### Sharing a notebook's outputs
194
+
195
+ A percent-format `.py` holds only code, and the journal above is machine-local
196
+ (binary, unbounded, unmergeable). So alongside it the daemon keeps the _folded_
197
+ output state as text in your project:
198
+
199
+ ```
200
+ <project>/.tithon/
201
+ cells/<relpath>.json # what each cell currently shows
202
+ outputs/ # its images, sha256-deduplicated
203
+ ```
204
+
205
+ Commit that directory and whoever clones the repository opens the file with your
206
+ results already in it — what `.ipynb` gives you, without the outputs living in
207
+ the `.py`. Images are referenced rather than embedded, so a plot redrawn every
208
+ step of a training loop still commits one file, not one per frame. Leave the
209
+ directory uncommitted (or `.gitignore` it) to keep your outputs to yourself;
210
+ nothing else depends on it, and your own session restores from the journal
211
+ either way.
212
+
213
+ Terminating a kernel yourself (`tithon kill`, or **Tithon: Terminate Kernel…**)
214
+ means you are done with that session, so reopening the file no longer restores
215
+ its cells. The history is kept — **Tithon: Restore Previous Outputs** brings it
216
+ back. Every involuntary loss (daemon restart, host reboot, dropped tunnel, idle
217
+ GC) still restores automatically.
218
+
219
+ ## Contributing
220
+
221
+ Bug reports are especially welcome — Tithon's job is surviving disconnects, and
222
+ the ones that matter happen on setups we don't have. See
223
+ [CONTRIBUTING.md](CONTRIBUTING.md) for what makes a report actionable, how to
224
+ set up a development environment, and how to propose a change to the design.
225
+
192
226
  ## License
193
227
 
194
228
  [MIT](LICENSE).