@orquentra/codebuddy 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +42 -1090
  2. package/dist/chunk-3XYQGFPB.js +91 -0
  3. package/dist/chunk-3XYQGFPB.js.map +1 -0
  4. package/dist/chunk-4BYGTEJT.js +103 -0
  5. package/dist/chunk-4BYGTEJT.js.map +1 -0
  6. package/dist/{chunk-ITGRANYW.js → chunk-6MKEIDX5.js} +2 -2
  7. package/dist/{chunk-K63EOA4B.js → chunk-776EQXDV.js} +25 -6
  8. package/dist/chunk-776EQXDV.js.map +1 -0
  9. package/dist/{chunk-5OWZVZSO.js → chunk-CQPCHMBS.js} +8 -165
  10. package/dist/chunk-CQPCHMBS.js.map +1 -0
  11. package/dist/chunk-JDZ3VK26.js +4006 -0
  12. package/dist/chunk-JDZ3VK26.js.map +1 -0
  13. package/dist/chunk-JMWJ7V6Y.js +99 -0
  14. package/dist/chunk-JMWJ7V6Y.js.map +1 -0
  15. package/dist/chunk-KYK6RPAJ.js +99 -0
  16. package/dist/chunk-KYK6RPAJ.js.map +1 -0
  17. package/dist/{chunk-IBMJYIEP.js → chunk-L5AYZC3F.js} +7 -7
  18. package/dist/{chunk-3ZELDCR3.js → chunk-PCE4STAY.js} +7 -7
  19. package/dist/{chunk-TI5TQD6D.js → chunk-QDBDYCM2.js} +2 -2
  20. package/dist/{chunk-DSN5CEHO.js → chunk-ROQTT5ZO.js} +3 -3
  21. package/dist/{chunk-IE2OUO54.js → chunk-UFZD3JAA.js} +3 -3
  22. package/dist/chunk-Z5QB367W.js +5028 -0
  23. package/dist/chunk-Z5QB367W.js.map +1 -0
  24. package/dist/cli/index.js +2 -2
  25. package/dist/cloud-GP6G3EAK.js +17 -0
  26. package/dist/{codebuddy-D2xJ6hFk.d.ts → codebuddy-DM-i0Fu5.d.ts} +49 -18
  27. package/dist/{config-S2TULOMK.js → config-KFEHLV6W.js} +3 -3
  28. package/dist/index.d.ts +23 -3
  29. package/dist/index.js +34 -25
  30. package/dist/langgraph/index.d.ts +1 -1
  31. package/dist/lean-command-DA4ZNKG3.js +15 -0
  32. package/dist/local-3NGNESNB.js +13 -0
  33. package/dist/{main-ZZ3EQLYA.js → main-BDVQAGAS.js} +1261 -242
  34. package/dist/main-BDVQAGAS.js.map +1 -0
  35. package/dist/{memory-NIBFAMY4.js → memory-4RGVLPKG.js} +6 -6
  36. package/dist/operations-EQGOFCBD.js +24 -0
  37. package/dist/operations-EQGOFCBD.js.map +1 -0
  38. package/dist/{rerank-Q7MIFNKA.js → rerank-3P3C2UHN.js} +4 -4
  39. package/dist/{summaries-TSE44KUQ.js → summaries-ZBV5IN7Y.js} +6 -6
  40. package/dist/summaries-ZBV5IN7Y.js.map +1 -0
  41. package/dist/{zvec-F27AR357.js → zvec-MAPSJQSR.js} +3 -3
  42. package/dist/zvec-MAPSJQSR.js.map +1 -0
  43. package/package.json +7 -3
  44. package/dist/chunk-5OWZVZSO.js.map +0 -1
  45. package/dist/chunk-K63EOA4B.js.map +0 -1
  46. package/dist/chunk-SYHB3AMM.js +0 -8580
  47. package/dist/chunk-SYHB3AMM.js.map +0 -1
  48. package/dist/lean-command-D6TZJEFX.js +0 -13
  49. package/dist/main-ZZ3EQLYA.js.map +0 -1
  50. /package/dist/{chunk-ITGRANYW.js.map → chunk-6MKEIDX5.js.map} +0 -0
  51. /package/dist/{chunk-IBMJYIEP.js.map → chunk-L5AYZC3F.js.map} +0 -0
  52. /package/dist/{chunk-3ZELDCR3.js.map → chunk-PCE4STAY.js.map} +0 -0
  53. /package/dist/{chunk-TI5TQD6D.js.map → chunk-QDBDYCM2.js.map} +0 -0
  54. /package/dist/{chunk-DSN5CEHO.js.map → chunk-ROQTT5ZO.js.map} +0 -0
  55. /package/dist/{chunk-IE2OUO54.js.map → chunk-UFZD3JAA.js.map} +0 -0
  56. /package/dist/{config-S2TULOMK.js.map → cloud-GP6G3EAK.js.map} +0 -0
  57. /package/dist/{lean-command-D6TZJEFX.js.map → config-KFEHLV6W.js.map} +0 -0
  58. /package/dist/{summaries-TSE44KUQ.js.map → lean-command-DA4ZNKG3.js.map} +0 -0
  59. /package/dist/{zvec-F27AR357.js.map → local-3NGNESNB.js.map} +0 -0
  60. /package/dist/{memory-NIBFAMY4.js.map → memory-4RGVLPKG.js.map} +0 -0
  61. /package/dist/{rerank-Q7MIFNKA.js.map → rerank-3P3C2UHN.js.map} +0 -0
