@sunub/obsidian-mcp-server 0.1.1 → 0.3.0

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.
Files changed (284) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +392 -153
  3. package/build/cli/AppContainer.d.ts +1 -0
  4. package/build/cli/AppContainer.js +197 -0
  5. package/build/cli/AppContainer.js.map +1 -0
  6. package/build/cli/app.js +7 -0
  7. package/build/cli/app.js.map +1 -0
  8. package/build/cli/config/SettingContext.d.ts +1 -0
  9. package/build/cli/config/SettingContext.js +2 -0
  10. package/build/cli/config/SettingContext.js.map +1 -0
  11. package/build/cli/config/mcpServersConfig.d.ts +18 -0
  12. package/build/cli/config/mcpServersConfig.js +119 -0
  13. package/build/cli/config/mcpServersConfig.js.map +1 -0
  14. package/build/cli/config/settingSchema.d.ts +180 -0
  15. package/build/cli/config/settingSchema.js +128 -0
  16. package/build/cli/config/settingSchema.js.map +1 -0
  17. package/build/cli/context/InputContext.d.ts +12 -0
  18. package/build/cli/context/InputContext.js +10 -0
  19. package/build/cli/context/InputContext.js.map +1 -0
  20. package/build/cli/context/KeypressContext.d.ts +30 -0
  21. package/build/cli/context/KeypressContext.js +200 -0
  22. package/build/cli/context/KeypressContext.js.map +1 -0
  23. package/build/cli/context/KeypressContext.util.d.ts +7 -0
  24. package/build/cli/context/KeypressContext.util.js +474 -0
  25. package/build/cli/context/KeypressContext.util.js.map +1 -0
  26. package/build/cli/hooks/useAtCompletion.d.ts +12 -0
  27. package/build/cli/hooks/useAtCompletion.js +5 -0
  28. package/build/cli/hooks/useAtCompletion.js.map +1 -0
  29. package/build/cli/hooks/useCommandCompletion.d.ts +59 -0
  30. package/build/cli/hooks/useCommandCompletion.js +344 -0
  31. package/build/cli/hooks/useCommandCompletion.js.map +1 -0
  32. package/build/cli/hooks/useCompletion.d.ts +22 -0
  33. package/build/cli/hooks/useCompletion.js +84 -0
  34. package/build/cli/hooks/useCompletion.js.map +1 -0
  35. package/build/cli/hooks/useDispatcher.d.ts +6 -0
  36. package/build/cli/hooks/useDispatcher.js +286 -0
  37. package/build/cli/hooks/useDispatcher.js.map +1 -0
  38. package/build/cli/hooks/useFocus.d.ts +2 -0
  39. package/build/cli/hooks/useFocus.js +3 -0
  40. package/build/cli/hooks/useFocus.js.map +1 -0
  41. package/build/cli/hooks/useInputHistory.d.ts +24 -0
  42. package/build/cli/hooks/useInputHistory.js +159 -0
  43. package/build/cli/hooks/useInputHistory.js.map +1 -0
  44. package/build/cli/hooks/useKeyMatchers.d.ts +17 -0
  45. package/build/cli/hooks/useKeyMatchers.js +13 -0
  46. package/build/cli/hooks/useKeyMatchers.js.map +1 -0
  47. package/build/cli/hooks/useKeypress.d.ts +19 -0
  48. package/build/cli/hooks/useKeypress.js +28 -0
  49. package/build/cli/hooks/useKeypress.js.map +1 -0
  50. package/build/cli/hooks/useLlmStream.d.ts +12 -0
  51. package/build/cli/hooks/useLlmStream.js +365 -0
  52. package/build/cli/hooks/useLlmStream.js.map +1 -0
  53. package/build/cli/hooks/useMcpClient.d.ts +10 -0
  54. package/build/cli/hooks/useMcpClient.js +100 -0
  55. package/build/cli/hooks/useMcpClient.js.map +1 -0
  56. package/build/cli/hooks/useMcpManager.d.ts +22 -0
  57. package/build/cli/hooks/useMcpManager.js +86 -0
  58. package/build/cli/hooks/useMcpManager.js.map +1 -0
  59. package/build/cli/hooks/usePromptCompletion.d.ts +19 -0
  60. package/build/cli/hooks/usePromptCompletion.js +13 -0
  61. package/build/cli/hooks/usePromptCompletion.js.map +1 -0
  62. package/build/cli/hooks/useRagContext.d.ts +6 -0
  63. package/build/cli/hooks/useRagContext.js +83 -0
  64. package/build/cli/hooks/useRagContext.js.map +1 -0
  65. package/build/cli/hooks/useShellCompletion.d.ts +18 -0
  66. package/build/cli/hooks/useShellCompletion.js +10 -0
  67. package/build/cli/hooks/useShellCompletion.js.map +1 -0
  68. package/build/cli/hooks/useSlashCompletion.d.ts +21 -0
  69. package/build/cli/hooks/useSlashCompletion.js +11 -0
  70. package/build/cli/hooks/useSlashCompletion.js.map +1 -0
  71. package/build/cli/hooks/useTerminalSize.d.ts +9 -0
  72. package/build/cli/hooks/useTerminalSize.js +26 -0
  73. package/build/cli/hooks/useTerminalSize.js.map +1 -0
  74. package/build/cli/index.js +27 -0
  75. package/build/cli/index.js.map +1 -0
  76. package/build/cli/key/keyBindings.d.ts +152 -0
  77. package/build/cli/key/keyBindings.js +630 -0
  78. package/build/cli/key/keyBindings.js.map +1 -0
  79. package/build/cli/key/keyMatchers.d.ts +27 -0
  80. package/build/cli/key/keyMatchers.js +33 -0
  81. package/build/cli/key/keyMatchers.js.map +1 -0
  82. package/build/cli/key/text-buffer-bestcase.js +2754 -0
  83. package/build/cli/key/text-buffer-bestcase.js.map +1 -0
  84. package/build/cli/key/text-buffer.js +918 -0
  85. package/build/cli/key/text-buffer.js.map +1 -0
  86. package/build/cli/reference/HistoryItemDisplay.d.ts +23 -0
  87. package/build/cli/reference/HistoryItemDisplay.js +63 -0
  88. package/build/cli/reference/HistoryItemDisplay.js.map +1 -0
  89. package/build/cli/reference/InputContext.d.ts +17 -0
  90. package/build/cli/reference/InputContext.js +16 -0
  91. package/build/cli/reference/InputContext.js.map +1 -0
  92. package/build/cli/reference/KerypressContext.d.ts +37 -0
  93. package/build/cli/reference/KerypressContext.js +791 -0
  94. package/build/cli/reference/KerypressContext.js.map +1 -0
  95. package/build/cli/reference/MainContent.d.ts +6 -0
  96. package/build/cli/reference/MainContent.js +207 -0
  97. package/build/cli/reference/MainContent.js.map +1 -0
  98. package/build/cli/reference/UIStateContext.d.ts +188 -0
  99. package/build/cli/reference/UIStateContext.js +16 -0
  100. package/build/cli/reference/UIStateContext.js.map +1 -0
  101. package/build/cli/reference/useGeminiStream.d.ts +42 -0
  102. package/build/cli/reference/useGeminiStream.js +1404 -0
  103. package/build/cli/reference/useGeminiStream.js.map +1 -0
  104. package/build/cli/services/McpClientService.d.ts +32 -0
  105. package/build/cli/services/McpClientService.js +123 -0
  106. package/build/cli/services/McpClientService.js.map +1 -0
  107. package/build/cli/services/McpManager.d.ts +28 -0
  108. package/build/cli/services/McpManager.js +146 -0
  109. package/build/cli/services/McpManager.js.map +1 -0
  110. package/build/cli/theme/builtin/no-color.js +125 -0
  111. package/build/cli/theme/builtin/no-color.js.map +1 -0
  112. package/build/cli/theme/builtin/tokyonight-dark.js +146 -0
  113. package/build/cli/theme/builtin/tokyonight-dark.js.map +1 -0
  114. package/build/cli/theme/semantic-colors.js +19 -0
  115. package/build/cli/theme/semantic-colors.js.map +1 -0
  116. package/build/cli/theme/semantic-tokens.js +77 -0
  117. package/build/cli/theme/semantic-tokens.js.map +1 -0
  118. package/build/cli/theme/theme-manager.d.ts +32 -0
  119. package/build/cli/theme/theme-manager.js +150 -0
  120. package/build/cli/theme/theme-manager.js.map +1 -0
  121. package/build/cli/theme/theme.js +333 -0
  122. package/build/cli/theme/theme.js.map +1 -0
  123. package/build/cli/tmp.js +27 -0
  124. package/build/cli/tmp.js.map +1 -0
  125. package/build/cli/types.d.ts +72 -0
  126. package/build/cli/types.js +8 -0
  127. package/build/cli/types.js.map +1 -0
  128. package/build/cli/ui/ConnectionStatus.d.ts +13 -0
  129. package/build/cli/ui/ConnectionStatus.js +24 -0
  130. package/build/cli/ui/ConnectionStatus.js.map +1 -0
  131. package/build/cli/ui/HelpCommands.d.ts +5 -0
  132. package/build/cli/ui/HelpCommands.js +11 -0
  133. package/build/cli/ui/HelpCommands.js.map +1 -0
  134. package/build/cli/ui/HistoryItemDisplay.d.ts +9 -0
  135. package/build/cli/ui/HistoryItemDisplay.js +38 -0
  136. package/build/cli/ui/HistoryItemDisplay.js.map +1 -0
  137. package/build/cli/ui/InputPrompt-bestcase.d.ts +63 -0
  138. package/build/cli/ui/InputPrompt-bestcase.js +1301 -0
  139. package/build/cli/ui/InputPrompt-bestcase.js.map +1 -0
  140. package/build/cli/ui/InputPrompt.d.ts +12 -0
  141. package/build/cli/ui/InputPrompt.js +145 -0
  142. package/build/cli/ui/InputPrompt.js.map +1 -0
  143. package/build/cli/ui/InputPrompt.tmp.d.ts +7 -0
  144. package/build/cli/ui/InputPrompt.tmp.js +215 -0
  145. package/build/cli/ui/InputPrompt.tmp.js.map +1 -0
  146. package/build/cli/ui/MainContent.d.ts +10 -0
  147. package/build/cli/ui/MainContent.js +24 -0
  148. package/build/cli/ui/MainContent.js.map +1 -0
  149. package/build/cli/ui/MouseContext.d.ts +1 -0
  150. package/build/cli/ui/MouseContext.js +2 -0
  151. package/build/cli/ui/MouseContext.js.map +1 -0
  152. package/build/cli/ui/SuggestionsDisplay.d.ts +25 -0
  153. package/build/cli/ui/SuggestionsDisplay.js +45 -0
  154. package/build/cli/ui/SuggestionsDisplay.js.map +1 -0
  155. package/build/cli/ui/ThinkingIndicator.d.ts +2 -0
  156. package/build/cli/ui/ThinkingIndicator.js +16 -0
  157. package/build/cli/ui/ThinkingIndicator.js.map +1 -0
  158. package/build/cli/ui/layout/DefaultAppLayout.d.ts +2 -0
  159. package/build/cli/ui/layout/DefaultAppLayout.js +6 -0
  160. package/build/cli/ui/layout/DefaultAppLayout.js.map +1 -0
  161. package/build/cli/ui/shared/ExpandableText.d.ts +14 -0
  162. package/build/cli/ui/shared/ExpandableText.js +19 -0
  163. package/build/cli/ui/shared/ExpandableText.js.map +1 -0
  164. package/build/cli/utils/commandUtils.d.ts +11 -0
  165. package/build/cli/utils/commandUtils.js +16 -0
  166. package/build/cli/utils/commandUtils.js.map +1 -0
  167. package/build/cli/utils/debugLogger.d.ts +12 -0
  168. package/build/cli/utils/debugLogger.js +52 -0
  169. package/build/cli/utils/debugLogger.js.map +1 -0
  170. package/build/cli/utils/historyStorage.d.ts +13 -0
  171. package/build/cli/utils/historyStorage.js +64 -0
  172. package/build/cli/utils/historyStorage.js.map +1 -0
  173. package/build/cli/utils/textUtil.d.ts +68 -0
  174. package/build/cli/utils/textUtil.js +236 -0
  175. package/build/cli/utils/textUtil.js.map +1 -0
  176. package/build/config.js +31 -5
  177. package/build/config.js.map +1 -0
  178. package/build/db.js +55 -0
  179. package/build/db.js.map +1 -0
  180. package/build/index.js +4 -4
  181. package/build/index.js.map +1 -0
  182. package/build/tools/create_document_with_properties/index.d.ts +60 -0
  183. package/build/tools/create_document_with_properties/index.js +6 -0
  184. package/build/tools/create_document_with_properties/index.js.map +1 -0
  185. package/build/tools/create_document_with_properties/params.d.ts +66 -0
  186. package/build/tools/generate_property/index.js +6 -0
  187. package/build/tools/generate_property/index.js.map +1 -0
  188. package/build/tools/index.d.ts +184 -0
  189. package/build/tools/organize_attachments/index.js +6 -0
  190. package/build/tools/organize_attachments/index.js.map +1 -0
  191. package/build/tools/organize_attachments/params.d.ts +122 -0
  192. package/build/tools/vault/index.js +16 -2
  193. package/build/tools/vault/index.js.map +1 -0
  194. package/build/tools/vault/params.d.ts +115 -0
  195. package/build/tools/vault/types/collect_context.d.ts +1340 -0
  196. package/build/tools/vault/types/list_all.d.ts +387 -0
  197. package/build/tools/vault/types/read_specific.d.ts +297 -0
  198. package/build/tools/vault/types/search.d.ts +598 -0
  199. package/build/tools/vault/utils/actions/collect_context.js +26 -1
  200. package/build/tools/vault/utils/actions/collect_context.js.map +1 -0
  201. package/build/tools/vault/utils/actions/index_rag.js +27 -0
  202. package/build/tools/vault/utils/actions/index_rag.js.map +1 -0
  203. package/build/tools/vault/utils/actions/list_all.js +1 -0
  204. package/build/tools/vault/utils/actions/list_all.js.map +1 -0
  205. package/build/tools/vault/utils/actions/load_memory.js +23 -13
  206. package/build/tools/vault/utils/actions/load_memory.js.map +1 -0
  207. package/build/tools/vault/utils/actions/read.js +2 -1
  208. package/build/tools/vault/utils/actions/read.js.map +1 -0
  209. package/build/tools/vault/utils/actions/search.js +2 -1
  210. package/build/tools/vault/utils/actions/search.js.map +1 -0
  211. package/build/tools/vault/utils/actions/search_semantic.js +54 -0
  212. package/build/tools/vault/utils/actions/search_semantic.js.map +1 -0
  213. package/build/tools/vault/utils/actions/stats.js +1 -0
  214. package/build/tools/vault/utils/actions/stats.js.map +1 -0
  215. package/build/tools/vault/utils/document.js +1 -0
  216. package/build/tools/vault/utils/document.js.map +1 -0
  217. package/build/tools/write_property/index.d.ts +58 -0
  218. package/build/tools/write_property/index.js +6 -0
  219. package/build/tools/write_property/index.js.map +1 -0
  220. package/build/utils/DirectoryWalker.d.ts +6 -0
  221. package/build/utils/DirectoryWalker.js +7 -0
  222. package/build/utils/DirectoryWalker.js.map +1 -0
  223. package/build/utils/Indexer.d.ts +18 -0
  224. package/build/utils/Indexer.js +5 -9
  225. package/build/utils/Indexer.js.map +1 -0
  226. package/build/utils/LLMClient.d.ts +37 -0
  227. package/build/utils/LLMClient.js +82 -0
  228. package/build/utils/LLMClient.js.map +1 -0
  229. package/build/utils/RAGIndexer.d.ts +22 -0
  230. package/build/utils/RAGIndexer.js +206 -0
  231. package/build/utils/RAGIndexer.js.map +1 -0
  232. package/build/utils/RerankerClient.d.ts +27 -0
  233. package/build/utils/RerankerClient.js +69 -0
  234. package/build/utils/RerankerClient.js.map +1 -0
  235. package/build/utils/VaultManger/VaultManager.d.ts +34 -0
  236. package/build/utils/VaultManger/VaultManager.js +1 -0
  237. package/build/utils/VaultManger/VaultManager.js.map +1 -0
  238. package/build/utils/VaultManger/VaultPathError.d.ts +6 -0
  239. package/build/utils/VaultManger/VaultPathError.js +1 -0
  240. package/build/utils/VaultManger/VaultPathError.js.map +1 -0
  241. package/build/utils/VaultManger/index.d.ts +3 -0
  242. package/build/utils/VaultManger/index.js +1 -0
  243. package/build/utils/VaultManger/index.js.map +1 -0
  244. package/build/utils/VaultManger/types.d.ts +16 -0
  245. package/build/utils/VaultManger/types.js +1 -0
  246. package/build/utils/VaultManger/types.js.map +1 -0
  247. package/build/utils/VaultWatcher.d.ts +8 -0
  248. package/build/utils/VaultWatcher.js +96 -0
  249. package/build/utils/VaultWatcher.js.map +1 -0
  250. package/build/utils/VectorDB.d.ts +53 -0
  251. package/build/utils/VectorDB.js +243 -0
  252. package/build/utils/VectorDB.js.map +1 -0
  253. package/build/utils/createToolError.d.ts +2 -0
  254. package/build/utils/createToolError.js +1 -0
  255. package/build/utils/createToolError.js.map +1 -0
  256. package/build/utils/getVaultManager.d.ts +2 -0
  257. package/build/utils/getVaultManager.js +1 -0
  258. package/build/utils/getVaultManager.js.map +1 -0
  259. package/build/utils/processor/LinkExtractor.d.ts +2 -0
  260. package/build/utils/processor/LinkExtractor.js +1 -0
  261. package/build/utils/processor/LinkExtractor.js.map +1 -0
  262. package/build/utils/processor/MatterParser.d.ts +2 -0
  263. package/build/utils/processor/MatterParser.js +12 -3
  264. package/build/utils/processor/MatterParser.js.map +1 -0
  265. package/build/utils/processor/types.d.ts +100 -0
  266. package/package.json +28 -7
  267. package/build/server.js +0 -32
  268. package/build/tools/create_document_with_properties/params.js +0 -32
  269. package/build/tools/generate_property/params.js +0 -54
  270. package/build/tools/index.js +0 -12
  271. package/build/tools/organize_attachments/params.js +0 -60
  272. package/build/tools/organize_attachments/utils.js +0 -65
  273. package/build/tools/vault/metrics.js +0 -126
  274. package/build/tools/vault/params.js +0 -141
  275. package/build/tools/vault/types/collect_context.js +0 -102
  276. package/build/tools/vault/types/list_all.js +0 -52
  277. package/build/tools/vault/types/read_specific.js +0 -40
  278. package/build/tools/vault/types/search.js +0 -58
  279. package/build/tools/vault/utils/constants.js +0 -2
  280. package/build/tools/vault/utils/shared.js +0 -74
  281. package/build/tools/vault/utils.js +0 -6
  282. package/build/tools/write_property/params.js +0 -51
  283. package/build/utils/processor/types.js +0 -27
  284. package/build/utils/semaphore.js +0 -25
