buildai-cli 0.3.51__tar.gz → 0.3.52__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 (33) hide show
  1. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/PKG-INFO +1 -1
  2. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/gigcamera.py +34 -125
  3. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/pyproject.toml +1 -1
  4. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/.gitignore +0 -0
  5. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/AGENTS.md +0 -0
  6. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/CLAUDE.md +0 -0
  7. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/buildai_bootstrap.py +0 -0
  8. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/__init__.py +0 -0
  9. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/_has_core.py +0 -0
  10. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/auth_local.py +0 -0
  11. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/auth_proxy.py +0 -0
  12. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/__init__.py +0 -0
  13. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/api_proxy.py +0 -0
  14. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/auth.py +0 -0
  15. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/__init__.py +0 -0
  16. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/common.py +0 -0
  17. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/migrate.py +0 -0
  18. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/query.py +0 -0
  19. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/schema.py +0 -0
  20. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/db/status.py +0 -0
  21. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/dev.py +0 -0
  22. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/commands/doctor.py +0 -0
  23. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/config.py +0 -0
  24. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/console.py +0 -0
  25. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/context.py +0 -0
  26. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/guard.py +0 -0
  27. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/internal_api.py +0 -0
  28. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/main.py +0 -0
  29. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/nl_query/__init__.py +0 -0
  30. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/nl_query/dataset_tools.py +0 -0
  31. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/ops_init.py +0 -0
  32. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/output.py +0 -0
  33. {buildai_cli-0.3.51 → buildai_cli-0.3.52}/cli/pagination.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildai-cli
3
- Version: 0.3.51
3
+ Version: 0.3.52
4
4
  Summary: Build AI CLI (Typer)
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: python-dotenv>=1.0.0
@@ -659,125 +659,34 @@ def vlm_drain_pending_recaps(
659
659
  limit=limit,
660
660
  upload_session_ids=upload_session_ids,
661
661
  )
