mirror of
https://github.com/QwenLM/qwen-code.git
synced 2026-08-16 20:24:50 +00:00
* 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>
58 lines
1.8 KiB
TypeScript
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(),
|
|
]);
|
|
}
|