Add C# bridges and coordinator service

- geviscope-bridge: GeViScope SDK REST wrapper (:7720)
- gcore-bridge: G-Core SDK REST wrapper (:7721)
- geviserver-bridge: GeViServer REST wrapper (:7710)
- copilot-coordinator: WebSocket coordination hub (:8090)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
klas
2026-02-12 15:24:20 +01:00
parent 40143734fc
commit b2887b67db
21 changed files with 4548 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
namespace CopilotCoordinator.Models;
public record CameraLock(
int CameraId,
CameraLockPriority Priority,
string OwnerName,
DateTime OwnedSince,
DateTime ExpiresAt
);
public enum CameraLockPriority { None, High, Low }
public enum CameraLockNotificationType
{
Acquired,
TakenOver,
ConfirmTakeOver,
Confirmed,
Rejected,
ExpireSoon,
Unlocked
}
public record CameraLockResult(bool Acquired, CameraLock? Lock);
public record CameraLockNotification(
CameraLockNotificationType Type,
int CameraId,
string CopilotName
);
public record LockRequest(int CameraId, string KeyboardId, string Priority = "low");
public record UnlockRequest(int CameraId, string KeyboardId);
public record TakeoverRequest(int CameraId, string KeyboardId, string Priority = "low");
public record TakeoverConfirmRequest(int CameraId, string KeyboardId, bool Confirm);
public record ResetExpirationRequest(int CameraId, string KeyboardId);

View File

@@ -0,0 +1,24 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace CopilotCoordinator.Models;
/// <summary>
/// WebSocket message envelope for all coordinator events.
/// </summary>
public class WsMessage
{
[JsonPropertyName("type")]
public string Type { get; set; } = "";
[JsonPropertyName("data")]
public JsonElement? Data { get; set; }
public static string Serialize(string type, object? data = null)
{
var msg = new { type, data };
return JsonSerializer.Serialize(msg);
}
}
public record KeyboardInfo(string Id, string? Name, DateTime ConnectedAt);

View File

@@ -0,0 +1,21 @@
namespace CopilotCoordinator.Models;
public record SequenceDefinition(
int Id,
string Name,
int CategoryId,
List<int> Cameras,
int IntervalSeconds
);
public record SequenceCategory(int Id, string Name);
public record RunningSequence(
int ViewerId,
int SequenceId,
DateTime StartedAt,
int CurrentCameraIndex
);
public record SequenceStartRequest(int ViewerId, int SequenceId);
public record SequenceStopRequest(int ViewerId);