92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
import type { GatewayClient } from "../gateway/client.js";
|
|
|
|
import type { AcpServerOptions } from "./types.js";
|
|
import { readBool, readString } from "./meta.js";
|
|
|
|
export type AcpSessionMeta = {
|
|
sessionKey?: string;
|
|
sessionLabel?: string;
|
|
resetSession?: boolean;
|
|
requireExisting?: boolean;
|
|
prefixCwd?: boolean;
|
|
};
|
|
|
|
export function parseSessionMeta(meta: unknown): AcpSessionMeta {
|
|
if (!meta || typeof meta !== "object") return {};
|
|
const record = meta as Record<string, unknown>;
|
|
return {
|
|
sessionKey: readString(record, ["sessionKey", "session", "key"]),
|
|
sessionLabel: readString(record, ["sessionLabel", "label"]),
|
|
resetSession: readBool(record, ["resetSession", "reset"]),
|
|
requireExisting: readBool(record, ["requireExistingSession", "requireExisting"]),
|
|
prefixCwd: readBool(record, ["prefixCwd"]),
|
|
};
|
|
}
|
|
|
|
export async function resolveSessionKey(params: {
|
|
meta: AcpSessionMeta;
|
|
fallbackKey: string;
|
|
gateway: GatewayClient;
|
|
opts: AcpServerOptions;
|
|
}): Promise<string> {
|
|
const requestedLabel = params.meta.sessionLabel ?? params.opts.defaultSessionLabel;
|
|
const requestedKey = params.meta.sessionKey ?? params.opts.defaultSessionKey;
|
|
const requireExisting =
|
|
params.meta.requireExisting ?? params.opts.requireExistingSession ?? false;
|
|
|
|
if (params.meta.sessionLabel) {
|
|
const resolved = await params.gateway.request<{ ok: true; key: string }>("sessions.resolve", {
|
|
label: params.meta.sessionLabel,
|
|
});
|
|
if (!resolved?.key) {
|
|
throw new Error(`Unable to resolve session label: ${params.meta.sessionLabel}`);
|
|
}
|
|
return resolved.key;
|
|
}
|
|
|
|
if (params.meta.sessionKey) {
|
|
if (!requireExisting) return params.meta.sessionKey;
|
|
const resolved = await params.gateway.request<{ ok: true; key: string }>("sessions.resolve", {
|
|
key: params.meta.sessionKey,
|
|
});
|
|
if (!resolved?.key) {
|
|
throw new Error(`Session key not found: ${params.meta.sessionKey}`);
|
|
}
|
|
return resolved.key;
|
|
}
|
|
|
|
if (requestedLabel) {
|
|
const resolved = await params.gateway.request<{ ok: true; key: string }>("sessions.resolve", {
|
|
label: requestedLabel,
|
|
});
|
|
if (!resolved?.key) {
|
|
throw new Error(`Unable to resolve session label: ${requestedLabel}`);
|
|
}
|
|
return resolved.key;
|
|
}
|
|
|
|
if (requestedKey) {
|
|
if (!requireExisting) return requestedKey;
|
|
const resolved = await params.gateway.request<{ ok: true; key: string }>("sessions.resolve", {
|
|
key: requestedKey,
|
|
});
|
|
if (!resolved?.key) {
|
|
throw new Error(`Session key not found: ${requestedKey}`);
|
|
}
|
|
return resolved.key;
|
|
}
|
|
|
|
return params.fallbackKey;
|
|
}
|
|
|
|
export async function resetSessionIfNeeded(params: {
|
|
meta: AcpSessionMeta;
|
|
sessionKey: string;
|
|
gateway: GatewayClient;
|
|
opts: AcpServerOptions;
|
|
}): Promise<void> {
|
|
const resetSession = params.meta.resetSession ?? params.opts.resetSession ?? false;
|
|
if (!resetSession) return;
|
|
await params.gateway.request("sessions.reset", { key: params.sessionKey });
|
|
}
|