@zvec/zvec-grep 0.1.5 → 0.1.6

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 (317) hide show
  1. package/README.md +88 -249
  2. package/README_CN.md +82 -246
  3. package/dist/authorization/index.d.ts +7 -0
  4. package/dist/authorization/index.js +7 -0
  5. package/dist/authorization/index.js.map +1 -0
  6. package/dist/authorization/manager.d.ts +8 -0
  7. package/dist/authorization/manager.js +19 -0
  8. package/dist/authorization/manager.js.map +1 -0
  9. package/dist/authorization/operation.d.ts +7 -0
  10. package/dist/authorization/operation.js +50 -0
  11. package/dist/authorization/operation.js.map +1 -0
  12. package/dist/authorization/planner.d.ts +21 -0
  13. package/dist/authorization/planner.js +97 -0
  14. package/dist/authorization/planner.js.map +1 -0
  15. package/dist/authorization/prompt.d.ts +11 -0
  16. package/dist/authorization/prompt.js +62 -0
  17. package/dist/authorization/prompt.js.map +1 -0
  18. package/dist/authorization/store.d.ts +20 -0
  19. package/dist/authorization/store.js +251 -0
  20. package/dist/authorization/store.js.map +1 -0
  21. package/dist/authorization/target.d.ts +15 -0
  22. package/dist/authorization/target.js +49 -0
  23. package/dist/authorization/target.js.map +1 -0
  24. package/dist/authorization/types.d.ts +61 -0
  25. package/dist/authorization/types.js +2 -0
  26. package/dist/authorization/types.js.map +1 -0
  27. package/dist/cli/args.d.ts +1 -1
  28. package/dist/cli/args.js +304 -54
  29. package/dist/cli/args.js.map +1 -1
  30. package/dist/cli/auth.d.ts +21 -0
  31. package/dist/cli/auth.js +212 -0
  32. package/dist/cli/auth.js.map +1 -0
  33. package/dist/cli/commands.js +433 -618
  34. package/dist/cli/commands.js.map +1 -1
  35. package/dist/cli/errors.js +2 -2
  36. package/dist/cli/errors.js.map +1 -1
  37. package/dist/cli/format/context.d.ts +1 -0
  38. package/dist/cli/format/context.js +241 -45
  39. package/dist/cli/format/context.js.map +1 -1
  40. package/dist/cli/format/debug.js +2 -2
  41. package/dist/cli/format/debug.js.map +1 -1
  42. package/dist/cli/format/progress.d.ts +4 -0
  43. package/dist/cli/format/progress.js +219 -46
  44. package/dist/cli/format/progress.js.map +1 -1
  45. package/dist/cli/format/status.d.ts +77 -6
  46. package/dist/cli/format/status.js +302 -106
  47. package/dist/cli/format/status.js.map +1 -1
  48. package/dist/cli/help.js +258 -59
  49. package/dist/cli/help.js.map +1 -1
  50. package/dist/cli/index.js +0 -0
  51. package/dist/cli/install.d.ts +4 -0
  52. package/dist/cli/install.js +845 -0
  53. package/dist/cli/install.js.map +1 -0
  54. package/dist/cli/managed-rg.d.ts +10 -0
  55. package/dist/cli/managed-rg.js +329 -0
  56. package/dist/cli/managed-rg.js.map +1 -0
  57. package/dist/cli/types.d.ts +20 -6
  58. package/dist/cli/types.js.map +1 -1
  59. package/dist/client/daemon-client.d.ts +19 -0
  60. package/dist/client/daemon-client.js +180 -0
  61. package/dist/client/daemon-client.js.map +1 -0
  62. package/dist/client/mode-router.d.ts +9 -0
  63. package/dist/client/mode-router.js +28 -0
  64. package/dist/client/mode-router.js.map +1 -0
  65. package/dist/client/search-policy.d.ts +11 -0
  66. package/dist/client/search-policy.js +15 -0
  67. package/dist/client/search-policy.js.map +1 -0
  68. package/dist/daemon/backend.d.ts +76 -0
  69. package/dist/daemon/backend.js +1049 -0
  70. package/dist/daemon/backend.js.map +1 -0
  71. package/dist/daemon/change-set.d.ts +25 -0
  72. package/dist/daemon/change-set.js +101 -0
  73. package/dist/daemon/change-set.js.map +1 -0
  74. package/dist/daemon/config.d.ts +24 -0
  75. package/dist/daemon/config.js +88 -0
  76. package/dist/daemon/config.js.map +1 -0
  77. package/dist/daemon/errors.d.ts +5 -0
  78. package/dist/daemon/errors.js +11 -0
  79. package/dist/daemon/errors.js.map +1 -0
  80. package/dist/daemon/http-server.d.ts +30 -0
  81. package/dist/daemon/http-server.js +287 -0
  82. package/dist/daemon/http-server.js.map +1 -0
  83. package/dist/daemon/index-coordinator.d.ts +23 -0
  84. package/dist/daemon/index-coordinator.js +68 -0
  85. package/dist/daemon/index-coordinator.js.map +1 -0
  86. package/dist/daemon/job-scheduler.d.ts +70 -0
  87. package/dist/daemon/job-scheduler.js +366 -0
  88. package/dist/daemon/job-scheduler.js.map +1 -0
  89. package/dist/daemon/logger.d.ts +9 -0
  90. package/dist/daemon/logger.js +53 -0
  91. package/dist/daemon/logger.js.map +1 -0
  92. package/dist/daemon/model-pool.d.ts +45 -0
  93. package/dist/daemon/model-pool.js +187 -0
  94. package/dist/daemon/model-pool.js.map +1 -0
  95. package/dist/daemon/root-lease.d.ts +14 -0
  96. package/dist/daemon/root-lease.js +188 -0
  97. package/dist/daemon/root-lease.js.map +1 -0
  98. package/dist/daemon/root-runtime.d.ts +78 -0
  99. package/dist/daemon/root-runtime.js +333 -0
  100. package/dist/daemon/root-runtime.js.map +1 -0
  101. package/dist/daemon/runtime-manager.d.ts +45 -0
  102. package/dist/daemon/runtime-manager.js +243 -0
  103. package/dist/daemon/runtime-manager.js.map +1 -0
  104. package/dist/daemon/runtime.d.ts +12 -0
  105. package/dist/daemon/runtime.js +102 -0
  106. package/dist/daemon/runtime.js.map +1 -0
  107. package/dist/daemon/server-controller.d.ts +39 -0
  108. package/dist/daemon/server-controller.js +203 -0
  109. package/dist/daemon/server-controller.js.map +1 -0
  110. package/dist/daemon/watch-manager.d.ts +50 -0
  111. package/dist/daemon/watch-manager.js +293 -0
  112. package/dist/daemon/watch-manager.js.map +1 -0
  113. package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
  114. package/dist/daemon/workspace-read-session-cache.js +115 -0
  115. package/dist/daemon/workspace-read-session-cache.js.map +1 -0
  116. package/dist/engine/config.d.ts +30 -8
  117. package/dist/engine/config.js +171 -45
  118. package/dist/engine/config.js.map +1 -1
  119. package/dist/engine/{errors/index.d.ts → errors.d.ts} +6 -1
  120. package/dist/engine/{errors/details.js → errors.js} +17 -4
  121. package/dist/engine/errors.js.map +1 -0
  122. package/dist/engine/extraction/code/adapter.d.ts +1 -1
  123. package/dist/engine/extraction/code/extractor.d.ts +5 -11
  124. package/dist/engine/extraction/code/extractor.js +105 -44
  125. package/dist/engine/extraction/code/extractor.js.map +1 -1
  126. package/dist/engine/extraction/code/families/c-family.js +1 -1
  127. package/dist/engine/extraction/code/families/c-family.js.map +1 -1
  128. package/dist/engine/extraction/code/families/js-ts.d.ts +1 -1
  129. package/dist/engine/extraction/code/families/metadata.d.ts +1 -1
  130. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
  131. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
  132. package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
  133. package/dist/engine/extraction/image/extractor.d.ts +5 -0
  134. package/dist/engine/extraction/image/extractor.js +35 -0
  135. package/dist/engine/extraction/image/extractor.js.map +1 -0
  136. package/dist/engine/extraction/index.d.ts +3 -44
  137. package/dist/engine/extraction/index.js +1 -280
  138. package/dist/engine/extraction/index.js.map +1 -1
  139. package/dist/engine/extraction/markdown/extractor.d.ts +5 -11
  140. package/dist/engine/extraction/markdown/extractor.js +35 -16
  141. package/dist/engine/extraction/markdown/extractor.js.map +1 -1
  142. package/dist/engine/extraction/runtime.d.ts +4 -0
  143. package/dist/engine/extraction/runtime.js +26 -0
  144. package/dist/engine/extraction/runtime.js.map +1 -0
  145. package/dist/engine/extraction/source.d.ts +18 -0
  146. package/dist/engine/extraction/source.js +22 -0
  147. package/dist/engine/extraction/source.js.map +1 -0
  148. package/dist/engine/extraction/text/extractor.d.ts +7 -0
  149. package/dist/engine/extraction/text/extractor.js +168 -0
  150. package/dist/engine/extraction/text/extractor.js.map +1 -0
  151. package/dist/engine/extraction/types.d.ts +4 -0
  152. package/dist/engine/{models → extraction}/types.js.map +1 -1
  153. package/dist/engine/{files/file-type.d.ts → file-type.d.ts} +1 -1
  154. package/dist/engine/file-type.js.map +1 -0
  155. package/dist/engine/index-status.d.ts +9 -0
  156. package/dist/engine/index-status.js +38 -0
  157. package/dist/engine/index-status.js.map +1 -0
  158. package/dist/engine/manifest.d.ts +12 -0
  159. package/dist/engine/manifest.js +120 -0
  160. package/dist/engine/manifest.js.map +1 -0
  161. package/dist/engine/models/{providers/llama-cpp/embedding.d.ts → backends/llama-cpp.d.ts} +25 -20
  162. package/dist/engine/models/{providers/llama-cpp/embedding.js → backends/llama-cpp.js} +127 -106
  163. package/dist/engine/models/backends/llama-cpp.js.map +1 -0
  164. package/dist/engine/models/backends/model2vec.d.ts +57 -0
  165. package/dist/engine/models/backends/model2vec.js +332 -0
  166. package/dist/engine/models/backends/model2vec.js.map +1 -0
  167. package/dist/engine/models/backends/qwen.d.ts +44 -0
  168. package/dist/engine/models/{providers/qwen/embedding.js → backends/qwen.js} +155 -94
  169. package/dist/engine/models/backends/qwen.js.map +1 -0
  170. package/dist/engine/models/backends/transformers-js.d.ts +87 -0
  171. package/dist/engine/models/backends/transformers-js.js +316 -0
  172. package/dist/engine/models/backends/transformers-js.js.map +1 -0
  173. package/dist/engine/models/catalog.d.ts +188 -23
  174. package/dist/engine/models/catalog.js +172 -25
  175. package/dist/engine/models/catalog.js.map +1 -1
  176. package/dist/engine/models/download-progress.d.ts +15 -0
  177. package/dist/engine/models/download-progress.js +48 -0
  178. package/dist/engine/models/download-progress.js.map +1 -0
  179. package/dist/engine/models/embeddings.d.ts +58 -18
  180. package/dist/engine/models/embeddings.js +52 -28
  181. package/dist/engine/models/embeddings.js.map +1 -1
  182. package/dist/engine/models/factory.d.ts +2 -5
  183. package/dist/engine/models/factory.js +41 -56
  184. package/dist/engine/models/factory.js.map +1 -1
  185. package/dist/engine/models/index.d.ts +4 -6
  186. package/dist/engine/models/index.js +4 -4
  187. package/dist/engine/models/index.js.map +1 -1
  188. package/dist/engine/models/ranking.d.ts +7 -3
  189. package/dist/engine/models/resolution.d.ts +8 -0
  190. package/dist/engine/models/resolution.js +22 -0
  191. package/dist/engine/models/resolution.js.map +1 -0
  192. package/dist/engine/pipeline/indexing/index.d.ts +9 -7
  193. package/dist/engine/pipeline/indexing/index.js +360 -121
  194. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  195. package/dist/engine/pipeline/indexing/root-paths.js +6 -6
  196. package/dist/engine/pipeline/indexing/root-paths.js.map +1 -1
  197. package/dist/engine/pipeline/indexing/scanner/index.d.ts +6 -1
  198. package/dist/engine/pipeline/indexing/scanner/index.js +233 -29
  199. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  200. package/dist/engine/pipeline/search/index.d.ts +6 -6
  201. package/dist/engine/pipeline/search/index.js +8 -10
  202. package/dist/engine/pipeline/search/index.js.map +1 -1
  203. package/dist/engine/service/index.d.ts +3 -2
  204. package/dist/engine/service/index.js +1 -1
  205. package/dist/engine/service/index.js.map +1 -1
  206. package/dist/engine/service/root.d.ts +13 -12
  207. package/dist/engine/service/root.js +35 -24
  208. package/dist/engine/service/root.js.map +1 -1
  209. package/dist/engine/service/structure-enrichment.js +12 -14
  210. package/dist/engine/service/structure-enrichment.js.map +1 -1
  211. package/dist/engine/service/types.d.ts +32 -37
  212. package/dist/engine/service/workspace-index.d.ts +24 -0
  213. package/dist/engine/service/workspace-index.js +151 -0
  214. package/dist/engine/service/workspace-index.js.map +1 -0
  215. package/dist/engine/service/zvec-grep.d.ts +12 -1
  216. package/dist/engine/service/zvec-grep.js +677 -486
  217. package/dist/engine/service/zvec-grep.js.map +1 -1
  218. package/dist/engine/storage/index.d.ts +8 -4
  219. package/dist/engine/storage/index.js +1 -1
  220. package/dist/engine/storage/index.js.map +1 -1
  221. package/dist/engine/storage/zvec.d.ts +10 -33
  222. package/dist/engine/storage/zvec.js +95 -38
  223. package/dist/engine/storage/zvec.js.map +1 -1
  224. package/dist/engine/types.d.ts +15 -23
  225. package/dist/engine/types.js +1 -1
  226. package/dist/engine/types.js.map +1 -1
  227. package/dist/engine/utils/daemon-lease.d.ts +17 -0
  228. package/dist/engine/utils/daemon-lease.js +175 -0
  229. package/dist/engine/utils/daemon-lease.js.map +1 -0
  230. package/dist/engine/utils/file-selection.js +38 -1
  231. package/dist/engine/utils/file-selection.js.map +1 -1
  232. package/dist/engine/utils/lock.js +1 -1
  233. package/dist/engine/utils/lock.js.map +1 -1
  234. package/dist/index-progress.d.ts +10 -0
  235. package/dist/index-progress.js +159 -0
  236. package/dist/index-progress.js.map +1 -0
  237. package/dist/index.d.ts +4 -4
  238. package/dist/index.js +1 -1
  239. package/dist/index.js.map +1 -1
  240. package/dist/mcp/http-transport.d.ts +27 -0
  241. package/dist/mcp/http-transport.js +182 -0
  242. package/dist/mcp/http-transport.js.map +1 -0
  243. package/dist/mcp/input-normalization.d.ts +38 -0
  244. package/dist/mcp/input-normalization.js +95 -0
  245. package/dist/mcp/input-normalization.js.map +1 -0
  246. package/dist/mcp/progress-heartbeat.d.ts +17 -0
  247. package/dist/mcp/progress-heartbeat.js +46 -0
  248. package/dist/mcp/progress-heartbeat.js.map +1 -0
  249. package/dist/mcp/request-metadata.d.ts +2 -0
  250. package/dist/mcp/request-metadata.js +11 -0
  251. package/dist/mcp/request-metadata.js.map +1 -0
  252. package/dist/mcp/request-state.d.ts +40 -0
  253. package/dist/mcp/request-state.js +210 -0
  254. package/dist/mcp/request-state.js.map +1 -0
  255. package/dist/mcp/result-format.d.ts +13 -0
  256. package/dist/mcp/result-format.js +75 -0
  257. package/dist/mcp/result-format.js.map +1 -0
  258. package/dist/mcp/schemas.d.ts +430 -0
  259. package/dist/mcp/schemas.js +447 -0
  260. package/dist/mcp/schemas.js.map +1 -0
  261. package/dist/mcp/tools.d.ts +150 -0
  262. package/dist/mcp/tools.js +448 -0
  263. package/dist/mcp/tools.js.map +1 -0
  264. package/dist/mcp/toolset.d.ts +5 -0
  265. package/dist/mcp/toolset.js +12 -0
  266. package/dist/mcp/toolset.js.map +1 -0
  267. package/dist/observability/trace-context.d.ts +11 -0
  268. package/dist/observability/trace-context.js +138 -0
  269. package/dist/observability/trace-context.js.map +1 -0
  270. package/docs/01-agents.md +111 -0
  271. package/docs/02-cli.md +229 -0
  272. package/docs/03-mcp.md +167 -0
  273. package/docs/04-pipeline.md +218 -0
  274. package/docs/05-architecture.md +86 -0
  275. package/docs/06-server.md +210 -0
  276. package/docs/07-embedding.md +179 -0
  277. package/docs/08-roadmap.md +85 -0
  278. package/docs/README.md +53 -0
  279. package/package.json +17 -8
  280. package/skills/zvec-grep/SKILL.md +43 -133
  281. package/skills/zvec-grep/agents/openai.yaml +2 -2
  282. package/skills/zvec-grep/references/cli-fallback.md +85 -0
  283. package/dist/cli/mcp.d.ts +0 -2
  284. package/dist/cli/mcp.js +0 -354
  285. package/dist/cli/mcp.js.map +0 -1
  286. package/dist/engine/collection/index.d.ts +0 -55
  287. package/dist/engine/collection/index.js +0 -710
  288. package/dist/engine/collection/index.js.map +0 -1
  289. package/dist/engine/errors/details.d.ts +0 -6
  290. package/dist/engine/errors/details.js.map +0 -1
  291. package/dist/engine/errors/index.js +0 -16
  292. package/dist/engine/errors/index.js.map +0 -1
  293. package/dist/engine/extraction/tree-sitter/grammar.js.map +0 -1
  294. package/dist/engine/extraction/tree-sitter/nodes.js.map +0 -1
  295. package/dist/engine/extraction/tree-sitter/parser.js.map +0 -1
  296. package/dist/engine/files/file-type.js.map +0 -1
  297. package/dist/engine/models/providers/index.d.ts +0 -2
  298. package/dist/engine/models/providers/index.js +0 -3
  299. package/dist/engine/models/providers/index.js.map +0 -1
  300. package/dist/engine/models/providers/llama-cpp/embedding.js.map +0 -1
  301. package/dist/engine/models/providers/llama-cpp/index.d.ts +0 -1
  302. package/dist/engine/models/providers/llama-cpp/index.js +0 -2
  303. package/dist/engine/models/providers/llama-cpp/index.js.map +0 -1
  304. package/dist/engine/models/providers/qwen/embedding.d.ts +0 -42
  305. package/dist/engine/models/providers/qwen/embedding.js.map +0 -1
  306. package/dist/engine/models/providers/qwen/index.d.ts +0 -1
  307. package/dist/engine/models/providers/qwen/index.js +0 -2
  308. package/dist/engine/models/providers/qwen/index.js.map +0 -1
  309. package/dist/engine/models/types.d.ts +0 -30
  310. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.d.ts +0 -0
  311. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.js +0 -0
  312. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.d.ts +0 -0
  313. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.js +0 -0
  314. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.d.ts +0 -0
  315. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.js +0 -0
  316. /package/dist/engine/{models → extraction}/types.js +0 -0
  317. /package/dist/engine/{files/file-type.js → file-type.js} +0 -0
