vidbyte-cli 0.1.0__tar.gz → 0.2.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.
- {vidbyte_cli-0.1.0/src/vidbyte_cli.egg-info → vidbyte_cli-0.2.0}/PKG-INFO +23 -1
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/README.md +21 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/pyproject.toml +3 -1
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/login.py +15 -9
- vidbyte_cli-0.2.0/src/vidbyte_cli/commands/login_screens.py +118 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/login.py +13 -8
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/credentials.py +2 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/input.py +14 -5
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_input.py +15 -5
- vidbyte_cli-0.2.0/src/vidbyte_cli/lib/io/console.py +116 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/context.py +11 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/version.py +2 -2
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0/src/vidbyte_cli.egg-info}/PKG-INFO +23 -1
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/SOURCES.txt +2 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/requires.txt +1 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/LICENSE +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/setup.cfg +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/__main__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/cli.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agent_options.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/all_categories.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/approaches.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/avoid.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/blockers.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/capability.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/categories.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/category.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/completed.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/constraint.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/context.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/count.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/critic_model.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/decision.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/dry_run.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/extra_compute.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_accept.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_group.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_project.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_reason.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_reject.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_suggestion.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/files.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/forbidden.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/goal.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/handoff.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/horizon.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/hypotheses.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/idea.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/in_progress.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/input.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_messages.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_output_tokens.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_total_tokens.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/mistakes.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/outcomes.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_create.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_description.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_group.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_key.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_list.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_title.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/provider.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/question.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/risks.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/rounds.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/run.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/success.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/timeout.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/trajectory.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/view.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/view_all.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/render.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/request_builder.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggest.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_categories.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_feedback.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_handoff.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_projects.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/logout.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/whoami.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/confirm.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/group.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/idempotency_key.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/top_up.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/top_up.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/get.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/set.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/logout.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/whoami.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/add.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/options.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/render.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/resume.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/start.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/status.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/thread.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/threads.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/watch.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/adversarial_team.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/doctor.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/list.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/persistence.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/same_host_ensemble.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/stages.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/task_board.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/doctor.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/browser.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/star.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/star.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/client.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/auth.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/billing.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/research.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/runtime.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/problem.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/response.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/retry.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/runtime_payment.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/keyring_store.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_credentials.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_resolver.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_store.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_verifier.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/resolver.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/verifier.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/atomic.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/config.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/migration.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/models.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/paths.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/resolver.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/constants/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/constants/runtime.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/cli_error.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/codes.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/failures.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/handler.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/documents.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/store.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/attachments.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/codex_attachments.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/prompt.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/streams.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/terminal.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/formats.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/manager.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/models.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/application.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/options.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/executor.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/gate.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/hosts.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/planner.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/stages.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_checkpoints.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_tasks.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/verification.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/implementer_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/implementer_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/planner_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/planner_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/role_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/role_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_final_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_round_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/runner.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/sdk.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/service.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/settings.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/persistence_system.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/persistence_turn.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/runner.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/session.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/categories.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/context.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/extra_compute.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/handoff.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/message_tools.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/project.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/adjacent_opportunity.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/alternative.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/big_bets.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/bottleneck.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/business_growth.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/completion.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/continuation.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/coordination.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/creative_exploration.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/cross_domain.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/delegation.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/experiment.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/feedback.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/goal_clarification.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/immediate_next_steps.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/investigation.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/learning.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/leverage.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/long_term_directions.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/preparation.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/prerequisite.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/prioritization.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/product_experience.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/quick_wins.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/reframing.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/risk_prevention.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/simplification.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/stop_or_defer.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/strategy.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/technical_possibilities.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/verification.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/critic.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/critic_message.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/generator.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/library.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_generator_argument.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_generator_tool.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_parent_argument.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_parent_tool.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_receipt.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/revision.md +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/sdk.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/selection.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/service.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/__init__.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/api.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/attachments.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/ensemble.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/provider.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/research.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/runtime.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/suggestions.py +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/dependency_links.txt +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/entry_points.txt +0 -0
- {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vidbyte-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Vidbyte CLI: authentication, research threads, and configuration
|
|
5
5
|
Author-email: Vidbyte <hello@vidbyte.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -29,6 +29,7 @@ Requires-Dist: httpx<1,>=0.27
|
|
|
29
29
|
Requires-Dist: keyring<26,>=25.2
|
|
30
30
|
Requires-Dist: platformdirs<5,>=4.4
|
|
31
31
|
Requires-Dist: pydantic<3,>=2.6
|
|
32
|
+
Requires-Dist: rich<16,>=13.7
|
|
32
33
|
Requires-Dist: x402[evm]==2.8.0
|
|
33
34
|
Requires-Dist: vidbyte-sdk[codex]<0.3,>=0.2.0
|
|
34
35
|
Provides-Extra: codex
|
|
@@ -67,6 +68,19 @@ vidbyte-cli --help
|
|
|
67
68
|
|
|
68
69
|
The step-by-step guide lives at <https://vidbyte.pro/docs/cli/quickstart>.
|
|
69
70
|
|
|
71
|
+
## Log in
|
|
72
|
+
|
|
73
|
+
Create an API key at <https://vidbyte.pro/settings/api>, then run:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
vidbyte-cli login # guided: shows where to get a key, then a hidden prompt
|
|
77
|
+
printf '%s' "$VIDBYTE_KEY" | vidbyte-cli login --with-token # scripts and CI: no prompt, no styling
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The interactive prompt is styled with [Rich](https://github.com/Textualize/rich) and written
|
|
81
|
+
to stderr, so stdout still carries only the one result line. `--color never`, `NO_COLOR`, and
|
|
82
|
+
`TERM=dumb` keep it plain. `vidbyte-cli provider login <provider>` follows the same pattern.
|
|
83
|
+
|
|
70
84
|
If the CLI is useful to you, star it on GitHub from your terminal:
|
|
71
85
|
|
|
72
86
|
```bash
|
|
@@ -314,6 +328,14 @@ The canonical gate runs Ruff lint/format checks, strict mypy, byte compilation,
|
|
|
314
328
|
command smoke checks, sdist/wheel build, Twine metadata validation, and an installed-wheel
|
|
315
329
|
smoke check. GitHub Actions invokes the same script on Linux, Windows, and macOS.
|
|
316
330
|
|
|
331
|
+
## Releasing
|
|
332
|
+
|
|
333
|
+
Bump `version` in `pyproject.toml` in a pull request. When it merges, the
|
|
334
|
+
`tag-release.yml` workflow sees a version with no `v{version}` tag and no PyPI release,
|
|
335
|
+
creates the tag, and dispatches `release.yml`, which runs the gate above and publishes to
|
|
336
|
+
PyPI through trusted publishing. Merges that leave the version alone release nothing.
|
|
337
|
+
PyPI versions are permanent, so treat a version bump as the release decision.
|
|
338
|
+
|
|
317
339
|
## Runtime admission payments
|
|
318
340
|
|
|
319
341
|
`vidbyte-cli runtime persistence "your task"` uses your authenticated Vidbyte API
|
|
@@ -25,6 +25,19 @@ vidbyte-cli --help
|
|
|
25
25
|
|
|
26
26
|
The step-by-step guide lives at <https://vidbyte.pro/docs/cli/quickstart>.
|
|
27
27
|
|
|
28
|
+
## Log in
|
|
29
|
+
|
|
30
|
+
Create an API key at <https://vidbyte.pro/settings/api>, then run:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
vidbyte-cli login # guided: shows where to get a key, then a hidden prompt
|
|
34
|
+
printf '%s' "$VIDBYTE_KEY" | vidbyte-cli login --with-token # scripts and CI: no prompt, no styling
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The interactive prompt is styled with [Rich](https://github.com/Textualize/rich) and written
|
|
38
|
+
to stderr, so stdout still carries only the one result line. `--color never`, `NO_COLOR`, and
|
|
39
|
+
`TERM=dumb` keep it plain. `vidbyte-cli provider login <provider>` follows the same pattern.
|
|
40
|
+
|
|
28
41
|
If the CLI is useful to you, star it on GitHub from your terminal:
|
|
29
42
|
|
|
30
43
|
```bash
|
|
@@ -272,6 +285,14 @@ The canonical gate runs Ruff lint/format checks, strict mypy, byte compilation,
|
|
|
272
285
|
command smoke checks, sdist/wheel build, Twine metadata validation, and an installed-wheel
|
|
273
286
|
smoke check. GitHub Actions invokes the same script on Linux, Windows, and macOS.
|
|
274
287
|
|
|
288
|
+
## Releasing
|
|
289
|
+
|
|
290
|
+
Bump `version` in `pyproject.toml` in a pull request. When it merges, the
|
|
291
|
+
`tag-release.yml` workflow sees a version with no `v{version}` tag and no PyPI release,
|
|
292
|
+
creates the tag, and dispatches `release.yml`, which runs the gate above and publishes to
|
|
293
|
+
PyPI through trusted publishing. Merges that leave the version alone release nothing.
|
|
294
|
+
PyPI versions are permanent, so treat a version bump as the release decision.
|
|
295
|
+
|
|
275
296
|
## Runtime admission payments
|
|
276
297
|
|
|
277
298
|
`vidbyte-cli runtime persistence "your task"` uses your authenticated Vidbyte API
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vidbyte-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "Vidbyte CLI: authentication, research threads, and configuration"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -36,6 +36,8 @@ dependencies = [
|
|
|
36
36
|
"keyring>=25.2,<26",
|
|
37
37
|
"platformdirs>=4.4,<5",
|
|
38
38
|
"pydantic>=2.6,<3",
|
|
39
|
+
# Styles the interactive login prompts; everything it renders goes to stderr.
|
|
40
|
+
"rich>=13.7,<16",
|
|
39
41
|
"x402[evm]==2.8.0",
|
|
40
42
|
# The Codex integration first shipped in 0.2.0. The SDK is alpha and may change APIs between
|
|
41
43
|
# minor versions, so stay within 0.2.x until a newer minor is verified against this CLI.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"""`vidbyte-cli login` — stores the user's Vidbyte API key for later commands.
|
|
2
2
|
|
|
3
3
|
There is no `--api-key` option: a secret in argv leaks into `ps`, shell history, and CI
|
|
4
|
-
logs. `--with-token` reads bounded stdin; anything else uses a hidden prompt
|
|
4
|
+
logs. `--with-token` reads bounded stdin; anything else uses a hidden prompt, preceded by a
|
|
5
|
+
Rich card that says where keys are created (see `commands/login_screens.py`).
|
|
5
6
|
"""
|
|
6
7
|
|
|
7
8
|
from __future__ import annotations
|
|
@@ -43,12 +44,19 @@ class LoginCommand:
|
|
|
43
44
|
with_token: bool,
|
|
44
45
|
allow_file_fallback: bool,
|
|
45
46
|
) -> None:
|
|
47
|
+
# Deferred so building the command tree never loads Rich; see login_screens.
|
|
48
|
+
from ..login_screens import vidbyte_login_guide, vidbyte_login_next_steps
|
|
49
|
+
|
|
46
50
|
config = context.resolved_config()
|
|
51
|
+
console = context.console()
|
|
47
52
|
credentials = CredentialInput(
|
|
48
53
|
context.streams,
|
|
49
54
|
context.output().terminal,
|
|
50
55
|
no_input=context.options.no_input,
|
|
51
|
-
|
|
56
|
+
console=console,
|
|
57
|
+
).read(from_stdin=with_token, guide=lambda: vidbyte_login_guide(console, config))
|
|
58
|
+
if not with_token:
|
|
59
|
+
console.note("Checking the key with Vidbyte...")
|
|
52
60
|
# Verify-before-persist. Syntactic checks cannot prove a key authenticates, and this
|
|
53
61
|
# call sits immediately before the only write so a reordering is obvious in review.
|
|
54
62
|
context.credential_verifier().verify(credentials, config)
|
|
@@ -77,6 +85,8 @@ class LoginCommand:
|
|
|
77
85
|
),
|
|
78
86
|
f"Authenticated profile '{config.profile}' using {storage.value}.",
|
|
79
87
|
)
|
|
88
|
+
if not with_token:
|
|
89
|
+
vidbyte_login_next_steps(console)
|
|
80
90
|
|
|
81
91
|
def _fallback_consent(
|
|
82
92
|
self,
|
|
@@ -91,10 +101,6 @@ class LoginCommand:
|
|
|
91
101
|
return True
|
|
92
102
|
if context.options.no_input or not context.output().terminal.interactive:
|
|
93
103
|
raise FileFallbackNotApproved()
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
default=False,
|
|
98
|
-
err=True,
|
|
99
|
-
)
|
|
100
|
-
)
|
|
104
|
+
from ..login_screens import file_fallback_consent
|
|
105
|
+
|
|
106
|
+
return file_fallback_consent(context.console(), "key")
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"""The Rich screens `login` and `provider login` show a person before and after a key prompt.
|
|
2
|
+
|
|
3
|
+
Only these two commands talk to a person interactively, so their copy lives together here.
|
|
4
|
+
Both import this module inside the method that needs it: every command module is imported
|
|
5
|
+
when the command tree is built, and only these paths should pay for loading Rich.
|
|
6
|
+
|
|
7
|
+
Everything rendered here goes to stderr through `HumanConsole`; stdout keeps its one result.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from rich.markup import escape
|
|
13
|
+
|
|
14
|
+
from ..lib.auth.credentials import LIVE_API_KEY_PREFIX, VIDBYTE_API_KEY_SETTINGS_URL
|
|
15
|
+
from ..lib.config import ResolvedConfig
|
|
16
|
+
from ..lib.io.console import (
|
|
17
|
+
CardTone,
|
|
18
|
+
HumanConsole,
|
|
19
|
+
bullet_list,
|
|
20
|
+
link,
|
|
21
|
+
numbered_steps,
|
|
22
|
+
subheading,
|
|
23
|
+
)
|
|
24
|
+
from ..types.provider import PROVIDER_ENV_VARS, PROVIDER_KEY_PREFIXES, Provider
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def vidbyte_login_guide(console: HumanConsole, config: ResolvedConfig) -> None:
|
|
28
|
+
# Shown right before the hidden prompt, and only on the interactive path.
|
|
29
|
+
console.card(
|
|
30
|
+
"Log in to Vidbyte",
|
|
31
|
+
[
|
|
32
|
+
"Connect this terminal to your Vidbyte account with an API key.",
|
|
33
|
+
"",
|
|
34
|
+
subheading("How to get a key"),
|
|
35
|
+
numbered_steps(
|
|
36
|
+
[
|
|
37
|
+
f"Register an API key on this URL:\n{link(VIDBYTE_API_KEY_SETTINGS_URL)}",
|
|
38
|
+
f"Copy the key. It starts with [bold]{LIVE_API_KEY_PREFIX}[/].",
|
|
39
|
+
"Enter the API key below. Typing stays hidden.",
|
|
40
|
+
]
|
|
41
|
+
),
|
|
42
|
+
],
|
|
43
|
+
)
|
|
44
|
+
console.note(f"Profile: {escape(config.profile)} | API: {escape(config.api_url)}")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def vidbyte_login_next_steps(console: HumanConsole) -> None:
|
|
48
|
+
# The commands a newly logged-in person most often runs next.
|
|
49
|
+
console.card(
|
|
50
|
+
"You're logged in",
|
|
51
|
+
[
|
|
52
|
+
subheading("Next steps"),
|
|
53
|
+
bullet_list(
|
|
54
|
+
[
|
|
55
|
+
"[bold]vidbyte-cli whoami[/] confirm which account this key belongs to",
|
|
56
|
+
'[bold]vidbyte-cli research start "your question"[/] open a thread',
|
|
57
|
+
"[bold]vidbyte-cli logout[/] remove the stored key",
|
|
58
|
+
]
|
|
59
|
+
),
|
|
60
|
+
],
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def provider_login_guide(console: HumanConsole, provider: Provider, profile: str) -> None:
|
|
65
|
+
# No vendor dashboard links: seven providers' URLs would drift, and a wrong link misleads.
|
|
66
|
+
name = escape(provider.value)
|
|
67
|
+
prefixes = PROVIDER_KEY_PREFIXES.get(provider, ())
|
|
68
|
+
shape = (
|
|
69
|
+
f"Copy the key. It starts with [bold]{escape(' or '.join(prefixes))}[/]."
|
|
70
|
+
if prefixes
|
|
71
|
+
else "Copy the key."
|
|
72
|
+
)
|
|
73
|
+
console.card(
|
|
74
|
+
f"Connect your {provider.value} key",
|
|
75
|
+
[
|
|
76
|
+
f"Runtime agents call {name} with your own key, so {name} bills that usage to you.",
|
|
77
|
+
"",
|
|
78
|
+
subheading("How to get a key"),
|
|
79
|
+
numbered_steps(
|
|
80
|
+
[
|
|
81
|
+
f"Create an API key in your {name} account dashboard.",
|
|
82
|
+
shape,
|
|
83
|
+
"Enter the API key below. Typing stays hidden.",
|
|
84
|
+
]
|
|
85
|
+
),
|
|
86
|
+
"",
|
|
87
|
+
subheading("Good to know"),
|
|
88
|
+
bullet_list(
|
|
89
|
+
[
|
|
90
|
+
f"The key is checked with {name} before anything is saved.",
|
|
91
|
+
f"[bold]{escape(PROVIDER_ENV_VARS[provider])}[/] in the environment "
|
|
92
|
+
"overrides the stored key.",
|
|
93
|
+
]
|
|
94
|
+
),
|
|
95
|
+
],
|
|
96
|
+
)
|
|
97
|
+
console.note(f"Profile: {escape(profile)}")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def file_fallback_consent(console: HumanConsole, noun: str) -> bool:
|
|
101
|
+
# Explains what the restricted file does and does not protect, then asks; default no.
|
|
102
|
+
console.card(
|
|
103
|
+
"No OS keyring available",
|
|
104
|
+
[
|
|
105
|
+
f"This system has no keyring to hold the {noun} securely.",
|
|
106
|
+
"",
|
|
107
|
+
subheading("The alternative"),
|
|
108
|
+
bullet_list(
|
|
109
|
+
[
|
|
110
|
+
f"Store the {noun} in a local file only your user account can read.",
|
|
111
|
+
"Any program running as you can still read that file.",
|
|
112
|
+
"Answer no to cancel; nothing is stored.",
|
|
113
|
+
]
|
|
114
|
+
),
|
|
115
|
+
],
|
|
116
|
+
tone=CardTone.WARNING,
|
|
117
|
+
)
|
|
118
|
+
return console.confirm(f"Store the {noun} in a restricted local file?")
|
|
@@ -47,15 +47,24 @@ class ProviderLoginCommand:
|
|
|
47
47
|
with_token: bool,
|
|
48
48
|
allow_file_fallback: bool,
|
|
49
49
|
) -> None:
|
|
50
|
+
from ..login_screens import provider_login_guide
|
|
51
|
+
|
|
50
52
|
# Verify-before-persist so a bad key never reaches storage.
|
|
51
53
|
config = context.resolved_config()
|
|
52
54
|
typed = Provider(provider)
|
|
55
|
+
console = context.console()
|
|
53
56
|
credentials = ProviderCredentialInput(
|
|
54
57
|
context.streams,
|
|
55
58
|
context.output().terminal,
|
|
56
59
|
no_input=context.options.no_input,
|
|
57
60
|
provider=typed,
|
|
58
|
-
|
|
61
|
+
console=console,
|
|
62
|
+
).read(
|
|
63
|
+
from_stdin=with_token,
|
|
64
|
+
guide=lambda: provider_login_guide(console, typed, config.profile),
|
|
65
|
+
)
|
|
66
|
+
if not with_token:
|
|
67
|
+
console.note(f"Checking the key with {typed.value}...")
|
|
59
68
|
context.provider_verifier(typed).verify(credentials)
|
|
60
69
|
fallback_allowed = self._fallback_consent(context, allow_file_fallback)
|
|
61
70
|
context.migration().migrate_if_needed()
|
|
@@ -93,10 +102,6 @@ class ProviderLoginCommand:
|
|
|
93
102
|
return True
|
|
94
103
|
if context.options.no_input or not context.output().terminal.interactive:
|
|
95
104
|
raise FileFallbackNotApprovedForProvider(typed_name="provider")
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
default=False,
|
|
100
|
-
err=True,
|
|
101
|
-
)
|
|
102
|
-
)
|
|
105
|
+
from ..login_screens import file_fallback_consent
|
|
106
|
+
|
|
107
|
+
return file_fallback_consent(context.console(), "provider key")
|
|
@@ -34,6 +34,8 @@ _MAX_KEY_CHARACTERS = 4096
|
|
|
34
34
|
# The only prefix the backend gatekeeper extracts. A key without it yields no candidate at
|
|
35
35
|
# all, so the request is not rejected as malformed — it is treated as unauthenticated.
|
|
36
36
|
LIVE_API_KEY_PREFIX = "vb_live_"
|
|
37
|
+
# The website page where a signed-in user creates and revokes these keys; `login` points at it.
|
|
38
|
+
VIDBYTE_API_KEY_SETTINGS_URL = "https://vidbyte.pro/settings/api"
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
class Credentials(BaseModel):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""The two channels a login token may arrive on: a hidden prompt, or explicit stdin.
|
|
1
|
+
"""The two channels a login token may arrive on: a guided hidden prompt, or explicit stdin.
|
|
2
2
|
|
|
3
3
|
There is deliberately no `--api-key` option. An argv secret is visible in `ps`, the shell
|
|
4
4
|
history file, and any CI log that echoes its command line, and no amount of care at the
|
|
@@ -11,7 +11,8 @@ The environment is absent on purpose: login persists only what a person explicit
|
|
|
11
11
|
|
|
12
12
|
from __future__ import annotations
|
|
13
13
|
|
|
14
|
-
import
|
|
14
|
+
from collections.abc import Callable
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
15
16
|
|
|
16
17
|
from ..errors.failures import (
|
|
17
18
|
ApiKeyNotLiveFormat,
|
|
@@ -22,6 +23,9 @@ from ..io import IOStreams
|
|
|
22
23
|
from ..io.terminal import TerminalCapabilities
|
|
23
24
|
from .credentials import Credentials
|
|
24
25
|
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from ..io.console import HumanConsole
|
|
28
|
+
|
|
25
29
|
_MAX_TOKEN_CHARACTERS = 4096
|
|
26
30
|
|
|
27
31
|
|
|
@@ -34,12 +38,14 @@ class CredentialInput:
|
|
|
34
38
|
terminal: TerminalCapabilities,
|
|
35
39
|
*,
|
|
36
40
|
no_input: bool,
|
|
41
|
+
console: HumanConsole,
|
|
37
42
|
) -> None:
|
|
38
43
|
self._streams = streams
|
|
39
44
|
self._terminal = terminal
|
|
40
45
|
self._no_input = no_input
|
|
46
|
+
self._console = console
|
|
41
47
|
|
|
42
|
-
def read(self, *, from_stdin: bool) -> Credentials:
|
|
48
|
+
def read(self, *, from_stdin: bool, guide: Callable[[], None] | None = None) -> Credentials:
|
|
43
49
|
if from_stdin:
|
|
44
50
|
# One past the bound, so an oversized stream is rejected rather than truncated
|
|
45
51
|
# into a token that looks plausible.
|
|
@@ -47,8 +53,11 @@ class CredentialInput:
|
|
|
47
53
|
else:
|
|
48
54
|
if self._no_input or not self._terminal.interactive:
|
|
49
55
|
raise NoninteractiveLoginRequiresToken()
|
|
50
|
-
# The
|
|
51
|
-
|
|
56
|
+
# The guide runs only after the terminal check, so it never precedes a refusal.
|
|
57
|
+
if guide is not None:
|
|
58
|
+
guide()
|
|
59
|
+
# The console writes to stderr so `login` stays usable inside a pipeline.
|
|
60
|
+
value = self._console.secret("Enter key:")
|
|
52
61
|
token = value.strip()
|
|
53
62
|
if not token or len(token) > _MAX_TOKEN_CHARACTERS:
|
|
54
63
|
raise InvalidApiKeyInput()
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
"""Acquisition of provider tokens via hidden prompt or stdin.
|
|
1
|
+
"""Acquisition of provider tokens via a guided hidden prompt or stdin.
|
|
2
2
|
|
|
3
3
|
Mirrors CredentialInput but parameterizes by provider so prefix checks are exact.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from __future__ import annotations
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
from collections.abc import Callable
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
9
10
|
|
|
10
11
|
from ...types.provider import Provider
|
|
11
12
|
from ..errors.failures import (
|
|
@@ -17,6 +18,9 @@ from ..io import IOStreams
|
|
|
17
18
|
from ..io.terminal import TerminalCapabilities
|
|
18
19
|
from .provider_credentials import ProviderCredentials
|
|
19
20
|
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from ..io.console import HumanConsole
|
|
23
|
+
|
|
20
24
|
_MAX_TOKEN_CHARACTERS = 4096
|
|
21
25
|
|
|
22
26
|
|
|
@@ -30,22 +34,28 @@ class ProviderCredentialInput:
|
|
|
30
34
|
*,
|
|
31
35
|
no_input: bool,
|
|
32
36
|
provider: Provider,
|
|
37
|
+
console: HumanConsole,
|
|
33
38
|
) -> None:
|
|
34
39
|
# No_input and provider are fixed per command construction.
|
|
35
40
|
self._streams = streams
|
|
36
41
|
self._terminal = terminal
|
|
37
42
|
self._no_input = no_input
|
|
38
43
|
self._provider = provider
|
|
44
|
+
self._console = console
|
|
39
45
|
|
|
40
|
-
def read(
|
|
46
|
+
def read(
|
|
47
|
+
self, *, from_stdin: bool, guide: Callable[[], None] | None = None
|
|
48
|
+
) -> ProviderCredentials:
|
|
41
49
|
# Bounded read, then prefix check, so an accidental file redirect fails clearly.
|
|
42
50
|
if from_stdin:
|
|
43
51
|
value = self._streams.stdin.read(_MAX_TOKEN_CHARACTERS + 1)
|
|
44
52
|
else:
|
|
45
53
|
if self._no_input or not self._terminal.interactive:
|
|
46
54
|
raise NoninteractiveProviderLoginRequiresToken(self._provider.value)
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
# The guide runs only after the terminal check, so it never precedes a refusal.
|
|
56
|
+
if guide is not None:
|
|
57
|
+
guide()
|
|
58
|
+
value = self._console.secret(f"Enter {self._provider.value} key:")
|
|
49
59
|
token = value.strip()
|
|
50
60
|
if not token or len(token) > _MAX_TOKEN_CHARACTERS:
|
|
51
61
|
raise InvalidProviderApiKeyInput(self._provider.value)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Rich-styled conversation with a person at a terminal: cards, notes, hidden input, consent.
|
|
2
|
+
|
|
3
|
+
Everything here writes to stderr. Stdout carries results only, and a prompt is not a result,
|
|
4
|
+
so a command that talks to a person stays usable inside a pipeline.
|
|
5
|
+
|
|
6
|
+
Styling follows the invocation's `TerminalCapabilities` rather than Rich's own detection, so
|
|
7
|
+
`--color never`, `NO_COLOR`, `TERM=dumb`, and a redirected stderr keep producing plain text
|
|
8
|
+
exactly as every other code path promises. Product copy belongs to the commands; this module
|
|
9
|
+
only knows how to lay it out.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import getpass
|
|
15
|
+
from collections.abc import Sequence
|
|
16
|
+
from enum import StrEnum
|
|
17
|
+
|
|
18
|
+
from rich.console import Console, Group, RenderableType
|
|
19
|
+
from rich.markup import escape
|
|
20
|
+
from rich.panel import Panel
|
|
21
|
+
from rich.table import Table
|
|
22
|
+
|
|
23
|
+
from .streams import IOStreams
|
|
24
|
+
from .terminal import TerminalCapabilities
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class CardTone(StrEnum):
|
|
28
|
+
"""The two moods a card can carry; each maps to one border color."""
|
|
29
|
+
|
|
30
|
+
INFO = "info"
|
|
31
|
+
WARNING = "warning"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
_BORDER_STYLES = {CardTone.INFO: "cyan", CardTone.WARNING: "yellow"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class HumanConsole:
|
|
38
|
+
"""A stderr-bound Rich console that respects one invocation's terminal capabilities."""
|
|
39
|
+
|
|
40
|
+
def __init__(self, streams: IOStreams, terminal: TerminalCapabilities) -> None:
|
|
41
|
+
self._streams = streams
|
|
42
|
+
# `no_color` alone still lets bold and underline through, so a terminal without color
|
|
43
|
+
# is also not a terminal to Rich: it then writes no escape sequence at all.
|
|
44
|
+
# Highlighting and emoji are off so a URL or a profile name renders exactly as given.
|
|
45
|
+
self._console = Console(
|
|
46
|
+
file=streams.stderr,
|
|
47
|
+
force_terminal=terminal.color,
|
|
48
|
+
no_color=not terminal.color,
|
|
49
|
+
highlight=False,
|
|
50
|
+
emoji=False,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
def card(
|
|
54
|
+
self,
|
|
55
|
+
title: str,
|
|
56
|
+
parts: Sequence[RenderableType],
|
|
57
|
+
*,
|
|
58
|
+
tone: CardTone = CardTone.INFO,
|
|
59
|
+
) -> None:
|
|
60
|
+
# Unexpanded, so a short card does not stretch across a wide terminal.
|
|
61
|
+
self._console.print(
|
|
62
|
+
Panel(
|
|
63
|
+
Group(*parts),
|
|
64
|
+
title=f"[bold]{escape(title)}[/]",
|
|
65
|
+
title_align="left",
|
|
66
|
+
border_style=_BORDER_STYLES[tone],
|
|
67
|
+
padding=(1, 2),
|
|
68
|
+
expand=False,
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
def note(self, message: str) -> None:
|
|
73
|
+
# Secondary context such as which profile is being written; callers escape values.
|
|
74
|
+
self._console.print(f"[dim]{message}[/]")
|
|
75
|
+
|
|
76
|
+
def secret(self, label: str) -> str:
|
|
77
|
+
# The label is styled by Rich; the read stays getpass so the key is never echoed.
|
|
78
|
+
self._console.print(f"[bold]{escape(label)}[/] ", end="")
|
|
79
|
+
return getpass.getpass("", stream=self._streams.stderr)
|
|
80
|
+
|
|
81
|
+
def confirm(self, question: str) -> bool:
|
|
82
|
+
# Only an explicit yes consents: a blank line, EOF, or anything else means no.
|
|
83
|
+
self._console.print(f"[bold]{escape(question)}[/] [dim]\\[y/N][/] ", end="")
|
|
84
|
+
answer = self._streams.stdin.readline()
|
|
85
|
+
return answer.strip().lower() in {"y", "yes"}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def subheading(text: str) -> str:
|
|
89
|
+
# Markup for a bold section label inside a card.
|
|
90
|
+
return f"[bold]{escape(text)}[/]"
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def numbered_steps(steps: Sequence[RenderableType]) -> Table:
|
|
94
|
+
# A two-column grid gives each step a hanging indent when its text wraps.
|
|
95
|
+
grid = Table.grid(padding=(0, 1))
|
|
96
|
+
grid.add_column(style="bold cyan", no_wrap=True)
|
|
97
|
+
grid.add_column()
|
|
98
|
+
for index, step in enumerate(steps, start=1):
|
|
99
|
+
grid.add_row(f"{index}.", step)
|
|
100
|
+
return grid
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def bullet_list(items: Sequence[RenderableType]) -> Table:
|
|
104
|
+
# Same hanging-indent layout as numbered_steps, for unordered items.
|
|
105
|
+
grid = Table.grid(padding=(0, 1))
|
|
106
|
+
grid.add_column(style="cyan", no_wrap=True)
|
|
107
|
+
grid.add_column()
|
|
108
|
+
for item in items:
|
|
109
|
+
grid.add_row("-", item)
|
|
110
|
+
return grid
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def link(url: str) -> str:
|
|
114
|
+
# The URL is always printed as text; OSC 8 terminals additionally make it clickable.
|
|
115
|
+
safe = escape(url)
|
|
116
|
+
return f"[link={safe}][underline cyan]{safe}[/][/link]"
|
|
@@ -16,6 +16,7 @@ from __future__ import annotations
|
|
|
16
16
|
import os
|
|
17
17
|
from collections.abc import Callable, Mapping
|
|
18
18
|
from dataclasses import dataclass
|
|
19
|
+
from typing import TYPE_CHECKING
|
|
19
20
|
|
|
20
21
|
from ...types.provider import Provider
|
|
21
22
|
from ..api.client import ApiClient
|
|
@@ -44,6 +45,9 @@ from ..output.formats import ColorMode, OutputFormat
|
|
|
44
45
|
from ..output.manager import OutputManager, OutputPolicy
|
|
45
46
|
from ..runtime_primitives import RuntimeExecutor, RuntimeHostRegistry, RuntimeLaunchPlanner
|
|
46
47
|
|
|
48
|
+
if TYPE_CHECKING:
|
|
49
|
+
from ..io.console import HumanConsole
|
|
50
|
+
|
|
47
51
|
|
|
48
52
|
@dataclass(frozen=True)
|
|
49
53
|
class InvocationOptions:
|
|
@@ -212,6 +216,13 @@ class ApplicationContext:
|
|
|
212
216
|
# Callers share one policy object so stdout cardinality stays enforceable.
|
|
213
217
|
return self._output
|
|
214
218
|
|
|
219
|
+
def console(self) -> HumanConsole:
|
|
220
|
+
# Built per call from the output policy's terminal, so it follows any reconfigure.
|
|
221
|
+
# Imported here so only the commands that talk to a person pay for loading Rich.
|
|
222
|
+
from ..io.console import HumanConsole as _HumanConsole
|
|
223
|
+
|
|
224
|
+
return _HumanConsole(self.streams, self._output.terminal)
|
|
225
|
+
|
|
215
226
|
def provider_store(self) -> ProviderCredentialStore:
|
|
216
227
|
# Lazily created so --help never opens the keyring.
|
|
217
228
|
if self._provider_store is None:
|
|
@@ -10,8 +10,8 @@ from __future__ import annotations
|
|
|
10
10
|
from importlib.metadata import PackageNotFoundError, version
|
|
11
11
|
|
|
12
12
|
_DISTRIBUTION_NAME = "vidbyte-cli"
|
|
13
|
-
# Deliberately not "0.
|
|
14
|
-
_SOURCE_TREE_VERSION = "0.
|
|
13
|
+
# Deliberately not "0.2.0": a source tree must not claim to be the released version.
|
|
14
|
+
_SOURCE_TREE_VERSION = "0.2.0.dev0"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class VersionProvider:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vidbyte-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Vidbyte CLI: authentication, research threads, and configuration
|
|
5
5
|
Author-email: Vidbyte <hello@vidbyte.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -29,6 +29,7 @@ Requires-Dist: httpx<1,>=0.27
|
|
|
29
29
|
Requires-Dist: keyring<26,>=25.2
|
|
30
30
|
Requires-Dist: platformdirs<5,>=4.4
|
|
31
31
|
Requires-Dist: pydantic<3,>=2.6
|
|
32
|
+
Requires-Dist: rich<16,>=13.7
|
|
32
33
|
Requires-Dist: x402[evm]==2.8.0
|
|
33
34
|
Requires-Dist: vidbyte-sdk[codex]<0.3,>=0.2.0
|
|
34
35
|
Provides-Extra: codex
|
|
@@ -67,6 +68,19 @@ vidbyte-cli --help
|
|
|
67
68
|
|
|
68
69
|
The step-by-step guide lives at <https://vidbyte.pro/docs/cli/quickstart>.
|
|
69
70
|
|
|
71
|
+
## Log in
|
|
72
|
+
|
|
73
|
+
Create an API key at <https://vidbyte.pro/settings/api>, then run:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
vidbyte-cli login # guided: shows where to get a key, then a hidden prompt
|
|
77
|
+
printf '%s' "$VIDBYTE_KEY" | vidbyte-cli login --with-token # scripts and CI: no prompt, no styling
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The interactive prompt is styled with [Rich](https://github.com/Textualize/rich) and written
|
|
81
|
+
to stderr, so stdout still carries only the one result line. `--color never`, `NO_COLOR`, and
|
|
82
|
+
`TERM=dumb` keep it plain. `vidbyte-cli provider login <provider>` follows the same pattern.
|
|
83
|
+
|
|
70
84
|
If the CLI is useful to you, star it on GitHub from your terminal:
|
|
71
85
|
|
|
72
86
|
```bash
|
|
@@ -314,6 +328,14 @@ The canonical gate runs Ruff lint/format checks, strict mypy, byte compilation,
|
|
|
314
328
|
command smoke checks, sdist/wheel build, Twine metadata validation, and an installed-wheel
|
|
315
329
|
smoke check. GitHub Actions invokes the same script on Linux, Windows, and macOS.
|
|
316
330
|
|
|
331
|
+
## Releasing
|
|
332
|
+
|
|
333
|
+
Bump `version` in `pyproject.toml` in a pull request. When it merges, the
|
|
334
|
+
`tag-release.yml` workflow sees a version with no `v{version}` tag and no PyPI release,
|
|
335
|
+
creates the tag, and dispatches `release.yml`, which runs the gate above and publishes to
|
|
336
|
+
PyPI through trusted publishing. Merges that leave the version alone release nothing.
|
|
337
|
+
PyPI versions are permanent, so treat a version bump as the release decision.
|
|
338
|
+
|
|
317
339
|
## Runtime admission payments
|
|
318
340
|
|
|
319
341
|
`vidbyte-cli runtime persistence "your task"` uses your authenticated Vidbyte API
|
|
@@ -12,6 +12,7 @@ src/vidbyte_cli.egg-info/requires.txt
|
|
|
12
12
|
src/vidbyte_cli.egg-info/top_level.txt
|
|
13
13
|
src/vidbyte_cli/commands/__init__.py
|
|
14
14
|
src/vidbyte_cli/commands/agent_options.py
|
|
15
|
+
src/vidbyte_cli/commands/login_screens.py
|
|
15
16
|
src/vidbyte_cli/commands/agents/__init__.py
|
|
16
17
|
src/vidbyte_cli/commands/agents/suggestion/__init__.py
|
|
17
18
|
src/vidbyte_cli/commands/agents/suggestion/render.py
|
|
@@ -162,6 +163,7 @@ src/vidbyte_cli/lib/files/store.py
|
|
|
162
163
|
src/vidbyte_cli/lib/io/__init__.py
|
|
163
164
|
src/vidbyte_cli/lib/io/attachments.py
|
|
164
165
|
src/vidbyte_cli/lib/io/codex_attachments.py
|
|
166
|
+
src/vidbyte_cli/lib/io/console.py
|
|
165
167
|
src/vidbyte_cli/lib/io/prompt.py
|
|
166
168
|
src/vidbyte_cli/lib/io/streams.py
|
|
167
169
|
src/vidbyte_cli/lib/io/terminal.py
|