fix: isolate concurrent OpenCode chat runs

This commit is contained in:
2026-08-17 22:03:37 +08:00
parent 7e8d9e3811
commit 65040730ec
29 changed files with 5207 additions and 427 deletions

View File

@@ -812,6 +812,7 @@ export function CharacterScene() {
const [providerSnapshotLoaded, setProviderSnapshotLoaded] = useState(false);
const [autoUserModelSyncAttempted, setAutoUserModelSyncAttempted] = useState(false);
const [syncingUserModels, setSyncingUserModels] = useState(false);
const [runtimeRefreshRequired, setRuntimeRefreshRequired] = useState(false);
const [knowledgeItems, setKnowledgeItems] = useState<KnowledgeFile[]>(knowledgeFiles);
const [knowledgeNotice, setKnowledgeNotice] = useState<string | null>(null);
const [knowledgeDragActive, setKnowledgeDragActive] = useState(false);
@@ -909,7 +910,10 @@ export function CharacterScene() {
setAutoUserModelSyncAttempted(true);
setSyncingUserModels(true);
void importUserModelConfig(accessToken)
void importUserModelConfig(accessToken, { runtimeRefresh: 'defer' })
.then((result) => {
setRuntimeRefreshRequired(result.runtimeRefreshRequired);
})
.catch((error) => {
console.warn('[makelore] Failed to auto-sync current user model config', error);
})
@@ -940,7 +944,7 @@ export function CharacterScene() {
let result: Awaited<ReturnType<typeof importUserModelConfig>>;
try {
result = await importUserModelConfig(validAccessToken);
result = await importUserModelConfig(validAccessToken, { runtimeRefresh: 'apply' });
} catch (error) {
if (!isUnauthorizedModelConfigError(error)) {
throw error;
@@ -949,7 +953,7 @@ export function CharacterScene() {
if (!refreshedAccessToken) {
throw error;
}
result = await importUserModelConfig(refreshedAccessToken);
result = await importUserModelConfig(refreshedAccessToken, { runtimeRefresh: 'apply' });
}
const importedModelCount = new Set([
@@ -958,6 +962,7 @@ export function CharacterScene() {
...result.importedModels,
].filter(Boolean)).size;
setProviderSnapshotLoaded(true);
setRuntimeRefreshRequired(false);
toast.success('已重新拉取远端模型配置', {
description: importedModelCount > 0 ? `同步 ${importedModelCount} 个模型` : '模型列表已更新',
});
@@ -1253,9 +1258,17 @@ export function CharacterScene() {
onClick={handleRefreshUserModelConfig}
>
<RefreshCw className={cn('h-4 w-4', syncingUserModels && 'animate-spin')} />
{syncingUserModels ? '重新拉取中...' : '重新拉取远端模型配置'}
{syncingUserModels ? '应用中...' : '重新拉取并应用模型配置'}
</Button>
</div>
{runtimeRefreshRequired ? (
<p
data-testid="makelore-runtime-refresh-pending"
className="mb-4 rounded-lg border border-brand/20 bg-brand-soft px-3 py-2 text-sm text-foreground"
>
模型列表已更新。准备好重启运行时后,点击“重新拉取并应用模型配置”。
</p>
) : null}
<h3 className="mb-2 font-semibold">已通过的模型</h3>
<div className="space-y-3">
{approvedModels.map((model) => (