feat(werkbank): runner queue endpoints + result persistence (WB-05) (#207)
CI / Check (push) Has been skipped
CI / Detect Changes (push) Successful in 4s
CI / Deploy Agent (push) Successful in 3m44s
CI / Deploy Dashboard (push) Successful in 2m37s
CI / Deploy Docs (push) Has been skipped
CI / Deploy MCP (push) Successful in 1m49s

This commit was merged in pull request #207.
This commit is contained in:
2026-07-17 11:42:29 +00:00
parent 633f945a1e
commit 91a87677bc
11 changed files with 565 additions and 47 deletions
+28 -1
View File
@@ -4,7 +4,7 @@ use axum::extract::{DefaultBodyLimit, Request};
use axum::http::HeaderValue;
use axum::middleware::Next;
use axum::response::Response;
use axum::routing::{delete, get};
use axum::routing::{delete, get, post};
use axum::{middleware, Extension, Router};
use tokio::sync::RwLock;
use tower_http::cors::CorsLayer;
@@ -72,8 +72,35 @@ pub async fn start_api_server(agent: ComplianceAgent, port: u16) -> Result<(), A
Router::new()
};
// Werkbank runner API. Like admin, only mounted when its bearer token is
// configured; runners authenticate with WERKBANK_RUNNER_TOKEN (not a JWT).
let werkbank_router: Router = if agent.config.werkbank_runner_token.is_some() {
tracing::info!(
"Werkbank runner API enabled — /api/v1/werkbank/jobs/* behind WERKBANK_RUNNER_TOKEN"
);
Router::new()
.route(
"/api/v1/werkbank/jobs/lease",
post(handlers::werkbank_jobs::lease),
)
.route(
"/api/v1/werkbank/jobs/heartbeat",
post(handlers::werkbank_jobs::heartbeat),
)
.route(
"/api/v1/werkbank/jobs/complete",
post(handlers::werkbank_jobs::complete),
)
.layer(middleware::from_fn(
handlers::werkbank_jobs::require_runner_token,
))
} else {
Router::new()
};
let mut app = routes::build_router()
.merge(admin_router)
.merge(werkbank_router)
// Allow large artifact uploads (PLC .projectarchive, firmware images,
// mobile packages) — axum's default request-body limit is only 2 MiB.
.layer(DefaultBodyLimit::max(512 * 1024 * 1024))