fix: resolve 6 remaining defects (P2-18, P2-21, P3-04, P3-05, P3-06, P3-02)
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled

- P2-18: TOTP QR code local generation via qrcode lib (no external service)
- P2-21: Suspend foreign LLM providers (OpenAI/Anthropic/Gemini) for early stage
- P3-04: get_progress() now calculates actual percentage from completed/total steps
- P3-05: saveSaaSSession calls now have .catch() error logging
- P3-06: SaaS relay chatStream passes session_key/agent_id to backend
- P3-02: Whiteboard unification plan document created

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-04-06 09:52:28 +08:00
parent d3da7d4dbb
commit 828be3cc9e
13 changed files with 414 additions and 58 deletions

View File

@@ -209,7 +209,9 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
account: loginData.account,
saasUrl: normalizedUrl,
};
saveSaaSSession(sessionData); // async — fire and forget (non-blocking)
saveSaaSSession(sessionData).catch((e) =>
log.warn('Failed to persist SaaS session after login', { error: e })
);
saveConnectionMode('saas');
set({
@@ -309,7 +311,9 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
account: loginData.account,
saasUrl: normalizedUrl,
};
saveSaaSSession(sessionData);
saveSaaSSession(sessionData).catch((e) =>
log.warn('Failed to persist SaaS session after TOTP login', { error: e })
);
saveConnectionMode('saas');
set({
@@ -374,7 +378,9 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
account: registerData.account,
saasUrl: normalizedUrl,
};
saveSaaSSession(sessionData);
saveSaaSSession(sessionData).catch((e) =>
log.warn('Failed to persist SaaS session after register', { error: e })
);
saveConnectionMode('saas');
set({
@@ -784,7 +790,9 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
await saasClient.verifyTotp(code);
const account = await saasClient.me();
const { saasUrl } = get();
saveSaaSSession({ token: null, account, saasUrl }); // Token in saasClient memory only
saveSaaSSession({ token: null, account, saasUrl }).catch((e) =>
log.warn('Failed to persist SaaS session after verifyTotp', { error: e })
); // Token in saasClient memory only
set({ totpSetupData: null, isLoading: false, account });
} catch (err: unknown) {
const message = err instanceof SaaSApiError ? err.message
@@ -800,7 +808,9 @@ export const useSaaSStore = create<SaaSStore>((set, get) => {
await saasClient.disableTotp(password);
const account = await saasClient.me();
const { saasUrl } = get();
saveSaaSSession({ token: null, account, saasUrl });
saveSaaSSession({ token: null, account, saasUrl }).catch((e) =>
log.warn('Failed to persist SaaS session after disableTotp', { error: e })
);
set({ isLoading: false, account });
} catch (err: unknown) {
const message = err instanceof SaaSApiError ? err.message