- Initialize materialSource via WritingFormProvider initialMaterialSource prop
- Don't clear selectedNotebookId/selectedDocumentIds on source switch when studioToken is set
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace useEffect-based approach with synchronous effectiveMaterialSource
derived value to avoid first-render flash and timing issues.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auto-switch materialSource to 'notebook' on mount when initialNotebookId is set
- Replace material source dropdown with static label when studioToken is present
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- NotebookAIWritingPage reads `token` from URL, fetches space data from
notebook-token API (search_space_id, doc_ids, user_token) and space
name from searchspaces API; keep-alive ping every 50s resets Redis TTL
- Pass user_token as studioToken through AIWritingPage → AIWritingLayout
→ WritingFormPanel → AIWritingPanel → AIWritingForm to skip
getTokenByEmail when studio token is already available
- useStudioNotebooks accepts enabled flag; useNotebookSources accepts
overrideToken to bypass the internal token fetch
- AIWritingForm hides notebook selector when studioToken is provided
(notebook is pre-locked) and pre-selects initialDocumentIds
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add document-upload-popup.tsx with tabs for B系统/A系统/Y系统/XWT/upload
- Add network-actor.tsx for XWT search tab
- Add empty.tsx for empty state
- Refactor SourcesDialog: left panel becomes single "上传来源" button that opens new popup
- Wire DocumentUploadDialogProvider around StudioNotebookDetailPage
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Revert skill settings to vertical list layout with pinned sorting
- Default leaderboard range 30d -> 7d, hide stats while report generating
- Reframe leaderboard report prompt as user-behavior analysis (cache v5)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
apiFetch now redirects to login only on a genuine backend 401 (auth endpoints excluded, only when previously logged in). AuthSyncWatcher no longer treats localStorage.clear()/unrelated writes as a logout, fixing spurious sign-outs (e.g. when uploading skills).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>