@@ -1,8 +1,44 @@
1
1
  import { homedir } from "node:os";
2
2
  import { dirname, join, resolve } from "node:path";
3
- import { EngineError } from "./errors/index.js";
3
+ import { EngineError } from "./errors.js";
4
4
  import { readJsonFileSync, writeJsonFileSync } from "./utils/json.js";
5
5
  import { acquireReadWriteLock } from "./utils/lock.js";
6
+ export function resolveEmbeddingRuntimeOptions(reference, explicit, workspace, config, environment = process.env) {
7
+ const provider = providerFromEmbedding(reference);
8
+ const local = provider === "local";
9
+ if (local && explicit.endpoint !== undefined) {
10
+ throw invalidRuntime(reference, "endpoint is only supported for remote embedding models");
11
+ }
12
+ if (!local && explicit.device !== undefined) {
13
+ throw invalidRuntime(reference, "device is only supported for local embedding models");
14
+ }
15
+ const model = config.models?.[reference];
16
+ const providerConfig = provider ? config.providers?.[provider] : undefined;
17
+ const endpoint = !local
18
+ ? (explicit.endpoint ??
19
+ workspace.endpoint ??
20
+ model?.endpoint ??
21
+ nonEmptyEnvironmentValue(environment.ZVEC_GREP_ENDPOINT))
22
+ : undefined;
23
+ if (endpoint !== undefined && !isHttpEndpoint(endpoint)) {
24
+ throw invalidRuntime(reference, "endpoint must be a valid HTTP(S) URL");
25
+ }
26
+ const device = local
27
+ ? (explicit.device ??
28
+ workspace.device ??
29
+ model?.device ??
30
+ environmentDevice(environment))
31
+ : undefined;
32
+ return {
33
+ apiKey: explicit.apiKey ??
34
+ workspace.apiKey ??
35
+ providerConfig?.apiKey ??
36
+ environmentApiKey(provider, environment) ??
37
+ "",
38
+ ...(endpoint !== undefined ? { endpoint } : {}),
39
+ ...(device !== undefined ? { device } : {}),
40
+ };
41
+ }
6
42
  const GLOBAL_CONFIG_VERSION = 1;
