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.
Files changed (276) hide show
  1. {vidbyte_cli-0.1.0/src/vidbyte_cli.egg-info → vidbyte_cli-0.2.0}/PKG-INFO +23 -1
  2. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/README.md +21 -0
  3. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/pyproject.toml +3 -1
  4. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/login.py +15 -9
  5. vidbyte_cli-0.2.0/src/vidbyte_cli/commands/login_screens.py +118 -0
  6. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/login.py +13 -8
  7. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/credentials.py +2 -0
  8. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/input.py +14 -5
  9. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_input.py +15 -5
  10. vidbyte_cli-0.2.0/src/vidbyte_cli/lib/io/console.py +116 -0
  11. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/context.py +11 -0
  12. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/version.py +2 -2
  13. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0/src/vidbyte_cli.egg-info}/PKG-INFO +23 -1
  14. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/SOURCES.txt +2 -0
  15. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/requires.txt +1 -0
  16. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/LICENSE +0 -0
  17. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/setup.cfg +0 -0
  18. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/__init__.py +0 -0
  19. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/__main__.py +0 -0
  20. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/cli.py +0 -0
  21. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/__init__.py +0 -0
  22. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agent_options.py +0 -0
  23. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/__init__.py +0 -0
  24. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/__init__.py +0 -0
  25. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/__init__.py +0 -0
  26. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/all_categories.md +0 -0
  27. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/approaches.md +0 -0
  28. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/avoid.md +0 -0
  29. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/blockers.md +0 -0
  30. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/capability.md +0 -0
  31. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/categories.md +0 -0
  32. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/category.md +0 -0
  33. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/completed.md +0 -0
  34. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/constraint.md +0 -0
  35. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/context.md +0 -0
  36. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/count.md +0 -0
  37. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/critic_model.md +0 -0
  38. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/decision.md +0 -0
  39. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/dry_run.md +0 -0
  40. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/extra_compute.md +0 -0
  41. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_accept.md +0 -0
  42. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_group.md +0 -0
  43. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_project.md +0 -0
  44. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_reason.md +0 -0
  45. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_reject.md +0 -0
  46. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/feedback_suggestion.md +0 -0
  47. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/files.md +0 -0
  48. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/forbidden.md +0 -0
  49. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/goal.md +0 -0
  50. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/handoff.md +0 -0
  51. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/horizon.md +0 -0
  52. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/hypotheses.md +0 -0
  53. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/idea.md +0 -0
  54. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/in_progress.md +0 -0
  55. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/input.md +0 -0
  56. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/library.py +0 -0
  57. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_messages.md +0 -0
  58. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_output_tokens.md +0 -0
  59. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/max_total_tokens.md +0 -0
  60. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/mistakes.md +0 -0
  61. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/outcomes.md +0 -0
  62. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project.md +0 -0
  63. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_create.md +0 -0
  64. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_description.md +0 -0
  65. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_group.md +0 -0
  66. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_key.md +0 -0
  67. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_list.md +0 -0
  68. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/project_title.md +0 -0
  69. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/provider.md +0 -0
  70. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/question.md +0 -0
  71. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/risks.md +0 -0
  72. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/rounds.md +0 -0
  73. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/run.md +0 -0
  74. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/success.md +0 -0
  75. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/timeout.md +0 -0
  76. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/trajectory.md +0 -0
  77. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/view.md +0 -0
  78. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/prompts/view_all.md +0 -0
  79. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/render.py +0 -0
  80. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/request_builder.py +0 -0
  81. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggest.py +0 -0
  82. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_categories.py +0 -0
  83. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_feedback.py +0 -0
  84. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_handoff.py +0 -0
  85. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/agents/suggestion/suggestion_projects.py +0 -0
  86. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/__init__.py +0 -0
  87. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/logout.py +0 -0
  88. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/auth/whoami.py +0 -0
  89. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/__init__.py +0 -0
  90. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/__init__.py +0 -0
  91. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/confirm.md +0 -0
  92. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/group.md +0 -0
  93. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/idempotency_key.md +0 -0
  94. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/library.py +0 -0
  95. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/prompts/top_up.md +0 -0
  96. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/billing/top_up.py +0 -0
  97. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/__init__.py +0 -0
  98. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/get.py +0 -0
  99. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/config/set.py +0 -0
  100. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/__init__.py +0 -0
  101. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/logout.py +0 -0
  102. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/provider/whoami.py +0 -0
  103. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/__init__.py +0 -0
  104. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/add.py +0 -0
  105. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/options.py +0 -0
  106. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/render.py +0 -0
  107. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/resume.py +0 -0
  108. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/start.py +0 -0
  109. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/status.py +0 -0
  110. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/thread.py +0 -0
  111. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/threads.py +0 -0
  112. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/research/watch.py +0 -0
  113. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/__init__.py +0 -0
  114. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/adversarial_team.py +0 -0
  115. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/doctor.py +0 -0
  116. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/list.py +0 -0
  117. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/persistence.py +0 -0
  118. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/same_host_ensemble.py +0 -0
  119. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/stages.py +0 -0
  120. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/runtime/task_board.py +0 -0
  121. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/__init__.py +0 -0
  122. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/doctor.py +0 -0
  123. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/__init__.py +0 -0
  124. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/browser.md +0 -0
  125. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/library.py +0 -0
  126. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/prompts/star.md +0 -0
  127. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/commands/setup/star.py +0 -0
  128. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/__init__.py +0 -0
  129. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/__init__.py +0 -0
  130. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/client.py +0 -0
  131. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/__init__.py +0 -0
  132. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/auth.py +0 -0
  133. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/billing.py +0 -0
  134. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/research.py +0 -0
  135. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/endpoints/runtime.py +0 -0
  136. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/problem.py +0 -0
  137. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/response.py +0 -0
  138. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/retry.py +0 -0
  139. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/api/runtime_payment.py +0 -0
  140. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/__init__.py +0 -0
  141. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/keyring_store.py +0 -0
  142. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_credentials.py +0 -0
  143. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_resolver.py +0 -0
  144. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_store.py +0 -0
  145. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/provider_verifier.py +0 -0
  146. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/resolver.py +0 -0
  147. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/auth/verifier.py +0 -0
  148. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/__init__.py +0 -0
  149. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/atomic.py +0 -0
  150. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/config.py +0 -0
  151. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/migration.py +0 -0
  152. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/models.py +0 -0
  153. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/paths.py +0 -0
  154. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/config/resolver.py +0 -0
  155. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/constants/__init__.py +0 -0
  156. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/constants/runtime.py +0 -0
  157. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/__init__.py +0 -0
  158. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/cli_error.py +0 -0
  159. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/codes.py +0 -0
  160. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/failures.py +0 -0
  161. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/errors/handler.py +0 -0
  162. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/__init__.py +0 -0
  163. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/documents.py +0 -0
  164. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/files/store.py +0 -0
  165. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/__init__.py +0 -0
  166. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/attachments.py +0 -0
  167. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/codex_attachments.py +0 -0
  168. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/prompt.py +0 -0
  169. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/streams.py +0 -0
  170. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/io/terminal.py +0 -0
  171. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/__init__.py +0 -0
  172. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/formats.py +0 -0
  173. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/manager.py +0 -0
  174. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/output/models.py +0 -0
  175. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/__init__.py +0 -0
  176. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/application.py +0 -0
  177. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime/options.py +0 -0
  178. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/__init__.py +0 -0
  179. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/executor.py +0 -0
  180. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/gate.py +0 -0
  181. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/hosts.py +0 -0
  182. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/planner.py +0 -0
  183. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/stages.py +0 -0
  184. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board.py +0 -0
  185. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_checkpoints.py +0 -0
  186. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_system.md +0 -0
  187. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/task_board_tasks.py +0 -0
  188. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/lib/runtime_primitives/verification.py +0 -0
  189. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/__init__.py +0 -0
  190. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/__init__.py +0 -0
  191. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/__init__.py +0 -0
  192. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/implementer_system.md +0 -0
  193. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/implementer_turn.md +0 -0
  194. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/library.py +0 -0
  195. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/planner_system.md +0 -0
  196. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/planner_turn.md +0 -0
  197. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/role_system.md +0 -0
  198. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/role_turn.md +0 -0
  199. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_final_turn.md +0 -0
  200. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_round_turn.md +0 -0
  201. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/prompts/selector_system.md +0 -0
  202. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/runner.py +0 -0
  203. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/sdk.py +0 -0
  204. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/service.py +0 -0
  205. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/ensemble/settings.py +0 -0
  206. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/__init__.py +0 -0
  207. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/__init__.py +0 -0
  208. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/library.py +0 -0
  209. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/persistence_system.md +0 -0
  210. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/prompts/persistence_turn.md +0 -0
  211. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/runner.py +0 -0
  212. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/persistence/session.py +0 -0
  213. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/__init__.py +0 -0
  214. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/categories.py +0 -0
  215. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/context.py +0 -0
  216. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/extra_compute.py +0 -0
  217. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/handoff.py +0 -0
  218. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/message_tools.py +0 -0
  219. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/project.py +0 -0
  220. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/__init__.py +0 -0
  221. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/__init__.py +0 -0
  222. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/adjacent_opportunity.md +0 -0
  223. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/alternative.md +0 -0
  224. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/big_bets.md +0 -0
  225. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/bottleneck.md +0 -0
  226. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/business_growth.md +0 -0
  227. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/completion.md +0 -0
  228. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/continuation.md +0 -0
  229. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/coordination.md +0 -0
  230. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/creative_exploration.md +0 -0
  231. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/cross_domain.md +0 -0
  232. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/delegation.md +0 -0
  233. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/experiment.md +0 -0
  234. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/feedback.md +0 -0
  235. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/goal_clarification.md +0 -0
  236. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/immediate_next_steps.md +0 -0
  237. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/investigation.md +0 -0
  238. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/learning.md +0 -0
  239. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/leverage.md +0 -0
  240. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/long_term_directions.md +0 -0
  241. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/preparation.md +0 -0
  242. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/prerequisite.md +0 -0
  243. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/prioritization.md +0 -0
  244. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/product_experience.md +0 -0
  245. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/quick_wins.md +0 -0
  246. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/reframing.md +0 -0
  247. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/risk_prevention.md +0 -0
  248. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/simplification.md +0 -0
  249. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/stop_or_defer.md +0 -0
  250. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/strategy.md +0 -0
  251. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/technical_possibilities.md +0 -0
  252. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/categories/verification.md +0 -0
  253. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/critic.md +0 -0
  254. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/critic_message.md +0 -0
  255. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/generator.md +0 -0
  256. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/library.py +0 -0
  257. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_generator_argument.md +0 -0
  258. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_generator_tool.md +0 -0
  259. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_parent_argument.md +0 -0
  260. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_parent_tool.md +0 -0
  261. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/message_receipt.md +0 -0
  262. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/prompts/revision.md +0 -0
  263. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/sdk.py +0 -0
  264. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/selection.py +0 -0
  265. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/services/suggestions/service.py +0 -0
  266. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/__init__.py +0 -0
  267. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/api.py +0 -0
  268. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/attachments.py +0 -0
  269. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/ensemble.py +0 -0
  270. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/provider.py +0 -0
  271. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/research.py +0 -0
  272. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/runtime.py +0 -0
  273. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli/types/suggestions.py +0 -0
  274. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/dependency_links.txt +0 -0
  275. {vidbyte_cli-0.1.0 → vidbyte_cli-0.2.0}/src/vidbyte_cli.egg-info/entry_points.txt +0 -0
  276. {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.1.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.1.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
- ).read(from_stdin=with_token)
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
- return bool(
95
- click.confirm(
96
- "No OS keyring is available. Store the key in a restricted local file?",
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
- ).read(from_stdin=with_token)
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
- return bool(
97
- click.confirm(
98
- "No OS keyring is available. Store the provider key in a restricted local file?",
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 getpass
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 prompt goes to stderr so `login` stays usable inside a pipeline.
51
- value = getpass.getpass("Vidbyte API key: ", stream=self._streams.stderr)
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 getpass
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(self, *, from_stdin: bool) -> ProviderCredentials:
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
- prompt = f"{self._provider.value} API key: "
48
- value = getpass.getpass(prompt, stream=self._streams.stderr)
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.1.0": a source tree must not claim to be the released version.
14
- _SOURCE_TREE_VERSION = "0.1.0.dev0"
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.1.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
@@ -3,6 +3,7 @@ httpx<1,>=0.27
3
3
  keyring<26,>=25.2
4
4
  platformdirs<5,>=4.4
5
5
  pydantic<3,>=2.6
6
+ rich<16,>=13.7
6
7
  x402[evm]==2.8.0
7
8
  vidbyte-sdk[codex]<0.3,>=0.2.0
8
9