@ninjaxtools/slopdex 0.19.0 → 0.20.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 (60) hide show
  1. package/.gitignore +2 -0
  2. package/README.md +134 -46
  3. package/binary-install.js +348 -0
  4. package/binary.js +124 -0
  5. package/install.js +4 -0
  6. package/npm-shrinkwrap.json +52 -0
  7. package/package.json +78 -61
  8. package/run-slopdex.js +4 -0
  9. package/dist/chunk-5BO2LLXC.js +0 -15
  10. package/dist/chunk-5BO2LLXC.js.map +0 -1
  11. package/dist/chunk-BXWO2KMC.js +0 -20
  12. package/dist/chunk-BXWO2KMC.js.map +0 -1
  13. package/dist/chunk-DKRB2XT5.js +0 -33
  14. package/dist/chunk-DKRB2XT5.js.map +0 -1
  15. package/dist/chunk-DTI7SXGL.js +0 -109
  16. package/dist/chunk-DTI7SXGL.js.map +0 -1
  17. package/dist/chunk-GBEJHETS.js +0 -1117
  18. package/dist/chunk-GBEJHETS.js.map +0 -1
  19. package/dist/chunk-HMKVMRLF.js +0 -2221
  20. package/dist/chunk-HMKVMRLF.js.map +0 -1
  21. package/dist/chunk-IQU3YVZ3.js +0 -85
  22. package/dist/chunk-IQU3YVZ3.js.map +0 -1
  23. package/dist/chunk-JAVPHCZH.js +0 -24
  24. package/dist/chunk-JAVPHCZH.js.map +0 -1
  25. package/dist/chunk-MKUTTXZB.js +0 -74
  26. package/dist/chunk-MKUTTXZB.js.map +0 -1
  27. package/dist/chunk-OIKBO3NJ.js +0 -133
  28. package/dist/chunk-OIKBO3NJ.js.map +0 -1
  29. package/dist/chunk-P57ZJREE.js +0 -426
  30. package/dist/chunk-P57ZJREE.js.map +0 -1
  31. package/dist/chunk-S225GYCL.js +0 -79
  32. package/dist/chunk-S225GYCL.js.map +0 -1
  33. package/dist/chunk-TSURHRFF.js +0 -240
  34. package/dist/chunk-TSURHRFF.js.map +0 -1
  35. package/dist/chunk-VH5VGRCI.js +0 -103
  36. package/dist/chunk-VH5VGRCI.js.map +0 -1
  37. package/dist/cli.d.ts +0 -1
  38. package/dist/cli.js +0 -1130
  39. package/dist/cli.js.map +0 -1
  40. package/dist/code-index-MWSJKV3G.js +0 -14
  41. package/dist/code-index-MWSJKV3G.js.map +0 -1
  42. package/dist/cross-search-ERBFC25T.js +0 -10
  43. package/dist/cross-search-ERBFC25T.js.map +0 -1
  44. package/dist/database-P5XWJWQL.js +0 -14
  45. package/dist/database-P5XWJWQL.js.map +0 -1
  46. package/dist/hosted-GHIUHKOU.js +0 -13
  47. package/dist/hosted-GHIUHKOU.js.map +0 -1
  48. package/dist/index.d.ts +0 -681
  49. package/dist/index.js +0 -102
  50. package/dist/index.js.map +0 -1
  51. package/dist/jina-43RL7C6M.js +0 -12
  52. package/dist/jina-43RL7C6M.js.map +0 -1
  53. package/dist/openai-CYUPNBGB.js +0 -12
  54. package/dist/openai-CYUPNBGB.js.map +0 -1
  55. package/dist/openai-EC6THXKV.js +0 -21
  56. package/dist/openai-EC6THXKV.js.map +0 -1
  57. package/dist/openai-TCRXM66O.js +0 -11
  58. package/dist/openai-TCRXM66O.js.map +0 -1
  59. package/docs/implementation.md +0 -162
  60. package/docs/reference.md +0 -187
