gpu-compute-provider 0.4.2__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 (187) hide show
  1. gpu_compute_provider-0.4.2/CHANGELOG.md +452 -0
  2. gpu_compute_provider-0.4.2/CONTRIBUTING.md +37 -0
  3. gpu_compute_provider-0.4.2/LICENSE +202 -0
  4. gpu_compute_provider-0.4.2/MANIFEST.in +8 -0
  5. gpu_compute_provider-0.4.2/NOTICE +4 -0
  6. gpu_compute_provider-0.4.2/PKG-INFO +310 -0
  7. gpu_compute_provider-0.4.2/README.md +274 -0
  8. gpu_compute_provider-0.4.2/SKILL.md +1565 -0
  9. gpu_compute_provider-0.4.2/pyproject.toml +77 -0
  10. gpu_compute_provider-0.4.2/setup.cfg +4 -0
  11. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/PKG-INFO +310 -0
  12. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/SOURCES.txt +185 -0
  13. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/dependency_links.txt +1 -0
  14. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/entry_points.txt +2 -0
  15. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/requires.txt +9 -0
  16. gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/top_level.txt +1 -0
  17. gpu_compute_provider-0.4.2/src/supercomputer/SKILL.md +1565 -0
  18. gpu_compute_provider-0.4.2/src/supercomputer/__init__.py +110 -0
  19. gpu_compute_provider-0.4.2/src/supercomputer/__main__.py +153 -0
  20. gpu_compute_provider-0.4.2/src/supercomputer/_direct_bridge.py +1882 -0
  21. gpu_compute_provider-0.4.2/src/supercomputer/_modal_runner.py +101 -0
  22. gpu_compute_provider-0.4.2/src/supercomputer/_quiet.py +9 -0
  23. gpu_compute_provider-0.4.2/src/supercomputer/autoresearch/SETUP.md +67 -0
  24. gpu_compute_provider-0.4.2/src/supercomputer/autoresearch/program.template.md +159 -0
  25. gpu_compute_provider-0.4.2/src/supercomputer/billing_types.py +298 -0
  26. gpu_compute_provider-0.4.2/src/supercomputer/cli/__init__.py +27 -0
  27. gpu_compute_provider-0.4.2/src/supercomputer/cli/attach.py +251 -0
  28. gpu_compute_provider-0.4.2/src/supercomputer/cli/autoresearch.py +36 -0
  29. gpu_compute_provider-0.4.2/src/supercomputer/cli/common.py +499 -0
  30. gpu_compute_provider-0.4.2/src/supercomputer/cli/config_cmd.py +131 -0
  31. gpu_compute_provider-0.4.2/src/supercomputer/cli/console.py +226 -0
  32. gpu_compute_provider-0.4.2/src/supercomputer/cli/context.py +251 -0
  33. gpu_compute_provider-0.4.2/src/supercomputer/cli/credits.py +283 -0
  34. gpu_compute_provider-0.4.2/src/supercomputer/cli/credits_buy.py +115 -0
  35. gpu_compute_provider-0.4.2/src/supercomputer/cli/credits_render.py +133 -0
  36. gpu_compute_provider-0.4.2/src/supercomputer/cli/exec_cmd.py +100 -0
  37. gpu_compute_provider-0.4.2/src/supercomputer/cli/files.py +321 -0
  38. gpu_compute_provider-0.4.2/src/supercomputer/cli/hardware.py +94 -0
  39. gpu_compute_provider-0.4.2/src/supercomputer/cli/help.py +163 -0
  40. gpu_compute_provider-0.4.2/src/supercomputer/cli/interactive.py +148 -0
  41. gpu_compute_provider-0.4.2/src/supercomputer/cli/job.py +235 -0
  42. gpu_compute_provider-0.4.2/src/supercomputer/cli/job_wait.py +170 -0
  43. gpu_compute_provider-0.4.2/src/supercomputer/cli/main.py +237 -0
  44. gpu_compute_provider-0.4.2/src/supercomputer/cli/migration.py +590 -0
  45. gpu_compute_provider-0.4.2/src/supercomputer/cli/mount.py +150 -0
  46. gpu_compute_provider-0.4.2/src/supercomputer/cli/output.py +45 -0
  47. gpu_compute_provider-0.4.2/src/supercomputer/cli/processes.py +602 -0
  48. gpu_compute_provider-0.4.2/src/supercomputer/cli/registry.py +28 -0
  49. gpu_compute_provider-0.4.2/src/supercomputer/cli/run.py +542 -0
  50. gpu_compute_provider-0.4.2/src/supercomputer/cli/sessions.py +829 -0
  51. gpu_compute_provider-0.4.2/src/supercomputer/cli/setup.py +100 -0
  52. gpu_compute_provider-0.4.2/src/supercomputer/cli/ssh.py +257 -0
  53. gpu_compute_provider-0.4.2/src/supercomputer/cli/stop_outcome.py +158 -0
  54. gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep.py +1059 -0
  55. gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep_harvest.py +206 -0
  56. gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep_watch.py +175 -0
  57. gpu_compute_provider-0.4.2/src/supercomputer/cli/usage.py +69 -0
  58. gpu_compute_provider-0.4.2/src/supercomputer/cli/volume.py +323 -0
  59. gpu_compute_provider-0.4.2/src/supercomputer/cli/wait.py +325 -0
  60. gpu_compute_provider-0.4.2/src/supercomputer/cli_args.py +369 -0
  61. gpu_compute_provider-0.4.2/src/supercomputer/client.py +718 -0
  62. gpu_compute_provider-0.4.2/src/supercomputer/client_billing.py +112 -0
  63. gpu_compute_provider-0.4.2/src/supercomputer/client_projects.py +52 -0
  64. gpu_compute_provider-0.4.2/src/supercomputer/client_sessions.py +111 -0
  65. gpu_compute_provider-0.4.2/src/supercomputer/client_volumes.py +80 -0
  66. gpu_compute_provider-0.4.2/src/supercomputer/config.py +553 -0
  67. gpu_compute_provider-0.4.2/src/supercomputer/direct.py +576 -0
  68. gpu_compute_provider-0.4.2/src/supercomputer/errors.py +153 -0
  69. gpu_compute_provider-0.4.2/src/supercomputer/fileset.py +170 -0
  70. gpu_compute_provider-0.4.2/src/supercomputer/image.py +532 -0
  71. gpu_compute_provider-0.4.2/src/supercomputer/job.py +260 -0
  72. gpu_compute_provider-0.4.2/src/supercomputer/log_cursor.py +66 -0
  73. gpu_compute_provider-0.4.2/src/supercomputer/login.py +236 -0
  74. gpu_compute_provider-0.4.2/src/supercomputer/modal_compat.py +307 -0
  75. gpu_compute_provider-0.4.2/src/supercomputer/modal_objects.py +156 -0
  76. gpu_compute_provider-0.4.2/src/supercomputer/modal_run.py +93 -0
  77. gpu_compute_provider-0.4.2/src/supercomputer/process_input.py +67 -0
  78. gpu_compute_provider-0.4.2/src/supercomputer/providers/__init__.py +5 -0
  79. gpu_compute_provider-0.4.2/src/supercomputer/providers/requests_http.py +68 -0
  80. gpu_compute_provider-0.4.2/src/supercomputer/py.typed +0 -0
  81. gpu_compute_provider-0.4.2/src/supercomputer/session.py +474 -0
  82. gpu_compute_provider-0.4.2/src/supercomputer/setup_cmd.py +255 -0
  83. gpu_compute_provider-0.4.2/src/supercomputer/shell.py +569 -0
  84. gpu_compute_provider-0.4.2/src/supercomputer/sku_names.py +110 -0
  85. gpu_compute_provider-0.4.2/src/supercomputer/sweeps.py +608 -0
  86. gpu_compute_provider-0.4.2/src/supercomputer/tunnel.py +198 -0
  87. gpu_compute_provider-0.4.2/src/supercomputer/tunnel_relay.py +42 -0
  88. gpu_compute_provider-0.4.2/src/supercomputer/types.py +362 -0
  89. gpu_compute_provider-0.4.2/src/supercomputer/v2_connect.py +1117 -0
  90. gpu_compute_provider-0.4.2/src/supercomputer/verified_fetch.py +126 -0
  91. gpu_compute_provider-0.4.2/src/supercomputer/version.py +33 -0
  92. gpu_compute_provider-0.4.2/src/supercomputer/volume_wait.py +131 -0
  93. gpu_compute_provider-0.4.2/src/supercomputer/volumes.py +224 -0
  94. gpu_compute_provider-0.4.2/tests/conftest.py +86 -0
  95. gpu_compute_provider-0.4.2/tests/test_autoresearch.py +21 -0
  96. gpu_compute_provider-0.4.2/tests/test_billing_types.py +93 -0
  97. gpu_compute_provider-0.4.2/tests/test_blob_put_retry.py +91 -0
  98. gpu_compute_provider-0.4.2/tests/test_checkpoint_option.py +405 -0
  99. gpu_compute_provider-0.4.2/tests/test_cli_args.py +237 -0
  100. gpu_compute_provider-0.4.2/tests/test_cli_dispatch.py +131 -0
  101. gpu_compute_provider-0.4.2/tests/test_cli_guards.py +60 -0
  102. gpu_compute_provider-0.4.2/tests/test_cli_help.py +166 -0
  103. gpu_compute_provider-0.4.2/tests/test_cli_sync.py +49 -0
  104. gpu_compute_provider-0.4.2/tests/test_client.py +800 -0
  105. gpu_compute_provider-0.4.2/tests/test_client_contracts_c.py +301 -0
  106. gpu_compute_provider-0.4.2/tests/test_client_host_frames_contract.py +46 -0
  107. gpu_compute_provider-0.4.2/tests/test_client_http_contract.py +128 -0
  108. gpu_compute_provider-0.4.2/tests/test_client_telemetry.py +150 -0
  109. gpu_compute_provider-0.4.2/tests/test_config.py +229 -0
  110. gpu_compute_provider-0.4.2/tests/test_config_cmd.py +80 -0
  111. gpu_compute_provider-0.4.2/tests/test_credit_preflight.py +103 -0
  112. gpu_compute_provider-0.4.2/tests/test_credits_cli.py +450 -0
  113. gpu_compute_provider-0.4.2/tests/test_credits_errors.py +106 -0
  114. gpu_compute_provider-0.4.2/tests/test_default_image.py +260 -0
  115. gpu_compute_provider-0.4.2/tests/test_direct_bridge.py +1322 -0
  116. gpu_compute_provider-0.4.2/tests/test_direct_fake_host.py +332 -0
  117. gpu_compute_provider-0.4.2/tests/test_dotenv_precedence.py +324 -0
  118. gpu_compute_provider-0.4.2/tests/test_download_directory.py +84 -0
  119. gpu_compute_provider-0.4.2/tests/test_download_integrity.py +198 -0
  120. gpu_compute_provider-0.4.2/tests/test_download_promotion_retry.py +95 -0
  121. gpu_compute_provider-0.4.2/tests/test_download_volume_hint.py +59 -0
  122. gpu_compute_provider-0.4.2/tests/test_emit_pid.py +44 -0
  123. gpu_compute_provider-0.4.2/tests/test_exec_attach_retry.py +204 -0
  124. gpu_compute_provider-0.4.2/tests/test_fileset.py +109 -0
  125. gpu_compute_provider-0.4.2/tests/test_first_run_login.py +80 -0
  126. gpu_compute_provider-0.4.2/tests/test_job.py +248 -0
  127. gpu_compute_provider-0.4.2/tests/test_job_ls.py +99 -0
  128. gpu_compute_provider-0.4.2/tests/test_job_run_retry_workspace.py +172 -0
  129. gpu_compute_provider-0.4.2/tests/test_job_wait_exit_code.py +207 -0
  130. gpu_compute_provider-0.4.2/tests/test_kill_records_first.py +236 -0
  131. gpu_compute_provider-0.4.2/tests/test_log_cursor.py +75 -0
  132. gpu_compute_provider-0.4.2/tests/test_login.py +203 -0
  133. gpu_compute_provider-0.4.2/tests/test_logs_unknown_pid.py +84 -0
  134. gpu_compute_provider-0.4.2/tests/test_map_bake_flag.py +26 -0
  135. gpu_compute_provider-0.4.2/tests/test_map_dag.py +40 -0
  136. gpu_compute_provider-0.4.2/tests/test_map_default_image.py +52 -0
  137. gpu_compute_provider-0.4.2/tests/test_map_window_flags.py +40 -0
  138. gpu_compute_provider-0.4.2/tests/test_modal_compat.py +189 -0
  139. gpu_compute_provider-0.4.2/tests/test_no_resume_gate.py +48 -0
  140. gpu_compute_provider-0.4.2/tests/test_placement_pin_forbidden.py +35 -0
  141. gpu_compute_provider-0.4.2/tests/test_process_input.py +146 -0
  142. gpu_compute_provider-0.4.2/tests/test_progress_narration.py +253 -0
  143. gpu_compute_provider-0.4.2/tests/test_provider_env_default.py +116 -0
  144. gpu_compute_provider-0.4.2/tests/test_queue_restart_wait.py +38 -0
  145. gpu_compute_provider-0.4.2/tests/test_queue_timeout_message.py +56 -0
  146. gpu_compute_provider-0.4.2/tests/test_queued_reason_render.py +196 -0
  147. gpu_compute_provider-0.4.2/tests/test_rate_limit_ride.py +88 -0
  148. gpu_compute_provider-0.4.2/tests/test_ready_wait_host_loss.py +266 -0
  149. gpu_compute_provider-0.4.2/tests/test_rebuild_respawn.py +96 -0
  150. gpu_compute_provider-0.4.2/tests/test_resume_volume_validation.py +86 -0
  151. gpu_compute_provider-0.4.2/tests/test_ride_cap.py +94 -0
  152. gpu_compute_provider-0.4.2/tests/test_run_migration.py +250 -0
  153. gpu_compute_provider-0.4.2/tests/test_run_retries.py +53 -0
  154. gpu_compute_provider-0.4.2/tests/test_run_retry_policy.py +118 -0
  155. gpu_compute_provider-0.4.2/tests/test_run_volume_collision.py +74 -0
  156. gpu_compute_provider-0.4.2/tests/test_run_wait_flags.py +70 -0
  157. gpu_compute_provider-0.4.2/tests/test_secret_resolution.py +95 -0
  158. gpu_compute_provider-0.4.2/tests/test_session_truth.py +242 -0
  159. gpu_compute_provider-0.4.2/tests/test_sessions_live_statuses.py +178 -0
  160. gpu_compute_provider-0.4.2/tests/test_sessions_point_lookup.py +74 -0
  161. gpu_compute_provider-0.4.2/tests/test_setup_cmd.py +79 -0
  162. gpu_compute_provider-0.4.2/tests/test_shell_env.py +15 -0
  163. gpu_compute_provider-0.4.2/tests/test_shell_interrupt.py +33 -0
  164. gpu_compute_provider-0.4.2/tests/test_shell_volumes.py +147 -0
  165. gpu_compute_provider-0.4.2/tests/test_sku_names.py +129 -0
  166. gpu_compute_provider-0.4.2/tests/test_skus.py +174 -0
  167. gpu_compute_provider-0.4.2/tests/test_spend.py +203 -0
  168. gpu_compute_provider-0.4.2/tests/test_stop_refused_classification.py +97 -0
  169. gpu_compute_provider-0.4.2/tests/test_stop_truth.py +277 -0
  170. gpu_compute_provider-0.4.2/tests/test_sweep_boost.py +53 -0
  171. gpu_compute_provider-0.4.2/tests/test_sweep_cost_optin.py +39 -0
  172. gpu_compute_provider-0.4.2/tests/test_sweep_harvest.py +243 -0
  173. gpu_compute_provider-0.4.2/tests/test_sweep_lifecycle_ux.py +526 -0
  174. gpu_compute_provider-0.4.2/tests/test_sweep_retry_and_kill_truth.py +126 -0
  175. gpu_compute_provider-0.4.2/tests/test_sweep_status_view.py +91 -0
  176. gpu_compute_provider-0.4.2/tests/test_sweeps_binding.py +133 -0
  177. gpu_compute_provider-0.4.2/tests/test_tunnel.py +176 -0
  178. gpu_compute_provider-0.4.2/tests/test_types.py +168 -0
  179. gpu_compute_provider-0.4.2/tests/test_upload_blob_path.py +266 -0
  180. gpu_compute_provider-0.4.2/tests/test_v2_connect.py +652 -0
  181. gpu_compute_provider-0.4.2/tests/test_v2_connect_billing.py +52 -0
  182. gpu_compute_provider-0.4.2/tests/test_volume_cli_hardening.py +240 -0
  183. gpu_compute_provider-0.4.2/tests/test_volume_download_delete.py +212 -0
  184. gpu_compute_provider-0.4.2/tests/test_volume_preflight.py +61 -0
  185. gpu_compute_provider-0.4.2/tests/test_volume_resolution.py +51 -0
  186. gpu_compute_provider-0.4.2/tests/test_volume_wait.py +138 -0
  187. gpu_compute_provider-0.4.2/tests/test_wait.py +440 -0
