fix(coding-agent): decouple codex session cleanup
This commit is contained in:
@@ -16,14 +16,10 @@ export type {
|
|||||||
OpenAICodexResponsesOptions,
|
OpenAICodexResponsesOptions,
|
||||||
OpenAICodexWebSocketDebugStats,
|
OpenAICodexWebSocketDebugStats,
|
||||||
} from "./providers/openai-codex-responses.js";
|
} from "./providers/openai-codex-responses.js";
|
||||||
export {
|
|
||||||
closeOpenAICodexWebSocketSessions,
|
|
||||||
getOpenAICodexWebSocketDebugStats,
|
|
||||||
resetOpenAICodexWebSocketDebugStats,
|
|
||||||
} from "./providers/openai-codex-responses.js";
|
|
||||||
export type { OpenAICompletionsOptions } from "./providers/openai-completions.js";
|
export type { OpenAICompletionsOptions } from "./providers/openai-completions.js";
|
||||||
export type { OpenAIResponsesOptions } from "./providers/openai-responses.js";
|
export type { OpenAIResponsesOptions } from "./providers/openai-responses.js";
|
||||||
export * from "./providers/register-builtins.js";
|
export * from "./providers/register-builtins.js";
|
||||||
|
export * from "./session-resources.js";
|
||||||
export * from "./stream.js";
|
export * from "./stream.js";
|
||||||
export * from "./types.js";
|
export * from "./types.js";
|
||||||
export * from "./utils/diagnostics.js";
|
export * from "./utils/diagnostics.js";
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ if (typeof process !== "undefined" && (process.versions?.node || process.version
|
|||||||
|
|
||||||
import { getEnvApiKey } from "../env-api-keys.js";
|
import { getEnvApiKey } from "../env-api-keys.js";
|
||||||
import { clampThinkingLevel } from "../models.js";
|
import { clampThinkingLevel } from "../models.js";
|
||||||
|
import { registerSessionResourceCleanup } from "../session-resources.js";
|
||||||
import type {
|
import type {
|
||||||
Api,
|
Api,
|
||||||
AssistantMessage,
|
AssistantMessage,
|
||||||
@@ -682,6 +683,8 @@ export function closeOpenAICodexWebSocketSessions(sessionId?: string): void {
|
|||||||
websocketSessionCache.clear();
|
websocketSessionCache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
registerSessionResourceCleanup(closeOpenAICodexWebSocketSessions);
|
||||||
|
|
||||||
function isWebSocketSseFallbackActive(sessionId: string | undefined): boolean {
|
function isWebSocketSseFallbackActive(sessionId: string | undefined): boolean {
|
||||||
return sessionId ? websocketSseFallbackSessions.has(sessionId) : false;
|
return sessionId ? websocketSseFallbackSessions.has(sessionId) : false;
|
||||||
}
|
}
|
||||||
|
|||||||
24
packages/ai/src/session-resources.ts
Normal file
24
packages/ai/src/session-resources.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
export type SessionResourceCleanup = (sessionId?: string) => void;
|
||||||
|
|
||||||
|
const sessionResourceCleanups = new Set<SessionResourceCleanup>();
|
||||||
|
|
||||||
|
export function registerSessionResourceCleanup(cleanup: SessionResourceCleanup): () => void {
|
||||||
|
sessionResourceCleanups.add(cleanup);
|
||||||
|
return () => {
|
||||||
|
sessionResourceCleanups.delete(cleanup);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function cleanupSessionResources(sessionId?: string): void {
|
||||||
|
const errors: unknown[] = [];
|
||||||
|
for (const cleanup of sessionResourceCleanups) {
|
||||||
|
try {
|
||||||
|
cleanup(sessionId);
|
||||||
|
} catch (error) {
|
||||||
|
errors.push(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (errors.length > 0) {
|
||||||
|
throw new AggregateError(errors, "Failed to cleanup session resources");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,12 +26,12 @@ import type {
|
|||||||
import type { AssistantMessage, ImageContent, Message, Model, TextContent } from "@mariozechner/pi-ai";
|
import type { AssistantMessage, ImageContent, Message, Model, TextContent } from "@mariozechner/pi-ai";
|
||||||
import {
|
import {
|
||||||
clampThinkingLevel,
|
clampThinkingLevel,
|
||||||
|
cleanupSessionResources,
|
||||||
getSupportedThinkingLevels,
|
getSupportedThinkingLevels,
|
||||||
isContextOverflow,
|
isContextOverflow,
|
||||||
modelsAreEqual,
|
modelsAreEqual,
|
||||||
resetApiProviders,
|
resetApiProviders,
|
||||||
} from "@mariozechner/pi-ai";
|
} from "@mariozechner/pi-ai";
|
||||||
import { closeOpenAICodexWebSocketSessions } from "@mariozechner/pi-ai/openai-codex-responses";
|
|
||||||
import { theme } from "../modes/interactive/theme/theme.js";
|
import { theme } from "../modes/interactive/theme/theme.js";
|
||||||
import { stripFrontmatter } from "../utils/frontmatter.js";
|
import { stripFrontmatter } from "../utils/frontmatter.js";
|
||||||
import { sleep } from "../utils/sleep.js";
|
import { sleep } from "../utils/sleep.js";
|
||||||
@@ -753,7 +753,7 @@ export class AgentSession {
|
|||||||
);
|
);
|
||||||
this._disconnectFromAgent();
|
this._disconnectFromAgent();
|
||||||
this._eventListeners = [];
|
this._eventListeners = [];
|
||||||
closeOpenAICodexWebSocketSessions(this.sessionId);
|
cleanupSessionResources(this.sessionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =========================================================================
|
// =========================================================================
|
||||||
|
|||||||
Reference in New Issue
Block a user