import type { GatewayClient } from "../gateway/client.js" ;
import { readBool, readString } from "./meta.js" ;
import type { AcpServerOptions } from "./types.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 });
}
Messung V0.5 in Prozent C=99 H=98 G=98
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland