buildai-cli 0.3.164__tar.gz → 0.3.166__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 (89) hide show
  1. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/PKG-INFO +1 -1
  2. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/labeling.py +82 -0
  3. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/pyproject.toml +1 -1
  4. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/.gitignore +0 -0
  5. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/AGENTS.md +0 -0
  6. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/Dockerfile.hand-labels-export +0 -0
  7. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/Dockerfile.hand-labels-export.dockerignore +0 -0
  8. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/Dockerfile.rescaling-migration-jobs +0 -0
  9. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/Dockerfile.rescaling-migration-jobs.dockerignore +0 -0
  10. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/buildai_bootstrap.py +0 -0
  11. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/__init__.py +0 -0
  12. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/_has_core.py +0 -0
  13. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/auth_local.py +0 -0
  14. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/__init__.py +0 -0
  15. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/api_proxy.py +0 -0
  16. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/auth.py +0 -0
  17. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/__init__.py +0 -0
  18. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/broker.py +0 -0
  19. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/common.py +0 -0
  20. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/migrate.py +0 -0
  21. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/query.py +0 -0
  22. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/rescaling.py +0 -0
  23. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/schema.py +0 -0
  24. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/status.py +0 -0
  25. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/db/tunnel.py +0 -0
  26. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/dev.py +0 -0
  27. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/doctor.py +0 -0
  28. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/ego_frame_search.py +0 -0
  29. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/gigcamera.py +0 -0
  30. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/hand_labels_export.py +0 -0
  31. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/ingest.py +0 -0
  32. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/ingest_docs.py +0 -0
  33. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/intake.py +0 -0
  34. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/label_replay_recovery.py +0 -0
  35. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/processing.py +0 -0
  36. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/rescaling.py +0 -0
  37. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/spec.py +0 -0
  38. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/commands/spec_pr.py +0 -0
  39. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/config.py +0 -0
  40. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/console.py +0 -0
  41. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/context.py +0 -0
  42. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/db_broker.py +0 -0
  43. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/guard.py +0 -0
  44. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/internal_api.py +0 -0
  45. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/labeling_onboarding.py +0 -0
  46. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/main.py +0 -0
  47. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/nl_query/__init__.py +0 -0
  48. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/nl_query/dataset_tools.py +0 -0
  49. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/ops_init.py +0 -0
  50. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/output.py +0 -0
  51. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/pagination.py +0 -0
  52. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/__init__.py +0 -0
  53. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/canonical.py +0 -0
  54. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/export.py +0 -0
  55. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/feed_proofs.py +0 -0
  56. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/fence.py +0 -0
  57. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/importer.py +0 -0
  58. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/jobs.py +0 -0
  59. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/management.py +0 -0
  60. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/orchestrator.py +0 -0
  61. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/probes.py +0 -0
  62. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/reconcile.py +0 -0
  63. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/run_record.py +0 -0
  64. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/runtime.py +0 -0
  65. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/legacy_export_closeout.sql +0 -0
  66. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/legacy_export_prepare.sql +0 -0
  67. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/legacy_fence.sql +0 -0
  68. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/legacy_unfreeze.sql +0 -0
  69. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/v2_export_closeout.sql +0 -0
  70. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/v2_export_prepare.sql +0 -0
  71. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/v2_fence.sql +0 -0
  72. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/sql/v2_unfreeze.sql +0 -0
  73. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/storage.py +0 -0
  74. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rescaling_migration/transform.py +0 -0
  75. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/cli/rls_guard.py +0 -0
  76. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/__init__.py +0 -0
  77. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/__main__.py +0 -0
  78. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/encode.py +0 -0
  79. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/export.py +0 -0
  80. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/reader.py +0 -0
  81. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/schema.py +0 -0
  82. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/store.py +0 -0
  83. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/hand_labels_export/validate.py +0 -0
  84. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_logical_backup/__init__.py +0 -0
  85. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_logical_backup/__main__.py +0 -0
  86. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_migration_job/__init__.py +0 -0
  87. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_migration_job/__main__.py +0 -0
  88. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_recovery_extractor/__init__.py +0 -0
  89. {buildai_cli-0.3.164 → buildai_cli-0.3.166}/rescaling_recovery_extractor/__main__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: buildai-cli
