mdcontext 0.1.0 → 0.2.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 (251) hide show
  1. package/.changeset/config.json +9 -9
  2. package/.claude/settings.local.json +25 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +85 -0
  5. package/CONTRIBUTING.md +186 -0
  6. package/NOTES/NOTES +44 -0
  7. package/README.md +206 -3
  8. package/biome.json +1 -1
  9. package/dist/chunk-23UPXDNL.js +3044 -0
  10. package/dist/chunk-2W7MO2DL.js +1366 -0
  11. package/dist/chunk-3NUAZGMA.js +1689 -0
  12. package/dist/chunk-7TOWB2XB.js +366 -0
  13. package/dist/chunk-7XOTOADQ.js +3065 -0
  14. package/dist/chunk-AH2PDM2K.js +3042 -0
  15. package/dist/chunk-BNXWSZ63.js +3742 -0
  16. package/dist/chunk-BTL5DJVU.js +3222 -0
  17. package/dist/chunk-HDHYG7E4.js +104 -0
  18. package/dist/chunk-HLR4KZBP.js +3234 -0
  19. package/dist/chunk-IP3FRFEB.js +1045 -0
  20. package/dist/chunk-KHU56VDO.js +3042 -0
  21. package/dist/chunk-KRYIFLQR.js +85 -89
  22. package/dist/chunk-LBSDNLEM.js +287 -0
  23. package/dist/chunk-MNTQ7HCP.js +2643 -0
  24. package/dist/chunk-MUJELQQ6.js +1387 -0
  25. package/dist/chunk-MXJGMSLV.js +2199 -0
  26. package/dist/chunk-N6QJGC3Z.js +2636 -0
  27. package/dist/chunk-OBELGBPM.js +1713 -0
  28. package/dist/chunk-OT7R5XTA.js +3192 -0
  29. package/dist/chunk-P7X4RA2T.js +106 -0
  30. package/dist/chunk-PIDUQNC2.js +3185 -0
  31. package/dist/chunk-POGCDIH4.js +3187 -0
  32. package/dist/chunk-PSIEOQGZ.js +3043 -0
  33. package/dist/chunk-PVRT3IHA.js +3238 -0
  34. package/dist/chunk-QNN4TT23.js +1430 -0
  35. package/dist/chunk-RE3R45RJ.js +3042 -0
  36. package/dist/chunk-S7E6TFX6.js +718 -657
  37. package/dist/chunk-SG6GLU4U.js +1378 -0
  38. package/dist/chunk-SJCDV2ST.js +274 -0
  39. package/dist/chunk-SYE5XLF3.js +104 -0
  40. package/dist/chunk-T5VLYBZD.js +103 -0
  41. package/dist/chunk-TOQB7VWU.js +3238 -0
  42. package/dist/chunk-VFNMZ4ZQ.js +3228 -0
  43. package/dist/chunk-VVTGZNBT.js +1533 -1423
  44. package/dist/chunk-W7Q4RFEV.js +104 -0
  45. package/dist/chunk-XTYYVRLO.js +3190 -0
  46. package/dist/chunk-Y6MDYVJD.js +3063 -0
  47. package/dist/cli/main.js +4072 -629
  48. package/dist/index.d.ts +420 -33
  49. package/dist/index.js +8 -15
  50. package/dist/mcp/server.js +103 -7
  51. package/dist/schema-BAWSG7KY.js +22 -0
  52. package/dist/schema-E3QUPL26.js +20 -0
  53. package/dist/schema-EHL7WUT6.js +20 -0
  54. package/docs/019-USAGE.md +44 -5
  55. package/docs/020-current-implementation.md +8 -8
  56. package/docs/021-DOGFOODING-FINDINGS.md +1 -1
  57. package/docs/CONFIG.md +1123 -0
  58. package/docs/ERRORS.md +383 -0
  59. package/docs/summarization.md +320 -0
  60. package/justfile +40 -0
  61. package/package.json +39 -33
  62. package/research/INDEX.md +315 -0
  63. package/research/code-review/README.md +90 -0
  64. package/research/code-review/cli-error-handling-review.md +979 -0
  65. package/research/code-review/code-review-validation-report.md +464 -0
  66. package/research/code-review/main-ts-review.md +1128 -0
  67. package/research/config-docs/SUMMARY.md +357 -0
  68. package/research/config-docs/TEST-RESULTS.md +776 -0
  69. package/research/config-docs/TODO.md +542 -0
  70. package/research/config-docs/analysis.md +744 -0
  71. package/research/config-docs/fix-validation.md +502 -0
  72. package/research/config-docs/help-audit.md +264 -0
  73. package/research/config-docs/help-system-analysis.md +890 -0
  74. package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
  75. package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
  76. package/research/issue-review.md +603 -0
  77. package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
  78. package/research/llm-summarization/alternative-providers-2026.md +1428 -0
  79. package/research/llm-summarization/anthropic-2026.md +367 -0
  80. package/research/llm-summarization/claude-cli-integration.md +1706 -0
  81. package/research/llm-summarization/cli-integration-patterns.md +3155 -0
  82. package/research/llm-summarization/openai-2026.md +473 -0
  83. package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
  84. package/research/llm-summarization/opencode-cli-integration.md +1552 -0
  85. package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
  86. package/research/llm-summarization/prototype-results.md +56 -0
  87. package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
  88. package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
  89. package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
  90. package/research/mdcontext-pudding/01-index-embed.md +956 -0
  91. package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
  92. package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
  93. package/research/mdcontext-pudding/02-search.md +970 -0
  94. package/research/mdcontext-pudding/03-context.md +779 -0
  95. package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
  96. package/research/mdcontext-pudding/04-tree.md +704 -0
  97. package/research/mdcontext-pudding/05-config.md +1038 -0
  98. package/research/mdcontext-pudding/06-links-summary.txt +87 -0
  99. package/research/mdcontext-pudding/06-links.md +679 -0
  100. package/research/mdcontext-pudding/07-stats.md +693 -0
  101. package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
  102. package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
  103. package/research/mdcontext-pudding/README.md +168 -0
  104. package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
  105. package/research/research-quality-review.md +834 -0
  106. package/research/semantic-search/embedding-text-analysis.md +156 -0
  107. package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
  108. package/research/semantic-search/query-processing-analysis.md +207 -0
  109. package/research/semantic-search/root-cause-and-solution.md +114 -0
  110. package/research/semantic-search/threshold-validation-report.md +69 -0
  111. package/research/semantic-search/vector-search-analysis.md +63 -0
  112. package/research/test-path-issues.md +276 -0
  113. package/review/ALP-76/1-error-type-design.md +962 -0
  114. package/review/ALP-76/2-error-handling-patterns.md +906 -0
  115. package/review/ALP-76/3-error-presentation.md +624 -0
  116. package/review/ALP-76/4-test-coverage.md +625 -0
  117. package/review/ALP-76/5-migration-completeness.md +440 -0
  118. package/review/ALP-76/6-effect-best-practices.md +755 -0
  119. package/scripts/apply-branch-protection.sh +47 -0
  120. package/scripts/branch-protection-templates.json +79 -0
  121. package/scripts/prototype-summarization.ts +346 -0
  122. package/scripts/rebuild-hnswlib.js +32 -37
  123. package/scripts/setup-branch-protection.sh +64 -0
  124. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
  125. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
  126. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
  127. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
  128. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  129. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  130. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
  131. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
  132. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
  133. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
  134. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
  135. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
  136. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
  137. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
  138. package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
  139. package/src/cli/argv-preprocessor.test.ts +2 -2
  140. package/src/cli/cli.test.ts +230 -33
  141. package/src/cli/commands/config-cmd.ts +642 -0
  142. package/src/cli/commands/context.ts +97 -9
  143. package/src/cli/commands/duplicates.ts +122 -0
  144. package/src/cli/commands/embeddings.ts +529 -0
  145. package/src/cli/commands/index-cmd.ts +210 -30
  146. package/src/cli/commands/index.ts +3 -0
  147. package/src/cli/commands/search.ts +894 -64
  148. package/src/cli/commands/stats.ts +3 -0
  149. package/src/cli/commands/tree.ts +26 -5
  150. package/src/cli/config-layer.ts +176 -0
  151. package/src/cli/error-handler.test.ts +235 -0
  152. package/src/cli/error-handler.ts +655 -0
  153. package/src/cli/flag-schemas.ts +66 -0
  154. package/src/cli/help.ts +209 -7
  155. package/src/cli/main.ts +348 -58
  156. package/src/cli/options.ts +10 -0
  157. package/src/cli/shared-error-handling.ts +199 -0
  158. package/src/cli/utils.ts +150 -17
  159. package/src/config/file-provider.test.ts +320 -0
  160. package/src/config/file-provider.ts +273 -0
  161. package/src/config/index.ts +72 -0
  162. package/src/config/integration.test.ts +667 -0
  163. package/src/config/precedence.test.ts +277 -0
  164. package/src/config/precedence.ts +451 -0
  165. package/src/config/schema.test.ts +414 -0
  166. package/src/config/schema.ts +603 -0
  167. package/src/config/service.test.ts +320 -0
  168. package/src/config/service.ts +243 -0
  169. package/src/config/testing.test.ts +264 -0
  170. package/src/config/testing.ts +110 -0
  171. package/src/core/types.ts +6 -33
  172. package/src/duplicates/detector.test.ts +183 -0
  173. package/src/duplicates/detector.ts +414 -0
  174. package/src/duplicates/index.ts +18 -0
  175. package/src/embeddings/embedding-namespace.test.ts +300 -0
  176. package/src/embeddings/embedding-namespace.ts +947 -0
  177. package/src/embeddings/heading-boost.test.ts +222 -0
  178. package/src/embeddings/hnsw-build-options.test.ts +198 -0
  179. package/src/embeddings/hyde.test.ts +272 -0
  180. package/src/embeddings/hyde.ts +264 -0
  181. package/src/embeddings/index.ts +2 -0
  182. package/src/embeddings/openai-provider.ts +332 -83
  183. package/src/embeddings/pricing.json +22 -0
  184. package/src/embeddings/provider-constants.ts +204 -0
  185. package/src/embeddings/provider-errors.test.ts +967 -0
  186. package/src/embeddings/provider-errors.ts +565 -0
  187. package/src/embeddings/provider-factory.test.ts +240 -0
  188. package/src/embeddings/provider-factory.ts +225 -0
  189. package/src/embeddings/provider-integration.test.ts +788 -0
  190. package/src/embeddings/query-preprocessing.test.ts +187 -0
  191. package/src/embeddings/semantic-search-threshold.test.ts +508 -0
  192. package/src/embeddings/semantic-search.ts +780 -93
  193. package/src/embeddings/types.ts +293 -16
  194. package/src/embeddings/vector-store.ts +486 -77
  195. package/src/embeddings/voyage-provider.ts +313 -0
  196. package/src/errors/errors.test.ts +845 -0
  197. package/src/errors/index.ts +533 -0
  198. package/src/index/ignore-patterns.test.ts +354 -0
  199. package/src/index/ignore-patterns.ts +305 -0
  200. package/src/index/indexer.ts +286 -48
  201. package/src/index/storage.ts +94 -30
  202. package/src/index/types.ts +40 -2
  203. package/src/index/watcher.ts +67 -9
  204. package/src/index.ts +22 -0
  205. package/src/integration/search-keyword.test.ts +678 -0
  206. package/src/mcp/server.ts +135 -6
  207. package/src/parser/parser.ts +18 -19
  208. package/src/parser/section-filter.test.ts +277 -0
  209. package/src/parser/section-filter.ts +125 -3
  210. package/src/search/__tests__/hybrid-search.test.ts +650 -0
  211. package/src/search/bm25-store.ts +366 -0
  212. package/src/search/cross-encoder.test.ts +253 -0
  213. package/src/search/cross-encoder.ts +406 -0
  214. package/src/search/fuzzy-search.test.ts +419 -0
  215. package/src/search/fuzzy-search.ts +273 -0
  216. package/src/search/hybrid-search.ts +448 -0
  217. package/src/search/path-matcher.test.ts +276 -0
  218. package/src/search/path-matcher.ts +33 -0
  219. package/src/search/searcher.test.ts +99 -1
  220. package/src/search/searcher.ts +189 -67
  221. package/src/search/wink-bm25.d.ts +30 -0
  222. package/src/summarization/cli-providers/claude.ts +202 -0
  223. package/src/summarization/cli-providers/detection.test.ts +273 -0
  224. package/src/summarization/cli-providers/detection.ts +118 -0
  225. package/src/summarization/cli-providers/index.ts +8 -0
  226. package/src/summarization/cost.test.ts +139 -0
  227. package/src/summarization/cost.ts +102 -0
  228. package/src/summarization/error-handler.test.ts +127 -0
  229. package/src/summarization/error-handler.ts +111 -0
  230. package/src/summarization/index.ts +102 -0
  231. package/src/summarization/pipeline.test.ts +498 -0
  232. package/src/summarization/pipeline.ts +231 -0
  233. package/src/summarization/prompts.test.ts +269 -0
  234. package/src/summarization/prompts.ts +133 -0
  235. package/src/summarization/provider-factory.test.ts +396 -0
  236. package/src/summarization/provider-factory.ts +178 -0
  237. package/src/summarization/types.ts +184 -0
  238. package/src/summarize/summarizer.ts +104 -35
  239. package/src/types/huggingface-transformers.d.ts +66 -0
  240. package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
  241. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
  242. package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
  243. package/tests/fixtures/cli/.mdcontext/indexes/documents.json +4 -4
  244. package/tests/fixtures/cli/.mdcontext/indexes/sections.json +14 -0
  245. package/tests/integration/embed-index.test.ts +712 -0
  246. package/tests/integration/search-context.test.ts +469 -0
  247. package/tests/integration/search-semantic.test.ts +522 -0
  248. package/vitest.config.ts +1 -6
  249. package/AGENTS.md +0 -46
  250. package/tests/fixtures/cli/.mdcontext/vectors.bin +0 -0
  251. package/tests/fixtures/cli/.mdcontext/vectors.meta.json +0 -1264
