namespace marlin.agents.shell; using System.Net.Http.Json; using core.models; public class MarlinApiClient { private readonly HttpClient _http; public MarlinApiClient(string baseUrl, Guid agentId, string agentToken) { _http = new HttpClient { BaseAddress = new Uri(baseUrl) }; _http.DefaultRequestHeaders.Add("Agent", $"{agentId} {agentToken}"); } public static MarlinApiClient FromEnvironment() { var baseUrl = RequireEnv("MARLIN_API_BASE_URL"); var agentId = RequireEnv("MARLIN_AGENT_ID"); var agentToken = RequireEnv("MARLIN_AGENT_TOKEN"); return new MarlinApiClient(baseUrl, Guid.Parse(agentId), agentToken); } private static string RequireEnv(string name) => Environment.GetEnvironmentVariable(name) ?? throw new InvalidOperationException($"Missing required environment variable: {name}"); public async Task Handshake(AgentStatus status, CancellationToken ct = default) { var response = await _http.PostAsJsonAsync("api/dispatch/handshake", status, ct); response.EnsureSuccessStatusCode(); return (await response.Content.ReadFromJsonAsync(ct))!; } public async Task QueueNextJob(CancellationToken ct = default) => await _http.GetFromJsonAsync("api/dispatch/queue", ct); }