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.
- tithon-0.2.4/.git-blame-ignore-revs +9 -0
- tithon-0.2.4/.github/ISSUE_TEMPLATE/bug_report.yml +100 -0
- tithon-0.2.4/.github/ISSUE_TEMPLATE/config.yml +8 -0
- tithon-0.2.4/.github/ISSUE_TEMPLATE/feature_request.yml +60 -0
- tithon-0.2.4/.github/workflows/ci.yml +87 -0
- {tithon-0.2.2 → tithon-0.2.4}/.gitignore +0 -3
- tithon-0.2.4/.release-please-manifest.json +4 -0
- tithon-0.2.4/.vscode/extensions.json +3 -0
- tithon-0.2.4/.vscode/settings.json +28 -0
- {tithon-0.2.2 → tithon-0.2.4}/CHANGELOG.md +32 -0
- tithon-0.2.4/CONTRIBUTING.md +209 -0
- {tithon-0.2.2 → tithon-0.2.4}/PKG-INFO +37 -2
- {tithon-0.2.2 → tithon-0.2.4}/README.md +35 -1
- {tithon-0.2.2 → tithon-0.2.4}/docs/SPEC.md +356 -99
- {tithon-0.2.2 → tithon-0.2.4}/extension/CHANGELOG.md +23 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/README.md +19 -2
- tithon-0.2.4/extension/biome.json +39 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/runTest.ts +8 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/seed.ts +3 -3
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/addcell.test.ts +5 -2
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/autoopen.test.ts +41 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/autostart.test.ts +31 -12
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_addmd.test.ts +11 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_editsave.test.ts +13 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_emptycell.test.ts +47 -13
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_imageorder.test.ts +31 -9
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_input_hang.test.ts +52 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_insert_reconnect.test.ts +52 -19
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_insertheader.test.ts +6 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_kerneldeath.test.ts +14 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_mdsave.test.ts +5 -3
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_rerun.test.ts +50 -18
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_rerun_reconnect.test.ts +56 -18
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_runall_error.test.ts +33 -10
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_runall_md.test.ts +15 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/bug_staleedit.test.ts +43 -14
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/celltoggle.test.ts +54 -21
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/clearspinner.test.ts +34 -15
- tithon-0.2.4/extension/integration/suite/closedsession.test.ts +161 -0
- tithon-0.2.4/extension/integration/suite/confirmdestructive.test.ts +175 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/crosscell.test.ts +40 -14
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/demo.test.ts +70 -26
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/disposeflush.test.ts +28 -14
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/dupcode.test.ts +18 -7
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/editedcell.test.ts +6 -7
- tithon-0.2.4/extension/integration/suite/editorpin.test.ts +465 -0
- tithon-0.2.4/extension/integration/suite/index.ts +44 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/interrupt.test.ts +48 -13
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/live.test.ts +19 -10
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/livedisplay.test.ts +16 -9
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/livereconnect.test.ts +57 -18
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lsp.test.ts +45 -23
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lspdef.test.ts +26 -13
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lspinlay.test.ts +63 -24
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/lsproundtrip.test.ts +37 -19
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/multicell.test.ts +29 -13
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/opentextshot.test.ts +6 -10
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/orphanrestore.test.ts +18 -7
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnect.test.ts +48 -19
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnectprogress.test.ts +41 -17
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reconnectstates.test.ts +54 -19
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reopen.test.ts +24 -9
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/reopenafterroundtrip.test.ts +38 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restartdaemon.test.ts +45 -18
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restartkernel.test.ts +27 -10
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/restore.test.ts +2 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/richoutputs.test.ts +73 -31
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/runcell.test.ts +14 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/screenshot.test.ts +23 -11
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/trainloop.test.ts +41 -18
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/trainsync.test.ts +89 -35
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/twofiles.test.ts +22 -8
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widget.test.ts +31 -11
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widgetdisposeflush.test.ts +24 -8
- {tithon-0.2.2 → tithon-0.2.4}/extension/integration/suite/widgetlive.test.ts +33 -10
- {tithon-0.2.2 → tithon-0.2.4}/extension/package-lock.json +303 -7
- {tithon-0.2.2 → tithon-0.2.4}/extension/package.json +71 -8
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/cellAttach.ts +9 -8
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/codeLens.ts +5 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/daemonClient.ts +30 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/daemonProcess.ts +50 -25
- tithon-0.2.4/extension/src/extension.ts +681 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/liveSync.ts +11 -13
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/notebookSerializer.ts +6 -12
- tithon-0.2.4/extension/src/notify.ts +69 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/outputFold.ts +19 -3
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/richOutput.ts +25 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/serializer.ts +7 -7
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/sessionClient.ts +95 -39
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/sessionController.ts +340 -155
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/tracebackFormatter.ts +3 -2
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetRender.ts +7 -9
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetRendererEntry.ts +18 -19
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/artifactCache.test.ts +16 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/cellAttach.test.ts +23 -5
- tithon-0.2.4/extension/test/closedSession.test.ts +98 -0
- tithon-0.2.4/extension/test/daemonProcess.test.ts +33 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/fakeDaemon.ts +19 -7
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/kernelGeneration.test.ts +38 -15
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/liveDaemon.ts +3 -3
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/liveSync.test.ts +46 -15
- tithon-0.2.4/extension/test/notify.test.ts +86 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/outputFold.test.ts +79 -23
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/reconnectClient.test.ts +7 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/restore.test.ts +5 -4
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/richDaemon.test.ts +12 -6
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/richOutput.test.ts +50 -12
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/serializer.test.ts +15 -24
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/setup.ts +1 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/tracebackFormatter.test.ts +8 -4
- tithon-0.2.4/extension/test/vscodeMock.ts +75 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/widget.test.ts +6 -5
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/widgetBuffers.test.ts +24 -9
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/widgetEvents.test.ts +26 -11
- tithon-0.2.4/extension/vitest.config.ts +24 -0
- {tithon-0.2.2 → tithon-0.2.4}/pyproject.toml +28 -2
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_input_bridge.py +3 -1
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_interrupt_priority.py +24 -14
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_kernel_death.py +17 -6
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_multi.py +73 -37
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v1.py +4 -1
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v2.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v3.py +2 -3
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_check_v5.py +3 -6
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_clear_client.py +8 -4
- tithon-0.2.4/scripts/_clone_client.py +75 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_lastseq.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_multi_client.py +17 -7
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_stalled_client.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/_workdir_client.py +18 -8
- {tithon-0.2.2 → tithon-0.2.4}/scripts/lib.sh +1 -1
- {tithon-0.2.2 → tithon-0.2.4}/scripts/run_verify.sh +10 -10
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v39.sh +2 -2
- tithon-0.2.4/scripts/v61.sh +98 -0
- tithon-0.2.4/scripts/v62.sh +78 -0
- tithon-0.2.4/scripts/v63.sh +41 -0
- tithon-0.2.4/scripts/v64.sh +95 -0
- tithon-0.2.4/scripts/v65.sh +61 -0
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/__main__.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/artifacts.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/cli.py +15 -6
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/daemon.py +385 -134
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/folding.py +36 -8
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/journal.py +164 -39
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/kernel.py +17 -23
- tithon-0.2.4/src/tithon/sidecar.py +258 -0
- {tithon-0.2.2 → tithon-0.2.4}/src/tithon/widgets.py +8 -4
- {tithon-0.2.2 → tithon-0.2.4}/test/test_artifacts.py +17 -6
- {tithon-0.2.2 → tithon-0.2.4}/test/test_backpressure.py +1 -2
- {tithon-0.2.2 → tithon-0.2.4}/test/test_barrier.py +11 -5
- {tithon-0.2.2 → tithon-0.2.4}/test/test_clear.py +4 -3
- tithon-0.2.4/test/test_closed_by_user.py +87 -0
- {tithon-0.2.2 → tithon-0.2.4}/test/test_comm_ordering.py +16 -4
- {tithon-0.2.2 → tithon-0.2.4}/test/test_display_registry.py +7 -10
- {tithon-0.2.2 → tithon-0.2.4}/test/test_folding.py +165 -79
- {tithon-0.2.2 → tithon-0.2.4}/test/test_gc.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/test/test_inflight_recovery.py +20 -19
- {tithon-0.2.2 → tithon-0.2.4}/test/test_journal_origin.py +21 -5
- {tithon-0.2.2 → tithon-0.2.4}/test/test_kernel_group_kill.py +2 -1
- {tithon-0.2.2 → tithon-0.2.4}/test/test_kill_restart_race.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/test/test_liveness.py +7 -7
- {tithon-0.2.2 → tithon-0.2.4}/test/test_lost_state.py +10 -5
- {tithon-0.2.2 → tithon-0.2.4}/test/test_orphan.py +5 -2
- {tithon-0.2.2 → tithon-0.2.4}/test/test_payload.py +1 -0
- {tithon-0.2.2 → tithon-0.2.4}/test/test_rebuild_mirror_streaming.py +29 -12
- {tithon-0.2.2 → tithon-0.2.4}/test/test_restart_drain.py +4 -4
- {tithon-0.2.2 → tithon-0.2.4}/test/test_runall_batch.py +5 -9
- {tithon-0.2.2 → tithon-0.2.4}/test/test_session_layout.py +5 -4
- tithon-0.2.4/test/test_sidecar.py +547 -0
- {tithon-0.2.2 → tithon-0.2.4}/test/test_widget_buffer_delta.py +36 -11
- {tithon-0.2.2 → tithon-0.2.4}/test/test_widgets.py +46 -20
- {tithon-0.2.2 → tithon-0.2.4}/uv.lock +30 -1
- tithon-0.2.2/.claude/settings.local.json +0 -5
- tithon-0.2.2/.release-please-manifest.json +0 -4
- tithon-0.2.2/docs/vscode-jupyter-comparison.md +0 -451
- tithon-0.2.2/extension/integration/suite/index.ts +0 -25
- tithon-0.2.2/extension/src/extension.ts +0 -499
- tithon-0.2.2/extension/vitest.config.ts +0 -14
- {tithon-0.2.2 → tithon-0.2.4}/.gitattributes +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/.github/scripts/format-release-pr-body.js +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/.github/scripts/format-release-pr-body.test.js +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/.github/workflows/release-please.yml +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/LICENSE +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/docs/demo.gif +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/docs/demo.mp4 +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/docs/how-it-works.png +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/docs/index.html +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/docs/known_issue.md +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/.vscodeignore +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/LICENSE +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/esbuild.mjs +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/icon.png +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/artifactCache.ts +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/css.d.ts +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/src/widgetTheme.css +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/test/fixtures/tqdm_widget_state.json +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/tsconfig.integration.json +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/extension/tsconfig.json +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/release-please-config.json +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/Makefile +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/bughunt.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/_gen.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/dup_run.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/editsave.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/editsave_crlf.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/empty_cells.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/header.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/imageorder.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/input_hang.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/kerneldeath.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/mdcell.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/one_cell.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/rerun.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/runall_error.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/runall_md.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/bughunt/two_cell.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/crlf_mixed.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/crlf_string_marker.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/empty_cells.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/magics_markdown.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/mixed_indent.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/module_header.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/no_final_newline.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/corpus/string_marker.py +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/demo_reconnect.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/record_demo.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/shot.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/shotlsp.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v1.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v10.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v11.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v12.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v13.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v14.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v15.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v16.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v17.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v18.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v19.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v2.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v20.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v21.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v22.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v23.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v24.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v26.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v27.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v28.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v29.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v3.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v30.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v31.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v32.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v33.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v34.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v35.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v37.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v38.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v4.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v40.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v41.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v42.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v43.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v44.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v45.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v46.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v47.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v48.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v49.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v5.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v50.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v51.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v52.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v53.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v54.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v55.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v56.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v57.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v58.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v59.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v6.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v60.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v7.sh +0 -0
- {tithon-0.2.2 → tithon-0.2.4}/scripts/v8.sh +0 -0
- {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
|
|
@@ -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.
|
|
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
|
|
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
|
|
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).
|