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.
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/PKG-INFO +1 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/run_local.sh +12 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/run_tailscale.sh +60 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/pyproject.toml +1 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/setup.cfg +1 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/__init__.py +1 -1
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/gkey_cli.py +294 -6
- hypernix-0.72.2.post3/src/hypernix/security/keyversions.py +158 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/t2keys.py +51 -2
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/cli.py +264 -4
- hypernix-0.72.2.post3/src/hypernix/waiter/diagnose.py +276 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix.egg-info/SOURCES.txt +5 -0
- hypernix-0.72.2.post3/tests/test_gkey_key_versions.py +396 -0
- hypernix-0.72.2.post3/tests/test_t1api_example_scripts.py +294 -0
- hypernix-0.72.2.post3/tests/test_waiter_diagnose.py +332 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Changelog.md +162 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Release-Timeline.md +20 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/T1-API.md +46 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Waiter-TUI.md +59 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/build.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/ci.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/deploy-docs.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/ios.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/public-release.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/release.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/.github/workflows/update-json-stats.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/LICENSE +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/MANIFEST.in +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/README.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd-removebg-preview.png +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo/Gemini_Generated_Image_nxfdm1nxfdm1nxfd.png +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo.png +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/assets/logo1.png +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/curriculum_eval_v0_70_4.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/custom_arch.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/hypernix_run.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/quickstart.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/resilient_finetune_v0_70_4.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/run_hypernix.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/.env.example +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/API-EXAMPLES.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/Dockerfile +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/README.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/config/.gitkeep +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/docker-compose.yml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/hypernix-t1api.service +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/nginx.conf +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/t1api/openapi.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train hypernix 1 5 gtx1080.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/examples/upload_to_hub.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/pytest.ini +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/ruff.toml +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/README.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/apply_hypernix_fixes.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-B +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-E +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix-F +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/autofix_scope.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v5.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v5s.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/benchmark_v6.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/install_deps.sh +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/install_macos_legacy.sh +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/measure_optimizer_memory.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/quantize_i7_7660u.sh +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/t1api_examples.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/scripts/update_json_stats.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/setup.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/__main__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/bridge/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/bridge/lmstudio.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/cookbook.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/countertop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/flour.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/injection.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/chat/menu.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/blender.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/cardboard_box.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/cutting_board.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/food_processor.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/lunchbox.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/mediocre_fridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/pans.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/pepper_shaker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/qa.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/salt_shaker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/scavenger.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/sink.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/strainer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/toaster.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/data/tupperware.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/espresso_maker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/industrial_range.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/new_fridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/new_range.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/old_range.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/evaluation/vera.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyped_pro.js +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/discovery.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/files.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/hfdownload.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/hfmerge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/pairing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/hyperlink/sessions.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/assistant.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/cli.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_bridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_core.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_gui.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/hyped_pro_tools.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/agent.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/cli.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/hpo.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/providers.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/swarm.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/tools.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/noodle/validate.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/version_launcher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/websearch.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/interfaces/wiki_cli.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/arch.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/download.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/generate.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/microwave.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/multilama.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/nano_nano.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/neo_oven.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/old_oven.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/stml.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/whisk.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/models/workshop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/cctvtop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/hyper_log.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/livestream.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/map.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/plasma.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/table.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/thermometer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tv.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tvtop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/monitoring/tvtop_plus_plus.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/optimizer_framework.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v3.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v4.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v5.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v5s.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v6.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/pressure_cooker_v6v.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/optimizers/sixbit.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/package-lock.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/package.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/py.typed +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/convert.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/fetcher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/formats.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/quantize.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/steamroller.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/steamroller_cli.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/quant/upload.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/app.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/cli.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/params.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/templates.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/theme.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/scriptgen/widgets.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/gatekeeper.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/security/keymaster.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/compactor.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/config.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/deps.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/dishwasher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/doctor.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/ethanol.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/freezer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/net.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/old_fridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/outage.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/pascal.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/pathfix.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/protect.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/release.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/torch_compat.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/ups.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/system/utils.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/app.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/audit.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/auth.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/authhistory.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/backup.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/billing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/config.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/cost.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/data/model_registry.example.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/data/routing_policies.example.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/db.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/deploy.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/deps.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/errors.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/events.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/jobs.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/keys.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/modules.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/mtls.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/netpolicy.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/ratelimit.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/registry.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/audit.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/auth.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/authundo.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/backup.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/billing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/bridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/config.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/events.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/health.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/hyperlink.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/jobs.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/keys.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/models.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/modules.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/security.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/servers.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routers/usage.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/routing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/schemas.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/security.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/servers.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/storage.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/transport.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/usage.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1api/version.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/client.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/errors.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/models.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/t1sdk/transport.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/bell.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/coffee_maker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/smoke_alarm.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/spinner.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/timing/timer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/abbicus.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/apron.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/brewer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/cake_pan.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/camouflage.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/compute_framework.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/deep_fryer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/fizzle.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/instant_pot.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/lazy_suzan.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/mtp.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/recipe_book.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/smoker.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/training/train.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/tsconfig.json +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/__init__.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/client.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/discovery.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/local_config.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/smoke.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/src/hypernix/waiter/tui.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_alarms_and_presets.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_arch_mapping.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_assistant.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_autofix_scripts.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_cli_integration.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_coverage_beef.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_deps_and_windows.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ethanol.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_fetcher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_freezer.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_fridges.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_hyped_pro_bridge_cancel.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_hyped_pro_t1api.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_install_pin.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_install_script.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_kitchen_v044.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_kitchen_v045.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lazy_suzan.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lint_regressions.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_lunchbox.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_map.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_module_layout.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_neo_oven.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_neo_oven_generation.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_new_archs_v035.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_nix_fallback.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_old_oven.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pathfix.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v048.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v3.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_pressure_cooker_v6.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_quantize_v0703.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ranges.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_shakers_and_torchcompat.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_snapshot_roundtrip.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1_v1_0_26_core.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1_v1_0_26_http.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_auth.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_core.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_http.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta3_security.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_beta4_usage_report.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_billing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_core.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_events.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_http.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_http_beta2.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_jobs.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_modules.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_routing.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_security.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_t1api_servers.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_tupperware.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_tvtop_plus_plus_comprehensive.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_ups.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v031_chat_and_archs.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v047_deep_fryer_cake_pan_presets.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v050.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_1.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_3.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v051_4.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v052_5.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v052_6.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v060.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_1.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_2.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v061_b1.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0703_additional.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704_features.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704_tvtop_plus_plus.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704b11_features.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0704b12_cctvtop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0705_all.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0710_gatekeeper_keymaster.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0711_border_fix.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0712_hyped_countertop.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_config_provider_keys.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_cpu_presets.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_bridge.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_core.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_launcher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_hyped_pro_tools.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0714_multilama.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_api_waiter.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_modules.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_v0721_t2_keys.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_vera.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_version_launcher.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/tests/test_waiter.py +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Abbicus.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Alarms.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Apron.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Architectures.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Bell.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Blender.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CLI.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CakePan.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Camouflage.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CoffeeMaker.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Convert.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Cookbook.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Countertop.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/CuttingBoard.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Dashboards.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/DeepFryer.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Download.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/EspressoMaker.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Flour.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/FoodProcessor.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Frameworks.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Freezer.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Fridges.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Home.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/HuggingFace-Models.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/HyperLog.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Kitchen.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Lunchbox.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/MTP.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Menu.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Microwave.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Optimizers.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Ovens.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pans.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pascal.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/PipelineMechanics.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V3.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V4.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V5.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Pressure-Cooker-V6.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Quantization.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Ranges.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/RecipeBook.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Roadmap.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/STML.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Scavenger.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Shakers.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Smoker.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/T1-API-Security-Checklist.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Toaster.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Training.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Tupperware.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Vera.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Whisk.md +0 -0
- {hypernix-0.72.2 → hypernix-0.72.2.post3}/wiki/Workshop.md +0 -0
- {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.
|
|
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
|
-
|
|
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" }
|
|
@@ -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
|
-
|
|
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=
|
|
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=
|
|
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]{
|
|
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: {
|
|
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:
|