@@ -0,0 +1,6 @@
1
+ import type { CallToolFn } from "../types.js";
2
+ export interface UseRagContextReturn {
3
+ fetchContext: (query: string) => Promise<string | null>;
4
+ isFetching: boolean;
5
+ }
6
+ export declare const useRagContext: (callTool: CallToolFn, isConnected: boolean) => UseRagContextReturn;
@@ -0,0 +1,83 @@
1
+ import { useCallback, useState } from "react";
2
+ import { debugLogger } from "../utils/debugLogger.js";
3
+ const MAX_CONTEXT_CHARS = 4000;
4
+ const ANSI_RE =
5
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequences intentionally matched
6
+ /[\u001b\u009b][[()#;?]*(?:\d{1,4}(?:;\d{0,4})*)?[A-Za-z0-9=><~]/g;
7
+ function stripAnsi(text) {
8
+ return text.replace(ANSI_RE, "");
9
+ }
10
+ function extractTextFromResult(result) {
11
+ return result.content
12
+ .filter((c) => c.type === "text" && c.text)
13
+ .map((c) => c.text ?? "")
14
+ .join("\n");
15
+ }
16
+ function hasValidResults(result) {
17
+ if (result.isError) {
18
+ return false;
19
+ }
20
+ const text = extractTextFromResult(result);
21
+ return text.length > 0 && !text.includes("No results found");
22
+ }
23
+ function formatAsContext(rawText) {
24
+ const truncated = rawText.length > MAX_CONTEXT_CHARS
25
+ ? `${rawText.slice(0, MAX_CONTEXT_CHARS)}\n... (결과가 잘렸습니다)`
26
+ : rawText;
27
+ return [
28
+ "[Vault Context]",
29
+ "아래는 사용자의 Obsidian Vault에서 찾은 관련 문서입니다. 이 컨텍스트를 참고하여 답변해주세요.",
30
+ "",
31
+ truncated,
32
+ "",
33
+ "[End Vault Context]",
34
+ ].join("\n");
35
+ }
36
+ export const useRagContext = (callTool, isConnected) => {
37
+ const [isFetching, setIsFetching] = useState(false);
38
+ const fetchContext = useCallback(async (rawQuery) => {
39
+ if (!isConnected) {
40
+ debugLogger.debug("[RAG] MCP not connected, skipping context fetch.");
41
+ return null;
42
+ }
43
+ const query = stripAnsi(rawQuery).trim();
44
+ setIsFetching(true);
45
+ debugLogger.debug(`[RAG] Fetching context for: "${query}"`);
46
+ try {
47
+ const semanticResult = await callTool("vault", {
48
+ action: "search_vault_by_semantic",
49
+ query,
50
+ limit: 5,
51
+ });
52
+ if (hasValidResults(semanticResult)) {
53
+ const text = extractTextFromResult(semanticResult);
54
+ debugLogger.debug(`[RAG] Semantic search returned ${text.length} chars.`);
55
+ return formatAsContext(text);
56
+ }
57
+ debugLogger.debug("[RAG] Semantic search empty, falling back to keyword search.");
58
+ const keywordResult = await callTool("vault", {
59
+ action: "search",
60
+ keyword: query,
61
+ limit: 5,
62
+ includeContent: true,
63
+ compressionMode: "balanced",
64
+ });
65
+ if (hasValidResults(keywordResult)) {
66
+ const text = extractTextFromResult(keywordResult);
67
+ debugLogger.debug(`[RAG] Keyword search returned ${text.length} chars.`);
68
+ return formatAsContext(text);
69
+ }
70
+ debugLogger.debug("[RAG] No relevant context found in Vault.");
71
+ return null;
72
+ }
73
+ catch (err) {
74
+ debugLogger.error("[RAG] Context fetch failed:", err);
75
+ return null;
76
+ }
77
+ finally {
78
+ setIsFetching(false);
79
+ }
80
+ }, [callTool, isConnected]);
81
+ return { fetchContext, isFetching };
82
+ };
83
+ //# sourceMappingURL=useRagContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRagContext.js","sourceRoot":"","sources":["../../../src/cli/hooks/useRagContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type React from "react";
2
+ import type { Suggestion } from "../ui/SuggestionsDisplay.js";
3
+ export interface UseShellCompletionOptions {
4
+ enabled: boolean;
5
+ line: string;
6
+ cursorCol: number;
7
+ cwd: string;
8
+ setSuggestions: React.Dispatch<React.SetStateAction<Suggestion[]>>;
9
+ setIsLoadingSuggestions: React.Dispatch<React.SetStateAction<boolean>>;
10
+ }
11
+ export interface ShellCompletionRange {
12
+ query: string | null;
13
+ completionStart: number;
14
+ completionEnd: number;
15
+ activeStart: number;
16
+ }
17
+ /** Stub: Shell path/command completion. */
18
+ export declare function useShellCompletion(_options: UseShellCompletionOptions): ShellCompletionRange;
@@ -0,0 +1,10 @@
1
+ /** Stub: Shell path/command completion. */
2
+ export function useShellCompletion(_options) {
3
+ return {
4
+ query: null,
5
+ completionStart: -1,
6
+ completionEnd: -1,
7
+ activeStart: -1,
8
+ };
9
+ }
10
+ //# sourceMappingURL=useShellCompletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShellCompletion.js","sourceRoot":"","sources":["../../../src/cli/hooks/useShellCompletion.ts"],"names":[],"mappings":"AAmBA,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CACjC,QAAmC;IAEnC,OAAO;QACN,KAAK,EAAE,IAAI;QACX,eAAe,EAAE,CAAC,CAAC;QACnB,aAAa,EAAE,CAAC,CAAC;QACjB,WAAW,EAAE,CAAC,CAAC;KACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type React from "react";
2
+ import type { CommandContext, SlashCommand } from "../commands/types.js";
3
+ import type { Suggestion } from "../ui/SuggestionsDisplay.js";
4
+ export interface UseSlashCompletionOptions {
5
+ enabled: boolean;
6
+ query: string | null;
7
+ slashCommands: readonly SlashCommand[];
8
+ commandContext: CommandContext;
9
+ setSuggestions: React.Dispatch<React.SetStateAction<Suggestion[]>>;
10
+ setIsLoadingSuggestions: React.Dispatch<React.SetStateAction<boolean>>;
11
+ setIsPerfectMatch: React.Dispatch<React.SetStateAction<boolean>>;
12
+ }
13
+ export interface SlashCompletionRange {
14
+ completionStart: number;
15
+ completionEnd: number;
16
+ getCommandFromSuggestion: (suggestion: Suggestion) => SlashCommand | undefined;
17
+ isArgumentCompletion: boolean;
18
+ leafCommand: SlashCommand | null;
19
+ }
20
+ /** Stub: Slash-command completion. */
21
+ export declare function useSlashCompletion(_options: UseSlashCompletionOptions): SlashCompletionRange;
@@ -0,0 +1,11 @@
1
+ /** Stub: Slash-command completion. */
2
+ export function useSlashCompletion(_options) {
3
+ return {
4
+ completionStart: -1,
5
+ completionEnd: -1,
6
+ getCommandFromSuggestion: () => undefined,
7
+ isArgumentCompletion: false,
8
+ leafCommand: null,
9
+ };
10
+ }
11
+ //# sourceMappingURL=useSlashCompletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashCompletion.js","sourceRoot":"","sources":["../../../src/cli/hooks/useSlashCompletion.ts"],"names":[],"mappings":"AAwBA,sCAAsC;AACtC,MAAM,UAAU,kBAAkB,CACjC,QAAmC;IAEnC,OAAO;QACN,eAAe,EAAE,CAAC,CAAC;QACnB,aAAa,EAAE,CAAC,CAAC;QACjB,wBAAwB,EAAE,GAAG,EAAE,CAAC,SAAS;QACzC,oBAAoB,EAAE,KAAK;QAC3B,WAAW,EAAE,IAAI;KACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare function useTerminalSize(): {
7
+ columns: number;
8
+ rows: number;
9
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { useEffect, useState } from "react";
7
+ export function useTerminalSize() {
8
+ const [size, setSize] = useState({
9
+ columns: process.stdout.columns || 60,
10
+ rows: process.stdout.rows || 20,
11
+ });
12
+ useEffect(() => {
13
+ function updateSize() {
14
+ setSize({
15
+ columns: process.stdout.columns || 60,
16
+ rows: process.stdout.rows || 20,
17
+ });
18
+ }
19
+ process.stdout.on("resize", updateSize);
20
+ return () => {
21
+ process.stdout.off("resize", updateSize);
22
+ };
23
+ }, []);
24
+ return size;
25
+ }
26
+ //# sourceMappingURL=useTerminalSize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/cli/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,UAAU,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;QACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;KAC/B,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,SAAS,UAAU;YAClB,OAAO,CAAC;gBACP,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;gBACrC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;aAC/B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACX,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { render } from "ink";
3
+ import { AppContainer } from "./AppContainer.js";
4
+ import { debugLogger } from "./utils/debugLogger.js";
5
+ import "dotenv/config";
6
+ async function checkLLMHealth() {
7
+ const apiUrl = (process.env["LLM_API_URL"] || "http://127.0.0.1:8080").replace(/\/$/, "");
8
+ try {
9
+ const response = await fetch(`${apiUrl}/v1/models`);
10
+ if (!response.ok) {
11
+ debugLogger.warn(`[CLI] LLM endpoint ${apiUrl} returned ${response.status}. Continuing anyway...`);
12
+ return;
13
+ }
14
+ debugLogger.info(`[CLI] Successfully verified LLM API at ${apiUrl}.`);
15
+ }
16
+ catch (_error) {
17
+ debugLogger.warn(`[CLI] Could not connect to LLM API at ${apiUrl}. Make sure your server is running.`);
18
+ }
19
+ }
20
+ async function start() {
21
+ debugLogger.info("App starting - verifying environment.");
22
+ checkLLMHealth().catch(() => { });
23
+ const { waitUntilExit } = render(_jsx(AppContainer, {}));
24
+ await waitUntilExit();
25
+ }
26
+ start();
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,eAAe,CAAC;AAEvB,KAAK,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,CACd,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,uBAAuB,CACrD,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErB,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,WAAW,CAAC,IAAI,CACf,sBAAsB,MAAM,aAAa,QAAQ,CAAC,MAAM,wBAAwB,CAChF,CAAC;YACF,OAAO;QACR,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,0CAA0C,MAAM,GAAG,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QACjB,WAAW,CAAC,IAAI,CACf,yCAAyC,MAAM,qCAAqC,CACpF,CAAC;IACH,CAAC;AACF,CAAC;AAED,KAAK,UAAU,KAAK;IACnB,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAC1D,cAAc,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACjC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC;IACnD,MAAM,aAAa,EAAE,CAAC;AACvB,CAAC;AAED,KAAK,EAAE,CAAC"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { z } from "zod";
7
+ /**
8
+ * Command enum for all available keyboard shortcuts
9
+ */
10
+ import type { Key } from "../hooks/useKeypress.js";
11
+ export declare enum Command {
12
+ RETURN = "basic.confirm",
13
+ ESCAPE = "basic.cancel",
14
+ QUIT = "basic.quit",
15
+ EXIT = "basic.exit",
16
+ HOME = "cursor.home",
17
+ END = "cursor.end",
18
+ MOVE_UP = "cursor.up",
19
+ MOVE_DOWN = "cursor.down",
20
+ MOVE_LEFT = "cursor.left",
21
+ MOVE_RIGHT = "cursor.right",
22
+ MOVE_WORD_LEFT = "cursor.wordLeft",
23
+ MOVE_WORD_RIGHT = "cursor.wordRight",
24
+ KILL_LINE_RIGHT = "edit.deleteRightAll",
25
+ KILL_LINE_LEFT = "edit.deleteLeftAll",
26
+ CLEAR_INPUT = "edit.clear",
27
+ DELETE_WORD_BACKWARD = "edit.deleteWordLeft",
28
+ DELETE_WORD_FORWARD = "edit.deleteWordRight",
29
+ DELETE_CHAR_LEFT = "edit.deleteLeft",
30
+ DELETE_CHAR_RIGHT = "edit.deleteRight",
31
+ UNDO = "edit.undo",
32
+ REDO = "edit.redo",
33
+ SCROLL_UP = "scroll.up",
34
+ SCROLL_DOWN = "scroll.down",
35
+ SCROLL_HOME = "scroll.home",
36
+ SCROLL_END = "scroll.end",
37
+ PAGE_UP = "scroll.pageUp",
38
+ PAGE_DOWN = "scroll.pageDown",
39
+ HISTORY_UP = "history.previous",
40
+ HISTORY_DOWN = "history.next",
41
+ REVERSE_SEARCH = "history.search.start",
42
+ SUBMIT_REVERSE_SEARCH = "history.search.submit",
43
+ ACCEPT_SUGGESTION_REVERSE_SEARCH = "history.search.accept",
44
+ NAVIGATION_UP = "nav.up",
45
+ NAVIGATION_DOWN = "nav.down",
46
+ DIALOG_NAVIGATION_UP = "nav.dialog.up",
47
+ DIALOG_NAVIGATION_DOWN = "nav.dialog.down",
48
+ DIALOG_NEXT = "nav.dialog.next",
49
+ DIALOG_PREV = "nav.dialog.previous",
50
+ ACCEPT_SUGGESTION = "suggest.accept",
51
+ COMPLETION_UP = "suggest.focusPrevious",
52
+ COMPLETION_DOWN = "suggest.focusNext",
53
+ EXPAND_SUGGESTION = "suggest.expand",
54
+ COLLAPSE_SUGGESTION = "suggest.collapse",
55
+ SUBMIT = "input.submit",
56
+ QUEUE_MESSAGE = "input.queueMessage",
57
+ NEWLINE = "input.newline",
58
+ OPEN_EXTERNAL_EDITOR = "input.openExternalEditor",
59
+ DEPRECATED_OPEN_EXTERNAL_EDITOR = "input.deprecatedOpenExternalEditor",
60
+ PASTE_CLIPBOARD = "input.paste",
61
+ SHOW_ERROR_DETAILS = "app.showErrorDetails",
62
+ SHOW_FULL_TODOS = "app.showFullTodos",
63
+ SHOW_IDE_CONTEXT_DETAIL = "app.showIdeContextDetail",
64
+ TOGGLE_MARKDOWN = "app.toggleMarkdown",
65
+ TOGGLE_COPY_MODE = "app.toggleCopyMode",
66
+ TOGGLE_MOUSE_MODE = "app.toggleMouseMode",
67
+ TOGGLE_YOLO = "app.toggleYolo",
68
+ CYCLE_APPROVAL_MODE = "app.cycleApprovalMode",
69
+ SHOW_MORE_LINES = "app.showMoreLines",
70
+ EXPAND_PASTE = "app.expandPaste",
71
+ FOCUS_SHELL_INPUT = "app.focusShellInput",
72
+ UNFOCUS_SHELL_INPUT = "app.unfocusShellInput",
73
+ CLEAR_SCREEN = "app.clearScreen",
74
+ RESTART_APP = "app.restart",
75
+ SUSPEND_APP = "app.suspend",
76
+ SHOW_SHELL_INPUT_UNFOCUS_WARNING = "app.showShellUnfocusWarning",
77
+ BACKGROUND_SHELL_ESCAPE = "background.escape",
78
+ BACKGROUND_SHELL_SELECT = "background.select",
79
+ TOGGLE_BACKGROUND_SHELL = "background.toggle",
80
+ TOGGLE_BACKGROUND_SHELL_LIST = "background.toggleList",
81
+ KILL_BACKGROUND_SHELL = "background.kill",
82
+ UNFOCUS_BACKGROUND_SHELL = "background.unfocus",
83
+ UNFOCUS_BACKGROUND_SHELL_LIST = "background.unfocusList",
84
+ SHOW_BACKGROUND_SHELL_UNFOCUS_WARNING = "background.unfocusWarning",
85
+ UPDATE_EXTENSION = "extension.update",
86
+ LINK_EXTENSION = "extension.link",
87
+ DUMP_FRAME = "app.dumpFrame",
88
+ START_RECORDING = "app.startRecording",
89
+ STOP_RECORDING = "app.stopRecording"
90
+ }
91
+ /**
92
+ * Data-driven key binding structure for user configuration
93
+ */
94
+ export declare class KeyBinding {
95
+ private static readonly VALID_LONG_KEYS;
96
+ /** The key name (e.g., 'a', 'enter', 'tab', 'escape') */
97
+ readonly name: string;
98
+ readonly shift: boolean;
99
+ readonly alt: boolean;
100
+ readonly ctrl: boolean;
101
+ readonly cmd: boolean;
102
+ constructor(pattern: string);
103
+ matches(key: Key): boolean;
104
+ equals(other: KeyBinding): boolean;
105
+ }
106
+ /**
107
+ * Configuration type mapping commands to their key bindings
108
+ */
109
+ export type KeyBindingConfig = Map<Command, readonly KeyBinding[]>;
110
+ /**
111
+ * Default key binding configuration
112
+ * Matches the original hard-coded logic exactly
113
+ */
114
+ export declare const defaultKeyBindingConfig: KeyBindingConfig;
115
+ interface CommandCategory {
116
+ readonly title: string;
117
+ readonly commands: readonly Command[];
118
+ }
119
+ /**
120
+ * Presentation metadata for grouping commands in documentation or UI.
121
+ */
122
+ export declare const commandCategories: readonly CommandCategory[];
123
+ /**
124
+ * Human-readable descriptions for each command, used in docs/tooling.
125
+ */
126
+ export declare const commandDescriptions: Readonly<Record<Command, string>>;
127
+ export declare const keybindingsSchema: z.ZodArray<z.ZodEffects<z.ZodObject<{
128
+ command: z.ZodEffects<z.ZodString, {
129
+ command: Command;
130
+ negate: boolean;
131
+ }, string>;
132
+ key: z.ZodString;
133
+ }, "strip", z.ZodTypeAny, {
134
+ key: string;
135
+ command: {
136
+ command: Command;
137
+ negate: boolean;
138
+ };
139
+ }, {
140
+ key: string;
141
+ command: string;
142
+ }>, {
143
+ commandEntry: {
144
+ command: Command;
145
+ negate: boolean;
146
+ };
147
+ key: string;
148
+ }, {
149
+ key: string;
150
+ command: string;
151
+ }>, "many">;
152
+ export {};