662
- claimed_session_ids: list[UUID] = []
663
- drain_plan = {
664
- "missing_frame_session_ids": [],
665
- "ready_recap_session_ids": [],
666
- "completed_session_ids": [],
667
- "skipped_session_ids": [],
668
- "deferred_session_ids": [],
662
+ drain_summary: dict[str, object] = {
663
+ "claimed_count": 0,
664
+ "missing_frame_session_count": 0,
665
+ "ready_recap_session_count": 0,
666
+ "completed_session_count": 0,
667
+ "skipped_session_count": 0,
668
+ "deferred_session_count": 0,
669
+ "quarantined_count": 0,
670
+ "max_attempts": _RECAP_QUEUE_MAX_ATTEMPTS,
671
+ "manifest_count": 0,
672
+ "manifests": [],
669
673
  }
670
- manifests: list[dict[str, object]] = []
671
- quarantined_count = 0
672
674
 
673
675
  if write:
674
- quarantined_count = await _quarantine_exhausted_pending_recap_rows(conn)
675
- claimed_session_ids = await _claim_pending_recap_sessions(
676
- conn,
677
- limit=limit,
678
- upload_session_ids=upload_session_ids,
679
- )
680
- drain_plan = await _pending_recap_drain_plan(
681
- conn,
682
- upload_session_ids=claimed_session_ids,
683
- program_version_id=program_version_id,
684
- )
685
- try:
686
- from dal.processing import media_jobs
687
-
688
- missing_ids = [str(value) for value in drain_plan["missing_frame_session_ids"]]
689
- ready_ids = [str(value) for value in drain_plan["ready_recap_session_ids"]]
690
- if missing_ids or ready_ids:
691
- async with get_cli_context(
692
- settings,
693
- profile=ctx.obj.get("cli_profile"),
694
- ) as (_db, dal_ctx):
695
- if missing_ids:
696
- manifest = await media_jobs.queue_processor_job(
697
- dal_ctx,
698
- processor_ref=(
699
- media_jobs.GIGCAMERA_NORMALIZE_EXTRACT_PROCESSOR_REF
700
- ),
701
- selection_spec={
702
- "kind": "gigcamera_uploads",
703
- "upload_session_ids": missing_ids,
704
- "only_missing_frames": True,
705
- },
706
- sink_overrides=None,
707
- resource_overrides=None,
708
- submitted_by_principal=_SUBMITTED_BY,
709
- idempotency_key=_stable_idempotency_key(
710
- prefix=(
711
- f"gigcamera-vlm-pending-extract:{program_version_label}"
712
- ),
713
- parts=missing_ids,
714
- ),
715
- )
716
- manifests.append(
717
- {"phase": "extract", "manifest_id": manifest["id"]}
718
- )
719
- await _mark_pending_recap_rows(
720
- conn,
721
- upload_session_ids=drain_plan["missing_frame_session_ids"],
722
- status="extract_enqueued",
723
- manifest_id=str(manifest["id"]),
724
- deferred_reason="extract_manifest_enqueued",
725
- )
726
- if ready_ids:
727
- manifest = await media_jobs.queue_processor_job(
728
- dal_ctx,
729
- processor_ref=media_jobs.GIGCAMERA_DAILY_RECAP_PROCESSOR_REF,
730
- selection_spec={
731
- "kind": "gigcamera_sessions",
732
- "upload_session_ids": ready_ids,
733
- "selection_kind": "near_90s",
734
- "exclude_completed": True,
735
- },
736
- sink_overrides=None,
737
- resource_overrides=None,
738
- submitted_by_principal=_SUBMITTED_BY,
739
- idempotency_key=_stable_idempotency_key(
740
- prefix=(
741
- f"gigcamera-vlm-pending-recap:{program_version_label}"
742
- ),
743
- parts=ready_ids,
744
- ),
745
- )
746
- manifests.append({"phase": "recap", "manifest_id": manifest["id"]})
747
- await _mark_pending_recap_rows(
748
- conn,
749
- upload_session_ids=drain_plan["ready_recap_session_ids"],
750
- status="recap_enqueued",
751
- manifest_id=str(manifest["id"]),
752
- deferred_reason="recap_manifest_enqueued",
753
- )
754
- await _mark_pending_recap_rows(
755
- conn,
756
- upload_session_ids=drain_plan["deferred_session_ids"],
757
- status="extract_enqueued",
758
- deferred_reason="extract_already_inflight",
759
- )
760
- await _mark_pending_recap_rows(
761
- conn,
762
- upload_session_ids=drain_plan["completed_session_ids"],
763
- status="completed",
764
- deferred_reason="already_completed",
765
- )
766
- await _mark_pending_recap_rows(
767
- conn,
768
- upload_session_ids=drain_plan["skipped_session_ids"],
769
- status="skipped",
770
- deferred_reason="no_core_claims",
771
- )
772
- except Exception as exc:
773
- await _mark_pending_recap_rows(
774
- conn,
775
- upload_session_ids=claimed_session_ids,
776
- status="failed",
777
- deferred_reason="drain_failed",
778
- error=str(exc)[:2048],
676
+ from dal.processing import recap_drain
677
+
678
+ async with get_cli_context(
679
+ settings,
680
+ profile=ctx.obj.get("cli_profile"),
681
+ ) as (_db, dal_ctx):
682
+ drain_summary = await recap_drain.run_drain_pass(
683
+ dal_ctx,
684
+ program_version_label=program_version_label,
685
+ limit=limit,
686
+ upload_session_ids=upload_session_ids,
687
+ submitted_by_principal=_SUBMITTED_BY,
688
+ max_attempts=_RECAP_QUEUE_MAX_ATTEMPTS,
779
689
  )
780
- raise
781
690
 
782
691
  render(
783
692
  {
@@ -789,17 +698,17 @@ def vlm_drain_pending_recaps(
789
698
  str(upload_session_id) for upload_session_id in upload_session_ids or []
790
699
  ],
791
700
  "claimable_count": claimable_count,
792
- "claimed_count": len(claimed_session_ids),
701
+ "claimed_count": drain_summary["claimed_count"],
793
702
  "status_counts": status_counts,
794
- "missing_frame_session_count": len(drain_plan["missing_frame_session_ids"]),
795
- "ready_recap_session_count": len(drain_plan["ready_recap_session_ids"]),
796
- "completed_session_count": len(drain_plan["completed_session_ids"]),
797
- "skipped_session_count": len(drain_plan["skipped_session_ids"]),
798
- "deferred_session_count": len(drain_plan["deferred_session_ids"]),
799
- "quarantined_count": quarantined_count,
800
- "max_attempts": _RECAP_QUEUE_MAX_ATTEMPTS,
801
- "manifest_count": len(manifests),
802
- "manifests": manifests,
703
+ "missing_frame_session_count": drain_summary["missing_frame_session_count"],
704
+ "ready_recap_session_count": drain_summary["ready_recap_session_count"],
705
+ "completed_session_count": drain_summary["completed_session_count"],
706
+ "skipped_session_count": drain_summary["skipped_session_count"],
707
+ "deferred_session_count": drain_summary["deferred_session_count"],
708
+ "quarantined_count": drain_summary["quarantined_count"],
709
+ "max_attempts": drain_summary["max_attempts"],
710
+ "manifest_count": drain_summary["manifest_count"],
711
+ "manifests": drain_summary["manifests"],
803
712
  },
804
713
  format=format,
805
714
  )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "buildai-cli"
7
- version = "0.3.51"
7
+ version = "0.3.52"
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
File without changes
File without changes
File without changes
File without changes