Commit Graph
16 Commits
Author SHA1 Message Date
Brett Williams b5b1cd740b Stream live worker progress via async build dispatch
The agent's /upload and /checkout_git were synchronous, blocking until a
build finished, so the controller could not relay live per-step progress.
Add ?async=1 support: the agent saves/clones the source, starts the build in
a background thread (holding build_lock), and returns 202 + {"id": ...}
immediately. The controller dispatches async, then polls /progress/<job_id>,
appending each step/log line to the job log and SSE stream, and treats the
build as done when progress clears (404) and the worker reports ready.
2026-08-30 21:59:46 -05:00
Brett Williams 0e89919342 Add controller with web UI and retire CLI
- Add ctrl/ package: Flask app (waitress), SQLite job store, background
  scheduler that probes configured workers, dispatches via /upload and
  /checkout_git, fetches artifacts, and serves a single-page UI
- Supporting API: /api/jobs (create/list/detail/cancel), /api/workers,
  /api/capabilities, artifact download, and SSE log stream
- Workers keep the existing HTTP API; add /progress/<job_id> endpoint and
  per-step build tracking for live status
- Retire agent_manager.py and the cross-py-builder CLI; controller UI is
  the primary frontend
- Record design in DESIGN.md; add waitress dependency

Note: /progress is exposed on the worker but the synchronous /upload and
/checkout endpoints block until a build completes, so per-step worker
progress is not yet relayed live in the UI. Live streaming needs an
async-start worker endpoint as a follow-up.
2026-08-30 21:55:46 -05:00
Brett Williams 5f0d2db1a9 Serialize builds and add health endpoint to build agent
- Add a non-blocking build lock so only one job runs at a time;
  concurrent upload/checkout requests get a 409 response
- Add /healthz returning 200 when idle and 503 while a build is running
- Ignore .DS_Store artifacts
2026-08-30 21:32:01 -05:00
Brett Williams 1902d36ae7 Harden build agent against path traversal and add job cleanup
- Validate job IDs on /download and /delete; reject invalid identifiers
- Prevent zip-slip during /upload extraction via safe_extract
- Basename uploaded filenames in /update to block path traversal
- Route git-checkout jobs into pybuild-data so they can be downloaded/deleted
- Clean up job dirs on extract, checkout, and build failures
- Ignore Python bytecode and egg-info artifacts
2026-08-30 21:24:54 -05:00
Brett Williams b511962a1f This works 2025-03-12 00:48:46 -05:00
Brett Williams e07e2bd997 Another attempt #2 2025-03-12 00:40:33 -05:00
Brett Williams 3c92a0775f Another attempt 2025-03-12 00:30:47 -05:00
Brett Williams 80fdc887f0 Fix pip setup 2025-03-12 00:27:16 -05:00
Brett Williams b0d3660881 Ability to checkout git repos, custom ports, and setup for pip 2025-03-12 00:20:25 -05:00
Brett Williams 94e0ecda83 Update README.md 2025-03-06 23:45:40 -06:00
Brett Williams 345b4f6c2c Remove version.py 2025-03-06 15:00:03 -06:00
Brett Williams a568b5140b Remove buggy existing process code 2025-03-06 14:57:39 -06:00
Brett Williams 0f487640bd Argparse cleanup 2025-03-06 10:07:19 -06:00
Brett Williams a9ccafc25d Add shebang and make scripts executable 2025-03-06 00:19:14 -06:00
Brett Williams f06d418e29 Fixed issue with updates after builds and restarting process 2025-03-06 00:16:13 -06:00
Brett Williams cdbee30109 Initial commit 2025-03-05 16:45:21 -06:00