package/binary.js ADDED
@@ -0,0 +1,124 @@
1
+ const { Package } = require("./binary-install");
2
+ const os = require("os");
3
+ const libc = require("detect-libc");
4
+
5
+ const error = (msg) => {
6
+ console.error(msg);
7
+ process.exit(1);
8
+ };
9
+
10
+ const {
11
+ name,
12
+ artifactDownloadUrls,
13
+ supportedPlatforms,
14
+ glibcMinimum,
15
+ } = require("./package.json");
16
+
17
+ // FIXME: implement NPM installer handling of fallback download URLs
18
+ const artifactDownloadUrl = artifactDownloadUrls[0];
19
+ const builderGlibcMajorVersion = glibcMinimum.major;
20
+ const builderGlibcMinorVersion = glibcMinimum.series;
21
+
22
+ const getPlatform = () => {
23
+ const rawOsType = os.type();
24
+ const rawArchitecture = os.arch();
25
+
26
+ // We want to use rust-style target triples as the canonical key
27
+ // for a platform, so translate the "os" library's concepts into rust ones
28
+ let osType = "";
29
+ switch (rawOsType) {
30
+ case "Windows_NT":
31
+ osType = "pc-windows-msvc";
32
+ break;
33
+ case "Darwin":
34
+ osType = "apple-darwin";
35
+ break;
36
+ case "Linux":
37
+ osType = "unknown-linux-gnu";
38
+ break;
39
+ }
40
+
41
+ let arch = "";
42
+ switch (rawArchitecture) {
43
+ case "x64":
44
+ arch = "x86_64";
45
+ break;
46
+ case "arm64":
47
+ arch = "aarch64";
48
+ break;
49
+ }
50
+
51
+ if (rawOsType === "Linux") {
52
+ if (libc.familySync() == "musl") {
53
+ osType = "unknown-linux-musl-dynamic";
54
+ } else if (libc.isNonGlibcLinuxSync()) {
55
+ console.warn(
56
+ "Your libc is neither glibc nor musl; trying static musl binary instead",
57
+ );
58
+ osType = "unknown-linux-musl-static";
59
+ } else {
60
+ let libcVersion = libc.versionSync();
61
+ let splitLibcVersion = libcVersion.split(".");
62
+ let libcMajorVersion = splitLibcVersion[0];
63
+ let libcMinorVersion = splitLibcVersion[1];
64
+ if (
65
+ libcMajorVersion != builderGlibcMajorVersion ||
66
+ libcMinorVersion < builderGlibcMinorVersion
67
+ ) {
68
+ // We can't run the glibc binaries, but we can run the static musl ones
69
+ // if they exist
70
+ console.warn(
71
+ "Your glibc isn't compatible; trying static musl binary instead",
72
+ );
73
+ osType = "unknown-linux-musl-static";
74
+ }
75
+ }
76
+ }
77
+
78
+ // Assume the above succeeded and build a target triple to look things up with.
79
+ // If any of it failed, this lookup will fail and we'll handle it like normal.
80
+ let targetTriple = `${arch}-${osType}`;
81
+ let platform = supportedPlatforms[targetTriple];
82
+
83
+ if (!platform) {
84
+ error(
85
+ `Platform with type "${rawOsType}" and architecture "${rawArchitecture}" is not supported by ${name}.\nYour system must be one of the following:\n\n${Object.keys(
86
+ supportedPlatforms,
87
+ ).join(",")}`,
88
+ );
89
+ }
90
+
91
+ return platform;
92
+ };
93
+
94
+ const getPackage = () => {
95
+ const platform = getPlatform();
96
+ const url = `${artifactDownloadUrl}/${platform.artifactName}`;
97
+ let filename = platform.artifactName;
98
+ let ext = platform.zipExt;
99
+ let binary = new Package(platform, name, url, filename, ext, platform.bins);
100
+
101
+ return binary;
102
+ };
103
+
104
+ const install = (suppressLogs) => {
105
+ if (!artifactDownloadUrl || artifactDownloadUrl.length === 0) {
106
+ console.warn("in demo mode, not installing binaries");
107
+ return;
108
+ }
109
+ const pkg = getPackage();
110
+
111
+ return pkg.install(suppressLogs);
112
+ };
113
+
114
+ const run = (binaryName) => {
115
+ const pkg = getPackage();
116
+
117
+ pkg.run(binaryName);
118
+ };
119
+
120
+ module.exports = {
121
+ install,
122
+ run,
123
+ getPackage,
124
+ };
package/install.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { install } = require("./binary");
4
+ install(false);
@@ -0,0 +1,52 @@
1
+ {
2
+ "lockfileVersion": 3,
3
+ "name": "@ninjaxtools/slopdex",
4
+ "packages": {
5
+ "": {
6
+ "bin": {
7
+ "slopdex": "run-slopdex.js"
8
+ },
9
+ "dependencies": {
10
+ "detect-libc": "^2.1.2"
11
+ },
12
+ "devDependencies": {
13
+ "prettier": "^3.8.3"
14
+ },
15
+ "engines": {
16
+ "node": ">=14.14",
17
+ "npm": ">=6"
18
+ },
19
+ "hasInstallScript": true,
20
+ "license": "MIT",
21
+ "name": "@ninjaxtools/slopdex",
22
+ "version": "0.20.0"
23
+ },
24
+ "node_modules/detect-libc": {
25
+ "engines": {
26
+ "node": ">=8"
27
+ },
28
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
29
+ "license": "Apache-2.0",
30
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
31
+ "version": "2.1.2"
32
+ },
33
+ "node_modules/prettier": {
34
+ "bin": {
35
+ "prettier": "bin/prettier.cjs"
36
+ },
37
+ "dev": true,
38
+ "engines": {
39
+ "node": ">=14"
40
+ },
41
+ "funding": {
42
+ "url": "https://github.com/prettier/prettier?sponsor=1"
43
+ },
44
+ "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==",
45
+ "license": "MIT",
46
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz",
47
+ "version": "3.8.3"
48
+ }
49
+ },
50
+ "requires": true,
51
+ "version": "0.20.0"
52
+ }
package/package.json CHANGED
@@ -1,71 +1,88 @@
1
1
  {
2
- "name": "@ninjaxtools/slopdex",
3
- "version": "0.19.0",
4
- "description": "Tree-sitter callable-level semantic indexing, search, and duplicate discovery for Python, JavaScript, TypeScript, Rust, Go, Java, and C",
5
- "license": "MIT",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/ninjaxtools/slopdex.git"
2
+ "artifactDownloadUrls": [
3
+ "https://github.com/ninjaxtools/slopdex/releases/download/v0.20.0"
4
+ ],
5
+ "bin": {
6
+ "slopdex": "run-slopdex.js"
9
7
  },
10
- "type": "module",
11
- "main": "dist/index.js",
12
- "types": "dist/index.d.ts",
13
- "exports": {
14
- ".": {
15
- "types": "./dist/index.d.ts",
16
- "import": "./dist/index.js"
17
- }
8
+ "dependencies": {
9
+ "detect-libc": "^2.1.2"
18
10
  },
19
- "bin": {
20
- "slopdex": "dist/cli.js"
11
+ "description": "Semantic code and Markdown search with SQLite and USearch",
12
+ "devDependencies": {
13
+ "prettier": "^3.8.3"
21
14
  },
22
- "files": [
23
- ".agents/skills/slopdex/SKILL.md",
24
- "dist",
25
- "docs/implementation.md",
26
- "docs/reference.md",
27
- "README.md",
28
- "scripts/install-opencode-skill.mjs"
29
- ],
30
15
  "engines": {
31
- "node": ">=24.0.0"
16
+ "node": ">=14.14",
17
+ "npm": ">=6"
18
+ },
19
+ "glibcMinimum": {
20
+ "major": 2,
21
+ "series": 39
32
22
  },
23
+ "license": "MIT",
24
+ "name": "@ninjaxtools/slopdex",
25
+ "preferUnplugged": true,
26
+ "repository": "https://github.com/ninjaxtools/slopdex",
33
27
  "scripts": {
34
- "build": "tsup",
35
- "dev": "tsx src/cli.ts",
36
- "typecheck": "tsc --noEmit",
37
- "test": "vitest",
38
- "test:run": "vitest run",
39
- "smoke": "node scripts/smoke.mjs",
40
- "install:local": "npm run build && npm install -g .",
41
- "publish:minor": "npm version minor && npm publish --access public",
42
- "prepack": "npm run build && npm run smoke",
43
- "check": "npm run typecheck && npm run test:run && npm run build && npm run smoke"
28
+ "fmt": "prettier --write **/*.js",
29
+ "fmt:check": "prettier --check **/*.js",
30
+ "postinstall": "node ./install.js"
44
31
  },
45
- "dependencies": {
46
- "@ai-sdk/anthropic": "^4.0.53",
47
- "@ai-sdk/google": "^4.0.69",
48
- "@ai-sdk/openai": "^4.0.66",
49
- "@ai-sdk/openai-compatible": "^3.0.48",
50
- "ai": "^7.0.99",
51
- "ignore": "^7.0.9",
52
- "install": "^0.13.0",
53
- "js-tiktoken": "^1.0.21",
54
- "sqlite-vec": "^0.1.9",
55
- "tree-sitter": "^0.21.1",
56
- "tree-sitter-c": "0.21.4",
57
- "tree-sitter-go": "0.23.4",
58
- "tree-sitter-java": "0.23.5",
59
- "tree-sitter-javascript": "^0.23.1",
60
- "tree-sitter-python": "0.23.2",
61
- "tree-sitter-rust": "0.21.0",
62
- "tree-sitter-typescript": "^0.23.2"
32
+ "supportedPlatforms": {
33
+ "aarch64-apple-darwin": {
34
+ "artifactName": "slopdex-aarch64-apple-darwin.tar.xz",
35
+ "bins": {
36
+ "slopdex": "slopdex"
37
+ },
38
+ "zipExt": ".tar.xz"
39
+ },
40
+ "aarch64-pc-windows-msvc": {
41
+ "artifactName": "slopdex-x86_64-pc-windows-msvc.zip",
42
+ "bins": {
43
+ "slopdex": "slopdex.exe"
44
+ },
45
+ "zipExt": ".zip"
46
+ },
47
+ "aarch64-unknown-linux-gnu": {
48
+ "artifactName": "slopdex-aarch64-unknown-linux-gnu.tar.xz",
49
+ "bins": {
50
+ "slopdex": "slopdex"
51
+ },
52
+ "zipExt": ".tar.xz"
53
+ },
54
+ "x86_64-apple-darwin": {
55
+ "artifactName": "slopdex-x86_64-apple-darwin.tar.xz",
56
+ "bins": {
57
+ "slopdex": "slopdex"
58
+ },
59
+ "zipExt": ".tar.xz"
60
+ },
61
+ "x86_64-pc-windows-gnu": {
62
+ "artifactName": "slopdex-x86_64-pc-windows-msvc.zip",
63
+ "bins": {
64
+ "slopdex": "slopdex.exe"
65
+ },
66
+ "zipExt": ".zip"
67
+ },
68
+ "x86_64-pc-windows-msvc": {
69
+ "artifactName": "slopdex-x86_64-pc-windows-msvc.zip",
70
+ "bins": {
71
+ "slopdex": "slopdex.exe"
72
+ },
73
+ "zipExt": ".zip"
74
+ },
75
+ "x86_64-unknown-linux-gnu": {
76
+ "artifactName": "slopdex-x86_64-unknown-linux-gnu.tar.xz",
77
+ "bins": {
78
+ "slopdex": "slopdex"
79
+ },
80
+ "zipExt": ".tar.xz"
81
+ }
63
82
  },
64
- "devDependencies": {
65
- "@types/node": "^24.0.0",
66
- "tsup": "^8.5.0",
67
- "tsx": "^4.20.0",
68
- "typescript": "^5.9.0",
69
- "vitest": "^3.2.0"
83
+ "version": "0.20.0",
84
+ "volta": {
85
+ "node": "18.14.1",
86
+ "npm": "9.5.0"
70
87
  }
71
- }
88
+ }
package/run-slopdex.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { run } = require("./binary");
4
+ run("slopdex");
@@ -1,15 +0,0 @@
1
- // src/search/similarity.ts
2
- var SIMILARITY_CACHE_FLOOR_ANCHOR = 0.3;
3
- function similarityCacheFloor(minSimilarity) {
4
- return Math.min(minSimilarity ?? -1, SIMILARITY_CACHE_FLOOR_ANCHOR);
5
- }
6
- function analysisSimilarity(source, target = source) {
7
- const complete = (status) => status.descriptionsEnabled && status.descriptionProfile !== null && status.descriptionCount === status.functionCount && status.fileDescriptionCount === status.describableFileCount;
8
- return complete(source) && complete(target) ? { similarityMode: "code-description-file-average", similarityWeights: { code: 1 / 3, description: 1 / 3, fileDescription: 1 / 3 } } : { similarityMode: "code", similarityWeights: { code: 1, description: 0, fileDescription: 0 } };
9
- }
10
-
11
- export {
12
- similarityCacheFloor,
13
- analysisSimilarity
14
- };
15
- //# sourceMappingURL=chunk-5BO2LLXC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/search/similarity.ts"],"sourcesContent":["import type { AnalysisSimilarity, IndexStatus } from \"../types.js\";\n\n/**\n * Floor the persisted similarity cache is routinely built for. Analysis entry\n * points anchor their refresh floor here unless the caller asks for less, so\n * sweeping thresholds at or above the default shares one cache band: higher\n * floors read it for free and only a lower floor triggers an expansion\n * recompute. Matches the CLI default threshold.\n */\nexport const SIMILARITY_CACHE_FLOOR_ANCHOR = 0.3;\n\n/** Anchor a requested refresh floor so threshold sweeps share one cache band. */\nexport function similarityCacheFloor(minSimilarity?: number): number {\n return Math.min(minSimilarity ?? -1, SIMILARITY_CACHE_FLOOR_ANCHOR);\n}\n\n/** Select one scoring mode for the entire analysis, never a per-pair fallback. */\nexport function analysisSimilarity(source: IndexStatus, target: IndexStatus = source): AnalysisSimilarity {\n const complete = (status: IndexStatus): boolean => status.descriptionsEnabled\n && status.descriptionProfile !== null\n && status.descriptionCount === status.functionCount\n && status.fileDescriptionCount === status.describableFileCount;\n return complete(source) && complete(target)\n ? { similarityMode: \"code-description-file-average\", similarityWeights: { code: 1 / 3, description: 1 / 3, fileDescription: 1 / 3 } }\n : { similarityMode: \"code\", similarityWeights: { code: 1, description: 0, fileDescription: 0 } };\n}\n"],"mappings":";AASO,IAAM,gCAAgC;AAGtC,SAAS,qBAAqB,eAAgC;AACnE,SAAO,KAAK,IAAI,iBAAiB,IAAI,6BAA6B;AACpE;AAGO,SAAS,mBAAmB,QAAqB,SAAsB,QAA4B;AACxG,QAAM,WAAW,CAAC,WAAiC,OAAO,uBACrD,OAAO,uBAAuB,QAC9B,OAAO,qBAAqB,OAAO,iBACnC,OAAO,yBAAyB,OAAO;AAC5C,SAAO,SAAS,MAAM,KAAK,SAAS,MAAM,IACtC,EAAE,gBAAgB,iCAAiC,mBAAmB,EAAE,MAAM,IAAI,GAAG,aAAa,IAAI,GAAG,iBAAiB,IAAI,EAAE,EAAE,IAClI,EAAE,gBAAgB,QAAQ,mBAAmB,EAAE,MAAM,GAAG,aAAa,GAAG,iBAAiB,EAAE,EAAE;AACnG;","names":[]}
@@ -1,20 +0,0 @@
1
- import {
2
- writeStderr
3
- } from "./chunk-S225GYCL.js";
4
-
5
- // src/model-call-notice.ts
6
- var reportedCalls = /* @__PURE__ */ new Set();
7
- function reportModelCall(kind, profile, verbose = false, parallelism = 1) {
8
- const key = JSON.stringify([kind, profile.provider, profile.model, parallelism]);
9
- if (!verbose && reportedCalls.has(key)) return;
10
- reportedCalls.add(key);
11
- writeStderr(
12
- `slopdex: notice: external model call: kind=${kind} provider=${JSON.stringify(profile.provider)} model=${JSON.stringify(profile.model)} parallelism=${parallelism}
13
- `
14
- );
15
- }
16
-
17
- export {
18
- reportModelCall
19
- };
20
- //# sourceMappingURL=chunk-BXWO2KMC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/model-call-notice.ts"],"sourcesContent":["import { writeStderr } from \"./progress.js\";\n\nconst reportedCalls = new Set<string>();\n\nexport type ModelCallKind = \"vectors\" | \"descriptions\" | \"reranking\";\n\nexport function reportModelCall(\n kind: ModelCallKind,\n profile: { provider: string; model: string },\n verbose = false,\n parallelism = 1,\n): void {\n const key = JSON.stringify([kind, profile.provider, profile.model, parallelism]);\n if (!verbose && reportedCalls.has(key)) return;\n reportedCalls.add(key);\n writeStderr(\n `slopdex: notice: external model call: kind=${kind} provider=${JSON.stringify(profile.provider)} model=${JSON.stringify(profile.model)} parallelism=${parallelism}\\n`,\n );\n}\n"],"mappings":";;;;;AAEA,IAAM,gBAAgB,oBAAI,IAAY;AAI/B,SAAS,gBACd,MACA,SACA,UAAU,OACV,cAAc,GACR;AACN,QAAM,MAAM,KAAK,UAAU,CAAC,MAAM,QAAQ,UAAU,QAAQ,OAAO,WAAW,CAAC;AAC/E,MAAI,CAAC,WAAW,cAAc,IAAI,GAAG,EAAG;AACxC,gBAAc,IAAI,GAAG;AACrB;AAAA,IACE,8CAA8C,IAAI,aAAa,KAAK,UAAU,QAAQ,QAAQ,CAAC,UAAU,KAAK,UAAU,QAAQ,KAAK,CAAC,gBAAgB,WAAW;AAAA;AAAA,EACnK;AACF;","names":[]}
@@ -1,33 +0,0 @@
1
- // src/errors.ts
2
- var CodeIndexError = class extends Error {
3
- constructor(message, options) {
4
- super(message, options);
5
- this.name = "CodeIndexError";
6
- }
7
- };
8
- var GitDivergenceError = class extends CodeIndexError {
9
- constructor(checkpoint, target) {
10
- super(`Stored Git checkpoint ${checkpoint} is not an ancestor of ${target}; rebuild the index.`);
11
- this.name = "GitDivergenceError";
12
- }
13
- };
14
- var GitUnavailableError = class extends CodeIndexError {
15
- constructor(message, options) {
16
- super(message, options);
17
- this.name = "GitUnavailableError";
18
- }
19
- };
20
- var IncompatibleIndexError = class extends CodeIndexError {
21
- constructor(message) {
22
- super(message);
23
- this.name = "IncompatibleIndexError";
24
- }
25
- };
26
-
27
- export {
28
- CodeIndexError,
29
- GitDivergenceError,
30
- GitUnavailableError,
31
- IncompatibleIndexError
32
- };
33
- //# sourceMappingURL=chunk-DKRB2XT5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export class CodeIndexError extends Error {\n public constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"CodeIndexError\";\n }\n}\n\nexport class GitDivergenceError extends CodeIndexError {\n public constructor(checkpoint: string, target: string) {\n super(`Stored Git checkpoint ${checkpoint} is not an ancestor of ${target}; rebuild the index.`);\n this.name = \"GitDivergenceError\";\n }\n}\n\nexport class GitUnavailableError extends CodeIndexError {\n public constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GitUnavailableError\";\n }\n}\n\nexport class IncompatibleIndexError extends CodeIndexError {\n public constructor(message: string) {\n super(message);\n this.name = \"IncompatibleIndexError\";\n }\n}\n"],"mappings":";AAAO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACjC,YAAY,SAAiB,SAAwB;AAC1D,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EAC9C,YAAY,YAAoB,QAAgB;AACrD,UAAM,yBAAyB,UAAU,0BAA0B,MAAM,sBAAsB;AAC/F,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAC/C,YAAY,SAAiB,SAAwB;AAC1D,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,yBAAN,cAAqC,eAAe;AAAA,EAClD,YAAY,SAAiB;AAClC,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -1,109 +0,0 @@
1
- import {
2
- reportModelCall
3
- } from "./chunk-BXWO2KMC.js";
4
- import {
5
- assertPositiveInteger,
6
- throwIfAborted
7
- } from "./chunk-VH5VGRCI.js";
8
- import {
9
- CodeIndexError
10
- } from "./chunk-DKRB2XT5.js";
11
-
12
- // src/rerankers/hosted.ts
13
- var HostedReranker = class {
14
- profile;
15
- #apiKey;
16
- #url;
17
- #returnDocuments;
18
- #verbose;
19
- constructor(options, settings) {
20
- this.#apiKey = options.apiKey ?? process.env[settings.apiKeyName] ?? "";
21
- if (!this.#apiKey) throw new Error(`${settings.apiKeyName} is required.`);
22
- const model = options.model ?? settings.defaultModel;
23
- if (!model.trim()) throw new Error("reranker model must not be empty.");
24
- this.profile = { provider: settings.provider, model };
25
- this.#verbose = options.verbose ?? false;
26
- const url = (options.baseUrl ?? settings.defaultUrl).replace(/\/$/, "");
27
- this.#url = url.endsWith("/rerank") ? url : `${url}/rerank`;
28
- this.#returnDocuments = settings.returnDocuments;
29
- }
30
- async rerank(query, documents, options = {}) {
31
- if (documents.length === 0) return [];
32
- const limit = options.limit ?? documents.length;
33
- assertPositiveInteger(limit, "rerank limit");
34
- throwIfAborted(options.signal);
35
- reportModelCall("reranking", this.profile, this.#verbose);
36
- let response;
37
- try {
38
- response = await fetch(this.#url, {
39
- method: "POST",
40
- headers: {
41
- accept: "application/json",
42
- authorization: `Bearer ${this.#apiKey}`,
43
- "content-type": "application/json"
44
- },
45
- body: JSON.stringify({
46
- model: this.profile.model,
47
- query,
48
- documents,
49
- top_n: Math.min(limit, documents.length),
50
- ...this.#returnDocuments !== void 0 ? { return_documents: this.#returnDocuments } : {}
51
- }),
52
- ...options.signal ? { signal: options.signal } : {}
53
- });
54
- } catch (error) {
55
- if (options.signal?.aborted) throw error;
56
- throw new CodeIndexError(`Reranking request failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
57
- }
58
- if (!response.ok) {
59
- throw new CodeIndexError(`Reranking request failed (${response.status}): ${(await response.text()).slice(0, 500)}`);
60
- }
61
- let body;
62
- try {
63
- body = await response.json();
64
- } catch (error) {
65
- throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`, { cause: error });
66
- }
67
- const results = body && typeof body === "object" && "results" in body ? body.results : void 0;
68
- const expected = Math.min(limit, documents.length);
69
- if (!Array.isArray(results) || results.length !== expected) {
70
- throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`);
71
- }
72
- const seen = /* @__PURE__ */ new Set();
73
- return results.map((result) => {
74
- const value = result;
75
- if (!result || typeof result !== "object" || !Number.isInteger(value.index) || value.index < 0 || value.index >= documents.length || typeof value.relevance_score !== "number" || !Number.isFinite(value.relevance_score) || seen.has(value.index)) {
76
- throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`);
77
- }
78
- seen.add(value.index);
79
- return { index: value.index, score: value.relevance_score };
80
- });
81
- }
82
- };
83
- var CohereReranker = class extends HostedReranker {
84
- constructor(options = {}) {
85
- super(options, {
86
- provider: "cohere",
87
- apiKeyName: "COHERE_API_KEY",
88
- defaultModel: "rerank-v4.0-pro",
89
- defaultUrl: "https://api.cohere.com/v2"
90
- });
91
- }
92
- };
93
- var JinaReranker = class extends HostedReranker {
94
- constructor(options = {}) {
95
- super(options, {
96
- provider: "jina",
97
- apiKeyName: "JINA_API_KEY",
98
- defaultModel: "jina-reranker-v3.5",
99
- defaultUrl: "https://api.jina.ai/v1",
100
- returnDocuments: false
101
- });
102
- }
103
- };
104
-
105
- export {
106
- CohereReranker,
107
- JinaReranker
108
- };
109
- //# sourceMappingURL=chunk-DTI7SXGL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/rerankers/hosted.ts"],"sourcesContent":["import { CodeIndexError } from \"../errors.js\";\nimport { reportModelCall } from \"../model-call-notice.js\";\nimport type { Reranker } from \"../types.js\";\nimport { assertPositiveInteger, throwIfAborted } from \"../utils.js\";\n\ninterface HostedRerankerOptions {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n verbose?: boolean;\n}\n\ninterface HostedRerankerSettings {\n provider: \"cohere\" | \"jina\";\n apiKeyName: \"COHERE_API_KEY\" | \"JINA_API_KEY\";\n defaultModel: string;\n defaultUrl: string;\n returnDocuments?: boolean;\n}\n\nabstract class HostedReranker implements Reranker {\n public readonly profile;\n readonly #apiKey: string;\n readonly #url: string;\n readonly #returnDocuments: boolean | undefined;\n readonly #verbose: boolean;\n\n protected constructor(options: HostedRerankerOptions, settings: HostedRerankerSettings) {\n this.#apiKey = options.apiKey ?? process.env[settings.apiKeyName] ?? \"\";\n if (!this.#apiKey) throw new Error(`${settings.apiKeyName} is required.`);\n const model = options.model ?? settings.defaultModel;\n if (!model.trim()) throw new Error(\"reranker model must not be empty.\");\n this.profile = { provider: settings.provider, model } as const;\n this.#verbose = options.verbose ?? false;\n const url = (options.baseUrl ?? settings.defaultUrl).replace(/\\/$/, \"\");\n this.#url = url.endsWith(\"/rerank\") ? url : `${url}/rerank`;\n this.#returnDocuments = settings.returnDocuments;\n }\n\n public async rerank(\n query: string,\n documents: readonly string[],\n options: { limit?: number; signal?: AbortSignal } = {},\n ): Promise<Array<{ index: number; score: number }>> {\n if (documents.length === 0) return [];\n const limit = options.limit ?? documents.length;\n assertPositiveInteger(limit, \"rerank limit\");\n throwIfAborted(options.signal);\n reportModelCall(\"reranking\", this.profile, this.#verbose);\n let response: Response;\n try {\n response = await fetch(this.#url, {\n method: \"POST\",\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${this.#apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.profile.model,\n query,\n documents,\n top_n: Math.min(limit, documents.length),\n ...(this.#returnDocuments !== undefined ? { return_documents: this.#returnDocuments } : {}),\n }),\n ...(options.signal ? { signal: options.signal } : {}),\n });\n } catch (error) {\n if (options.signal?.aborted) throw error;\n throw new CodeIndexError(`Reranking request failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });\n }\n if (!response.ok) {\n throw new CodeIndexError(`Reranking request failed (${response.status}): ${(await response.text()).slice(0, 500)}`);\n }\n let body: unknown;\n try {\n body = await response.json();\n } catch (error) {\n throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`, { cause: error });\n }\n const results = body && typeof body === \"object\" && \"results\" in body\n ? (body as { results?: unknown }).results\n : undefined;\n const expected = Math.min(limit, documents.length);\n if (!Array.isArray(results) || results.length !== expected) {\n throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`);\n }\n const seen = new Set<number>();\n return results.map((result) => {\n const value = result as { index?: unknown; relevance_score?: unknown };\n if (!result || typeof result !== \"object\"\n || !Number.isInteger(value.index) || (value.index as number) < 0 || (value.index as number) >= documents.length\n || typeof value.relevance_score !== \"number\" || !Number.isFinite(value.relevance_score)\n || seen.has(value.index as number)) {\n throw new CodeIndexError(`${this.profile.provider} returned a malformed reranking response.`);\n }\n seen.add(value.index as number);\n return { index: value.index as number, score: value.relevance_score };\n });\n }\n}\n\nexport type CohereRerankerOptions = HostedRerankerOptions;\n\nexport class CohereReranker extends HostedReranker {\n public constructor(options: CohereRerankerOptions = {}) {\n super(options, {\n provider: \"cohere\",\n apiKeyName: \"COHERE_API_KEY\",\n defaultModel: \"rerank-v4.0-pro\",\n defaultUrl: \"https://api.cohere.com/v2\",\n });\n }\n}\n\nexport type JinaRerankerOptions = HostedRerankerOptions;\n\nexport class JinaReranker extends HostedReranker {\n public constructor(options: JinaRerankerOptions = {}) {\n super(options, {\n provider: \"jina\",\n apiKeyName: \"JINA_API_KEY\",\n defaultModel: \"jina-reranker-v3.5\",\n defaultUrl: \"https://api.jina.ai/v1\",\n returnDocuments: false,\n });\n }\n}\n"],"mappings":"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","names":[]}