recker 1.0.15-next.3794a15 → 1.0.15-next.dac946a

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.
@@ -0,0 +1,18 @@
1
+ import type { EmbeddingsData } from './search/types.js';
2
+ declare function getPackageVersion(): string;
3
+ export declare function getEmbeddingsCachePath(version?: string): string;
4
+ export declare function hasLocalEmbeddings(version?: string): boolean;
5
+ export declare function loadLocalEmbeddings(version?: string): EmbeddingsData | null;
6
+ export declare function saveLocalEmbeddings(data: EmbeddingsData, version?: string): void;
7
+ export declare function downloadEmbeddings(version?: string): Promise<EmbeddingsData>;
8
+ export declare function loadBundledEmbeddings(): Promise<EmbeddingsData | null>;
9
+ export interface LoadEmbeddingsOptions {
10
+ forceDownload?: boolean;
11
+ version?: string;
12
+ offline?: boolean;
13
+ debug?: boolean;
14
+ }
15
+ export declare function loadEmbeddings(options?: LoadEmbeddingsOptions): Promise<EmbeddingsData | null>;
16
+ export declare function clearEmbeddingsCache(version?: string): void;
17
+ export { getPackageVersion };
18
+ //# sourceMappingURL=embeddings-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings-loader.d.ts","sourceRoot":"","sources":["../../src/mcp/embeddings-loader.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AA+BxD,iBAAS,iBAAiB,IAAI,MAAM,CAKnC;AAyBD,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/D;AAKD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAKD,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAa3E;AAKD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAUhF;AAKD,wBAAsB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBlF;AAKD,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsB5E;AAED,MAAM,WAAW,qBAAqB;IAEpC,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAsBD,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAsCxG;AAKD,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAW3D;AAKD,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ function getPackageVersionFromPkg() {
5
+ try {
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const paths = [
8
+ join(__dirname, '..', '..', 'package.json'),
9
+ join(__dirname, '..', '..', '..', 'package.json'),
10
+ join(process.cwd(), 'package.json'),
11
+ ];
12
+ for (const pkgPath of paths) {
13
+ if (existsSync(pkgPath)) {
14
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
15
+ if (pkg.name === 'recker') {
16
+ return pkg.version;
17
+ }
18
+ }
19
+ }
20
+ }
21
+ catch {
22
+ }
23
+ return '1.0.15';
24
+ }
25
+ let _packageVersion = null;
26
+ function getPackageVersion() {
27
+ if (!_packageVersion) {
28
+ _packageVersion = getPackageVersionFromPkg();
29
+ }
30
+ return _packageVersion;
31
+ }
32
+ const GITHUB_RELEASE_URL = 'https://github.com/forattini-dev/recker/releases/download';
33
+ function getCacheDir() {
34
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
35
+ if (homeDir) {
36
+ return join(homeDir, '.cache', 'recker');
37
+ }
38
+ try {
39
+ const __dirname = dirname(fileURLToPath(import.meta.url));
40
+ return join(__dirname, '..', '..', 'node_modules', '.cache', 'recker');
41
+ }
42
+ catch {
43
+ return join(process.cwd(), 'node_modules', '.cache', 'recker');
44
+ }
45
+ }
46
+ export function getEmbeddingsCachePath(version) {
47
+ const cacheDir = getCacheDir();
48
+ const ver = version || getPackageVersion();
49
+ return join(cacheDir, `embeddings-${ver}.json`);
50
+ }
51
+ export function hasLocalEmbeddings(version) {
52
+ return existsSync(getEmbeddingsCachePath(version));
53
+ }
54
+ export function loadLocalEmbeddings(version) {
55
+ const cachePath = getEmbeddingsCachePath(version);
56
+ if (!existsSync(cachePath)) {
57
+ return null;
58
+ }
59
+ try {
60
+ const data = readFileSync(cachePath, 'utf-8');
61
+ return JSON.parse(data);
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ export function saveLocalEmbeddings(data, version) {
68
+ const cachePath = getEmbeddingsCachePath(version);
69
+ const cacheDir = dirname(cachePath);
70
+ if (!existsSync(cacheDir)) {
71
+ mkdirSync(cacheDir, { recursive: true });
72
+ }
73
+ writeFileSync(cachePath, JSON.stringify(data));
74
+ }
75
+ export async function downloadEmbeddings(version) {
76
+ const ver = version || getPackageVersion();
77
+ const url = `${GITHUB_RELEASE_URL}/v${ver}/embeddings.json`;
78
+ try {
79
+ const response = await fetch(url);
80
+ if (!response.ok) {
81
+ throw new Error(`Failed to download embeddings: ${response.status} ${response.statusText}`);
82
+ }
83
+ const data = await response.json();
84
+ saveLocalEmbeddings(data, ver);
85
+ return data;
86
+ }
87
+ catch (error) {
88
+ throw new Error(`Failed to download embeddings from ${url}: ${error}`);
89
+ }
90
+ }
91
+ export async function loadBundledEmbeddings() {
92
+ try {
93
+ const __dirname = dirname(fileURLToPath(import.meta.url));
94
+ const bundledPath = join(__dirname, 'data', 'embeddings.json');
95
+ if (existsSync(bundledPath)) {
96
+ const data = readFileSync(bundledPath, 'utf-8');
97
+ return JSON.parse(data);
98
+ }
99
+ const srcPath = join(__dirname, '..', 'mcp', 'data', 'embeddings.json');
100
+ if (existsSync(srcPath)) {
101
+ const data = readFileSync(srcPath, 'utf-8');
102
+ return JSON.parse(data);
103
+ }
104
+ }
105
+ catch {
106
+ }
107
+ return null;
108
+ }
109
+ export async function loadEmbeddings(options = {}) {
110
+ const { forceDownload = false, version, offline = false, debug = false } = options;
111
+ const log = (msg) => {
112
+ if (debug)
113
+ console.log(`[embeddings-loader] ${msg}`);
114
+ };
115
+ if (!forceDownload) {
116
+ const cached = loadLocalEmbeddings(version);
117
+ if (cached) {
118
+ log(`Loaded from cache: ${getEmbeddingsCachePath(version)}`);
119
+ return cached;
120
+ }
121
+ }
122
+ const bundled = await loadBundledEmbeddings();
123
+ if (bundled) {
124
+ log('Loaded bundled embeddings');
125
+ return bundled;
126
+ }
127
+ if (!offline) {
128
+ try {
129
+ log(`Downloading embeddings v${version || getPackageVersion()}...`);
130
+ const downloaded = await downloadEmbeddings(version);
131
+ log(`Downloaded and cached: ${downloaded.documents?.length || 0} documents`);
132
+ return downloaded;
133
+ }
134
+ catch (error) {
135
+ log(`Download failed: ${error}`);
136
+ }
137
+ }
138
+ log('No embeddings available');
139
+ return null;
140
+ }
141
+ export function clearEmbeddingsCache(version) {
142
+ const cachePath = getEmbeddingsCachePath(version);
143
+ try {
144
+ const fs = require('fs');
145
+ if (fs.existsSync(cachePath)) {
146
+ fs.unlinkSync(cachePath);
147
+ }
148
+ }
149
+ catch {
150
+ }
151
+ }
152
+ export { getPackageVersion };
@@ -1,4 +1,5 @@
1
1
  export * from './types.js';
2
2
  export * from './client.js';
3
3
  export * from './server.js';
4
+ export * from './embeddings-loader.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAKA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC"}
package/dist/mcp/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './types.js';
2
2
  export * from './client.js';
3
3
  export * from './server.js';
4
+ export * from './embeddings-loader.js';
@@ -1 +1 @@
1
- {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/search/hybrid-search.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAkBpB,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,kBAAuB;IAYrC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YA+BrC,yBAAyB;IAuDjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmDjF,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,cAAc;IA8GtB,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,MAAM,CAAC,UAAU,CAoCtB;IAKH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,cAAc;IAmBtB,aAAa,IAAI,OAAO;IAOxB,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAYD,OAAO,CAAC,GAAG;CAKZ;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}
1
+ {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../../src/mcp/search/hybrid-search.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,kBAAkB,EAGnB,MAAM,YAAY,CAAC;AAkBpB,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,kBAAuB;IAYrC,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAmCrC,yBAAyB;IAoCjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmDjF,OAAO,CAAC,WAAW;IAiCnB,OAAO,CAAC,cAAc;IA8GtB,OAAO,CAAC,cAAc;IAoDtB,OAAO,CAAC,MAAM,CAAC,UAAU,CAoCtB;IAKH,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,cAAc;IAmBtB,aAAa,IAAI,OAAO;IAOxB,QAAQ,IAAI;QACV,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB;IAYD,OAAO,CAAC,GAAG;CAKZ;AAKD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAE5E"}
@@ -1,5 +1,6 @@
1
1
  import Fuse from 'fuse.js';
2
2
  import { cosineSimilarity, combineScores, levenshtein } from './math.js';
3
+ import { loadEmbeddings } from '../embeddings-loader.js';
3
4
  let cachedEmbeddings = null;
4
5
  export class HybridSearch {
5
6
  fuse = null;
@@ -43,27 +44,12 @@ export class HybridSearch {
43
44
  this.embeddingsData = cachedEmbeddings;
44
45
  }
45
46
  else {
46
- const embeddingsPath = new URL('../data/embeddings.json', import.meta.url);
47
- try {
48
- const response = await fetch(embeddingsPath);
49
- if (response.ok) {
50
- this.embeddingsData = (await response.json());
51
- cachedEmbeddings = this.embeddingsData;
52
- }
53
- }
54
- catch {
55
- try {
56
- const fs = await import('fs');
57
- const path = await import('path');
58
- const embeddingsFile = path.join(path.dirname(new URL(import.meta.url).pathname), '../data/embeddings.json');
59
- if (fs.existsSync(embeddingsFile)) {
60
- const data = fs.readFileSync(embeddingsFile, 'utf-8');
61
- this.embeddingsData = JSON.parse(data);
62
- cachedEmbeddings = this.embeddingsData;
63
- }
64
- }
65
- catch {
66
- }
47
+ const data = await loadEmbeddings({
48
+ debug: this.config.debug,
49
+ });
50
+ if (data) {
51
+ this.embeddingsData = data;
52
+ cachedEmbeddings = data;
67
53
  }
68
54
  }
69
55
  if (this.embeddingsData) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "recker",
3
- "version": "1.0.15-next.3794a15",
3
+ "version": "1.0.15-next.dac946a",
4
4
  "description": "AI & DevX focused HTTP client for Node.js 18+",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -166,7 +166,7 @@
166
166
  "zod": "^3.24.0"
167
167
  },
168
168
  "scripts": {
169
- "build": "tsc && mkdir -p dist/mcp/data && cp src/mcp/data/embeddings.json dist/mcp/data/",
169
+ "build": "tsc",
170
170
  "build:embeddings": "tsx scripts/build-embeddings.ts",
171
171
  "test": "vitest run",
172
172
  "test:coverage": "vitest run --coverage",