@@ -0,0 +1,99 @@
1
+ // src/providers/models.ts
2
+ var EMBEDDING_DIMENSIONS = 384;
3
+ var LOCAL_EMBEDDING_MODEL = {
4
+ id: "onnx-community/granite-embedding-small-english-r2-ONNX",
5
+ role: "primary",
6
+ kind: "embedding",
7
+ dimensions: EMBEDDING_DIMENSIONS,
8
+ revision: "1dc7835ba0cb9c76a3618d0bf0c427c97671b3c8",
9
+ schema: "transformers.js@4-q8-cls-l2",
10
+ supportsBatch: true,
11
+ relevanceFloor: 0.81
12
+ };
13
+ var DEFAULT_RERANK_MODELS = {
14
+ local: {
15
+ id: "mixedbread-ai/mxbai-rerank-xsmall-v1",
16
+ revision: "b5c6e9da73abc3711f593f705371cdbe9e0fe422"
17
+ },
18
+ huggingface: { id: "BAAI/bge-reranker-v2-m3" },
19
+ openrouter: { id: "cohere/rerank-v3.5" }
20
+ };
21
+ var DEFAULT_CLOUD_EMBEDDING_MODELS = {
22
+ huggingface: "sentence-transformers/all-MiniLM-L6-v2",
23
+ openrouter: "openai/text-embedding-3-small"
24
+ };
25
+ var DEFAULT_EMBEDDING_MODELS = [
26
+ {
27
+ id: "sentence-transformers/all-MiniLM-L6-v2",
28
+ role: "primary",
29
+ kind: "embedding",
30
+ dimensions: EMBEDDING_DIMENSIONS,
31
+ dailyCallBudget: 1e3,
32
+ supportsBatch: true,
33
+ relevanceFloor: 0.42
34
+ },
35
+ {
36
+ id: "BAAI/bge-small-en-v1.5",
37
+ role: "fallback",
38
+ kind: "embedding",
39
+ dimensions: EMBEDDING_DIMENSIONS,
40
+ dailyCallBudget: 1e3,
41
+ supportsBatch: true,
42
+ relevanceFloor: 0.69
43
+ }
44
+ ];
45
+ var DEFAULT_LLM_MODELS = [
46
+ {
47
+ id: "meta-llama/Llama-3.2-3B-Instruct",
48
+ role: "primary",
49
+ kind: "llm",
50
+ contextWindow: 131072,
51
+ dailyCallBudget: 300
52
+ },
53
+ {
54
+ id: "Qwen/Qwen2.5-7B-Instruct",
55
+ role: "fallback",
56
+ kind: "llm",
57
+ contextWindow: 32768,
58
+ dailyCallBudget: 300
59
+ },
60
+ {
61
+ id: "mistralai/Mistral-7B-Instruct-v0.3",
62
+ role: "last_resort",
63
+ kind: "llm",
64
+ contextWindow: 32768,
65
+ dailyCallBudget: 300
66
+ }
67
+ ];
68
+ var MODEL_REGISTRY = [
69
+ LOCAL_EMBEDDING_MODEL,
70
+ ...DEFAULT_EMBEDDING_MODELS,
71
+ ...DEFAULT_LLM_MODELS
72
+ ];
73
+ function getModelDefinition(modelId) {
74
+ return MODEL_REGISTRY.find((model) => model.id === modelId);
75
+ }
76
+ function getModelContextWindow(modelId) {
77
+ return getModelDefinition(modelId)?.contextWindow;
78
+ }
79
+ function assertCompatibleEmbeddingModels(models) {
80
+ const mismatchedModel = models.find((model) => model.dimensions !== EMBEDDING_DIMENSIONS);
81
+ if (mismatchedModel) {
82
+ throw new Error(
83
+ `Embedding model ${mismatchedModel.id} has ${mismatchedModel.dimensions ?? "unknown"} dimensions; expected ${EMBEDDING_DIMENSIONS}.`
84
+ );
85
+ }
86
+ }
87
+
88
+ export {
89
+ EMBEDDING_DIMENSIONS,
90
+ LOCAL_EMBEDDING_MODEL,
91
+ DEFAULT_RERANK_MODELS,
92
+ DEFAULT_CLOUD_EMBEDDING_MODELS,
93
+ DEFAULT_EMBEDDING_MODELS,
94
+ DEFAULT_LLM_MODELS,
95
+ getModelDefinition,
96
+ getModelContextWindow,
97
+ assertCompatibleEmbeddingModels
98
+ };
99
+ //# sourceMappingURL=chunk-JMWJ7V6Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/models.ts"],"sourcesContent":["export type ModelRole = \"primary\" | \"fallback\" | \"last_resort\";\nexport type ModelKind = \"embedding\" | \"llm\";\n\nexport type ModelDefinition = {\n id: string;\n role: ModelRole;\n kind: ModelKind;\n dimensions?: number;\n /** Actual deployment revision metadata; this does not pin Hugging Face requests. */\n revision?: string;\n schema?: string;\n contextWindow?: number;\n dailyCallBudget?: number;\n supportsBatch?: boolean;\n /**\n * Cosine at or above which a memory counts as semantically relevant to a\n * task on its own (without a shared word or path). Calibrated per model by\n * `npm run eval:semantic`; cosines are not comparable across models.\n */\n relevanceFloor?: number;\n};\n\nexport const EMBEDDING_DIMENSIONS = 384;\n\n/**\n * Default local embedder (ONNX via transformers.js, no network after the first\n * download): ModernBERT-based, 384-d, 8k context, trained on code retrieval.\n * The revision is a pinned commit so the embedding space never drifts.\n */\nexport const LOCAL_EMBEDDING_MODEL = {\n id: \"onnx-community/granite-embedding-small-english-r2-ONNX\",\n role: \"primary\",\n kind: \"embedding\",\n dimensions: EMBEDDING_DIMENSIONS,\n revision: \"1dc7835ba0cb9c76a3618d0bf0c427c97671b3c8\",\n schema: \"transformers.js@4-q8-cls-l2\",\n supportsBatch: true,\n relevanceFloor: 0.81,\n} satisfies ModelDefinition;\n\n/**\n * Cross-encoder rerankers per `rerank.provider` (off by default: on\n * `npm run eval:semantic` none beat granite's dense order). The local default\n * was the best small one measured (13/20 first results, ~20 ms per prompt).\n */\nexport const DEFAULT_RERANK_MODELS = {\n local: {\n id: \"mixedbread-ai/mxbai-rerank-xsmall-v1\",\n revision: \"b5c6e9da73abc3711f593f705371cdbe9e0fe422\",\n },\n huggingface: { id: \"BAAI/bge-reranker-v2-m3\" },\n openrouter: { id: \"cohere/rerank-v3.5\" },\n} as const;\n\n/** Default hosted embedders; each must return 384-d vectors. */\nexport const DEFAULT_CLOUD_EMBEDDING_MODELS = {\n huggingface: \"sentence-transformers/all-MiniLM-L6-v2\",\n openrouter: \"openai/text-embedding-3-small\",\n} as const;\n\nexport const DEFAULT_EMBEDDING_MODELS = [\n {\n id: \"sentence-transformers/all-MiniLM-L6-v2\",\n role: \"primary\",\n kind: \"embedding\",\n dimensions: EMBEDDING_DIMENSIONS,\n dailyCallBudget: 1_000,\n supportsBatch: true,\n relevanceFloor: 0.42,\n },\n {\n id: \"BAAI/bge-small-en-v1.5\",\n role: \"fallback\",\n kind: \"embedding\",\n dimensions: EMBEDDING_DIMENSIONS,\n dailyCallBudget: 1_000,\n supportsBatch: true,\n relevanceFloor: 0.69,\n },\n] satisfies ModelDefinition[];\n\nexport const DEFAULT_LLM_MODELS = [\n {\n id: \"meta-llama/Llama-3.2-3B-Instruct\",\n role: \"primary\",\n kind: \"llm\",\n contextWindow: 131_072,\n dailyCallBudget: 300,\n },\n {\n id: \"Qwen/Qwen2.5-7B-Instruct\",\n role: \"fallback\",\n kind: \"llm\",\n contextWindow: 32_768,\n dailyCallBudget: 300,\n },\n {\n id: \"mistralai/Mistral-7B-Instruct-v0.3\",\n role: \"last_resort\",\n kind: \"llm\",\n contextWindow: 32_768,\n dailyCallBudget: 300,\n },\n] satisfies ModelDefinition[];\n\nexport const MODEL_REGISTRY: ModelDefinition[] = [\n LOCAL_EMBEDDING_MODEL,\n ...DEFAULT_EMBEDDING_MODELS,\n ...DEFAULT_LLM_MODELS,\n];\n\nexport function getModelDefinition(modelId: string): ModelDefinition | undefined {\n return MODEL_REGISTRY.find((model) => model.id === modelId);\n}\n\nexport function getModelContextWindow(modelId: string): number | undefined {\n return getModelDefinition(modelId)?.contextWindow;\n}\n\nexport function assertCompatibleEmbeddingModels(models: ModelDefinition[]): void {\n const mismatchedModel = models.find((model) => model.dimensions !== EMBEDDING_DIMENSIONS);\n\n if (mismatchedModel) {\n throw new Error(\n `Embedding model ${mismatchedModel.id} has ${mismatchedModel.dimensions ?? \"unknown\"} dimensions; expected ${EMBEDDING_DIMENSIONS}.`,\n );\n }\n}\n"],"mappings":";AAsBO,IAAM,uBAAuB;AAO7B,IAAM,wBAAwB;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,gBAAgB;AAClB;AAOO,IAAM,wBAAwB;AAAA,EACnC,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,EACZ;AAAA,EACA,aAAa,EAAE,IAAI,0BAA0B;AAAA,EAC7C,YAAY,EAAE,IAAI,qBAAqB;AACzC;AAGO,IAAM,iCAAiC;AAAA,EAC5C,aAAa;AAAA,EACb,YAAY;AACd;AAEO,IAAM,2BAA2B;AAAA,EACtC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB;AACF;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AACF;AAEO,IAAM,iBAAoC;AAAA,EAC/C;AAAA,EACA,GAAG;AAAA,EACH,GAAG;AACL;AAEO,SAAS,mBAAmB,SAA8C;AAC/E,SAAO,eAAe,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO;AAC5D;AAEO,SAAS,sBAAsB,SAAqC;AACzE,SAAO,mBAAmB,OAAO,GAAG;AACtC;AAEO,SAAS,gCAAgC,QAAiC;AAC/E,QAAM,kBAAkB,OAAO,KAAK,CAAC,UAAU,MAAM,eAAe,oBAAoB;AAExF,MAAI,iBAAiB;AACnB,UAAM,IAAI;AAAA,MACR,mBAAmB,gBAAgB,EAAE,QAAQ,gBAAgB,cAAc,SAAS,yBAAyB,oBAAoB;AAAA,IACnI;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,99 @@
1
+ import {
2
+ EMBEDDING_DIMENSIONS
3
+ } from "./chunk-JMWJ7V6Y.js";
4
+
5
+ // src/providers/cloud.ts
6
+ var OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
7
+ var HF_ROUTER_BASE_URL = "https://router.huggingface.co/hf-inference/models";
8
+ async function postJson(url, apiKey, body, timeoutMs) {
9
+ const response = await fetch(url, {
10
+ method: "POST",
11
+ headers: { authorization: `Bearer ${apiKey}`, "content-type": "application/json" },
12
+ body: JSON.stringify(body),
13
+ signal: AbortSignal.timeout(timeoutMs)
14
+ });
15
+ const text = await response.text();
16
+ if (!response.ok) {
17
+ let message = text.slice(0, 200);
18
+ try {
19
+ const parsed = JSON.parse(text);
20
+ message = typeof parsed.error === "string" ? parsed.error : parsed.error?.message ?? message;
21
+ } catch {
22
+ }
23
+ throw new Error(
24
+ `${new URL(url).host} returned ${response.status}: ${message.split(apiKey).join("[REDACTED]")}`
25
+ );
26
+ }
27
+ return JSON.parse(text);
28
+ }
29
+ var OpenRouterEmbeddingProvider = class {
30
+ constructor(options) {
31
+ this.options = options;
32
+ this.space = {
33
+ model: options.model,
34
+ revision: "hosted",
35
+ schema: `openrouter-embeddings-d${EMBEDDING_DIMENSIONS}`,
36
+ dimensions: EMBEDDING_DIMENSIONS
37
+ };
38
+ }
39
+ options;
40
+ space;
41
+ async embed(request) {
42
+ const input = typeof request.input === "string" ? [request.input] : request.input;
43
+ const json = await postJson(
44
+ `${this.options.baseUrl ?? OPENROUTER_BASE_URL}/embeddings`,
45
+ this.options.apiKey,
46
+ { model: this.space.model, input, dimensions: EMBEDDING_DIMENSIONS },
47
+ this.options.timeoutMs ?? 1e4
48
+ );
49
+ const rows = [...json.data ?? []].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
50
+ const vectors = rows.map((row) => row.embedding ?? []);
51
+ const width = vectors[0]?.length ?? 0;
52
+ if (vectors.length !== input.length || width !== EMBEDDING_DIMENSIONS) {
53
+ throw new Error(
54
+ `OpenRouter model ${this.space.model} returned ${vectors.length} vector(s) of ${width} dimensions; CodeBuddy stores ${EMBEDDING_DIMENSIONS}. Pick a model that supports \`dimensions: ${EMBEDDING_DIMENSIONS}\` (for example openai/text-embedding-3-small).`
55
+ );
56
+ }
57
+ return { ...this.space, vectors };
58
+ }
59
+ async generateText() {
60
+ throw new Error("The OpenRouter embedding provider only embeds.");
61
+ }
62
+ };
63
+ async function rerankOpenRouter(options, query, documents) {
64
+ const json = await postJson(
65
+ `${options.baseUrl ?? OPENROUTER_BASE_URL}/rerank`,
66
+ options.apiKey,
67
+ { model: options.model, query, documents, top_n: documents.length },
68
+ options.timeoutMs ?? 2e3
69
+ );
70
+ const scores = documents.map(() => Number.NEGATIVE_INFINITY);
71
+ for (const result of json.results ?? []) {
72
+ if (result.index >= 0 && result.index < scores.length)
73
+ scores[result.index] = result.relevance_score;
74
+ }
75
+ return scores;
76
+ }
77
+ async function rerankHuggingFace(options, query, documents) {
78
+ const json = await postJson(
79
+ `${options.baseUrl ?? HF_ROUTER_BASE_URL}/${options.model}`,
80
+ options.apiKey,
81
+ { inputs: documents.map((document) => ({ text: query, text_pair: document })) },
82
+ options.timeoutMs ?? 2e3
83
+ );
84
+ if (!Array.isArray(json) || json.length !== documents.length) {
85
+ throw new Error(`Hugging Face reranker ${options.model} returned an unexpected shape.`);
86
+ }
87
+ return json.map(
88
+ (item) => (Array.isArray(item) ? item[0]?.score : item.score) ?? Number.NEGATIVE_INFINITY
89
+ );
90
+ }
91
+
92
+ export {
93
+ OPENROUTER_BASE_URL,
94
+ HF_ROUTER_BASE_URL,
95
+ OpenRouterEmbeddingProvider,
96
+ rerankOpenRouter,
97
+ rerankHuggingFace
98
+ };
99
+ //# sourceMappingURL=chunk-KYK6RPAJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/cloud.ts"],"sourcesContent":["import type {\n EmbeddingRequest,\n EmbeddingResponse,\n ModelProvider,\n TextGenerationResponse,\n} from \"./adapter.js\";\nimport type { EmbeddingSpace } from \"./embedding-space.js\";\nimport { EMBEDDING_DIMENSIONS } from \"./models.js\";\n\n/**\n * Hosted alternatives to the local models. Keys come from the environment\n * (OPENROUTER_API_KEY, HF_TOKEN) and never appear in errors.\n */\n\nexport const OPENROUTER_BASE_URL = \"https://openrouter.ai/api/v1\";\nexport const HF_ROUTER_BASE_URL = \"https://router.huggingface.co/hf-inference/models\";\n\n/** Fetch JSON with a timeout; an error names the status and the provider's message, never the key. */\nasync function postJson(\n url: string,\n apiKey: string,\n body: unknown,\n timeoutMs: number,\n): Promise<unknown> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { authorization: `Bearer ${apiKey}`, \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n });\n const text = await response.text();\n if (!response.ok) {\n let message = text.slice(0, 200);\n try {\n const parsed = JSON.parse(text) as { error?: string | { message?: string } };\n message =\n typeof parsed.error === \"string\" ? parsed.error : (parsed.error?.message ?? message);\n } catch {\n // Not JSON: keep the raw excerpt.\n }\n throw new Error(\n `${new URL(url).host} returned ${response.status}: ${message.split(apiKey).join(\"[REDACTED]\")}`,\n );\n }\n return JSON.parse(text);\n}\n\n/**\n * OpenRouter's OpenAI-compatible embeddings endpoint, asking for 384\n * dimensions (Matryoshka models such as openai/text-embedding-3-small honour\n * it). A model that cannot return 384-d vectors fails with a clear message.\n */\nexport class OpenRouterEmbeddingProvider implements ModelProvider {\n readonly space: EmbeddingSpace;\n\n constructor(\n private readonly options: {\n apiKey: string;\n model: string;\n baseUrl?: string;\n timeoutMs?: number;\n },\n ) {\n this.space = {\n model: options.model,\n revision: \"hosted\",\n schema: `openrouter-embeddings-d${EMBEDDING_DIMENSIONS}`,\n dimensions: EMBEDDING_DIMENSIONS,\n };\n }\n\n async embed(request: EmbeddingRequest): Promise<EmbeddingResponse> {\n const input = typeof request.input === \"string\" ? [request.input] : request.input;\n const json = (await postJson(\n `${this.options.baseUrl ?? OPENROUTER_BASE_URL}/embeddings`,\n this.options.apiKey,\n { model: this.space.model, input, dimensions: EMBEDDING_DIMENSIONS },\n this.options.timeoutMs ?? 10_000,\n )) as { data?: Array<{ index?: number; embedding?: number[] }> };\n const rows = [...(json.data ?? [])].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n const vectors = rows.map((row) => row.embedding ?? []);\n const width = vectors[0]?.length ?? 0;\n if (vectors.length !== input.length || width !== EMBEDDING_DIMENSIONS) {\n throw new Error(\n `OpenRouter model ${this.space.model} returned ${vectors.length} vector(s) of ${width} dimensions; ` +\n `CodeBuddy stores ${EMBEDDING_DIMENSIONS}. Pick a model that supports \\`dimensions: ${EMBEDDING_DIMENSIONS}\\` (for example openai/text-embedding-3-small).`,\n );\n }\n return { ...this.space, vectors };\n }\n\n async generateText(): Promise<TextGenerationResponse> {\n throw new Error(\"The OpenRouter embedding provider only embeds.\");\n }\n}\n\n/** OpenRouter `/rerank` (Cohere format): relevance score per document, in input order. */\nexport async function rerankOpenRouter(\n options: { apiKey: string; model: string; baseUrl?: string; timeoutMs?: number },\n query: string,\n documents: string[],\n): Promise<number[]> {\n const json = (await postJson(\n `${options.baseUrl ?? OPENROUTER_BASE_URL}/rerank`,\n options.apiKey,\n { model: options.model, query, documents, top_n: documents.length },\n options.timeoutMs ?? 2_000,\n )) as { results?: Array<{ index: number; relevance_score: number }> };\n const scores = documents.map(() => Number.NEGATIVE_INFINITY);\n for (const result of json.results ?? []) {\n if (result.index >= 0 && result.index < scores.length)\n scores[result.index] = result.relevance_score;\n }\n return scores;\n}\n\n/**\n * Hugging Face Inference (text-classification over query/document pairs) for\n * cross-encoders such as BAAI/bge-reranker-v2-m3. Accepts either one\n * `{score}` per pair or a `[{label, score}]` list per pair.\n */\nexport async function rerankHuggingFace(\n options: { apiKey: string; model: string; baseUrl?: string; timeoutMs?: number },\n query: string,\n documents: string[],\n): Promise<number[]> {\n const json = (await postJson(\n `${options.baseUrl ?? HF_ROUTER_BASE_URL}/${options.model}`,\n options.apiKey,\n { inputs: documents.map((document) => ({ text: query, text_pair: document })) },\n options.timeoutMs ?? 2_000,\n )) as Array<{ score?: number } | Array<{ score?: number }>>;\n if (!Array.isArray(json) || json.length !== documents.length) {\n throw new Error(`Hugging Face reranker ${options.model} returned an unexpected shape.`);\n }\n return json.map(\n (item) => (Array.isArray(item) ? item[0]?.score : item.score) ?? Number.NEGATIVE_INFINITY,\n );\n}\n"],"mappings":"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","names":[]}
@@ -6,7 +6,7 @@ import {
6
6
  assertNoSymlinkBetween,
7
7
  readConfigFile,
8
8
  writeAtomic
9
- } from "./chunk-K63EOA4B.js";
9
+ } from "./chunk-776EQXDV.js";
10
10
 