@@ -0,0 +1,452 @@
1
+ # Changelog
2
+
3
+ All notable changes to the `supercomputer` Python SDK and CLI are recorded here.
4
+ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
5
+ versions follow [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Changed
10
+ - The PyPI distribution is now **gpu-compute-provider**: `pip install gpu-compute-provider`.
11
+ The import path (`import supercomputer`) and the `super` CLI are unchanged.
12
+
13
+ ### Fixed
14
+ - `super sweep status --cost` now prints the spend rollup in human output
15
+ (`cost: $X.XX across N session(s) (all attempts)`). It was fetched and
16
+ then dropped, so only `--json` showed what a sweep had cost (#91).
17
+ - A host that dies while it builds a session no longer parks the client for the
18
+ 30-minute ready wait: the lost connection wakes the wait, and `create`/attach
19
+ go back to the dispatcher for the requeued session (up to twice).
20
+ - `super job wait <id>` on an ephemeral job exits with the exit code of the
21
+ job's own command — its first spawn, not a later `super exec --on <id>` —
22
+ (`69` host lost, `75` still running at `--timeout`, `1` when nothing recorded
23
+ says it succeeded) instead of `0` for any closed session. `--json` adds
24
+ `termination`.
25
+ - `super job wait <id>` right after `super job run --detach` (or a `job kill`)
26
+ waits up to 15s for the host to record the job's process instead of exiting
27
+ `1` with "no process to wait for". If none ever shows up, `--json` now prints
28
+ a `job_no_process` error object; before, it printed nothing.
29
+ - `super stop` no longer says "files kept" before teardown has run, and says
30
+ billing stopped when the stop was accepted. `super stop --wait` reports a
31
+ failed final save when the server records one for this stop: it compares the
32
+ session's `state_loss_reason`/`state_loss_at` before and after, and exits `1`
33
+ naming `close_flush_incomplete` (the final sync did not finish) or
34
+ `volume_commit_failed` only when that stamp is new. A state loss recorded
35
+ earlier is mentioned, not failed; `--json` adds `state_loss_reason` and
36
+ `state_loss_at`. A session that ends failed/dead during the stop also exits
37
+ `1`; one that had already ended that way does not.
38
+ `super job kill` follows the same rule.
39
+ - `super sessions` no longer counts a `stopping` session in "Spending now", and
40
+ never shows a non-billable interval's price as a rate.
41
+ - `super job run --retries`: a retry after a lost box re-attaches to a cold
42
+ (closed) session and its `/workspace` instead of starting a new, empty one.
43
+ When the session failed or died the retry still needs a new session, and
44
+ stderr now says its `/workspace` starts empty. A session closed on request
45
+ (`super job kill`, `super stop`) is never resumed or re-run by a retry.
46
+ - Downloads are checked against the file's SHA-256 (live-session blob reference,
47
+ session manifest) and a failed or corrupt GET is fetched once more. The
48
+ manifest hash is re-read once on a mismatch, since a live session's manifest
49
+ moves; `super sweep harvest` checks each file against its listing's hash.
50
+ - After a host loss during attach, the session reports the host it is on now,
51
+ so a reconnect is no longer announced as "same host" for a session that moved.
52
+ - A large upload's pre-signed PUT is retried (three attempts) on a dropped
53
+ connection or a store 5xx.
54
+ - `super --help`: a `super job run` saves `/workspace`; several sessions may
55
+ attach one volume at once (last writer wins per file).
56
+ - `super sweep retry` after a canary failure reports that the canary runs first
57
+ (the dispatcher now re-queues the fan-out behind it).
58
+ - `super upload` (and `session.upload`) now preserves file permission bits:
59
+ an uploaded `0755` script lands executable instead of `0644`, so `./run.sh`
60
+ works without `chmod +x` or `bash run.sh` (#45). Both the inline and the
61
+ large-file blob route send the local mode; hosts that predate the field
62
+ still write `0644`.
63
+
64
+ ### Added
65
+ - `super skus` shows a `$/HR` column and `super skus --json` fills `cost_per_hr`
66
+ with the rate each SKU was most recently billed at, stamped by `cost_as_of`.
67
+ It is an observed spot rate, not a list price; a SKU not billed in the last
68
+ 7 days stays `null` / `-`. (#44)
69
+
70
+ ### Changed
71
+ - `super run --retries N` pauses before each re-run (2s, 4s, … capped at 30s)
72
+ and skips re-runs that cannot change the outcome: exit `126`/`127` and an
73
+ OOM kill. Other non-zero exits are re-run as before.
74
+ - Installed agent skill files (`~/.claude|.cursor|.codex/skills/supercomputer/SKILL.md`)
75
+ are refreshed on every `super` invocation when the packaged copy changes, so
76
+ upgrading the package also upgrades the skill. Only files `super` wrote are
77
+ touched; the file now carries a "managed by super" note since edits are overwritten.
78
+ - Reads short SKU names, which the dispatcher serves once `SUPERCOMPUTER_PUBLIC_SKU_NAMES=short` is set for this release: the GPU model for one GPU (`l4`, `h100`,
79
+ `rtx_pro_6000`), `<N>x_<model>` for several (`8x_h100`, `4x_l40s`), `cpu` for
80
+ the default CPU-only box and `<N>x_cpu` for larger ones. The API, `super skus`,
81
+ session listings and progress lines show the short names. The long names
82
+ (`gpu_1x_l4`, `gpu_8x_h100`, `cpu_2x_epyc`, `cpu_generic`) are still accepted
83
+ everywhere a SKU is given (`--sku`, `supercomputer.json`, `project.session(sku=)`),
84
+ and the SDK treats both spellings alike when choosing the default image and the
85
+ torch wheel index. CLI help, examples and the agent skill use the short names.
86
+ - Session and provisioning output no longer names where a host runs. Progress
87
+ lines read `⟳ provisioning l4 …` (no provider or region), `super shell`
88
+ prints only state, age and detail, and the API no longer returns
89
+ provider, region, instance id, availability zone or host domain fields in
90
+ provisioning payloads and session records.
91
+ - `super skus` and `Client.list_skus()` no longer list a `clouds` field per SKU.
92
+ - Placement pinning (`--provider`/`--region`, `SUPERCOMPUTER_PROVIDER`/
93
+ `SUPERCOMPUTER_REGION`, `"provider"`/`"region"` in `supercomputer.json`) is
94
+ internal-only. The API refuses it from other accounts with 403
95
+ `placement_pin_forbidden`, and the CLI explains which setting to remove.
96
+ - `Session.upload()` reports large files as `blob_files` and the cutoff as
97
+ `blob_threshold_bytes`. Upload and download errors on that path read
98
+ `blob upload failed` / `blob download failed`.
99
+ - The Modal-compat `gpu=` mapping is an explicit table onto the short SKU names:
100
+ `"H100"` gives `h100`, `"H100:8"` gives `8x_h100`, `A10G`/`A10` give `a10g`
101
+ (was the unservable `gpu_Nx_a10`), `L40S` and `RTX-PRO-6000` are supported,
102
+ `H100!` maps to `h100`, and CPU-only functions get `cpu`.
103
+
104
+ ### Deprecated
105
+ - The `s3_files` and `s3_threshold_bytes` keys of `Session.upload()`'s result.
106
+ They still carry the same values as `blob_files` / `blob_threshold_bytes`;
107
+ read the `blob_*` keys instead.
108
+
109
+ ## [0.4.2] - 2026-09-24
110
+
111
+ ### Fixed
112
+ - Older installs that saved `api.supercomputer.sh` or `supercomputer-dispatcher.fly.dev`
113
+ (in `~/.supercomputer/url`, `~/.supercomputer/url` or a `SUPERCOMPUTER_URL` / `SUPERCOMPUTER_URL` export) now
114
+ resolve to `https://api.supercomputer.sh`. Same backend, new hostname; dev and
115
+ staging hosts are untouched.
116
+
117
+ ## [0.4.1] - 2026-09-24
118
+
119
+ ### Changed
120
+ - The base exception is `SupercomputerError` (`SupercomputerRuntimeError` for
121
+ SDK-side failures). `SupercomputerError`, `SupercomputerRuntimeError` and `SupercomputerError` are
122
+ the same classes under their old names, so existing `except` clauses keep
123
+ working.
124
+ - New API keys are minted as `super_sk_…`; `super_sk_` / `super_sk_` keys stay
125
+ valid. Prompts and docs show the new prefix.
126
+ - `pip install supercomputer` now installs an empty shim that depends on
127
+ `supercomputer`, published alongside this release.
128
+
129
+ ## [0.4.0] - 2026-09-24
130
+
131
+ ### Changed
132
+ - Renamed to **supercomputer**. `pip install supercomputer`; the CLI is `super`
133
+ and the Python package is `import supercomputer`. `supercomputer` / `supercomputer` remain as
134
+ CLI and import aliases, `SUPERCOMPUTER_*` / `SUPERCOMPUTER_*` env vars still work,
135
+ `~/.supercomputer` and `supercomputer.json` are still read. New names: `SUPERCOMPUTER_*`,
136
+ `~/.supercomputer`, `supercomputer.json`.
137
+ - Job tasks now receive `SUPERCOMPUTER_TASK_ID` / `SUPERCOMPUTER_WORLD_SIZE` /
138
+ `SUPERCOMPUTER_JOB` instead of the `SUPERCOMPUTER_*` names (no alias: update scripts
139
+ that self-shard).
140
+
141
+ ## [0.3.1] - 2026-09-22
142
+
143
+ ### Fixed
144
+ - `super credits buy` no longer turns auto-refill on by default. It used to
145
+ consent on behalf of anyone who had never consented before, so buying less
146
+ than the auto-refill threshold enrolled the account and then charged the
147
+ saved card for the full top-up seconds later — `buy 10` against the default
148
+ $25 threshold cost $110. Consent is now opt-in via `--autorefill`, and
149
+ `--autorefill` also turns the setting back on for an account that had it
150
+ off, which consent alone cannot do. `--no-autorefill` is still accepted and
151
+ is now the default; passing both is an error.
152
+ - Before a purchase that will trigger a top-up, the CLI now says so and names
153
+ the amount. What triggers one is the balance a purchase *leaves behind*,
154
+ not its size, and the refill is sized to clear the threshold — so $10
155
+ against a $200 threshold charges the card a further $195, not the $50 the
156
+ setting says. Both numbers are worked out and printed before anything is
157
+ charged, including under `--yes`, and including for an account that was
158
+ already armed.
159
+ - `super credits` no longer claims auto-refill "turns on with your first
160
+ purchase". It turns on with a purchase made with `--autorefill`, and the
161
+ status line now says so and names that command.
162
+ - `super credits buy` no longer sends buyers to a dead address after paying.
163
+ The return URL was built from a domain baked in at release time, which
164
+ outlived its DNS record: the charge succeeded and the browser landed on a
165
+ 404. The CLI now names no return address and the dispatcher supplies one
166
+ from its own allowlist, which redeploys with the web app instead of going
167
+ stale in a published wheel. Setting `SUPERCOMPUTER_WEB_URL` returns you to
168
+ `/dashboard`, the page that reads the result, rather than to
169
+ `/dashboard/billing`, which ignores it.
170
+
171
+ ### Changed
172
+ - `resolve_web_url()` returns `None` when no web URL is configured, and
173
+ `DEFAULT_WEB_URL` is gone. `Client.start_credit_checkout()` takes
174
+ `success_url` and `cancel_url` as optional and omits them from the request
175
+ when unset. Set `SUPERCOMPUTER_WEB_URL` only to override where a buyer is returned
176
+ to. **Needs a dispatcher carrying the matching server change**; against an
177
+ older one, set `SUPERCOMPUTER_WEB_URL` or buy from the dashboard.
178
+
179
+ ### Added
180
+ - `supercomputer.billing_types.predicted_topup_micros()` — what auto-refill would
181
+ charge once a given purchase has posted. Mirrors the dispatcher's own
182
+ `topUpAmount` and daily-cap clamp so a confirmation can name the second
183
+ charge before the card is saved.
184
+
185
+ ## [0.3.0] - 2026-09-16
186
+
187
+ ### Fixed
188
+ - `exec` no longer returns empty output for a command whose last write lands
189
+ at process exit. The host mirrors a process's durable log on a background
190
+ goroutine, so a read issued the instant the process reports "exited" can
191
+ beat that write and come back empty; the client was answering with that
192
+ empty read even though it had already drained the output off the live
193
+ stream. It now keeps whichever of the two saw more bytes. The symptom was
194
+ `stdout: ""` alongside `returncode: 0` — most often for a block-buffered
195
+ program, which flushes everything during interpreter teardown
196
+ microseconds before it dies. A training run's final `print(metrics)` is
197
+ exactly that shape.
198
+
199
+ ### Added
200
+ - `super map --no-bake` opts a sweep out of canary auto-bake. By default,
201
+ packages the canary pip-installs are baked into the sweep's image before
202
+ the fan-out; the canary pass line now names them and points at
203
+ `image.pip` in `supercomputer.json` as the permanent home.
204
+ - `super credits`: the prepaid wallet from the terminal. `super credits`
205
+ shows the posted balance, what is available after unbilled usage,
206
+ auto-refill state and the saved card; `super credits buy <usd>` opens a
207
+ hosted checkout and waits for the purchase to post; `super credits
208
+ autorefill on|off|set` changes the top-up rule (turning it off warns that
209
+ work stops at $0 and needs a confirmation); `super credits statement`
210
+ lists ledger rows with a running balance.
211
+ - `InsufficientCreditError` (HTTP 402, `code: insufficient_credit`) — raised
212
+ when the prepaid balance is exhausted, and mapped to **exit code 4** in
213
+ the CLI with the top-up command named. It is a sibling of `SupercomputerError`,
214
+ not of `PaymentOverdueError`: nothing is owed, so the remedy is to add
215
+ credit, not to settle a bill. Code that catches `PaymentOverdueError`
216
+ alone will not catch it.
217
+ - `Client.credit_balance()`, `credit_ledger()`, `set_autorefill()` and
218
+ `start_credit_checkout()`, with typed payloads in `supercomputer.billing_types`.
219
+ - A low-balance warning before `exec`/`run`/`shell`/`create`/`job run`/`map`
220
+ provision anything, shown once per process and only when nothing will top
221
+ the account up. Best-effort: a failed billing read never blocks a run.
222
+
223
+ ### Changed
224
+ - An out-of-credit refusal is no longer reported as a missed payment. Both
225
+ error paths now branch on the dispatcher's `code` before falling back on
226
+ the bare 402 status, so `payment_overdue`, `insufficient_credit` and an
227
+ older dispatcher's codeless 402 are told apart.
228
+ - A session closed for want of credit says so ("stopped: out of credits")
229
+ and exits 4, instead of exiting 75 as if it were briefly unreachable.
230
+ - `super sweep` offers the fast lane only for waits more capacity can fix.
231
+ Tasks blocked on billing get a top-up hint — boosting past that block
232
+ buys nothing.
233
+ - Python 3.9 is now supported (`requires-python >= 3.9`), and 3.14 is
234
+ tested. The README has a support grid; CI runs the suite on 3.9 through
235
+ 3.14. The installer script falls back to `uv` instead of `pipx`/`pip`
236
+ when the system Python is older than 3.9.
237
+ - The CLI no longer prints urllib3's LibreSSL warning on macOS's bundled
238
+ Python.
239
+
240
+ ## [0.2.1] - 2026-09-14
241
+
242
+ ### Added
243
+ - `super login`: sign in through the browser (device authorization). Shows a
244
+ short code, opens the approval page, and saves a key minted for this
245
+ machine (named `cli:<hostname>`); then installs the supercomputer skill for the
246
+ coding agents present on the machine (`--agents auto`, the default; also
247
+ `all`, a list, or `none`). `--no-browser` prints the URL and code instead
248
+ of opening a browser. A fresh install's first command starts the same
249
+ login, and `super setup` with no key delegates to it.
250
+ - Spend visibility: `super sessions` shows `$/HR` (the rate billed on the
251
+ session's open usage interval while a host is held, 0 when cold), `SPENT`
252
+ (compute charged so far) and `AGE` (time on its current host) per row plus
253
+ a "Spending now" footer; `--json` rows carry `usd_per_hour`, `spent_usd`
254
+ and `host_age_seconds` (SDK: `Client.session_cost`). New `super usage [--since DUR|TS] [--until TS]`
255
+ reports what the account was charged over a window (default 30 days) by
256
+ resource and session (SDK: `Client.billing_usage`).
257
+
258
+ ### Changed
259
+ - `super job ls` shows each job's COMMAND and EXIT code (from its process
260
+ index; `--json` rows carry `command` and `exit_code`), so rows are
261
+ tellable apart and failures visible without opening each job.
262
+
263
+ ### Fixed
264
+ - `super logs <sid> <pid>` with a pid the dispatcher has no record of now
265
+ exits 1 (`process_not_found`) like `wait` and `kill`, instead of printing
266
+ an empty stream with exit 0 (and `status: ""` in `--json`) that a poller
267
+ read as a finished, silent process. A just-spawned pid gets a few seconds
268
+ to reach the durable index before it is called unknown.
269
+ - `super wait` with a `--timeout` shorter than the unknown-pid grace window
270
+ exits 1 for an unknown pid, not 75 (retry), so scripted callers stop
271
+ retrying a typo forever.
272
+ - Cold starts of `run`/`exec`/`job run` no longer dump every host status
273
+ frame (`⟵ session_status: building (phase_change) setup_timing ...`);
274
+ the fresh-allocation and reconnect paths now use the same quiet printer
275
+ as warm attaches.
276
+ - `super sweep harvest` no longer pulls the session's virtual `_logs/`
277
+ directory (`_logs/processes.json`) for a results glob like `*.json`; name
278
+ `_logs/` in the glob to fetch logs.
279
+ - `super sessions` sizes the HOST and SKU columns to the data (long host ids
280
+ overflowed the fixed width on every row).
281
+ - `super volume list` shows each volume's last update time.
282
+ - SKILL.md documents `super sessions --limit N`.
283
+
284
+ ## [0.2.0] - 2026-09-08
285
+
286
+ ### Added
287
+ - Per-session checkpoint/restore opt-out: `--no-checkpoint` on
288
+ `create`/`exec`/`run`/`shell` (SDK: `checkpoint=False` on
289
+ `Project.session`/`cold_session`, `Client.create_session`/
290
+ `create_cold_session`). A preempted opt-out session is rebuilt cold on any
291
+ available host (`/workspace` kept, running processes lost) instead of being
292
+ checkpointed and restored pinned to the region its checkpoint lives in.
293
+ Defaults resolve `--checkpoint`/`--no-checkpoint` → `SUPERCOMPUTER_CHECKPOINT` →
294
+ `supercomputer.json` `"checkpoint"` → the new `super config set checkpoint on|off`
295
+ user default (`~/.supercomputer/config.json`) → server default (on).
296
+ `SessionInfo.checkpoint` and `super sessions --json` expose the policy; the
297
+ create fails loudly against a dispatcher too old to honour the opt-out.
298
+ - `--no-resume` on `exec`/`run`/`shell`: refuse to wake a cold (stopped)
299
+ session instead of transparently re-provisioning its hardware. The refusal
300
+ exits 1 with a typed `session_cold` error naming the session and the SKU a
301
+ resume would have provisioned. SDK: `Client.attach_session(...,
302
+ resume=False)` raises the new `supercomputer.SessionColdError`.
303
+ - Pipelines: `super map --after SWEEP[,SWEEP]` (SDK: `client.map(...,
304
+ after=handle_or_name, after_strict=…)`) holds a sweep in the new
305
+ `waiting` state until the named sweeps finish, then launches it — the
306
+ barrier is durable server-side, so a generate → train → eval chain
307
+ submits up front and the client can disconnect. An upstream failure
308
+ fails the downstream sweep (`upstream_failed:<name>`; re-arm with
309
+ `super sweep retry <name> --all`); a partially-succeeded upstream
310
+ counts as finished unless `--after-strict`.
311
+ - `--volume NAME[:MOUNT][:ro]` (also supercomputer.json `"read_only": true` or
312
+ the `name:/mount:ro` string form) attaches a volume read-only: the
313
+ session sees it, but its writes are discarded at close (no commit).
314
+ - `super autoresearch init`: scaffolds a karpathy/autoresearch-style keep/discard
315
+ research loop (agent setup guide + `program.md` template) that runs experiments
316
+ on a persistent supercomputer session.
317
+ The loop uploads `results.tsv` to the session each experiment; the dashboard's
318
+ session page then shows an Autoresearch tab (metric chart + results table).
319
+ - Skip-the-line boost: `super sweep boost <name>` / pressing `s` in
320
+ `super sweep status --watch` (offered while blocked on capacity) moves a
321
+ sweep to the fast claim lane; queued tasks re-lane immediately
322
+ (`SweepHandle.boost()` in the SDK). Freed machines alternate fast/free.
323
+ - `super sweep status` explains WHY a sweep is waiting: a `why:` line under
324
+ `blocked on capacity` names the line (`3 session(s) ahead in the gpu_1x_l4
325
+ queue (1 fast-lane)`) and/or the platform (`a new machine is being
326
+ provisioned`, `no capacity ... (stockout)`, `cloud quota exhausted`, ...),
327
+ from the new `blocked.sku/queued_reason/queued_ahead/fast_ahead` status
328
+ fields; a `state: waiting` (pipeline) sweep names the upstream sweeps it
329
+ holds for. Older dispatchers omit the fields and status reads as before.
330
+ - Async sweep scheduling: `super map --not-before WHEN` (park until), `--by WHEN`
331
+ (deadline; opportunistic idle-fill until `deadline - --runtime - pad`, then
332
+ normal launch) and `--runtime DUR` (per-task estimate, default 1h).
333
+ `super sweep status` shows the window phase; a missed deadline marks the
334
+ sweep `deadline_missed` (webhook `job.deadline_missed`) but never cancels it.
335
+ - First-run login prompt: with no API key configured, the CLI offers to open
336
+ the dashboard login and store the key instead of failing with a bare error.
337
+ - CLI errors carry typed error codes and the request id; the client never
338
+ provisions hardware for a request the server would reject.
339
+
340
+ ### Changed
341
+ - Resuming a cold session now always prints one stderr line (`session <sid>
342
+ is cold — resuming (provisions <sku>); pass --no-resume to refuse`), even
343
+ when stderr is not a TTY or `SUPERCOMPUTER_QUIET` is set — waking billed hardware
344
+ is a spend event, and non-TTY runs used to do it silently.
345
+ - Failed map task attempts now retry with a growing delay (45s × attempt,
346
+ capped at 10m) instead of relaunching immediately; preemption requeues
347
+ remain immediate and still don't consume the retry budget.
348
+
349
+ ### Fixed
350
+ - `super map --volume name:/path` sent the custom mount path under a key
351
+ the server ignores, silently mounting the volume at its default path.
352
+ Custom mount paths now apply to sweep task sessions.
353
+
354
+ ## [0.1.3] - 2026-08-27
355
+
356
+ ### Changed
357
+ - `super setup` installs the agent skill for all agents by default (Enter or
358
+ non-interactive stdin = `all`); `--agents none` opts out.
359
+
360
+ ## [0.1.2] - 2026-08-27
361
+
362
+ ### Changed
363
+ - README wording.
364
+
365
+ ## [0.1.1] - 2026-08-27
366
+
367
+ ### Changed
368
+ - README: sign up on the website and paste your API key; the editable
369
+ checkout install instructions are gone.
370
+
371
+ ## [0.1.0] - 2026-08-27
372
+
373
+ ### Changed
374
+ - Renamed: the package is `supercomputer`, the import is `supercomputer`, the CLI is
375
+ `supercomputer`, env vars are `SUPERCOMPUTER_*`, config lives in `~/.supercomputer`, project
376
+ files are `supercomputer.json`, new keys are `super_sk_…`, and the client sends
377
+ `X-Supercomputer-Client*` headers. Everything old keeps working: `import supercomputer`,
378
+ the `super` command, `SUPERCOMPUTER_*`, `~/.supercomputer`, `supercomputer.json`, `super_sk_` keys and
379
+ `supercomputer.SupercomputerError`. Map tasks now receive `SUPERCOMPUTER_TASK_ID` /
380
+ `SUPERCOMPUTER_WORLD_SIZE` / `SUPERCOMPUTER_JOB` (the `SUPERCOMPUTER_*` names are gone).
381
+
382
+ ### Added
383
+ - `super sweep harvest <name> <remote-glob> <local-dir>` — download every
384
+ task's matching outputs in one command. Sessions are resolved from the
385
+ sweep and local paths are task-keyed (`<local-dir>/task-<index>/<path>`,
386
+ or `--flat`), replacing the per-sweep script that parsed status JSON for
387
+ session ids and ran N `super download` calls. `--all-states` includes
388
+ failed and canceled tasks.
389
+ - `super sweep status --watch [--interval S]` — the human live view,
390
+ repainted in place until the sweep is terminal. Appends instead of
391
+ repainting when stdout is not a terminal.
392
+ - `super stop --wait [--timeout SECONDS]` — block until the workspace
393
+ manifest is durable, instead of polling `super sessions` for `state=cold`.
394
+ `super map --from <sid>` needs that manifest; the default timeout is 300s
395
+ and the command exits 1 if the wait expires (the stop itself stands).
396
+ - The `super sweep status --json` document is now a documented, versioned
397
+ contract (`schema_version: 1`) — see `docs/sweep-status-schema.md`.
398
+ Additive changes keep the version; a removal or rename bumps it.
399
+ - Every request now carries `X-Supercomputer-Client` / `X-Supercomputer-Client-Version`, and a
400
+ client below the deployment's supported floor is rejected with HTTP 426 and
401
+ the new `supercomputer.ClientTooOldError`, which names the upgrade command. This
402
+ replaces the previous failure mode for a stale client, a signature-mismatch
403
+ error on every >5 MiB upload that read as a credential problem.
404
+
405
+ ### Changed
406
+ - `super upload` now names the files that take the pre-signed cloud-storage
407
+ path (>5 MiB) rather than only the total, and names them again in the error
408
+ when that path fails — so a broken large-file upload is attributable to a
409
+ file, not to the command. `Session.upload()` returns them as `s3_files`
410
+ alongside `inline_files` and `s3_threshold_bytes`.
411
+
412
+ ## [0.1.0] — first public release
413
+
414
+ ### Added
415
+ - `super` CLI: sessions, exec/run/shell/ssh/tunnel, background processes
416
+ (spawn/wait/logs/kill), file transfer (upload/download/ls/mount), volumes,
417
+ run-to-completion jobs, and `super map` sweeps.
418
+ - Python SDK: `Client`, `Project`, `Session`, `Job`, `SweepHandle`, `Image`.
419
+ - `super setup` installs the agent skill (`SKILL.md`) for Cursor, Claude Code
420
+ and Codex.
421
+ - `super --version` and `supercomputer.__version__`.
422
+ - Directory uploads skip hidden entries, dependency/cache directories and
423
+ symlinked files by default; `--include-hidden` / `--follow-symlinks` (CLI)
424
+ and `include_hidden=` / `follow_symlinks=` (SDK) opt back in.
425
+ - `SUPERCOMPUTER_TELEMETRY=0` disables the best-effort CLI crash report.
426
+
427
+ ### Removed
428
+ Relative to the pre-release internal SDK (nothing here was ever on PyPI):
429
+ - Public names `MigrationInfo`, `MigrationStatus`, `SyncProgress`, the
430
+ `SupercomputerError` and `JobHandle` aliases (`SupercomputerError` / `SweepHandle` remain),
431
+ and the `Session.migrate()` / `Client.watch()` / `Client.list_session_files()`
432
+ / `Client.download_file()` helpers — the operator-initiated migration
433
+ surface is not part of the public client.
434
+ - `Image.add_local_file()`, `Image.add_local_dir()`, `Image.copy()`,
435
+ `Image.workdir()` — use `Session.upload()` / `super upload` for local files
436
+ and the `workdir=` argument on exec.
437
+ - Legacy `~/.supercomputer/token`, `~/.supercomputer/url` and `supercomputer.json` lookups
438
+ (`~/.supercomputer/*` and `supercomputer.json` are the supported forms). `SUPERCOMPUTER_API_KEY` /
439
+ `SUPERCOMPUTER_URL` are still accepted as aliases of `SUPERCOMPUTER_API_KEY` / `SUPERCOMPUTER_URL`.
440
+ - Internal modules `supercomputer.upload`, `supercomputer.stream`, `supercomputer.jobs`, `supercomputer.client_ext`
441
+ and the `s3_uploader` / `websockets_transport` providers, with the
442
+ `websockets` dependency they pulled in.
443
+ - `DirectClient.run_streaming()` (no callers). `DirectClient.execute()` is
444
+ kept — internal harnesses use it.
445
+
446
+ ### Security
447
+ - Only `SUPERCOMPUTER_*` keys from a project `.env` are imported into the process
448
+ environment; other keys stay reachable by name via `--secret KEY`.
449
+ - A plaintext (`ws://`) host address is refused when the API was reached over
450
+ `https://`; a plaintext API URL to a non-local host warns.
451
+ - `super ssh` quotes its ProxyCommand and validates the session id before using
452
+ it in filesystem paths.
@@ -0,0 +1,37 @@
1
+ # Contributing
2
+
3
+ Thanks for your interest in `supercomputer`.
4
+
5
+ ## Development setup
6
+
7
+ ```bash
8
+ cd packages/supercomputer
9
+ python3 -m venv .venv && source .venv/bin/activate
10
+ pip install -e ".[dev]"
11
+ ```
12
+
13
+ ## Before you open a pull request
14
+
15
+ ```bash
16
+ ruff check src tests # lint (rule set in pyproject.toml)
17
+ mypy # type-check src/supercomputer (config in pyproject.toml)
18
+ pytest # ~640 hermetic tests, no network or credentials needed
19
+ ```
20
+
21
+ - Keep changes focused; one topic per PR.
22
+ - New behaviour comes with a test — the tests are the spec.
23
+ - Comments explain *why*, not *what*. Please don't reference internal ticket
24
+ numbers, incidents or environments in code comments.
25
+ - Public functions and classes have docstrings.
26
+ - Line length is 100.
27
+
28
+ ## Reporting bugs
29
+
30
+ Open a GitHub issue with the `super --version` output, the command or code you
31
+ ran, and what you expected. For anything security-related, see
32
+ [SECURITY.md](SECURITY.md) instead.
33
+
34
+ ## License
35
+
36
+ By contributing you agree that your contributions are licensed under the
37
+ Apache License 2.0 (see [LICENSE](LICENSE)).