highhxcli 0.3.2__tar.gz → 0.4.0__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.
- {highhxcli-0.3.2 → highhxcli-0.4.0}/CHANGELOG.md +57 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/PKG-INFO +80 -19
- {highhxcli-0.3.2 → highhxcli-0.4.0}/README.md +79 -18
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/agent.md +37 -8
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/__init__.py +1 -1
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/bootstrap.py +12 -1
- highhxcli-0.4.0/src/highhx/agent/input.py +70 -0
- highhxcli-0.4.0/src/highhx/agent/launch.py +76 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/platform.py +1 -1
- highhxcli-0.4.0/src/highhx/agent/repl.py +926 -0
- highhxcli-0.4.0/src/highhx/agent/router.py +129 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/ui.py +126 -15
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cli.py +24 -14
- highhxcli-0.4.0/src/highhx/cloud/capabilities.py +160 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/plans.py +2 -1
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/cloud/account.py +6 -2
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/cloud/agent.py +19 -10
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/cloud/login.py +4 -2
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/intents.py +91 -2
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/errors.py +3 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/branding.py +13 -5
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_cloud_and_cli.py +1 -1
- highhxcli-0.4.0/tests/unit/agent/test_free_pro_boundary.py +469 -0
- highhxcli-0.4.0/tests/unit/agent/test_interactive_shell.py +698 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_repl.py +1 -1
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/ui/test_branding.py +1 -1
- highhxcli-0.3.2/src/highhx/agent/repl.py +0 -460
- {highhxcli-0.3.2 → highhxcli-0.4.0}/.gitignore +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/CONTRIBUTING.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/LICENSE +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/SECURITY.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/architecture.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/commands.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/computer-use.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/configuration.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/development.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/platform.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/plugins.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/security.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/troubleshooting.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/docs/workflows.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/README.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/.highhx/workflows/check.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/README.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/calc.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/tests/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/basic/tests/test_calc.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/ci/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/ci/.highhx/workflows/pipeline.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/ci/.highhx/workflows/tests.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/docker/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/docker/.highhx/workflows/up.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/flutter/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/flutter/.highhx/workflows/build.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/monorepo/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/monorepo/.highhx/workflows/test-all.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/node/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/node/.highhx/workflows/ci.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/.highhx/environment.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/.highhx/policies.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/.highhx/workflows/deploy.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/db/migrations/001_create_users.sql +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/production/db/migrations/002_add_name.sql +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/python/.highhx/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/python/.highhx/workflows/check.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/examples/python/.highhx/workflows/release.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/pyproject.toml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/schemas/config.schema.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/schemas/plugin.schema.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/schemas/workflow.schema.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/scripts/generate_docs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/scripts/generate_schemas.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/README.md +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/__main__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/accounts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/app.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/billing.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/config.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/db.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/deps.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/gateway.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/env.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/script.py.mako +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/versions/0001_initial_schema.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/versions/0002_security_and_metering.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/versions/0003_shared_stream_state.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/migrations/versions/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/models.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/account.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/ai.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/auth.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/billing.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/routers/web.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/security.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/src/highhx_platform/streams.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/conftest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/helpers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/test_cli_integration.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/test_e2e_final.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/test_hardening.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/test_multi_instance.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/server/tests/test_platform.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/__main__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/context.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/history.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/memory.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/messages.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/anthropic.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/base.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/gemini.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/openai.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/model/resilience.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/permissions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/planner.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/prompts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/running.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/session.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/settings.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/state.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/streaming.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/sync.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/base.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/commands.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/computer.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/devops.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/files.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/git.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/project.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/agent/tools/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/approvals/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/approvals/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/approvals/policy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/approvals/risk.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/approvals/rules.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/cron.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/hooks.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/scheduler.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/triggers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/automation/watcher.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/building/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/building/artifacts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/building/builder.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/building/cleanup.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/building/packaging.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/account.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/client.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/credentials.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/protocol.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/cloud/sse.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/automation/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/automation/hook.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/automation/schedule.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/automation/trigger.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/automation/watch.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/build/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/build/artifacts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/build/build.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/build/clean.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/build/package.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/cloud/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/exec.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/fix.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/run.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/script.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/task.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/code/watch.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/computer/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/computer/do.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/computer/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/backup.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/migrate.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/restore.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/seed.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/database/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/audit.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/clean.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/install.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/outdated.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/dependencies/update.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/deploy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/environments.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/logs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/rollback.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/deployment/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/debug.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/diagnose.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/doctor.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/repair.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/diagnostics/trace.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/docker/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/docker/down.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/docker/logs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/docker/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/docker/up.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/check.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/diff.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/profile.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/environment/set.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/branch.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/commit.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/diff.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/history.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/sync.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/git/tag.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/groups.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/observability/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/observability/audit.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/observability/history.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/observability/logs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/observability/report.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/install.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/list.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/remove.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/search.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/trust.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/plugins/update.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/check.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/dev.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/doctor.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/info.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/init.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/restart.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/start.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/project/stop.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/release/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/release/changelog.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/release/publish.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/release/release.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/release/version.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/config.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/dependencies.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/report.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/scan.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/security/secrets.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/services/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/services/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/services/ports.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/team/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/team/config.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/team/policy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/team/profile.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/team/workspace.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/testing/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/testing/benchmark.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/testing/test.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/create.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/graph.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/list.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/main.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/commands/workflows/validate.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/browser.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/desktop.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/flows.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/model.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/providers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/runtime.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/session.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/computer/websocket.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/config/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/config/defaults.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/config/loader.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/config/schema.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/config/validation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/context.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/engine.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/events.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/executor.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/lifecycle.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/core/result.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/backup.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/migrations.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/restore.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/database/seeding.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/audit.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/detector.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/installer.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/outdated.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/dependencies/updater.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/health.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/rollback.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/state.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/strategy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/deployment/target.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/container.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/database.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/framework.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/language.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/operating_system.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/package_manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/runtime.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/detection/tools.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/diagnostics/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/diagnostics/diagnose.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/diagnostics/doctor.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/diagnostics/repair.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/dotenv.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/profiles.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/secrets.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/validation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/environment/variables.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/cancellation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/command.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/environment.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/isolation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/parallel.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/process.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/retry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/shell.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/execution/timeout.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/branches.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/commits.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/diff.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/history.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/repository.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/git/tags.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/cloud/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/cloud/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/base.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/mysql.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/postgres.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/sqlite.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/databases/url.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/docker/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/docker/client.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/kubernetes/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/kubernetes/client.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/ssh/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/ssh/client.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/terraform/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/integrations/terraform/client.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/observability/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/observability/events.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/observability/logger.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/observability/metrics.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/observability/tracing.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/interface.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/loader.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/manifest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/plugins/sandbox.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/policy/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/policy/engine.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/policy/rules.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/policy/validator.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/context.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/detector.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/initializer.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/manifest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/monorepo.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/scanner.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/status.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/project/workspace.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/release/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/release/changelog.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/release/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/release/publisher.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/release/versioning.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/actions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/audit.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/classifier.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/confirmation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/gate.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/safety/injection.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/dependencies.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/filesystem.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/permissions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/policies.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/report.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/scanner.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/secrets.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/security/secrets_scan.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/services/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/services/health.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/services/manager.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/services/ports.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/services/registry.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/cache.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/database.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/history.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/logs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/storage/migrations.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/testing/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/testing/benchmark.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/testing/coverage.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/testing/discovery.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/testing/runner.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/dashboard.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/errors.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/output.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/progress.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/prompts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/reporting.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/tables.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/ui/terminal.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/filesystem.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/hashing.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/paths.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/platform.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/processes.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/time.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/utils/validation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/conditions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/dependency_graph.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/engine.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/loader.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/parser.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/resolver.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/scheduler.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/schema.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/templates.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/validator.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/src/highhx/workflows/variables.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/cpp/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/cpp/workflows/build.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/docker/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/docker/workflows/build.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/flutter/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/flutter/workflows/test.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/environment.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/policies.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/build.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/ci.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/deploy.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/dev.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/release.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/rollback.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/generic/workflows/test.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/java/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/monorepo/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/monorepo/workflows/test.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/nextjs/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/node/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/python/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/templates/react/config.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/conftest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/_helpers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_deploy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_dev.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_examples.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_free_without_ai.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_init.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_interrupts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_long_running.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_paths_with_spaces.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_rollback.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/e2e/test_services_lifecycle.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/docker_project/Dockerfile +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/docker_project/compose.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/monorepo/package.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/monorepo/packages/api/package.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/monorepo/packages/web/package.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/node_project/package.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/node_project/pnpm-lock.yaml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/node_project/tsconfig.json +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/python_project/pyproject.toml +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/python_project/src/pyapp/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/python_project/src/pyapp/calc.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/fixtures/python_project/tests/test_calc.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/docker/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/docker/test_docker_project.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/git/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/git/test_release_flow.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/node/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/node/test_node_project.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/python/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/python/test_python_project.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/test_external_tool_contracts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/test_mysql_real.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/workflows/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/integration/workflows/test_cli_workflows.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/security/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/security/test_permissions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/security/test_policies.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/security/test_secrets.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/conftest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_injection_surfaces.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_live_providers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_provider_wire.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_providers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_resilience_and_state.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_safety.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_session.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/agent/test_tools.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/commands/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/commands/test_cli.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/commands/test_docs.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/commands/test_json_contract.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/commands/test_project_commands.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/conftest.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_browser_resilience.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_browser_scripts.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_computer.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_live_browser.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_live_ocr.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/computer/test_ocr_and_platforms.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/core/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/core/test_engine.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/core/test_errors_events.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/core/test_executor.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/detection/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/detection/test_detection.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/execution/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/execution/test_command.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/execution/test_process.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/execution/test_retry_parallel_cancel.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/git/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/git/test_parsers.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/git/test_repository.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/security/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/security/test_hardening_review.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/security/test_secrets_scanner.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/storage/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/storage/test_storage.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_approvals_policy.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_audit_regressions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_automation.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_config_environment.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_cross_platform.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_dependencies_testing.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_deployment_database.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_gap_coverage.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_packaging.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_plugins.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_release.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_schemas_examples.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/test_services_docker.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/ui/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/__init__.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/test_conditions.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/test_dependency_graph.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/test_engine.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/test_parser_validator.py +0 -0
- {highhxcli-0.3.2 → highhxcli-0.4.0}/tests/unit/workflows/test_templates.py +0 -0
|
@@ -6,6 +6,63 @@ project uses [Semantic Versioning](https://semver.org/).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.4.0] - 2026-09-27
|
|
10
|
+
|
|
11
|
+
One interactive HighhX for both plans: run `highhx` and describe what you want.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Interactive session.** `highhx` with no arguments in a terminal opens the HighhX session
|
|
16
|
+
(`highhx agent` opens the same one). Free and Pro share the interface; the plan decides
|
|
17
|
+
which capabilities are attached. Status line: `Free • Local`, `Free • Connected`,
|
|
18
|
+
`Pro • Connected`, `Pro • Offline (cached)`, `… • Platform unavailable`.
|
|
19
|
+
- **Capabilities** (`highhx.cloud.capabilities`): local capabilities (commands, shell,
|
|
20
|
+
deterministic intents, deterministic automation) plus the platform-reported plan
|
|
21
|
+
features. The platform stays authoritative and enforces every AI request.
|
|
22
|
+
- **Free in the session:** known plain-language requests run the matching HighhX command
|
|
23
|
+
deterministically (the `highhx do` rules, no AI); `!command` runs shell commands through
|
|
24
|
+
the engine (risk, policy, approval, history); `highhx <command>` runs any command in place.
|
|
25
|
+
Requests that need AI show a **HighhX Pro capability** panel naming the capability, with
|
|
26
|
+
local alternatives (`[1-3] Continue locally`, `[p] View Pro`).
|
|
27
|
+
- **Platform resilience:** without the platform, local capabilities keep working; when the
|
|
28
|
+
AI gateway fails during a request, the session says so and offers the local route.
|
|
29
|
+
- **Plan changes apply in place:** `highhx login` / `/account` in the session re-checks the
|
|
30
|
+
account and attaches or detaches the AI agent.
|
|
31
|
+
- Slash commands `/tools`, `/config`, `/account`, `/pro`; agent-only commands explain
|
|
32
|
+
that they need Pro on Free.
|
|
33
|
+
- Input: `"""` blocks for multi-line input, readline-safe coloured prompt (clean redraw of
|
|
34
|
+
long lines and history), Ctrl+C at the prompt no longer cancels the application token.
|
|
35
|
+
- Tool outcomes distinguish blocked / declined (⊘) and cancelled (○) from failures (✗);
|
|
36
|
+
approvals render as panels.
|
|
37
|
+
|
|
38
|
+
### Security
|
|
39
|
+
|
|
40
|
+
- The AI agent runtime is only constructed on a live confirmation from the platform:
|
|
41
|
+
`create_session` refuses a cached account, and a cached account grants no platform
|
|
42
|
+
capability (the cache is an editable local file). Previously an edited cache could start
|
|
43
|
+
the runtime offline (it still could not reach a model — the gateway checks every request).
|
|
44
|
+
- Free/Pro boundary tests: tripwires on every AI entry point, a static scan for
|
|
45
|
+
bring-your-own-key paths and vendor SDK imports, and an instrumented interpreter that
|
|
46
|
+
records environment lookups (no provider key is ever read on Free).
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
|
|
50
|
+
- `highhx do` and the session no longer treat file names as websites or applications
|
|
51
|
+
(`open main.py` opened `https://main.py`).
|
|
52
|
+
- `highhx -v agent …`, `highhx -C DIR agent …` or a bare `highhx -v` typed inside the
|
|
53
|
+
session no longer start a nested session.
|
|
54
|
+
- An unexpected error in one command or agent turn no longer ends the session.
|
|
55
|
+
- Known requests that change files (`fix`, `install dependencies`) are confirmed first when
|
|
56
|
+
typed as free-form text in the session.
|
|
57
|
+
- A signed-in session that started offline attaches the AI agent once the platform is back.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- The startup banner is the same for Free and Pro ("Developer command center" with git
|
|
62
|
+
state and plan status).
|
|
63
|
+
- `highhx` outside a terminal, and with `--json` or `--quiet`, still prints the help (CI and
|
|
64
|
+
scripts are unaffected). One-shot `highhx agent "…"` requests still require Pro (exit 10).
|
|
65
|
+
|
|
9
66
|
## [0.3.0] - 2026-09-27
|
|
10
67
|
|
|
11
68
|
Two plans, one platform: **Free** is deterministic HighhX; **Pro** adds the AI agent and AI
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: highhxcli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: HighhX — the developer command center CLI, with HighhX Pro: an AI developer agent in your terminal.
|
|
5
5
|
Author: HighhX contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -50,11 +50,13 @@ history of everything it did. Every risky action is classified and needs approva
|
|
|
50
50
|
|
|
51
51
|
| | |
|
|
52
52
|
|---|---|
|
|
53
|
-
| **HighhX Free** |
|
|
54
|
-
| **HighhX Pro** |
|
|
53
|
+
| **HighhX Free** | The interactive `highhx` session and the full developer CLI: known requests in plain language run locally without AI, plus every command, shell commands with risk checks and approvals, and browser/desktop automation with known targets (`highhx computer`, `highhx do`). Local, no account, no AI. |
|
|
54
|
+
| **HighhX Pro** | The same session with the AI developer agent attached — it plans, changes code, runs your tools, operates browsers and apps (AI computer use), recovers from failures and verifies the result. |
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
Run `highhx` in a terminal and describe what you want. Free and Pro share one interface and
|
|
57
|
+
one execution platform: the same tools, safety policy, confirmations, verification and audit
|
|
58
|
+
trail. Your plan only decides which capabilities the session has — the HighhX platform grants
|
|
59
|
+
and enforces them. The AI only chooses actions; it never gets its own way to run them.
|
|
58
60
|
|
|
59
61
|
```text
|
|
60
62
|
$ highhx doctor
|
|
@@ -79,6 +81,7 @@ Suggested actions
|
|
|
79
81
|
- [Why HighhX](#why-highhx)
|
|
80
82
|
- [Installation](#installation)
|
|
81
83
|
- [Quick start](#quick-start)
|
|
84
|
+
- [The interactive session](#the-interactive-session)
|
|
82
85
|
- [HighhX Pro: the AI developer agent](#highhx-pro-the-ai-developer-agent)
|
|
83
86
|
- [Commands](#commands)
|
|
84
87
|
- [Workflows](#workflows)
|
|
@@ -159,20 +162,79 @@ highhx logs # output of the last execution (secrets redacted)
|
|
|
159
162
|
└── logs/ # execution logs (git-ignored)
|
|
160
163
|
```
|
|
161
164
|
|
|
165
|
+
## The interactive session
|
|
166
|
+
|
|
167
|
+
`highhx` with no arguments, in a terminal, opens the HighhX session (`highhx agent` opens the
|
|
168
|
+
same one). Outside a terminal, and with `--json` or `--quiet`, it prints the help as before,
|
|
169
|
+
so scripts and CI are unaffected.
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
$ highhx
|
|
173
|
+
|
|
174
|
+
(the Knight) HighhX v0.4.0
|
|
175
|
+
Developer command center
|
|
176
|
+
~/code/shop
|
|
177
|
+
main • clean
|
|
178
|
+
Free • Local
|
|
179
|
+
|
|
180
|
+
❯ show git status
|
|
181
|
+
|
|
182
|
+
◉ highhx git status
|
|
183
|
+
✓ Working tree clean
|
|
184
|
+
✓ highhx git status (0.1s)
|
|
185
|
+
|
|
186
|
+
❯ Fix the failing tests
|
|
187
|
+
|
|
188
|
+
╭─ HighhX Pro capability ─────────────────────────────╮
|
|
189
|
+
│ AI code changes require HighhX Pro. │
|
|
190
|
+
│ │
|
|
191
|
+
│ Available locally, without AI: │
|
|
192
|
+
│ 1 Run the tests highhx test │
|
|
193
|
+
│ 2 Diagnose the project highhx diagnose │
|
|
194
|
+
│ 3 Show recent logs highhx logs │
|
|
195
|
+
│ │
|
|
196
|
+
│ [1-3] Continue locally [p] View Pro │
|
|
197
|
+
╰─────────────────────────────────────────────────────╯
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
- **Plain language first.** On Free, requests that map to a known action (*run the tests*,
|
|
201
|
+
*run the checks*, *build*, *show git status*, *security scan*, *open localhost:3000* …)
|
|
202
|
+
run the matching HighhX command — deterministically, no AI. Requests that need
|
|
203
|
+
understanding name the Pro capability they need and offer the local commands that can
|
|
204
|
+
do part of the job. On Pro the AI agent handles every request.
|
|
205
|
+
- **`!command`** runs a shell command through the HighhX engine (risk classification,
|
|
206
|
+
policy, approval, history); **`highhx <command>`** runs any HighhX command in the session.
|
|
207
|
+
- **Input.** ↑/↓ history (kept across sessions), line editing, `\` at the end of a line or
|
|
208
|
+
a `"""` block for multi-line input, Ctrl+C interrupts the running request, Ctrl+D exits.
|
|
209
|
+
- **Status line.** `Free • Local`, `Free • Connected`, `Pro • Connected`,
|
|
210
|
+
`Pro • Offline (cached)` or `… • Platform unavailable`. Only a live answer from the
|
|
211
|
+
platform attaches the AI agent. When the platform cannot be reached, local capabilities
|
|
212
|
+
keep working and the session re-checks when a request needs the agent; if the gateway
|
|
213
|
+
fails during a Pro request, the session says so and offers the local route for it.
|
|
214
|
+
- **Deterministic means predictable.** Free never calls a model or reads a provider API key.
|
|
215
|
+
File names are never treated as websites (`open main.py` is not `https://main.py`), and
|
|
216
|
+
known requests that change files (`fix`, `install dependencies`) ask first.
|
|
217
|
+
- **Plan changes apply in place.** Run `highhx login` (or `/account` after upgrading) inside
|
|
218
|
+
the session and it re-checks your account: the AI agent attaches when the platform grants
|
|
219
|
+
it, and detaches when it no longer does.
|
|
220
|
+
- **Slash commands.** `/help` `/status` `/tools` `/context` `/config` `/account` `/usage`
|
|
221
|
+
`/history` `/memory` `/pro` `/clear` `/quit`, plus the agent's `/plan` `/model` `/mode`
|
|
222
|
+
`/changes` `/undo` (Pro).
|
|
223
|
+
|
|
162
224
|
## HighhX Pro: the AI developer agent
|
|
163
225
|
|
|
164
226
|
```text
|
|
165
|
-
$ highhx
|
|
227
|
+
$ highhx
|
|
166
228
|
|
|
167
229
|
▗█▖
|
|
168
230
|
▐▀▌
|
|
169
231
|
▗ ▄ ▖
|
|
170
232
|
▗▚▐█▌▞▖
|
|
171
|
-
▗▚█▐█▌█▞▖ HighhX v0.
|
|
172
|
-
▟█▐█▌█▙
|
|
233
|
+
▗▚█▐█▌█▞▖ HighhX v0.4.0
|
|
234
|
+
▟█▐█▌█▙ Developer command center
|
|
173
235
|
▐▐█▌█▐█▌▌ ~/code/shop
|
|
174
|
-
█▗▜▌█▐▛▖█
|
|
175
|
-
█▐▙▘█▝▟▌█
|
|
236
|
+
█▗▜▌█▐▛▖█ main • clean
|
|
237
|
+
█▐▙▘█▝▟▌█ Pro • Connected
|
|
176
238
|
▐▐▜▌▄▐▛▌▌
|
|
177
239
|
▗▝▐▐▌█▐▌▌▘▖
|
|
178
240
|
█▙▝█▌█▐█▘▟█
|
|
@@ -180,10 +242,7 @@ $ highhx agent
|
|
|
180
242
|
▀█▟▀ █ ▀▙█▀
|
|
181
243
|
▀▌ █ ▐▀
|
|
182
244
|
|
|
183
|
-
Project shop
|
|
184
|
-
Stack Python, FastAPI
|
|
185
|
-
Branch main
|
|
186
|
-
Status clean
|
|
245
|
+
Project shop Python, FastAPI
|
|
187
246
|
AI Connected HighhX (managed)
|
|
188
247
|
|
|
189
248
|
What would you like me to do? (/help for commands)
|
|
@@ -200,8 +259,10 @@ Proceed? [Y/n]
|
|
|
200
259
|
|
|
201
260
|
✓ Run tests — 3 tests failing (4.1s)
|
|
202
261
|
✓ Read src/shop/cart.py — 88 lines
|
|
203
|
-
|
|
204
|
-
|
|
262
|
+
|
|
263
|
+
╭─ ⚠ Action requires approval ─────────────────────╮
|
|
264
|
+
│ Edit src/shop/cart.py (+2 -1) │
|
|
265
|
+
╰──────────────────────────────────────────────────╯
|
|
205
266
|
…diff…
|
|
206
267
|
Proceed? [y/N/a=always this session] y
|
|
207
268
|
✓ Edit src/shop/cart.py — +2 -1
|
|
@@ -227,8 +288,8 @@ summarises it.
|
|
|
227
288
|
choose `--mode auto-edit`); pushes, deploys and rollbacks always ask; production
|
|
228
289
|
deploys need typed confirmation. The agent cannot leave the project, read secret files
|
|
229
290
|
or touch `.git/`. `--mode read-only` investigates without changing anything.
|
|
230
|
-
- **Slash commands.**
|
|
231
|
-
`/
|
|
291
|
+
- **Slash commands.** Everything from the [interactive session](#the-interactive-session), plus
|
|
292
|
+
`/plan` `/model` `/mode` `/changes` `/undo`.
|
|
232
293
|
- **Sessions.** Saved per project: `highhx agent --continue`, `--resume ID`, `highhx agent sessions`.
|
|
233
294
|
- **Scriptable.** `highhx agent "…"` outside a terminal (or with `--json`) handles one request
|
|
234
295
|
and exits — `--yes --mode auto-edit` for unattended runs in CI.
|
|
@@ -243,7 +304,7 @@ summarises it.
|
|
|
243
304
|
```bash
|
|
244
305
|
highhx login # browser sign-in (creates your account)
|
|
245
306
|
highhx account upgrade # HighhX Pro checkout
|
|
246
|
-
highhx
|
|
307
|
+
highhx # interactive session (also: highhx agent)
|
|
247
308
|
highhx agent "why is the application crashing?"
|
|
248
309
|
```
|
|
249
310
|
|
|
@@ -7,11 +7,13 @@ history of everything it did. Every risky action is classified and needs approva
|
|
|
7
7
|
|
|
8
8
|
| | |
|
|
9
9
|
|---|---|
|
|
10
|
-
| **HighhX Free** |
|
|
11
|
-
| **HighhX Pro** |
|
|
10
|
+
| **HighhX Free** | The interactive `highhx` session and the full developer CLI: known requests in plain language run locally without AI, plus every command, shell commands with risk checks and approvals, and browser/desktop automation with known targets (`highhx computer`, `highhx do`). Local, no account, no AI. |
|
|
11
|
+
| **HighhX Pro** | The same session with the AI developer agent attached — it plans, changes code, runs your tools, operates browsers and apps (AI computer use), recovers from failures and verifies the result. |
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
Run `highhx` in a terminal and describe what you want. Free and Pro share one interface and
|
|
14
|
+
one execution platform: the same tools, safety policy, confirmations, verification and audit
|
|
15
|
+
trail. Your plan only decides which capabilities the session has — the HighhX platform grants
|
|
16
|
+
and enforces them. The AI only chooses actions; it never gets its own way to run them.
|
|
15
17
|
|
|
16
18
|
```text
|
|
17
19
|
$ highhx doctor
|
|
@@ -36,6 +38,7 @@ Suggested actions
|
|
|
36
38
|
- [Why HighhX](#why-highhx)
|
|
37
39
|
- [Installation](#installation)
|
|
38
40
|
- [Quick start](#quick-start)
|
|
41
|
+
- [The interactive session](#the-interactive-session)
|
|
39
42
|
- [HighhX Pro: the AI developer agent](#highhx-pro-the-ai-developer-agent)
|
|
40
43
|
- [Commands](#commands)
|
|
41
44
|
- [Workflows](#workflows)
|
|
@@ -116,20 +119,79 @@ highhx logs # output of the last execution (secrets redacted)
|
|
|
116
119
|
└── logs/ # execution logs (git-ignored)
|
|
117
120
|
```
|
|
118
121
|
|
|
122
|
+
## The interactive session
|
|
123
|
+
|
|
124
|
+
`highhx` with no arguments, in a terminal, opens the HighhX session (`highhx agent` opens the
|
|
125
|
+
same one). Outside a terminal, and with `--json` or `--quiet`, it prints the help as before,
|
|
126
|
+
so scripts and CI are unaffected.
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
$ highhx
|
|
130
|
+
|
|
131
|
+
(the Knight) HighhX v0.4.0
|
|
132
|
+
Developer command center
|
|
133
|
+
~/code/shop
|
|
134
|
+
main • clean
|
|
135
|
+
Free • Local
|
|
136
|
+
|
|
137
|
+
❯ show git status
|
|
138
|
+
|
|
139
|
+
◉ highhx git status
|
|
140
|
+
✓ Working tree clean
|
|
141
|
+
✓ highhx git status (0.1s)
|
|
142
|
+
|
|
143
|
+
❯ Fix the failing tests
|
|
144
|
+
|
|
145
|
+
╭─ HighhX Pro capability ─────────────────────────────╮
|
|
146
|
+
│ AI code changes require HighhX Pro. │
|
|
147
|
+
│ │
|
|
148
|
+
│ Available locally, without AI: │
|
|
149
|
+
│ 1 Run the tests highhx test │
|
|
150
|
+
│ 2 Diagnose the project highhx diagnose │
|
|
151
|
+
│ 3 Show recent logs highhx logs │
|
|
152
|
+
│ │
|
|
153
|
+
│ [1-3] Continue locally [p] View Pro │
|
|
154
|
+
╰─────────────────────────────────────────────────────╯
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
- **Plain language first.** On Free, requests that map to a known action (*run the tests*,
|
|
158
|
+
*run the checks*, *build*, *show git status*, *security scan*, *open localhost:3000* …)
|
|
159
|
+
run the matching HighhX command — deterministically, no AI. Requests that need
|
|
160
|
+
understanding name the Pro capability they need and offer the local commands that can
|
|
161
|
+
do part of the job. On Pro the AI agent handles every request.
|
|
162
|
+
- **`!command`** runs a shell command through the HighhX engine (risk classification,
|
|
163
|
+
policy, approval, history); **`highhx <command>`** runs any HighhX command in the session.
|
|
164
|
+
- **Input.** ↑/↓ history (kept across sessions), line editing, `\` at the end of a line or
|
|
165
|
+
a `"""` block for multi-line input, Ctrl+C interrupts the running request, Ctrl+D exits.
|
|
166
|
+
- **Status line.** `Free • Local`, `Free • Connected`, `Pro • Connected`,
|
|
167
|
+
`Pro • Offline (cached)` or `… • Platform unavailable`. Only a live answer from the
|
|
168
|
+
platform attaches the AI agent. When the platform cannot be reached, local capabilities
|
|
169
|
+
keep working and the session re-checks when a request needs the agent; if the gateway
|
|
170
|
+
fails during a Pro request, the session says so and offers the local route for it.
|
|
171
|
+
- **Deterministic means predictable.** Free never calls a model or reads a provider API key.
|
|
172
|
+
File names are never treated as websites (`open main.py` is not `https://main.py`), and
|
|
173
|
+
known requests that change files (`fix`, `install dependencies`) ask first.
|
|
174
|
+
- **Plan changes apply in place.** Run `highhx login` (or `/account` after upgrading) inside
|
|
175
|
+
the session and it re-checks your account: the AI agent attaches when the platform grants
|
|
176
|
+
it, and detaches when it no longer does.
|
|
177
|
+
- **Slash commands.** `/help` `/status` `/tools` `/context` `/config` `/account` `/usage`
|
|
178
|
+
`/history` `/memory` `/pro` `/clear` `/quit`, plus the agent's `/plan` `/model` `/mode`
|
|
179
|
+
`/changes` `/undo` (Pro).
|
|
180
|
+
|
|
119
181
|
## HighhX Pro: the AI developer agent
|
|
120
182
|
|
|
121
183
|
```text
|
|
122
|
-
$ highhx
|
|
184
|
+
$ highhx
|
|
123
185
|
|
|
124
186
|
▗█▖
|
|
125
187
|
▐▀▌
|
|
126
188
|
▗ ▄ ▖
|
|
127
189
|
▗▚▐█▌▞▖
|
|
128
|
-
▗▚█▐█▌█▞▖ HighhX v0.
|
|
129
|
-
▟█▐█▌█▙
|
|
190
|
+
▗▚█▐█▌█▞▖ HighhX v0.4.0
|
|
191
|
+
▟█▐█▌█▙ Developer command center
|
|
130
192
|
▐▐█▌█▐█▌▌ ~/code/shop
|
|
131
|
-
█▗▜▌█▐▛▖█
|
|
132
|
-
█▐▙▘█▝▟▌█
|
|
193
|
+
█▗▜▌█▐▛▖█ main • clean
|
|
194
|
+
█▐▙▘█▝▟▌█ Pro • Connected
|
|
133
195
|
▐▐▜▌▄▐▛▌▌
|
|
134
196
|
▗▝▐▐▌█▐▌▌▘▖
|
|
135
197
|
█▙▝█▌█▐█▘▟█
|
|
@@ -137,10 +199,7 @@ $ highhx agent
|
|
|
137
199
|
▀█▟▀ █ ▀▙█▀
|
|
138
200
|
▀▌ █ ▐▀
|
|
139
201
|
|
|
140
|
-
Project shop
|
|
141
|
-
Stack Python, FastAPI
|
|
142
|
-
Branch main
|
|
143
|
-
Status clean
|
|
202
|
+
Project shop Python, FastAPI
|
|
144
203
|
AI Connected HighhX (managed)
|
|
145
204
|
|
|
146
205
|
What would you like me to do? (/help for commands)
|
|
@@ -157,8 +216,10 @@ Proceed? [Y/n]
|
|
|
157
216
|
|
|
158
217
|
✓ Run tests — 3 tests failing (4.1s)
|
|
159
218
|
✓ Read src/shop/cart.py — 88 lines
|
|
160
|
-
|
|
161
|
-
|
|
219
|
+
|
|
220
|
+
╭─ ⚠ Action requires approval ─────────────────────╮
|
|
221
|
+
│ Edit src/shop/cart.py (+2 -1) │
|
|
222
|
+
╰──────────────────────────────────────────────────╯
|
|
162
223
|
…diff…
|
|
163
224
|
Proceed? [y/N/a=always this session] y
|
|
164
225
|
✓ Edit src/shop/cart.py — +2 -1
|
|
@@ -184,8 +245,8 @@ summarises it.
|
|
|
184
245
|
choose `--mode auto-edit`); pushes, deploys and rollbacks always ask; production
|
|
185
246
|
deploys need typed confirmation. The agent cannot leave the project, read secret files
|
|
186
247
|
or touch `.git/`. `--mode read-only` investigates without changing anything.
|
|
187
|
-
- **Slash commands.**
|
|
188
|
-
`/
|
|
248
|
+
- **Slash commands.** Everything from the [interactive session](#the-interactive-session), plus
|
|
249
|
+
`/plan` `/model` `/mode` `/changes` `/undo`.
|
|
189
250
|
- **Sessions.** Saved per project: `highhx agent --continue`, `--resume ID`, `highhx agent sessions`.
|
|
190
251
|
- **Scriptable.** `highhx agent "…"` outside a terminal (or with `--json`) handles one request
|
|
191
252
|
and exits — `--yes --mode auto-edit` for unattended runs in CI.
|
|
@@ -200,7 +261,7 @@ summarises it.
|
|
|
200
261
|
```bash
|
|
201
262
|
highhx login # browser sign-in (creates your account)
|
|
202
263
|
highhx account upgrade # HighhX Pro checkout
|
|
203
|
-
highhx
|
|
264
|
+
highhx # interactive session (also: highhx agent)
|
|
204
265
|
highhx agent "why is the application crashing?"
|
|
205
266
|
```
|
|
206
267
|
|
|
@@ -4,18 +4,46 @@ HighhX has exactly two plans:
|
|
|
4
4
|
|
|
5
5
|
| | |
|
|
6
6
|
|---|---|
|
|
7
|
-
| **Free** |
|
|
8
|
-
| **Pro** |
|
|
9
|
-
|
|
10
|
-
Free and Pro share one execution platform: the same
|
|
11
|
-
confirmation, verification, audit trail
|
|
12
|
-
layer that *chooses* actions; it never gets its own way to execute them.
|
|
7
|
+
| **Free** | The interactive `highhx` session with local capabilities: known plain-language requests run deterministically (no AI), every CLI command, `!shell` commands with approvals, workflows, diagnostics, build/test, git, deploy, deterministic browser/desktop automation (`highhx computer`, `highhx do`). No AI, no account needed. |
|
|
8
|
+
| **Pro** | The same session **plus** the AI agent: natural-language tasks, AI planning, adaptive multi-step execution, recovery and replanning, and AI computer use. |
|
|
9
|
+
|
|
10
|
+
Free and Pro share one interface and one execution platform: the same session, tools,
|
|
11
|
+
safety policy, human confirmation, verification, audit trail and engine. Pro adds an
|
|
12
|
+
intelligence layer that *chooses* actions; it never gets its own way to execute them.
|
|
13
|
+
|
|
14
|
+
## Capabilities
|
|
15
|
+
|
|
16
|
+
`highhx.cloud.capabilities` decides what a session can do. Local capabilities
|
|
17
|
+
(`local.commands`, `local.shell`, `local.intents`, `local.automation`) are always
|
|
18
|
+
there. Platform capabilities are the plan features (`agent`, `agent.code_changes`,
|
|
19
|
+
`agent.commands`, `agent.git`, `agent.deploy`, `agent.computer_use`, `cloud.sessions`)
|
|
20
|
+
and exist only when the HighhX platform reports them for your account. The result
|
|
21
|
+
shapes the CLI only: the platform checks the plan on every AI request, so nothing
|
|
22
|
+
local can unlock a Pro capability. Only a live answer from the platform attaches the
|
|
23
|
+
agent: the locally cached account copy is shown (`Pro • Offline (cached)`) but grants
|
|
24
|
+
nothing, and `create_session` — the one constructor of the agent runtime — refuses it.
|
|
25
|
+
While the platform is unreachable the session keeps its local capabilities and re-checks
|
|
26
|
+
the platform (at most every 20 seconds) when a request needs the agent; when the platform
|
|
27
|
+
is back and grants Pro, the agent attaches and handles that request. If the gateway fails
|
|
28
|
+
during a Pro request, the session says so and offers the local route for it.
|
|
29
|
+
|
|
30
|
+
Free never calls a model, never reads a provider API key (there is no bring-your-own-key
|
|
31
|
+
path; provider keys live only on the platform) and never constructs the agent runtime —
|
|
32
|
+
`tests/unit/agent/test_free_pro_boundary.py` checks this with tripwires on every AI entry
|
|
33
|
+
point, a static scan of the package and an instrumented interpreter.
|
|
34
|
+
|
|
35
|
+
Requests that need a capability the session lacks show a **HighhX Pro capability**
|
|
36
|
+
panel naming it (AI code changes, AI git operations, AI-driven deployment, AI browser
|
|
37
|
+
and desktop automation, or the agent itself) with the HighhX commands that can do part
|
|
38
|
+
of the job locally — `[1-3] Continue locally` runs one of them, `[p] View Pro` shows the
|
|
39
|
+
plans. Nothing is blocked that Free can do: known requests run directly.
|
|
13
40
|
|
|
14
41
|
## Starting
|
|
15
42
|
|
|
16
43
|
```bash
|
|
17
44
|
highhx login # once (Pro)
|
|
18
|
-
highhx
|
|
45
|
+
highhx # interactive session in this project
|
|
46
|
+
highhx agent # the same session
|
|
19
47
|
highhx agent "fix my failing tests" # interactive, starting with this request
|
|
20
48
|
highhx agent --continue # continue the last session in this project
|
|
21
49
|
highhx agent --resume s-20260927T101500-3f9a1c
|
|
@@ -31,7 +59,8 @@ highhx agent --json --mode read-only "find security issues" | jq -r .text
|
|
|
31
59
|
```
|
|
32
60
|
|
|
33
61
|
Exit codes: `0` completed, `1` stopped early (step limit, output limit, refusal,
|
|
34
|
-
cancellation, provider failure), `10` no HighhX Pro account.
|
|
62
|
+
cancellation, provider failure), `10` no HighhX Pro account. (One-shot requests are AI
|
|
63
|
+
requests, so they need Pro; the interactive session works on every plan.)
|
|
35
64
|
|
|
36
65
|
## How a request runs
|
|
37
66
|
|
|
@@ -15,6 +15,7 @@ from highhx.agent.session import AgentSession, AgentUI
|
|
|
15
15
|
from highhx.agent.settings import AgentSettings
|
|
16
16
|
from highhx.agent.sync import SessionSync
|
|
17
17
|
from highhx.cloud.plans import AGENT, CLOUD_SESSIONS
|
|
18
|
+
from highhx.core.errors import CloudError
|
|
18
19
|
|
|
19
20
|
if TYPE_CHECKING:
|
|
20
21
|
from highhx.cloud.account import Account, CloudAccount
|
|
@@ -62,8 +63,18 @@ def create_session(
|
|
|
62
63
|
overrides: dict[str, Any] | None = None,
|
|
63
64
|
resume: Resume | None = None,
|
|
64
65
|
) -> tuple[AgentSession, Account, bool]:
|
|
65
|
-
"""Returns ``(session, account, resumed)``. Raises unless the
|
|
66
|
+
"""Returns ``(session, account, resumed)``. Raises unless the platform confirms the agent.
|
|
67
|
+
|
|
68
|
+
This is the only production path that constructs the agent runtime. It requires a live
|
|
69
|
+
answer from the platform: a cached account (platform unreachable) is refused, so an
|
|
70
|
+
edited local cache can never start the runtime (and every model request is checked by
|
|
71
|
+
the platform again anyway)."""
|
|
66
72
|
account = cloud.require(AGENT, what="The HighhX AI developer agent")
|
|
73
|
+
if account.cached:
|
|
74
|
+
raise CloudError(
|
|
75
|
+
"The HighhX AI agent needs the HighhX platform, which cannot be reached right now.",
|
|
76
|
+
hint="Local HighhX commands keep working; try again when you are back online.",
|
|
77
|
+
)
|
|
67
78
|
settings = resolve_settings(app, account, overrides or {})
|
|
68
79
|
provider = build_provider(settings, cloud, account)
|
|
69
80
|
context = gather(app)
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"""Reading requests in the interactive session.
|
|
2
|
+
|
|
3
|
+
Line editing, ↑/↓ history (persisted across sessions), Ctrl+R search and redraw on
|
|
4
|
+
terminal resize come from the platform's readline (GNU readline or libedit). The
|
|
5
|
+
prompt's colour codes are wrapped in readline's ignore markers so wrapped long lines
|
|
6
|
+
and recalled history redraw cleanly.
|
|
7
|
+
|
|
8
|
+
Multi-line input: end a line with ``\\`` to continue it, or open a block with a line
|
|
9
|
+
containing only ``\"\"\"`` and close it the same way (for pasting logs or code).
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import contextlib
|
|
15
|
+
from collections.abc import Callable
|
|
16
|
+
|
|
17
|
+
from highhx.utils.paths import user_data_dir
|
|
18
|
+
|
|
19
|
+
HISTORY_FILE = "agent-input-history"
|
|
20
|
+
HISTORY_LENGTH = 1000
|
|
21
|
+
BLOCK = '"""'
|
|
22
|
+
PROMPT = "❯ " # noqa: RUF001
|
|
23
|
+
CONTINUATION = "… "
|
|
24
|
+
PROMPT_MARKUP = f"[bold magenta]{PROMPT}[/bold magenta]"
|
|
25
|
+
CONTINUATION_MARKUP = f"[dim]{CONTINUATION}[/dim]"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def setup_readline() -> Callable[[], None]:
|
|
29
|
+
"""Load the input history; returns a function that saves it."""
|
|
30
|
+
try:
|
|
31
|
+
import readline
|
|
32
|
+
except ImportError: # pragma: no cover - Windows without pyreadline
|
|
33
|
+
return lambda: None
|
|
34
|
+
path = user_data_dir() / HISTORY_FILE
|
|
35
|
+
with contextlib.suppress(OSError):
|
|
36
|
+
readline.read_history_file(str(path))
|
|
37
|
+
readline.set_history_length(HISTORY_LENGTH)
|
|
38
|
+
with contextlib.suppress(Exception): # libedit and GNU readline name the binding differently
|
|
39
|
+
readline.parse_and_bind("tab: complete")
|
|
40
|
+
|
|
41
|
+
def save() -> None:
|
|
42
|
+
with contextlib.suppress(OSError):
|
|
43
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
44
|
+
readline.write_history_file(str(path))
|
|
45
|
+
|
|
46
|
+
return save
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def ansi_prompt(text: str, sgr: str, *, color: bool) -> str:
|
|
50
|
+
"""``text`` coloured with SGR ``sgr``, with the escapes hidden from readline's width count."""
|
|
51
|
+
if not color:
|
|
52
|
+
return text
|
|
53
|
+
return f"\001\033[{sgr}m\002{text}\001\033[0m\002"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def read_request(read_line: Callable[[str], str], *, prompt: str, continuation: str) -> str:
|
|
57
|
+
"""One request: a line, ``\\``-continued lines, or a ``\"\"\"`` block. Raises EOFError / KeyboardInterrupt."""
|
|
58
|
+
first = read_line(prompt)
|
|
59
|
+
if first.strip() == BLOCK:
|
|
60
|
+
lines: list[str] = []
|
|
61
|
+
while True:
|
|
62
|
+
line = read_line(continuation)
|
|
63
|
+
if line.strip() == BLOCK:
|
|
64
|
+
return "\n".join(lines)
|
|
65
|
+
lines.append(line)
|
|
66
|
+
lines = [first]
|
|
67
|
+
while lines[-1].endswith("\\"):
|
|
68
|
+
lines[-1] = lines[-1][:-1]
|
|
69
|
+
lines.append(read_line(continuation))
|
|
70
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"""Start the interactive HighhX session — used by bare ``highhx`` and by ``highhx agent``.
|
|
2
|
+
|
|
3
|
+
One entry point, one UI. The account's capabilities decide whether the AI agent
|
|
4
|
+
session is attached (HighhX Pro) or requests are handled locally (HighhX Free); a
|
|
5
|
+
platform that is unreachable or refuses the agent leaves the local capabilities.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import dataclasses
|
|
11
|
+
from typing import TYPE_CHECKING, Any
|
|
12
|
+
|
|
13
|
+
from highhx.cloud import capabilities
|
|
14
|
+
from highhx.cloud.capabilities import LOCAL, Capability, Connection
|
|
15
|
+
from highhx.core.errors import CloudError, HighhXError, UsageError
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from highhx.agent.bootstrap import Resume
|
|
19
|
+
from highhx.agent.session import AgentSession
|
|
20
|
+
from highhx.cloud.account import Account
|
|
21
|
+
from highhx.commands import App
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def interactive_terminal(app: App) -> bool:
|
|
25
|
+
"""True when the interactive session may start: a terminal on both ends and no --json / --quiet."""
|
|
26
|
+
options = app.options
|
|
27
|
+
if options.json or options.quiet or not options.is_interactive():
|
|
28
|
+
return False
|
|
29
|
+
return bool(app.output.console.is_terminal)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def start_interactive(
|
|
33
|
+
app: App,
|
|
34
|
+
*,
|
|
35
|
+
first: str | None = None,
|
|
36
|
+
overrides: dict[str, Any] | None = None,
|
|
37
|
+
resume: Resume | None = None,
|
|
38
|
+
) -> int:
|
|
39
|
+
from highhx.agent.bootstrap import Resume, create_session
|
|
40
|
+
from highhx.agent.repl import AgentREPL
|
|
41
|
+
from highhx.agent.running import registered
|
|
42
|
+
from highhx.agent.ui import TerminalUI
|
|
43
|
+
|
|
44
|
+
if getattr(app, "interactive_session", False):
|
|
45
|
+
raise UsageError("You are already in the HighhX session.", hint="Type your request at the prompt.")
|
|
46
|
+
app.interactive_session = True # type: ignore[attr-defined]
|
|
47
|
+
out = app.output
|
|
48
|
+
cloud = app.cloud
|
|
49
|
+
ui = TerminalUI(out.console, out.symbols, interactive=True)
|
|
50
|
+
entitlements = capabilities.resolve(cloud)
|
|
51
|
+
|
|
52
|
+
def factory() -> tuple[AgentSession, Account, bool]:
|
|
53
|
+
return create_session(app, cloud, ui, overrides=overrides or {}, resume=Resume())
|
|
54
|
+
|
|
55
|
+
session: AgentSession | None = None
|
|
56
|
+
account: Account | None = entitlements.account
|
|
57
|
+
resumed = False
|
|
58
|
+
if entitlements.has(Capability.AI_AGENT):
|
|
59
|
+
try:
|
|
60
|
+
session, account, resumed = create_session(app, cloud, ui, overrides=overrides or {}, resume=resume)
|
|
61
|
+
except HighhXError as exc:
|
|
62
|
+
# The platform decides: when it refuses or cannot be reached (or the agent cannot be
|
|
63
|
+
# set up), the session starts with local capabilities instead of not at all.
|
|
64
|
+
problem = "HighhX platform unavailable." if isinstance(exc, CloudError) else exc.message
|
|
65
|
+
entitlements = dataclasses.replace(
|
|
66
|
+
entitlements,
|
|
67
|
+
capabilities=LOCAL,
|
|
68
|
+
connection=Connection.UNAVAILABLE,
|
|
69
|
+
problem=f"{problem} Local capabilities remain available.",
|
|
70
|
+
)
|
|
71
|
+
elif resume is not None and (resume.session_id or resume.latest):
|
|
72
|
+
ui.notice("info", "Saved agent sessions are part of HighhX Pro — starting a local session.")
|
|
73
|
+
repl = AgentREPL(session, ui, cloud, account, app=app, entitlements=entitlements, session_factory=factory)
|
|
74
|
+
session_id = session.record.id if session is not None and session.record else None
|
|
75
|
+
with registered(session_id, app.root):
|
|
76
|
+
return repl.run(first, resumed=resumed)
|
|
@@ -89,7 +89,7 @@ class PlatformProvider:
|
|
|
89
89
|
) from None
|
|
90
90
|
if resumes >= MAX_RESUMES or (cancel is not None and cancel.cancelled):
|
|
91
91
|
raise ModelProviderError(
|
|
92
|
-
f"Streaming from the HighhX platform failed: {exc.message}", retryable=True
|
|
92
|
+
f"Streaming from the HighhX platform failed: {exc.message}", retryable=True, connection=True
|
|
93
93
|
) from None
|
|
94
94
|
except _Gap as exc:
|
|
95
95
|
reason = str(exc)
|