11
11
  // src/map/indexer.ts
12
12
  import { readdir, readFile, stat } from "fs/promises";
@@ -1077,10 +1077,10 @@ async function discoverTaskPaths(repositoryRoot, task, manifest, mapSource, opti
1077
1077
  async function withLlmSummaries(repositoryRoot, manifest) {
1078
1078
  const entries = Object.values(manifest.entries);
1079
1079
  try {
1080
- const { resolveLlmConfig } = await import("./config-S2TULOMK.js");
1080
+ const { resolveLlmConfig } = await import("./config-KFEHLV6W.js");
1081
1081
  const config = await resolveLlmConfig(repositoryRoot);
1082
1082
  if (!config.enabled || !config.features.summaries) return entries;
1083
- const { loadLlmSummaries } = await import("./summaries-TSE44KUQ.js");
1083
+ const { loadLlmSummaries } = await import("./summaries-ZBV5IN7Y.js");
1084
1084
  const summaries = await loadLlmSummaries(repositoryRoot, manifest);
1085
1085
  if (summaries.size === 0) return entries;
1086
1086
  return entries.map((entry) => {
@@ -1132,7 +1132,7 @@ async function rankTaskFiles(repositoryRoot, task, manifest, mapSource, options)
1132
1132
  reason: "semantic retrieval off",
1133
1133
  stale: 0,
1134
1134
  changed: 0
1135
- } : await import("./zvec-F27AR357.js").then(({ zvecCandidates }) => zvecCandidates(repositoryRoot, task)).catch(
1135
+ } : await import("./zvec-MAPSJQSR.js").then(({ zvecCandidates }) => zvecCandidates(repositoryRoot, task)).catch(
1136
1136
  () => ({
1137
1137
  status: "failed",
1138
1138
  paths: [],
@@ -1232,7 +1232,7 @@ var MIN_RERANK_MS = 200;
1232
1232
  async function llmRerank(input) {
1233
1233
  let config;
1234
1234
  try {
1235
- config = await (await import("./config-S2TULOMK.js")).resolveLlmConfig(input.repositoryRoot);
1235
+ config = await (await import("./config-KFEHLV6W.js")).resolveLlmConfig(input.repositoryRoot);
1236
1236
  } catch {
1237
1237
  return null;
1238
1238
  }
@@ -1257,7 +1257,7 @@ async function llmRerank(input) {
1257
1257
  input.deadlineAt === void 0 ? config.timeoutMs : input.deadlineAt - Date.now()
1258
1258
  );
1259
1259
  if (deadlineMs < MIN_RERANK_MS) return skipped("no time left in the hook budget");
1260
- const { rerankCandidates } = await import("./rerank-Q7MIFNKA.js");
1260
+ const { rerankCandidates } = await import("./rerank-3P3C2UHN.js");
1261
1261
  const result = await rerankCandidates(
1262
1262
  input.repositoryRoot,
1263
1263
  config,
@@ -1575,4 +1575,4 @@ export {
1575
1575
  namedSegments,
1576
1576
  loadProjectArchitectureMap
1577
1577
  };
1578
- //# sourceMappingURL=chunk-IBMJYIEP.js.map
1578
+ //# sourceMappingURL=chunk-L5AYZC3F.js.map
@@ -1,23 +1,23 @@
1
+ import {
2
+ chatJson
3
+ } from "./chunk-UFZD3JAA.js";
1
4
  import {
2
5
  NON_SOURCE_PATH,
3
6
  TEST_PATH,
4
7
  loadFreshIndex,
5
8
  loadProjectArchitectureMap,
6
9
  readBoundedSource
7
- } from "./chunk-IBMJYIEP.js";
8
- import {
9
- chatJson
10
- } from "./chunk-IE2OUO54.js";
10
+ } from "./chunk-L5AYZC3F.js";
11
11
  import {
12
12
  redactSensitive,
13
13
  scanSensitive
14
14
  } from "./chunk-GDJH7XJC.js";
15
15
  import {
16
16
  resolveLlmConfig
17
- } from "./chunk-ITGRANYW.js";
17
+ } from "./chunk-6MKEIDX5.js";
18
18
  import {
19
19
  writeAtomic
20
- } from "./chunk-K63EOA4B.js";
20
+ } from "./chunk-776EQXDV.js";
21
21
 
22
22
  // src/llm/summaries.ts
23
23
  import { mkdir, readFile } from "fs/promises";
@@ -201,4 +201,4 @@ export {
201
201
  loadLlmSummaries,
202
202
  summarizeRepository
203
203
  };
204
- //# sourceMappingURL=chunk-3ZELDCR3.js.map
204
+ //# sourceMappingURL=chunk-PCE4STAY.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  readConfigFile,
3
3
  writeAtomic
4
- } from "./chunk-K63EOA4B.js";
4
+ } from "./chunk-776EQXDV.js";
5
5
 
6
6
  // src/retrieval/zvec.ts
7
7
  import { execFile, spawn } from "child_process";
@@ -321,4 +321,4 @@ export {
321
321
  zvecStatus,
322
322
  buildZvecIndex
323
323
  };
324
- //# sourceMappingURL=chunk-TI5TQD6D.js.map
324
+ //# sourceMappingURL=chunk-QDBDYCM2.js.map
@@ -8,7 +8,7 @@ import {
8
8
  detectTestCommand,
9
9
  estimateTokens,
10
10
  findCoveringTest
11
- } from "./chunk-5OWZVZSO.js";
11
+ } from "./chunk-CQPCHMBS.js";
12
12
  import {
13
13
  NON_SOURCE_PATH,
14
14
  discoverTaskPaths,
@@ -16,7 +16,7 @@ import {
16
16
  loadProjectArchitectureMap,
17
17
  readBoundedSource,
18
18
  taskTerms
19
- } from "./chunk-IBMJYIEP.js";
19
+ } from "./chunk-L5AYZC3F.js";
20
20
 
21
21
  // src/hooks/lean.ts
22
22
  import { createHash } from "crypto";
@@ -172,4 +172,4 @@ export {
172
172
  renderLeanBlock,
173
173
  runLeanHookCommand
174
174
  };
175
- //# sourceMappingURL=chunk-DSN5CEHO.js.map
175
+ //# sourceMappingURL=chunk-ROQTT5ZO.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  redactLlmKeys
3
- } from "./chunk-ITGRANYW.js";
3
+ } from "./chunk-6MKEIDX5.js";
4
4
  import {
5
5
  writeAtomic
6
- } from "./chunk-K63EOA4B.js";
6
+ } from "./chunk-776EQXDV.js";
7
7
 
8
8
  // src/llm/budget.ts
9
9
  import { mkdir, readFile } from "fs/promises";
@@ -196,4 +196,4 @@ export {
196
196
  coolingDown,
197
197
  chatJson
198
198
  };
199
- //# sourceMappingURL=chunk-IE2OUO54.js.map
199
+ //# sourceMappingURL=chunk-UFZD3JAA.js.map