update chat

This commit is contained in:
Harivansh Rathi 2026-03-12 01:51:33 -04:00
parent 4dc5e1b376
commit 08717ea6d1
2 changed files with 283 additions and 117 deletions

View file

@ -267,7 +267,7 @@ export class GatewayRuntime {
sessionKey: string,
listener: (event: GatewayEvent) => void,
): Promise<() => void> {
const managedSession = await this.requireExistingSession(sessionKey);
const managedSession = await this.ensureSession(sessionKey);
managedSession.listeners.add(listener);
listener({
type: "hello",
@ -674,7 +674,10 @@ export class GatewayRuntime {
if (!teamId) continue;
const rawMembers = Array.isArray(p.members) ? p.members : [];
const members = rawMembers
.filter((m): m is Record<string, unknown> => typeof m === "object" && m !== null)
.filter(
(m): m is Record<string, unknown> =>
typeof m === "object" && m !== null,
)
.map((m) => ({
id: typeof m.id === "string" ? m.id : "",
name: typeof m.name === "string" ? m.name : "Teammate",
@ -810,7 +813,28 @@ export class GatewayRuntime {
request: IncomingMessage,
response: ServerResponse,
): Promise<void> {
const origin = request.headers.origin;
if (origin) {
response.setHeader("Access-Control-Allow-Origin", origin);
response.setHeader(
"Access-Control-Allow-Methods",
"GET, POST, PUT, PATCH, DELETE, OPTIONS",
);
response.setHeader(
"Access-Control-Allow-Headers",
"Content-Type, Authorization",
);
response.setHeader("Access-Control-Allow-Credentials", "true");
}
const method = request.method ?? "GET";
if (method === "OPTIONS") {
response.writeHead(204);
response.end();
return;
}
const url = new URL(
request.url ?? "/",
`http://${request.headers.host ?? `${this.config.bind}:${this.config.port}`}`,
@ -989,7 +1013,7 @@ export class GatewayRuntime {
const action = sessionMatch[2];
if (!action && method === "GET") {
const session = await this.requireExistingSession(sessionKey);
const session = await this.ensureSession(sessionKey);
this.writeJson(response, 200, { session: this.createSnapshot(session) });
return;
}
@ -1176,7 +1200,8 @@ export class GatewayRuntime {
response.write("\n");
const listener = createVercelStreamListener(response);
const structuredPartListener = createGatewayStructuredPartListener(response);
const structuredPartListener =
createGatewayStructuredPartListener(response);
let unsubscribe: (() => void) | undefined;
let unsubscribeStructured: (() => void) | undefined;
let streamingActive = false;
@ -1361,7 +1386,7 @@ export class GatewayRuntime {
provider: string,
modelId: string,
): Promise<{ ok: true; model: { provider: string; modelId: string } }> {
const managed = await this.requireExistingSession(sessionKey);
const managed = await this.ensureSession(sessionKey);
const found = managed.session.modelRegistry.find(provider, modelId);
if (!found) {
throw new HttpError(404, `Model not found: ${provider}/${modelId}`);
@ -1467,7 +1492,8 @@ export class GatewayRuntime {
}
private getCompanionChannelsSettings(): CompanionChannelsSettings {
const globalSettings = this.primarySession.settingsManager.getGlobalSettings();
const globalSettings =
this.primarySession.settingsManager.getGlobalSettings();
const projectSettings =
this.primarySession.settingsManager.getProjectSettings();
const mergedSettings = mergeRecords(
@ -1475,7 +1501,9 @@ export class GatewayRuntime {
isRecord(projectSettings) ? projectSettings : {},
);
const piChannels = mergedSettings["companion-channels"];
return isRecord(piChannels) ? (piChannels as CompanionChannelsSettings) : {};
return isRecord(piChannels)
? (piChannels as CompanionChannelsSettings)
: {};
}
private buildSlackChannelStatus(
@ -1497,7 +1525,8 @@ export class GatewayRuntime {
if (hasConfig) {
if (!adapter) {
error = 'Slack requires `companion-channels.adapters.slack = { "type": "slack" }`.';
error =
'Slack requires `companion-channels.adapters.slack = { "type": "slack" }`.';
} else if (adapterType !== "slack") {
error = 'Slack adapter type must be "slack".';
} else if (!appToken) {
@ -1546,7 +1575,8 @@ export class GatewayRuntime {
} else if (adapterType !== "telegram") {
error = 'Telegram adapter type must be "telegram".';
} else if (!botToken) {
error = "Telegram requires companion-channels.adapters.telegram.botToken.";
error =
"Telegram requires companion-channels.adapters.telegram.botToken.";
} else if (!pollingEnabled) {
error =
"Telegram requires companion-channels.adapters.telegram.polling = true.";