buildai-cli 0.3.69__tar.gz → 0.3.70__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 (36) hide show
  1. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/.gitignore +3 -1
  2. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/PKG-INFO +1 -1
  3. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/processing.py +81 -43
  4. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/pyproject.toml +1 -1
  5. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/AGENTS.md +0 -0
  6. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/CLAUDE.md +0 -0
  7. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/buildai_bootstrap.py +0 -0
  8. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/__init__.py +0 -0
  9. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/_has_core.py +0 -0
  10. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/auth_local.py +0 -0
  11. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/__init__.py +0 -0
  12. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/api_proxy.py +0 -0
  13. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/auth.py +0 -0
  14. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/__init__.py +0 -0
  15. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/broker.py +0 -0
  16. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/common.py +0 -0
  17. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/migrate.py +0 -0
  18. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/query.py +0 -0
  19. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/schema.py +0 -0
  20. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/status.py +0 -0
  21. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/db/tunnel.py +0 -0
  22. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/dev.py +0 -0
  23. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/doctor.py +0 -0
  24. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/commands/gigcamera.py +0 -0
  25. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/config.py +0 -0
  26. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/console.py +0 -0
  27. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/context.py +0 -0
  28. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/db_broker.py +0 -0
  29. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/guard.py +0 -0
  30. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/internal_api.py +0 -0
  31. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/main.py +0 -0
  32. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/nl_query/__init__.py +0 -0
  33. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/nl_query/dataset_tools.py +0 -0
  34. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/ops_init.py +0 -0
  35. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/output.py +0 -0
  36. {buildai_cli-0.3.69 → buildai_cli-0.3.70}/cli/pagination.py +0 -0
@@ -55,7 +55,9 @@ Thumbs.db
55
55
 
56
56
  # Local tool state
57
57
  .superpowers/
58
- .entire/
58
+ .entire/*
59
+ !.entire/
60
+ !.entire/settings.json
59
61
  .codex/config.toml
60
62
  .codex-bin/
61
63
  .mcp.json
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: buildai-cli
3
- Version: 0.3.69
3
+ Version: 0.3.70
4
4
  Summary: Build AI CLI (Typer)
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: httpx>=0.27.0
@@ -223,7 +223,7 @@ def scheduler_tick(
223
223
  stage_limits_json: str | None = typer.Option(
224
224
  None,
225
225
  "--stage-limits-json",
226
- help='Optional JSON object such as {"pose_3d": 50, "pose_2d": 4, "prepare": 20}.',
226
+ help='Optional JSON object such as {"pose_3d": 50, "pose_2d": 4}.',
227
227
  ),
228
228
  max_submit_manifests: int = typer.Option(5, "--max-submit-manifests", min=1, max=50),
229
229
  max_tasks: int = typer.Option(4, "--max-tasks", min=1, max=1000),
@@ -289,94 +289,132 @@ def scheduler_tick(
289
289
  )
290
290
 
291
291
 
292
- @stage_jobs_app.command("launch-egoexo-prepare-batch")
293
- def launch_egoexo_prepare_batch(
292
+ @stage_jobs_app.command("plan-egoexo")
293
+ def plan_egoexo_stage_jobs(
294
+ run_key: str = typer.Option(..., "--run-key", help="Stage-job run key to plan."),
295
+ program_slug: str = typer.Option(
296
+ "build-egoexo-2026",
297
+ "--program-slug",
298
+ help="Program slug whose active episodes should be planned.",
299
+ ),
300
+ recording_batch_id: str | None = typer.Option(
301
+ None,
302
+ "--recording-batch-id",
303
+ help="Optional recording batch id to plan exactly one finalized ingest batch.",
304
+ ),
305
+ stages: str | None = typer.Option(
306
+ None,
307
+ "--stages",
308
+ help="Comma-separated stage keys. Defaults to pose_2d_recording,pose_3d_definition_run.",
309
+ ),
310
+ limit: int = typer.Option(100, "--limit", min=1, max=5000),
311
+ priority: int = typer.Option(7, "--priority", min=0, max=10),
312
+ skip_existing_pose_3d: bool = typer.Option(
313
+ True,
314
+ "--skip-existing-pose-3d/--include-existing-pose-3d",
315
+ help="Skip Pose3D work for episodes that already have Pose3D outputs.",
316
+ ),
317
+ dry_run: bool = typer.Option(False, "--dry-run", help="Preview planned work."),
318
+ write: bool = typer.Option(False, "--write", help="Create work items. Omit for dry-run."),
319
+ ) -> None:
320
+ """Plan missing episode-scoped EgoExo stage jobs from canonical DB truth."""
321
+ _request(
322
+ "/v1/processing/stage-jobs/egoexo/plan",
323
+ method="POST",
324
+ body={
325
+ "program_slug": program_slug,
326
+ "recording_batch_id": recording_batch_id,
327
+ "stages": _parse_csv(
328
+ stages,
329
+ option_name="--stages",
330
+ allowed={"pose_2d", "pose_3d", "pose_2d_recording", "pose_3d_definition_run"},
331
+ ),
332
+ "run_key": run_key,
333
+ "limit": limit,
334
+ "priority": priority,
335
+ "skip_existing_pose_3d": skip_existing_pose_3d,
336
+ "dry_run": dry_run or not write,
337
+ },
338
+ )
339
+
340
+
341
+ @stage_jobs_app.command("launch-egoexo-pose-2d-modal")
342
+ def launch_egoexo_pose_2d_modal(
294
343
  limit: int = typer.Option(10, "--limit", min=1, max=200),
295
- run_key: str = typer.Option(..., "--run-key", help="Prepare run key to drain."),
344
+ run_key: str = typer.Option(..., "--run-key", help="Pose2D run key to drain."),
345
+ task_count: int = typer.Option(
346
+ 500,
347
+ "--task-count",
348
+ min=1,
349
+ max=1000,
350
+ help="Maximum Modal workers per episode work item.",
351
+ ),
296
352
  execution_profile_key: str = typer.Option(
297
- "gcp.us.media_l4",
353
+ "modal.h100.500",
298
354
  "--execution-profile-key",
299
- help="Cloud Batch execution profile used for each episode job.",
355
+ help="Modal execution profile used for each episode job.",
300
356
  ),
301
- provisioning_model: str = typer.Option(
302
- "standard",
303
- "--provisioning-model",
304
- help="Cloud Batch provisioning model: standard or spot.",
357
+ store_heatmaps: bool = typer.Option(
358
+ False,
359
+ "--store-heatmaps",
360
+ help="Persist pre-decoded Sapiens heatmap logits as optional artifacts.",
305
361
  ),
306
362
  lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
307
363
  dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
308
364
  write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
309
365
  ) -> None:
310
- """Launch one Cloud Batch prepare job per ready EgoExo episode."""
311
- if provisioning_model not in {"standard", "spot"}:
312
- error("--provisioning-model must be one of: standard, spot")
313
- raise typer.Exit(1)
366
+ """Launch Modal-backed Sapiens Pose2D workers for ready EgoExo episodes."""
314
367
  _request(
315
- "/v1/processing/stage-jobs/egoexo/prepare/launch-batch",
368
+ "/v1/processing/stage-jobs/egoexo/pose-2d/launch-modal",
316
369
  method="POST",
317
370
  body={
318
371
  "limit": limit,
319
372
  "run_key": run_key,
373
+ "task_count": task_count,
320
374
  "execution_profile_key": execution_profile_key,
321
- "provisioning_model": provisioning_model,
375
+ "config": {"store_heatmaps": store_heatmaps},
322
376
  "lease_seconds": lease_seconds,
323
377
  "dry_run": dry_run or not write,
324
378
  },
325
379
  )
326
380
 
327
381
 
328
- @stage_jobs_app.command("launch-egoexo-pose-2d-batch")
329
- def launch_egoexo_pose_2d_batch(
382
+ @stage_jobs_app.command("launch-egoexo-pose-3d-batch")
383
+ def launch_egoexo_pose_3d_batch(
330
384
  limit: int = typer.Option(10, "--limit", min=1, max=200),
331
- run_key: str = typer.Option(..., "--run-key", help="Pose2D run key to drain."),
332
- task_count: int = typer.Option(
333
- 8,
334
- "--task-count",
335
- min=1,
336
- max=1000,
337
- help="Cloud Batch tasks per episode job.",
338
- ),
385
+ run_key: str = typer.Option(..., "--run-key", help="Pose3D run key to drain."),
339
386
  execution_profile_key: str = typer.Option(
340
- "gcp.us.gpu_a100",
387
+ "gcp.us.pose_3d_cpu",
341
388
  "--execution-profile-key",
342
- help="Cloud Batch execution profile used for each episode job.",
389
+ help="Cloud Batch execution profile used for each episode triangulation job.",
343
390
  ),
344
391
  provisioning_model: str = typer.Option(
345
392
  "standard",
346
393
  "--provisioning-model",
347
394
  help="Cloud Batch provisioning model: standard or spot.",
348
395
  ),
349
- max_active_jobs: int | None = typer.Option(
396
+ config_json: str | None = typer.Option(
350
397
  None,
351
- "--max-active-jobs",
352
- min=1,
353
- max=1000,
354
- help="Maximum active episode Batch jobs for this execution profile.",
355
- ),
356
- store_heatmaps: bool = typer.Option(
357
- False,
358
- "--store-heatmaps",
359
- help="Persist pre-decoded Sapiens heatmap logits as optional artifacts.",
398
+ "--config-json",
399
+ help="Optional Pose3D processor config JSON object.",
360
400
  ),
361
401
  lease_seconds: int = typer.Option(24 * 60 * 60, "--lease-seconds", min=600),
362
402
  dry_run: bool = typer.Option(False, "--dry-run", help="Preview ready work without leasing."),
363
403
  write: bool = typer.Option(False, "--write", help="Launch jobs. Omit for dry-run."),
364
404
  ) -> None:
365
- """Launch one episode-owned Cloud Batch Pose2D job per ready EgoExo episode."""
405
+ """Launch optimized receipt-backed Pose3D triangulation jobs for ready episodes."""
366
406
  if provisioning_model not in {"standard", "spot"}:
367
407
  error("--provisioning-model must be one of: standard, spot")
368
408
  raise typer.Exit(1)
369
409
  _request(
370
- "/v1/processing/stage-jobs/egoexo/pose-2d/launch-batch",
410
+ "/v1/processing/stage-jobs/egoexo/pose-3d/launch-batch",
371
411
  method="POST",
372
412
  body={
373
413
  "limit": limit,
374
414
  "run_key": run_key,
375
- "task_count": task_count,
376
415
  "execution_profile_key": execution_profile_key,
377
416
  "provisioning_model": provisioning_model,
378
- "max_active_jobs": max_active_jobs,
379
- "config": {"store_heatmaps": store_heatmaps},
417
+ "config": _parse_json_object(config_json, option_name="--config-json"),
380
418
  "lease_seconds": lease_seconds,
381
419
  "dry_run": dry_run or not write,
382
420
  },
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "buildai-cli"
7
- version = "0.3.69"
7
+ version = "0.3.70"
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