3
- Version: 0.3.164
3
+ Version: 0.3.166
4
4
  Summary: Build AI CLI (Typer)
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: google-crc32c>=1.7.1
@@ -22,6 +22,7 @@ from dal.labeling import (
22
22
  configure_guarded_scheduler_execution,
23
23
  hand_practice,
24
24
  list_accounts,
25
+ practice_bonus_payouts,
25
26
  prepare_routing_policy_transition,
26
27
  prepare_shadow_quality_runtime,
27
28
  preview_rapid_navigation_label_repair,
@@ -80,6 +81,11 @@ hand_practice_app = typer.Typer(
80
81
  no_args_is_help=True,
81
82
  )
82
83
  app.add_typer(hand_practice_app, name="hand-practice")
84
+ practice_bonus_payouts_app = typer.Typer(
85
+ help="The instant bonus payout (practice bonus, referral steps): switch, status, backfill.",
86
+ no_args_is_help=True,
87
+ )
88
+ app.add_typer(practice_bonus_payouts_app, name="practice-bonus-payouts")
83
89
  app.add_typer(hand_labels_export_app, name="hands-export")
84
90
 
85
91
  _GCLOUD_READ_TIMEOUT_SECONDS = 15
@@ -977,6 +983,82 @@ def hand_practice_report_command(
977
983
  output(asyncio.run(_run()), format=format)
978
984
 
979
985
 
986
+ @practice_bonus_payouts_app.command("status")
987
+ def practice_bonus_payouts_status_command(
988
+ typer_ctx: typer.Context,
989
+ profile: Annotated[str | None, typer.Option("--profile")] = None,
990
+ env: Annotated[str | None, typer.Option("--env", "-e")] = None,
991
+ format: Format = format_option(),
992
+ ) -> None:
993
+ """Whether each lane is on, and payouts by kind, state, and reason."""
994
+
995
+ async def _run() -> dict:
996
+ effective_profile = _resolve_profile(profile=profile, env=env, write=False)
997
+ settings = _init_settings(typer_ctx, env=env, profile=effective_profile, write=False)
998
+ async with get_cli_context(settings, profile=effective_profile) as (_db, dal_ctx):
999
+ return await practice_bonus_payouts.status_summary(dal_ctx)
1000
+
1001
+ output(asyncio.run(_run()), format=format)
1002
+
1003
+
1004
+ @practice_bonus_payouts_app.command("switch")
1005
+ def practice_bonus_payouts_switch_command(
1006
+ typer_ctx: typer.Context,
1007
+ state: Annotated[str, typer.Argument(help="on or off")],
1008
+ actor_account_id: Annotated[UUID, typer.Option("--actor-account-id")],
1009
+ lane: Annotated[
1010
+ str,
1011
+ typer.Option("--lane", help="practice (the practice bonus) or referral (both steps)."),
1012
+ ] = "practice",
1013
+ profile: Annotated[str | None, typer.Option("--profile")] = None,
1014
+ env: Annotated[str | None, typer.Option("--env", "-e")] = None,
1015
+ write: Annotated[bool, typer.Option("--write", help="Required: this moves money.")] = False,
1016
+ format: Format = format_option(),
1017
+ ) -> None:
1018
+ """One lane's kill switch: on pays its bonuses at once; off leaves them to the manual payout."""
1019
+
1020
+ if state not in {"on", "off"}:
1021
+ raise typer.BadParameter("Pass on or off.")
1022
+ if lane not in practice_bonus_payouts.LANES:
1023
+ raise typer.BadParameter("Pass --lane practice or --lane referral.")
1024
+ if not write:
1025
+ raise typer.BadParameter("Switching changes who is paid at once; pass --write.")
1026
+
1027
+ async def _run() -> dict:
1028
+ effective_profile = _resolve_profile(profile=profile, env=env, write=write)
1029
+ settings = _init_settings(typer_ctx, env=env, profile=effective_profile, write=write)
1030
+ async with get_cli_context(settings, profile=effective_profile) as (_db, dal_ctx):
1031
+ return await practice_bonus_payouts.set_payouts_enabled(
1032
+ dal_ctx, lane=lane, enabled=state == "on", actor_id=actor_account_id
1033
+ )
1034
+
1035
+ output(asyncio.run(_run()), format=format)
1036
+
1037
+
1038
+ @practice_bonus_payouts_app.command("backfill")
1039
+ def practice_bonus_payouts_backfill_command(
1040
+ typer_ctx: typer.Context,
1041
+ profile: Annotated[str | None, typer.Option("--profile")] = None,
1042
+ env: Annotated[str | None, typer.Option("--env", "-e")] = None,
1043
+ write: Annotated[
1044
+ bool, typer.Option("--write", help="Queue the lines. Default: list them only.")
1045
+ ] = False,
1046
+ format: Format = format_option(),
1047
+ ) -> None:
1048
+ """Queue every unpaid bonus line minted before the lane existed, once.
1049
+
1050
+ The sweep then checks every guardrail and orders each one while the lane is on.
1051
+ """
1052
+
1053
+ async def _run() -> dict:
1054
+ effective_profile = _resolve_profile(profile=profile, env=env, write=write)
1055
+ settings = _init_settings(typer_ctx, env=env, profile=effective_profile, write=write)
1056
+ async with get_cli_context(settings, profile=effective_profile) as (_db, dal_ctx):
1057
+ return await practice_bonus_payouts.backfill(dal_ctx, write=write)
1058
+
1059
+ output(asyncio.run(_run()), format=format)
1060
+
1061
+
980
1062
  def _init_settings(
981
1063
  ctx: typer.Context,
982
1064
  *,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "buildai-cli"
7
- version = "0.3.164"
7
+ version = "0.3.166"
8
8
  description = "Build AI CLI (Typer)"
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
File without changes
File without changes
File without changes