7
43
  const GLOBAL_CONFIG_DIRECTORY_MODE = 0o700;
8
44
  const GLOBAL_CONFIG_FILE_MODE = 0o600;
@@ -29,6 +65,9 @@ export function updateGlobalConfig(update, path = globalConfigPath()) {
29
65
  ...update.defaults,
30
66
  },
31
67
  providers: mergeProviderConfigs(current.providers, update.providers),
68
+ models: mergeModelConfigs(current.models, update.models),
69
+ client: { ...current.client, ...update.client },
70
+ server: { ...current.server, ...update.server },
32
71
  }, path);
33
72
  writeJsonFileSync(path, next, {
34
73
  directoryMode: GLOBAL_CONFIG_DIRECTORY_MODE,
@@ -40,40 +79,6 @@ export function updateGlobalConfig(update, path = globalConfigPath()) {
40
79
  lock.release();
41
80
  }
42
81
  }
43
- export function updateGlobalConfigFromExplicitOptions(options, indexedProvider, path = globalConfigPath()) {
44
- const defaults = {
45
- ...(options.embedding !== undefined
46
- ? { embedding: options.embedding }
47
- : {}),
48
- ...(options.modelCacheDir !== undefined
49
- ? { modelCacheDir: options.modelCacheDir }
50
- : {}),
51
- ...(options.llamaGpu !== undefined ? { llamaGpu: options.llamaGpu } : {}),
52
- ...(options.embeddingParallelism !== undefined
53
- ? { embeddingParallelism: options.embeddingParallelism }
54
- : {}),
55
- };
56
- const provider = providerFromEmbedding(options.embedding) ?? indexedProvider;
57
- const providerConfig = provider && provider !== "local"
58
- ? {
59
- ...(options.apiKey !== undefined ? { apiKey: options.apiKey } : {}),
60
- ...(options.endpoint !== undefined
61
- ? { endpoint: options.endpoint }
62
- : {}),
63
- }
64
- : {};
65
- const update = {
66
- ...(Object.keys(defaults).length > 0 ? { defaults } : {}),
67
- ...(provider && Object.keys(providerConfig).length > 0
68
- ? { providers: { [provider]: providerConfig } }
69
- : {}),
70
- };
71
- if (!update.defaults && !update.providers) {
72
- return false;
73
- }
74
- updateGlobalConfig(update, path);
75
- return true;
76
- }
77
82
  function emptyGlobalConfig() {
78
83
  return { version: GLOBAL_CONFIG_VERSION };
79
84
  }
@@ -88,14 +93,87 @@ function parseGlobalConfig(value, path) {
88
93
  if (!isRecord(value) || value.version !== GLOBAL_CONFIG_VERSION) {
89
94
  throw invalidConfig(path, "version must be 1");
90
95
  }
96
+ assertKnownFields(value, ["version", "defaults", "providers", "models", "client", "server"], path, "config");
91
97
  const defaults = parseDefaults(value.defaults, path);
92
98
  const providers = parseProviders(value.providers, path);
99
+ const models = parseModels(value.models, path);
100
+ const client = parseClient(value.client, path);
101
+ const server = parseServer(value.server, path);
93
102
  return {
94
103
  version: GLOBAL_CONFIG_VERSION,
95
104
  ...(defaults ? { defaults } : {}),
96
105
  ...(providers ? { providers } : {}),
106
+ ...(models ? { models } : {}),
107
+ ...(client ? { client } : {}),
108
+ ...(server ? { server } : {}),
97
109
  };
98
110
  }
111
+ function parseModels(value, path) {
112
+ if (value === undefined)
113
+ return undefined;
114
+ if (!isRecord(value))
115
+ throw invalidConfig(path, "models must be an object");
116
+ const models = {};
117
+ for (const [reference, modelValue] of Object.entries(value)) {
118
+ if (!/^[a-z][a-z0-9_-]*\/[A-Za-z0-9._-]+$/.test(reference) ||
119
+ !isRecord(modelValue)) {
120
+ throw invalidConfig(path, `models.${reference} must be an object with a valid embedding reference`);
121
+ }
122
+ assertKnownFields(modelValue, ["endpoint", "device"], path, `models.${reference}`);
123
+ const endpoint = optionalNonEmptyString(modelValue.endpoint, path, `models.${reference}.endpoint`);
124
+ if (endpoint !== undefined && !isHttpEndpoint(endpoint)) {
125
+ throw invalidConfig(path, `models.${reference}.endpoint must be a valid HTTP(S) URL`);
126
+ }
127
+ const device = optionalDevice(modelValue.device, path, `models.${reference}.device`);
128
+ if (reference.startsWith("local/") && endpoint !== undefined) {
129
+ throw invalidConfig(path, `models.${reference}.endpoint is only supported for remote models`);
130
+ }
131
+ if (!reference.startsWith("local/") && device !== undefined) {
132
+ throw invalidConfig(path, `models.${reference}.device is only supported for local models`);
133
+ }
134
+ const config = {
135
+ ...(endpoint !== undefined ? { endpoint } : {}),
136
+ ...(device !== undefined ? { device } : {}),
137
+ };
138
+ if (Object.keys(config).length > 0)
139
+ models[reference] = config;
140
+ }
141
+ return Object.keys(models).length > 0 ? models : undefined;
142
+ }
143
+ function parseClient(value, path) {
144
+ if (value === undefined)
145
+ return undefined;
146
+ if (!isRecord(value))
147
+ throw invalidConfig(path, "client must be an object");
148
+ assertKnownFields(value, ["mode", "serverUrl"], path, "client");
149
+ const mode = value.mode;
150
+ if (mode !== undefined &&
151
+ mode !== "direct" &&
152
+ mode !== "server" &&
153
+ mode !== "auto") {
154
+ throw invalidConfig(path, "client.mode must be direct, server, or auto");
155
+ }
156
+ const serverUrl = optionalNonEmptyString(value.serverUrl, path, "client.serverUrl");
157
+ return mode || serverUrl
158
+ ? { ...(mode ? { mode } : {}), ...(serverUrl ? { serverUrl } : {}) }
159
+ : undefined;
160
+ }
161
+ function parseServer(value, path) {
162
+ if (value === undefined)
163
+ return undefined;
164
+ if (!isRecord(value))
165
+ throw invalidConfig(path, "server must be an object");
166
+ assertKnownFields(value, ["host", "port"], path, "server");
167
+ const host = optionalNonEmptyString(value.host, path, "server.host");
168
+ const port = value.port === undefined
169
+ ? undefined
170
+ : optionalPositiveInteger(value.port, path, "server.port");
171
+ if (port !== undefined && port > 65_535)
172
+ throw invalidConfig(path, "server.port must not exceed 65535");
173
+ return host || port
174
+ ? { ...(host ? { host } : {}), ...(port ? { port } : {}) }
175
+ : undefined;
176
+ }
99
177
  function parseDefaults(value, path) {
100
178
  if (value === undefined) {
101
179
  return undefined;
@@ -103,15 +181,12 @@ function parseDefaults(value, path) {
103
181
  if (!isRecord(value)) {
104
182
  throw invalidConfig(path, "defaults must be an object");
105
183
  }
184
+ assertKnownFields(value, ["embedding", "modelCacheDir"], path, "defaults");
106
185
  const embedding = optionalNonEmptyString(value.embedding, path, "defaults.embedding");
107
186
  const modelCacheDir = optionalNonEmptyString(value.modelCacheDir, path, "defaults.modelCacheDir");
108
- const llamaGpu = optionalLlamaGpu(value.llamaGpu, path);
109
- const embeddingParallelism = optionalPositiveInteger(value.embeddingParallelism, path, "defaults.embeddingParallelism");
110
187
  const defaults = {
111
188
  ...(embedding ? { embedding } : {}),
112
189
  ...(modelCacheDir ? { modelCacheDir } : {}),
113
- ...(llamaGpu !== undefined ? { llamaGpu } : {}),
114
- ...(embeddingParallelism !== undefined ? { embeddingParallelism } : {}),
115
190
  };
116
191
  return Object.keys(defaults).length > 0 ? defaults : undefined;
117
192
  }
@@ -127,11 +202,10 @@ function parseProviders(value, path) {
127
202
  if (!/^[a-z][a-z0-9_-]*$/.test(provider) || !isRecord(providerValue)) {
128
203
  throw invalidConfig(path, `providers.${provider} must be an object with a valid provider name`);
129
204
  }
205
+ assertKnownFields(providerValue, ["apiKey"], path, `providers.${provider}`);
130
206
  const apiKey = optionalNonEmptyString(providerValue.apiKey, path, `providers.${provider}.apiKey`);
131
- const endpoint = optionalNonEmptyString(providerValue.endpoint, path, `providers.${provider}.endpoint`);
132
207
  const config = {
133
208
  ...(apiKey ? { apiKey } : {}),
134
- ...(endpoint ? { endpoint } : {}),
135
209
  };
136
210
  if (Object.keys(config).length > 0) {
137
211
  providers[provider] = config;
@@ -152,6 +226,15 @@ function mergeProviderConfigs(current, update) {
152
226
  }
153
227
  return merged;
154
228
  }
229
+ function mergeModelConfigs(current, update) {
230
+ if (!current && !update)
231
+ return undefined;
232
+ const merged = { ...current };
233
+ for (const [reference, config] of Object.entries(update ?? {})) {
234
+ merged[reference] = { ...merged[reference], ...config };
235
+ }
236
+ return merged;
237
+ }
155
238
  function optionalNonEmptyString(value, path, field) {
156
239
  if (value === undefined) {
157
240
  return undefined;
@@ -170,18 +253,46 @@ function optionalPositiveInteger(value, path, field) {
170
253
  }
171
254
  return value;
172
255
  }
173
- function optionalLlamaGpu(value, path) {
256
+ function optionalDevice(value, path, field) {
174
257
  if (value === undefined) {
175
258
  return undefined;
176
259
  }
177
- if (value === false ||
178
- value === "auto" ||
260
+ if (value === "auto" ||
261
+ value === "cpu" ||
179
262
  value === "metal" ||
180
263
  value === "vulkan" ||
181
264
  value === "cuda") {
182
265
  return value;
183
266
  }
184
- throw invalidConfig(path, "defaults.llamaGpu must be auto, metal, vulkan, cuda, or false");
267
+ throw invalidConfig(path, `${field} must be auto, cpu, metal, vulkan, or cuda`);
268
+ }
269
+ function environmentApiKey(provider, environment) {
270
+ const values = provider === "qwen"
271
+ ? [
272
+ environment.ZVEC_GREP_API_KEY,
273
+ environment.DASHSCOPE_API_KEY,
274
+ environment.QWEN_API_KEY,
275
+ ]
276
+ : [environment.ZVEC_GREP_API_KEY];
277
+ return values.map(nonEmptyEnvironmentValue).find(Boolean);
278
+ }
279
+ function nonEmptyEnvironmentValue(value) {
280
+ const normalized = value?.trim();
281
+ return normalized ? normalized : undefined;
282
+ }
283
+ function environmentDevice(environment) {
284
+ const normalized = environment.ZVEC_GREP_DEVICE?.trim().toLowerCase() ?? "";
285
+ if (["auto", "cpu", "metal", "vulkan", "cuda"].includes(normalized))
286
+ return normalized;
287
+ return "auto";
288
+ }
289
+ function assertKnownFields(value, allowed, path, field) {
290
+ const allowedFields = new Set(allowed);
291
+ for (const key of Object.keys(value)) {
292
+ if (!allowedFields.has(key)) {
293
+ throw invalidConfig(path, `${field}.${key} is not supported`);
294
+ }
295
+ }
185
296
  }
186
297
  function invalidConfig(path, detail) {
187
298
  return new EngineError("zvec-grep global config is invalid", {
@@ -189,6 +300,21 @@ function invalidConfig(path, detail) {
189
300
  context: `path=${path}\ndetail=${detail}`,
190
301
  });
191
302
  }
303
+ function invalidRuntime(reference, message) {
304
+ return new EngineError("Embedding runtime configuration is invalid", {
305
+ code: "ZVEC_GREP.ENGINE.CONFIG.INVALID_EMBEDDING_RUNTIME",
306
+ context: `reference=${reference}\ndetail=${message}`,
307
+ });
308
+ }
309
+ function isHttpEndpoint(value) {
310
+ try {
311
+ const url = new URL(value);
312
+ return url.protocol === "http:" || url.protocol === "https:";
313
+ }
314
+ catch {
315
+ return false;
316
+ }
317
+ }
192
318
  function isRecord(value) {
193
319
  return typeof value === "object" && value !== null && !Array.isArray(value);
194
320
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/engine/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/engine/config.ts"],"names":[],"mappings":"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"}
@@ -11,4 +11,9 @@ export declare class EngineError extends Error {
11
11
  constructor(message: string, options: EngineErrorOptions);
12
12
  }
13
13
  export declare function isEngineError(error: unknown): error is EngineError;
14
- export { collectionDetail, detail, errorDetails, type ErrorDetailEntry, } from "./details.js";
14
+ type ErrorDetailValue = string | number | boolean | null | undefined;
15
+ export type ErrorDetailEntry = string | readonly [string, ErrorDetailValue] | null | undefined;
16
+ export declare function errorDetails(entries: readonly ErrorDetailEntry[]): string | undefined;
17
+ export declare function detail(key: string, value: ErrorDetailValue): ErrorDetailEntry;
18
+ export declare function workspaceIndexDetail(name: string): ErrorDetailEntry;
19
+ export {};
@@ -1,4 +1,17 @@
1
- const ANONYMOUS_COLLECTION_NAME = "__anonymous__";
1
+ export const ENGINE_ERROR_CODE_PREFIX = "ZVEC_GREP.ENGINE";
2
+ export class EngineError extends Error {
3
+ code;
4
+ context;
5
+ constructor(message, options) {
6
+ super(message, { cause: options.cause });
7
+ this.name = "EngineError";
8
+ this.code = options.code;
9
+ this.context = options.context;
10
+ }
11
+ }
12
+ export function isEngineError(error) {
13
+ return error instanceof EngineError;
14
+ }
2
15
  export function errorDetails(entries) {
3
16
  const lines = entries
4
17
  .map(formatDetailEntry)
@@ -8,8 +21,8 @@ export function errorDetails(entries) {
8
21
  export function detail(key, value) {
9
22
  return value === null || value === undefined ? null : [key, value];
10
23
  }
11
- export function collectionDetail(name) {
12
- return name === ANONYMOUS_COLLECTION_NAME ? null : detail("collection", name);
24
+ export function workspaceIndexDetail(name) {
25
+ return detail("workspaceIndex", name);
13
26
  }
14
27
  function formatDetailEntry(entry) {
15
28
  if (entry === null || entry === undefined) {
@@ -24,4 +37,4 @@ function formatDetailEntry(entry) {
24
37
  }
25
38
  return `${key}=${String(value)}`;
26
39
  }
27
- //# sourceMappingURL=details.js.map
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/engine/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAU3D,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,OAAO,CAAU;IAE1B,YAAY,OAAe,EAAE,OAA2B;QACtD,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,WAAW,CAAC;AACtC,CAAC;AAOD,MAAM,UAAU,YAAY,CAC1B,OAAoC;IAEpC,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,iBAAiB,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,KAAuB;IACzD,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAuB;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACnC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { CodeEntityModifier, CodeSymbolType } from "../../types.js";
2
- import type { TSNode } from "../tree-sitter/nodes.js";
2
+ import type { TSNode } from "./tree-sitter/nodes.js";
3
3
  export type LanguageAdapter = {
4
4
  format: string;
5
5
  entityTypes: ReadonlySet<string>;
@@ -1,14 +1,8 @@
1
1
  import type { EntityFragment } from "../../types.js";
2
- import type { Extractor, Source } from "../index.js";
3
- export type CodeExtractorOptions = {
4
- maxChunkChars?: number;
5
- chunkOverlapChars?: number;
6
- };
7
- export declare class CodeExtractor implements Extractor {
8
- private readonly maxChunkChars;
9
- private readonly chunkOverlapChars;
10
- constructor(options?: CodeExtractorOptions);
11
- supports(source: Source): boolean;
12
- extract(source: Source): Promise<EntityFragment[]>;
2
+ import { type Source } from "../source.js";
3
+ import type { ChunkOptions } from "../types.js";
4
+ export declare class CodeExtractor {
5
+ extract(source: Source, options?: ChunkOptions): Promise<EntityFragment[]>;
6
+ private fallback;
13
7
  private extractScriptBlocks;
14
8
  }
@@ -1,51 +1,29 @@
1
- import { EngineError } from "../../errors/index.js";
1
+ import { EngineError } from "../../errors.js";
2
2
  import { makeEntityId } from "../ids.js";
3
- import { hasGrammar } from "../tree-sitter/grammar.js";
4
- import { withParser } from "../tree-sitter/parser.js";
3
+ import { validateSourceFile } from "../source.js";
4
+ import { hasGrammar } from "./tree-sitter/grammar.js";
5
+ import { withParser } from "./tree-sitter/parser.js";
6
+ import { extractPlainTextFragments } from "../text/extractor.js";
5
7
  import { resolveAdapter } from "./adapter.js";
6
8
  import { hasJavascriptTypescriptFunctionValue } from "./families/js-ts.js";
7
9
  const DEFAULT_CODE_CHUNK_CHARS = 3600;
8
10
  const DEFAULT_CODE_CHUNK_OVERLAP_CHARS = 540;
9
11
  export class CodeExtractor {
10
- maxChunkChars;
11
- chunkOverlapChars;
12
- constructor(options = {}) {
13
- const maxChunkChars = options.maxChunkChars ?? DEFAULT_CODE_CHUNK_CHARS;
14
- const chunkOverlapChars = options.chunkOverlapChars ?? DEFAULT_CODE_CHUNK_OVERLAP_CHARS;
15
- if (!Number.isInteger(maxChunkChars) || maxChunkChars <= 0) {
16
- throw new EngineError("Code extractor requires a positive integer chunk size", {
17
- code: "ZVEC_GREP.ENGINE.EXTRACTORS.CODE_INVALID_CHUNK_SIZE",
18
- context: `maxChunkChars=${maxChunkChars}`,
19
- });
20
- }
21
- if (!Number.isInteger(chunkOverlapChars) ||
22
- chunkOverlapChars < 0 ||
23
- chunkOverlapChars >= maxChunkChars) {
24
- throw new EngineError("Code extractor requires overlap to be smaller than chunk size", {
25
- code: "ZVEC_GREP.ENGINE.EXTRACTORS.CODE_INVALID_CHUNK_OVERLAP",
26
- context: `maxChunkChars=${maxChunkChars} chunkOverlapChars=${chunkOverlapChars}`,
27
- });
28
- }
29
- this.maxChunkChars = maxChunkChars;
30
- this.chunkOverlapChars = chunkOverlapChars;
31
- }
32
- supports(source) {
33
- return (source.kind === "text" &&
34
- source.file.kind === "code" &&
35
- (isScriptBlockFormat(source.file.format) ||
36
- (hasGrammar(source.file.format) &&
37
- resolveAdapter(source.file.format) !== null)));
38
- }
39
- async extract(source) {
40
- if (!this.supports(source) || source.kind !== "text") {
12
+ async extract(source, options = {}) {
13
+ if (source.kind !== "text" || source.file.kind !== "code") {
41
14
  return [];
42
15
  }
16
+ validateSourceFile(source);
17
+ const chunkOptions = resolveCodeChunkOptions(options);
43
18
  if (isScriptBlockFormat(source.file.format)) {
44
- return this.extractScriptBlocks(source);
19
+ const fragments = await this.extractScriptBlocks(source, chunkOptions);
20
+ return fragments.length > 0
21
+ ? fragments
22
+ : this.fallback(source, chunkOptions);
45
23
  }
46
24
  const adapter = resolveAdapter(source.file.format);
47
- if (!adapter) {
48
- return [];
25
+ if (!hasGrammar(source.file.format) || !adapter) {
26
+ return this.fallback(source, chunkOptions);
49
27
  }
50
28
  const extracted = await withParser(source.text, source.file.format, (tree) => {
51
29
  const collected = [];
@@ -53,7 +31,7 @@ export class CodeExtractor {
53
31
  const output = [];
54
32
  let entityIdIndex = 0;
55
33
  const appendEntity = (entity) => {
56
- const fragments = codeEntityToSearchFragments(source, adapter, entity, this.maxChunkChars, this.chunkOverlapChars);
34
+ const fragments = codeEntityToSearchFragments(source, adapter, entity, chunkOptions.maxChunkChars, chunkOptions.chunkOverlapChars);
57
35
  const majorId = fragments[0]?.group === ""
58
36
  ? makeEntityId(source.file.id, entityIdIndex)
59
37
  : null;
@@ -73,11 +51,14 @@ export class CodeExtractor {
73
51
  return output;
74
52
  });
75
53
  if (!extracted || extracted.length === 0) {
76
- return [];
54
+ return this.fallback(source, chunkOptions);
77
55
  }
78
56
  return extracted;
79
57
  }
80
- async extractScriptBlocks(source) {
58
+ fallback(source, options) {
59
+ return extractPlainTextFragments(source, options.maxChunkChars, options.chunkOverlapChars);
60
+ }
61
+ async extractScriptBlocks(source, options) {
81
62
  const fragments = [];
82
63
  for (const block of findScriptBlocks(source.text)) {
83
64
  const blockFile = {
@@ -88,12 +69,31 @@ export class CodeExtractor {
88
69
  kind: "text",
89
70
  file: blockFile,
90
71
  text: block.text,
91
- });
72
+ }, options);
92
73
  fragments.push(...remapScriptBlockFragments(source.file.id, blockFragments, fragments.length, block.startLine, block.startOffset));
93
74
  }
94
75
  return fragments;
95
76
  }
96
77
  }
78
+ function resolveCodeChunkOptions(options) {
79
+ const maxChunkChars = options.maxChunkChars ?? DEFAULT_CODE_CHUNK_CHARS;
80
+ const chunkOverlapChars = options.chunkOverlapChars ?? DEFAULT_CODE_CHUNK_OVERLAP_CHARS;
81
+ if (!Number.isInteger(maxChunkChars) || maxChunkChars <= 0) {
82
+ throw new EngineError("Code extractor requires a positive integer chunk size", {
83
+ code: "ZVEC_GREP.ENGINE.EXTRACTORS.CODE_INVALID_CHUNK_SIZE",
84
+ context: `maxChunkChars=${maxChunkChars}`,
85
+ });
86
+ }
87
+ if (!Number.isInteger(chunkOverlapChars) ||
88
+ chunkOverlapChars < 0 ||
89
+ chunkOverlapChars >= maxChunkChars) {
90
+ throw new EngineError("Code extractor requires overlap to be smaller than chunk size", {
91
+ code: "ZVEC_GREP.ENGINE.EXTRACTORS.CODE_INVALID_CHUNK_OVERLAP",
92
+ context: `maxChunkChars=${maxChunkChars} chunkOverlapChars=${chunkOverlapChars}`,
93
+ });
94
+ }
95
+ return { maxChunkChars, chunkOverlapChars };
96
+ }
97
97
  function walkCodeNode(node, adapter, breadcrumb, out) {
98
98
  for (const child of node.children) {
99
99
  const isScope = adapter.scopeTypes.has(child.type) &&
@@ -144,7 +144,7 @@ function codeEntityToSearchFragments(source, adapter, entity, maxChars, overlapC
144
144
  range: nodeToWindow(entity.node).range,
145
145
  content: {
146
146
  kind: "text",
147
- text: codeEntityOutline(entity, adapter),
147
+ text: codeEntityOutline(entity, adapter, maxChars),
148
148
  },
149
149
  metadata,
150
150
  };
@@ -241,6 +241,12 @@ function* splitTextByLines(text, maxChars, startLine, startOffset, overlapChars)
241
241
  let lineIndex = 0;
242
242
  let offset = startOffset;
243
243
  while (lineIndex < lines.length) {
244
+ if (lines[lineIndex].length > maxChars) {
245
+ yield* splitLongLineByChars(lines[lineIndex], maxChars, startLine + lineIndex, offset, overlapChars);
246
+ offset += lines[lineIndex].length + 1;
247
+ lineIndex++;
248
+ continue;
249
+ }
244
250
  let endIndex = lineIndex;
245
251
  let usedChars = 0;
246
252
  while (endIndex < lines.length) {
@@ -274,6 +280,52 @@ function* splitTextByLines(text, maxChars, startLine, startOffset, overlapChars)
274
280
  lineIndex = nextIndex;
275
281
  }
276
282
  }
283
+ function* splitLongLineByChars(text, maxChars, line, startOffset, overlapChars) {
284
+ let relativeStart = 0;
285
+ while (relativeStart < text.length) {
286
+ const rawEnd = Math.min(text.length, relativeStart + maxChars);
287
+ const relativeEnd = safeCharacterEnd(text, relativeStart, rawEnd);
288
+ yield {
289
+ text: text.slice(relativeStart, relativeEnd),
290
+ range: {
291
+ kind: "text",
292
+ startLine: line,
293
+ endLine: line,
294
+ startOffset: startOffset + relativeStart,
295
+ endOffset: startOffset + relativeEnd,
296
+ },
297
+ };
298
+ if (relativeEnd >= text.length) {
299
+ break;
300
+ }
301
+ const rawStart = Math.max(relativeStart + 1, relativeEnd - overlapChars);
302
+ relativeStart = safeCharacterStart(text, rawStart);
303
+ }
304
+ }
305
+ function safeCharacterEnd(text, start, end) {
306
+ if (end > start &&
307
+ end < text.length &&
308
+ isHighSurrogate(text.charCodeAt(end - 1)) &&
309
+ isLowSurrogate(text.charCodeAt(end))) {
310
+ return end - 1 > start ? end - 1 : end + 1;
311
+ }
312
+ return end;
313
+ }
314
+ function safeCharacterStart(text, start) {
315
+ if (start > 0 &&
316
+ start < text.length &&
317
+ isHighSurrogate(text.charCodeAt(start - 1)) &&
318
+ isLowSurrogate(text.charCodeAt(start))) {
319
+ return start + 1;
320
+ }
321
+ return start;
322
+ }
323
+ function isHighSurrogate(value) {
324
+ return value >= 0xd800 && value <= 0xdbff;
325
+ }
326
+ function isLowSurrogate(value) {
327
+ return value >= 0xdc00 && value <= 0xdfff;
328
+ }
277
329
  function computeOverlapStart(statements, groupStart, groupEnd, overlapChars) {
278
330
  if (overlapChars <= 0) {
279
331
  return groupEnd + 1;
@@ -309,7 +361,7 @@ const STRUCTURAL_SYMBOL_TYPES = new Set([
309
361
  const OUTLINE_MAX_MEMBERS = 32;
310
362
  const OUTLINE_MAX_CALLS = 24;
311
363
  const OUTLINE_MAX_LINE_CHARS = 180;
312
- function codeEntityOutline(entity, adapter) {
364
+ function codeEntityOutline(entity, adapter, maxChars) {
313
365
  const header = extractCodeHeader(entity.node.text);
314
366
  const lines = [
315
367
  header.length > 0 ? header : (entity.name ?? entity.symbolType),
@@ -326,7 +378,16 @@ function codeEntityOutline(entity, adapter) {
326
378
  lines.push("", `calls: ${calls.join(", ")}`);
327
379
  }
328
380
  }
329
- return lines.join("\n").trim();
381
+ return truncateOutline(lines.join("\n").trim(), maxChars);
382
+ }
383
+ function truncateOutline(outline, maxChars) {
384
+ if (outline.length <= maxChars) {
385
+ return outline;
386
+ }
387
+ if (maxChars <= 3) {
388
+ return ".".repeat(maxChars);
389
+ }
390
+ return `${outline.slice(0, maxChars - 3).trimEnd()}...`;
330
391
  }
331
392
  function extractCodeHeader(text) {
332
393
  const maxChars = 1200;