hypernix 0.72.2__tar.gz → 0.72.2.post3__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 (431) hide show
  1. {hypernix-0.72.2 → hypernix-0.72.2.post3}/PKG-INFO +1 -1
  2. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/run_local.sh +12 -1
  3. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/run_tailscale.sh +60 -1
  4. {hypernix-0.72.2 → hypernix-0.72.2.post3}/pyproject.toml +1 -1
  5. {hypernix-0.72.2 → hypernix-0.72.2.post3}/setup.cfg +1 -1
  6. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/__init__.py +1 -1
  7. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/gkey_cli.py +294 -6
  8. hypernix-0.72.2.post3/src/hypernix/security/keyversions.py +158 -0
  9. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/t2keys.py +51 -2
  10. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/cli.py +264 -4
  11. hypernix-0.72.2.post3/src/hypernix/waiter/diagnose.py +276 -0
  12. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix.egg-info/SOURCES.txt +5 -0
  13. hypernix-0.72.2.post3/tests/test_gkey_key_versions.py +396 -0
  14. hypernix-0.72.2.post3/tests/test_t1api_example_scripts.py +294 -0
  15. hypernix-0.72.2.post3/tests/test_waiter_diagnose.py +332 -0
  16. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Changelog.md +162 -0
  17. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Release-Timeline.md +20 -0
  18. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/T1-API.md +46 -0
  19. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Waiter-TUI.md +59 -0
  20. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/build.yml +0 -0
  21. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/ci.yml +0 -0
  22. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/deploy-docs.yml +0 -0
  23. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/ios.yml +0 -0
  24. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/public-release.yml +0 -0
  25. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/release.yml +0 -0
  26. {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/update-json-stats.yml +0 -0
  27. {hypernix-0.72.2 → hypernix-0.72.2.post3}/LICENSE +0 -0
  28. {hypernix-0.72.2 → hypernix-0.72.2.post3}/MANIFEST.in +0 -0
  29. {hypernix-0.72.2 → hypernix-0.72.2.post3}/README.md +0 -0
  30. {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd-removebg-preview.png +0 -0
  31. {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd.png +0 -0
  32. {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo.png +0 -0
  33. {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo1.png +0 -0
  34. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/curriculum_eval_v0_70_4.py +0 -0
  35. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/custom_arch.py +0 -0
  36. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/hypernix_run.json +0 -0
  37. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/quickstart.py +0 -0
  38. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/resilient_finetune_v0_70_4.py +0 -0
  39. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/run_hypernix.py +0 -0
  40. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/.env.example +0 -0
  41. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/API-EXAMPLES.md +0 -0
  42. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/Dockerfile +0 -0
  43. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/README.md +0 -0
  44. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/config/.gitkeep +0 -0
  45. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/docker-compose.yml +0 -0
  46. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/hypernix-t1api.service +0 -0
  47. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/nginx.conf +0 -0
  48. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/openapi.json +0 -0
  49. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train hypernix 1 5 gtx1080.py +0 -0
  50. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
  51. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
  52. {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/upload_to_hub.py +0 -0
  53. {hypernix-0.72.2 → hypernix-0.72.2.post3}/pytest.ini +0 -0
  54. {hypernix-0.72.2 → hypernix-0.72.2.post3}/ruff.toml +0 -0
  55. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/README.md +0 -0
  56. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/apply_hypernix_fixes.py +0 -0
  57. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix +0 -0
  58. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-B +0 -0
  59. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-E +0 -0
  60. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-F +0 -0
  61. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix_scope.py +0 -0
  62. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v5.py +0 -0
  63. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v5s.py +0 -0
  64. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v6.py +0 -0
  65. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/install_deps.sh +0 -0
  66. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/install_macos_legacy.sh +0 -0
  67. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/measure_optimizer_memory.py +0 -0
  68. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/quantize_i7_7660u.sh +0 -0
  69. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/t1api_examples.py +0 -0
  70. {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/update_json_stats.py +0 -0
  71. {hypernix-0.72.2 → hypernix-0.72.2.post3}/setup.py +0 -0
  72. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/__main__.py +0 -0
  73. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/bridge/__init__.py +0 -0
  74. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/bridge/lmstudio.py +0 -0
  75. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/__init__.py +0 -0
  76. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/cookbook.py +0 -0
  77. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/countertop.py +0 -0
  78. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/flour.py +0 -0
  79. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/injection.py +0 -0
  80. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/menu.py +0 -0
  81. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/__init__.py +0 -0
  82. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/blender.py +0 -0
  83. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/cardboard_box.py +0 -0
  84. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/cutting_board.py +0 -0
  85. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/food_processor.py +0 -0
  86. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/lunchbox.py +0 -0
  87. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/mediocre_fridge.py +0 -0
  88. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/pans.py +0 -0
  89. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/pepper_shaker.py +0 -0
  90. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/qa.py +0 -0
  91. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/salt_shaker.py +0 -0
  92. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/scavenger.py +0 -0
  93. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/sink.py +0 -0
  94. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/strainer.py +0 -0
  95. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/toaster.py +0 -0
  96. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/tupperware.py +0 -0
  97. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/__init__.py +0 -0
  98. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/espresso_maker.py +0 -0
  99. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/industrial_range.py +0 -0
  100. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/new_fridge.py +0 -0
  101. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/new_range.py +0 -0
  102. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/old_range.py +0 -0
  103. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/vera.py +0 -0
  104. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyped_pro.js +0 -0
  105. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/__init__.py +0 -0
  106. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/discovery.py +0 -0
  107. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/files.py +0 -0
  108. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/hfdownload.py +0 -0
  109. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/hfmerge.py +0 -0
  110. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/pairing.py +0 -0
  111. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/sessions.py +0 -0
  112. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/__init__.py +0 -0
  113. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/assistant.py +0 -0
  114. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/cli.py +0 -0
  115. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped.py +0 -0
  116. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro.py +0 -0
  117. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_bridge.py +0 -0
  118. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_core.py +0 -0
  119. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_gui.py +0 -0
  120. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_tools.py +0 -0
  121. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/__init__.py +0 -0
  122. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/agent.py +0 -0
  123. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/cli.py +0 -0
  124. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/hpo.py +0 -0
  125. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/providers.py +0 -0
  126. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/swarm.py +0 -0
  127. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/tools.py +0 -0
  128. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/validate.py +0 -0
  129. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/version_launcher.py +0 -0
  130. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/websearch.py +0 -0
  131. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/wiki_cli.py +0 -0
  132. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/__init__.py +0 -0
  133. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/arch.py +0 -0
  134. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/download.py +0 -0
  135. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/generate.py +0 -0
  136. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/microwave.py +0 -0
  137. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/multilama.py +0 -0
  138. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/nano_nano.py +0 -0
  139. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/neo_oven.py +0 -0
  140. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/old_oven.py +0 -0
  141. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/stml.py +0 -0
  142. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/whisk.py +0 -0
  143. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/workshop.py +0 -0
  144. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/__init__.py +0 -0
  145. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/cctvtop.py +0 -0
  146. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/hyper_log.py +0 -0
  147. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/livestream.py +0 -0
  148. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/map.py +0 -0
  149. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/plasma.py +0 -0
  150. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/table.py +0 -0
  151. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/thermometer.py +0 -0
  152. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tv.py +0 -0
  153. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tvtop.py +0 -0
  154. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tvtop_plus_plus.py +0 -0
  155. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/__init__.py +0 -0
  156. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/optimizer_framework.py +0 -0
  157. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker.py +0 -0
  158. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v3.py +0 -0
  159. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v4.py +0 -0
  160. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v5.py +0 -0
  161. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v5s.py +0 -0
  162. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v6.py +0 -0
  163. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v6v.py +0 -0
  164. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/sixbit.py +0 -0
  165. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/package-lock.json +0 -0
  166. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/package.json +0 -0
  167. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/py.typed +0 -0
  168. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/__init__.py +0 -0
  169. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/convert.py +0 -0
  170. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/fetcher.py +0 -0
  171. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/formats.py +0 -0
  172. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/quantize.py +0 -0
  173. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/steamroller.py +0 -0
  174. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/steamroller_cli.py +0 -0
  175. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/upload.py +0 -0
  176. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/__init__.py +0 -0
  177. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/app.py +0 -0
  178. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/cli.py +0 -0
  179. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/params.py +0 -0
  180. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/templates.py +0 -0
  181. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/theme.py +0 -0
  182. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/widgets.py +0 -0
  183. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/__init__.py +0 -0
  184. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/gatekeeper.py +0 -0
  185. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/keymaster.py +0 -0
  186. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/__init__.py +0 -0
  187. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/compactor.py +0 -0
  188. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/config.py +0 -0
  189. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/deps.py +0 -0
  190. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/dishwasher.py +0 -0
  191. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/doctor.py +0 -0
  192. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/ethanol.py +0 -0
  193. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/freezer.py +0 -0
  194. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/net.py +0 -0
  195. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/old_fridge.py +0 -0
  196. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/outage.py +0 -0
  197. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/pascal.py +0 -0
  198. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/pathfix.py +0 -0
  199. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/protect.py +0 -0
  200. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/release.py +0 -0
  201. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/torch_compat.py +0 -0
  202. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/ups.py +0 -0
  203. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/utils.py +0 -0
  204. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/__init__.py +0 -0
  205. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/app.py +0 -0
  206. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/audit.py +0 -0
  207. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/auth.py +0 -0
  208. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/authhistory.py +0 -0
  209. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/backup.py +0 -0
  210. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/billing.py +0 -0
  211. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/config.py +0 -0
  212. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/cost.py +0 -0
  213. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/data/model_registry.example.json +0 -0
  214. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/data/routing_policies.example.json +0 -0
  215. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/db.py +0 -0
  216. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/deploy.py +0 -0
  217. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/deps.py +0 -0
  218. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/errors.py +0 -0
  219. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/events.py +0 -0
  220. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/jobs.py +0 -0
  221. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/keys.py +0 -0
  222. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/modules.py +0 -0
  223. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/mtls.py +0 -0
  224. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/netpolicy.py +0 -0
  225. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/ratelimit.py +0 -0
  226. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/registry.py +0 -0
  227. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/__init__.py +0 -0
  228. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/audit.py +0 -0
  229. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/auth.py +0 -0
  230. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/authundo.py +0 -0
  231. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/backup.py +0 -0
  232. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/billing.py +0 -0
  233. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/bridge.py +0 -0
  234. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/config.py +0 -0
  235. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/events.py +0 -0
  236. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/health.py +0 -0
  237. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/hyperlink.py +0 -0
  238. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/jobs.py +0 -0
  239. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/keys.py +0 -0
  240. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/models.py +0 -0
  241. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/modules.py +0 -0
  242. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/security.py +0 -0
  243. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/servers.py +0 -0
  244. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/usage.py +0 -0
  245. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routing.py +0 -0
  246. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/schemas.py +0 -0
  247. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/security.py +0 -0
  248. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/servers.py +0 -0
  249. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/storage.py +0 -0
  250. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/transport.py +0 -0
  251. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/usage.py +0 -0
  252. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/version.py +0 -0
  253. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/__init__.py +0 -0
  254. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/client.py +0 -0
  255. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/errors.py +0 -0
  256. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/models.py +0 -0
  257. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/transport.py +0 -0
  258. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/__init__.py +0 -0
  259. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/bell.py +0 -0
  260. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/coffee_maker.py +0 -0
  261. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/smoke_alarm.py +0 -0
  262. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/spinner.py +0 -0
  263. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/timer.py +0 -0
  264. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/__init__.py +0 -0
  265. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/abbicus.py +0 -0
  266. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/apron.py +0 -0
  267. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/brewer.py +0 -0
  268. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/cake_pan.py +0 -0
  269. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/camouflage.py +0 -0
  270. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/compute_framework.py +0 -0
  271. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/deep_fryer.py +0 -0
  272. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/fizzle.py +0 -0
  273. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/instant_pot.py +0 -0
  274. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/lazy_suzan.py +0 -0
  275. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/mtp.py +0 -0
  276. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/recipe_book.py +0 -0
  277. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/smoker.py +0 -0
  278. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/train.py +0 -0
  279. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/tsconfig.json +0 -0
  280. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/__init__.py +0 -0
  281. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/client.py +0 -0
  282. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/discovery.py +0 -0
  283. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/local_config.py +0 -0
  284. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/smoke.py +0 -0
  285. {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/tui.py +0 -0
  286. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_alarms_and_presets.py +0 -0
  287. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_arch_mapping.py +0 -0
  288. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_assistant.py +0 -0
  289. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_autofix_scripts.py +0 -0
  290. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_cli_integration.py +0 -0
  291. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_coverage_beef.py +0 -0
  292. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_deps_and_windows.py +0 -0
  293. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ethanol.py +0 -0
  294. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_fetcher.py +0 -0
  295. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_freezer.py +0 -0
  296. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_fridges.py +0 -0
  297. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_hyped_pro_bridge_cancel.py +0 -0
  298. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_hyped_pro_t1api.py +0 -0
  299. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_install_pin.py +0 -0
  300. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_install_script.py +0 -0
  301. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_kitchen_v044.py +0 -0
  302. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_kitchen_v045.py +0 -0
  303. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lazy_suzan.py +0 -0
  304. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lint_regressions.py +0 -0
  305. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lunchbox.py +0 -0
  306. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_map.py +0 -0
  307. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_module_layout.py +0 -0
  308. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_neo_oven.py +0 -0
  309. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_neo_oven_generation.py +0 -0
  310. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_new_archs_v035.py +0 -0
  311. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_nix_fallback.py +0 -0
  312. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_old_oven.py +0 -0
  313. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pathfix.py +0 -0
  314. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v048.py +0 -0
  315. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v3.py +0 -0
  316. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v6.py +0 -0
  317. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_quantize_v0703.py +0 -0
  318. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ranges.py +0 -0
  319. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_shakers_and_torchcompat.py +0 -0
  320. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_snapshot_roundtrip.py +0 -0
  321. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1_v1_0_26_core.py +0 -0
  322. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1_v1_0_26_http.py +0 -0
  323. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_auth.py +0 -0
  324. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_core.py +0 -0
  325. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_http.py +0 -0
  326. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_security.py +0 -0
  327. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta4_usage_report.py +0 -0
  328. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_billing.py +0 -0
  329. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_core.py +0 -0
  330. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_events.py +0 -0
  331. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_http.py +0 -0
  332. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_http_beta2.py +0 -0
  333. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_jobs.py +0 -0
  334. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_modules.py +0 -0
  335. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_routing.py +0 -0
  336. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_security.py +0 -0
  337. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_servers.py +0 -0
  338. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_tupperware.py +0 -0
  339. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_tvtop_plus_plus_comprehensive.py +0 -0
  340. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ups.py +0 -0
  341. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v031_chat_and_archs.py +0 -0
  342. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v047_deep_fryer_cake_pan_presets.py +0 -0
  343. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v050.py +0 -0
  344. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051.py +0 -0
  345. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_1.py +0 -0
  346. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_3.py +0 -0
  347. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_4.py +0 -0
  348. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v052_5.py +0 -0
  349. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v052_6.py +0 -0
  350. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v060.py +0 -0
  351. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_1.py +0 -0
  352. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_2.py +0 -0
  353. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_b1.py +0 -0
  354. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0703_additional.py +0 -0
  355. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704_features.py +0 -0
  356. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704_tvtop_plus_plus.py +0 -0
  357. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704b11_features.py +0 -0
  358. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704b12_cctvtop.py +0 -0
  359. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0705_all.py +0 -0
  360. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0710_gatekeeper_keymaster.py +0 -0
  361. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0711_border_fix.py +0 -0
  362. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0712_hyped_countertop.py +0 -0
  363. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_config_provider_keys.py +0 -0
  364. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_cpu_presets.py +0 -0
  365. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_bridge.py +0 -0
  366. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_core.py +0 -0
  367. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_launcher.py +0 -0
  368. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_tools.py +0 -0
  369. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_multilama.py +0 -0
  370. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_api_waiter.py +0 -0
  371. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_modules.py +0 -0
  372. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_t2_keys.py +0 -0
  373. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_vera.py +0 -0
  374. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_version_launcher.py +0 -0
  375. {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_waiter.py +0 -0
  376. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Abbicus.md +0 -0
  377. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Alarms.md +0 -0
  378. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Apron.md +0 -0
  379. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Architectures.md +0 -0
  380. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Bell.md +0 -0
  381. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Blender.md +0 -0
  382. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CLI.md +0 -0
  383. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CakePan.md +0 -0
  384. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Camouflage.md +0 -0
  385. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CoffeeMaker.md +0 -0
  386. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Convert.md +0 -0
  387. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Cookbook.md +0 -0
  388. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Countertop.md +0 -0
  389. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CuttingBoard.md +0 -0
  390. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Dashboards.md +0 -0
  391. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/DeepFryer.md +0 -0
  392. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Download.md +0 -0
  393. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/EspressoMaker.md +0 -0
  394. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Flour.md +0 -0
  395. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/FoodProcessor.md +0 -0
  396. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Frameworks.md +0 -0
  397. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Freezer.md +0 -0
  398. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Fridges.md +0 -0
  399. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Home.md +0 -0
  400. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/HuggingFace-Models.md +0 -0
  401. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/HyperLog.md +0 -0
  402. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Kitchen.md +0 -0
  403. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Lunchbox.md +0 -0
  404. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/MTP.md +0 -0
  405. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Menu.md +0 -0
  406. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Microwave.md +0 -0
  407. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Optimizers.md +0 -0
  408. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Ovens.md +0 -0
  409. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pans.md +0 -0
  410. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pascal.md +0 -0
  411. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/PipelineMechanics.md +0 -0
  412. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V3.md +0 -0
  413. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V4.md +0 -0
  414. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V5.md +0 -0
  415. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V6.md +0 -0
  416. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Quantization.md +0 -0
  417. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Ranges.md +0 -0
  418. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/RecipeBook.md +0 -0
  419. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Roadmap.md +0 -0
  420. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/STML.md +0 -0
  421. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Scavenger.md +0 -0
  422. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Shakers.md +0 -0
  423. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Smoker.md +0 -0
  424. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/T1-API-Security-Checklist.md +0 -0
  425. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Toaster.md +0 -0
  426. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Training.md +0 -0
  427. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Tupperware.md +0 -0
  428. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Vera.md +0 -0
  429. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Whisk.md +0 -0
  430. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Workshop.md +0 -0
  431. {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/macOS-legacy.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypernix
3
- Version: 0.72.2
3
+ Version: 0.72.2.post3
4
4
  Summary: Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
5
5
  Home-page: https://github.com/minerofthesoal/hypernix-pip
6
6
  Author: HyperNix contributors
@@ -15,7 +15,18 @@ export T1_DB_PATH="${T1_DB_PATH:-$HOME/.hypernix/t1api/t1api.sqlite3}"
15
15
  export T1_MODULE_STORAGE_DIR="${T1_MODULE_STORAGE_DIR:-$HOME/.hypernix/t1api/modules}"
16
16
 
17
17
  # A per-run secret is fine locally — scoped tokens simply don't survive a
18
- # restart, which for development is a feature. Production sets a stable one.
18
+ # restart, which for development is a feature. But if install-t1.sh has
19
+ # already written a stable one, use that instead of throwing it away:
20
+ # there is no reason for tokens to expire on restart when a secret is
21
+ # sitting right there. Environment first, then that file, then generate.
22
+ T1_CONFIG_DIR="${T1_CONFIG_DIR:-$HOME/.hypernix/t1api}"
23
+ if [ -z "${T1_TOKEN_SECRET:-}" ] && [ -r "$T1_CONFIG_DIR/.env" ]; then
24
+ # Read the one assignment rather than sourcing: sourcing runs whatever
25
+ # is in the file and would import every other setting with it.
26
+ T1_TOKEN_SECRET="$(sed -n "s/^T1_TOKEN_SECRET=//p" "$T1_CONFIG_DIR/.env" | tail -1)"
27
+ T1_TOKEN_SECRET="${T1_TOKEN_SECRET%\'}"; T1_TOKEN_SECRET="${T1_TOKEN_SECRET#\'}"
28
+ T1_TOKEN_SECRET="${T1_TOKEN_SECRET%\"}"; T1_TOKEN_SECRET="${T1_TOKEN_SECRET#\"}"
29
+ fi
19
30
  export T1_TOKEN_SECRET="${T1_TOKEN_SECRET:-$(python3 -c 'import secrets; print(secrets.token_hex(32))')}"
20
31
 
21
32
  # Show the shipped placeholder models so there is something to look at.
@@ -33,7 +33,60 @@ TS_IP="$(tailscale ip -4 | head -1)"
33
33
  [ -n "$TS_IP" ] || { echo "no Tailscale IPv4 address — is this machine logged in?" >&2; exit 1; }
34
34
 
35
35
  export T1_ENVIRONMENT="${T1_ENVIRONMENT:-development}"
36
- export T1_TOKEN_SECRET="${T1_TOKEN_SECRET:?set T1_TOKEN_SECRET (python3 -c 'import secrets;print(secrets.token_hex(32))')}"
36
+
37
+ # A tailnet deployment needs a *stable* token secret, unlike run_local.sh
38
+ # which is happy to mint a throwaway one per run. Scoped tokens are signed
39
+ # with it, so a secret that changes on restart silently invalidates every
40
+ # outstanding token — tolerable on a laptop you are developing against,
41
+ # not on a server other machines are pointed at.
42
+ #
43
+ # Three places are checked, in order, before giving up: the environment,
44
+ # then the .env that install-t1.sh writes (which already contains a
45
+ # generated secret, so an installed deployment needs no further setup),
46
+ # then nothing — and "nothing" is a message you can act on rather than a
47
+ # bare parameter-expansion error.
48
+ T1_CONFIG_DIR="${T1_CONFIG_DIR:-$HOME/.hypernix/t1api}"
49
+ if [ -z "${T1_TOKEN_SECRET:-}" ] && [ -r "$T1_CONFIG_DIR/.env" ]; then
50
+ # Read the one assignment rather than sourcing the file: sourcing runs
51
+ # whatever is in it and would also import every other setting, which is
52
+ # not what this script is asking for.
53
+ T1_TOKEN_SECRET="$(sed -n "s/^T1_TOKEN_SECRET=//p" "$T1_CONFIG_DIR/.env" | tail -1)"
54
+ # Tolerate a quoted value.
55
+ T1_TOKEN_SECRET="${T1_TOKEN_SECRET%\'}"; T1_TOKEN_SECRET="${T1_TOKEN_SECRET#\'}"
56
+ T1_TOKEN_SECRET="${T1_TOKEN_SECRET%\"}"; T1_TOKEN_SECRET="${T1_TOKEN_SECRET#\"}"
57
+ [ -n "$T1_TOKEN_SECRET" ] && echo "Using the token secret from $T1_CONFIG_DIR/.env" >&2
58
+ fi
59
+
60
+ if [ -z "${T1_TOKEN_SECRET:-}" ]; then
61
+ # Deliberately not a ${VAR:?...} expansion. That form strips the quotes
62
+ # from its own message before printing it, so the command it suggests
63
+ # arrives unpasteable — `python3 -c import secrets;print(...)` is a
64
+ # syntax error in both the shell and Python.
65
+ cat >&2 <<'NEEDSECRET'
66
+ T1_TOKEN_SECRET is not set.
67
+
68
+ A tailnet deployment needs a stable one: it signs the scoped tokens, so a
69
+ secret that changes on restart invalidates every token already issued.
70
+
71
+ Generate one and keep it:
72
+
73
+ mkdir -p ~/.hypernix/t1api
74
+ printf 'T1_TOKEN_SECRET=%s\n' \
75
+ "$(python3 -c 'import secrets; print(secrets.token_hex(32))')" \
76
+ >> ~/.hypernix/t1api/.env
77
+ chmod 600 ~/.hypernix/t1api/.env
78
+
79
+ This script reads that file, so re-running it afterwards is all that is
80
+ needed. Or set it for one run:
81
+
82
+ export T1_TOKEN_SECRET="$(python3 -c 'import secrets; print(secrets.token_hex(32))')"
83
+
84
+ install-t1.sh writes this file for you, along with the rest of the
85
+ configuration.
86
+ NEEDSECRET
87
+ exit 1
88
+ fi
89
+ export T1_TOKEN_SECRET
37
90
  export T1_DB_PATH="${T1_DB_PATH:-$HOME/.hypernix/t1api/t1api.sqlite3}"
38
91
  export T1_MODULE_STORAGE_DIR="${T1_MODULE_STORAGE_DIR:-$HOME/.hypernix/t1api/modules}"
39
92
 
@@ -45,6 +98,12 @@ export T1_ALLOW_UNLISTED_CLIENTS=0
45
98
 
46
99
  PORT="${PORT:-8000}"
47
100
 
101
+ python3 -c "import fastapi" 2>/dev/null || {
102
+ echo "The HTTP layer needs the [t1api] extra:" >&2
103
+ echo " pip install 'hypernix[t1api]'" >&2
104
+ exit 1
105
+ }
106
+
48
107
  cat <<BANNER
49
108
  HyperNix T1 API — Tailscale
50
109
  bind ${TS_IP}:${PORT}
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hypernix"
7
- version = "0.72.2"
7
+ version = "0.72.2.post3"
8
8
  description = "Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M)."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  license = { text = "HOL-1.0" }
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = hypernix
3
- version = 0.72.2
3
+ version = 0.72.2.post3
4
4
  description = Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -63,7 +63,7 @@ import importlib.util
63
63
  import sys
64
64
  from typing import TYPE_CHECKING, Any
65
65
 
66
- __version__ = "0.72.2"
66
+ __version__ = "0.72.2-3"
67
67
  DEFAULT_REPO_ID = "ray0rf1re/hyper-Nix.2"
68
68
  DEFAULT_MODEL = "qwen3.5-4b" # New default model
69
69
 
@@ -33,17 +33,44 @@ Subcommands
33
33
 
34
34
  gkey import <FILE>
35
35
 
36
+ gkey version [--json]
37
+ HyperNix, T1 API, and key format versions
38
+
39
+ Key formats
40
+ -----------
41
+ ``gkey create -v`` chooses which format the new key is presented in::
42
+
43
+ gkey create -v v1 # T1_… (default)
44
+ gkey create -v v2 --level 5 # T2_…-5
45
+ gkey create -v v2 --type admin # T2_<password>_…-9
46
+ gkey create -v v2short # T2S_…-1, for HyperLink
47
+
48
+ A v2 key is a *spelling* of a v1 key rather than a separate credential:
49
+ the key is minted into the store in its v1 form and presented in the
50
+ requested one, and the server converts it back on every request. Both
51
+ spellings therefore work, and ``gkey revoke`` on the key ID kills both.
52
+
36
53
  All output is rich-formatted when the ``rich`` package is available,
37
54
  plain text otherwise.
38
55
  """
39
56
  from __future__ import annotations
40
57
 
41
58
  import json
59
+ import re
42
60
  import sys
43
61
  from datetime import UTC, datetime
44
62
  from pathlib import Path
45
63
  from typing import Any
46
64
 
65
+ from hypernix.security.keyversions import (
66
+ DEFAULT_KEY_VERSION,
67
+ KEY_VERSIONS,
68
+ LATEST_KEY_VERSION,
69
+ RESERVED_KEY_VERSIONS,
70
+ key_version_names,
71
+ resolve_key_version,
72
+ )
73
+
47
74
  # ---------------------------------------------------------------------------
48
75
  # Rich helpers (graceful degradation)
49
76
  # ---------------------------------------------------------------------------
@@ -67,12 +94,35 @@ def _console():
67
94
  return None
68
95
 
69
96
 
70
- def _print_rich(text: str, style: str = "") -> None:
97
+ #: The style names this module marks text up with. Deliberately a closed
98
+ #: list rather than a general ``\[[^]]*]`` pattern: ``[`` and ``]`` are
99
+ #: both valid characters inside a key, so a general stripper would
100
+ #: silently corrupt a key it was asked to print — the one string here
101
+ #: that has to survive byte for byte.
102
+ _MARKUP_STYLES = (
103
+ "bold green", "bold red", "bold", "cyan", "dim", "green", "red", "yellow",
104
+ )
105
+ _MARKUP = re.compile(
106
+ r"\[/?(?:" + "|".join(re.escape(name) for name in _MARKUP_STYLES) + r")]"
107
+ )
108
+
109
+
110
+ def _strip_markup(text: str) -> str:
111
+ return _MARKUP.sub("", text)
112
+
113
+
114
+ def _print_rich(text: str, style: str = "", plain: str | None = None) -> None:
115
+ """Print *text*, which may carry rich markup.
116
+
117
+ Without rich, markup would otherwise reach the terminal literally —
118
+ ``[yellow]v2.1[/yellow]``. Pass *plain* when the fallback wants
119
+ different wording; otherwise the known style tags are stripped.
120
+ """
71
121
  if _HAS_RICH:
72
122
  from rich.console import Console
73
123
  Console().print(text, style=style or "default")
74
124
  else:
75
- print(text)
125
+ print(plain if plain is not None else _strip_markup(text))
76
126
 
77
127
 
78
128
  def _print_table(headers: list[str], rows: list[list[str]], title: str = "") -> None:
@@ -175,6 +225,12 @@ def _fmt_ts(ts: float | None) -> str:
175
225
  # ---------------------------------------------------------------------------
176
226
 
177
227
 
228
+ def _generate_password(include_word: bool) -> str:
229
+ from hypernix.security.t2keys import generate_admin_password
230
+
231
+ return generate_admin_password(include_word=include_word)
232
+
233
+
178
234
  def _cmd_create(args: list[str]) -> int:
179
235
  import argparse
180
236
  p = argparse.ArgumentParser(prog="gkey create")
@@ -194,8 +250,27 @@ def _cmd_create(args: list[str]) -> int:
194
250
  p.add_argument("--note", default="", help="Free-text note attached to the key")
195
251
  p.add_argument("--rotation-window", type=int, default=24, metavar="HOURS",
196
252
  help="Hours before expiry to auto-rotate (default 24)")
253
+ p.add_argument("-v", "--key-version", dest="key_version",
254
+ default=DEFAULT_KEY_VERSION.name, metavar="VERSION",
255
+ help="Key format: " + ", ".join(key_version_names())
256
+ + f" (default {DEFAULT_KEY_VERSION.name})")
257
+ p.add_argument("--level", type=int, default=None, metavar="1-9",
258
+ help="Access level for a v2/v2short key (default 1, "
259
+ "or 9 for an admin key)")
260
+ p.add_argument("--password", default=None, metavar="PASSWORD",
261
+ help="Admin password for a v2 admin key. Generated when "
262
+ "omitted; a supplied one is validated, not trusted.")
263
+ p.add_argument("--word", dest="include_word", action="store_true",
264
+ help="Embed a six-letter word in a generated admin password "
265
+ "(memorability, not entropy)")
197
266
  ns = p.parse_args(args)
198
267
 
268
+ try:
269
+ version = resolve_key_version(ns.key_version)
270
+ except ValueError as exc:
271
+ print(f"[gkey create] {exc}", file=sys.stderr)
272
+ return 2
273
+
199
274
  from hypernix.security.keymaster import KeyType
200
275
  type_map = {
201
276
  "dev": KeyType.DEVELOPMENT,
@@ -208,10 +283,64 @@ def _cmd_create(args: list[str]) -> int:
208
283
  scopes = _parse_scopes(ns.scopes)
209
284
  expires = _parse_expires(ns.expires) if ns.expires else None
210
285
  tags = _parse_tags(ns.tags)
286
+ key_type = type_map[ns.key_type]
287
+ wants_admin = key_type is KeyType.ADMIN
288
+
289
+ # Everything that makes the request impossible is checked here, before
290
+ # a key exists. A key minted and then found unpresentable would still
291
+ # be in the store, valid, and unknown to the operator who saw only an
292
+ # error — a real credential nobody is tracking.
293
+ if wants_admin and not version.supports_admin:
294
+ print(
295
+ f"[gkey create] A {version.name} key cannot be an administrator: "
296
+ f"{version.summary}\n"
297
+ f" Use -v v2 for an admin key in the T2 family.",
298
+ file=sys.stderr,
299
+ )
300
+ return 2
301
+ if ns.level is not None and not version.supports_access_level:
302
+ print(
303
+ f"[gkey create] --level does not apply to a {version.name} key; "
304
+ f"the format has no access-level field.",
305
+ file=sys.stderr,
306
+ )
307
+ return 2
308
+ if ns.level is not None and not 1 <= ns.level <= 9:
309
+ print(f"[gkey create] --level must be 1-9, got {ns.level}", file=sys.stderr)
310
+ return 2
311
+ if ns.password is not None and not (wants_admin and version.supports_admin):
312
+ print(
313
+ "[gkey create] --password marks a key as an administrator; pass "
314
+ "--type admin as well, or drop it.",
315
+ file=sys.stderr,
316
+ )
317
+ return 2
318
+
319
+ # A T2S body is exactly 26 characters, so the underlying T1 key has to
320
+ # be minted at that length — the presentation cannot change it later.
321
+ body_length = version.body_length or ns.body_len
322
+ if version.body_length and ns.body_len != 24 and ns.body_len != version.body_length:
323
+ print(
324
+ f"[gkey create] --body-len {ns.body_len} conflicts with {version.name}, "
325
+ f"whose body is fixed at {version.body_length}.",
326
+ file=sys.stderr,
327
+ )
328
+ return 2
329
+
330
+ access_level = ns.level if ns.level is not None else (9 if wants_admin else 1)
331
+
332
+ # The key format is recorded on the key so `gkey list` can say which
333
+ # spelling was issued. The store only ever holds the T1 form, so
334
+ # without this the issued spelling is lost the moment the key scrolls
335
+ # off the screen.
336
+ if version is not DEFAULT_KEY_VERSION:
337
+ tags = {**tags, "key_version": version.name}
338
+ if version.supports_access_level:
339
+ tags["access_level"] = str(access_level)
211
340
 
212
341
  km = _get_km()
213
342
  meta = km.create(
214
- key_type=type_map[ns.key_type],
343
+ key_type=key_type,
215
344
  scopes=scopes,
216
345
  expires_at=expires,
217
346
  usage_cap=ns.cap,
@@ -220,15 +349,53 @@ def _cmd_create(args: list[str]) -> int:
220
349
  tags=tags,
221
350
  rotation_window=ns.rotation_window,
222
351
  note=ns.note,
223
- body_length=ns.body_len,
352
+ body_length=body_length,
224
353
  )
225
354
  km.stop()
226
355
 
356
+ # Present the minted key in the requested format.
357
+ #
358
+ # The T1 key stays in the store and stays valid; a v2 spelling is
359
+ # converted back to it on every authentication. That is why this is a
360
+ # presentation step after minting rather than a different generator:
361
+ # a T2 key generated on its own belongs to no key store and
362
+ # authenticates as nothing.
363
+ issued_key = meta.key
364
+ admin_password = ""
365
+ if version is not DEFAULT_KEY_VERSION:
366
+ from hypernix.security.t2keys import T2KeyGenerator, T2Type
367
+
368
+ if wants_admin:
369
+ # Guarded by the store's own record, not by the flag that was
370
+ # typed: from_t1_admin's precondition is that the key really
371
+ # is an administrator.
372
+ if meta.key_type is not KeyType.ADMIN:
373
+ print(
374
+ "[gkey create] Refusing to present a non-admin key as an "
375
+ "admin key.",
376
+ file=sys.stderr,
377
+ )
378
+ return 1
379
+ t2 = T2KeyGenerator.from_t1_admin(
380
+ meta.key,
381
+ password=ns.password or _generate_password(ns.include_word),
382
+ access_level=access_level,
383
+ )
384
+ admin_password = t2.password
385
+ else:
386
+ t2 = T2KeyGenerator.from_t1(
387
+ meta.key,
388
+ access_level=access_level,
389
+ family=T2Type(version.family),
390
+ )
391
+ issued_key = t2.raw
392
+
227
393
  content_lines = [
228
394
  "[bold green]Key created successfully![/bold green]",
229
395
  "",
230
396
  f"[bold]Key ID:[/bold] {meta.key_id}",
231
- f"[bold]Key:[/bold] [yellow]{meta.key}[/yellow]",
397
+ f"[bold]Key:[/bold] [yellow]{issued_key}[/yellow]",
398
+ f"[bold]Format:[/bold] {version.name} ({version.family})",
232
399
  f"[bold]Type:[/bold] {meta.key_type.value}",
233
400
  f"[bold]Scopes:[/bold] {', '.join(s.value for s in sorted(meta.scopes, key=lambda x: x.value))}",
234
401
  f"[bold]Expires:[/bold] {_fmt_ts(meta.expires_at)}",
@@ -236,19 +403,42 @@ def _cmd_create(args: list[str]) -> int:
236
403
  f"[bold]Prefix:[/bold] {meta.prefix or '—'}",
237
404
  f"[bold]Note:[/bold] {meta.note or '—'}",
238
405
  ]
406
+ if version.supports_access_level:
407
+ content_lines.insert(
408
+ 5, f"[bold]Level:[/bold] {access_level}"
409
+ )
410
+ if admin_password:
411
+ content_lines.append(
412
+ f"[bold]Password:[/bold] [yellow]{admin_password}[/yellow]"
413
+ )
239
414
  if tags:
240
415
  content_lines.append(f"[bold]Tags:[/bold] {json.dumps(tags)}")
416
+ if version is not DEFAULT_KEY_VERSION:
417
+ content_lines.append("")
418
+ content_lines.append(
419
+ f"[dim]This is the {version.name} spelling of a v1 key that is in the "
420
+ f"key store.\nThe server converts it back on every request, so the "
421
+ f"{DEFAULT_KEY_VERSION.name} form below works too:[/dim]"
422
+ )
423
+ content_lines.append(f"[dim] {meta.key}[/dim]")
241
424
 
242
425
  if _HAS_RICH:
243
426
  _print_panel("\n".join(content_lines), title="gkey create")
244
427
  else:
245
428
  print("Key created successfully!")
246
429
  print(f" Key ID: {meta.key_id}")
247
- print(f" Key: {meta.key}")
430
+ print(f" Key: {issued_key}")
431
+ print(f" Format: {version.name} ({version.family})")
432
+ if version.supports_access_level:
433
+ print(f" Level: {access_level}")
248
434
  print(f" Type: {meta.key_type.value}")
249
435
  print(f" Scopes: {', '.join(s.value for s in sorted(meta.scopes, key=lambda x: x.value))}")
250
436
  print(f" Expires: {_fmt_ts(meta.expires_at)}")
251
437
  print(f" Server ID: {meta.server_id}")
438
+ if admin_password:
439
+ print(f" Password: {admin_password}")
440
+ if version is not DEFAULT_KEY_VERSION:
441
+ print(f" v1 form: {meta.key}")
252
442
 
253
443
  return 0
254
444
 
@@ -729,6 +919,101 @@ Run `gkey <subcommand> --help` for detailed options.
729
919
  """
730
920
 
731
921
 
922
+ # ---------------------------------------------------------------------------
923
+ # Subcommand: version
924
+ # ---------------------------------------------------------------------------
925
+
926
+
927
+ def _cmd_version(args: list[str]) -> int:
928
+ """What this install is, what it talks to, and what it can mint.
929
+
930
+ Three separate version lines, because they move independently: the
931
+ package ships on its own schedule, the T1 API carries its own
932
+ six-part version inside that, and the key formats change more slowly
933
+ than either. An operator debugging "my key is refused" needs to know
934
+ which of the three is out of step.
935
+ """
936
+ import argparse
937
+
938
+ p = argparse.ArgumentParser(prog="gkey version")
939
+ p.add_argument("--json", dest="as_json", action="store_true")
940
+ ns = p.parse_args(args)
941
+
942
+ from hypernix import __version__ as hypernix_version
943
+ from hypernix.t1api.version import T1_VERSION_LONG, T1_VERSION_SHORT
944
+
945
+ if ns.as_json:
946
+ print(json.dumps({
947
+ "hypernix": hypernix_version,
948
+ "t1_api": {"short": T1_VERSION_SHORT, "long": T1_VERSION_LONG},
949
+ "key_versions": {
950
+ "latest": LATEST_KEY_VERSION.name,
951
+ "default": DEFAULT_KEY_VERSION.name,
952
+ "available": [
953
+ {
954
+ "name": v.name,
955
+ "family": v.family,
956
+ "prefix": v.prefix,
957
+ "summary": v.summary,
958
+ "supports_admin": v.supports_admin,
959
+ "supports_access_level": v.supports_access_level,
960
+ "body_length": v.body_length,
961
+ }
962
+ for v in KEY_VERSIONS
963
+ ],
964
+ "reserved": [
965
+ {"name": v.name, "reason": v.unavailable_reason}
966
+ for v in RESERVED_KEY_VERSIONS
967
+ ],
968
+ },
969
+ }, indent=2))
970
+ return 0
971
+
972
+ lines = [
973
+ f"[bold]HyperNix:[/bold] {hypernix_version}",
974
+ f"[bold]T1 API:[/bold] t1 v{T1_VERSION_SHORT} [dim]({T1_VERSION_LONG})[/dim]",
975
+ f"[bold]Key format:[/bold] {LATEST_KEY_VERSION.name} is the latest; "
976
+ f"[dim]gkey create mints {DEFAULT_KEY_VERSION.name} unless told otherwise[/dim]",
977
+ ]
978
+ if _HAS_RICH:
979
+ _print_panel("\n".join(lines), title="gkey version")
980
+ else:
981
+ print(f"HyperNix: {hypernix_version}")
982
+ print(f"T1 API: t1 v{T1_VERSION_SHORT} ({T1_VERSION_LONG})")
983
+ print(f"Key format: {LATEST_KEY_VERSION.name} is the latest; "
984
+ f"gkey create mints {DEFAULT_KEY_VERSION.name} unless told otherwise")
985
+ print()
986
+
987
+ rows = []
988
+ for version in KEY_VERSIONS:
989
+ notes = []
990
+ if version is LATEST_KEY_VERSION:
991
+ notes.append("latest")
992
+ if version is DEFAULT_KEY_VERSION:
993
+ notes.append("default")
994
+ if not version.supports_admin:
995
+ notes.append("never admin")
996
+ if version.body_length:
997
+ notes.append(f"{version.body_length}-char body")
998
+ rows.append([
999
+ version.name,
1000
+ version.prefix,
1001
+ version.summary,
1002
+ ", ".join(notes) or "—",
1003
+ ])
1004
+ _print_table(
1005
+ ["Version", "Prefix", "What it is", "Notes"], rows, title="Issuable key formats"
1006
+ )
1007
+
1008
+ for version in RESERVED_KEY_VERSIONS:
1009
+ _print_rich(
1010
+ f"\n[yellow]{version.name}[/yellow] is not issuable. "
1011
+ f"{version.unavailable_reason}",
1012
+ style="yellow",
1013
+ )
1014
+ return 0
1015
+
1016
+
732
1017
  def main(argv: list[str] | None = None) -> int:
733
1018
  """Entry point for the `gkey` console script."""
734
1019
  raw = list(sys.argv[1:] if argv is None else argv)
@@ -755,6 +1040,7 @@ def main(argv: list[str] | None = None) -> int:
755
1040
  ("rotate", "Rotate (replace) a key with a fresh one"),
756
1041
  ("export", "Export key(s) to a JSON file"),
757
1042
  ("import", "Import key(s) from a JSON file"),
1043
+ ("version", "HyperNix, T1 API, and key format versions"),
758
1044
  ]
759
1045
  for cmd, desc in cmds:
760
1046
  t.add_row(f"[green]{cmd}[/green]", desc)
@@ -768,6 +1054,7 @@ def main(argv: list[str] | None = None) -> int:
768
1054
  if raw[0] in ("-V", "--version"):
769
1055
  from hypernix import __version__
770
1056
  print(f"gkey (hypernix {__version__})")
1057
+ print("Run `gkey version` for the T1 API and key format versions.")
771
1058
  return 0
772
1059
 
773
1060
  cmd, rest = raw[0], raw[1:]
@@ -786,6 +1073,7 @@ def main(argv: list[str] | None = None) -> int:
786
1073
  "rotate": _cmd_rotate,
787
1074
  "export": _cmd_export,
788
1075
  "import": _cmd_import,
1076
+ "version": _cmd_version,
789
1077
  }
790
1078
 
791
1079
  if cmd not in dispatch: