iosm-cli 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/README.md +37 -3
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +1 -0
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +3 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/blast.d.ts +62 -0
- package/dist/core/blast.d.ts.map +1 -0
- package/dist/core/blast.js +448 -0
- package/dist/core/blast.js.map +1 -0
- package/dist/core/contract.d.ts +54 -0
- package/dist/core/contract.d.ts.map +1 -0
- package/dist/core/contract.js +300 -0
- package/dist/core/contract.js.map +1 -0
- package/dist/core/sdk.d.ts +3 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +11 -19
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/semantic/chunking.d.ts +10 -0
- package/dist/core/semantic/chunking.d.ts.map +1 -0
- package/dist/core/semantic/chunking.js +82 -0
- package/dist/core/semantic/chunking.js.map +1 -0
- package/dist/core/semantic/cli.d.ts +23 -0
- package/dist/core/semantic/cli.d.ts.map +1 -0
- package/dist/core/semantic/cli.js +86 -0
- package/dist/core/semantic/cli.js.map +1 -0
- package/dist/core/semantic/config.d.ts +8 -0
- package/dist/core/semantic/config.d.ts.map +1 -0
- package/dist/core/semantic/config.js +266 -0
- package/dist/core/semantic/config.js.map +1 -0
- package/dist/core/semantic/index-store.d.ts +21 -0
- package/dist/core/semantic/index-store.d.ts.map +1 -0
- package/dist/core/semantic/index-store.js +73 -0
- package/dist/core/semantic/index-store.js.map +1 -0
- package/dist/core/semantic/index.d.ts +8 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +7 -0
- package/dist/core/semantic/index.js.map +1 -0
- package/dist/core/semantic/providers.d.ts +22 -0
- package/dist/core/semantic/providers.d.ts.map +1 -0
- package/dist/core/semantic/providers.js +317 -0
- package/dist/core/semantic/providers.js.map +1 -0
- package/dist/core/semantic/runtime.d.ts +32 -0
- package/dist/core/semantic/runtime.d.ts.map +1 -0
- package/dist/core/semantic/runtime.js +510 -0
- package/dist/core/semantic/runtime.js.map +1 -0
- package/dist/core/semantic/types.d.ts +157 -0
- package/dist/core/semantic/types.d.ts.map +1 -0
- package/dist/core/semantic/types.js +23 -0
- package/dist/core/semantic/types.js.map +1 -0
- package/dist/core/shadow-guard.d.ts +30 -0
- package/dist/core/shadow-guard.d.ts.map +1 -0
- package/dist/core/shadow-guard.js +81 -0
- package/dist/core/shadow-guard.js.map +1 -0
- package/dist/core/singular.d.ts +73 -0
- package/dist/core/singular.d.ts.map +1 -0
- package/dist/core/singular.js +413 -0
- package/dist/core/singular.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +12 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +21 -3
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/ast-grep.js +1 -1
- package/dist/core/tools/ast-grep.js.map +1 -1
- package/dist/core/tools/comby.js +1 -1
- package/dist/core/tools/comby.js.map +1 -1
- package/dist/core/tools/index.d.ts +9 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +6 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/rg.js +1 -1
- package/dist/core/tools/rg.js.map +1 -1
- package/dist/core/tools/semantic-search.d.ts +21 -0
- package/dist/core/tools/semantic-search.d.ts.map +1 -0
- package/dist/core/tools/semantic-search.js +123 -0
- package/dist/core/tools/semantic-search.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +124 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +8 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +70 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +58 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +2067 -104
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/cli-reference.md +36 -1
- package/docs/configuration.md +79 -2
- package/docs/getting-started.md +1 -0
- package/docs/interactive-mode.md +135 -1
- package/package.json +1 -1
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
import { resolveHeaders } from "../resolve-config-value.js";
|
|
2
|
+
function isRecord(value) {
|
|
3
|
+
return typeof value === "object" && value !== null;
|
|
4
|
+
}
|
|
5
|
+
function assertEmbeddingArray(value, source) {
|
|
6
|
+
if (!Array.isArray(value)) {
|
|
7
|
+
throw new Error(`Invalid embedding payload from ${source}: expected number[]`);
|
|
8
|
+
}
|
|
9
|
+
const vector = [];
|
|
10
|
+
for (const item of value) {
|
|
11
|
+
if (typeof item !== "number" || !Number.isFinite(item)) {
|
|
12
|
+
throw new Error(`Invalid embedding payload from ${source}: expected finite numbers`);
|
|
13
|
+
}
|
|
14
|
+
vector.push(item);
|
|
15
|
+
}
|
|
16
|
+
if (vector.length === 0) {
|
|
17
|
+
throw new Error(`Invalid embedding payload from ${source}: empty vector`);
|
|
18
|
+
}
|
|
19
|
+
return vector;
|
|
20
|
+
}
|
|
21
|
+
function parseEmbeddingsFromOpenAIShape(payload, source) {
|
|
22
|
+
if (!isRecord(payload) || !Array.isArray(payload.data)) {
|
|
23
|
+
throw new Error(`Invalid embedding response from ${source}: missing data[]`);
|
|
24
|
+
}
|
|
25
|
+
const vectors = [];
|
|
26
|
+
for (const row of payload.data) {
|
|
27
|
+
if (!isRecord(row)) {
|
|
28
|
+
throw new Error(`Invalid embedding response from ${source}: malformed data row`);
|
|
29
|
+
}
|
|
30
|
+
vectors.push(assertEmbeddingArray(row.embedding, source));
|
|
31
|
+
}
|
|
32
|
+
return vectors;
|
|
33
|
+
}
|
|
34
|
+
function parseEmbeddingsFromOllamaEmbed(payload, source) {
|
|
35
|
+
if (!isRecord(payload) || !Array.isArray(payload.embeddings)) {
|
|
36
|
+
throw new Error(`Invalid embedding response from ${source}: missing embeddings[]`);
|
|
37
|
+
}
|
|
38
|
+
return payload.embeddings.map((value) => assertEmbeddingArray(value, source));
|
|
39
|
+
}
|
|
40
|
+
async function requestJson(url, init) {
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method: init.method,
|
|
43
|
+
headers: init.headers,
|
|
44
|
+
body: init.body,
|
|
45
|
+
signal: AbortSignal.timeout(init.timeoutMs),
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
const body = await response.text().catch(() => "");
|
|
49
|
+
const preview = body.trim().slice(0, 300);
|
|
50
|
+
throw new Error(`HTTP ${response.status} from ${url}${preview ? `: ${preview}` : ""}`);
|
|
51
|
+
}
|
|
52
|
+
return response.json();
|
|
53
|
+
}
|
|
54
|
+
async function requestJsonGet(url, init) {
|
|
55
|
+
const response = await fetch(url, {
|
|
56
|
+
method: "GET",
|
|
57
|
+
headers: init.headers,
|
|
58
|
+
signal: AbortSignal.timeout(init.timeoutMs),
|
|
59
|
+
});
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
const body = await response.text().catch(() => "");
|
|
62
|
+
const preview = body.trim().slice(0, 300);
|
|
63
|
+
throw new Error(`HTTP ${response.status} from ${url}${preview ? `: ${preview}` : ""}`);
|
|
64
|
+
}
|
|
65
|
+
return response.json();
|
|
66
|
+
}
|
|
67
|
+
function buildHeaders(config) {
|
|
68
|
+
return {
|
|
69
|
+
"Content-Type": "application/json",
|
|
70
|
+
...(resolveHeaders(config.headers) ?? {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function normalizeBaseUrl(raw, fallback) {
|
|
74
|
+
const value = (raw ?? fallback).trim();
|
|
75
|
+
return value.replace(/\/+$/, "");
|
|
76
|
+
}
|
|
77
|
+
async function resolveOpenRouterKey(config, options) {
|
|
78
|
+
if (config.apiKeyEnv) {
|
|
79
|
+
return process.env[config.apiKeyEnv];
|
|
80
|
+
}
|
|
81
|
+
const fromAuth = await options.authStorage?.getApiKey("openrouter");
|
|
82
|
+
if (fromAuth)
|
|
83
|
+
return fromAuth;
|
|
84
|
+
return process.env.OPENROUTER_API_KEY;
|
|
85
|
+
}
|
|
86
|
+
function chunkInput(items, batchSize) {
|
|
87
|
+
const normalizedBatch = Math.max(1, batchSize);
|
|
88
|
+
const batches = [];
|
|
89
|
+
for (let start = 0; start < items.length; start += normalizedBatch) {
|
|
90
|
+
batches.push(items.slice(start, start + normalizedBatch));
|
|
91
|
+
}
|
|
92
|
+
return batches;
|
|
93
|
+
}
|
|
94
|
+
function uniqueStrings(items) {
|
|
95
|
+
const seen = new Set();
|
|
96
|
+
const out = [];
|
|
97
|
+
for (const item of items) {
|
|
98
|
+
const normalized = item.trim();
|
|
99
|
+
if (!normalized || seen.has(normalized))
|
|
100
|
+
continue;
|
|
101
|
+
seen.add(normalized);
|
|
102
|
+
out.push(normalized);
|
|
103
|
+
}
|
|
104
|
+
return out;
|
|
105
|
+
}
|
|
106
|
+
function looksLikeEmbeddingModalities(value) {
|
|
107
|
+
if (!Array.isArray(value))
|
|
108
|
+
return false;
|
|
109
|
+
return value.some((item) => typeof item === "string" && item.toLowerCase().includes("embedding"));
|
|
110
|
+
}
|
|
111
|
+
function looksLikeEmbeddingModelObject(value) {
|
|
112
|
+
if (!isRecord(value))
|
|
113
|
+
return false;
|
|
114
|
+
const architecture = isRecord(value.architecture) ? value.architecture : undefined;
|
|
115
|
+
const modality = typeof architecture?.modality === "string" ? architecture.modality.toLowerCase() : "";
|
|
116
|
+
const outputModalities = architecture?.output_modalities;
|
|
117
|
+
if (modality.includes("embedding"))
|
|
118
|
+
return true;
|
|
119
|
+
if (looksLikeEmbeddingModalities(outputModalities))
|
|
120
|
+
return true;
|
|
121
|
+
const id = typeof value.id === "string" ? value.id.toLowerCase() : "";
|
|
122
|
+
return id.includes("embed") || id.includes("embedding");
|
|
123
|
+
}
|
|
124
|
+
export function isLikelyEmbeddingModelId(modelId) {
|
|
125
|
+
const normalized = modelId.toLowerCase();
|
|
126
|
+
return (normalized.includes("embed") ||
|
|
127
|
+
normalized.includes("embedding") ||
|
|
128
|
+
normalized.includes("bge") ||
|
|
129
|
+
normalized.includes("e5") ||
|
|
130
|
+
normalized.includes("gte") ||
|
|
131
|
+
normalized.includes("minilm") ||
|
|
132
|
+
normalized.includes("nomic"));
|
|
133
|
+
}
|
|
134
|
+
export async function listOpenRouterEmbeddingModels(options = {}) {
|
|
135
|
+
const timeoutMs = Math.max(1_000, options.timeoutMs ?? 12_000);
|
|
136
|
+
const headers = {};
|
|
137
|
+
const apiKey = (await options.authStorage?.getApiKey("openrouter").catch(() => undefined)) ??
|
|
138
|
+
process.env.OPENROUTER_API_KEY;
|
|
139
|
+
if (apiKey) {
|
|
140
|
+
headers.Authorization = `Bearer ${apiKey}`;
|
|
141
|
+
}
|
|
142
|
+
const parseIds = (payload) => {
|
|
143
|
+
if (!isRecord(payload) || !Array.isArray(payload.data)) {
|
|
144
|
+
throw new Error("Invalid models payload: missing data[]");
|
|
145
|
+
}
|
|
146
|
+
const ids = payload.data
|
|
147
|
+
.filter((row) => isRecord(row))
|
|
148
|
+
.map((row) => (typeof row.id === "string" ? row.id : ""))
|
|
149
|
+
.filter((id) => id.length > 0);
|
|
150
|
+
return uniqueStrings(ids);
|
|
151
|
+
};
|
|
152
|
+
try {
|
|
153
|
+
const payload = await requestJsonGet("https://openrouter.ai/api/v1/embeddings/models", {
|
|
154
|
+
headers: Object.keys(headers).length > 0 ? headers : undefined,
|
|
155
|
+
timeoutMs,
|
|
156
|
+
});
|
|
157
|
+
const ids = parseIds(payload);
|
|
158
|
+
if (ids.length > 0)
|
|
159
|
+
return ids;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Fall back to /models below.
|
|
163
|
+
}
|
|
164
|
+
const payload = await requestJsonGet("https://openrouter.ai/api/v1/models", {
|
|
165
|
+
headers: Object.keys(headers).length > 0 ? headers : undefined,
|
|
166
|
+
timeoutMs,
|
|
167
|
+
});
|
|
168
|
+
if (!isRecord(payload) || !Array.isArray(payload.data)) {
|
|
169
|
+
throw new Error("Invalid models payload: missing data[]");
|
|
170
|
+
}
|
|
171
|
+
const embeddingIds = payload.data
|
|
172
|
+
.filter((row) => isRecord(row) && looksLikeEmbeddingModelObject(row))
|
|
173
|
+
.map((row) => (typeof row.id === "string" ? row.id : ""))
|
|
174
|
+
.filter((id) => id.length > 0);
|
|
175
|
+
return uniqueStrings(embeddingIds);
|
|
176
|
+
}
|
|
177
|
+
export async function listOllamaLocalModels(options = {}) {
|
|
178
|
+
const timeoutMs = Math.max(1_000, options.timeoutMs ?? 8_000);
|
|
179
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl, "http://127.0.0.1:11434");
|
|
180
|
+
const payload = await requestJsonGet(`${baseUrl}/api/tags`, {
|
|
181
|
+
headers: resolveHeaders(options.headers),
|
|
182
|
+
timeoutMs,
|
|
183
|
+
});
|
|
184
|
+
if (!isRecord(payload) || !Array.isArray(payload.models)) {
|
|
185
|
+
throw new Error("Invalid ollama /api/tags response: missing models[]");
|
|
186
|
+
}
|
|
187
|
+
const ids = payload.models
|
|
188
|
+
.filter((item) => isRecord(item))
|
|
189
|
+
.map((item) => {
|
|
190
|
+
if (typeof item.model === "string" && item.model.trim().length > 0)
|
|
191
|
+
return item.model.trim();
|
|
192
|
+
if (typeof item.name === "string" && item.name.trim().length > 0)
|
|
193
|
+
return item.name.trim();
|
|
194
|
+
return "";
|
|
195
|
+
})
|
|
196
|
+
.filter((id) => id.length > 0);
|
|
197
|
+
const unique = uniqueStrings(ids);
|
|
198
|
+
return unique.sort((a, b) => {
|
|
199
|
+
const aLikely = isLikelyEmbeddingModelId(a) ? 1 : 0;
|
|
200
|
+
const bLikely = isLikelyEmbeddingModelId(b) ? 1 : 0;
|
|
201
|
+
if (aLikely !== bLikely)
|
|
202
|
+
return bLikely - aLikely;
|
|
203
|
+
return a.localeCompare(b);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
export async function createSemanticEmbeddingProvider(config, options = {}) {
|
|
207
|
+
if (config.type === "openrouter") {
|
|
208
|
+
const apiKey = await resolveOpenRouterKey(config, options);
|
|
209
|
+
if (!apiKey) {
|
|
210
|
+
throw new Error("OpenRouter API key is missing. Run /login openrouter or set OPENROUTER_API_KEY.");
|
|
211
|
+
}
|
|
212
|
+
const url = "https://openrouter.ai/api/v1/embeddings";
|
|
213
|
+
const baseHeaders = buildHeaders(config);
|
|
214
|
+
baseHeaders.Authorization = `Bearer ${apiKey}`;
|
|
215
|
+
return {
|
|
216
|
+
embed: async (texts) => {
|
|
217
|
+
const vectors = [];
|
|
218
|
+
for (const batch of chunkInput(texts, config.batchSize)) {
|
|
219
|
+
const payload = await requestJson(url, {
|
|
220
|
+
method: "POST",
|
|
221
|
+
headers: baseHeaders,
|
|
222
|
+
body: JSON.stringify({
|
|
223
|
+
model: config.model,
|
|
224
|
+
input: batch,
|
|
225
|
+
}),
|
|
226
|
+
timeoutMs: config.timeoutMs,
|
|
227
|
+
});
|
|
228
|
+
vectors.push(...parseEmbeddingsFromOpenAIShape(payload, "openrouter"));
|
|
229
|
+
}
|
|
230
|
+
if (vectors.length !== texts.length) {
|
|
231
|
+
throw new Error(`OpenRouter returned ${vectors.length} embeddings for ${texts.length} inputs.`);
|
|
232
|
+
}
|
|
233
|
+
return vectors;
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
if (config.type === "ollama") {
|
|
238
|
+
const baseUrl = normalizeBaseUrl(config.baseUrl, "http://127.0.0.1:11434");
|
|
239
|
+
const embedUrl = `${baseUrl}/api/embed`;
|
|
240
|
+
const legacyUrl = `${baseUrl}/api/embeddings`;
|
|
241
|
+
const headers = buildHeaders(config);
|
|
242
|
+
return {
|
|
243
|
+
embed: async (texts) => {
|
|
244
|
+
const vectors = [];
|
|
245
|
+
for (const batch of chunkInput(texts, config.batchSize)) {
|
|
246
|
+
try {
|
|
247
|
+
const payload = await requestJson(embedUrl, {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers,
|
|
250
|
+
body: JSON.stringify({
|
|
251
|
+
model: config.model,
|
|
252
|
+
input: batch,
|
|
253
|
+
}),
|
|
254
|
+
timeoutMs: config.timeoutMs,
|
|
255
|
+
});
|
|
256
|
+
vectors.push(...parseEmbeddingsFromOllamaEmbed(payload, "ollama/api/embed"));
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
for (const text of batch) {
|
|
260
|
+
const payload = await requestJson(legacyUrl, {
|
|
261
|
+
method: "POST",
|
|
262
|
+
headers,
|
|
263
|
+
body: JSON.stringify({
|
|
264
|
+
model: config.model,
|
|
265
|
+
prompt: text,
|
|
266
|
+
}),
|
|
267
|
+
timeoutMs: config.timeoutMs,
|
|
268
|
+
});
|
|
269
|
+
if (!isRecord(payload)) {
|
|
270
|
+
throw new Error("Invalid embedding response from ollama/api/embeddings");
|
|
271
|
+
}
|
|
272
|
+
vectors.push(assertEmbeddingArray(payload.embedding, "ollama/api/embeddings"));
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (vectors.length !== texts.length) {
|
|
277
|
+
throw new Error(`Ollama returned ${vectors.length} embeddings for ${texts.length} inputs.`);
|
|
278
|
+
}
|
|
279
|
+
return vectors;
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const baseUrl = normalizeBaseUrl(config.baseUrl, "http://127.0.0.1:8000/v1");
|
|
284
|
+
const url = `${baseUrl}/embeddings`;
|
|
285
|
+
const headers = buildHeaders(config);
|
|
286
|
+
if (config.apiKeyEnv) {
|
|
287
|
+
const key = process.env[config.apiKeyEnv];
|
|
288
|
+
if (!key) {
|
|
289
|
+
throw new Error(`Missing environment variable ${config.apiKeyEnv} for custom_openai provider.`);
|
|
290
|
+
}
|
|
291
|
+
if (!headers.Authorization) {
|
|
292
|
+
headers.Authorization = `Bearer ${key}`;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
embed: async (texts) => {
|
|
297
|
+
const vectors = [];
|
|
298
|
+
for (const batch of chunkInput(texts, config.batchSize)) {
|
|
299
|
+
const payload = await requestJson(url, {
|
|
300
|
+
method: "POST",
|
|
301
|
+
headers,
|
|
302
|
+
body: JSON.stringify({
|
|
303
|
+
model: config.model,
|
|
304
|
+
input: batch,
|
|
305
|
+
}),
|
|
306
|
+
timeoutMs: config.timeoutMs,
|
|
307
|
+
});
|
|
308
|
+
vectors.push(...parseEmbeddingsFromOpenAIShape(payload, "custom_openai"));
|
|
309
|
+
}
|
|
310
|
+
if (vectors.length !== texts.length) {
|
|
311
|
+
throw new Error(`custom_openai returned ${vectors.length} embeddings for ${texts.length} inputs.`);
|
|
312
|
+
}
|
|
313
|
+
return vectors;
|
|
314
|
+
},
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/semantic/providers.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AuthStorage } from \"../auth-storage.js\";\nimport { resolveHeaders } from \"../resolve-config-value.js\";\nimport type { SemanticProviderConfig } from \"./types.js\";\n\nexport interface SemanticEmbeddingProvider {\n\tembed(texts: string[]): Promise<number[][]>;\n}\n\nexport interface SemanticProviderFactoryOptions {\n\tauthStorage?: AuthStorage;\n}\n\nexport interface SemanticOpenRouterModelListOptions {\n\ttimeoutMs?: number;\n\tauthStorage?: AuthStorage;\n}\n\nexport interface SemanticOllamaModelListOptions {\n\tbaseUrl?: string;\n\ttimeoutMs?: number;\n\theaders?: Record<string, string>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction assertEmbeddingArray(value: unknown, source: string): number[] {\n\tif (!Array.isArray(value)) {\n\t\tthrow new Error(`Invalid embedding payload from ${source}: expected number[]`);\n\t}\n\tconst vector: number[] = [];\n\tfor (const item of value) {\n\t\tif (typeof item !== \"number\" || !Number.isFinite(item)) {\n\t\t\tthrow new Error(`Invalid embedding payload from ${source}: expected finite numbers`);\n\t\t}\n\t\tvector.push(item);\n\t}\n\tif (vector.length === 0) {\n\t\tthrow new Error(`Invalid embedding payload from ${source}: empty vector`);\n\t}\n\treturn vector;\n}\n\nfunction parseEmbeddingsFromOpenAIShape(payload: unknown, source: string): number[][] {\n\tif (!isRecord(payload) || !Array.isArray(payload.data)) {\n\t\tthrow new Error(`Invalid embedding response from ${source}: missing data[]`);\n\t}\n\tconst vectors: number[][] = [];\n\tfor (const row of payload.data) {\n\t\tif (!isRecord(row)) {\n\t\t\tthrow new Error(`Invalid embedding response from ${source}: malformed data row`);\n\t\t}\n\t\tvectors.push(assertEmbeddingArray(row.embedding, source));\n\t}\n\treturn vectors;\n}\n\nfunction parseEmbeddingsFromOllamaEmbed(payload: unknown, source: string): number[][] {\n\tif (!isRecord(payload) || !Array.isArray(payload.embeddings)) {\n\t\tthrow new Error(`Invalid embedding response from ${source}: missing embeddings[]`);\n\t}\n\treturn payload.embeddings.map((value) => assertEmbeddingArray(value, source));\n}\n\nasync function requestJson(\n\turl: string,\n\tinit: {\n\t\tmethod: \"POST\";\n\t\theaders: Record<string, string>;\n\t\tbody: string;\n\t\ttimeoutMs: number;\n\t},\n): Promise<unknown> {\n\tconst response = await fetch(url, {\n\t\tmethod: init.method,\n\t\theaders: init.headers,\n\t\tbody: init.body,\n\t\tsignal: AbortSignal.timeout(init.timeoutMs),\n\t});\n\tif (!response.ok) {\n\t\tconst body = await response.text().catch(() => \"\");\n\t\tconst preview = body.trim().slice(0, 300);\n\t\tthrow new Error(`HTTP ${response.status} from ${url}${preview ? `: ${preview}` : \"\"}`);\n\t}\n\treturn response.json();\n}\n\nasync function requestJsonGet(\n\turl: string,\n\tinit: {\n\t\theaders?: Record<string, string>;\n\t\ttimeoutMs: number;\n\t},\n): Promise<unknown> {\n\tconst response = await fetch(url, {\n\t\tmethod: \"GET\",\n\t\theaders: init.headers,\n\t\tsignal: AbortSignal.timeout(init.timeoutMs),\n\t});\n\tif (!response.ok) {\n\t\tconst body = await response.text().catch(() => \"\");\n\t\tconst preview = body.trim().slice(0, 300);\n\t\tthrow new Error(`HTTP ${response.status} from ${url}${preview ? `: ${preview}` : \"\"}`);\n\t}\n\treturn response.json();\n}\n\nfunction buildHeaders(config: SemanticProviderConfig): Record<string, string> {\n\treturn {\n\t\t\"Content-Type\": \"application/json\",\n\t\t...(resolveHeaders(config.headers) ?? {}),\n\t};\n}\n\nfunction normalizeBaseUrl(raw: string | undefined, fallback: string): string {\n\tconst value = (raw ?? fallback).trim();\n\treturn value.replace(/\\/+$/, \"\");\n}\n\nasync function resolveOpenRouterKey(\n\tconfig: SemanticProviderConfig,\n\toptions: SemanticProviderFactoryOptions,\n): Promise<string | undefined> {\n\tif (config.apiKeyEnv) {\n\t\treturn process.env[config.apiKeyEnv];\n\t}\n\tconst fromAuth = await options.authStorage?.getApiKey(\"openrouter\");\n\tif (fromAuth) return fromAuth;\n\treturn process.env.OPENROUTER_API_KEY;\n}\n\nfunction chunkInput<T>(items: T[], batchSize: number): T[][] {\n\tconst normalizedBatch = Math.max(1, batchSize);\n\tconst batches: T[][] = [];\n\tfor (let start = 0; start < items.length; start += normalizedBatch) {\n\t\tbatches.push(items.slice(start, start + normalizedBatch));\n\t}\n\treturn batches;\n}\n\nfunction uniqueStrings(items: string[]): string[] {\n\tconst seen = new Set<string>();\n\tconst out: string[] = [];\n\tfor (const item of items) {\n\t\tconst normalized = item.trim();\n\t\tif (!normalized || seen.has(normalized)) continue;\n\t\tseen.add(normalized);\n\t\tout.push(normalized);\n\t}\n\treturn out;\n}\n\nfunction looksLikeEmbeddingModalities(value: unknown): boolean {\n\tif (!Array.isArray(value)) return false;\n\treturn value.some((item) => typeof item === \"string\" && item.toLowerCase().includes(\"embedding\"));\n}\n\nfunction looksLikeEmbeddingModelObject(value: unknown): boolean {\n\tif (!isRecord(value)) return false;\n\tconst architecture = isRecord(value.architecture) ? value.architecture : undefined;\n\tconst modality = typeof architecture?.modality === \"string\" ? architecture.modality.toLowerCase() : \"\";\n\tconst outputModalities = architecture?.output_modalities;\n\tif (modality.includes(\"embedding\")) return true;\n\tif (looksLikeEmbeddingModalities(outputModalities)) return true;\n\tconst id = typeof value.id === \"string\" ? value.id.toLowerCase() : \"\";\n\treturn id.includes(\"embed\") || id.includes(\"embedding\");\n}\n\nexport function isLikelyEmbeddingModelId(modelId: string): boolean {\n\tconst normalized = modelId.toLowerCase();\n\treturn (\n\t\tnormalized.includes(\"embed\") ||\n\t\tnormalized.includes(\"embedding\") ||\n\t\tnormalized.includes(\"bge\") ||\n\t\tnormalized.includes(\"e5\") ||\n\t\tnormalized.includes(\"gte\") ||\n\t\tnormalized.includes(\"minilm\") ||\n\t\tnormalized.includes(\"nomic\")\n\t);\n}\n\nexport async function listOpenRouterEmbeddingModels(\n\toptions: SemanticOpenRouterModelListOptions = {},\n): Promise<string[]> {\n\tconst timeoutMs = Math.max(1_000, options.timeoutMs ?? 12_000);\n\tconst headers: Record<string, string> = {};\n\tconst apiKey =\n\t\t(await options.authStorage?.getApiKey(\"openrouter\").catch(() => undefined)) ??\n\t\tprocess.env.OPENROUTER_API_KEY;\n\tif (apiKey) {\n\t\theaders.Authorization = `Bearer ${apiKey}`;\n\t}\n\n\tconst parseIds = (payload: unknown): string[] => {\n\t\tif (!isRecord(payload) || !Array.isArray(payload.data)) {\n\t\t\tthrow new Error(\"Invalid models payload: missing data[]\");\n\t\t}\n\t\tconst ids = payload.data\n\t\t\t.filter((row): row is Record<string, unknown> => isRecord(row))\n\t\t\t.map((row) => (typeof row.id === \"string\" ? row.id : \"\"))\n\t\t\t.filter((id) => id.length > 0);\n\t\treturn uniqueStrings(ids);\n\t};\n\n\ttry {\n\t\tconst payload = await requestJsonGet(\"https://openrouter.ai/api/v1/embeddings/models\", {\n\t\t\theaders: Object.keys(headers).length > 0 ? headers : undefined,\n\t\t\ttimeoutMs,\n\t\t});\n\t\tconst ids = parseIds(payload);\n\t\tif (ids.length > 0) return ids;\n\t} catch {\n\t\t// Fall back to /models below.\n\t}\n\n\tconst payload = await requestJsonGet(\"https://openrouter.ai/api/v1/models\", {\n\t\theaders: Object.keys(headers).length > 0 ? headers : undefined,\n\t\ttimeoutMs,\n\t});\n\tif (!isRecord(payload) || !Array.isArray(payload.data)) {\n\t\tthrow new Error(\"Invalid models payload: missing data[]\");\n\t}\n\n\tconst embeddingIds = payload.data\n\t\t.filter((row): row is Record<string, unknown> => isRecord(row) && looksLikeEmbeddingModelObject(row))\n\t\t.map((row) => (typeof row.id === \"string\" ? row.id : \"\"))\n\t\t.filter((id) => id.length > 0);\n\n\treturn uniqueStrings(embeddingIds);\n}\n\nexport async function listOllamaLocalModels(\n\toptions: SemanticOllamaModelListOptions = {},\n): Promise<string[]> {\n\tconst timeoutMs = Math.max(1_000, options.timeoutMs ?? 8_000);\n\tconst baseUrl = normalizeBaseUrl(options.baseUrl, \"http://127.0.0.1:11434\");\n\tconst payload = await requestJsonGet(`${baseUrl}/api/tags`, {\n\t\theaders: resolveHeaders(options.headers),\n\t\ttimeoutMs,\n\t});\n\n\tif (!isRecord(payload) || !Array.isArray(payload.models)) {\n\t\tthrow new Error(\"Invalid ollama /api/tags response: missing models[]\");\n\t}\n\n\tconst ids = payload.models\n\t\t.filter((item): item is Record<string, unknown> => isRecord(item))\n\t\t.map((item) => {\n\t\t\tif (typeof item.model === \"string\" && item.model.trim().length > 0) return item.model.trim();\n\t\t\tif (typeof item.name === \"string\" && item.name.trim().length > 0) return item.name.trim();\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter((id) => id.length > 0);\n\n\tconst unique = uniqueStrings(ids);\n\treturn unique.sort((a, b) => {\n\t\tconst aLikely = isLikelyEmbeddingModelId(a) ? 1 : 0;\n\t\tconst bLikely = isLikelyEmbeddingModelId(b) ? 1 : 0;\n\t\tif (aLikely !== bLikely) return bLikely - aLikely;\n\t\treturn a.localeCompare(b);\n\t});\n}\n\nexport async function createSemanticEmbeddingProvider(\n\tconfig: SemanticProviderConfig,\n\toptions: SemanticProviderFactoryOptions = {},\n): Promise<SemanticEmbeddingProvider> {\n\tif (config.type === \"openrouter\") {\n\t\tconst apiKey = await resolveOpenRouterKey(config, options);\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(\"OpenRouter API key is missing. Run /login openrouter or set OPENROUTER_API_KEY.\");\n\t\t}\n\t\tconst url = \"https://openrouter.ai/api/v1/embeddings\";\n\t\tconst baseHeaders = buildHeaders(config);\n\t\tbaseHeaders.Authorization = `Bearer ${apiKey}`;\n\n\t\treturn {\n\t\t\tembed: async (texts: string[]) => {\n\t\t\t\tconst vectors: number[][] = [];\n\t\t\t\tfor (const batch of chunkInput(texts, config.batchSize)) {\n\t\t\t\t\tconst payload = await requestJson(url, {\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\theaders: baseHeaders,\n\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\tinput: batch,\n\t\t\t\t\t\t}),\n\t\t\t\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\t\t\t});\n\t\t\t\t\tvectors.push(...parseEmbeddingsFromOpenAIShape(payload, \"openrouter\"));\n\t\t\t\t}\n\t\t\t\tif (vectors.length !== texts.length) {\n\t\t\t\t\tthrow new Error(`OpenRouter returned ${vectors.length} embeddings for ${texts.length} inputs.`);\n\t\t\t\t}\n\t\t\t\treturn vectors;\n\t\t\t},\n\t\t};\n\t}\n\n\tif (config.type === \"ollama\") {\n\t\tconst baseUrl = normalizeBaseUrl(config.baseUrl, \"http://127.0.0.1:11434\");\n\t\tconst embedUrl = `${baseUrl}/api/embed`;\n\t\tconst legacyUrl = `${baseUrl}/api/embeddings`;\n\t\tconst headers = buildHeaders(config);\n\n\t\treturn {\n\t\t\tembed: async (texts: string[]) => {\n\t\t\t\tconst vectors: number[][] = [];\n\t\t\t\tfor (const batch of chunkInput(texts, config.batchSize)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst payload = await requestJson(embedUrl, {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\tinput: batch,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tvectors.push(...parseEmbeddingsFromOllamaEmbed(payload, \"ollama/api/embed\"));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tfor (const text of batch) {\n\t\t\t\t\t\t\tconst payload = await requestJson(legacyUrl, {\n\t\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\t\t\t\tprompt: text,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (!isRecord(payload)) {\n\t\t\t\t\t\t\t\tthrow new Error(\"Invalid embedding response from ollama/api/embeddings\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvectors.push(assertEmbeddingArray(payload.embedding, \"ollama/api/embeddings\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (vectors.length !== texts.length) {\n\t\t\t\t\tthrow new Error(`Ollama returned ${vectors.length} embeddings for ${texts.length} inputs.`);\n\t\t\t\t}\n\t\t\t\treturn vectors;\n\t\t\t},\n\t\t};\n\t}\n\n\tconst baseUrl = normalizeBaseUrl(config.baseUrl, \"http://127.0.0.1:8000/v1\");\n\tconst url = `${baseUrl}/embeddings`;\n\tconst headers = buildHeaders(config);\n\tif (config.apiKeyEnv) {\n\t\tconst key = process.env[config.apiKeyEnv];\n\t\tif (!key) {\n\t\t\tthrow new Error(`Missing environment variable ${config.apiKeyEnv} for custom_openai provider.`);\n\t\t}\n\t\tif (!headers.Authorization) {\n\t\t\theaders.Authorization = `Bearer ${key}`;\n\t\t}\n\t}\n\n\treturn {\n\t\tembed: async (texts: string[]) => {\n\t\t\tconst vectors: number[][] = [];\n\t\t\tfor (const batch of chunkInput(texts, config.batchSize)) {\n\t\t\t\tconst payload = await requestJson(url, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tmodel: config.model,\n\t\t\t\t\t\tinput: batch,\n\t\t\t\t\t}),\n\t\t\t\t\ttimeoutMs: config.timeoutMs,\n\t\t\t\t});\n\t\t\t\tvectors.push(...parseEmbeddingsFromOpenAIShape(payload, \"custom_openai\"));\n\t\t\t}\n\t\t\tif (vectors.length !== texts.length) {\n\t\t\t\tthrow new Error(`custom_openai returned ${vectors.length} embeddings for ${texts.length} inputs.`);\n\t\t\t}\n\t\t\treturn vectors;\n\t\t},\n\t};\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AuthStorage } from "../auth-storage.js";
|
|
2
|
+
import type { SemanticIndexOperationResult, SemanticQueryResult, SemanticStatusResult } from "./types.js";
|
|
3
|
+
interface SemanticRuntimeOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
agentDir: string;
|
|
6
|
+
authStorage?: AuthStorage;
|
|
7
|
+
}
|
|
8
|
+
export declare class SemanticSearchRuntime {
|
|
9
|
+
private readonly cwd;
|
|
10
|
+
private readonly agentDir;
|
|
11
|
+
private readonly authStorage?;
|
|
12
|
+
constructor(options: SemanticRuntimeOptions);
|
|
13
|
+
execute(action: "status"): Promise<SemanticStatusResult>;
|
|
14
|
+
execute(action: "index"): Promise<SemanticIndexOperationResult>;
|
|
15
|
+
execute(action: "rebuild"): Promise<SemanticIndexOperationResult>;
|
|
16
|
+
execute(action: "query", query: string, topK?: number): Promise<SemanticQueryResult>;
|
|
17
|
+
status(): Promise<SemanticStatusResult>;
|
|
18
|
+
index(): Promise<SemanticIndexOperationResult>;
|
|
19
|
+
rebuild(): Promise<SemanticIndexOperationResult>;
|
|
20
|
+
query(rawQuery: string, topK?: number): Promise<SemanticQueryResult>;
|
|
21
|
+
private loadConfiguredSemanticConfig;
|
|
22
|
+
private detectStaleness;
|
|
23
|
+
private collectCandidatePaths;
|
|
24
|
+
private collectProjectFileStats;
|
|
25
|
+
private collectProjectFiles;
|
|
26
|
+
private providerFingerprint;
|
|
27
|
+
private chunkConfigFingerprint;
|
|
28
|
+
private indexFilterFingerprint;
|
|
29
|
+
private buildIndex;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,OAAO,KAAK,EAGX,4BAA4B,EAI5B,mBAAmB,EAEnB,oBAAoB,EAGpB,MAAM,YAAY,CAAC;AAOpB,UAAU,sBAAsB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAiED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;gBAE/B,OAAO,EAAE,sBAAsB;IAMrC,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IACxD,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAC/D,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC;IACjE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAcpF,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAiDvC,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAI9C,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAIhD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiG1E,OAAO,CAAC,4BAA4B;IAcpC,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,sBAAsB;YAWhB,UAAU;CA4KxB"}
|