feat: route profile consumers through sessiond

This commit is contained in:
Federico Jaramillo Martinez
2026-07-13 23:09:32 +02:00
parent 141cda93c8
commit 97e0afc6fa
15 changed files with 637 additions and 118 deletions
+35 -27
View File
@@ -9,6 +9,10 @@ export type SessionDaemonAgentProfileResult =
| { status: "unavailable"; error: string }
| { status: "invalid"; error: string };
export interface SessionDaemonRequestClient {
request(method: string, path: string, body?: unknown): Promise<{ statusCode: number; headers: Record<string, string>; body: string }>;
}
export class SessionDaemonClient {
private readonly baseUrl = sessiondHttpUrl();
private readonly socketPath = sessiondSocketPath();
@@ -19,33 +23,8 @@ export class SessionDaemonClient {
return this.requestSocket(method, path, payload);
}
async getActiveAgentProfile(): Promise<SessionDaemonAgentProfileResult> {
let response: Awaited<ReturnType<SessionDaemonClient["request"]>>;
try {
response = await this.request("GET", "/runtime");
} catch (error) {
return { status: "unavailable", error: errorMessage(error) };
}
if (response.statusCode < 200 || response.statusCode >= 300) {
return { status: "unavailable", error: `session daemon runtime request returned HTTP ${String(response.statusCode)}` };
}
let value: unknown;
try {
value = response.body === "" ? undefined : JSON.parse(response.body);
} catch {
return { status: "invalid", error: "session daemon runtime response was not valid JSON" };
}
const runtime = parsePiWebRuntimeComponent(value);
if (runtime?.component !== "sessiond") {
return { status: "invalid", error: "session daemon runtime response was invalid" };
}
if (runtime.activeAgentProfile === undefined) {
return { status: "invalid", error: "session daemon runtime response did not include an active agent profile" };
}
return { status: "available", profile: runtime.activeAgentProfile };
getActiveAgentProfile(): Promise<SessionDaemonAgentProfileResult> {
return getSessionDaemonActiveAgentProfile(this);
}
connectWebSocket(path: string): WebSocket {
@@ -103,6 +82,35 @@ export class SessionDaemonClient {
}
}
export async function getSessionDaemonActiveAgentProfile(client: SessionDaemonRequestClient): Promise<SessionDaemonAgentProfileResult> {
let response: Awaited<ReturnType<SessionDaemonRequestClient["request"]>>;
try {
response = await client.request("GET", "/runtime");
} catch (error) {
return { status: "unavailable", error: errorMessage(error) };
}
if (response.statusCode < 200 || response.statusCode >= 300) {
return { status: "unavailable", error: `session daemon runtime request returned HTTP ${String(response.statusCode)}` };
}
let value: unknown;
try {
value = response.body === "" ? undefined : JSON.parse(response.body);
} catch {
return { status: "invalid", error: "session daemon runtime response was not valid JSON" };
}
const runtime = parsePiWebRuntimeComponent(value);
if (runtime?.component !== "sessiond") {
return { status: "invalid", error: "session daemon runtime response was invalid" };
}
if (runtime.activeAgentProfile === undefined) {
return { status: "invalid", error: "session daemon runtime response did not include an active agent profile" };
}
return { status: "available", profile: runtime.activeAgentProfile };
}
function errorMessage(error: unknown): string {
return error instanceof Error ? error.message : String(error);
}