@zvec/zvec-grep 0.1.4 → 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 (356) hide show
  1. package/README.md +86 -162
  2. package/README_CN.md +80 -162
  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 +3 -0
  28. package/dist/cli/args.js +749 -201
  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.d.ts +3 -1
  34. package/dist/cli/commands.js +529 -180
  35. package/dist/cli/commands.js.map +1 -1
  36. package/dist/cli/errors.js +7 -6
  37. package/dist/cli/errors.js.map +1 -1
  38. package/dist/cli/format/context.d.ts +1 -0
  39. package/dist/cli/format/context.js +270 -70
  40. package/dist/cli/format/context.js.map +1 -1
  41. package/dist/cli/format/debug.js +14 -16
  42. package/dist/cli/format/debug.js.map +1 -1
  43. package/dist/cli/format/highlight.js.map +1 -1
  44. package/dist/cli/format/progress.d.ts +4 -0
  45. package/dist/cli/format/progress.js +222 -44
  46. package/dist/cli/format/progress.js.map +1 -1
  47. package/dist/cli/format/range.js.map +1 -1
  48. package/dist/cli/format/status.d.ts +77 -6
  49. package/dist/cli/format/status.js +343 -114
  50. package/dist/cli/format/status.js.map +1 -1
  51. package/dist/cli/help.d.ts +1 -1
  52. package/dist/cli/help.js +368 -84
  53. package/dist/cli/help.js.map +1 -1
  54. package/dist/cli/index.js +4 -4
  55. package/dist/cli/index.js.map +1 -1
  56. package/dist/cli/install.d.ts +4 -0
  57. package/dist/cli/install.js +845 -0
  58. package/dist/cli/install.js.map +1 -0
  59. package/dist/cli/managed-rg.d.ts +10 -0
  60. package/dist/cli/managed-rg.js +329 -0
  61. package/dist/cli/managed-rg.js.map +1 -0
  62. package/dist/cli/types.d.ts +40 -13
  63. package/dist/cli/types.js.map +1 -1
  64. package/dist/cli/version.js +3 -1
  65. package/dist/cli/version.js.map +1 -1
  66. package/dist/client/daemon-client.d.ts +19 -0
  67. package/dist/client/daemon-client.js +180 -0
  68. package/dist/client/daemon-client.js.map +1 -0
  69. package/dist/client/mode-router.d.ts +9 -0
  70. package/dist/client/mode-router.js +28 -0
  71. package/dist/client/mode-router.js.map +1 -0
  72. package/dist/client/search-policy.d.ts +11 -0
  73. package/dist/client/search-policy.js +15 -0
  74. package/dist/client/search-policy.js.map +1 -0
  75. package/dist/daemon/backend.d.ts +76 -0
  76. package/dist/daemon/backend.js +1049 -0
  77. package/dist/daemon/backend.js.map +1 -0
  78. package/dist/daemon/change-set.d.ts +25 -0
  79. package/dist/daemon/change-set.js +101 -0
  80. package/dist/daemon/change-set.js.map +1 -0
  81. package/dist/daemon/config.d.ts +24 -0
  82. package/dist/daemon/config.js +88 -0
  83. package/dist/daemon/config.js.map +1 -0
  84. package/dist/daemon/errors.d.ts +5 -0
  85. package/dist/daemon/errors.js +11 -0
  86. package/dist/daemon/errors.js.map +1 -0
  87. package/dist/daemon/http-server.d.ts +30 -0
  88. package/dist/daemon/http-server.js +287 -0
  89. package/dist/daemon/http-server.js.map +1 -0
  90. package/dist/daemon/index-coordinator.d.ts +23 -0
  91. package/dist/daemon/index-coordinator.js +68 -0
  92. package/dist/daemon/index-coordinator.js.map +1 -0
  93. package/dist/daemon/job-scheduler.d.ts +70 -0
  94. package/dist/daemon/job-scheduler.js +366 -0
  95. package/dist/daemon/job-scheduler.js.map +1 -0
  96. package/dist/daemon/logger.d.ts +9 -0
  97. package/dist/daemon/logger.js +53 -0
  98. package/dist/daemon/logger.js.map +1 -0
  99. package/dist/daemon/model-pool.d.ts +45 -0
  100. package/dist/daemon/model-pool.js +187 -0
  101. package/dist/daemon/model-pool.js.map +1 -0
  102. package/dist/daemon/root-lease.d.ts +14 -0
  103. package/dist/daemon/root-lease.js +188 -0
  104. package/dist/daemon/root-lease.js.map +1 -0
  105. package/dist/daemon/root-runtime.d.ts +78 -0
  106. package/dist/daemon/root-runtime.js +333 -0
  107. package/dist/daemon/root-runtime.js.map +1 -0
  108. package/dist/daemon/runtime-manager.d.ts +45 -0
  109. package/dist/daemon/runtime-manager.js +243 -0
  110. package/dist/daemon/runtime-manager.js.map +1 -0
  111. package/dist/daemon/runtime.d.ts +12 -0
  112. package/dist/daemon/runtime.js +102 -0
  113. package/dist/daemon/runtime.js.map +1 -0
  114. package/dist/daemon/server-controller.d.ts +39 -0
  115. package/dist/daemon/server-controller.js +203 -0
  116. package/dist/daemon/server-controller.js.map +1 -0
  117. package/dist/daemon/watch-manager.d.ts +50 -0
  118. package/dist/daemon/watch-manager.js +293 -0
  119. package/dist/daemon/watch-manager.js.map +1 -0
  120. package/dist/daemon/workspace-read-session-cache.d.ts +31 -0
  121. package/dist/daemon/workspace-read-session-cache.js +115 -0
  122. package/dist/daemon/workspace-read-session-cache.js.map +1 -0
  123. package/dist/engine/config.d.ts +50 -0
  124. package/dist/engine/config.js +321 -0
  125. package/dist/engine/config.js.map +1 -0
  126. package/dist/engine/{errors/index.d.ts → errors.d.ts} +6 -1
  127. package/dist/engine/{errors/details.js → errors.js} +17 -4
  128. package/dist/engine/errors.js.map +1 -0
  129. package/dist/engine/extraction/code/adapter.d.ts +1 -1
  130. package/dist/engine/extraction/code/adapter.js.map +1 -1
  131. package/dist/engine/extraction/code/extractor.d.ts +5 -11
  132. package/dist/engine/extraction/code/extractor.js +184 -109
  133. package/dist/engine/extraction/code/extractor.js.map +1 -1
  134. package/dist/engine/extraction/code/families/c-family.js +13 -7
  135. package/dist/engine/extraction/code/families/c-family.js.map +1 -1
  136. package/dist/engine/extraction/code/families/js-ts.d.ts +1 -1
  137. package/dist/engine/extraction/code/families/js-ts.js +24 -18
  138. package/dist/engine/extraction/code/families/js-ts.js.map +1 -1
  139. package/dist/engine/extraction/code/families/metadata.d.ts +1 -1
  140. package/dist/engine/extraction/code/families/metadata.js +11 -8
  141. package/dist/engine/extraction/code/families/metadata.js.map +1 -1
  142. package/dist/engine/extraction/code/families/name-field.js +5 -5
  143. package/dist/engine/extraction/code/families/name-field.js.map +1 -1
  144. package/dist/engine/extraction/code/languages/c.js +1 -4
  145. package/dist/engine/extraction/code/languages/c.js.map +1 -1
  146. package/dist/engine/extraction/code/languages/cpp.js.map +1 -1
  147. package/dist/engine/extraction/code/languages/go.js +1 -3
  148. package/dist/engine/extraction/code/languages/go.js.map +1 -1
  149. package/dist/engine/extraction/code/languages/java.js.map +1 -1
  150. package/dist/engine/extraction/code/languages/javascript.js +1 -3
  151. package/dist/engine/extraction/code/languages/javascript.js.map +1 -1
  152. package/dist/engine/extraction/code/languages/python.js +5 -6
  153. package/dist/engine/extraction/code/languages/python.js.map +1 -1
  154. package/dist/engine/extraction/code/languages/rust.js +1 -5
  155. package/dist/engine/extraction/code/languages/rust.js.map +1 -1
  156. package/dist/engine/extraction/code/languages/typescript.js.map +1 -1
  157. package/dist/engine/extraction/code/tree-sitter/grammar.js.map +1 -0
  158. package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.js +2 -1
  159. package/dist/engine/extraction/code/tree-sitter/nodes.js.map +1 -0
  160. package/dist/engine/extraction/code/tree-sitter/parser.js.map +1 -0
  161. package/dist/engine/extraction/ids.js.map +1 -1
  162. package/dist/engine/extraction/image/extractor.d.ts +5 -0
  163. package/dist/engine/extraction/image/extractor.js +35 -0
  164. package/dist/engine/extraction/image/extractor.js.map +1 -0
  165. package/dist/engine/extraction/index.d.ts +3 -44
  166. package/dist/engine/extraction/index.js +1 -280
  167. package/dist/engine/extraction/index.js.map +1 -1
  168. package/dist/engine/extraction/markdown/extractor.d.ts +5 -11
  169. package/dist/engine/extraction/markdown/extractor.js +37 -16
  170. package/dist/engine/extraction/markdown/extractor.js.map +1 -1
  171. package/dist/engine/extraction/runtime.d.ts +4 -0
  172. package/dist/engine/extraction/runtime.js +26 -0
  173. package/dist/engine/extraction/runtime.js.map +1 -0
  174. package/dist/engine/extraction/source.d.ts +18 -0
  175. package/dist/engine/extraction/source.js +22 -0
  176. package/dist/engine/extraction/source.js.map +1 -0
  177. package/dist/engine/extraction/text/extractor.d.ts +7 -0
  178. package/dist/engine/extraction/text/extractor.js +168 -0
  179. package/dist/engine/extraction/text/extractor.js.map +1 -0
  180. package/dist/engine/extraction/types.d.ts +4 -0
  181. package/dist/engine/{models → extraction}/types.js.map +1 -1
  182. package/dist/engine/{files/file-type.d.ts → file-type.d.ts} +1 -1
  183. package/dist/engine/file-type.js.map +1 -0
  184. package/dist/engine/index-status.d.ts +9 -0
  185. package/dist/engine/index-status.js +38 -0
  186. package/dist/engine/index-status.js.map +1 -0
  187. package/dist/engine/manifest.d.ts +12 -0
  188. package/dist/engine/manifest.js +120 -0
  189. package/dist/engine/manifest.js.map +1 -0
  190. package/dist/engine/models/{providers/llama-cpp/embedding.d.ts → backends/llama-cpp.d.ts} +25 -20
  191. package/dist/engine/models/{providers/llama-cpp/embedding.js → backends/llama-cpp.js} +165 -113
  192. package/dist/engine/models/backends/llama-cpp.js.map +1 -0
  193. package/dist/engine/models/backends/model2vec.d.ts +57 -0
  194. package/dist/engine/models/backends/model2vec.js +332 -0
  195. package/dist/engine/models/backends/model2vec.js.map +1 -0
  196. package/dist/engine/models/backends/qwen.d.ts +44 -0
  197. package/dist/engine/models/{providers/qwen/embedding.js → backends/qwen.js} +168 -102
  198. package/dist/engine/models/backends/qwen.js.map +1 -0
  199. package/dist/engine/models/backends/transformers-js.d.ts +87 -0
  200. package/dist/engine/models/backends/transformers-js.js +316 -0
  201. package/dist/engine/models/backends/transformers-js.js.map +1 -0
  202. package/dist/engine/models/catalog.d.ts +188 -23
  203. package/dist/engine/models/catalog.js +172 -41
  204. package/dist/engine/models/catalog.js.map +1 -1
  205. package/dist/engine/models/download-progress.d.ts +15 -0
  206. package/dist/engine/models/download-progress.js +48 -0
  207. package/dist/engine/models/download-progress.js.map +1 -0
  208. package/dist/engine/models/embeddings.d.ts +58 -18
  209. package/dist/engine/models/embeddings.js +53 -29
  210. package/dist/engine/models/embeddings.js.map +1 -1
  211. package/dist/engine/models/factory.d.ts +2 -5
  212. package/dist/engine/models/factory.js +41 -56
  213. package/dist/engine/models/factory.js.map +1 -1
  214. package/dist/engine/models/index.d.ts +4 -6
  215. package/dist/engine/models/index.js +4 -4
  216. package/dist/engine/models/index.js.map +1 -1
  217. package/dist/engine/models/ranking.d.ts +7 -3
  218. package/dist/engine/models/resolution.d.ts +8 -0
  219. package/dist/engine/models/resolution.js +22 -0
  220. package/dist/engine/models/resolution.js.map +1 -0
  221. package/dist/engine/pipeline/indexing/index.d.ts +9 -7
  222. package/dist/engine/pipeline/indexing/index.js +399 -147
  223. package/dist/engine/pipeline/indexing/index.js.map +1 -1
  224. package/dist/engine/pipeline/indexing/root-paths.js +16 -19
  225. package/dist/engine/pipeline/indexing/root-paths.js.map +1 -1
  226. package/dist/engine/pipeline/indexing/scanner/index.d.ts +6 -1
  227. package/dist/engine/pipeline/indexing/scanner/index.js +318 -66
  228. package/dist/engine/pipeline/indexing/scanner/index.js.map +1 -1
  229. package/dist/engine/pipeline/search/index.d.ts +6 -6
  230. package/dist/engine/pipeline/search/index.js +76 -34
  231. package/dist/engine/pipeline/search/index.js.map +1 -1
  232. package/dist/engine/service/index.d.ts +3 -2
  233. package/dist/engine/service/index.js +1 -1
  234. package/dist/engine/service/index.js.map +1 -1
  235. package/dist/engine/service/lexical.d.ts +14 -15
  236. package/dist/engine/service/lexical.js +78 -119
  237. package/dist/engine/service/lexical.js.map +1 -1
  238. package/dist/engine/service/root.d.ts +13 -12
  239. package/dist/engine/service/root.js +35 -24
  240. package/dist/engine/service/root.js.map +1 -1
  241. package/dist/engine/service/structure-enrichment.js +29 -25
  242. package/dist/engine/service/structure-enrichment.js.map +1 -1
  243. package/dist/engine/service/types.d.ts +61 -35
  244. package/dist/engine/service/workspace-index.d.ts +24 -0
  245. package/dist/engine/service/workspace-index.js +151 -0
  246. package/dist/engine/service/workspace-index.js.map +1 -0
  247. package/dist/engine/service/zvec-grep.d.ts +12 -1
  248. package/dist/engine/service/zvec-grep.js +878 -544
  249. package/dist/engine/service/zvec-grep.js.map +1 -1
  250. package/dist/engine/storage/index.d.ts +8 -4
  251. package/dist/engine/storage/index.js +1 -1
  252. package/dist/engine/storage/index.js.map +1 -1
  253. package/dist/engine/storage/zvec.d.ts +10 -33
  254. package/dist/engine/storage/zvec.js +110 -49
  255. package/dist/engine/storage/zvec.js.map +1 -1
  256. package/dist/engine/types.d.ts +29 -23
  257. package/dist/engine/types.js +1 -1
  258. package/dist/engine/types.js.map +1 -1
  259. package/dist/engine/utils/daemon-lease.d.ts +17 -0
  260. package/dist/engine/utils/daemon-lease.js +175 -0
  261. package/dist/engine/utils/daemon-lease.js.map +1 -0
  262. package/dist/engine/utils/file-selection.d.ts +10 -0
  263. package/dist/engine/utils/file-selection.js +157 -0
  264. package/dist/engine/utils/file-selection.js.map +1 -0
  265. package/dist/engine/utils/glob.d.ts +3 -0
  266. package/dist/engine/utils/glob.js +116 -18
  267. package/dist/engine/utils/glob.js.map +1 -1
  268. package/dist/engine/utils/hash.js.map +1 -1
  269. package/dist/engine/utils/json.d.ts +6 -2
  270. package/dist/engine/utils/json.js +50 -12
  271. package/dist/engine/utils/json.js.map +1 -1
  272. package/dist/engine/utils/lock.js +7 -7
  273. package/dist/engine/utils/lock.js.map +1 -1
  274. package/dist/engine/utils/path.js +2 -2
  275. package/dist/engine/utils/path.js.map +1 -1
  276. package/dist/engine/utils/timing.js.map +1 -1
  277. package/dist/index-progress.d.ts +10 -0
  278. package/dist/index-progress.js +159 -0
  279. package/dist/index-progress.js.map +1 -0
  280. package/dist/index.d.ts +6 -6
  281. package/dist/index.js +3 -3
  282. package/dist/index.js.map +1 -1
  283. package/dist/mcp/http-transport.d.ts +27 -0
  284. package/dist/mcp/http-transport.js +182 -0
  285. package/dist/mcp/http-transport.js.map +1 -0
  286. package/dist/mcp/input-normalization.d.ts +38 -0
  287. package/dist/mcp/input-normalization.js +95 -0
  288. package/dist/mcp/input-normalization.js.map +1 -0
  289. package/dist/mcp/progress-heartbeat.d.ts +17 -0
  290. package/dist/mcp/progress-heartbeat.js +46 -0
  291. package/dist/mcp/progress-heartbeat.js.map +1 -0
  292. package/dist/mcp/request-metadata.d.ts +2 -0
  293. package/dist/mcp/request-metadata.js +11 -0
  294. package/dist/mcp/request-metadata.js.map +1 -0
  295. package/dist/mcp/request-state.d.ts +40 -0
  296. package/dist/mcp/request-state.js +210 -0
  297. package/dist/mcp/request-state.js.map +1 -0
  298. package/dist/mcp/result-format.d.ts +13 -0
  299. package/dist/mcp/result-format.js +75 -0
  300. package/dist/mcp/result-format.js.map +1 -0
  301. package/dist/mcp/schemas.d.ts +430 -0
  302. package/dist/mcp/schemas.js +447 -0
  303. package/dist/mcp/schemas.js.map +1 -0
  304. package/dist/mcp/tools.d.ts +150 -0
  305. package/dist/mcp/tools.js +448 -0
  306. package/dist/mcp/tools.js.map +1 -0
  307. package/dist/mcp/toolset.d.ts +5 -0
  308. package/dist/mcp/toolset.js +12 -0
  309. package/dist/mcp/toolset.js.map +1 -0
  310. package/dist/observability/trace-context.d.ts +11 -0
  311. package/dist/observability/trace-context.js +138 -0
  312. package/dist/observability/trace-context.js.map +1 -0
  313. package/docs/01-agents.md +111 -0
  314. package/docs/02-cli.md +229 -0
  315. package/docs/03-mcp.md +167 -0
  316. package/docs/04-pipeline.md +218 -0
  317. package/docs/05-architecture.md +86 -0
  318. package/docs/06-server.md +210 -0
  319. package/docs/07-embedding.md +179 -0
  320. package/docs/08-roadmap.md +85 -0
  321. package/docs/README.md +53 -0
  322. package/package.json +43 -7
  323. package/skills/zvec-grep/SKILL.md +43 -123
  324. package/skills/zvec-grep/agents/openai.yaml +2 -2
  325. package/skills/zvec-grep/references/cli-fallback.md +85 -0
  326. package/dist/engine/collection/index.d.ts +0 -55
  327. package/dist/engine/collection/index.js +0 -710
  328. package/dist/engine/collection/index.js.map +0 -1
  329. package/dist/engine/errors/details.d.ts +0 -6
  330. package/dist/engine/errors/details.js.map +0 -1
  331. package/dist/engine/errors/index.js +0 -16
  332. package/dist/engine/errors/index.js.map +0 -1
  333. package/dist/engine/extraction/tree-sitter/grammar.js.map +0 -1
  334. package/dist/engine/extraction/tree-sitter/nodes.js.map +0 -1
  335. package/dist/engine/extraction/tree-sitter/parser.js.map +0 -1
  336. package/dist/engine/files/file-type.js.map +0 -1
  337. package/dist/engine/models/providers/index.d.ts +0 -2
  338. package/dist/engine/models/providers/index.js +0 -3
  339. package/dist/engine/models/providers/index.js.map +0 -1
  340. package/dist/engine/models/providers/llama-cpp/embedding.js.map +0 -1
  341. package/dist/engine/models/providers/llama-cpp/index.d.ts +0 -1
  342. package/dist/engine/models/providers/llama-cpp/index.js +0 -2
  343. package/dist/engine/models/providers/llama-cpp/index.js.map +0 -1
  344. package/dist/engine/models/providers/qwen/embedding.d.ts +0 -42
  345. package/dist/engine/models/providers/qwen/embedding.js.map +0 -1
  346. package/dist/engine/models/providers/qwen/index.d.ts +0 -1
  347. package/dist/engine/models/providers/qwen/index.js +0 -2
  348. package/dist/engine/models/providers/qwen/index.js.map +0 -1
  349. package/dist/engine/models/types.d.ts +0 -30
  350. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.d.ts +0 -0
  351. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/grammar.js +0 -0
  352. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/nodes.d.ts +0 -0
  353. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.d.ts +0 -0
  354. /package/dist/engine/extraction/{tree-sitter → code/tree-sitter}/parser.js +0 -0
  355. /package/dist/engine/{models → extraction}/types.js +0 -0
  356. /package/dist/engine/{files/file-type.js → file-type.js} +0 -0
