fix: isolate concurrent OpenCode chat runs
This commit is contained in:
@@ -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) => (
|
||||
|
||||
Reference in New Issue
Block a user