opencode-rag-plugin 1.0.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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/ReadMe.md +423 -0
  3. package/dist/chunker/base.d.ts +10 -0
  4. package/dist/chunker/base.js +34 -0
  5. package/dist/chunker/base.js.map +1 -0
  6. package/dist/chunker/c.d.ts +8 -0
  7. package/dist/chunker/c.js +16 -0
  8. package/dist/chunker/c.js.map +1 -0
  9. package/dist/chunker/cpp.d.ts +8 -0
  10. package/dist/chunker/cpp.js +17 -0
  11. package/dist/chunker/cpp.js.map +1 -0
  12. package/dist/chunker/csharp.d.ts +8 -0
  13. package/dist/chunker/csharp.js +17 -0
  14. package/dist/chunker/csharp.js.map +1 -0
  15. package/dist/chunker/css.d.ts +8 -0
  16. package/dist/chunker/css.js +14 -0
  17. package/dist/chunker/css.js.map +1 -0
  18. package/dist/chunker/factory.d.ts +27 -0
  19. package/dist/chunker/factory.js +138 -0
  20. package/dist/chunker/factory.js.map +1 -0
  21. package/dist/chunker/fallback.d.ts +8 -0
  22. package/dist/chunker/fallback.js +34 -0
  23. package/dist/chunker/fallback.js.map +1 -0
  24. package/dist/chunker/go.d.ts +8 -0
  25. package/dist/chunker/go.js +13 -0
  26. package/dist/chunker/go.js.map +1 -0
  27. package/dist/chunker/grammar.d.ts +12 -0
  28. package/dist/chunker/grammar.js +43 -0
  29. package/dist/chunker/grammar.js.map +1 -0
  30. package/dist/chunker/html.d.ts +8 -0
  31. package/dist/chunker/html.js +12 -0
  32. package/dist/chunker/html.js.map +1 -0
  33. package/dist/chunker/java.d.ts +8 -0
  34. package/dist/chunker/java.js +14 -0
  35. package/dist/chunker/java.js.map +1 -0
  36. package/dist/chunker/javascript.d.ts +8 -0
  37. package/dist/chunker/javascript.js +15 -0
  38. package/dist/chunker/javascript.js.map +1 -0
  39. package/dist/chunker/json.d.ts +8 -0
  40. package/dist/chunker/json.js +11 -0
  41. package/dist/chunker/json.js.map +1 -0
  42. package/dist/chunker/kotlin.d.ts +8 -0
  43. package/dist/chunker/kotlin.js +15 -0
  44. package/dist/chunker/kotlin.js.map +1 -0
  45. package/dist/chunker/loader.d.ts +2 -0
  46. package/dist/chunker/loader.js +27 -0
  47. package/dist/chunker/loader.js.map +1 -0
  48. package/dist/chunker/markdown.d.ts +7 -0
  49. package/dist/chunker/markdown.js +96 -0
  50. package/dist/chunker/markdown.js.map +1 -0
  51. package/dist/chunker/pdf.d.ts +8 -0
  52. package/dist/chunker/pdf.js +93 -0
  53. package/dist/chunker/pdf.js.map +1 -0
  54. package/dist/chunker/python.d.ts +8 -0
  55. package/dist/chunker/python.js +13 -0
  56. package/dist/chunker/python.js.map +1 -0
  57. package/dist/chunker/razor.d.ts +7 -0
  58. package/dist/chunker/razor.js +85 -0
  59. package/dist/chunker/razor.js.map +1 -0
  60. package/dist/chunker/ruby.d.ts +8 -0
  61. package/dist/chunker/ruby.js +14 -0
  62. package/dist/chunker/ruby.js.map +1 -0
  63. package/dist/chunker/rust.d.ts +8 -0
  64. package/dist/chunker/rust.js +17 -0
  65. package/dist/chunker/rust.js.map +1 -0
  66. package/dist/chunker/sln.d.ts +9 -0
  67. package/dist/chunker/sln.js +65 -0
  68. package/dist/chunker/sln.js.map +1 -0
  69. package/dist/chunker/swift.d.ts +8 -0
  70. package/dist/chunker/swift.js +17 -0
  71. package/dist/chunker/swift.js.map +1 -0
  72. package/dist/chunker/tex.d.ts +7 -0
  73. package/dist/chunker/tex.js +93 -0
  74. package/dist/chunker/tex.js.map +1 -0
  75. package/dist/chunker/typescript.d.ts +8 -0
  76. package/dist/chunker/typescript.js +17 -0
  77. package/dist/chunker/typescript.js.map +1 -0
  78. package/dist/chunker/uuid.d.ts +1 -0
  79. package/dist/chunker/uuid.js +8 -0
  80. package/dist/chunker/uuid.js.map +1 -0
  81. package/dist/chunker/xml.d.ts +8 -0
  82. package/dist/chunker/xml.js +11 -0
  83. package/dist/chunker/xml.js.map +1 -0
  84. package/dist/cli.d.ts +1 -0
  85. package/dist/cli.js +291 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/core/config.d.ts +59 -0
  88. package/dist/core/config.js +127 -0
  89. package/dist/core/config.js.map +1 -0
  90. package/dist/core/fileLogger.d.ts +6 -0
  91. package/dist/core/fileLogger.js +32 -0
  92. package/dist/core/fileLogger.js.map +1 -0
  93. package/dist/core/interfaces.d.ts +31 -0
  94. package/dist/core/interfaces.js +2 -0
  95. package/dist/core/interfaces.js.map +1 -0
  96. package/dist/core/manifest.d.ts +21 -0
  97. package/dist/core/manifest.js +48 -0
  98. package/dist/core/manifest.js.map +1 -0
  99. package/dist/embedder/factory.d.ts +4 -0
  100. package/dist/embedder/factory.js +27 -0
  101. package/dist/embedder/factory.js.map +1 -0
  102. package/dist/embedder/http.d.ts +11 -0
  103. package/dist/embedder/http.js +309 -0
  104. package/dist/embedder/http.js.map +1 -0
  105. package/dist/embedder/ollama.d.ts +14 -0
  106. package/dist/embedder/ollama.js +60 -0
  107. package/dist/embedder/ollama.js.map +1 -0
  108. package/dist/embedder/openai.d.ts +12 -0
  109. package/dist/embedder/openai.js +33 -0
  110. package/dist/embedder/openai.js.map +1 -0
  111. package/dist/index.d.ts +10 -0
  112. package/dist/index.js +10 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/indexer.d.ts +49 -0
  115. package/dist/indexer.js +336 -0
  116. package/dist/indexer.js.map +1 -0
  117. package/dist/plugin-entry.d.ts +4 -0
  118. package/dist/plugin-entry.js +5 -0
  119. package/dist/plugin-entry.js.map +1 -0
  120. package/dist/plugin.d.ts +22 -0
  121. package/dist/plugin.js +477 -0
  122. package/dist/plugin.js.map +1 -0
  123. package/dist/retriever/retriever.d.ts +5 -0
  124. package/dist/retriever/retriever.js +14 -0
  125. package/dist/retriever/retriever.js.map +1 -0
  126. package/dist/types/opencode-plugin.d.ts +51 -0
  127. package/dist/vectorstore/lancedb.d.ts +18 -0
  128. package/dist/vectorstore/lancedb.js +196 -0
  129. package/dist/vectorstore/lancedb.js.map +1 -0
  130. package/dist/watcher.d.ts +14 -0
  131. package/dist/watcher.js +88 -0
  132. package/dist/watcher.js.map +1 -0
  133. package/package.json +82 -0