@@ -0,0 +1,19 @@
1
+ import { createRemoteEmbeddingOperationPermit } from "./operation.js";
2
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
3
+ export class RemoteEmbeddingAuthorizationManager {
4
+ store;
5
+ constructor(store = new RemoteEmbeddingAuthorizationStore()) {
6
+ this.store = store;
7
+ }
8
+ async existingWorkspacePermit(plan) {
9
+ if (!(await this.store.hasGrant(plan.target)))
10
+ return undefined;
11
+ return createRemoteEmbeddingOperationPermit(plan.target, "workspace");
12
+ }
13
+ async grant(plan, scope) {
14
+ if (scope === "workspace")
15
+ await this.store.grant(plan.target);
16
+ return createRemoteEmbeddingOperationPermit(plan.target, scope);
17
+ }
18
+ }
19
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/authorization/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAO/D,MAAM,OAAO,mCAAmC;IACrC,KAAK,CAAoC;IAElD,YAAY,KAAK,GAAG,IAAI,iCAAiC,EAAE;QACzD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,uBAAuB,CAC3B,IAAsC;QAEtC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QAChE,OAAO,oCAAoC,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,KAAK,CACT,IAAsC,EACtC,KAAwC;QAExC,IAAI,KAAK,KAAK,WAAW;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,oCAAoC,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
2
+ import { type RemoteEmbeddingAuthorizationScope, type RemoteEmbeddingOperationPermit, type RemoteEmbeddingRequest, type RemoteEmbeddingTarget } from "./types.js";
3
+ export declare function createRemoteEmbeddingOperationPermit(target: RemoteEmbeddingTarget, scope: RemoteEmbeddingAuthorizationScope): RemoteEmbeddingOperationPermit;
4
+ export declare function withRemoteEmbeddingOperationPermit<T>(permit: RemoteEmbeddingOperationPermit | undefined, operation: () => Promise<T>): Promise<T>;
5
+ export declare function remoteEmbeddingAuthorizationGuard(options?: {
6
+ store?: RemoteEmbeddingAuthorizationStore;
7
+ }): (request: RemoteEmbeddingRequest) => Promise<void>;
@@ -0,0 +1,50 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ import { randomUUID } from "node:crypto";
3
+ import { EngineError } from "../engine/errors.js";
4
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
5
+ import { REMOTE_EMBEDDING_CAPABILITY, } from "./types.js";
6
+ const operationPermit = new AsyncLocalStorage();
7
+ export function createRemoteEmbeddingOperationPermit(target, scope) {
8
+ return {
9
+ capability: REMOTE_EMBEDDING_CAPABILITY,
10
+ scope,
11
+ target,
12
+ issuedAt: Date.now(),
13
+ operationId: randomUUID(),
14
+ };
15
+ }
16
+ export async function withRemoteEmbeddingOperationPermit(permit, operation) {
17
+ if (!permit)
18
+ return await operation();
19
+ return await operationPermit.run(permit, operation);
20
+ }
21
+ export function remoteEmbeddingAuthorizationGuard(options = {}) {
22
+ const store = options.store ?? new RemoteEmbeddingAuthorizationStore();
23
+ return async (request) => {
24
+ const permit = operationPermit.getStore();
25
+ if (!permit ||
26
+ permit.capability !== REMOTE_EMBEDDING_CAPABILITY ||
27
+ permit.target.provider !== request.provider ||
28
+ permit.target.model !== request.model ||
29
+ permit.target.endpoint !== request.endpoint) {
30
+ throw authorizationRequiredError(request);
31
+ }
32
+ if (permit.scope === "workspace" &&
33
+ !(await store.hasGrant(permit.target))) {
34
+ throw authorizationRequiredError(request, "Workspace grant is missing, invalid, or revoked.");
35
+ }
36
+ };
37
+ }
38
+ function authorizationRequiredError(request, detail) {
39
+ return new EngineError("Remote Embedding authorization is required", {
40
+ code: "ZVEC_GREP.ENGINE.AUTH.REMOTE_EMBEDDING_REQUIRED",
41
+ context: [
42
+ `provider=${request.provider}`,
43
+ `model=${request.model}`,
44
+ `endpoint=${request.endpoint}`,
45
+ `purpose=${request.purpose}`,
46
+ ...(detail ? [`detail=${detail}`] : []),
47
+ ].join(" "),
48
+ });
49
+ }
50
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../../src/authorization/operation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,iCAAiC,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,2BAA2B,GAK5B,MAAM,YAAY,CAAC;AAEpB,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAkC,CAAC;AAEhF,MAAM,UAAU,oCAAoC,CAClD,MAA6B,EAC7B,KAAwC;IAExC,OAAO;QACL,UAAU,EAAE,2BAA2B;QACvC,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;QACpB,WAAW,EAAE,UAAU,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,MAAkD,EAClD,SAA2B;IAE3B,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,SAAS,EAAE,CAAC;IACtC,OAAO,MAAM,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,UAEI,EAAE;IAEN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,iCAAiC,EAAE,CAAC;IACvE,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,CAAC;QAC1C,IACE,CAAC,MAAM;YACP,MAAM,CAAC,UAAU,KAAK,2BAA2B;YACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK;YACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAC3C,CAAC;YACD,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,IACE,MAAM,CAAC,KAAK,KAAK,WAAW;YAC5B,CAAC,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EACtC,CAAC;YACD,MAAM,0BAA0B,CAC9B,OAAO,EACP,kDAAkD,CACnD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,0BAA0B,CACjC,OAA+B,EAC/B,MAAe;IAEf,OAAO,IAAI,WAAW,CAAC,4CAA4C,EAAE;QACnE,IAAI,EAAE,iDAAiD;QACvD,OAAO,EAAE;YACP,YAAY,OAAO,CAAC,QAAQ,EAAE;YAC9B,SAAS,OAAO,CAAC,KAAK,EAAE;YACxB,YAAY,OAAO,CAAC,QAAQ,EAAE;YAC9B,WAAW,OAAO,CAAC,OAAO,EAAE;YAC5B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,IAAI,CAAC,GAAG,CAAC;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { NormalizedSearchInput } from "../mcp/input-normalization.js";
2
+ import type { EmbeddingModelInfo } from "../engine/models/index.js";
3
+ import type { ZvecGrepInfoResult } from "../engine/service/types.js";
4
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
5
+ import type { RemoteEmbeddingAuthorizationPlan } from "./types.js";
6
+ export declare function planRemoteIndexAuthorization(input: {
7
+ info: ZvecGrepInfoResult;
8
+ model: EmbeddingModelInfo;
9
+ rebuild?: boolean;
10
+ needsUpdate?: boolean;
11
+ store?: RemoteEmbeddingAuthorizationStore;
12
+ }): Promise<RemoteEmbeddingAuthorizationPlan | undefined>;
13
+ export declare function planRemoteSearchAuthorization(input: {
14
+ info: ZvecGrepInfoResult;
15
+ model: EmbeddingModelInfo;
16
+ search: NormalizedSearchInput;
17
+ runtimeNeedsReconciliation?: boolean;
18
+ store?: RemoteEmbeddingAuthorizationStore;
19
+ }): Promise<RemoteEmbeddingAuthorizationPlan | undefined>;
20
+ export declare function searchUsesVector(input: Pick<NormalizedSearchInput, "queries" | "routes">): boolean;
21
+ export declare function indexStatusIsFresh(info: ZvecGrepInfoResult): boolean;
@@ -0,0 +1,97 @@
1
+ import { createRemoteEmbeddingTarget } from "./target.js";
2
+ import { RemoteEmbeddingAuthorizationStore } from "./store.js";
3
+ export async function planRemoteIndexAuthorization(input) {
4
+ if (input.model.provider !== "qwen")
5
+ return undefined;
6
+ const needsEmbedding = input.rebuild === true ||
7
+ input.needsUpdate === true ||
8
+ !input.info.indexed ||
9
+ !indexStatusIsFresh(input.info);
10
+ if (!needsEmbedding)
11
+ return undefined;
12
+ const endpoint = input.model.endpoint;
13
+ if (endpoint === undefined) {
14
+ throw new Error(`Embedding model ${input.model.reference} did not provide a remote endpoint.`);
15
+ }
16
+ const target = await createRemoteEmbeddingTarget({
17
+ roots: workspaceRoots(input.info),
18
+ provider: input.model.provider,
19
+ model: input.model.name,
20
+ endpoint,
21
+ });
22
+ const store = input.store ?? new RemoteEmbeddingAuthorizationStore();
23
+ return {
24
+ operation: "index",
25
+ target,
26
+ disclosure: {
27
+ queryText: false,
28
+ workspaceContent: !input.info.indexed || input.rebuild ? "full" : "changed",
29
+ },
30
+ reason: input.rebuild
31
+ ? "index_rebuild"
32
+ : input.info.indexed
33
+ ? "index_update"
34
+ : "index_create",
35
+ grantPath: store.grantPath(target),
36
+ };
37
+ }
38
+ export async function planRemoteSearchAuthorization(input) {
39
+ const schema = input.info.workspaceIndex?.embedding;
40
+ if (!input.info.indexed || !schema || schema.provider !== "qwen") {
41
+ return undefined;
42
+ }
43
+ if (input.model.provider !== schema.provider ||
44
+ input.model.name !== schema.model) {
45
+ throw new Error(`Embedding model ${input.model.reference} does not match indexed model ${schema.provider}/${schema.model}.`);
46
+ }
47
+ const usesVector = searchUsesVector(input.search);
48
+ const needsUpdate = input.runtimeNeedsReconciliation === true ||
49
+ !indexStatusIsFresh(input.info);
50
+ const updatesIndex = needsUpdate &&
51
+ (input.search.autoUpdate || input.search.freshness === "wait_for_fresh");
52
+ if (!usesVector && !updatesIndex)
53
+ return undefined;
54
+ const endpoint = input.model.endpoint;
55
+ if (endpoint === undefined) {
56
+ throw new Error(`Embedding model ${input.model.reference} did not provide a remote endpoint.`);
57
+ }
58
+ const target = await createRemoteEmbeddingTarget({
59
+ roots: workspaceRoots(input.info),
60
+ provider: input.model.provider,
61
+ model: input.model.name,
62
+ endpoint,
63
+ });
64
+ const store = input.store ?? new RemoteEmbeddingAuthorizationStore();
65
+ return {
66
+ operation: usesVector
67
+ ? updatesIndex
68
+ ? "query_and_index"
69
+ : "query"
70
+ : "index",
71
+ target,
72
+ disclosure: {
73
+ queryText: usesVector,
74
+ workspaceContent: updatesIndex ? "changed" : "none",
75
+ },
76
+ reason: "query",
77
+ grantPath: store.grantPath(target),
78
+ };
79
+ }
80
+ export function searchUsesVector(input) {
81
+ return ((input.queries?.length ?? 0) > 0 ||
82
+ input.routes.some((route) => route.mode === "vector"));
83
+ }
84
+ export function indexStatusIsFresh(info) {
85
+ const status = info.status;
86
+ return Boolean(status &&
87
+ status.filesAdded === 0 &&
88
+ status.filesModified === 0 &&
89
+ status.filesDeleted === 0 &&
90
+ status.filesPending === 0 &&
91
+ status.filesFailed === 0);
92
+ }
93
+ function workspaceRoots(info) {
94
+ const roots = info.workspaceIndex?.rootPaths.map((root) => root.absolutePath) ?? [];
95
+ return roots.length > 0 ? roots : [info.root];
96
+ }
97
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/authorization/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RemoteEmbeddingDataDisclosure } from "./types.js";
2
+ export type RemoteEmbeddingAuthorizationPromptInput = {
3
+ workspaceRoots: readonly string[];
4
+ provider: string;
5
+ model: string;
6
+ endpoint?: string;
7
+ data: readonly string[];
8
+ note?: string;
9
+ };
10
+ export declare function remoteEmbeddingDisclosureData(disclosure: RemoteEmbeddingDataDisclosure): string[];
11
+ export declare function formatRemoteEmbeddingAuthorizationPrompt(input: RemoteEmbeddingAuthorizationPromptInput): string;
@@ -0,0 +1,62 @@
1
+ import { basename } from "node:path";
2
+ export function remoteEmbeddingDisclosureData(disclosure) {
3
+ return [
4
+ ...(disclosure.queryText ? ["query text"] : []),
5
+ ...(disclosure.workspaceContent === "selected"
6
+ ? ["selected workspace files"]
7
+ : disclosure.workspaceContent === "changed"
8
+ ? ["changed workspace files"]
9
+ : disclosure.workspaceContent === "full"
10
+ ? ["selected workspace files"]
11
+ : []),
12
+ ];
13
+ }
14
+ export function formatRemoteEmbeddingAuthorizationPrompt(input) {
15
+ const data = naturalList(input.data.length > 0 ? input.data : ["data required by this operation"]);
16
+ const lines = [
17
+ "Remote Embedding authorization",
18
+ "",
19
+ `Send ${data}?`,
20
+ "",
21
+ ` From ${workspaceLabel(input.workspaceRoots)}`,
22
+ ` To ${clip(`${input.provider}/${input.model}`, 72)}`,
23
+ ];
24
+ const host = endpointHost(input.endpoint);
25
+ if (host)
26
+ lines.push(` ${clip(host, 72)}`);
27
+ if (input.note)
28
+ lines.push("", input.note);
29
+ lines.push("", "API charges may apply.");
30
+ return lines.join("\n");
31
+ }
32
+ function workspaceLabel(roots) {
33
+ const names = roots.map((root) => clip(basename(root) || root || "workspace", 32));
34
+ if (names.length === 0)
35
+ return "workspace";
36
+ if (names.length <= 2)
37
+ return names.join(", ");
38
+ return `${names.slice(0, 2).join(", ")} +${names.length - 2}`;
39
+ }
40
+ function endpointHost(endpoint) {
41
+ if (!endpoint)
42
+ return undefined;
43
+ try {
44
+ return new URL(endpoint).host;
45
+ }
46
+ catch {
47
+ return endpoint.replace(/^https?:\/\//, "").split("/")[0] || undefined;
48
+ }
49
+ }
50
+ function naturalList(items) {
51
+ if (items.length <= 1)
52
+ return items[0] ?? "data";
53
+ if (items.length === 2)
54
+ return `${items[0]} and ${items[1]}`;
55
+ return `${items.slice(0, -1).join(", ")}, and ${items.at(-1)}`;
56
+ }
57
+ function clip(value, maxLength) {
58
+ if (value.length <= maxLength)
59
+ return value;
60
+ return `${value.slice(0, Math.max(1, maxLength - 1))}…`;
61
+ }
62
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/authorization/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAYrC,MAAM,UAAU,6BAA6B,CAC3C,UAAyC;IAEzC,OAAO;QACL,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,UAAU,CAAC,gBAAgB,KAAK,UAAU;YAC5C,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC9B,CAAC,CAAC,UAAU,CAAC,gBAAgB,KAAK,SAAS;gBACzC,CAAC,CAAC,CAAC,yBAAyB,CAAC;gBAC7B,CAAC,CAAC,UAAU,CAAC,gBAAgB,KAAK,MAAM;oBACtC,CAAC,CAAC,CAAC,0BAA0B,CAAC;oBAC9B,CAAC,CAAC,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wCAAwC,CACtD,KAA8C;IAE9C,MAAM,IAAI,GAAG,WAAW,CACtB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CACzE,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,gCAAgC;QAChC,EAAE;QACF,QAAQ,IAAI,GAAG;QACf,EAAE;QACF,WAAW,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE;QACjD,WAAW,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE;KAC1D,CAAC;IACF,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,WAAW,EAAE,EAAE,CAAC,CAChD,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,QAA4B;IAChD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACzE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB;IAC3C,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,SAAiB;IAC5C,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type RemoteEmbeddingAuthorizationStatus, type RemoteEmbeddingTarget, type RemoteEmbeddingWorkspaceGrant } from "./types.js";
2
+ export type RemoteEmbeddingAuthorizationStoreOptions = {
3
+ signingKeyPath?: string;
4
+ };
5
+ export declare class RemoteEmbeddingAuthorizationStore {
6
+ private readonly signingKeyPath;
7
+ constructor(options?: RemoteEmbeddingAuthorizationStoreOptions);
8
+ grantPath(target: Pick<RemoteEmbeddingTarget, "workspaceRoots">): string;
9
+ hasGrant(target: RemoteEmbeddingTarget): Promise<boolean>;
10
+ grant(target: RemoteEmbeddingTarget): Promise<RemoteEmbeddingWorkspaceGrant>;
11
+ revoke(target: RemoteEmbeddingTarget): Promise<boolean>;
12
+ revokeAll(root: string): Promise<number>;
13
+ status(root: string): Promise<RemoteEmbeddingAuthorizationStatus>;
14
+ private readDocument;
15
+ private writeDocument;
16
+ private withDocumentWrite;
17
+ private verifyGrant;
18
+ private readSigningKey;
19
+ private getOrCreateSigningKey;
20
+ }
@@ -0,0 +1,251 @@
1
+ import { createHmac, randomBytes, randomUUID, timingSafeEqual, } from "node:crypto";
2
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { readJsonFile, writeJsonFile } from "../engine/utils/json.js";
6
+ import { acquireReadWriteLock } from "../engine/utils/lock.js";
7
+ import { REMOTE_EMBEDDING_CAPABILITY, } from "./types.js";
8
+ const DOCUMENT_VERSION = 1;
9
+ const GRANT_FILE = "authorization.json";
10
+ export class RemoteEmbeddingAuthorizationStore {
11
+ signingKeyPath;
12
+ constructor(options = {}) {
13
+ this.signingKeyPath = resolve(options.signingKeyPath ??
14
+ process.env.ZVEC_GREP_AUTHORIZATION_KEY_FILE ??
15
+ join(homedir(), ".zvec-grep", "authorization-signing.key"));
16
+ }
17
+ grantPath(target) {
18
+ const root = target.workspaceRoots[0];
19
+ if (!root) {
20
+ throw new Error("Remote Embedding target has no workspace roots.");
21
+ }
22
+ return join(root, ".zvec-grep", GRANT_FILE);
23
+ }
24
+ async hasGrant(target) {
25
+ const key = await this.readSigningKey();
26
+ if (!key)
27
+ return false;
28
+ const document = await this.readDocument(this.grantPath(target));
29
+ return document.grants.some((grant) => grant.targetFingerprint === target.targetFingerprint &&
30
+ this.verifyGrant(grant, key));
31
+ }
32
+ async grant(target) {
33
+ const key = await this.getOrCreateSigningKey();
34
+ const unsigned = {
35
+ version: DOCUMENT_VERSION,
36
+ id: randomUUID(),
37
+ capability: REMOTE_EMBEDDING_CAPABILITY,
38
+ scope: "workspace",
39
+ workspaceRoots: [...target.workspaceRoots],
40
+ workspaceFingerprint: target.workspaceFingerprint,
41
+ provider: target.provider,
42
+ model: target.model,
43
+ endpoint: target.endpoint,
44
+ targetFingerprint: target.targetFingerprint,
45
+ grantedAt: Date.now(),
46
+ };
47
+ const grant = {
48
+ ...unsigned,
49
+ signature: sign(unsigned, key),
50
+ };
51
+ for (const root of target.workspaceRoots) {
52
+ const path = join(root, ".zvec-grep", GRANT_FILE);
53
+ await this.withDocumentWrite(path, async (document) => {
54
+ const next = {
55
+ version: DOCUMENT_VERSION,
56
+ grants: [
57
+ ...document.grants.filter((candidate) => candidate.targetFingerprint !== target.targetFingerprint),
58
+ grant,
59
+ ],
60
+ };
61
+ await this.writeDocument(path, next);
62
+ });
63
+ }
64
+ return grant;
65
+ }
66
+ async revoke(target) {
67
+ let revoked = false;
68
+ for (const root of target.workspaceRoots) {
69
+ const path = join(root, ".zvec-grep", GRANT_FILE);
70
+ await this.withDocumentWrite(path, async (document) => {
71
+ const grants = document.grants.filter((grant) => grant.targetFingerprint !== target.targetFingerprint);
72
+ if (grants.length === document.grants.length)
73
+ return;
74
+ revoked = true;
75
+ await this.writeDocument(path, {
76
+ version: DOCUMENT_VERSION,
77
+ grants,
78
+ });
79
+ });
80
+ }
81
+ return revoked;
82
+ }
83
+ async revokeAll(root) {
84
+ const path = join(resolve(root), ".zvec-grep", GRANT_FILE);
85
+ let revoked = 0;
86
+ let validGrants = [];
87
+ const key = await this.readSigningKey();
88
+ await this.withDocumentWrite(path, async (document) => {
89
+ revoked = document.grants.length;
90
+ if (revoked === 0)
91
+ return;
92
+ validGrants = key
93
+ ? document.grants.filter((grant) => this.verifyGrant(grant, key))
94
+ : [];
95
+ await this.writeDocument(path, {
96
+ version: DOCUMENT_VERSION,
97
+ grants: [],
98
+ });
99
+ });
100
+ const fingerprintsByPath = new Map();
101
+ for (const grant of validGrants) {
102
+ for (const workspaceRoot of grant.workspaceRoots) {
103
+ const grantPath = join(workspaceRoot, ".zvec-grep", GRANT_FILE);
104
+ if (resolve(grantPath) === resolve(path))
105
+ continue;
106
+ const fingerprints = fingerprintsByPath.get(grantPath) ?? new Set();
107
+ fingerprints.add(grant.targetFingerprint);
108
+ fingerprintsByPath.set(grantPath, fingerprints);
109
+ }
110
+ }
111
+ for (const [grantPath, fingerprints] of fingerprintsByPath) {
112
+ await this.withDocumentWrite(grantPath, async (document) => {
113
+ const grants = document.grants.filter((grant) => !fingerprints.has(grant.targetFingerprint));
114
+ if (grants.length === document.grants.length)
115
+ return;
116
+ await this.writeDocument(grantPath, {
117
+ version: DOCUMENT_VERSION,
118
+ grants,
119
+ });
120
+ });
121
+ }
122
+ return revoked;
123
+ }
124
+ async status(root) {
125
+ const path = join(resolve(root), ".zvec-grep", GRANT_FILE);
126
+ const document = await this.readDocument(path);
127
+ const key = await this.readSigningKey();
128
+ return {
129
+ path,
130
+ grants: document.grants.map(({ signature, ...grant }) => ({
131
+ ...grant,
132
+ valid: key ? this.verifyGrant({ ...grant, signature }, key) : false,
133
+ })),
134
+ };
135
+ }
136
+ async readDocument(path) {
137
+ const value = await readJsonFile(path, {
138
+ version: DOCUMENT_VERSION,
139
+ grants: [],
140
+ });
141
+ if (!isAuthorizationDocument(value)) {
142
+ return { version: DOCUMENT_VERSION, grants: [] };
143
+ }
144
+ return value;
145
+ }
146
+ async writeDocument(path, document) {
147
+ await writeJsonFile(path, document, {
148
+ directoryMode: 0o700,
149
+ fileMode: 0o600,
150
+ });
151
+ }
152
+ async withDocumentWrite(path, operation) {
153
+ const lock = acquireReadWriteLock(join(dirname(path), "authorization-store"), "write", { operation: "remote-embedding-authorization" });
154
+ try {
155
+ return await operation(await this.readDocument(path));
156
+ }
157
+ finally {
158
+ lock.release();
159
+ }
160
+ }
161
+ verifyGrant(grant, key) {
162
+ const { signature, ...unsigned } = grant;
163
+ const expected = sign(unsigned, key);
164
+ const actualBytes = Buffer.from(signature, "hex");
165
+ const expectedBytes = Buffer.from(expected, "hex");
166
+ return (actualBytes.length === expectedBytes.length &&
167
+ timingSafeEqual(actualBytes, expectedBytes));
168
+ }
169
+ async readSigningKey() {
170
+ try {
171
+ const value = (await readFile(this.signingKeyPath, "utf8")).trim();
172
+ return value ? Buffer.from(value, "hex") : undefined;
173
+ }
174
+ catch (error) {
175
+ if (error.code === "ENOENT")
176
+ return undefined;
177
+ throw error;
178
+ }
179
+ }
180
+ async getOrCreateSigningKey() {
181
+ const existing = await this.readSigningKey();
182
+ if (existing)
183
+ return existing;
184
+ await mkdir(dirname(this.signingKeyPath), { recursive: true, mode: 0o700 });
185
+ await chmod(dirname(this.signingKeyPath), 0o700);
186
+ const key = randomBytes(32);
187
+ try {
188
+ await writeFile(this.signingKeyPath, key.toString("hex"), {
189
+ encoding: "utf8",
190
+ mode: 0o600,
191
+ flag: "wx",
192
+ });
193
+ return key;
194
+ }
195
+ catch (error) {
196
+ if (error.code !== "EEXIST")
197
+ throw error;
198
+ const concurrent = await this.readSigningKey();
199
+ if (!concurrent)
200
+ throw error;
201
+ return concurrent;
202
+ }
203
+ }
204
+ }
205
+ function sign(value, key) {
206
+ return createHmac("sha256", key).update(stableStringify(value)).digest("hex");
207
+ }
208
+ function stableStringify(value) {
209
+ if (Array.isArray(value)) {
210
+ return `[${value.map(stableStringify).join(",")}]`;
211
+ }
212
+ if (value && typeof value === "object") {
213
+ const record = value;
214
+ return `{${Object.keys(record)
215
+ .sort()
216
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(record[key])}`)
217
+ .join(",")}}`;
218
+ }
219
+ return JSON.stringify(value);
220
+ }
221
+ function isAuthorizationDocument(value) {
222
+ if (!value || typeof value !== "object")
223
+ return false;
224
+ const document = value;
225
+ if (document.version !== DOCUMENT_VERSION ||
226
+ !Array.isArray(document.grants)) {
227
+ return false;
228
+ }
229
+ return document.grants.every(isWorkspaceGrant);
230
+ }
231
+ function isWorkspaceGrant(value) {
232
+ if (!value || typeof value !== "object")
233
+ return false;
234
+ const grant = value;
235
+ return (grant.version === DOCUMENT_VERSION &&
236
+ grant.capability === REMOTE_EMBEDDING_CAPABILITY &&
237
+ grant.scope === "workspace" &&
238
+ Array.isArray(grant.workspaceRoots) &&
239
+ grant.workspaceRoots.every((root) => typeof root === "string") &&
240
+ [
241
+ "id",
242
+ "workspaceFingerprint",
243
+ "provider",
244
+ "model",
245
+ "endpoint",
246
+ "targetFingerprint",
247
+ "signature",
248
+ ].every((key) => typeof grant[key] === "string") &&
249
+ typeof grant.grantedAt === "number");
250
+ }
251
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/authorization/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { RemoteEmbeddingTarget } from "./types.js";
2
+ export declare function canonicalizeWorkspaceRoots(roots: readonly string[]): Promise<string[]>;
3
+ export declare function workspaceFingerprint(roots: readonly string[]): string;
4
+ export declare function remoteEmbeddingTargetFingerprint(input: {
5
+ workspaceFingerprint: string;
6
+ provider: string;
7
+ model: string;
8
+ endpoint: string;
9
+ }): string;
10
+ export declare function createRemoteEmbeddingTarget(input: {
11
+ roots: readonly string[];
12
+ provider: string;
13
+ model: string;
14
+ endpoint: string;
15
+ }): Promise<RemoteEmbeddingTarget>;
@@ -0,0 +1,49 @@
1
+ import { createHash } from "node:crypto";
2
+ import { realpath } from "node:fs/promises";
3
+ import { resolve } from "node:path";
4
+ export async function canonicalizeWorkspaceRoots(roots) {
5
+ const canonical = await Promise.all(roots.map(async (root) => {
6
+ const absolute = resolve(root);
7
+ return await realpath(absolute).catch(() => absolute);
8
+ }));
9
+ return [...new Set(canonical)].sort();
10
+ }
11
+ export function workspaceFingerprint(roots) {
12
+ return sha256(JSON.stringify([...roots]));
13
+ }
14
+ export function remoteEmbeddingTargetFingerprint(input) {
15
+ return sha256(JSON.stringify([
16
+ input.workspaceFingerprint,
17
+ input.provider,
18
+ input.model,
19
+ input.endpoint,
20
+ ]));
21
+ }
22
+ export async function createRemoteEmbeddingTarget(input) {
23
+ const workspaceRoots = await canonicalizeWorkspaceRoots(input.roots);
24
+ if (workspaceRoots.length === 0) {
25
+ throw new Error("Remote Embedding authorization requires a workspace root.");
26
+ }
27
+ const endpoint = input.endpoint.trim();
28
+ if (endpoint.length === 0) {
29
+ throw new Error("Remote Embedding authorization requires an endpoint.");
30
+ }
31
+ const rootFingerprint = workspaceFingerprint(workspaceRoots);
32
+ return {
33
+ workspaceRoots,
34
+ workspaceFingerprint: rootFingerprint,
35
+ provider: input.provider,
36
+ model: input.model,
37
+ endpoint,
38
+ targetFingerprint: remoteEmbeddingTargetFingerprint({
39
+ workspaceFingerprint: rootFingerprint,
40
+ provider: input.provider,
41
+ model: input.model,
42
+ endpoint,
43
+ }),
44
+ };
45
+ }
46
+ function sha256(value) {
47
+ return createHash("sha256").update(value).digest("hex");
48
+ }
49
+ //# sourceMappingURL=target.js.map