hypernix 0.72.4__tar.gz → 0.72.4.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 (572) hide show
  1. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/ci.yml +101 -0
  2. {hypernix-0.72.4 → hypernix-0.72.4.post3}/PKG-INFO +2 -2
  3. {hypernix-0.72.4 → hypernix-0.72.4.post3}/README.md +1 -1
  4. {hypernix-0.72.4 → hypernix-0.72.4.post3}/pyproject.toml +1 -1
  5. {hypernix-0.72.4 → hypernix-0.72.4.post3}/setup.cfg +1 -1
  6. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/__init__.py +1 -1
  7. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix.egg-info/SOURCES.txt +1 -0
  8. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ggml_hnx.py +180 -2
  9. hypernix-0.72.4.post3/tests/test_studio_local.py +253 -0
  10. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Changelog.md +159 -0
  11. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Release-Timeline.md +32 -0
  12. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/build.yml +0 -0
  13. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/codacy.yml +0 -0
  14. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/codeql.yml +0 -0
  15. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/deploy-docs.yml +0 -0
  16. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/ios.yml +0 -0
  17. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/public-release.yml +0 -0
  18. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/release.yml +0 -0
  19. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/update-json-stats.yml +0 -0
  20. {hypernix-0.72.4 → hypernix-0.72.4.post3}/.github/workflows/update-readme.yml +0 -0
  21. {hypernix-0.72.4 → hypernix-0.72.4.post3}/LICENSE +0 -0
  22. {hypernix-0.72.4 → hypernix-0.72.4.post3}/MANIFEST.in +0 -0
  23. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/banner-hero.svg +0 -0
  24. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd-removebg-preview.png +0 -0
  25. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd.png +0 -0
  26. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/apple-touch-icon.png +0 -0
  27. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-16.png +0 -0
  28. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-32.png +0 -0
  29. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/favicon-48.png +0 -0
  30. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-favicon.svg +0 -0
  31. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-dark.svg +0 -0
  32. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-mono.svg +0 -0
  33. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-ondark.svg +0 -0
  34. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon-white.svg +0 -0
  35. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-icon.svg +0 -0
  36. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-lockup-dark.svg +0 -0
  37. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/hypernix-lockup-light.svg +0 -0
  38. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/icon-192.png +0 -0
  39. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo-new/icon-512.png +0 -0
  40. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo.png +0 -0
  41. {hypernix-0.72.4 → hypernix-0.72.4.post3}/assets/logo1.png +0 -0
  42. {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/_hypernix_python.sh +0 -0
  43. {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped+ +0 -0
  44. {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped-pro +0 -0
  45. {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hyped-pro-gui +0 -0
  46. {hypernix-0.72.4 → hypernix-0.72.4.post3}/bin/hypernix-t1 +0 -0
  47. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/curriculum_eval_v0_70_4.py +0 -0
  48. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/custom_arch.py +0 -0
  49. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hypernix_run.json +0 -0
  50. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/README.md +0 -0
  51. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/serve.sh +0 -0
  52. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/hyprslug-headers/wrap-for-lmstudio.sh +0 -0
  53. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/quickstart.py +0 -0
  54. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/resilient_finetune_v0_70_4.py +0 -0
  55. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/run_hypernix.py +0 -0
  56. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/.env.example +0 -0
  57. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/API-EXAMPLES.md +0 -0
  58. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/Dockerfile +0 -0
  59. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/README.md +0 -0
  60. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/config/.gitkeep +0 -0
  61. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/docker-compose.yml +0 -0
  62. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/hypernix-t1api.service +0 -0
  63. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/nginx.conf +0 -0
  64. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/openapi.json +0 -0
  65. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/run_local.sh +0 -0
  66. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/t1api/run_tailscale.sh +0 -0
  67. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train hypernix 1 5 gtx1080.py +0 -0
  68. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
  69. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
  70. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/README.md +0 -0
  71. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/dracula.theme +0 -0
  72. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/gruvbox-dark.theme +0 -0
  73. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/hypernix.theme +0 -0
  74. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/mono.theme +0 -0
  75. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/monokai.theme +0 -0
  76. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/nord.theme +0 -0
  77. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/tvtoppro/tokyo-night.theme +0 -0
  78. {hypernix-0.72.4 → hypernix-0.72.4.post3}/examples/upload_to_hub.py +0 -0
  79. {hypernix-0.72.4 → hypernix-0.72.4.post3}/install-t1.sh +0 -0
  80. {hypernix-0.72.4 → hypernix-0.72.4.post3}/pytest.ini +0 -0
  81. {hypernix-0.72.4 → hypernix-0.72.4.post3}/ruff.toml +0 -0
  82. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/README.md +0 -0
  83. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/apply_hypernix_fixes.py +0 -0
  84. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix +0 -0
  85. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-B +0 -0
  86. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-E +0 -0
  87. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix-F +0 -0
  88. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/autofix_scope.py +0 -0
  89. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v5.py +0 -0
  90. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v5s.py +0 -0
  91. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/benchmark_v6.py +0 -0
  92. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/fake_model_server.py +0 -0
  93. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/integration_probe.py +0 -0
  94. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/ci/wait_for_http.py +0 -0
  95. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/install_deps.sh +0 -0
  96. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/install_macos_legacy.sh +0 -0
  97. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/measure_optimizer_memory.py +0 -0
  98. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/quantize_i7_7660u.sh +0 -0
  99. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/t1api_examples.py +0 -0
  100. {hypernix-0.72.4 → hypernix-0.72.4.post3}/scripts/update_json_stats.py +0 -0
  101. {hypernix-0.72.4 → hypernix-0.72.4.post3}/setup.py +0 -0
  102. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/__main__.py +0 -0
  103. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/__init__.py +0 -0
  104. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/audiofile.py +0 -0
  105. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/features.py +0 -0
  106. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/wakeup.py +0 -0
  107. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/audio/wakeup_cli.py +0 -0
  108. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/bridge/__init__.py +0 -0
  109. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/bridge/lmstudio.py +0 -0
  110. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/__init__.py +0 -0
  111. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/cookbook.py +0 -0
  112. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/countertop.py +0 -0
  113. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/flour.py +0 -0
  114. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/injection.py +0 -0
  115. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/chat/menu.py +0 -0
  116. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/__init__.py +0 -0
  117. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/blender.py +0 -0
  118. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/cardboard_box.py +0 -0
  119. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/cutting_board.py +0 -0
  120. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/food_processor.py +0 -0
  121. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/gather.py +0 -0
  122. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/gather_cli.py +0 -0
  123. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/lunchbox.py +0 -0
  124. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/mediocre_fridge.py +0 -0
  125. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/pans.py +0 -0
  126. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/pepper_shaker.py +0 -0
  127. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/qa.py +0 -0
  128. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/salt_shaker.py +0 -0
  129. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/scavenger.py +0 -0
  130. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/sink.py +0 -0
  131. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/strainer.py +0 -0
  132. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/toaster.py +0 -0
  133. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/data/tupperware.py +0 -0
  134. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/__init__.py +0 -0
  135. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/espresso_maker.py +0 -0
  136. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/industrial_range.py +0 -0
  137. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/new_fridge.py +0 -0
  138. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/new_range.py +0 -0
  139. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/old_range.py +0 -0
  140. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/evaluation/vera.py +0 -0
  141. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyped_pro.js +0 -0
  142. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/__init__.py +0 -0
  143. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/discovery.py +0 -0
  144. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/files.py +0 -0
  145. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/hfdownload.py +0 -0
  146. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/hfmerge.py +0 -0
  147. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/identity.py +0 -0
  148. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/pairing.py +0 -0
  149. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/peers.py +0 -0
  150. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/hyperlink/sessions.py +0 -0
  151. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/__init__.py +0 -0
  152. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/assistant.py +0 -0
  153. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/cli.py +0 -0
  154. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped.py +0 -0
  155. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro.py +0 -0
  156. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_bridge.py +0 -0
  157. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_core.py +0 -0
  158. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_gui.py +0 -0
  159. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/hyped_pro_tools.py +0 -0
  160. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/__init__.py +0 -0
  161. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/agent.py +0 -0
  162. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/cli.py +0 -0
  163. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/hpo.py +0 -0
  164. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/providers.py +0 -0
  165. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/swarm.py +0 -0
  166. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/tools.py +0 -0
  167. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/noodle/validate.py +0 -0
  168. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/version_launcher.py +0 -0
  169. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/websearch.py +0 -0
  170. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/interfaces/wiki_cli.py +0 -0
  171. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/__init__.py +0 -0
  172. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/arch.py +0 -0
  173. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/brewer_adapter.py +0 -0
  174. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/download.py +0 -0
  175. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/generate.py +0 -0
  176. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/ggufrun.py +0 -0
  177. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxdevice.py +0 -0
  178. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxrun.py +0 -0
  179. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxtokenizer.py +0 -0
  180. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/hnxtorch.py +0 -0
  181. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/microwave.py +0 -0
  182. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/multilama.py +0 -0
  183. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/nano_nano.py +0 -0
  184. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/neo_oven.py +0 -0
  185. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/old_oven.py +0 -0
  186. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/stml.py +0 -0
  187. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/whisk.py +0 -0
  188. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/models/workshop.py +0 -0
  189. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/__init__.py +0 -0
  190. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/cctvtop.py +0 -0
  191. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/hyper_log.py +0 -0
  192. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/livestream.py +0 -0
  193. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/map.py +0 -0
  194. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/plasma.py +0 -0
  195. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/table.py +0 -0
  196. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/thermometer.py +0 -0
  197. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tv.py +0 -0
  198. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtop.py +0 -0
  199. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtop_plus_plus.py +0 -0
  200. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/monitoring/tvtoppro.py +0 -0
  201. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/__init__.py +0 -0
  202. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/optimizer_framework.py +0 -0
  203. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker.py +0 -0
  204. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v3.py +0 -0
  205. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v4.py +0 -0
  206. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v5.py +0 -0
  207. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v5s.py +0 -0
  208. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v6.py +0 -0
  209. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/pressure_cooker_v6v.py +0 -0
  210. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/optimizers/sixbit.py +0 -0
  211. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/package-lock.json +0 -0
  212. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/package.json +0 -0
  213. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/py.typed +0 -0
  214. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/__init__.py +0 -0
  215. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/convert.py +0 -0
  216. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/dflash2.py +0 -0
  217. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/dflash2_cli.py +0 -0
  218. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/fetcher.py +0 -0
  219. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/formats.py +0 -0
  220. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/gguf.py +0 -0
  221. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug.py +0 -0
  222. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_cli.py +0 -0
  223. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_headers.py +0 -0
  224. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_headers_cli.py +0 -0
  225. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/hyprslug_server.py +0 -0
  226. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/imatrix.py +0 -0
  227. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/imatrix_cli.py +0 -0
  228. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/llamaquants.py +0 -0
  229. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/lowbit.py +0 -0
  230. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/quantize.py +0 -0
  231. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/steamroller.py +0 -0
  232. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/steamroller_cli.py +0 -0
  233. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/subbit.py +0 -0
  234. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/quant/upload.py +0 -0
  235. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/__init__.py +0 -0
  236. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/app.py +0 -0
  237. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/cli.py +0 -0
  238. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/params.py +0 -0
  239. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/templates.py +0 -0
  240. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/theme.py +0 -0
  241. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/scriptgen/widgets.py +0 -0
  242. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/__init__.py +0 -0
  243. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/gatekeeper.py +0 -0
  244. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/gkey_cli.py +0 -0
  245. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keyconfig.py +0 -0
  246. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keymaster.py +0 -0
  247. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/keyversions.py +0 -0
  248. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/security/t2keys.py +0 -0
  249. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/__init__.py +0 -0
  250. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/compactor.py +0 -0
  251. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/config.py +0 -0
  252. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/deps.py +0 -0
  253. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/dishwasher.py +0 -0
  254. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/doctor.py +0 -0
  255. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/ethanol.py +0 -0
  256. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/freezer.py +0 -0
  257. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/fusebox.py +0 -0
  258. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/fusebox_cli.py +0 -0
  259. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/gpus.py +0 -0
  260. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/launcher.py +0 -0
  261. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/net.py +0 -0
  262. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/nettrust.py +0 -0
  263. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/old_fridge.py +0 -0
  264. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/outage.py +0 -0
  265. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/pascal.py +0 -0
  266. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/pathfix.py +0 -0
  267. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/protect.py +0 -0
  268. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/release.py +0 -0
  269. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/torch_compat.py +0 -0
  270. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/ups.py +0 -0
  271. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/utils.py +0 -0
  272. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/system/vram.py +0 -0
  273. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/__init__.py +0 -0
  274. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/app.py +0 -0
  275. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/audit.py +0 -0
  276. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/auth.py +0 -0
  277. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/authhistory.py +0 -0
  278. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/backup.py +0 -0
  279. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/billing.py +0 -0
  280. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/billingkeys.py +0 -0
  281. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/bootstrap.py +0 -0
  282. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/config.py +0 -0
  283. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/cost.py +0 -0
  284. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/data/model_registry.example.json +0 -0
  285. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/data/routing_policies.example.json +0 -0
  286. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/db.py +0 -0
  287. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/deploy.py +0 -0
  288. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/deps.py +0 -0
  289. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/errors.py +0 -0
  290. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/events.py +0 -0
  291. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/jobs.py +0 -0
  292. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/keys.py +0 -0
  293. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/launchscript_cli.py +0 -0
  294. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modelindex.py +0 -0
  295. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modelindex_cli.py +0 -0
  296. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/modules.py +0 -0
  297. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/mtls.py +0 -0
  298. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/netpolicy.py +0 -0
  299. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/ratelimit.py +0 -0
  300. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/registry.py +0 -0
  301. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/__init__.py +0 -0
  302. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/audit.py +0 -0
  303. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/auth.py +0 -0
  304. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/authundo.py +0 -0
  305. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/backup.py +0 -0
  306. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/billing.py +0 -0
  307. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/bridge.py +0 -0
  308. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/config.py +0 -0
  309. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/events.py +0 -0
  310. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/health.py +0 -0
  311. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/hyperlink.py +0 -0
  312. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/inference.py +0 -0
  313. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/jobs.py +0 -0
  314. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/keys.py +0 -0
  315. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/models.py +0 -0
  316. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/modules.py +0 -0
  317. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/security.py +0 -0
  318. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/servers.py +0 -0
  319. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/training.py +0 -0
  320. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routers/usage.py +0 -0
  321. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/routing.py +0 -0
  322. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/schemas.py +0 -0
  323. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/security.py +0 -0
  324. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/servers.py +0 -0
  325. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/storage.py +0 -0
  326. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/training_cli.py +0 -0
  327. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/transport.py +0 -0
  328. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/usage.py +0 -0
  329. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1api/version.py +0 -0
  330. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/__init__.py +0 -0
  331. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/client.py +0 -0
  332. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/errors.py +0 -0
  333. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/models.py +0 -0
  334. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/t1sdk/transport.py +0 -0
  335. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/__init__.py +0 -0
  336. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/bell.py +0 -0
  337. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/coffee_maker.py +0 -0
  338. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/smoke_alarm.py +0 -0
  339. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/spinner.py +0 -0
  340. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/timing/timer.py +0 -0
  341. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/__init__.py +0 -0
  342. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/abbicus.py +0 -0
  343. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/apron.py +0 -0
  344. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/brewer.py +0 -0
  345. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/cake_pan.py +0 -0
  346. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/camouflage.py +0 -0
  347. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/compute_framework.py +0 -0
  348. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/deep_fryer.py +0 -0
  349. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/fizzle.py +0 -0
  350. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/instant_pot.py +0 -0
  351. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/lazy_suzan.py +0 -0
  352. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/monitor.py +0 -0
  353. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/mtp.py +0 -0
  354. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/recipe_book.py +0 -0
  355. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/smoker.py +0 -0
  356. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/training/train.py +0 -0
  357. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/tsconfig.json +0 -0
  358. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/__init__.py +0 -0
  359. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/cli.py +0 -0
  360. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/client.py +0 -0
  361. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/diagnose.py +0 -0
  362. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/discovery.py +0 -0
  363. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/local_config.py +0 -0
  364. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/smoke.py +0 -0
  365. {hypernix-0.72.4 → hypernix-0.72.4.post3}/src/hypernix/waiter/tui.py +0 -0
  366. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/shell_support.py +0 -0
  367. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_alarms_and_presets.py +0 -0
  368. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_arch_mapping.py +0 -0
  369. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_assistant.py +0 -0
  370. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_autofix_scripts.py +0 -0
  371. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_billing_keys.py +0 -0
  372. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_bootstrap_key.py +0 -0
  373. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_brewer_adapter.py +0 -0
  374. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ci_integration_jobs.py +0 -0
  375. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_cli_integration.py +0 -0
  376. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_cli_json_output.py +0 -0
  377. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_coverage_beef.py +0 -0
  378. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_deps_and_windows.py +0 -0
  379. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_dflash2.py +0 -0
  380. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ethanol.py +0 -0
  381. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fetcher.py +0 -0
  382. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_freezer.py +0 -0
  383. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fridges.py +0 -0
  384. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_fusebox.py +0 -0
  385. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gather.py +0 -0
  386. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gguf_inference.py +0 -0
  387. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gkey_key_versions.py +0 -0
  388. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gpu_migration.py +0 -0
  389. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_gpus.py +0 -0
  390. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnx_device_placement.py +0 -0
  391. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnx_devices.py +0 -0
  392. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hnxrun.py +0 -0
  393. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyped_pro_bridge_cancel.py +0 -0
  394. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyped_pro_t1api.py +0 -0
  395. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyperlink_discovery.py +0 -0
  396. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyperlink_reachability.py +0 -0
  397. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hypernix_t1_service.py +0 -0
  398. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_field_reports.py +0 -0
  399. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_headers.py +0 -0
  400. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_hyprslug_recipes.py +0 -0
  401. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_imatrix.py +0 -0
  402. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_inference_endpoints.py +0 -0
  403. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_install_pin.py +0 -0
  404. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_install_script.py +0 -0
  405. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ios_appicon.py +0 -0
  406. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ios_version_wiring.py +0 -0
  407. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_kitchen_v044.py +0 -0
  408. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_kitchen_v045.py +0 -0
  409. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_launch_script.py +0 -0
  410. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lazy_suzan.py +0 -0
  411. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lint_regressions.py +0 -0
  412. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_llama_quants.py +0 -0
  413. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_low_bit_types.py +0 -0
  414. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_lunchbox.py +0 -0
  415. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_map.py +0 -0
  416. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_model_registry_discovery.py +0 -0
  417. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_module_layout.py +0 -0
  418. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_neo_oven.py +0 -0
  419. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_neo_oven_generation.py +0 -0
  420. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_nettrust.py +0 -0
  421. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_new_archs_v035.py +0 -0
  422. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_nix_fallback.py +0 -0
  423. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_old_oven.py +0 -0
  424. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pathfix.py +0 -0
  425. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v048.py +0 -0
  426. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v3.py +0 -0
  427. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_pressure_cooker_v6.py +0 -0
  428. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_quantize_v0703.py +0 -0
  429. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ranges.py +0 -0
  430. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_shakers_and_torchcompat.py +0 -0
  431. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_snapshot_roundtrip.py +0 -0
  432. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_sspkid_and_key_config.py +0 -0
  433. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_studio_core.py +0 -0
  434. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_subbit_quantization.py +0 -0
  435. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_model_index.py +0 -0
  436. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_8_1_1.py +0 -0
  437. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_core.py +0 -0
  438. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1_v1_0_26_http.py +0 -0
  439. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_auth.py +0 -0
  440. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_core.py +0 -0
  441. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_http.py +0 -0
  442. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta3_security.py +0 -0
  443. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_beta4_usage_report.py +0 -0
  444. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_billing.py +0 -0
  445. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_core.py +0 -0
  446. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_events.py +0 -0
  447. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_example_scripts.py +0 -0
  448. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_http.py +0 -0
  449. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_http_beta2.py +0 -0
  450. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_jobs.py +0 -0
  451. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_modules.py +0 -0
  452. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_routing.py +0 -0
  453. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_security.py +0 -0
  454. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t1api_servers.py +0 -0
  455. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_t2s_errors.py +0 -0
  456. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tool_consent_gate.py +0 -0
  457. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_training_admin.py +0 -0
  458. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_trusted_network.py +0 -0
  459. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tupperware.py +0 -0
  460. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tvtop_plus_plus_comprehensive.py +0 -0
  461. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_tvtoppro.py +0 -0
  462. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_ups.py +0 -0
  463. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v031_chat_and_archs.py +0 -0
  464. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v047_deep_fryer_cake_pan_presets.py +0 -0
  465. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v050.py +0 -0
  466. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051.py +0 -0
  467. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_1.py +0 -0
  468. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_3.py +0 -0
  469. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v051_4.py +0 -0
  470. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v052_5.py +0 -0
  471. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v052_6.py +0 -0
  472. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v060.py +0 -0
  473. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_1.py +0 -0
  474. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_2.py +0 -0
  475. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v061_b1.py +0 -0
  476. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0703_additional.py +0 -0
  477. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704_features.py +0 -0
  478. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704_tvtop_plus_plus.py +0 -0
  479. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704b11_features.py +0 -0
  480. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0704b12_cctvtop.py +0 -0
  481. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0705_all.py +0 -0
  482. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0710_gatekeeper_keymaster.py +0 -0
  483. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0711_border_fix.py +0 -0
  484. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0712_hyped_countertop.py +0 -0
  485. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_config_provider_keys.py +0 -0
  486. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_cpu_presets.py +0 -0
  487. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_bridge.py +0 -0
  488. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_core.py +0 -0
  489. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_launcher.py +0 -0
  490. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_hyped_pro_tools.py +0 -0
  491. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0714_multilama.py +0 -0
  492. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_api_waiter.py +0 -0
  493. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_modules.py +0 -0
  494. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_v0721_t2_keys.py +0 -0
  495. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_vera.py +0 -0
  496. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_version_launcher.py +0 -0
  497. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_vram_optimizations.py +0 -0
  498. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_waiter.py +0 -0
  499. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_waiter_diagnose.py +0 -0
  500. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_wakeup.py +0 -0
  501. {hypernix-0.72.4 → hypernix-0.72.4.post3}/tests/test_website_mobile.py +0 -0
  502. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Abbicus.md +0 -0
  503. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Alarms.md +0 -0
  504. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Apron.md +0 -0
  505. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Architectures.md +0 -0
  506. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Bell.md +0 -0
  507. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Blender.md +0 -0
  508. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CLI.md +0 -0
  509. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CakePan.md +0 -0
  510. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Camouflage.md +0 -0
  511. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CoffeeMaker.md +0 -0
  512. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Convert.md +0 -0
  513. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Cookbook.md +0 -0
  514. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Countertop.md +0 -0
  515. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/CuttingBoard.md +0 -0
  516. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Dashboards.md +0 -0
  517. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/DeepFryer.md +0 -0
  518. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Devices.md +0 -0
  519. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Dflash2.md +0 -0
  520. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Download.md +0 -0
  521. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/EspressoMaker.md +0 -0
  522. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Flour.md +0 -0
  523. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/FoodProcessor.md +0 -0
  524. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Frameworks.md +0 -0
  525. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Freezer.md +0 -0
  526. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Fridges.md +0 -0
  527. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/FuseBox.md +0 -0
  528. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Gather.md +0 -0
  529. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HnxRun.md +0 -0
  530. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Home.md +0 -0
  531. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HuggingFace-Models.md +0 -0
  532. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyperLog.md +0 -0
  533. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyprSlug-Headers.md +0 -0
  534. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/HyprSlug.md +0 -0
  535. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Imatrix.md +0 -0
  536. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Kitchen.md +0 -0
  537. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/LowBit.md +0 -0
  538. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Lunchbox.md +0 -0
  539. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/MTP.md +0 -0
  540. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Menu.md +0 -0
  541. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Microwave.md +0 -0
  542. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/ModelIndex.md +0 -0
  543. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Optimizers.md +0 -0
  544. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Ovens.md +0 -0
  545. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pans.md +0 -0
  546. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pascal.md +0 -0
  547. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/PipelineMechanics.md +0 -0
  548. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V3.md +0 -0
  549. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V4.md +0 -0
  550. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V5.md +0 -0
  551. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Pressure-Cooker-V6.md +0 -0
  552. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Quantization.md +0 -0
  553. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Ranges.md +0 -0
  554. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/RecipeBook.md +0 -0
  555. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Roadmap.md +0 -0
  556. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/STML.md +0 -0
  557. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Scavenger.md +0 -0
  558. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Shakers.md +0 -0
  559. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Smoker.md +0 -0
  560. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/T1-API-Security-Checklist.md +0 -0
  561. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/T1-API.md +0 -0
  562. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Toaster.md +0 -0
  563. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Training.md +0 -0
  564. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Tupperware.md +0 -0
  565. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/TvTopPro.md +0 -0
  566. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/VRAM.md +0 -0
  567. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Vera.md +0 -0
  568. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Waiter-TUI.md +0 -0
  569. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/WakeUp.md +0 -0
  570. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Whisk.md +0 -0
  571. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/Workshop.md +0 -0
  572. {hypernix-0.72.4 → hypernix-0.72.4.post3}/wiki/macOS-legacy.md +0 -0
@@ -395,6 +395,107 @@ jobs:
395
395
  exit 1
396
396
  fi
397
397
 
398
+ # The patcher against a real llama.cpp, which is the only thing that
399
+ # would have caught what shipped broken: the fake tree in
400
+ # tests/test_ggml_hnx.py modelled one type_traits table, upstream has
401
+ # had two for a while, and every test passed while no real checkout
402
+ # compiled. A fake can only be as right as the person who wrote it.
403
+ #
404
+ # Separate job, and only ggml-base + ggml-cpu rather than all of
405
+ # llama.cpp: those two are where the registration lands, so they are
406
+ # where a bad patch fails, and stopping there is about two minutes
407
+ # instead of eight.
408
+ llamacpp:
409
+ name: patcher against real llama.cpp
410
+ needs: triage
411
+ if: needs.triage.outputs.narrow != 'true'
412
+ runs-on: ubuntu-latest
413
+ steps:
414
+ - uses: actions/checkout@v4
415
+ - uses: actions/setup-python@v5
416
+ with:
417
+ python-version: "3.12"
418
+
419
+ - name: Clone llama.cpp
420
+ run: git clone --depth 1 https://github.com/ggml-org/llama.cpp /tmp/llama.cpp
421
+
422
+ - name: Patch it
423
+ run: |
424
+ set -euo pipefail
425
+ python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp --check
426
+ python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp
427
+
428
+ - name: Build the parts the registration lands in
429
+ run: |
430
+ set -euo pipefail
431
+ cmake -S /tmp/llama.cpp -B /tmp/llama.cpp/build \
432
+ -DCMAKE_BUILD_TYPE=Release -DLLAMA_CURL=OFF -DGGML_CCACHE=OFF \
433
+ -DLLAMA_BUILD_TESTS=OFF -DLLAMA_BUILD_EXAMPLES=OFF \
434
+ -DLLAMA_BUILD_TOOLS=OFF
435
+ cmake --build /tmp/llama.cpp/build --target ggml-base ggml-cpu \
436
+ -j"$(nproc)"
437
+
438
+ # Compiling is not the same as registering. This asks the built
439
+ # ggml what it thinks the five types are, which is what a model
440
+ # loader will ask.
441
+ - name: Ask ggml about the types
442
+ run: |
443
+ set -euo pipefail
444
+ cat > /tmp/typecheck.c <<'EOF'
445
+ #include <stdio.h>
446
+ #include <string.h>
447
+ #include "ggml.h"
448
+ int main(void) {
449
+ struct { int id; const char *name; size_t size; } want[] = {
450
+ {200, "IQ0.9_L", 30}, {201, "IQ0.75_M", 26},
451
+ {202, "IQ0.5_XXXL", 18}, {203, "IQ0.25_UXL", 8},
452
+ {204, "INT1", 34},
453
+ };
454
+ int bad = 0;
455
+ for (unsigned i = 0; i < sizeof(want)/sizeof(want[0]); ++i) {
456
+ enum ggml_type t = (enum ggml_type) want[i].id;
457
+ const char *n = ggml_type_name(t);
458
+ int ok = n && !strcmp(n, want[i].name)
459
+ && ggml_type_size(t) == want[i].size
460
+ && ggml_blck_size(t) == 256 && ggml_is_quantized(t);
461
+ printf(" %-3d %-12s %s\n", want[i].id, n ? n : "(null)",
462
+ ok ? "ok" : "MISMATCH");
463
+ if (!ok) bad = 1;
464
+ }
465
+ if (strcmp(ggml_type_name(GGML_TYPE_Q4_0), "q4_0") != 0) {
466
+ printf(" upstream Q4_0 was disturbed\n");
467
+ bad = 1;
468
+ }
469
+ return bad;
470
+ }
471
+ EOF
472
+ cc -I/tmp/llama.cpp/ggml/include -o /tmp/typecheck /tmp/typecheck.c \
473
+ -L/tmp/llama.cpp/build/bin -lggml-base \
474
+ -Wl,-rpath,/tmp/llama.cpp/build/bin
475
+ /tmp/typecheck
476
+
477
+ # Studio's local engine, against the llama.cpp that is now here.
478
+ # The stub build is covered by ctest in the `native` job; this is
479
+ # the other configuration, and it is the one with a real API to
480
+ # drift against.
481
+ - name: Studio — compile the local engine against it
482
+ run: |
483
+ set -euo pipefail
484
+ c++ -std=c++17 -Wall -Wextra -Werror -DHNX_STUDIO_LOCAL_LLAMA \
485
+ -Idesktop/src -I/tmp/llama.cpp/include -I/tmp/llama.cpp/ggml/include \
486
+ -c desktop/src/LocalEngine.cpp -o /tmp/LocalEngine.o
487
+
488
+ - name: And revert cleanly
489
+ run: |
490
+ set -euo pipefail
491
+ python native/ggml-hnx/tools/patch_llamacpp.py /tmp/llama.cpp --revert
492
+ cd /tmp/llama.cpp
493
+ if [ -n "$(git status --porcelain)" ]; then
494
+ echo "::error::--revert did not restore the tree"
495
+ git status --porcelain
496
+ exit 1
497
+ fi
498
+
398
499
  # The CUDA kernels, compiled. Separate from `native` on purpose: the
399
500
  # toolkit is ~2 GB and `native` runs on every full pass, so folding it
400
501
  # in would add minutes to every run for a file that changes rarely.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypernix
3
- Version: 0.72.4
3
+ Version: 0.72.4.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/trail-b1az3r/hypernix-pip
6
6
  Author: HyperNix contributors
@@ -78,7 +78,7 @@ Dynamic: license-file
78
78
  </p>
79
79
 
80
80
  <p align="center">
81
- <img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.3.post8-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
81
+ <img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.4.post1-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
82
82
  <img alt="Python" src="https://img.shields.io/badge/Python-3.10--3.14-00c9ff?style=for-the-badge&logo=python&logoColor=white" />
83
83
  <img alt="License" src="https://img.shields.io/badge/License-HOS%20/%20LLU-00c853?style=for-the-badge" />
84
84
  </p>
@@ -4,7 +4,7 @@
4
4
  </p>
5
5
 
6
6
  <p align="center">
7
- <img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.3.post8-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
7
+ <img alt="PyPI" src="https://img.shields.io/badge/PyPI-v0.72.4.post1-ff2d55?style=for-the-badge&logo=pypi&logoColor=white" />
8
8
  <img alt="Python" src="https://img.shields.io/badge/Python-3.10--3.14-00c9ff?style=for-the-badge&logo=python&logoColor=white" />
9
9
  <img alt="License" src="https://img.shields.io/badge/License-HOS%20/%20LLU-00c853?style=for-the-badge" />
10
10
  </p>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hypernix"
7
- version = "0.72.4"
7
+ version = "0.72.4.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.4
3
+ version = 0.72.4.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.4"
66
+ __version__ = "0.72.4.post3"
67
67
  DEFAULT_REPO_ID = "ray0rf1re/hyper-Nix.2"
68
68
  DEFAULT_MODEL = "qwen3.5-4b" # New default model
69
69
 
@@ -426,6 +426,7 @@ tests/test_shakers_and_torchcompat.py
426
426
  tests/test_snapshot_roundtrip.py
427
427
  tests/test_sspkid_and_key_config.py
428
428
  tests/test_studio_core.py
429
+ tests/test_studio_local.py
429
430
  tests/test_subbit_quantization.py
430
431
  tests/test_t1_model_index.py
431
432
  tests/test_t1_v1_0_26_8_1_1.py
@@ -210,16 +210,33 @@ def _fake_llamacpp(root: Path) -> Path:
210
210
  Deliberately not a real clone: the point is to test the patcher's
211
211
  edits, and a 200 MB download to do that would mean this test only
212
212
  ever ran somewhere with a network.
213
+
214
+ It has to be shaped like the *current* upstream, though, and the
215
+ first version of it was not. It modelled one ``type_traits`` table
216
+ holding every field, which is how ggml looked once and has not
217
+ looked for a while: upstream split it, leaving the format
218
+ description (``type_name``, ``blck_size``, ``to_float``) in
219
+ ``ggml.c`` and moving everything the CPU computes with
220
+ (``from_float``, ``vec_dot``, ``vec_dot_type``, ``nrows``) into
221
+ ``ggml_type_traits_cpu`` in ``ggml-cpu/ggml-cpu.c``. A fake with one
222
+ table let the patcher write ``.vec_dot`` into ``ggml.c`` and every
223
+ test here pass, while a real build failed with "no member named
224
+ vec_dot" and "ggml_vec_dot_t undeclared".
225
+
226
+ ``GGML_TYPE_COUNT`` is likewise a literal here, because it is one
227
+ upstream -- not a value that falls out of the enum's length. Adding
228
+ members before it does not grow it, so the patcher has to rewrite
229
+ it, and a fake that let it grow on its own would hide that.
213
230
  """
214
231
  (root / "ggml" / "include").mkdir(parents=True)
215
- (root / "ggml" / "src").mkdir(parents=True)
232
+ (root / "ggml" / "src" / "ggml-cpu").mkdir(parents=True)
216
233
  (root / "src").mkdir(parents=True)
217
234
 
218
235
  (root / "ggml" / "include" / "ggml.h").write_text(
219
236
  "enum ggml_type {\n"
220
237
  " GGML_TYPE_F32 = 0,\n"
221
238
  " GGML_TYPE_Q4_0 = 2,\n"
222
- " GGML_TYPE_COUNT = 39,\n"
239
+ " GGML_TYPE_COUNT = 43,\n"
223
240
  "};\n",
224
241
  encoding="utf-8",
225
242
  )
@@ -231,12 +248,32 @@ def _fake_llamacpp(root: Path) -> Path:
231
248
  "};\n",
232
249
  encoding="utf-8",
233
250
  )
251
+ (root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c").write_text(
252
+ '#include "ggml-impl.h"\n'
253
+ "\n"
254
+ "static const struct ggml_type_traits_cpu "
255
+ "type_traits_cpu[GGML_TYPE_COUNT] = {\n"
256
+ " [GGML_TYPE_F32] = { .vec_dot_type = GGML_TYPE_F32 },\n"
257
+ "};\n",
258
+ encoding="utf-8",
259
+ )
234
260
  (root / "ggml" / "src" / "CMakeLists.txt").write_text(
235
261
  "add_library(ggml\n ggml.c\n ggml-alloc.c\n)\n", encoding="utf-8"
236
262
  )
237
263
  return root
238
264
 
239
265
 
266
+ def _patcher():
267
+ """The patcher module, imported from tools/ without installing it."""
268
+ sys.path.insert(0, str(TOOLS))
269
+ try:
270
+ import patch_llamacpp
271
+
272
+ return patch_llamacpp
273
+ finally:
274
+ sys.path.pop(0)
275
+
276
+
240
277
  class TestThePatcher:
241
278
  def test_check_reports_a_clean_tree_as_ready(self, tmp_path, capsys):
242
279
  sys.path.insert(0, str(TOOLS))
@@ -283,6 +320,88 @@ class TestThePatcher:
283
320
  after = (root / "ggml" / "src" / "ggml.c").read_text(encoding="utf-8")
284
321
  assert after == before
285
322
 
323
+ def test_the_type_count_is_raised_past_the_new_ids(self, tmp_path):
324
+ """The bug that made a real build fail while every test passed.
325
+
326
+ Upstream pins ``GGML_TYPE_COUNT`` to a literal instead of letting
327
+ it fall out of the enum, and it sizes both trait tables. Insert
328
+ ids at 200 without raising it and ``[GGML_TYPE_HNX_IQ0_9]`` is
329
+ initialising element 200 of a 43-element array -- "array index in
330
+ initializer exceeds array bounds", before the compiler even gets
331
+ to the interesting error.
332
+ """
333
+ patcher = _patcher()
334
+ root = _fake_llamacpp(tmp_path / "llama.cpp")
335
+ assert patcher.main([str(root)]) == 0
336
+
337
+ header = (root / "ggml" / "include" / "ggml.h").read_text(encoding="utf-8")
338
+ # The declaring line, not the "was:" comment that records the
339
+ # old one -- a plain search finds the comment first, which is
340
+ # how the first version of this test managed to fail on a
341
+ # correctly patched tree.
342
+ declarations = [
343
+ line for line in header.splitlines()
344
+ if "GGML_TYPE_COUNT" in line and not line.lstrip().startswith("//")
345
+ ]
346
+
347
+ assert len(declarations) == 1, declarations
348
+ count = re.search(r"GGML_TYPE_COUNT\s*=\s*(\d+)", declarations[0])
349
+ assert count is not None
350
+ assert int(count.group(1)) == patcher.HNX_TYPE_COUNT
351
+ assert int(count.group(1)) > 204, "the highest HyperNix id"
352
+
353
+ def test_vec_dot_goes_in_the_cpu_table_not_the_format_one(self, tmp_path):
354
+ """The other half of the same failure.
355
+
356
+ ``ggml_type_traits`` in ggml.c has no ``vec_dot`` member and
357
+ cannot see ``ggml_vec_dot_t`` at all -- both moved to
358
+ ``ggml_type_traits_cpu`` in ggml-cpu/ggml-cpu.c. Writing them
359
+ into the wrong table is not a warning, it is four errors per
360
+ type.
361
+ """
362
+ patcher = _patcher()
363
+ root = _fake_llamacpp(tmp_path / "llama.cpp")
364
+ assert patcher.main([str(root)]) == 0
365
+
366
+ base = (root / "ggml" / "src" / "ggml.c").read_text(encoding="utf-8")
367
+ cpu = (root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c").read_text(
368
+ encoding="utf-8")
369
+
370
+ assert ".vec_dot" not in base, "vec_dot must not go in ggml.c"
371
+ assert "ggml_vec_dot_t" not in base
372
+ assert ".to_float" in base, "but to_float belongs there"
373
+
374
+ assert ".vec_dot" in cpu
375
+ assert ".vec_dot_type" in cpu
376
+ assert ".to_float" not in cpu, "to_float must not go in the cpu table"
377
+ for suffix in ("iq0_9", "iq0_75", "iq0_5", "iq0_25", "int1"):
378
+ assert f"hnx_ggml_vec_dot_{suffix}" in cpu
379
+ assert f"hnx_ggml_to_float_{suffix}" in base
380
+
381
+ def test_both_files_get_the_shim_include(self, tmp_path):
382
+ """Each table names functions the other file does not declare."""
383
+ patcher = _patcher()
384
+ root = _fake_llamacpp(tmp_path / "llama.cpp")
385
+ assert patcher.main([str(root)]) == 0
386
+
387
+ for path in (root / "ggml" / "src" / "ggml.c",
388
+ root / "ggml" / "src" / "ggml-cpu" / "ggml-cpu.c"):
389
+ assert '#include "ggml-hnx-shim.h"' in path.read_text(encoding="utf-8")
390
+
391
+ def test_reverting_the_count_restores_upstreams_value(self, tmp_path):
392
+ """Not a guess at what it used to be: the original line is
393
+ carried in the marker comment, so a checkout whose count is 43
394
+ goes back to 43 and one at 51 goes back to 51."""
395
+ patcher = _patcher()
396
+ root = _fake_llamacpp(tmp_path / "llama.cpp")
397
+ header = root / "ggml" / "include" / "ggml.h"
398
+ before = header.read_text(encoding="utf-8")
399
+
400
+ assert patcher.main([str(root)]) == 0
401
+ assert patcher.main([str(root), "--revert"]) == 0
402
+
403
+ assert header.read_text(encoding="utf-8") == before
404
+
286
405
  def test_a_moved_anchor_changes_nothing(self, tmp_path, capsys):
287
406
  """The failure mode a .patch file has and this must not: a
288
407
  half-applied patch that still compiles. Everything is read and
@@ -348,6 +467,65 @@ class TestThePatcher:
348
467
  patch_llamacpp.main([str(tmp_path)])
349
468
 
350
469
 
470
+ class TestTheBuildScript:
471
+ """`build.sh` is the thing people actually run.
472
+
473
+ It pins a llama.cpp revision, and a pin is a promise that the
474
+ revision builds. b4585 stopped keeping that promise: its
475
+ src/llama-mmap.h uses uint32_t without including <cstdint>, which
476
+ worked only while libstdc++ handed <cstdint> out behind <vector> and
477
+ <memory>. GCC 15 and 16 stopped, and `./build.sh` on a current
478
+ toolchain died with "'uint32_t' does not name a type" -- in a file
479
+ the patcher never touches.
480
+ """
481
+
482
+ SCRIPT = NATIVE / "build.sh"
483
+
484
+ def test_the_pin_is_not_the_one_that_stopped_building(self):
485
+ text = self.SCRIPT.read_text(encoding="utf-8")
486
+ pin = re.search(r'LLAMA_REF="\$\{LLAMA_REF:-([^}"]+)\}"', text)
487
+
488
+ assert pin is not None, "LLAMA_REF is no longer set the way this reads"
489
+ assert pin.group(1) != "b4585", (
490
+ "b4585 does not compile on GCC 15+; see the comment above the pin"
491
+ )
492
+
493
+ def test_it_forces_cstdint_ahead_of_every_translation_unit(self):
494
+ """The durable half. Moving the pin fixes the one file upstream
495
+ fixed; hundreds more still get their fixed-width integer types
496
+ from somebody else's header, so the next compiler to tighten its
497
+ transitive includes breaks a different one. `-include` costs
498
+ nothing and edits no upstream source.
499
+ """
500
+ text = self.SCRIPT.read_text(encoding="utf-8")
501
+
502
+ assert "-include cstdint" in text
503
+ assert "-include stdint.h" in text
504
+ assert "CMAKE_CXX_FLAGS" in text and "CMAKE_C_FLAGS" in text
505
+
506
+ def test_forcing_it_can_be_turned_off(self):
507
+ """MSVC spells it /FI. A flag no compiler has to accept should
508
+ not be the thing that stops a build."""
509
+ text = self.SCRIPT.read_text(encoding="utf-8")
510
+
511
+ assert "HNX_FORCE_STDINT" in text
512
+
513
+ def test_an_existing_checkout_is_reported_not_silently_reused(self):
514
+ """How somebody pulls a patcher fix, re-runs this, and rebuilds
515
+ the same stale tree: the clone step is skipped when the
516
+ directory is there, and nothing said so."""
517
+ text = self.SCRIPT.read_text(encoding="utf-8")
518
+
519
+ assert "using the checkout already at" in text
520
+ assert "this script pins" in text
521
+
522
+ def test_it_is_still_valid_shell(self):
523
+ result = subprocess.run(["bash", "-n", str(self.SCRIPT)],
524
+ capture_output=True, text=True, check=False)
525
+
526
+ assert result.returncode == 0, result.stderr
527
+
528
+
351
529
  class TestTheCudaKernels:
352
530
  """Beta 1 shipped these types CPU-only. These are the GPU kernels.
353
531
 
@@ -0,0 +1,253 @@
1
+ """HyperNix Studio running a model on this machine, with no server.
2
+
3
+ Studio began as a client: chat went over HTTP to a HyperNix server, and
4
+ a laptop with a GGUF sitting on it still needed something running
5
+ somewhere. This covers the other path.
6
+
7
+ Three things get checked here that the C++ suites cannot check alone:
8
+
9
+ **The build without llama.cpp is the one most people get**, and it has
10
+ to be honest rather than broken. `local_engine_test` is compiled and run
11
+ in that configuration on every pass.
12
+
13
+ **The GGUF parser's input is hostile.** A model file is something
14
+ somebody downloaded, and every length in its header is a 64-bit number
15
+ the parser would otherwise be told to allocate. `model_catalogue_test`
16
+ builds headers that lie and checks each one is refused.
17
+
18
+ **The tool boundary does not move.** A local model gets exactly the
19
+ reach a remote one had -- file operations inside the workspace, each
20
+ approved -- so the source scan for process spawning covers the new files
21
+ too, and the C++ that runs the model must not have acquired a way to run
22
+ anything else.
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import shutil
27
+ import subprocess
28
+ import sys
29
+ from pathlib import Path
30
+
31
+ import pytest
32
+
33
+ DESKTOP = Path(__file__).resolve().parent.parent / "desktop"
34
+ SRC = DESKTOP / "src"
35
+ TESTS = DESKTOP / "tests"
36
+ QML = DESKTOP / "qml"
37
+
38
+ _POSIX_ONLY = pytest.mark.skipif(
39
+ sys.platform == "win32",
40
+ reason="Studio ships on Linux; see tests/test_studio_core.py for why the "
41
+ "compile-and-run halves are POSIX-only.",
42
+ )
43
+
44
+
45
+ def _compiler() -> str | None:
46
+ for name in ("c++", "g++", "clang++"):
47
+ found = shutil.which(name)
48
+ if found:
49
+ return found
50
+ return None
51
+
52
+
53
+ def _build(name: str, sources: list[str], tmp_path: Path) -> Path:
54
+ compiler = _compiler()
55
+ if compiler is None:
56
+ pytest.skip("no C++ compiler on this machine")
57
+ out = tmp_path / name
58
+ result = subprocess.run(
59
+ [compiler, "-std=c++17", "-O1", "-Wall", "-Wextra", "-Werror",
60
+ str(TESTS / f"{name}.cpp"),
61
+ *[str(SRC / s) for s in sources],
62
+ "-pthread", "-o", str(out)],
63
+ capture_output=True, text=True, check=False,
64
+ )
65
+ if result.returncode != 0:
66
+ pytest.fail(f"{name} does not compile cleanly:\n{result.stderr}")
67
+ return out
68
+
69
+
70
+ @_POSIX_ONLY
71
+ class TestTheCatalogue:
72
+ """Reading a GGUF header without loading the model."""
73
+
74
+ def test_it_compiles_and_every_check_passes(self, tmp_path):
75
+ binary = _build("model_catalogue_test", ["ModelCatalogue.cpp"], tmp_path)
76
+ result = subprocess.run([str(binary)], capture_output=True, text=True,
77
+ check=False)
78
+
79
+ assert result.returncode == 0, result.stdout + result.stderr
80
+ assert "0 failures" in result.stdout
81
+
82
+ def test_it_needs_neither_qt_nor_llama_cpp(self):
83
+ """The point of it being separate.
84
+
85
+ A person browsing models on a machine with no llama.cpp should
86
+ still be told what is on the disk, and told that an IQ0.5_XXXL
87
+ file is an IQ0.5_XXXL file -- the build that cannot run it is
88
+ exactly the build where a bare "type 202" is least useful.
89
+ """
90
+ source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
91
+ header = (SRC / "ModelCatalogue.h").read_text(encoding="utf-8")
92
+
93
+ for banned in ("<QtCore", "<QString", "llama.h", "ggml.h", "QObject"):
94
+ assert banned not in source, f"{banned} in ModelCatalogue.cpp"
95
+ assert banned not in header, f"{banned} in ModelCatalogue.h"
96
+
97
+ def test_it_names_the_hypernix_types_itself(self):
98
+ """Not by asking ggml, which may not be linked in."""
99
+ source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
100
+
101
+ for name in ("IQ0.9_L", "IQ0.75_M", "IQ0.5_XXXL", "IQ0.25_UXL", "INT1"):
102
+ assert f'"{name}"' in source, name
103
+
104
+ def test_every_header_number_is_bounded_before_it_is_used(self):
105
+ """The property the hostile-header tests exercise, asserted from
106
+ the other side: the constants that bound it are actually there.
107
+
108
+ A parser that reserved on the strength of a length in the file
109
+ could be made to allocate 16 exabytes by a malformed download.
110
+ """
111
+ source = (SRC / "ModelCatalogue.cpp").read_text(encoding="utf-8")
112
+
113
+ for limit in ("kMaxHeaderBytes", "kMaxTensors", "kMaxKeys",
114
+ "kMaxStringBytes", "kMaxArrayItems"):
115
+ assert limit in source, limit
116
+ # And the string read is checked against what is *left* of the
117
+ # buffer, not only against a constant -- "longer than this file"
118
+ # and "2^63" are the same mistake.
119
+ assert "size_ - pos_" in source
120
+
121
+
122
+ @_POSIX_ONLY
123
+ class TestTheEngineWithoutLlamaCpp:
124
+ """The build nearly every machine gets."""
125
+
126
+ def test_it_compiles_and_the_stub_is_honest(self, tmp_path):
127
+ binary = _build("local_engine_test",
128
+ ["LocalEngine.cpp", "ModelCatalogue.cpp"], tmp_path)
129
+ result = subprocess.run([str(binary)], capture_output=True, text=True,
130
+ check=False)
131
+
132
+ assert result.returncode == 0, result.stdout + result.stderr
133
+ assert "0 failures" in result.stdout
134
+ assert "local inference is OFF" in result.stdout
135
+
136
+ def test_the_reason_says_what_to_do(self):
137
+ """"Not available" on its own sends someone to the issue tracker."""
138
+ source = (SRC / "LocalEngine.cpp").read_text(encoding="utf-8")
139
+
140
+ assert "STUDIO_LOCAL_LLAMA" in source
141
+ assert "LLAMA_ROOT" in source
142
+
143
+ def test_local_inference_is_off_by_default(self):
144
+ """The server path does not need llama.cpp. Making the harder
145
+ dependency mandatory would stop Studio building for everyone who
146
+ only wants to connect to a HyperNix box."""
147
+ cmake = (DESKTOP / "CMakeLists.txt").read_text(encoding="utf-8")
148
+
149
+ assert 'option(STUDIO_LOCAL_LLAMA' in cmake
150
+ block = cmake.split("option(STUDIO_LOCAL_LLAMA", 1)[1][:200]
151
+ assert "OFF)" in block
152
+
153
+
154
+ class TestTheToolBoundaryDidNotMove:
155
+ """A local model gets no more reach than a remote one had."""
156
+
157
+ def test_the_new_files_cannot_run_a_command(self):
158
+ """test_studio_core.py sweeps src/*.cpp already; this says out
159
+ loud that the files added for local models are in that sweep,
160
+ so removing them from it would fail here rather than silently."""
161
+ forbidden = ("system(", "popen(", "execv", "execl", "execp", "fork(",
162
+ "QProcess", "posix_spawn")
163
+ for name in ("LocalEngine.cpp", "LocalEngine.h", "ModelCatalogue.cpp",
164
+ "ModelCatalogue.h", "LocalSession.cpp", "LocalSession.h"):
165
+ text = (SRC / name).read_text(encoding="utf-8")
166
+ for token in forbidden:
167
+ assert token not in text, f"{name} contains {token!r}"
168
+
169
+ def test_running_a_model_locally_still_goes_through_the_policy(self):
170
+ """The approval flow is untouched: onToolCall and runApproved are
171
+ the only route to a mutating tool, whichever end the model is
172
+ at. A second path for local models would be a second place to
173
+ get the boundary wrong."""
174
+ bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
175
+
176
+ assert bridge.count("runner_->policy().Decide(") == 1
177
+ assert "sendToLocal" in bridge
178
+
179
+
180
+ class TestTheBridgeRoutes:
181
+ def test_send_dispatches_on_the_source(self):
182
+ bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
183
+
184
+ assert "void StudioBridge::send(" in bridge
185
+ assert "sendToLocal(text)" in bridge
186
+ assert "sendToServer(text)" in bridge
187
+
188
+ def test_the_engine_runs_off_the_gui_thread(self):
189
+ """Loading a 7B model takes seconds and generating takes as long
190
+ as it takes. On the GUI thread the window stops repainting and
191
+ the desktop offers to kill it."""
192
+ session = (SRC / "LocalSession.cpp").read_text(encoding="utf-8")
193
+
194
+ assert "moveToThread" in session
195
+ assert "Qt::QueuedConnection" in session
196
+
197
+ def test_cancel_is_not_queued(self):
198
+ """The one call that must not be. The worker thread is *inside*
199
+ Generate, so a queued cancel would sit in its event queue until
200
+ the generation it is meant to stop had finished."""
201
+ session = (SRC / "LocalSession.cpp").read_text(encoding="utf-8")
202
+ body = session.split("void LocalSession::cancel()", 1)[1][:400]
203
+
204
+ assert "QueuedConnection" not in body
205
+ assert "worker_->cancel()" in body
206
+
207
+ def test_the_streaming_index_is_bounds_checked(self):
208
+ """The conversation can be cleared while a generation is in
209
+ flight. Writing past the end of the list would be the last thing
210
+ this process did."""
211
+ bridge = (SRC / "StudioBridge.cpp").read_text(encoding="utf-8")
212
+
213
+ assert "streamingIndex_ >= messages_.size()" in bridge
214
+ assert "streamingIndex_ = -1;" in bridge
215
+
216
+
217
+ class TestTheUiDoesNotAskForAServerItDoesNotNeed:
218
+ def test_the_composer_gates_on_ready_not_connected(self):
219
+ """`connected` is false forever in local mode. Gating the input
220
+ on it left the composer dead with a model loaded and running."""
221
+ chat = (QML / "ChatView.qml").read_text(encoding="utf-8")
222
+
223
+ assert "studio.ready && !studio.busy" in chat
224
+ assert "enabled: studio.connected && !studio.busy" not in chat
225
+
226
+ def test_the_connect_form_is_hidden_in_local_mode(self):
227
+ sidebar = (QML / "Sidebar.qml").read_text(encoding="utf-8")
228
+
229
+ assert 'studio.source !== "local"' in sidebar
230
+
231
+ def test_a_generating_model_can_be_stopped(self):
232
+ """A long answer on a slow machine is a minute of watching, and
233
+ closing the window should not be the way out."""
234
+ chat = (QML / "ChatView.qml").read_text(encoding="utf-8")
235
+
236
+ assert "studio.stopGenerating()" in chat
237
+
238
+ def test_the_models_view_reads_both_shapes(self):
239
+ """A server model calls it displayName and a local one calls it
240
+ name. An undefined binding here does not throw -- it leaves the
241
+ property at its *previous* value, which is how a list showed the
242
+ last model's name against this model's row."""
243
+ models = (QML / "ModelsView.qml").read_text(encoding="utf-8")
244
+
245
+ assert "modelData.displayName !== undefined" in models
246
+ assert "studio.localModels" in models
247
+
248
+ def test_an_unreadable_model_is_shown_not_hidden(self):
249
+ """A file that is there and broken is something you want to see."""
250
+ models = (QML / "ModelsView.qml").read_text(encoding="utf-8")
251
+
252
+ assert "modelData.ok === false" in models
253
+ assert "unreadable" in models