qwen-code/packages/web-shell/client/utils/sessionPreparation.ts
ytahdn 1467ed3100
fix(web-shell): defer session creation until first prompt (#6066)
* fix(web-shell): defer session creation until first prompt

* fix(web-shell): stabilize deferred session attach

* docs(web-shell): document optional session change callback

* test(web-shell): cover deferred session setup failures

* fix(webui): preserve concurrent session load on clear

* fix(web-shell): keep session prep helper in utils

* fix(web-shell): harden deferred session lifecycle

* fix(web-shell): guard deferred session races

* fix(web-shell): simplify controlled session selection

* fix(web-shell): tighten empty session edge cases

* fix(web-shell): tighten deferred session lifecycle

* test(webui): align session action mocks with daemon types

* fix(web-shell): notify cleared session ids

* fix(webui): guard session cleanup races

* fix(web-shell): preserve blocked local commands

---------

Co-authored-by: ytahdn <ytahdn@gmail.com>
Co-authored-by: 易良 <1204183885@qq.com>
2026-07-01 14:04:37 +00:00

58 lines
1.8 KiB
TypeScript

import {
DAEMON_APPROVAL_MODES,
type DaemonApprovalMode,
} from '@qwen-code/webui/daemon-react-sdk';
type PromptSessionActions = {
createSession: () => Promise<unknown>;
attachSession: () => Promise<void>;
closeSession: () => Promise<void>;
clearSession: () => Promise<void>;
setModel: (modelId: string) => Promise<unknown>;
setApprovalMode: (mode: DaemonApprovalMode) => Promise<unknown>;
};
export function isDaemonApprovalMode(mode: string): mode is DaemonApprovalMode {
return DAEMON_APPROVAL_MODES.includes(mode as DaemonApprovalMode);
}
export async function createAndAttachSessionForPrompt({
sessionActions,
modelId,
modeId,
warn = console.warn,
}: {
sessionActions: PromptSessionActions;
modelId?: string;
modeId?: string;
warn?: (message?: unknown, ...optionalParams: unknown[]) => void;
}): Promise<void> {
await sessionActions.createSession();
try {
await sessionActions.attachSession();
} catch (error) {
warn('[WebShell] failed to attach new session:', error);
await sessionActions.closeSession().catch((closeError: unknown) => {
warn('[WebShell] failed to close unattached session:', closeError);
});
await sessionActions.clearSession().catch((clearError: unknown) => {
warn('[WebShell] failed to clear unattached session:', clearError);
});
throw error;
}
await Promise.all([
modelId
? sessionActions.setModel(modelId).catch((error: unknown) => {
warn('[WebShell] failed to set model for new session:', error);
})
: Promise.resolve(),
modeId && isDaemonApprovalMode(modeId)
? sessionActions.setApprovalMode(modeId).catch((error: unknown) => {
warn(
'[WebShell] failed to set approval mode for new session:',
error,
);
})
: Promise.resolve(),
]);
}