Improve WeChat MP replies and ship MindSpace/H5 production updates.

Add WeChat service account routing with sync acks, connectivity tests, and context isolation; document deploy runbooks; and bundle related MindSpace, voice, Plaza, and server gateway changes for production rollout.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-06-19 23:06:43 +08:00
parent b0f5d6a51c
commit 229805a070
241 changed files with 13190 additions and 902 deletions
+16 -12
View File
@@ -595,13 +595,13 @@ export function createLlmProviderService(
]);
}
async function syncRow(row) {
async function syncRow(row, fetchImpl = apiFetchImpl) {
const profile = profileFromRow(row, decryptRow);
const goosedProviderId = await syncProfileToGoosed(
apiTarget,
apiSecret,
profile,
apiFetchImpl,
fetchImpl,
);
if (profile.providerKind === 'custom' && goosedProviderId !== row.goosed_provider_id) {
await pool.query(
@@ -635,7 +635,7 @@ export function createLlmProviderService(
return { ok: true, model: profile.defaultModel };
}
async function resolveSelectedProvider() {
async function resolveSelectedProvider(fetchImpl = apiFetchImpl) {
const row = await getSelectedRow();
if (!row) {
return { ok: false, message: '请先启用 LLM 配置' };
@@ -649,7 +649,7 @@ export function createLlmProviderService(
};
}
try {
const goosedProviderId = await syncRow(row);
const goosedProviderId = await syncRow(row, fetchImpl);
const providerId =
profile.providerKind === 'custom'
? (goosedProviderId ?? profile.goosedProviderId ?? profile.providerId)
@@ -669,7 +669,7 @@ export function createLlmProviderService(
}
/** Local fallback is only for DeepSeek creditsExhausted — never auto-selected at boot/session start. */
async function resolveLocalFallbackProvider() {
async function resolveLocalFallbackProvider(fetchImpl = apiFetchImpl) {
let localTest;
try {
localTest = await testLocalLlmConnection(apiFetchImpl);
@@ -688,7 +688,7 @@ export function createLlmProviderService(
const providerId = await ensureLocalFallbackProviderOnGoosed(
apiTarget,
apiSecret,
apiFetchImpl,
fetchImpl,
);
return {
ok: true,
@@ -967,22 +967,26 @@ export function createLlmProviderService(
};
},
async applyBestProviderForSession(sessionId) {
const resolved = await resolveSelectedProvider();
async applyBestProviderForSession(sessionId, fetchImpl = apiFetchImpl) {
const resolved = await resolveSelectedProvider(fetchImpl);
if (!resolved.ok) {
return resolved;
}
await updateSessionProvider(goosedApi, sessionId, resolved.providerId, resolved.model);
const sessionGoosedApi = (pathname, init) =>
goosedApiFetch(apiTarget, apiSecret, pathname, init, fetchImpl);
await updateSessionProvider(sessionGoosedApi, sessionId, resolved.providerId, resolved.model);
return resolved;
},
/** Switch session to local Ollama (credits exhausted or relay 500 payload limit). */
async applyLocalFallbackForSession(sessionId) {
const resolved = await resolveLocalFallbackProvider();
async applyLocalFallbackForSession(sessionId, fetchImpl = apiFetchImpl) {
const resolved = await resolveLocalFallbackProvider(fetchImpl);
if (!resolved.ok) {
return resolved;
}
await updateSessionProvider(goosedApi, sessionId, resolved.providerId, resolved.model);
const sessionGoosedApi = (pathname, init) =>
goosedApiFetch(apiTarget, apiSecret, pathname, init, fetchImpl);
await updateSessionProvider(sessionGoosedApi, sessionId, resolved.providerId, resolved.model);
return resolved;
},