Releases: lumina-apps/obsidian-lumina
1.0.20
1.0.19
Lumina v1.0.19 — Release Notes
Refactoring & Improvements
Worker Bridge & Embedding Worker Refactored
- Embedded worker source code is now stored as a compressed (deflate) Base64 constant in
workerCode.ts, reducing the plugin bundle size. - Decompression is handled at runtime using the browser-native
DecompressionStreamAPI, eliminating the need for a third-party decompression library. - The worker bridge (
EmbeddingWorkerBridge) now imports the compressed code directly, simplifying the initialization logic inmain.ts.
Improved ONNX WASM Loading Strategy
- Previously, the ONNX WASM files were always loaded from the local plugin directory. This caused failures when the plugin directory was unavailable (e.g., during certain development environments).
- Now, the worker prioritizes the local plugin directory for WASM files, but falls back to CDN when the plugin directory is not provided. The CDN fallback is safe — esbuild's process polyfill prevents Node.js-specific code paths from executing in the Worker context.
Code Cleanup
- Removed inline worker code generation from
main.tsand consolidated it intoworkerBridge.ts. - Simplified the
pluginDirparameter handling — always passed to the worker, but optional fallback logic is now handled internally.
리팩토링 및 개선
워커 브릿지 및 임베딩 워커 리팩토링
- 워커 소스 코드를
workerCode.ts에 Deflate 압축된 Base64 상수로 저장하여 플러그인 번들 크기를 줄였습니다. - 압축 해제는 브라우저 네이티브
DecompressionStreamAPI를 사용하여 런타임에 처리되며, 서드파티 압축 해제 라이브러리가 더 이상 필요하지 않습니다. EmbeddingWorkerBridge가 압축된 코드를 직접 가져오도록 변경되어,main.ts의 초기화 로직이 단순화되었습니다.
ONNX WASM 로드 전략 개선
- 이전에는 항상 로컬 플러그인 디렉토리에서 ONNX WASM 파일을 로드했으나, 플러그인 디렉토리를 사용할 수 없는 환경(예: 특정 개발 환경)에서는 로드에 실패하는 문제가 있었습니다.
- 이제 워커는 로컬 디렉토리를 우선 사용하되, 플러그인 디렉토리 정보가 없으면 CDN으로 폴백합니다. CDN 폴백은 안전하게 동작하며, esbuild의 process 폴리필 덕분에 Worker 컨텍스트에서 Node.js 전용 코드 경로가 실행되지 않습니다.
코드 정리
main.ts에 있던 인라인 워커 코드 생성 로직을 제거하고workerBridge.ts로 통합했습니다.pluginDir파라미터 처리를 단순화하여 항상 워커에 전달하되, 폴백 로직은 내부에서 처리하도록 개선했습니다.
1.0.18
Lumina v1.0.18 — Release Notes
🔧 Improvements
-
Embedding worker configuration (
esbuild.config.mjs,embedding.worker.ts)- Added Node.js dynamic import stubs (
worker_threads,module,fs,path) for browser Worker environment - Prevents
failed to resolve module specifiererrors in ONNX Runtime WASM loading
- Added Node.js dynamic import stubs (
-
RAG error handling (
src/main.ts)- Added fallback: if embedding worker initialization fails, automatically disables RAG toggle to prevent UI state inconsistency
- Improved user experience by keeping settings UI in sync with actual worker state
🔧 개선 사항
-
임베딩 워커 설정 개선 (
esbuild.config.mjs,embedding.worker.ts)- 브라우저 Worker 환경에서 ONNX Runtime WASM 로드 시 발생하는
failed to resolve module specifier오류 방지를 위해 Node.js 동적 import 스텁 추가 (worker_threads,module,fs,path)
- 브라우저 Worker 환경에서 ONNX Runtime WASM 로드 시 발생하는
-
RAG 오류 처리 개선 (
src/main.ts)- 임베딩 워커 초기화 실패 시 RAG 토글을 자동으로 비활성화하여 UI 상태 불일치 방지
- 워커 상태와 UI 설정이 항상 일치하도록 개선
1.0.17
Lumina v1.0.17 — Release Notes
New Modules
tagExtractor.ts— Pure function module for tag recommendation logic. Extracts tags from frontmatter, body text, cached metadata, and file paths, then scores them. Previously embedded inupdateContext()(~60 lines), now reusable and testable.DiscoveryCard.svelte— Reusable card component replacing ~30 lines of duplicated template code between Search mode and Context mode.DiscoveryStagingArea.svelte— Extracted staging area (selected documents, token progress bar, chat start button) into an independent component.
Performance Fixes
- Fixed
$effectcleanup — Timer cleanup functions were previously commented out, causing memory leaks and ghost state updates after component unmount. All$effectandonMountblocks now properly clean up timers on unmount. - Deduplicated context searches — Added
lastSearchedFilePathguard to skip redundant API/vector search calls when switching between files rapidly. - Separated
filterQueryfrom context$effect—filterQueryno longer triggersupdateContext(). It only performs client-side filtering viafilterChunks(), eliminating unnecessary full context refreshes while typing filters. - Unified
isSearchingstate — Removed redundant store updates; local state is now the single source of truth. - Removed unnecessary
node.empty()— Eliminated redundant DOM manipulation in the icon action. - Cleaned up unused import — Removed
settingsStoreimport.
새로운 모듈
tagExtractor.ts— 태그 추천 로직을 담은 순수 함수 모듈. 프론트매터, 본문, 캐시 메타데이터, 파일 경로에서 태그를 추출하고 점수를 계산합니다. 기존에는updateContext()에 60라인으로 내장되어 있었으나, 이제 재사용 가능하고 테스트하기 쉬운 구조가 되었습니다.DiscoveryCard.svelte— 검색 모드와 Context 모드에서 중복되던 약 30라인의 카드 템플릿을 단일 재사용 컴포넌트로 대체했습니다.DiscoveryStagingArea.svelte— 스테이징 영역(선택된 문서, 토큰 진행바, 채팅 시작 버튼)을 독립 컴포넌트로 분리했습니다.
성능 개선
$effectcleanup 수정 — 타이머 정리 함수가 이전에 주석 처리되어 있어 컴포넌트 언마운트 후 메모리 릭과 고스트 상태 업데이트가 발생했습니다. 모든$effect와onMount블록이 이제 언마운트 시 타이머를 제대로 정리합니다.- 중복 context 검색 방지 —
lastSearchedFilePath가드를 추가하여 파일을 빠르게 전환할 때 불필요한 API/벡터 검색 호출을 건너뜁니다. filterQuery를 context$effect에서 분리 —filterQuery가 더 이상updateContext()를 트리거하지 않습니다.filterChunks()를 통한 클라이언트 사이드 필터링만 수행하여 필터 타이핑 중 불필요한 전체 컨텍스트 갱신을 제거했습니다.isSearching상태 단일화 — 중복된 스토어 업데이트를 제거하고 로컬 상태만 사용합니다.- 불필요한
node.empty()제거 — icon 액션에서 불필요한 DOM 조작을 제거했습니다. - 사용하지 않는 import 정리 —
settingsStoreimport를 제거했습니다.
1.0.16
Lumina v1.0.16 — Release Notes
🐛 Bug Fixes
- Prevent accidental index wipe on startup: Fixed an issue where a delayed Obsidian file cache could return an empty file list during initial index loading, causing the entire RAG index to be discarded. The indexer now detects this condition and preserves existing indexed data.
- Deleted file handling: Files removed from the vault are now properly cleaned up from the RAG index during incremental updates.
- Embedding Worker SIMD + Multi-threading: Added runtime detection of
SharedArrayBufferto enable multi-threaded WASM inference in environments that support it (Obsidian Electron). Falls back gracefully to single-threaded mode otherwise. SIMD WASM is now explicitly enabled for faster embeddings.
⚡ Performance Improvements
- Parallel file reading: Files are now read and chunked concurrently (up to 32 files at once), overlapping I/O wait times. This dramatically reduces total indexing time, especially for vaults with thousands of files.
- Content-hash skip optimization: Changed files that have identical content but different
mtime(e.g., touched without modification) are now detected via a content hash and skipped for re-embedding entirely. - Batched embedding: Chunks are now sent to the embedding worker in batches of 64, reducing the number of worker round-trips and improving throughput.
- Batched UI progress updates: Store updates are batched (every 20 files) to prevent UI flooding during large indexing runs (10,000+ files).
🐛 버그 수정
- 시작 시 인덱스 초기화 방지: 옵시디언 파일 캐시 로딩 지연으로 인해 인덱스 로드 시점에 파일 목록이 비어있을 경우, 기존 RAG 인덱스 전체가 사라지는 버그를 수정했습니다. 이제 이런 상황을 감지하고 기존 인덱스를 보존합니다.
- 삭제된 파일 정리: 볼트에서 삭제된 파일이 증분 업데이트 시 RAG 인덱스에서도 올바르게 제거되도록 수정했습니다.
- 임베딩 워커 SIMD + 멀티스레딩 지원:
SharedArrayBuffer를 런타임에 감지하여, 지원되는 환경(옵시디언 Electron)에서는 멀티스레드 WASM 추론을 활성화합니다. 지원되지 않는 환경에서는 자동으로 단일 스레드로 폴백됩니다. SIMD WASM이 명시적으로 활성화되어 임베딩 속도가 크게 향상됩니다.
⚡ 속도 개선
- 병렬 파일 읽기: 파일 읽기와 청킹을 최대 32개까지 동시에 처리하여 I/O 대기 시간을 중첩시킵니다. 수천 개의 파일이 있는 볼트에서 전체 인덱싱 시간이 대폭 단축됩니다.
- 콘텐츠 해시 기반 스킵:
mtime만 변경되고 실제 내용이 동일한 파일(예: 수정 없이 터치된 파일)을 콘텐츠 해시로 감지하여 임베딩을 완전히 건너뜁니다. - 배치 임베딩: 청크를 64개 단위로 묶어 임베딩 워커에 전송하여 워커 왕복 횟수를 줄이고 처리량을 높였습니다.
- 배치 UI 진행률 업데이트: 대규모 인덱싱(10,000개 이상 파일) 시 UI 업데이트 폭주를 방지하기 위해 20개 파일 단위로 진행률을 업데이트합니다.
1.0.15
Lumina v1.0.15 — Release Notes
🚀 New Features & Improvements
- Agent Mode Configuration — Added agent mode toggle in MCP settings tab with configurable max steps and option to respect RAG exclusion rules.
- Agent Path Access Control — Agent tools (read_note, create_note, search_notes, append_to_note, list_notes, search_vault) now enforce RAG include/exclude path permissions when
agentRespectRagExclusionsis enabled. Active note and daily note are always accessible. - Agent Mode UI Status Indicator — Chat toolbar agent button gets accent-colored active state styling when agent mode is on.
- Context Selector Redesign — Replaced flat file list with category-based navigation (Active Note / Selection / Folder / File / Tag / Canvas / URL). Added dedicated URL input screen. Category list is filterable by search query.
- Agent Button Relabel — Renamed toolbar button from "MCP Server" to "Agent & MCP Tools" with bot icon for clarity.
- Collapsible Advanced MCP Settings — Built-in MCP server toggle and external server list are now hidden behind a collapsible "Show Advanced" section in the quick popup, reducing UI clutter.
- Locale Text Optimization — Refined and optimized UI text across all 11 supported languages (DE, EN, ES, FR, IT, JA, KO, PT, RU, ZH, ZH-TW).
🚀 새로운 기능 및 개선사항
- 에이전트 모드 설정 — MCP 설정 탭에 에이전트 모드 On/Off 토글, 최대 스텝 수 설정, RAG 제외 규칙 준수 옵션을 추가했습니다.
- 에이전트 경로 접근 제어 —
agentRespectRagExclusions활성화 시 read_note, create_note, search_notes, append_to_note, list_notes, search_vault 도구가 RAG 포함/제외 경로 규칙을 따릅니다. 활성 노트와 데일리 노트는 항상 접근 가능합니다. - 에이전트 모드 UI 상태 표시 — 채팅 도구 모음의 에이전트 버튼이 활성화 시 강조 색상으로 표시됩니다.
- 컨텍스트 선택기 재설계 — 단일 파일 목록을 카테고리 기반 내비게이션(활성 노트 / 선택 영역 / 폴더 / 파일 / 태그 / 캔버스 / URL)으로 개편했습니다. 전용 URL 입력 화면을 추가하고, 검색어로 카테고리를 필터링할 수 있습니다.
- 에이전트 버튼 이름 변경 — 도구 모음 버튼을 "MCP Server"에서 "Agent & MCP Tools"로, 아이콘을 봇 아이콘으로 변경했습니다.
- MCP 고급 설정 접이식 전환 — 빠른 팝업에서 내장 MCP 서버 토글과 외부 서버 목록을 "고급 설정 보기" 접이식 섹션으로 정리해 UI를 간결하게 했습니다.
- 로케일 텍스트 최적화 — 11개 지원 언어(DE, EN, ES, FR, IT, JA, KO, PT, RU, ZH, ZH-TW) 전반에 걸쳐 UI 텍스트를 정제 및 최적화했습니다.
1.0.14
Lumina v1.0.14 — Release Notes
feat: integrate metadata, frontmatter, and path-based tags into discovery recommendations
This update significantly improves the Discovery Panel by enriching tag extraction and recommendation logic:
- Unified Tag Extraction: Combines body
#tags, frontmatter metadata, and cached path-based tags into a single score-weighted tag map for more comprehensive recommendations. - Tag Score Aggregation: Uses a
tagScoreMapto deduplicate and merge tag scores from all sources, producing higher-quality ranked tag suggestions. - Improved Related Documents: Path-based tags (e.g., derived from folder/file structure) are now included alongside content-based similarity, enabling discovery of related vault documents even when they share no explicit
#tagmentions. - Better Frontmatter Parsing: Extracts
tagsfield from YAML frontmatter and normalizes them for consistent handling. - Noise Reduction: Filters out low-scoring tags and the current active note to prevent self-recommendations.
feat: 스마트 탐색 추천에 메타데이터, 프론트매터, 경로 기반 태그 통합
이번 업데이트는 스마트 탐색의 태그 추출 및 추천 로직을 크게 개선했습니다:
- 통합 태그 추출: 본문
#tag, 프론트매터 메타데이터, 캐시된 경로 기반 태그를 하나의 점수 가중 태그 맵(tagScoreMap)으로 결합하여 더 포괄적인 추천을 제공합니다. - 태그 점수 통합: 모든 소스에서 추출한 태그를 중복 제거하고 점수를 병합하여 더 높은 품질의 순위 태그 제안을 생성합니다.
- 개선된 관련 문서: 콘텐츠 기반 유사도와 함께 경로 기반 태그(폴더/파일 구조에서 파생)를 포함하여, 명시적인
#tag참조가 없는 문서도 발견할 수 있습니다. - 프론트매터 파싱 개선: YAML 프론트매터에서
tags필드를 추출하고 정규화하여 일관된 처리를 지원합니다. - 노이즈 감소: 낮은 점수의 태그와 현재 활성 노트를 필터링하여 자기 추천을 방지합니다.
1.0.13
Lumina v1.0.13 — Release Notes
What's New
Providers that do not support image analysis (currently DeepSeek and Groq) now display a clear, user-friendly error message when you attach an image to a chat:
This prevents silent failures and cryptic API errors when using models that lack vision capabilities.
🧹 Local LLM Mask Token Cleanup
Local LLMs such as Qwen and Mistral sometimes inject special context-masking tokens (<|mask_start|>...<|mask_end|>) into their output. These tokens are now automatically stripped:
From LLM responses before tool call parsing
From tool results before they are passed back to the model
From the chat message UI so they are never visible to users
🔧 Improved UI Context Handling
When RAG is globally disabled, the Include Active Note toggle is now also automatically turned off in the UI — preventing context from being injected inconsistently.
The RAG search flag now correctly respects an explicit useRagContext = false from the UI toggle, in addition to the global ragEnabled setting.
Active note injection is now unified into a single code path (resolveAttachmentsWithActiveNote → buildAttachmentContext), removing the previous duplicate injection route.
🛠️ Tool Call Parser Refactor
The parseTextToolCalls function has been significantly improved:
Extracted a reusable tryParseBlock() helper that handles JSON, Python-style, and XML-style tool call formats.
Added expanded tag alias support: tool_calls, tool_use, use_tool are now recognized in addition to the existing variants.
Added a streaming fallback: if a response is cut off mid-stream (no closing tag), the parser now attempts to parse the incomplete open block rather than silently discarding it.
Improved agent loop prompt to explicitly guide multi-step tasks (e.g., always calling read_active_note before append_to_note).
Bug Fixes
Fixed an issue where disabling RAG globally still allowed the active note to be injected into the prompt.
Fixed tool calls being silently dropped when a local LLM returned mask tokens around the tool call JSON.
Fixed duplicate active note context injection that could cause notes to appear twice in the prompt.
변경 사항
이미지 분석을 지원하지 않는 프로바이더(DeepSeek, Groq)에서 이미지를 첨부하면 이제 명확한 안내 메시지가 표시됩니다:
비전 기능이 없는 모델에서 이미지를 첨부했을 때 발생하던 불명확한 API 오류와 조용한 실패를 방지합니다.
🧹 로컬 LLM 마스크 토큰 자동 제거
Qwen, Mistral 등 일부 로컬 LLM은 응답에 특수 컨텍스트 마스킹 토큰(<|mask_start|>...<|mask_end|>)을 삽입하는 경우가 있습니다. 이 토큰이 이제 자동으로 제거됩니다:
LLM 응답 — 툴 콜 파싱 전에 제거
툴 결과 — 모델에 다시 전달되기 전에 제거
채팅 메시지 UI — 사용자에게 절대 노출되지 않도록 제거
🔧 UI 컨텍스트 처리 개선
RAG 글로벌 비활성화 시 활성 노트 포함 토글도 자동으로 함께 꺼지도록 수정했습니다. 기존에는 RAG를 껐어도 활성 노트가 주입될 수 있었습니다.
UI 토글에서 useRagContext = false로 명시적으로 꺼진 경우, RAG 검색 플래그가 이제 이를 올바르게 반영합니다.
활성 노트 주입 경로를 resolveAttachmentsWithActiveNote → buildAttachmentContext 단일 경로로 통합하여, 이중 주입으로 인해 프롬프트에 노트가 두 번 포함되던 버그를 해결했습니다.
🛠️ 툴 콜 파서 리팩터링
parseTextToolCalls 함수가 크게 개선되었습니다:
JSON, Python 스타일, XML 스타일 포맷을 모두 처리하는 tryParseBlock() 헬퍼 함수를 분리했습니다.
태그 별칭 확장: tool_calls, tool_use, use_tool 등 더 많은 LLM별 태그 변형을 인식합니다.
스트리밍 폴백 추가: 응답이 스트리밍 중 잘려 닫는 태그가 없는 경우에도, 열린 블록 내용을 파싱 시도합니다. 기존에는 조용히 폐기되었습니다.
에이전트 루프 프롬프트에 다단계 작업 가이드를 추가했습니다 (예: append_to_note 호출 전 반드시 read_active_note로 경로를 먼저 획득하도록 명시).
버그 수정
RAG를 전역으로 비활성화해도 활성 노트가 프롬프트에 주입되던 문제 수정.
로컬 LLM이 툴 콜 JSON 주변에 마스크 토큰을 삽입할 경우 툴 콜이 조용히 무시되던 문제 수정.
활성 노트 컨텍스트가 프롬프트에 두 번 포함되던 중복 주입 문제 수정.
1.0.12
Full Changelog: 1.0.11...1.0.12
1.0.11
Full Changelog: 1.0.10...1.0.11