Server:
- download-pdf-stream: check if PDF already exists (size > 1KB) → return
cached path immediately, skip all network requests
Client (startPrep):
- save pdfPaths from prepLog before reset → skip PMC download if path known
- skip text extraction if paperTexts[key] already loaded in memory
- text from project open (onOpenProjChange) now survives "다시 실행"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Image extraction now immediately followed by per-figure mistral analysis
no manual button click needed: extract → analyze runs as one atomic flow
- Progress shows "이미지 분석 1/5..." inline with prep step
- Captions + 제외 filtering available before outline generation
- "🔍 재분석" button retained for manual uploads / re-run on failures
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
gpt-oss:120b-cloud refuses even short medical texts with "텍스트가 너무 길어...".
Add model:'mistral-large-3:675b-cloud' explicitly to three wizard /api/chat calls:
- translateAbstract() — abstract Korean translation
- chatStream() — PDF text chunk translation (used by translatePdfText)
- generateOutline() — slide outline generation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- pptx-wizard: add "🔍 이미지 분석" button in Step 2 image panel
* calls /api/pptx/analyze-image per figure via mistral vision
* shows per-image progress (1/10, 2/10...)
* "제외" caption → dimmed card + filtered from outline prompt
* captions shown below each thumbnail in the grid
- server: POST /api/pptx/analyze-image endpoint
* resolves /api/files/ path to workspace file, thumbnails if >300KB
* calls orchestration.secondary vision model (mistral-large-3:675b-cloud)
* caches results in project/.image-captions.json (skips on re-analysis)
- pptx-wizard: generateOutline() includes captions in imgList
* "제외" images filtered out before sending to LLM
* format: "/api/files/... (figure_p2_1) — 카플란-마이어 생존곡선 3그룹"
- skills-manager: fix getModelOverrideForUser() trigger filtering
* was returning skill model for ALL messages regardless of trigger keywords
* now only overrides when message matches skill triggers (same logic as buildPromptContext)
* presenter model (mistral) now only applies for 발표/pptx/슬라이드 keywords
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix pptx-wizard slide editor modal opening off-screen (header clipped)
when a saved drag position is restored on a fresh page load: clear the
CSS centering transform and clamp coordinates into the viewport.
- Add pptx-wizard.html and python-runner.html web UIs.
- Bump version to 2.8.1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>