@@ -0,0 +1,366 @@
1
+ // src/config/schema.ts
2
+ import { Config, Option } from "effect";
3
+ var IndexConfig = Config.all({
4
+ /**
5
+ * Maximum directory depth to traverse when indexing
6
+ * Default: 10
7
+ */
8
+ maxDepth: Config.number("maxDepth").pipe(Config.withDefault(10)),
9
+ /**
10
+ * Glob patterns to exclude from indexing (comma-separated)
11
+ * Default: ['node_modules', '.git', 'dist', 'build']
12
+ */
13
+ excludePatterns: Config.array(Config.string(), "excludePatterns").pipe(
14
+ Config.withDefault(["node_modules", ".git", "dist", "build"])
15
+ ),
16
+ /**
17
+ * File extensions to index (comma-separated)
18
+ * Default: ['.md', '.mdx']
19
+ */
20
+ fileExtensions: Config.array(Config.string(), "fileExtensions").pipe(
21
+ Config.withDefault([".md", ".mdx"])
22
+ ),
23
+ /**
24
+ * Whether to follow symlinks when traversing directories
25
+ * Default: false
26
+ */
27
+ followSymlinks: Config.boolean("followSymlinks").pipe(
28
+ Config.withDefault(false)
29
+ ),
30
+ /**
31
+ * Directory where index files are stored (relative to project root)
32
+ * Default: '.mdcontext'
33
+ */
34
+ indexDir: Config.string("indexDir").pipe(Config.withDefault(".mdcontext"))
35
+ });
36
+ var SearchConfig = Config.all({
37
+ /**
38
+ * Default number of search results to return
39
+ * Default: 10
40
+ */
41
+ defaultLimit: Config.number("defaultLimit").pipe(Config.withDefault(10)),
42
+ /**
43
+ * Maximum number of search results allowed
44
+ * Default: 100
45
+ */
46
+ maxLimit: Config.number("maxLimit").pipe(Config.withDefault(100)),
47
+ /**
48
+ * Minimum similarity score for semantic search results (0-1)
49
+ * Lower values return more results but may include less relevant matches.
50
+ * Default: 0.35 (captures single-word queries that score 30-40%)
51
+ */
52
+ minSimilarity: Config.number("minSimilarity").pipe(Config.withDefault(0.35)),
53
+ /**
54
+ * Whether to include content snippets in search results
55
+ * Default: true
56
+ */
57
+ includeSnippets: Config.boolean("includeSnippets").pipe(
58
+ Config.withDefault(true)
59
+ ),
60
+ /**
61
+ * Maximum length of content snippets in characters
62
+ * Default: 200
63
+ */
64
+ snippetLength: Config.number("snippetLength").pipe(Config.withDefault(200)),
65
+ /**
66
+ * Auto-create semantic index if estimated time is under this threshold (seconds)
67
+ * Default: 10
68
+ */
69
+ autoIndexThreshold: Config.number("autoIndexThreshold").pipe(
70
+ Config.withDefault(10)
71
+ )
72
+ });
73
+ var EmbeddingsConfig = Config.all({
74
+ /**
75
+ * Embedding provider to use
76
+ * Default: 'openai'
77
+ */
78
+ provider: Config.literal(
79
+ "openai",
80
+ "ollama",
81
+ "lm-studio",
82
+ "openrouter",
83
+ "voyage"
84
+ )("provider").pipe(Config.withDefault("openai")),
85
+ /**
86
+ * Custom base URL for the embedding API
87
+ * If not specified, provider-specific defaults are used:
88
+ * - openai: https://api.openai.com/v1
89
+ * - ollama: http://localhost:11434/v1
90
+ * - lm-studio: http://localhost:1234/v1
91
+ * - openrouter: https://openrouter.ai/api/v1
92
+ */
93
+ baseURL: Config.option(Config.string("baseURL")),
94
+ /**
95
+ * OpenAI embedding model to use
96
+ * Default: 'text-embedding-3-small'
97
+ */
98
+ model: Config.string("model").pipe(
99
+ Config.withDefault("text-embedding-3-small")
100
+ ),
101
+ /**
102
+ * Number of dimensions for embeddings
103
+ * Lower dimensions = faster search, higher = more accuracy
104
+ * Default: 512
105
+ */
106
+ dimensions: Config.number("dimensions").pipe(Config.withDefault(512)),
107
+ /**
108
+ * Batch size for embedding API calls
109
+ * Default: 100
110
+ */
111
+ batchSize: Config.number("batchSize").pipe(Config.withDefault(100)),
112
+ /**
113
+ * Maximum retries for failed API calls
114
+ * Default: 3
115
+ */
116
+ maxRetries: Config.number("maxRetries").pipe(Config.withDefault(3)),
117
+ /**
118
+ * Delay between retries in milliseconds
119
+ * Default: 1000
120
+ */
121
+ retryDelayMs: Config.number("retryDelayMs").pipe(Config.withDefault(1e3)),
122
+ /**
123
+ * Request timeout in milliseconds
124
+ * Default: 30000 (30 seconds)
125
+ */
126
+ timeoutMs: Config.number("timeoutMs").pipe(Config.withDefault(3e4)),
127
+ /**
128
+ * OpenAI API key (usually from environment variable)
129
+ * No default - must be provided
130
+ */
131
+ apiKey: Config.option(Config.string("apiKey")),
132
+ // HNSW Index Build Parameters
133
+ // These control the vector index structure and affect build time and search quality.
134
+ // Changing these requires rebuilding the index.
135
+ /**
136
+ * HNSW M parameter: maximum connections per node
137
+ * Higher M = better recall but larger index and slower builds
138
+ * Recommended: 12 (speed), 16 (balanced), 24 (quality)
139
+ * Default: 16
140
+ */
141
+ hnswM: Config.number("hnswM").pipe(Config.withDefault(16)),
142
+ /**
143
+ * HNSW efConstruction: construction-time search width
144
+ * Higher values = better index quality but slower builds
145
+ * Recommended: 128 (speed), 200 (balanced), 256 (quality)
146
+ * Default: 200
147
+ */
148
+ hnswEfConstruction: Config.number("hnswEfConstruction").pipe(
149
+ Config.withDefault(200)
150
+ )
151
+ });
152
+ var OutputConfig = Config.all({
153
+ /**
154
+ * Default output format
155
+ * Default: 'text'
156
+ */
157
+ format: Config.literal(
158
+ "text",
159
+ "json"
160
+ )("format").pipe(Config.withDefault("text")),
161
+ /**
162
+ * Whether to use colors in terminal output
163
+ * Default: true
164
+ */
165
+ color: Config.boolean("color").pipe(Config.withDefault(true)),
166
+ /**
167
+ * Whether to pretty-print JSON output
168
+ * Default: true
169
+ */
170
+ prettyJson: Config.boolean("prettyJson").pipe(Config.withDefault(true)),
171
+ /**
172
+ * Whether to show verbose output
173
+ * Default: false
174
+ */
175
+ verbose: Config.boolean("verbose").pipe(Config.withDefault(false)),
176
+ /**
177
+ * Whether to show debug information
178
+ * Default: false
179
+ */
180
+ debug: Config.boolean("debug").pipe(Config.withDefault(false))
181
+ });
182
+ var SummarizationConfig = Config.all({
183
+ /**
184
+ * Token budget for 'brief' compression level
185
+ * Default: 100
186
+ */
187
+ briefTokenBudget: Config.number("briefTokenBudget").pipe(
188
+ Config.withDefault(100)
189
+ ),
190
+ /**
191
+ * Token budget for 'summary' compression level
192
+ * Default: 500
193
+ */
194
+ summaryTokenBudget: Config.number("summaryTokenBudget").pipe(
195
+ Config.withDefault(500)
196
+ ),
197
+ /**
198
+ * Target compression ratio for summaries (0-1)
199
+ * Default: 0.3 (30% of original)
200
+ */
201
+ compressionRatio: Config.number("compressionRatio").pipe(
202
+ Config.withDefault(0.3)
203
+ ),
204
+ /**
205
+ * Minimum tokens for any section summary
206
+ * Default: 20
207
+ */
208
+ minSectionTokens: Config.number("minSectionTokens").pipe(
209
+ Config.withDefault(20)
210
+ ),
211
+ /**
212
+ * Maximum topics to extract from a document
213
+ * Default: 10
214
+ */
215
+ maxTopics: Config.number("maxTopics").pipe(Config.withDefault(10)),
216
+ /**
217
+ * Minimum remaining budget to include partial content
218
+ * Default: 50
219
+ */
220
+ minPartialBudget: Config.number("minPartialBudget").pipe(
221
+ Config.withDefault(50)
222
+ )
223
+ });
224
+ var AISummarizationConfig = Config.all({
225
+ /**
226
+ * Summarization mode: 'cli' (free) or 'api' (pay-per-use)
227
+ * Default: 'cli' - prioritize free CLI tools
228
+ */
229
+ mode: Config.literal(
230
+ "cli",
231
+ "api"
232
+ )("mode").pipe(Config.withDefault("cli")),
233
+ /**
234
+ * Provider name (e.g., 'claude', 'opencode' for CLI; 'deepseek', 'openai' for API)
235
+ * Default: 'claude' - most common CLI tool
236
+ */
237
+ provider: Config.literal(
238
+ // CLI providers
239
+ "claude",
240
+ "copilot",
241
+ "cline",
242
+ "aider",
243
+ "opencode",
244
+ "amp",
245
+ // API providers
246
+ "deepseek",
247
+ "anthropic",
248
+ "openai",
249
+ "gemini",
250
+ "qwen"
251
+ )("provider").pipe(Config.withDefault("claude")),
252
+ /**
253
+ * Model name for API providers (ignored for CLI providers)
254
+ * Default: 'deepseek-chat' - ultra-cheap default
255
+ */
256
+ model: Config.option(Config.string("model")),
257
+ /**
258
+ * Enable streaming output
259
+ * Default: false
260
+ */
261
+ stream: Config.boolean("stream").pipe(Config.withDefault(false)),
262
+ /**
263
+ * Custom API base URL (for API providers)
264
+ */
265
+ baseURL: Config.option(Config.string("baseURL")),
266
+ /**
267
+ * API key (for API providers, usually from environment)
268
+ */
269
+ apiKey: Config.option(Config.string("apiKey"))
270
+ });
271
+ var PathsConfig = Config.all({
272
+ /**
273
+ * Root directory for markdown files (default: current working directory)
274
+ */
275
+ root: Config.option(Config.string("root")),
276
+ /**
277
+ * Custom config file path (default: auto-detected)
278
+ */
279
+ configFile: Config.option(Config.string("configFile")),
280
+ /**
281
+ * Cache directory for temporary files
282
+ * Default: '.mdcontext/cache'
283
+ */
284
+ cacheDir: Config.string("cacheDir").pipe(
285
+ Config.withDefault(".mdcontext/cache")
286
+ )
287
+ });
288
+ var MdContextConfig = Config.all({
289
+ index: Config.nested(IndexConfig, "index"),
290
+ search: Config.nested(SearchConfig, "search"),
291
+ embeddings: Config.nested(EmbeddingsConfig, "embeddings"),
292
+ summarization: Config.nested(SummarizationConfig, "summarization"),
293
+ aiSummarization: Config.nested(AISummarizationConfig, "aiSummarization"),
294
+ output: Config.nested(OutputConfig, "output"),
295
+ paths: Config.nested(PathsConfig, "paths")
296
+ });
297
+ var defaultConfig = {
298
+ index: {
299
+ maxDepth: 10,
300
+ excludePatterns: ["node_modules", ".git", "dist", "build"],
301
+ fileExtensions: [".md", ".mdx"],
302
+ followSymlinks: false,
303
+ indexDir: ".mdcontext"
304
+ },
305
+ search: {
306
+ defaultLimit: 10,
307
+ maxLimit: 100,
308
+ minSimilarity: 0.35,
309
+ includeSnippets: true,
310
+ snippetLength: 200,
311
+ autoIndexThreshold: 10
312
+ },
313
+ embeddings: {
314
+ provider: "openai",
315
+ baseURL: Option.none(),
316
+ model: "text-embedding-3-small",
317
+ dimensions: 512,
318
+ batchSize: 100,
319
+ maxRetries: 3,
320
+ retryDelayMs: 1e3,
321
+ timeoutMs: 3e4,
322
+ apiKey: Option.none(),
323
+ hnswM: 16,
324
+ hnswEfConstruction: 200
325
+ },
326
+ summarization: {
327
+ briefTokenBudget: 100,
328
+ summaryTokenBudget: 500,
329
+ compressionRatio: 0.3,
330
+ minSectionTokens: 20,
331
+ maxTopics: 10,
332
+ minPartialBudget: 50
333
+ },
334
+ aiSummarization: {
335
+ mode: "cli",
336
+ provider: "claude",
337
+ model: Option.none(),
338
+ stream: false,
339
+ baseURL: Option.none(),
340
+ apiKey: Option.none()
341
+ },
342
+ output: {
343
+ format: "text",
344
+ color: true,
345
+ prettyJson: true,
346
+ verbose: false,
347
+ debug: false
348
+ },
349
+ paths: {
350
+ root: Option.none(),
351
+ configFile: Option.none(),
352
+ cacheDir: ".mdcontext/cache"
353
+ }
354
+ };
355
+
356
+ export {
357
+ IndexConfig,
358
+ SearchConfig,
359
+ EmbeddingsConfig,
360
+ OutputConfig,
361
+ SummarizationConfig,
362
+ AISummarizationConfig,
363
+ PathsConfig,
364
+ MdContextConfig,
365
+ defaultConfig
366
+ };