feat(worker): TicketSystemConfig + ticket_api_base_url in worker.config.json

This commit is contained in:
mika kuns
2026-08-27 12:34:24 +02:00
parent 41bfc242fa
commit 2a3c937f70
4 changed files with 83 additions and 0 deletions
@@ -57,6 +57,10 @@ public sealed class WorkerConfig
[JsonPropertyName("usage_poll_interval_idle_seconds")]
public int UsagePollIntervalIdleSeconds { get; set; } = 900;
/// <summary>Base URL of the Bandel ticket-system API. Null = ticket integration off entirely.</summary>
[JsonPropertyName("ticket_api_base_url")]
public string? TicketApiBaseUrl { get; set; }
public static string DefaultConfigPath =>
Path.Combine(Paths.AppDataRoot(), "worker.config.json");
@@ -103,6 +107,11 @@ public sealed class WorkerConfig
public void SaveClaudeBin(string? path = null)
=> SaveKey("claude_bin", JsonValue.Create(ClaudeBin), path);
/// <summary>Persistiert NUR <c>ticket_api_base_url</c>, gleiches read-modify-write wie
/// <see cref="SaveClaudeBin"/> — jedes andere Feld der Datei bleibt unangetastet.</summary>
public void SaveTicketApiBaseUrl(string? path = null)
=> SaveKey("ticket_api_base_url", JsonValue.Create(TicketApiBaseUrl), path);
private static void SaveKey(string key, JsonNode? value, string? path)
{
path ??= DefaultConfigPath;
+2
View File
@@ -15,6 +15,7 @@ using ClaudeDo.Worker.Planning;
using ClaudeDo.Worker.Queue;
using ClaudeDo.Worker.Runner;
using ClaudeDo.Worker.State;
using ClaudeDo.Worker.Tickets;
using ClaudeDo.Worker.Online;
using ClaudeDo.Worker.Online.Interfaces;
using ClaudeDo.Worker.Prime;
@@ -215,6 +216,7 @@ builder.Services.AddSingleton(cfg.OnlineInbox);
builder.Services.AddSingleton(new OnlineRefreshTokenStore(DpapiTokenStore.InAppData("online-inbox.token")));
builder.Services.AddSingleton(new TicketPatStore(DpapiTokenStore.InAppData("ticket.pat")));
#pragma warning restore CA1416
builder.Services.AddSingleton<TicketSystemConfig>();
if (cfg.OnlineInbox.Enabled)
{
@@ -0,0 +1,29 @@
using ClaudeDo.Worker.Config;
namespace ClaudeDo.Worker.Tickets;
/// <summary>
/// Der eine Ort, der beantwortet "ist die Ticketsystem-Anbindung eingerichtet?".
/// Liest die Base-URL aus dem WorkerConfig-Singleton (in-place aktualisiert vom Hub-Setter,
/// also ohne Neustart wirksam) und den PAT aus dem DPAPI-Store. Beide fehlen im Normalfall,
/// deshalb ist IsConfigured die billigste denkbare Abbruchbedingung: kein IO, keine DB.
/// </summary>
public sealed class TicketSystemConfig
{
private readonly WorkerConfig _worker;
private readonly TicketPatStore _pat;
public TicketSystemConfig(WorkerConfig worker, TicketPatStore pat)
{
_worker = worker;
_pat = pat;
}
public string? BaseUrl => string.IsNullOrWhiteSpace(_worker.TicketApiBaseUrl)
? null
: _worker.TicketApiBaseUrl.Trim().TrimEnd('/');
public string? Token => _pat.Store.Read();
public bool IsConfigured => BaseUrl is not null && !string.IsNullOrEmpty(Token);
}