@orquentra/codebuddy 2.4.1 → 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.
- package/README.md +17 -2
- package/dist/chunk-3XYQGFPB.js +91 -0
- package/dist/chunk-3XYQGFPB.js.map +1 -0
- package/dist/chunk-4BYGTEJT.js +103 -0
- package/dist/chunk-4BYGTEJT.js.map +1 -0
- package/dist/{chunk-ITGRANYW.js → chunk-6MKEIDX5.js} +2 -2
- package/dist/{chunk-K63EOA4B.js → chunk-776EQXDV.js} +25 -6
- package/dist/chunk-776EQXDV.js.map +1 -0
- package/dist/{chunk-5OWZVZSO.js → chunk-CQPCHMBS.js} +8 -165
- package/dist/chunk-CQPCHMBS.js.map +1 -0
- package/dist/chunk-JDZ3VK26.js +4006 -0
- package/dist/chunk-JDZ3VK26.js.map +1 -0
- package/dist/chunk-JMWJ7V6Y.js +99 -0
- package/dist/chunk-JMWJ7V6Y.js.map +1 -0
- package/dist/chunk-KYK6RPAJ.js +99 -0
- package/dist/chunk-KYK6RPAJ.js.map +1 -0
- package/dist/{chunk-IBMJYIEP.js → chunk-L5AYZC3F.js} +7 -7
- package/dist/{chunk-3ZELDCR3.js → chunk-PCE4STAY.js} +7 -7
- package/dist/{chunk-TI5TQD6D.js → chunk-QDBDYCM2.js} +2 -2
- package/dist/{chunk-DSN5CEHO.js → chunk-ROQTT5ZO.js} +3 -3
- package/dist/{chunk-IE2OUO54.js → chunk-UFZD3JAA.js} +3 -3
- package/dist/chunk-Z5QB367W.js +5028 -0
- package/dist/chunk-Z5QB367W.js.map +1 -0
- package/dist/cli/index.js +2 -2
- package/dist/cloud-GP6G3EAK.js +17 -0
- package/dist/{codebuddy-D2xJ6hFk.d.ts → codebuddy-DM-i0Fu5.d.ts} +49 -18
- package/dist/{config-S2TULOMK.js → config-KFEHLV6W.js} +3 -3
- package/dist/index.d.ts +23 -3
- package/dist/index.js +34 -25
- package/dist/langgraph/index.d.ts +1 -1
- package/dist/lean-command-DA4ZNKG3.js +15 -0
- package/dist/local-3NGNESNB.js +13 -0
- package/dist/{main-BFDVQHKO.js → main-BDVQAGAS.js} +1261 -242
- package/dist/main-BDVQAGAS.js.map +1 -0
- package/dist/{memory-NIBFAMY4.js → memory-4RGVLPKG.js} +6 -6
- package/dist/operations-EQGOFCBD.js +24 -0
- package/dist/operations-EQGOFCBD.js.map +1 -0
- package/dist/{rerank-Q7MIFNKA.js → rerank-3P3C2UHN.js} +4 -4
- package/dist/{summaries-TSE44KUQ.js → summaries-ZBV5IN7Y.js} +6 -6
- package/dist/summaries-ZBV5IN7Y.js.map +1 -0
- package/dist/{zvec-F27AR357.js → zvec-MAPSJQSR.js} +3 -3
- package/dist/zvec-MAPSJQSR.js.map +1 -0
- package/package.json +6 -2
- package/dist/chunk-5OWZVZSO.js.map +0 -1
- package/dist/chunk-K63EOA4B.js.map +0 -1
- package/dist/chunk-OLFCOR4U.js +0 -8580
- package/dist/chunk-OLFCOR4U.js.map +0 -1
- package/dist/lean-command-D6TZJEFX.js +0 -13
- package/dist/main-BFDVQHKO.js.map +0 -1
- /package/dist/{chunk-ITGRANYW.js.map → chunk-6MKEIDX5.js.map} +0 -0
- /package/dist/{chunk-IBMJYIEP.js.map → chunk-L5AYZC3F.js.map} +0 -0
- /package/dist/{chunk-3ZELDCR3.js.map → chunk-PCE4STAY.js.map} +0 -0
- /package/dist/{chunk-TI5TQD6D.js.map → chunk-QDBDYCM2.js.map} +0 -0
- /package/dist/{chunk-DSN5CEHO.js.map → chunk-ROQTT5ZO.js.map} +0 -0
- /package/dist/{chunk-IE2OUO54.js.map → chunk-UFZD3JAA.js.map} +0 -0
- /package/dist/{config-S2TULOMK.js.map → cloud-GP6G3EAK.js.map} +0 -0
- /package/dist/{lean-command-D6TZJEFX.js.map → config-KFEHLV6W.js.map} +0 -0
- /package/dist/{summaries-TSE44KUQ.js.map → lean-command-DA4ZNKG3.js.map} +0 -0
- /package/dist/{zvec-F27AR357.js.map → local-3NGNESNB.js.map} +0 -0
- /package/dist/{memory-NIBFAMY4.js.map → memory-4RGVLPKG.js.map} +0 -0
- /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":";;;;;AAcO,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAGlC,eAAe,SACb,KACA,QACA,MACA,WACkB;AAClB,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR,SAAS,EAAE,eAAe,UAAU,MAAM,IAAI,gBAAgB,mBAAmB;AAAA,IACjF,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,YAAY,QAAQ,SAAS;AAAA,EACvC,CAAC;AACD,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,SAAS,IAAI;AAChB,QAAI,UAAU,KAAK,MAAM,GAAG,GAAG;AAC/B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,gBACE,OAAO,OAAO,UAAU,WAAW,OAAO,QAAS,OAAO,OAAO,WAAW;AAAA,IAChF,QAAQ;AAAA,IAER;AACA,UAAM,IAAI;AAAA,MACR,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,aAAa,SAAS,MAAM,KAAK,QAAQ,MAAM,MAAM,EAAE,KAAK,YAAY,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,SAAO,KAAK,MAAM,IAAI;AACxB;AAOO,IAAM,8BAAN,MAA2D;AAAA,EAGhE,YACmB,SAMjB;AANiB;AAOjB,SAAK,QAAQ;AAAA,MACX,OAAO,QAAQ;AAAA,MACf,UAAU;AAAA,MACV,QAAQ,0BAA0B,oBAAoB;AAAA,MACtD,YAAY;AAAA,IACd;AAAA,EACF;AAAA,EAbmB;AAAA,EAHV;AAAA,EAkBT,MAAM,MAAM,SAAuD;AACjE,UAAM,QAAQ,OAAO,QAAQ,UAAU,WAAW,CAAC,QAAQ,KAAK,IAAI,QAAQ;AAC5E,UAAM,OAAQ,MAAM;AAAA,MAClB,GAAG,KAAK,QAAQ,WAAW,mBAAmB;AAAA,MAC9C,KAAK,QAAQ;AAAA,MACb,EAAE,OAAO,KAAK,MAAM,OAAO,OAAO,YAAY,qBAAqB;AAAA,MACnE,KAAK,QAAQ,aAAa;AAAA,IAC5B;AACA,UAAM,OAAO,CAAC,GAAI,KAAK,QAAQ,CAAC,CAAE,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AAClF,UAAM,UAAU,KAAK,IAAI,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC;AACrD,UAAM,QAAQ,QAAQ,CAAC,GAAG,UAAU;AACpC,QAAI,QAAQ,WAAW,MAAM,UAAU,UAAU,sBAAsB;AACrE,YAAM,IAAI;AAAA,QACR,oBAAoB,KAAK,MAAM,KAAK,aAAa,QAAQ,MAAM,iBAAiB,KAAK,iCAC/D,oBAAoB,8CAA8C,oBAAoB;AAAA,MAC9G;AAAA,IACF;AACA,WAAO,EAAE,GAAG,KAAK,OAAO,QAAQ;AAAA,EAClC;AAAA,EAEA,MAAM,eAAgD;AACpD,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACF;AAGA,eAAsB,iBACpB,SACA,OACA,WACmB;AACnB,QAAM,OAAQ,MAAM;AAAA,IAClB,GAAG,QAAQ,WAAW,mBAAmB;AAAA,IACzC,QAAQ;AAAA,IACR,EAAE,OAAO,QAAQ,OAAO,OAAO,WAAW,OAAO,UAAU,OAAO;AAAA,IAClE,QAAQ,aAAa;AAAA,EACvB;AACA,QAAM,SAAS,UAAU,IAAI,MAAM,OAAO,iBAAiB;AAC3D,aAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AACvC,QAAI,OAAO,SAAS,KAAK,OAAO,QAAQ,OAAO;AAC7C,aAAO,OAAO,KAAK,IAAI,OAAO;AAAA,EAClC;AACA,SAAO;AACT;AAOA,eAAsB,kBACpB,SACA,OACA,WACmB;AACnB,QAAM,OAAQ,MAAM;AAAA,IAClB,GAAG,QAAQ,WAAW,kBAAkB,IAAI,QAAQ,KAAK;AAAA,IACzD,QAAQ;AAAA,IACR,EAAE,QAAQ,UAAU,IAAI,CAAC,cAAc,EAAE,MAAM,OAAO,WAAW,SAAS,EAAE,EAAE;AAAA,IAC9E,QAAQ,aAAa;AAAA,EACvB;AACA,MAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,UAAU,QAAQ;AAC5D,UAAM,IAAI,MAAM,yBAAyB,QAAQ,KAAK,gCAAgC;AAAA,EACxF;AACA,SAAO,KAAK;AAAA,IACV,CAAC,UAAU,MAAM,QAAQ,IAAI,IAAI,KAAK,CAAC,GAAG,QAAQ,KAAK,UAAU,OAAO;AAAA,EAC1E;AACF;","names":[]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
assertNoSymlinkBetween,
|
|
7
7
|
readConfigFile,
|
|
8
8
|
writeAtomic
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
17
|
+
} from "./chunk-6MKEIDX5.js";
|
|
18
18
|
import {
|
|
19
19
|
writeAtomic
|
|
20
|
-
} from "./chunk-
|
|
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-
|
|
204
|
+
//# sourceMappingURL=chunk-PCE4STAY.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readConfigFile,
|
|
3
3
|
writeAtomic
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
324
|
+
//# sourceMappingURL=chunk-QDBDYCM2.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
detectTestCommand,
|
|
9
9
|
estimateTokens,
|
|
10
10
|
findCoveringTest
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
175
|
+
//# sourceMappingURL=chunk-ROQTT5ZO.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
redactLlmKeys
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6MKEIDX5.js";
|
|
4
4
|
import {
|
|
5
5
|
writeAtomic
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
199
|
+
//# sourceMappingURL=chunk-UFZD3JAA.js.map
|