@sunub/obsidian-mcp-server 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +217 -25
- package/build/cli/AppContainer.d.ts +1 -0
- package/build/cli/AppContainer.js +197 -0
- package/build/cli/AppContainer.js.map +1 -0
- package/build/cli/config/SettingContext.d.ts +1 -0
- package/build/cli/config/SettingContext.js +2 -0
- package/build/cli/config/SettingContext.js.map +1 -0
- package/build/cli/config/mcpServersConfig.d.ts +18 -0
- package/build/cli/config/mcpServersConfig.js +119 -0
- package/build/cli/config/mcpServersConfig.js.map +1 -0
- package/build/cli/config/settingSchema.d.ts +180 -0
- package/build/cli/config/settingSchema.js +128 -0
- package/build/cli/config/settingSchema.js.map +1 -0
- package/build/cli/context/InputContext.d.ts +12 -0
- package/build/cli/context/InputContext.js +10 -0
- package/build/cli/context/InputContext.js.map +1 -0
- package/build/cli/context/KeypressContext.d.ts +30 -0
- package/build/cli/context/KeypressContext.js +200 -0
- package/build/cli/context/KeypressContext.js.map +1 -0
- package/build/cli/context/KeypressContext.util.d.ts +7 -0
- package/build/cli/context/KeypressContext.util.js +474 -0
- package/build/cli/context/KeypressContext.util.js.map +1 -0
- package/build/cli/hooks/useAtCompletion.d.ts +12 -0
- package/build/cli/hooks/useAtCompletion.js +5 -0
- package/build/cli/hooks/useAtCompletion.js.map +1 -0
- package/build/cli/hooks/useCommandCompletion.d.ts +59 -0
- package/build/cli/hooks/useCommandCompletion.js +344 -0
- package/build/cli/hooks/useCommandCompletion.js.map +1 -0
- package/build/cli/hooks/useCompletion.d.ts +22 -0
- package/build/cli/hooks/useCompletion.js +84 -0
- package/build/cli/hooks/useCompletion.js.map +1 -0
- package/build/cli/hooks/useDispatcher.d.ts +6 -0
- package/build/cli/hooks/useDispatcher.js +286 -0
- package/build/cli/hooks/useDispatcher.js.map +1 -0
- package/build/cli/hooks/useFocus.d.ts +2 -0
- package/build/cli/hooks/useFocus.js +3 -0
- package/build/cli/hooks/useFocus.js.map +1 -0
- package/build/cli/hooks/useInputHistory.d.ts +24 -0
- package/build/cli/hooks/useInputHistory.js +159 -0
- package/build/cli/hooks/useInputHistory.js.map +1 -0
- package/build/cli/hooks/useKeyMatchers.d.ts +17 -0
- package/build/cli/hooks/useKeyMatchers.js +13 -0
- package/build/cli/hooks/useKeyMatchers.js.map +1 -0
- package/build/cli/hooks/useKeypress.d.ts +19 -0
- package/build/cli/hooks/useKeypress.js +28 -0
- package/build/cli/hooks/useKeypress.js.map +1 -0
- package/build/cli/hooks/useLlmStream.d.ts +12 -0
- package/build/cli/hooks/useLlmStream.js +365 -0
- package/build/cli/hooks/useLlmStream.js.map +1 -0
- package/build/cli/hooks/useMcpClient.d.ts +10 -0
- package/build/cli/hooks/useMcpClient.js +100 -0
- package/build/cli/hooks/useMcpClient.js.map +1 -0
- package/build/cli/hooks/useMcpManager.d.ts +22 -0
- package/build/cli/hooks/useMcpManager.js +86 -0
- package/build/cli/hooks/useMcpManager.js.map +1 -0
- package/build/cli/hooks/usePromptCompletion.d.ts +19 -0
- package/build/cli/hooks/usePromptCompletion.js +13 -0
- package/build/cli/hooks/usePromptCompletion.js.map +1 -0
- package/build/cli/hooks/useRagContext.d.ts +6 -0
- package/build/cli/hooks/useRagContext.js +83 -0
- package/build/cli/hooks/useRagContext.js.map +1 -0
- package/build/cli/hooks/useShellCompletion.d.ts +18 -0
- package/build/cli/hooks/useShellCompletion.js +10 -0
- package/build/cli/hooks/useShellCompletion.js.map +1 -0
- package/build/cli/hooks/useSlashCompletion.d.ts +21 -0
- package/build/cli/hooks/useSlashCompletion.js +11 -0
- package/build/cli/hooks/useSlashCompletion.js.map +1 -0
- package/build/cli/hooks/useTerminalSize.d.ts +9 -0
- package/build/cli/hooks/useTerminalSize.js +26 -0
- package/build/cli/hooks/useTerminalSize.js.map +1 -0
- package/build/cli/index.js +27 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/key/keyBindings.d.ts +152 -0
- package/build/cli/key/keyBindings.js +630 -0
- package/build/cli/key/keyBindings.js.map +1 -0
- package/build/cli/key/keyMatchers.d.ts +27 -0
- package/build/cli/key/keyMatchers.js +33 -0
- package/build/cli/key/keyMatchers.js.map +1 -0
- package/build/cli/key/text-buffer.js +918 -0
- package/build/cli/key/text-buffer.js.map +1 -0
- package/build/cli/reference/HistoryItemDisplay.d.ts +23 -0
- package/build/cli/reference/HistoryItemDisplay.js +63 -0
- package/build/cli/reference/HistoryItemDisplay.js.map +1 -0
- package/build/cli/reference/InputContext.d.ts +17 -0
- package/build/cli/reference/InputContext.js +16 -0
- package/build/cli/reference/InputContext.js.map +1 -0
- package/build/cli/reference/KerypressContext.d.ts +37 -0
- package/build/cli/reference/KerypressContext.js +791 -0
- package/build/cli/reference/KerypressContext.js.map +1 -0
- package/build/cli/reference/MainContent.d.ts +6 -0
- package/build/cli/reference/MainContent.js +207 -0
- package/build/cli/reference/MainContent.js.map +1 -0
- package/build/cli/reference/UIStateContext.d.ts +188 -0
- package/build/cli/reference/UIStateContext.js +16 -0
- package/build/cli/reference/UIStateContext.js.map +1 -0
- package/build/cli/reference/useGeminiStream.d.ts +42 -0
- package/build/cli/reference/useGeminiStream.js +1404 -0
- package/build/cli/reference/useGeminiStream.js.map +1 -0
- package/build/cli/services/McpClientService.d.ts +32 -0
- package/build/cli/services/McpClientService.js +123 -0
- package/build/cli/services/McpClientService.js.map +1 -0
- package/build/cli/services/McpManager.d.ts +28 -0
- package/build/cli/services/McpManager.js +146 -0
- package/build/cli/services/McpManager.js.map +1 -0
- package/build/cli/tmp.js +27 -0
- package/build/cli/tmp.js.map +1 -0
- package/build/cli/ui/ConnectionStatus.d.ts +13 -0
- package/build/cli/ui/ConnectionStatus.js +24 -0
- package/build/cli/ui/ConnectionStatus.js.map +1 -0
- package/build/cli/ui/HelpCommands.d.ts +5 -0
- package/build/cli/ui/HelpCommands.js +11 -0
- package/build/cli/ui/HelpCommands.js.map +1 -0
- package/build/cli/ui/HistoryItemDisplay.d.ts +9 -0
- package/build/cli/ui/HistoryItemDisplay.js +38 -0
- package/build/cli/ui/HistoryItemDisplay.js.map +1 -0
- package/build/cli/ui/InputPrompt-bestcase.d.ts +63 -0
- package/build/cli/ui/InputPrompt-bestcase.js +1301 -0
- package/build/cli/ui/InputPrompt-bestcase.js.map +1 -0
- package/build/cli/ui/InputPrompt.d.ts +12 -0
- package/build/cli/ui/InputPrompt.js +145 -0
- package/build/cli/ui/InputPrompt.js.map +1 -0
- package/build/cli/ui/InputPrompt.tmp.d.ts +7 -0
- package/build/cli/ui/InputPrompt.tmp.js +215 -0
- package/build/cli/ui/InputPrompt.tmp.js.map +1 -0
- package/build/cli/ui/MainContent.d.ts +10 -0
- package/build/cli/ui/MainContent.js +24 -0
- package/build/cli/ui/MainContent.js.map +1 -0
- package/build/cli/ui/MouseContext.d.ts +1 -0
- package/build/cli/ui/MouseContext.js +2 -0
- package/build/cli/ui/MouseContext.js.map +1 -0
- package/build/cli/ui/SuggestionsDisplay.d.ts +25 -0
- package/build/cli/ui/SuggestionsDisplay.js +45 -0
- package/build/cli/ui/SuggestionsDisplay.js.map +1 -0
- package/build/cli/ui/ThinkingIndicator.d.ts +2 -0
- package/build/cli/ui/ThinkingIndicator.js +16 -0
- package/build/cli/ui/ThinkingIndicator.js.map +1 -0
- package/build/cli/ui/layout/DefaultAppLayout.d.ts +2 -0
- package/build/cli/ui/layout/DefaultAppLayout.js +6 -0
- package/build/cli/ui/layout/DefaultAppLayout.js.map +1 -0
- package/build/cli/ui/shared/ExpandableText.d.ts +14 -0
- package/build/cli/ui/shared/ExpandableText.js +19 -0
- package/build/cli/ui/shared/ExpandableText.js.map +1 -0
- package/build/cli/utils/commandUtils.d.ts +11 -0
- package/build/cli/utils/commandUtils.js +16 -0
- package/build/cli/utils/commandUtils.js.map +1 -0
- package/build/cli/utils/debugLogger.d.ts +12 -0
- package/build/cli/utils/debugLogger.js +52 -0
- package/build/cli/utils/debugLogger.js.map +1 -0
- package/build/cli/utils/historyStorage.d.ts +13 -0
- package/build/cli/utils/historyStorage.js +64 -0
- package/build/cli/utils/historyStorage.js.map +1 -0
- package/build/cli/utils/textUtil.d.ts +68 -0
- package/build/cli/utils/textUtil.js +236 -0
- package/build/cli/utils/textUtil.js.map +1 -0
- package/build/db.js +55 -0
- package/build/db.js.map +1 -0
- package/build/index.js +4 -0
- package/build/index.js.map +1 -0
- package/build/tools/create_document_with_properties/index.d.ts +60 -0
- package/build/tools/create_document_with_properties/index.js +7 -1
- package/build/tools/create_document_with_properties/index.js.map +1 -0
- package/build/tools/create_document_with_properties/params.d.ts +66 -0
- package/build/tools/generate_property/index.js +6 -0
- package/build/tools/generate_property/index.js.map +1 -0
- package/build/tools/index.d.ts +184 -0
- package/build/tools/organize_attachments/index.js +7 -1
- package/build/tools/organize_attachments/index.js.map +1 -0
- package/build/tools/organize_attachments/params.d.ts +122 -0
- package/build/tools/vault/index.js +17 -3
- package/build/tools/vault/index.js.map +1 -0
- package/build/tools/vault/params.d.ts +115 -0
- package/build/tools/vault/types/collect_context.d.ts +1340 -0
- package/build/tools/vault/types/list_all.d.ts +387 -0
- package/build/tools/vault/types/read_specific.d.ts +297 -0
- package/build/tools/vault/types/search.d.ts +598 -0
- package/build/tools/vault/utils/actions/collect_context.js +26 -1
- package/build/tools/vault/utils/actions/collect_context.js.map +1 -0
- package/build/tools/vault/utils/actions/index_rag.js +27 -0
- package/build/tools/vault/utils/actions/index_rag.js.map +1 -0
- package/build/tools/vault/utils/actions/list_all.js +1 -0
- package/build/tools/vault/utils/actions/list_all.js.map +1 -0
- package/build/tools/vault/utils/actions/load_memory.js +23 -13
- package/build/tools/vault/utils/actions/load_memory.js.map +1 -0
- package/build/tools/vault/utils/actions/read.js +2 -1
- package/build/tools/vault/utils/actions/read.js.map +1 -0
- package/build/tools/vault/utils/actions/search.js +2 -1
- package/build/tools/vault/utils/actions/search.js.map +1 -0
- package/build/tools/vault/utils/actions/search_semantic.js +54 -0
- package/build/tools/vault/utils/actions/search_semantic.js.map +1 -0
- package/build/tools/vault/utils/actions/stats.js +1 -0
- package/build/tools/vault/utils/actions/stats.js.map +1 -0
- package/build/tools/vault/utils/document.js +1 -0
- package/build/tools/vault/utils/document.js.map +1 -0
- package/build/tools/write_property/index.d.ts +58 -0
- package/build/tools/write_property/index.js +7 -1
- package/build/tools/write_property/index.js.map +1 -0
- package/build/utils/DirectoryWalker.d.ts +6 -0
- package/build/utils/DirectoryWalker.js +7 -0
- package/build/utils/DirectoryWalker.js.map +1 -0
- package/build/utils/Indexer.d.ts +18 -0
- package/build/utils/Indexer.js +5 -9
- package/build/utils/Indexer.js.map +1 -0
- package/build/utils/LLMClient.d.ts +37 -0
- package/build/utils/LLMClient.js +82 -0
- package/build/utils/LLMClient.js.map +1 -0
- package/build/utils/RAGIndexer.d.ts +22 -0
- package/build/utils/RAGIndexer.js +206 -0
- package/build/utils/RAGIndexer.js.map +1 -0
- package/build/utils/RerankerClient.d.ts +27 -0
- package/build/utils/RerankerClient.js +69 -0
- package/build/utils/RerankerClient.js.map +1 -0
- package/build/utils/VaultManger/VaultManager.d.ts +34 -0
- package/build/utils/VaultManger/VaultManager.js +1 -0
- package/build/utils/VaultManger/VaultManager.js.map +1 -0
- package/build/utils/VaultManger/VaultPathError.d.ts +6 -0
- package/build/utils/VaultManger/VaultPathError.js +1 -0
- package/build/utils/VaultManger/VaultPathError.js.map +1 -0
- package/build/utils/VaultManger/index.d.ts +3 -0
- package/build/utils/VaultManger/index.js +1 -0
- package/build/utils/VaultManger/index.js.map +1 -0
- package/build/utils/VaultManger/types.d.ts +16 -0
- package/build/utils/VaultManger/types.js +1 -0
- package/build/utils/VaultManger/types.js.map +1 -0
- package/build/utils/VaultWatcher.d.ts +8 -0
- package/build/utils/VaultWatcher.js +96 -0
- package/build/utils/VaultWatcher.js.map +1 -0
- package/build/utils/VectorDB.d.ts +53 -0
- package/build/utils/VectorDB.js +243 -0
- package/build/utils/VectorDB.js.map +1 -0
- package/build/utils/createToolError.d.ts +2 -0
- package/build/utils/createToolError.js +1 -0
- package/build/utils/createToolError.js.map +1 -0
- package/build/utils/getVaultManager.d.ts +2 -0
- package/build/utils/getVaultManager.js +2 -1
- package/build/utils/getVaultManager.js.map +1 -0
- package/build/utils/processor/LinkExtractor.d.ts +2 -0
- package/build/utils/processor/LinkExtractor.js +1 -0
- package/build/utils/processor/LinkExtractor.js.map +1 -0
- package/build/utils/processor/MatterParser.d.ts +2 -0
- package/build/utils/processor/MatterParser.js +12 -3
- package/build/utils/processor/MatterParser.js.map +1 -0
- package/build/utils/processor/types.d.ts +100 -0
- package/package.json +29 -3
- package/build/config.js +0 -55
- package/build/server.js +0 -32
- package/build/tools/create_document_with_properties/params.js +0 -32
- package/build/tools/generate_property/params.js +0 -54
- package/build/tools/index.js +0 -12
- package/build/tools/organize_attachments/params.js +0 -60
- package/build/tools/organize_attachments/utils.js +0 -65
- package/build/tools/vault/metrics.js +0 -126
- package/build/tools/vault/params.js +0 -141
- package/build/tools/vault/types/collect_context.js +0 -102
- package/build/tools/vault/types/list_all.js +0 -52
- package/build/tools/vault/types/read_specific.js +0 -40
- package/build/tools/vault/types/search.js +0 -58
- package/build/tools/vault/utils/constants.js +0 -2
- package/build/tools/vault/utils/shared.js +0 -74
- package/build/tools/vault/utils.js +0 -6
- package/build/tools/write_property/params.js +0 -51
- package/build/utils/processor/types.js +0 -27
- package/build/utils/semaphore.js +0 -25
package/README.md
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어하면서** Vault 내용을 조회할 수 있게 합니다.
|
|
8
8
|
|
|
9
|
+
llama.cpp 기반 로컬 LLM(임베딩·채팅·리랭킹)과 연동하면 **외부 API 없이 완전히 로컬에서** Vault RAG를 구축하고 구동할 수 있습니다.
|
|
9
10
|
|
|
10
11
|
## 무엇을 할 수 있나
|
|
11
12
|
|
|
@@ -13,11 +14,10 @@ MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어
|
|
|
13
14
|
- 특정 노트 열람 (`vault`, `action="read"`)
|
|
14
15
|
- Vault 전체 문서 목록 조회 (`vault`, `action="list_all"`)
|
|
15
16
|
- Vault 상태 조회 (`vault`, `action="stats"`)
|
|
16
|
-
-
|
|
17
|
-
-
|
|
17
|
+
- RAG 기반 검색 (`vault`, `action="search_vault_by_semantic"`) - LLM 서버(llama.cpp) 연동 필수
|
|
18
|
+
- 전체 색인 트리거 (`vault`, `action="index_vault_to_vectordb"`)
|
|
18
19
|
- frontmatter 자동 생성 제안 (`generate_property`)
|
|
19
20
|
- frontmatter 실제 반영 (`write_property`)
|
|
20
|
-
- 문서 기반 프롬프트 워크플로우 (`create_document_with_properties`)
|
|
21
21
|
- 이미지 첨부파일 정리 (`organize_attachments`)
|
|
22
22
|
|
|
23
23
|
## 사전 주의사항
|
|
@@ -31,25 +31,91 @@ MCP 클라이언트에 연결해 에이전트에게 **토큰 사용량을 제어
|
|
|
31
31
|
|
|
32
32
|
### 설정 확인사항
|
|
33
33
|
|
|
34
|
-
1. Vault 경로: VAULT_DIR_PATH
|
|
34
|
+
**1. Vault 경로: `VAULT_DIR_PATH`에는 반드시 절대 경로를 입력해야 합니다.**
|
|
35
35
|
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
```bash
|
|
37
|
+
# ✅ 올바른 예시 (macOS / Linux)
|
|
38
|
+
VAULT_DIR_PATH="/Users/username/Documents/MyVault"
|
|
39
|
+
|
|
40
|
+
# ✅ 올바른 예시 (Windows — 역슬래시 이스케이프)
|
|
41
|
+
VAULT_DIR_PATH="C:\\Users\\username\\Documents\\MyVault"
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
# ✅ 올바른 예시 (WSL)
|
|
44
|
+
VAULT_DIR_PATH="/mnt/c/Users/username/Documents/MyVault"
|
|
45
|
+
|
|
46
|
+
# ❌ 잘못된 예시 — 상대 경로는 서버 시작 시 오류 발생
|
|
47
|
+
VAULT_DIR_PATH="~/Documents/MyVault"
|
|
48
|
+
VAULT_DIR_PATH="./vault"
|
|
45
49
|
```
|
|
46
50
|
|
|
47
|
-
2. Node.js 요구사항: Node.js 22 이상이 설치되어 있어야
|
|
51
|
+
**2. Node.js 요구사항: Node.js 22 이상이 설치되어 있어야 합니다.**
|
|
48
52
|
|
|
49
53
|
```bash
|
|
50
54
|
node --version # v22.0.0 이상 확인
|
|
51
55
|
```
|
|
52
56
|
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
### 환경변수 전체 설정 예시
|
|
60
|
+
|
|
61
|
+
MCP 클라이언트 설정(`mcpServers.env`) 또는 셸 환경변수로 주입합니다.
|
|
62
|
+
시맨틱 검색·리랭킹 기능을 사용하지 않을 경우 `VAULT_DIR_PATH`만 필수입니다.
|
|
63
|
+
|
|
64
|
+
**최소 설정 (기본 도구만 사용)**
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"obsidian": {
|
|
70
|
+
"command": "npx",
|
|
71
|
+
"args": ["-y", "@sunub/obsidian-mcp-server@latest"],
|
|
72
|
+
"env": {
|
|
73
|
+
"VAULT_DIR_PATH": "/abs/path/to/your/vault"
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**전체 설정 (시맨틱 검색 + 리랭킹 포함)**
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"mcpServers": {
|
|
85
|
+
"obsidian": {
|
|
86
|
+
"command": "npx",
|
|
87
|
+
"args": ["-y", "@sunub/obsidian-mcp-server@latest"],
|
|
88
|
+
"env": {
|
|
89
|
+
"VAULT_DIR_PATH": "/abs/path/to/your/vault",
|
|
90
|
+
"LOGGING_LEVEL": "info",
|
|
91
|
+
"LLM_API_URL": "http://127.0.0.1:8080",
|
|
92
|
+
"LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
|
|
93
|
+
"LLM_EMBEDDING_MODEL": "nomic-embed-text",
|
|
94
|
+
"LLM_CHAT_MODEL": "llama3",
|
|
95
|
+
"LLM_RERANKER_API_URL": "http://127.0.0.1:8082",
|
|
96
|
+
"VAULT_METRICS_LOG_PATH": "/abs/path/to/vault-metrics.ndjson"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
각 변수가 연결되는 서버는 아래와 같습니다:
|
|
104
|
+
|
|
105
|
+
| 환경변수 | 기본값 | 역할 | 필수 여부 |
|
|
106
|
+
|---|---|---|---|
|
|
107
|
+
| `VAULT_DIR_PATH` | — | Obsidian Vault 절대 경로 | **필수** |
|
|
108
|
+
| `LOGGING_LEVEL` | `info` | 로그 수준 (`debug` / `info` / `warn` / `error`) | 선택 |
|
|
109
|
+
| `LLM_API_URL` | `http://127.0.0.1:8080` | llama-server 채팅 엔드포인트 | 선택 |
|
|
110
|
+
| `LLM_EMBEDDING_API_URL` | `http://127.0.0.1:8081` | llama-server 임베딩 엔드포인트 (벡터 색인 필수) | 선택 |
|
|
111
|
+
| `LLM_EMBEDDING_MODEL` | `nomic-embed-text` | 임베딩 모델명 | 선택 |
|
|
112
|
+
| `LLM_CHAT_MODEL` | `llama3` | 채팅 모델명 | 선택 |
|
|
113
|
+
| `LLM_RERANKER_API_URL` | `http://127.0.0.1:8082` | llama-server 리랭커 엔드포인트 (미설정 시 폴백) | 선택 |
|
|
114
|
+
| `VAULT_METRICS_LOG_PATH` | — | 응답 압축·토큰 메트릭 JSONL 기록 경로 | 선택 |
|
|
115
|
+
|
|
116
|
+
> `LLM_EMBEDDING_API_URL`이 없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않습니다.
|
|
117
|
+
> `LLM_RERANKER_API_URL`에 서버가 없으면 오류 없이 폴백(원래 정렬 유지)됩니다.
|
|
118
|
+
|
|
53
119
|
## 시작하기 (빠른 설정)
|
|
54
120
|
|
|
55
121
|
### 1) 공통 요구사항
|
|
@@ -101,6 +167,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
101
167
|
args = ["-y", "@sunub/obsidian-mcp-server@latest"]
|
|
102
168
|
env = { VAULT_DIR_PATH = "/abs/path/to/your/vault" }
|
|
103
169
|
```
|
|
170
|
+
|
|
104
171
|
</details>
|
|
105
172
|
|
|
106
173
|
<details>
|
|
@@ -110,10 +177,11 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
110
177
|
2) `/mcp add`
|
|
111
178
|
3) 아래 값 입력
|
|
112
179
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
180
|
+
- **Server name:** `obsidian`
|
|
181
|
+
- **Server Type:** `[1] Local`
|
|
182
|
+
- **Command:** `npx -y @sunub/obsidian-mcp-server@latest`
|
|
183
|
+
- **Environment:** `{ "VAULT_DIR_PATH": "/abs/path/to/your/vault" }`
|
|
184
|
+
|
|
117
185
|
</details>
|
|
118
186
|
|
|
119
187
|
<details>
|
|
@@ -132,6 +200,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
132
200
|
}
|
|
133
201
|
}
|
|
134
202
|
```
|
|
203
|
+
|
|
135
204
|
</details>
|
|
136
205
|
|
|
137
206
|
<details>
|
|
@@ -178,18 +247,132 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
178
247
|
"env": {
|
|
179
248
|
"VAULT_DIR_PATH": "/path/to/obsidian-vault",
|
|
180
249
|
"VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
|
|
181
|
-
"LOGGING_LEVEL": "info"
|
|
250
|
+
"LOGGING_LEVEL": "info",
|
|
251
|
+
"LLM_API_URL": "http://127.0.0.1:8080",
|
|
252
|
+
"LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
|
|
253
|
+
"LLM_EMBEDDING_MODEL": "nomic-embed-text",
|
|
254
|
+
"LLM_CHAT_MODEL": "llama3",
|
|
255
|
+
"LLM_RERANKER_API_URL": "http://127.0.0.1:8082"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"mcpServers": {
|
|
263
|
+
"obsidian": {
|
|
264
|
+
"command": "npx",
|
|
265
|
+
"args": [
|
|
266
|
+
"-y",
|
|
267
|
+
"@sunub/obsidian-mcp-server@latest"
|
|
268
|
+
],
|
|
269
|
+
"env": {
|
|
270
|
+
"VAULT_DIR_PATH": "/path/to/obsidian-vault",
|
|
271
|
+
"VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
|
|
272
|
+
"LOGGING_LEVEL": "info",
|
|
273
|
+
"LLM_API_URL": "http://127.0.0.1:8080",
|
|
274
|
+
"LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
|
|
275
|
+
"LLM_EMBEDDING_MODEL": "nomic-embed-text",
|
|
276
|
+
"LLM_CHAT_MODEL": "llama3",
|
|
277
|
+
"LLM_RERANKER_API_URL": "http://127.0.0.1:8082"
|
|
182
278
|
}
|
|
183
279
|
}
|
|
184
280
|
}
|
|
185
281
|
}
|
|
186
282
|
```
|
|
187
283
|
|
|
188
|
-
|
|
284
|
+
> 각 변수의 역할과 기본값은 [사전 주의사항 → 환경변수 전체 설정 예시](#환경변수-전체-설정-예시)를 참고하세요.
|
|
285
|
+
|
|
286
|
+
## 시맨틱 검색 (RAG) 설정
|
|
287
|
+
|
|
288
|
+
키워드 검색 외에 **의미 기반 벡터 검색**을 사용하려면 임베딩 서버가 필요합니다.
|
|
289
|
+
|
|
290
|
+
### 활성화 조건
|
|
291
|
+
|
|
292
|
+
`LLM_EMBEDDING_API_URL`이 가리키는 서버가 실행 중이어야 합니다.
|
|
293
|
+
없으면 `search_vault_by_semantic`과 `index_vault_to_vectordb`가 동작하지 않고,
|
|
294
|
+
`useRagContext`는 자동으로 키워드 검색으로 폴백됩니다.
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
# ecosystem.config.cjs 기준 — 임베딩 서버 단독 시작
|
|
298
|
+
pm2 start ecosystem.config.cjs --only llama-embedding-server
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 초기 색인 실행
|
|
189
302
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
303
|
+
서버 연결 후 처음 한 번은 전체 색인을 직접 트리거해야 합니다.
|
|
304
|
+
|
|
305
|
+
```text
|
|
306
|
+
"Vault 전체를 재색인해줘."
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
내부 동작:
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"mcpServers": {
|
|
315
|
+
"obsidian": {
|
|
316
|
+
"command": "npx",
|
|
317
|
+
"args": [
|
|
318
|
+
"-y",
|
|
319
|
+
"@sunub/obsidian-mcp-server@latest"
|
|
320
|
+
],
|
|
321
|
+
"env": {
|
|
322
|
+
"VAULT_DIR_PATH": "/path/to/obsidian-vault",
|
|
323
|
+
"VAULT_METRICS_LOG_PATH": "/path/to/vault-metrics.ndjson",
|
|
324
|
+
"LOGGING_LEVEL": "info",
|
|
325
|
+
"LLM_API_URL": "http://127.0.0.1:8080",
|
|
326
|
+
"LLM_EMBEDDING_API_URL": "http://127.0.0.1:8081",
|
|
327
|
+
"LLM_EMBEDDING_MODEL": "nomic-embed-text",
|
|
328
|
+
"LLM_CHAT_MODEL": "llama3",
|
|
329
|
+
"LLM_RERANKER_API_URL": "http://127.0.0.1:8082"
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
이후에는 파일 변경 시 **VaultWatcher가 자동으로 증분 색인**합니다 (mtime 기반).
|
|
337
|
+
|
|
338
|
+
### 색인 저장 위치
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
{VAULT_DIR_PATH}/.obsidian/vector_cache/ ← LanceDB 데이터 디렉터리
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
- 직접 삭제해도 무방합니다. 다음 `index_vault_to_vectordb` 호출 시 재생성됩니다.
|
|
345
|
+
- `LLM_EMBEDDING_MODEL`을 변경하면 서버 시작 시 **자동으로 전체 재색인**이 발생합니다 (INDEX_VERSION 또는 모델명 불일치 감지).
|
|
346
|
+
|
|
347
|
+
### 검색 전략 흐름
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
사용자 질문
|
|
351
|
+
│
|
|
352
|
+
▼
|
|
353
|
+
search_vault_by_semantic (벡터 유사도 검색 → 리랭킹)
|
|
354
|
+
│ 결과 없음
|
|
355
|
+
▼
|
|
356
|
+
vault.search (키워드 폴백)
|
|
357
|
+
│ 결과 없음
|
|
358
|
+
▼
|
|
359
|
+
컨텍스트 없이 LLM 응답
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
<details>
|
|
363
|
+
<summary>청크·토큰 파라미터 (파워유저용)</summary>
|
|
364
|
+
|
|
365
|
+
| 항목 | 값 | 비고 |
|
|
366
|
+
|---|---|---|
|
|
367
|
+
| 청크 크기 | 500 tokens | tiktoken cl100k 기준 |
|
|
368
|
+
| 청크 오버랩 | 50 tokens | |
|
|
369
|
+
| 임베딩 최대 토큰 | 500 tokens | 초과 시 비례 잘라냄 |
|
|
370
|
+
| 임베딩 접두어 | `search_document: {text}` | nomic-embed-text 형식 |
|
|
371
|
+
| 벡터 차원 | 768 | nomic-embed-text 출력 크기 |
|
|
372
|
+
| IVF-PQ 인덱스 생성 | 256개 문서 이상 | 미만이면 브루트포스로 동작 |
|
|
373
|
+
| 동시 임베딩 요청 | 최대 3 | Semaphore 제한 |
|
|
374
|
+
|
|
375
|
+
</details>
|
|
193
376
|
|
|
194
377
|
## 시작 후 빠른 검증
|
|
195
378
|
|
|
@@ -216,7 +399,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
216
399
|
|
|
217
400
|
정상 동작 시 응답에 `totalFiles`, `isInitialized`, `vaultPath`가 들어갑니다.
|
|
218
401
|
|
|
219
|
-
|
|
402
|
+
1) 검색 인덱스 확인
|
|
220
403
|
|
|
221
404
|
```text
|
|
222
405
|
"노트 제목에 'MCP'가 들어간 문서만 5개 찾아줘."
|
|
@@ -240,7 +423,7 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
240
423
|
|
|
241
424
|
`search`에서 결과가 비어 있으면 인덱싱/경로 또는 키워드 범위를 의심합니다.
|
|
242
425
|
|
|
243
|
-
|
|
426
|
+
1) 문서 읽기 확인
|
|
244
427
|
|
|
245
428
|
```text
|
|
246
429
|
"특정 노트 하나를 읽어줘."
|
|
@@ -270,6 +453,13 @@ npx -y @sunub/obsidian-mcp-server@latest --vault-path /abs/path/to/your/vault --
|
|
|
270
453
|
|
|
271
454
|
MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지”가 더 중요합니다.
|
|
272
455
|
|
|
456
|
+
마크다운 문서에 작성되어 있는 첨부파일을 정리하는 동작 예시 :
|
|
457
|
+
|
|
458
|
+
<https://github.com/user-attachments/assets/eb74ec05-09f7-4632-a22c-666b7e844147>
|
|
459
|
+
|
|
460
|
+
- 특정 문서를 대상으로 문서에 작성되더 있는 이미지 첨부 파일을 정리해달라고 요구할 경우 해당 `images` 폴더 내부에 해당 파일의 이름으로 폴더를 생성하여 정리합니다.
|
|
461
|
+
- 정리된 문서는 기존의 작성되어 있던 문서의 연결이 깨지지 않도록 `images` 폴더를 기준으로 연결을 업데이트 합니다.
|
|
462
|
+
|
|
273
463
|
직접 실행용 질문 예시:
|
|
274
464
|
|
|
275
465
|
- `README.md`에서 `시작하기 (빠른 설정)`의 `MCP Client configuration` 부분만 찾아줘.
|
|
@@ -298,7 +488,7 @@ MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지
|
|
|
298
488
|
|
|
299
489
|
<!-- BEGIN AUTO GENERATED TOOLS -->
|
|
300
490
|
|
|
301
|
-
- **Obsidian Tools (
|
|
491
|
+
- **Obsidian Tools (8 actions)**
|
|
302
492
|
- [`vault`](docs/tool-reference.md#vault-action)
|
|
303
493
|
- `search`
|
|
304
494
|
- `read`
|
|
@@ -306,6 +496,8 @@ MCP를 어떻게 호출하는지보다 “무슨 동작을 하려고 하는지
|
|
|
306
496
|
- `stats`
|
|
307
497
|
- `collect_context`
|
|
308
498
|
- `load_memory`
|
|
499
|
+
- `search_vault_by_semantic`
|
|
500
|
+
- `index_vault_to_vectordb`
|
|
309
501
|
- [`generate_property`](docs/tool-reference.md#generate_property)
|
|
310
502
|
- [`write_property`](docs/tool-reference.md#write_property)
|
|
311
503
|
- [`create_document_with_properties`](docs/tool-reference.md#create_document_with_properties)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const AppContainer: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { InputContext } from "./context/InputContext.js";
|
|
5
|
+
import { KeypressProvider } from "./context/KeypressContext.js";
|
|
6
|
+
import { useDispatcher } from "./hooks/useDispatcher.js";
|
|
7
|
+
import { useInputHistoryStore } from "./hooks/useInputHistory.js";
|
|
8
|
+
import { useLlmStream } from "./hooks/useLlmStream.js";
|
|
9
|
+
import { useMcpManager } from "./hooks/useMcpManager.js";
|
|
10
|
+
import { useRagContext } from "./hooks/useRagContext.js";
|
|
11
|
+
import { useTerminalSize } from "./hooks/useTerminalSize.js";
|
|
12
|
+
import { useTextBuffer } from "./key/text-buffer.js";
|
|
13
|
+
import { ConnectionStatus } from "./ui/ConnectionStatus.js";
|
|
14
|
+
import { calculatePromptWidths, InputPrompt } from "./ui/InputPrompt.js";
|
|
15
|
+
import { MainContent } from "./ui/MainContent.js";
|
|
16
|
+
import { debugLogger } from "./utils/debugLogger.js";
|
|
17
|
+
import { historyStorage } from "./utils/historyStorage.js";
|
|
18
|
+
export const AppContainer = () => {
|
|
19
|
+
const [shellModeActive] = useState(false);
|
|
20
|
+
const [copyModeEnabled] = useState(false);
|
|
21
|
+
const [showEscapePrompt] = useState(false);
|
|
22
|
+
const { columns: terminalWidth, rows: terminalHeight } = useTerminalSize();
|
|
23
|
+
const mainAreaWidth = terminalWidth;
|
|
24
|
+
const { inputWidth, suggestionsWidth } = useMemo(() => {
|
|
25
|
+
const { inputWidth, suggestionsWidth } = calculatePromptWidths(mainAreaWidth);
|
|
26
|
+
return { inputWidth, suggestionsWidth };
|
|
27
|
+
}, [mainAreaWidth]);
|
|
28
|
+
const availableTerminalHeight = Math.max(0, terminalHeight - 2);
|
|
29
|
+
const { inputHistory, addInput, initializeFromLogger } = useInputHistoryStore();
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
void initializeFromLogger(historyStorage);
|
|
32
|
+
}, [initializeFromLogger]);
|
|
33
|
+
// MCP Manager — 다중 MCP 서버 연결 관리
|
|
34
|
+
const { isConnected: mcpConnected, connections: mcpConnections, tools: mcpTools, toolsByServer: mcpToolsByServer, callTool, errors: mcpErrors, serverCount: mcpServerCount, connectedCount: mcpConnectedCount, } = useMcpManager();
|
|
35
|
+
const { handleDispatch } = useDispatcher(mcpTools);
|
|
36
|
+
const { fetchContext } = useRagContext(callTool, mcpConnected);
|
|
37
|
+
const buffer = useTextBuffer({
|
|
38
|
+
initialText: "",
|
|
39
|
+
viewportWidth: inputWidth,
|
|
40
|
+
viewportHeight: availableTerminalHeight,
|
|
41
|
+
});
|
|
42
|
+
const inputState = useMemo(() => ({
|
|
43
|
+
buffer,
|
|
44
|
+
userMessages: inputHistory,
|
|
45
|
+
shellModeActive,
|
|
46
|
+
showEscapePrompt,
|
|
47
|
+
copyModeEnabled,
|
|
48
|
+
inputWidth,
|
|
49
|
+
suggestionsWidth,
|
|
50
|
+
}), [
|
|
51
|
+
buffer,
|
|
52
|
+
inputHistory,
|
|
53
|
+
shellModeActive,
|
|
54
|
+
showEscapePrompt,
|
|
55
|
+
copyModeEnabled,
|
|
56
|
+
inputWidth,
|
|
57
|
+
suggestionsWidth,
|
|
58
|
+
]);
|
|
59
|
+
// --- Phase 4~6: history + pendingItem 기반 상태 관리 ---
|
|
60
|
+
const [history, setHistory] = useState([]);
|
|
61
|
+
const nextIdRef = useRef(1);
|
|
62
|
+
const { pendingItem, streamingState, isLoading, error, sendMessage, reset, clearHistory, } = useLlmStream(callTool, mcpTools);
|
|
63
|
+
// 이관 Effect: 스트림 완료 → history로 이동
|
|
64
|
+
useEffect(() => {
|
|
65
|
+
if (pendingItem?.isComplete) {
|
|
66
|
+
setHistory((prev) => [
|
|
67
|
+
...prev,
|
|
68
|
+
{
|
|
69
|
+
id: nextIdRef.current++,
|
|
70
|
+
type: "assistant",
|
|
71
|
+
content: pendingItem.content,
|
|
72
|
+
timestamp: Date.now(),
|
|
73
|
+
},
|
|
74
|
+
]);
|
|
75
|
+
reset();
|
|
76
|
+
}
|
|
77
|
+
}, [pendingItem, reset]);
|
|
78
|
+
// 에러 로깅
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (error) {
|
|
81
|
+
debugLogger.error("[AppContainer] LLM stream error:", error.message);
|
|
82
|
+
}
|
|
83
|
+
}, [error]);
|
|
84
|
+
const handleFinalSubmit = useCallback(async (value) => {
|
|
85
|
+
if (!value.trim() || isLoading)
|
|
86
|
+
return;
|
|
87
|
+
// Add to UI state session & past session recalculator
|
|
88
|
+
addInput(value);
|
|
89
|
+
// Save to physical file via storage utility
|
|
90
|
+
void historyStorage.appendMessage(value);
|
|
91
|
+
if (value.startsWith("/")) {
|
|
92
|
+
// 슬래시 커맨드 → Dispatcher → MCP 도구 호출
|
|
93
|
+
buffer.setText("");
|
|
94
|
+
const result = await handleDispatch(value, callTool);
|
|
95
|
+
// 로컬 액션 처리
|
|
96
|
+
if (result.content === "__CLEAR_HISTORY__") {
|
|
97
|
+
setHistory([]);
|
|
98
|
+
clearHistory();
|
|
99
|
+
setHistory((prev) => [
|
|
100
|
+
...prev,
|
|
101
|
+
{
|
|
102
|
+
id: nextIdRef.current++,
|
|
103
|
+
type: "info",
|
|
104
|
+
content: "대화 히스토리가 초기화되었습니다.",
|
|
105
|
+
timestamp: Date.now(),
|
|
106
|
+
},
|
|
107
|
+
]);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (result.content === "__LIST_TOOLS__") {
|
|
111
|
+
const toolsText = mcpConnected
|
|
112
|
+
? Array.from(mcpToolsByServer.entries())
|
|
113
|
+
.map(([serverName, serverTools]) => {
|
|
114
|
+
const toolList = serverTools
|
|
115
|
+
.map((t) => ` • ${t.name}${t.description ? ` — ${t.description}` : ""}`)
|
|
116
|
+
.join("\n");
|
|
117
|
+
return `[${serverName}] (${serverTools.length} tools)\n${toolList}`;
|
|
118
|
+
})
|
|
119
|
+
.join("\n\n")
|
|
120
|
+
: "MCP 서버에 연결되지 않았습니다.";
|
|
121
|
+
setHistory((prev) => [
|
|
122
|
+
...prev,
|
|
123
|
+
{
|
|
124
|
+
id: nextIdRef.current++,
|
|
125
|
+
type: "info",
|
|
126
|
+
content: `사용 가능한 MCP 도구:\n${toolsText}`,
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
},
|
|
129
|
+
]);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// 도구 결과 또는 일반 응답을 히스토리에 추가
|
|
133
|
+
if (result.type === "llm_required") {
|
|
134
|
+
// LLM 지시문 페이로드 → 사용자 입력을 히스토리에 표시 후 LLM으로 파이프
|
|
135
|
+
setHistory((prev) => [
|
|
136
|
+
...prev,
|
|
137
|
+
{
|
|
138
|
+
id: nextIdRef.current++,
|
|
139
|
+
type: "user",
|
|
140
|
+
content: result.userIntent ?? value,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
// 도구 결과(instructions + content_preview)를 RAG 컨텍스트처럼 LLM에 주입
|
|
145
|
+
void sendMessage(result.userIntent ?? value, result.content);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
setHistory((prev) => [
|
|
149
|
+
...prev,
|
|
150
|
+
{
|
|
151
|
+
id: nextIdRef.current++,
|
|
152
|
+
type: result.type === "unknown_command" ? "error" : "info",
|
|
153
|
+
content: result.content,
|
|
154
|
+
timestamp: Date.now(),
|
|
155
|
+
},
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// 일반 텍스트 → RAG 컨텍스트 조회 → LLM 스트리밍
|
|
161
|
+
setHistory((prev) => [
|
|
162
|
+
...prev,
|
|
163
|
+
{
|
|
164
|
+
id: nextIdRef.current++,
|
|
165
|
+
type: "user",
|
|
166
|
+
content: value,
|
|
167
|
+
timestamp: Date.now(),
|
|
168
|
+
},
|
|
169
|
+
]);
|
|
170
|
+
// 입력창 즉시 초기화 (Phase 6 피드백 루프)
|
|
171
|
+
buffer.setText("");
|
|
172
|
+
// RAG 컨텍스트 조회 (MCP 연결 시에만)
|
|
173
|
+
const ragContext = await fetchContext(value);
|
|
174
|
+
void sendMessage(value, ragContext);
|
|
175
|
+
}
|
|
176
|
+
}, [
|
|
177
|
+
addInput,
|
|
178
|
+
buffer,
|
|
179
|
+
callTool,
|
|
180
|
+
clearHistory,
|
|
181
|
+
fetchContext,
|
|
182
|
+
handleDispatch,
|
|
183
|
+
isLoading,
|
|
184
|
+
mcpConnected,
|
|
185
|
+
mcpToolsByServer,
|
|
186
|
+
sendMessage,
|
|
187
|
+
]);
|
|
188
|
+
// 전체 서버 연결 중 여부 판별
|
|
189
|
+
const isAnyConnecting = Array.from(mcpConnections.values()).some((info) => info.state === "connecting");
|
|
190
|
+
const hasAnyError = mcpErrors.size > 0;
|
|
191
|
+
return (_jsx(KeypressProvider, { children: _jsx(InputContext.Provider, { value: inputState, children: _jsxs(Box, { flexDirection: "column", width: "100%", children: [!mcpConnected && (_jsx(ConnectionStatus, { connections: mcpConnections, errors: mcpErrors })), _jsx(MainContent, { history: history, pendingItem: pendingItem, streamingState: streamingState, width: mainAreaWidth }), error && (_jsx(Box, { paddingX: 1, marginBottom: 1, children: _jsxs(Text, { color: "red", bold: true, children: ["\u2716 ", error.message] }) })), hasAnyError && !error && (_jsx(Box, { paddingX: 1, marginBottom: 1, flexDirection: "column", children: Array.from(mcpErrors.entries()).map(([serverName, serverError]) => (_jsxs(Text, { color: "yellow", bold: true, children: ["\u26A0 MCP [", serverName, "]: ", serverError.message] }, serverName))) })), _jsx(InputPrompt, { onSubmit: handleFinalSubmit, focus: streamingState === "idle" && mcpConnected, placeholder: isAnyConnecting
|
|
192
|
+
? ` MCP 서버 연결 중... (${mcpConnectedCount}/${mcpServerCount})`
|
|
193
|
+
: hasAnyError && !mcpConnected
|
|
194
|
+
? " MCP 연결에 실패했습니다"
|
|
195
|
+
: " Type your message..." })] }) }) }));
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=AppContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppContainer.js","sourceRoot":"","sources":["../../src/cli/AppContainer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingContext.js","sourceRoot":"","sources":["../../../src/cli/config/SettingContext.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
declare const mcpServerEntrySchema: z.ZodObject<{
|
|
3
|
+
command: z.ZodString;
|
|
4
|
+
args: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
|
|
5
|
+
env: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
|
|
6
|
+
cwd: z.ZodOptional<z.ZodString>;
|
|
7
|
+
disabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
8
|
+
}, z.core.$strip>;
|
|
9
|
+
export type McpServerEntry = z.infer<typeof mcpServerEntrySchema>;
|
|
10
|
+
export interface McpServerConfig {
|
|
11
|
+
name: string;
|
|
12
|
+
command: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
env: Record<string, string>;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadMcpServersConfig(): McpServerConfig[];
|
|
18
|
+
export {};
|