@@ -0,0 +1,48 @@
1
+ import { createHash } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ export function createEmptyManifest() {
5
+ return { files: {} };
6
+ }
7
+ export function manifestPathFor(dbPath) {
8
+ return path.join(dbPath, "manifest.json");
9
+ }
10
+ export function normalizeFilePath(filePath) {
11
+ return path.resolve(filePath).replace(/\\/g, "/");
12
+ }
13
+ export function computeFileHash(content) {
14
+ return createHash("sha256").update(content).digest("hex");
15
+ }
16
+ export async function loadManifest(dbPath) {
17
+ const filePath = manifestPathFor(dbPath);
18
+ try {
19
+ const raw = await fs.readFile(filePath, "utf-8");
20
+ const parsed = JSON.parse(raw);
21
+ if (!parsed || typeof parsed !== "object" || !parsed.files || typeof parsed.files !== "object") {
22
+ return { manifest: createEmptyManifest(), path: filePath, status: "corrupt" };
23
+ }
24
+ return {
25
+ manifest: {
26
+ lastIndexedAt: typeof parsed.lastIndexedAt === "number" ? parsed.lastIndexedAt : undefined,
27
+ files: parsed.files,
28
+ },
29
+ path: filePath,
30
+ status: "ok",
31
+ };
32
+ }
33
+ catch (error) {
34
+ const code = error.code;
35
+ if (code === "ENOENT") {
36
+ return { manifest: createEmptyManifest(), path: filePath, status: "missing" };
37
+ }
38
+ return { manifest: createEmptyManifest(), path: filePath, status: "corrupt" };
39
+ }
40
+ }
41
+ export async function saveManifest(dbPath, manifest) {
42
+ const filePath = manifestPathFor(dbPath);
43
+ const tempPath = `${filePath}.tmp`;
44
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
45
+ await fs.writeFile(tempPath, JSON.stringify(manifest, null, 2), "utf-8");
46
+ await fs.rename(tempPath, filePath);
47
+ }
48
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/core/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAqB7B,MAAM,UAAU,mBAAmB;IACjC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACxD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/F,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChF,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR,aAAa,EAAE,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBAC1F,KAAK,EAAE,MAAM,CAAC,KAAsC;aACrD;YACD,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,QAAsB;IACvE,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IAEnC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { EmbeddingProvider } from "../core/interfaces.js";
2
+ import type { RagConfig } from "../core/config.js";
3
+ export declare function createEmbedder(config: RagConfig): EmbeddingProvider;
4
+ export declare function embedBatch(embedder: EmbeddingProvider, texts: string[], batchSize?: number): Promise<number[][]>;
@@ -0,0 +1,27 @@
1
+ import { OllamaProvider } from "./ollama.js";
2
+ import { OpenAIProvider } from "./openai.js";
3
+ export function createEmbedder(config) {
4
+ const { provider, baseUrl, model, apiKey, proxy, timeoutMs } = config.embedding;
5
+ const effectiveTimeoutMs = timeoutMs ?? 30000;
6
+ switch (provider) {
7
+ case "ollama":
8
+ return new OllamaProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
9
+ case "openai":
10
+ if (!apiKey) {
11
+ throw new Error("OpenAI provider requires an apiKey");
12
+ }
13
+ return new OpenAIProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
14
+ default:
15
+ throw new Error(`Unknown embedding provider: ${provider}`);
16
+ }
17
+ }
18
+ export async function embedBatch(embedder, texts, batchSize = 10) {
19
+ const results = [];
20
+ for (let i = 0; i < texts.length; i += batchSize) {
21
+ const batch = texts.slice(i, i + batchSize);
22
+ const embeddings = await embedder.embed(batch);
23
+ results.push(...embeddings);
24
+ }
25
+ return results;
26
+ }
27
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embedder/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAChF,MAAM,kBAAkB,GAAG,SAAS,IAAI,KAAK,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/E,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/E;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA2B,EAC3B,KAAe,EACf,YAAoB,EAAE;IAEtB,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ProxyConfig } from "../core/config.js";
2
+ export interface HttpResponseLike {
3
+ ok: boolean;
4
+ status: number;
5
+ text(): Promise<string>;
6
+ json<T = unknown>(): Promise<T>;
7
+ }
8
+ export declare function isLocalhost(hostname: string): boolean;
9
+ export declare function matchesNoProxy(hostname: string, noProxy?: string): boolean;
10
+ export declare function directRequest(url: URL, body: unknown, headers: Record<string, string>, timeoutMs: number, redirectCount?: number): Promise<HttpResponseLike>;
11
+ export declare function postJson(urlString: string, body: unknown, headers: Record<string, string>, timeoutMs: number, proxy?: ProxyConfig): Promise<HttpResponseLike>;
@@ -0,0 +1,309 @@
1
+ import net from "node:net";
2
+ import tls from "node:tls";
3
+ export function isLocalhost(hostname) {
4
+ const normalized = hostname.toLowerCase();
5
+ return (normalized === "localhost" ||
6
+ normalized === "::1" ||
7
+ normalized === "127.0.0.1" ||
8
+ normalized.startsWith("127."));
9
+ }
10
+ function parseNoProxyList(noProxy) {
11
+ if (!noProxy)
12
+ return [];
13
+ return noProxy
14
+ .split(",")
15
+ .map((s) => s.trim().toLowerCase())
16
+ .filter((s) => s.length > 0);
17
+ }
18
+ export function matchesNoProxy(hostname, noProxy) {
19
+ const normalized = hostname.toLowerCase();
20
+ const patterns = parseNoProxyList(noProxy);
21
+ if (isLocalhost(normalized))
22
+ return true;
23
+ for (const pattern of patterns) {
24
+ if (pattern === "*")
25
+ return true;
26
+ if (pattern.startsWith(".") && normalized.endsWith(pattern))
27
+ return true;
28
+ if (pattern.startsWith(".") && normalized === pattern.slice(1))
29
+ return true;
30
+ if (normalized === pattern)
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ function buildProxyAuthHeader(proxy) {
36
+ if (proxy?.username && proxy?.password) {
37
+ const encoded = Buffer.from(`${proxy.username}:${proxy.password}`).toString("base64");
38
+ return `Basic ${encoded}`;
39
+ }
40
+ return undefined;
41
+ }
42
+ function applyProxyEnv(proxy) {
43
+ if (!proxy?.url)
44
+ return null;
45
+ const existingHttp = process.env.HTTP_PROXY || process.env.http_proxy;
46
+ const existingHttps = process.env.HTTPS_PROXY || process.env.https_proxy;
47
+ if (existingHttp && existingHttps)
48
+ return null;
49
+ return {
50
+ httpProxy: existingHttp || proxy.url,
51
+ httpsProxy: existingHttps || proxy.url,
52
+ };
53
+ }
54
+ export function directRequest(url, body, headers, timeoutMs, redirectCount = 0) {
55
+ return sendRawHttpRequest(url, body, headers, timeoutMs, redirectCount);
56
+ }
57
+ const CRLF = Buffer.from("\r\n");
58
+ function buildRequestPayload(body, headers, url) {
59
+ const payload = JSON.stringify(body);
60
+ const requestHeaders = {
61
+ Host: url.host,
62
+ Connection: "close",
63
+ "Content-Type": "application/json",
64
+ "Content-Length": Buffer.byteLength(payload).toString(),
65
+ ...headers,
66
+ };
67
+ const headerLines = Object.entries(requestHeaders).map(([key, value]) => `${key}: ${value}`);
68
+ const requestText = [
69
+ `POST ${url.pathname}${url.search} HTTP/1.1`,
70
+ ...headerLines,
71
+ "",
72
+ payload,
73
+ ].join("\r\n");
74
+ return Buffer.from(requestText, "utf8");
75
+ }
76
+ function parseHeaderLines(headerText) {
77
+ const headers = {};
78
+ const lines = headerText.split("\r\n");
79
+ for (let i = 1; i < lines.length; i++) {
80
+ const line = lines[i]?.trim();
81
+ if (!line)
82
+ continue;
83
+ const idx = line.indexOf(":");
84
+ if (idx < 0)
85
+ continue;
86
+ const name = line.slice(0, idx).trim().toLowerCase();
87
+ const value = line.slice(idx + 1).trim();
88
+ headers[name] = value;
89
+ }
90
+ return headers;
91
+ }
92
+ function decodeChunkedBody(body) {
93
+ const chunks = [];
94
+ let offset = 0;
95
+ while (offset < body.length) {
96
+ const sizeLineEnd = body.indexOf(CRLF, offset);
97
+ if (sizeLineEnd < 0)
98
+ break;
99
+ const sizeLine = body.slice(offset, sizeLineEnd).toString("ascii").split(";", 1)[0]?.trim() ?? "0";
100
+ const size = Number.parseInt(sizeLine, 16);
101
+ offset = sizeLineEnd + CRLF.length;
102
+ if (!Number.isFinite(size) || size < 0) {
103
+ throw new Error(`Invalid chunk size: ${sizeLine}`);
104
+ }
105
+ if (size === 0) {
106
+ break;
107
+ }
108
+ const chunkEnd = offset + size;
109
+ if (chunkEnd > body.length) {
110
+ throw new Error("Incomplete chunked HTTP response");
111
+ }
112
+ chunks.push(body.slice(offset, chunkEnd));
113
+ offset = chunkEnd + CRLF.length;
114
+ }
115
+ return Buffer.concat(chunks);
116
+ }
117
+ function parseResponse(buffer) {
118
+ const headerEnd = buffer.indexOf(Buffer.from("\r\n\r\n"));
119
+ if (headerEnd < 0) {
120
+ throw new Error("Invalid HTTP response: missing header terminator");
121
+ }
122
+ const headerText = buffer.slice(0, headerEnd).toString("utf8");
123
+ const body = buffer.slice(headerEnd + 4);
124
+ const statusLine = headerText.split("\r\n")[0] ?? "";
125
+ const statusMatch = /^HTTP\/\d+\.\d+\s+(\d+)/.exec(statusLine);
126
+ if (!statusMatch) {
127
+ throw new Error(`Invalid HTTP response status line: ${statusLine}`);
128
+ }
129
+ const headers = parseHeaderLines(headerText);
130
+ const status = Number.parseInt(statusMatch[1] ?? "0", 10);
131
+ if (headers["transfer-encoding"]?.toLowerCase().includes("chunked")) {
132
+ return { status, headers, body: decodeChunkedBody(body) };
133
+ }
134
+ const contentLength = Number.parseInt(headers["content-length"] ?? "0", 10);
135
+ if (Number.isFinite(contentLength) && contentLength >= 0) {
136
+ return { status, headers, body: body.slice(0, contentLength) };
137
+ }
138
+ return { status, headers, body };
139
+ }
140
+ async function sendRawHttpRequest(url, body, headers, timeoutMs, redirectCount) {
141
+ const payload = JSON.stringify(body);
142
+ const requestBuffer = buildRequestPayload(body, headers, url);
143
+ const port = url.port ? Number(url.port) : url.protocol === "https:" ? 443 : 80;
144
+ const isHttps = url.protocol === "https:";
145
+ const responseBuffer = await new Promise((resolve, reject) => {
146
+ const socket = isHttps
147
+ ? tls.connect({ host: url.hostname, port, servername: url.hostname })
148
+ : net.connect({ host: url.hostname, port });
149
+ const chunks = [];
150
+ let settled = false;
151
+ let headerEndIndex = -1;
152
+ let expectedBodyLength = -1;
153
+ let isChunked = false;
154
+ const settle = (fn) => {
155
+ if (settled)
156
+ return;
157
+ settled = true;
158
+ clearTimeout(timeout);
159
+ fn();
160
+ };
161
+ const timeout = setTimeout(() => {
162
+ settle(() => {
163
+ socket.destroy(new Error(`Request timed out after ${timeoutMs}ms`));
164
+ reject(new Error(`Request timed out after ${timeoutMs}ms`));
165
+ });
166
+ }, timeoutMs);
167
+ socket.on("connect", () => {
168
+ socket.write(requestBuffer);
169
+ });
170
+ socket.on("data", (chunk) => {
171
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
172
+ if (settled)
173
+ return;
174
+ const assembled = Buffer.concat(chunks);
175
+ if (headerEndIndex < 0) {
176
+ headerEndIndex = assembled.indexOf(Buffer.from("\r\n\r\n"));
177
+ if (headerEndIndex < 0)
178
+ return;
179
+ const headerText = assembled.slice(0, headerEndIndex).toString("utf8");
180
+ const lines = headerText.split("\r\n");
181
+ for (let i = 1; i < lines.length; i++) {
182
+ const line = (lines[i] ?? "").trim();
183
+ if (!line)
184
+ continue;
185
+ const idx = line.indexOf(":");
186
+ if (idx < 0)
187
+ continue;
188
+ const name = line.slice(0, idx).trim().toLowerCase();
189
+ const value = line.slice(idx + 1).trim();
190
+ if (name === "content-length") {
191
+ expectedBodyLength = Number.parseInt(value, 10);
192
+ }
193
+ if (name === "transfer-encoding" && value.toLowerCase().includes("chunked")) {
194
+ isChunked = true;
195
+ }
196
+ }
197
+ }
198
+ const bodyBuffer = assembled.slice(headerEndIndex + 4);
199
+ if (expectedBodyLength >= 0) {
200
+ if (bodyBuffer.length >= expectedBodyLength) {
201
+ settle(() => {
202
+ socket.destroy();
203
+ resolve(assembled.slice(0, headerEndIndex + 4 + expectedBodyLength));
204
+ });
205
+ }
206
+ return;
207
+ }
208
+ if (isChunked) {
209
+ if (bodyBuffer.length >= 7) {
210
+ const tail = bodyBuffer.slice(-7).toString("ascii");
211
+ if (tail === "\r\n0\r\n\r\n") {
212
+ settle(() => {
213
+ socket.destroy();
214
+ resolve(assembled);
215
+ });
216
+ }
217
+ }
218
+ return;
219
+ }
220
+ });
221
+ socket.on("end", () => {
222
+ const buffer = Buffer.concat(chunks);
223
+ settle(() => resolve(buffer));
224
+ });
225
+ socket.on("error", (err) => {
226
+ settle(() => reject(err));
227
+ });
228
+ });
229
+ const response = parseResponse(responseBuffer);
230
+ const location = response.headers.location;
231
+ if (response.status >= 300 &&
232
+ response.status < 400 &&
233
+ typeof location === "string" &&
234
+ location.length > 0) {
235
+ if (redirectCount >= 5) {
236
+ const text = `Redirect limit exceeded for ${url.toString()}`;
237
+ return {
238
+ ok: false,
239
+ status: response.status,
240
+ async text() {
241
+ return text;
242
+ },
243
+ async json() {
244
+ return JSON.parse(`{"error":"Redirect limit exceeded"}`);
245
+ },
246
+ };
247
+ }
248
+ return sendRawHttpRequest(new URL(location, url), body, headers, timeoutMs, redirectCount + 1);
249
+ }
250
+ const text = response.body.toString("utf8");
251
+ return {
252
+ ok: response.status >= 200 && response.status < 300,
253
+ status: response.status,
254
+ async text() {
255
+ return text;
256
+ },
257
+ async json() {
258
+ return JSON.parse(text);
259
+ },
260
+ };
261
+ }
262
+ export async function postJson(urlString, body, headers, timeoutMs, proxy) {
263
+ const url = new URL(urlString);
264
+ const bypassProxy = isLocalhost(url.hostname) || matchesNoProxy(url.hostname, proxy?.noProxy);
265
+ if (bypassProxy || !proxy?.url) {
266
+ return directRequest(url, body, headers, timeoutMs);
267
+ }
268
+ return postJsonViaFetch(urlString, body, headers, timeoutMs, proxy);
269
+ }
270
+ async function postJsonViaFetch(urlString, body, headers, timeoutMs, proxy) {
271
+ const authHeader = buildProxyAuthHeader(proxy);
272
+ const envOverride = applyProxyEnv(proxy);
273
+ const savedHttpProxy = process.env.HTTP_PROXY;
274
+ const savedHttpsProxy = process.env.HTTPS_PROXY;
275
+ try {
276
+ if (envOverride) {
277
+ process.env.HTTP_PROXY = envOverride.httpProxy;
278
+ process.env.HTTPS_PROXY = envOverride.httpsProxy;
279
+ }
280
+ const requestHeaders = {
281
+ "Content-Type": "application/json",
282
+ ...headers,
283
+ };
284
+ if (authHeader) {
285
+ requestHeaders["Proxy-Authorization"] = authHeader;
286
+ }
287
+ const controller = new AbortController();
288
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
289
+ try {
290
+ const response = await fetch(urlString, {
291
+ method: "POST",
292
+ headers: requestHeaders,
293
+ body: JSON.stringify(body),
294
+ signal: controller.signal,
295
+ });
296
+ return response;
297
+ }
298
+ finally {
299
+ clearTimeout(timeout);
300
+ }
301
+ }
302
+ finally {
303
+ if (envOverride) {
304
+ process.env.HTTP_PROXY = savedHttpProxy;
305
+ process.env.HTTPS_PROXY = savedHttpsProxy;
306
+ }
307
+ }
308
+ }
309
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/embedder/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { EmbeddingProvider } from "../core/interfaces.js";
2
+ import type { ProxyConfig } from "../core/config.js";
3
+ export declare class OllamaProvider implements EmbeddingProvider {
4
+ readonly name = "ollama";
5
+ private baseUrl;
6
+ private model;
7
+ private apiKey?;
8
+ private timeoutMs;
9
+ private proxy?;
10
+ constructor(baseUrl: string, model: string, apiKey?: string, timeoutMs?: number, proxy?: ProxyConfig);
11
+ private getLogFilePath;
12
+ private debug;
13
+ embed(texts: string[]): Promise<number[][]>;
14
+ }
@@ -0,0 +1,60 @@
1
+ import { postJson } from "./http.js";
2
+ import path from "node:path";
3
+ import { appendDebugLog } from "../core/fileLogger.js";
4
+ export class OllamaProvider {
5
+ name = "ollama";
6
+ baseUrl;
7
+ model;
8
+ apiKey;
9
+ timeoutMs;
10
+ proxy;
11
+ constructor(baseUrl, model, apiKey, timeoutMs = 30000, proxy) {
12
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
13
+ this.model = model;
14
+ this.apiKey = apiKey;
15
+ this.timeoutMs = timeoutMs;
16
+ this.proxy = proxy;
17
+ }
18
+ getLogFilePath() {
19
+ return path.resolve(process.cwd(), ".opencode", "opencode-rag.log");
20
+ }
21
+ debug(message, error) {
22
+ appendDebugLog(this.getLogFilePath(), {
23
+ scope: "embedder.ollama",
24
+ message,
25
+ error,
26
+ });
27
+ }
28
+ async embed(texts) {
29
+ const headers = {};
30
+ if (this.apiKey) {
31
+ headers.Authorization = `Bearer ${this.apiKey}`;
32
+ }
33
+ this.debug(`OllamaProvider requesting ${texts.length} embedding vector${texts.length === 1 ? "" : "s"}`);
34
+ try {
35
+ const response = await postJson(`${this.baseUrl}/embed`, { model: this.model, input: texts.length === 1 ? texts[0] : texts }, headers, this.timeoutMs, this.proxy);
36
+ if (!response.ok) {
37
+ const body = await response.text();
38
+ throw new Error(`Ollama embedding failed (${response.status}): ${body}`);
39
+ }
40
+ const json = (await response.json());
41
+ if (Array.isArray(json.embeddings) && json.embeddings.every((item) => Array.isArray(item))) {
42
+ this.debug(`OllamaProvider received ${json.embeddings.length} embedding vector${json.embeddings.length === 1 ? "" : "s"}`);
43
+ return json.embeddings;
44
+ }
45
+ if (Array.isArray(json.embedding)) {
46
+ this.debug("OllamaProvider received 1 embedding vector");
47
+ return [json.embedding];
48
+ }
49
+ throw new Error(`Ollama: unexpected response: ${JSON.stringify(json)}`);
50
+ }
51
+ catch (error) {
52
+ if (error.name === "AbortError" || error.message === "Aborted") {
53
+ throw new Error(`Ollama embedding request timed out after ${this.timeoutMs}ms`);
54
+ }
55
+ this.debug("OllamaProvider embedding request failed", error);
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embedder/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { EmbeddingProvider } from "../core/interfaces.js";
2
+ import type { ProxyConfig } from "../core/config.js";
3
+ export declare class OpenAIProvider implements EmbeddingProvider {
4
+ readonly name = "openai";
5
+ private baseUrl;
6
+ private model;
7
+ private apiKey;
8
+ private timeoutMs;
9
+ private proxy?;
10
+ constructor(baseUrl: string, model: string, apiKey: string, timeoutMs?: number, proxy?: ProxyConfig);
11
+ embed(texts: string[]): Promise<number[][]>;
12
+ }
@@ -0,0 +1,33 @@
1
+ import { postJson } from "./http.js";
2
+ export class OpenAIProvider {
3
+ name = "openai";
4
+ baseUrl;
5
+ model;
6
+ apiKey;
7
+ timeoutMs;
8
+ proxy;
9
+ constructor(baseUrl, model, apiKey, timeoutMs = 30000, proxy) {
10
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
11
+ this.model = model;
12
+ this.apiKey = apiKey;
13
+ this.timeoutMs = timeoutMs;
14
+ this.proxy = proxy;
15
+ }
16
+ async embed(texts) {
17
+ const response = await postJson(`${this.baseUrl}/embeddings`, { model: this.model, input: texts }, { Authorization: `Bearer ${this.apiKey}` }, this.timeoutMs, this.proxy);
18
+ if (!response.ok) {
19
+ const body = await response.text();
20
+ throw new Error(`OpenAI embedding failed (${response.status}): ${body}`);
21
+ }
22
+ const json = (await response.json());
23
+ if (!json.data || !Array.isArray(json.data)) {
24
+ throw new Error(`OpenAI: unexpected response: ${JSON.stringify(json)}`);
25
+ }
26
+ return json.data
27
+ .sort((a, b) => {
28
+ return 0;
29
+ })
30
+ .map((item) => item.embedding);
31
+ }
32
+ }
33
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embedder/openai.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAEjB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,KAAK,CAAe;IAE5B,YAAY,OAAe,EAAE,KAAa,EAAE,MAAc,EAAE,YAAoB,KAAK,EAAE,KAAmB;QACxG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe;QACzB,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,GAAG,IAAI,CAAC,OAAO,aAAa,EAC5B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EACnC,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,EAC1C,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,CACX,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ export { chunkFile, getChunker, registerChunker } from "./chunker/factory.js";
2
+ export { createEmbedder, embedBatch } from "./embedder/factory.js";
3
+ export { LanceDBStore } from "./vectorstore/lancedb.js";
4
+ export { retrieve } from "./retriever/retriever.js";
5
+ export { loadConfig, DEFAULT_CONFIG } from "./core/config.js";
6
+ export { createBackgroundIndexer } from "./watcher.js";
7
+ export { createWatchIgnore } from "./indexer.js";
8
+ export type { RagConfig } from "./core/config.js";
9
+ export type { Chunk, SearchResult, Chunker, EmbeddingProvider, VectorStore } from "./core/interfaces.js";
10
+ export { ragPlugin as server } from "./plugin.js";
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { chunkFile, getChunker, registerChunker } from "./chunker/factory.js";
2
+ export { createEmbedder, embedBatch } from "./embedder/factory.js";
3
+ export { LanceDBStore } from "./vectorstore/lancedb.js";
4
+ export { retrieve } from "./retriever/retriever.js";
5
+ export { loadConfig, DEFAULT_CONFIG } from "./core/config.js";
6
+ export { createBackgroundIndexer } from "./watcher.js";
7
+ export { createWatchIgnore } from "./indexer.js";
8
+ // Plugin is only importable inside OpenCode's runtime
9
+ export { ragPlugin as server } from "./plugin.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAIjD,sDAAsD;AACtD,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { RagConfig } from "./core/config.js";
2
+ import type { EmbeddingProvider, VectorStore } from "./core/interfaces.js";
3
+ export interface IndexRunStats {
4
+ totalFiles: number;
5
+ newFiles: number;
6
+ modifiedFiles: number;
7
+ unchangedFiles: number;
8
+ deletedFiles: number;
9
+ removedFiles: number;
10
+ skippedEmptyFiles: number;
11
+ skippedSmallFiles: number;
12
+ totalChunks: number;
13
+ finalCount: number;
14
+ manifestStatus: "ok" | "missing" | "corrupt";
15
+ rebuildPerformed: boolean;
16
+ batchesFlushed: number;
17
+ }
18
+ export interface IndexStatusSummary {
19
+ manifestStatus: "ok" | "missing" | "corrupt";
20
+ manifestEntries: number;
21
+ upToDateFiles: number;
22
+ pendingFiles: number;
23
+ lastIndexedAt?: number;
24
+ rebuildRequired: boolean;
25
+ }
26
+ interface Logger {
27
+ info(message: string): void;
28
+ warn(message: string): void;
29
+ }
30
+ export interface RunIndexPassOptions {
31
+ cwd: string;
32
+ storePath: string;
33
+ config: RagConfig;
34
+ store: VectorStore;
35
+ embedder: EmbeddingProvider;
36
+ force?: boolean;
37
+ logger?: Partial<Logger>;
38
+ }
39
+ export interface WatchPassScheduler {
40
+ notifyChange(): void;
41
+ waitForIdle(): Promise<void>;
42
+ close(): void;
43
+ }
44
+ export declare function walkFiles(dir: string, extensions: Set<string>, excludeDirs: Set<string>): Promise<string[]>;
45
+ export declare function runIndexPass(options: RunIndexPassOptions): Promise<IndexRunStats>;
46
+ export declare function getIndexStatusSummary(cwd: string, storePath: string, config: RagConfig, store: VectorStore): Promise<IndexStatusSummary>;
47
+ export declare function createWatchPassScheduler(runPass: () => Promise<void>, onError: (error: unknown) => void, debounceMs?: number): WatchPassScheduler;
48
+ export declare function createWatchIgnore(cwd: string, config: RagConfig, storePath: string): (watchedPath: string) => boolean;
49
+ export {};