@reposkein/mcp 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/binary-digests.json +6 -0
- package/dist/cli/init.d.ts +10 -3
- package/dist/cli/init.js +30 -7
- package/dist/cli/init.js.map +1 -1
- package/dist/embed/cache.d.ts +17 -2
- package/dist/embed/cache.js +33 -5
- package/dist/embed/cache.js.map +1 -1
- package/dist/embed/providers/http.d.ts +1 -0
- package/dist/embed/providers/http.js +24 -5
- package/dist/embed/providers/http.js.map +1 -1
- package/dist/embed/providers/voyage.d.ts +3 -0
- package/dist/embed/providers/voyage.js +36 -9
- package/dist/embed/providers/voyage.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/indexer/fetchBinary.d.ts +20 -3
- package/dist/indexer/fetchBinary.js +93 -12
- package/dist/indexer/fetchBinary.js.map +1 -1
- package/dist/indexer/runIndexer.js +33 -4
- package/dist/indexer/runIndexer.js.map +1 -1
- package/dist/profile/impact.d.ts +6 -2
- package/dist/profile/impact.js +12 -6
- package/dist/profile/impact.js.map +1 -1
- package/dist/store/JsonlGraphStore.js +6 -4
- package/dist/store/JsonlGraphStore.js.map +1 -1
- package/dist/temporal/gitlog.js +11 -6
- package/dist/temporal/gitlog.js.map +1 -1
- package/dist/temporal/temporal.js +39 -5
- package/dist/temporal/temporal.js.map +1 -1
- package/dist/tools/semanticFind.js +7 -3
- package/dist/tools/semanticFind.js.map +1 -1
- package/package.json +34 -4
package/README.md
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img src="https://capsule-render.vercel.app/api?type=waving&color=0:070A12,45:2DD4BF,100:F2B84B&height=150§ion=header&text=RepoSkein&fontColor=EAE7DC&fontSize=56&animation=fadeIn" width="100%" alt="RepoSkein" />
|
|
3
|
+
</div>
|
|
4
|
+
|
|
1
5
|
# @reposkein/mcp
|
|
2
6
|
|
|
3
7
|
**Give your AI coding agent a map of your codebase — instead of letting it grep and guess.**
|
|
4
8
|
|
|
5
|
-
[](https://www.npmjs.com/package/@reposkein/mcp)
|
|
10
|
+
[](https://www.npmjs.com/package/@reposkein/mcp)
|
|
11
|
+
[](https://github.com/reposkein/reposkein/blob/main/LICENSE)
|
|
12
|
+
[](https://modelcontextprotocol.io)
|
|
9
13
|
[](https://skills.sh/reposkein/reposkein)
|
|
14
|
+
[](https://mcpservers.org/servers/reposkein/reposkein)
|
|
10
15
|
[](https://mcpservers.org/servers/reposkein/reposkein)
|
|
11
16
|
|
|
12
17
|
This is the [Model Context Protocol](https://modelcontextprotocol.io) server for [**RepoSkein**](https://github.com/reposkein/reposkein) — a deterministic **code graph** (functions, classes, imports, call edges) built from your repo with [Tree-sitter](https://tree-sitter.github.io/) and served to any MCP-capable agent (Claude Code, Cursor, Codex, …). Your agent navigates structure instead of guessing, and writes short summaries onto the graph as it learns — versioned in git as shared team memory.
|
|
@@ -15,6 +20,8 @@ This is the [Model Context Protocol](https://modelcontextprotocol.io) server for
|
|
|
15
20
|
- 🔒 **Deterministic** — same code → byte-identical graph. No LLM in the construction path.
|
|
16
21
|
- 🌐 **7 languages** — Python, TypeScript, JavaScript, Rust, Go, Java, C#.
|
|
17
22
|
|
|
23
|
+
**Contents:** [Get started](#get-started-30-seconds) · [Tools](#tools) · [How your agent uses it](#how-your-agent-uses-it) · [Configuration](#configuration) · [Embeddings](#optional-semantic-embeddings) · [Learn more](#learn-more)
|
|
24
|
+
|
|
18
25
|
## Get started (≈30 seconds)
|
|
19
26
|
|
|
20
27
|
In the repo you want your agent to understand:
|
|
@@ -36,12 +43,12 @@ That downloads the indexer, sets up git hooks, installs the agent skill, and pri
|
|
|
36
43
|
}
|
|
37
44
|
```
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
`init` already built the graph — verify and commit it:
|
|
40
47
|
|
|
41
48
|
```sh
|
|
42
|
-
reposkein-indexer index . # writes .reposkein/
|
|
43
49
|
reposkein-mcp doctor . # ✓ binary ✓ indexed (N nodes) ✓ ready
|
|
44
50
|
git add .reposkein && git commit -m "add RepoSkein code graph"
|
|
51
|
+
# re-index after big changes: reposkein-mcp index .
|
|
45
52
|
```
|
|
46
53
|
|
|
47
54
|
Then ask your agent *"what calls this function?"* or *"what breaks if I change X?"* — it answers from the graph.
|
|
@@ -118,7 +125,7 @@ REPOSKEIN_EMBED_MODEL=voyage-4-nano # or any model your local server serves
|
|
|
118
125
|
REPOSKEIN_EMBED_DIMS=1024
|
|
119
126
|
```
|
|
120
127
|
|
|
121
|
-
Point this at any OpenAI-compatible local embedding server (
|
|
128
|
+
Point this at any OpenAI-compatible local embedding server. Two easy options: **Ollama** (`ollama pull nomic-embed-text`, URL `http://127.0.0.1:11434/v1/embeddings`, dims 768), or RepoSkein's **one-command `voyage-4-nano` server** — [`embed-server/`](https://github.com/reposkein/reposkein/tree/main/embed-server) (`docker compose up -d`). All text stays on your machine.
|
|
122
129
|
|
|
123
130
|
**How it works:** vectors are cached in `.reposkein/local/embeddings/` (gitignored — never committed, never required). The cache is invalidated per-node when the document content changes. On any embedding error, `semantic_find` silently falls back to the lexical result. Enabling embeddings never changes the committed graph.
|
|
124
131
|
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reposkein-indexer-darwin-arm64": "3bd162f69398c559284cd7a57ece03ddae81b86d8405af1e9e536766ba871dce",
|
|
3
|
+
"reposkein-indexer-linux-arm64": "b8f1ca7fd10f39fa09abc5bddae79b856afd369e050fe17fc407e97edcfa6b40",
|
|
4
|
+
"reposkein-indexer-linux-x64": "852b26709f99e2f5150c9d45878e132a55b1b5b07f05ff651c3183f510eadb20",
|
|
5
|
+
"reposkein-indexer-win32-x64.exe": "94942be4c0760d3b997e8d239ef44611bf0e33a1bdeab1910f238901ec264ac3"
|
|
6
|
+
}
|
package/dist/cli/init.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ export declare function skillTargetPath(repoPath: string): string;
|
|
|
4
4
|
export declare function bundledSkillPath(): string;
|
|
5
5
|
/** MCP server config snippet the user adds to their client (e.g. .mcp.json). */
|
|
6
6
|
export declare function mcpConfigSnippet(repoPath: string): string;
|
|
7
|
-
/** `reposkein-mcp
|
|
8
|
-
*
|
|
9
|
-
|
|
7
|
+
/** `reposkein-mcp index [path]`: (re)build the code graph at `repoPath` using the
|
|
8
|
+
* native indexer. The package-friendly way to index — the `reposkein-indexer`
|
|
9
|
+
* binary is fetched into the package (not on PATH), so end users run this. */
|
|
10
|
+
export declare function runIndex(repoPath?: string): Promise<number>;
|
|
11
|
+
/** `reposkein-mcp init [path] [--no-index]`: ensure the indexer, install hooks +
|
|
12
|
+
* merge driver, build the initial graph, install the navigation skill, and print
|
|
13
|
+
* the MCP config + next steps. Pass `index: false` to skip the initial index. */
|
|
14
|
+
export declare function runInit(repoPath?: string, opts?: {
|
|
15
|
+
index?: boolean;
|
|
16
|
+
}): Promise<number>;
|
package/dist/cli/init.js
CHANGED
|
@@ -21,9 +21,23 @@ export function mcpConfigSnippet(repoPath) {
|
|
|
21
21
|
},
|
|
22
22
|
}, null, 2);
|
|
23
23
|
}
|
|
24
|
-
/** `reposkein-mcp
|
|
25
|
-
*
|
|
26
|
-
|
|
24
|
+
/** `reposkein-mcp index [path]`: (re)build the code graph at `repoPath` using the
|
|
25
|
+
* native indexer. The package-friendly way to index — the `reposkein-indexer`
|
|
26
|
+
* binary is fetched into the package (not on PATH), so end users run this. */
|
|
27
|
+
export async function runIndex(repoPath = ".") {
|
|
28
|
+
const bin = await ensureIndexerBinary();
|
|
29
|
+
const r = await spawnIndexer(bin, ["index", repoPath]);
|
|
30
|
+
if (r.stdout.trim())
|
|
31
|
+
console.error(r.stdout.trim());
|
|
32
|
+
if (r.code !== 0) {
|
|
33
|
+
console.error(`reposkein: index failed: ${r.stderr || r.stdout}`);
|
|
34
|
+
}
|
|
35
|
+
return r.code;
|
|
36
|
+
}
|
|
37
|
+
/** `reposkein-mcp init [path] [--no-index]`: ensure the indexer, install hooks +
|
|
38
|
+
* merge driver, build the initial graph, install the navigation skill, and print
|
|
39
|
+
* the MCP config + next steps. Pass `index: false` to skip the initial index. */
|
|
40
|
+
export async function runInit(repoPath = ".", opts = {}) {
|
|
27
41
|
// 1) Indexer binary (fetches it if needed).
|
|
28
42
|
const bin = await ensureIndexerBinary();
|
|
29
43
|
// 2) Git hooks + JSONL merge driver (needs a git repo).
|
|
@@ -33,7 +47,15 @@ export async function runInit(repoPath = ".") {
|
|
|
33
47
|
console.error(" (is this a git repository? run `git init` first.)");
|
|
34
48
|
return 1;
|
|
35
49
|
}
|
|
36
|
-
// 3)
|
|
50
|
+
// 3) Build the initial code graph (the whole point of setup) unless opted out.
|
|
51
|
+
if (opts.index !== false) {
|
|
52
|
+
console.error("reposkein: building the initial code graph…");
|
|
53
|
+
const ic = await runIndex(repoPath);
|
|
54
|
+
if (ic !== 0) {
|
|
55
|
+
console.error("reposkein: the initial index reported errors (see above) — re-run `reposkein-mcp index` later.");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// 4) Install the navigation skill into the repo.
|
|
37
59
|
const src = bundledSkillPath();
|
|
38
60
|
if (existsSync(src)) {
|
|
39
61
|
const dest = skillTargetPath(repoPath);
|
|
@@ -44,11 +66,12 @@ export async function runInit(repoPath = ".") {
|
|
|
44
66
|
else {
|
|
45
67
|
console.error("reposkein: bundled SKILL.md not found; skipping skill install.");
|
|
46
68
|
}
|
|
47
|
-
//
|
|
69
|
+
// 5) Next steps + MCP config.
|
|
48
70
|
console.error("\nreposkein: ready. Add this MCP server to your client config:\n");
|
|
49
71
|
console.error(mcpConfigSnippet(repoPath));
|
|
50
|
-
console.error("\
|
|
51
|
-
"
|
|
72
|
+
console.error("\nCommit the generated .reposkein/ directory so the graph + summaries are shared with your team." +
|
|
73
|
+
"\nVerify anytime with `reposkein-mcp doctor`; re-index after big changes with `reposkein-mcp index` " +
|
|
74
|
+
"(or the agent's reindex_file / init_cpg_skeleton tools).");
|
|
52
75
|
return 0;
|
|
53
76
|
}
|
|
54
77
|
//# sourceMappingURL=init.js.map
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,OAAO,EAAE,eAAe;gBACxB,GAAG,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE;aACvC;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
package/dist/embed/cache.d.ts
CHANGED
|
@@ -32,10 +32,25 @@ export interface EmbedRecord {
|
|
|
32
32
|
export declare function buildDocString(node: CorpusNode): string;
|
|
33
33
|
/** SHA-256 of a string, hex-encoded. */
|
|
34
34
|
export declare function sha256(s: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* Sanitize a model id so it is safe to use as a filename component.
|
|
37
|
+
* HuggingFace-style ids ("org/model-name") contain slashes that would create
|
|
38
|
+
* subdirectories; other chars like backslash or NUL could collide or confuse
|
|
39
|
+
* the FS. Replace any run of unsafe characters with "_".
|
|
40
|
+
*/
|
|
41
|
+
export declare function sanitizeModelId(modelId: string): string;
|
|
35
42
|
/** Derive the cache file path for a given repo root + provider. */
|
|
36
43
|
export declare function cachePath(repoPath: string, provider: EmbeddingProvider): string;
|
|
37
|
-
/**
|
|
38
|
-
|
|
44
|
+
/**
|
|
45
|
+
* Load cache into a Map keyed by node id. Missing file → empty map. Best-effort.
|
|
46
|
+
*
|
|
47
|
+
* Row validation: any row whose `v` is not an array of finite numbers of the
|
|
48
|
+
* correct length (matching provider.dims) is dropped — treated as a miss so
|
|
49
|
+
* it will be re-embedded. Pass `expectedDims` to enable dim-length validation;
|
|
50
|
+
* omit (undefined) to skip the length check (e.g. when the provider is not known
|
|
51
|
+
* at load time — but the embedCorpus function always passes it).
|
|
52
|
+
*/
|
|
53
|
+
export declare function loadCache(path: string, expectedDims?: number): Map<string, EmbedRecord>;
|
|
39
54
|
/** Rewrite the cache file (sorted by id). Atomic: write to .tmp then rename. Best-effort. */
|
|
40
55
|
export declare function saveCache(path: string, records: Map<string, EmbedRecord>): void;
|
|
41
56
|
/**
|
package/dist/embed/cache.js
CHANGED
|
@@ -36,13 +36,33 @@ export function buildDocString(node) {
|
|
|
36
36
|
export function sha256(s) {
|
|
37
37
|
return createHash("sha256").update(s, "utf8").digest("hex");
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Sanitize a model id so it is safe to use as a filename component.
|
|
41
|
+
* HuggingFace-style ids ("org/model-name") contain slashes that would create
|
|
42
|
+
* subdirectories; other chars like backslash or NUL could collide or confuse
|
|
43
|
+
* the FS. Replace any run of unsafe characters with "_".
|
|
44
|
+
*/
|
|
45
|
+
export function sanitizeModelId(modelId) {
|
|
46
|
+
// Replace /, \, :, *, ?, ", <, >, |, NUL and control chars with "_"
|
|
47
|
+
// Also collapse multiple consecutive underscores to avoid "___"-confusing names.
|
|
48
|
+
return modelId.replace(/[/\\:*?"<>|\x00-\x1f]+/g, "_");
|
|
49
|
+
}
|
|
39
50
|
/** Derive the cache file path for a given repo root + provider. */
|
|
40
51
|
export function cachePath(repoPath, provider) {
|
|
41
|
-
const
|
|
52
|
+
const safeModel = sanitizeModelId(provider.modelId());
|
|
53
|
+
const name = `${provider.id()}__${safeModel}__d${provider.dims()}`;
|
|
42
54
|
return join(repoPath, ".reposkein", "local", "embeddings", `${name}.jsonl`);
|
|
43
55
|
}
|
|
44
|
-
/**
|
|
45
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Load cache into a Map keyed by node id. Missing file → empty map. Best-effort.
|
|
58
|
+
*
|
|
59
|
+
* Row validation: any row whose `v` is not an array of finite numbers of the
|
|
60
|
+
* correct length (matching provider.dims) is dropped — treated as a miss so
|
|
61
|
+
* it will be re-embedded. Pass `expectedDims` to enable dim-length validation;
|
|
62
|
+
* omit (undefined) to skip the length check (e.g. when the provider is not known
|
|
63
|
+
* at load time — but the embedCorpus function always passes it).
|
|
64
|
+
*/
|
|
65
|
+
export function loadCache(path, expectedDims) {
|
|
46
66
|
const map = new Map();
|
|
47
67
|
if (!existsSync(path))
|
|
48
68
|
return map;
|
|
@@ -61,10 +81,18 @@ export function loadCache(path) {
|
|
|
61
81
|
if (typeof o["id"] === "string" &&
|
|
62
82
|
typeof o["doc_hash"] === "string" &&
|
|
63
83
|
Array.isArray(o["v"])) {
|
|
84
|
+
const v = o["v"];
|
|
85
|
+
// Validate: every element must be a finite number
|
|
86
|
+
const allFinite = v.every((x) => typeof x === "number" && isFinite(x));
|
|
87
|
+
if (!allFinite)
|
|
88
|
+
continue; // corrupt row — drop it (will be re-embedded)
|
|
89
|
+
// Validate: length must match the expected dims (when known)
|
|
90
|
+
if (expectedDims !== undefined && v.length !== expectedDims)
|
|
91
|
+
continue;
|
|
64
92
|
map.set(o["id"], {
|
|
65
93
|
id: o["id"],
|
|
66
94
|
doc_hash: o["doc_hash"],
|
|
67
|
-
v:
|
|
95
|
+
v: v,
|
|
68
96
|
});
|
|
69
97
|
}
|
|
70
98
|
}
|
|
@@ -107,7 +135,7 @@ export function saveCache(path, records) {
|
|
|
107
135
|
*/
|
|
108
136
|
export async function embedCorpus(provider, repoPath, corpus) {
|
|
109
137
|
const path = cachePath(repoPath, provider);
|
|
110
|
-
const cache = loadCache(path);
|
|
138
|
+
const cache = loadCache(path, provider.dims());
|
|
111
139
|
// Compute document strings + hashes for all corpus nodes
|
|
112
140
|
const docStrings = new Map();
|
|
113
141
|
const docHashes = new Map();
|
package/dist/embed/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/embed/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACrG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAYzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,MAAM,KAAK,GAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,QAA2B;IACrE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/embed/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,7 @@ export declare class HttpEmbeddingProvider implements EmbeddingProvider {
|
|
|
27
27
|
private readonly _url;
|
|
28
28
|
private readonly _modelId;
|
|
29
29
|
private readonly _dims;
|
|
30
|
+
private readonly _timeoutMs;
|
|
30
31
|
constructor(env?: NodeJS.ProcessEnv);
|
|
31
32
|
id(): string;
|
|
32
33
|
modelId(): string;
|
|
@@ -22,11 +22,14 @@
|
|
|
22
22
|
* REPOSKEIN_EMBED_DIMS (required; output dimension of the local model)
|
|
23
23
|
*/
|
|
24
24
|
const DEFAULT_DIMS = 1024;
|
|
25
|
+
/** Default embedding request timeout in ms. Override with REPOSKEIN_EMBED_TIMEOUT_MS. */
|
|
26
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
25
27
|
export class HttpEmbeddingProvider {
|
|
26
28
|
_id = "http";
|
|
27
29
|
_url;
|
|
28
30
|
_modelId;
|
|
29
31
|
_dims;
|
|
32
|
+
_timeoutMs;
|
|
30
33
|
constructor(env = process.env) {
|
|
31
34
|
const url = env["REPOSKEIN_EMBED_URL"];
|
|
32
35
|
if (!url) {
|
|
@@ -49,6 +52,8 @@ export class HttpEmbeddingProvider {
|
|
|
49
52
|
else {
|
|
50
53
|
this._dims = DEFAULT_DIMS;
|
|
51
54
|
}
|
|
55
|
+
const rawTimeout = env["REPOSKEIN_EMBED_TIMEOUT_MS"];
|
|
56
|
+
this._timeoutMs = rawTimeout !== undefined ? Number(rawTimeout) : DEFAULT_TIMEOUT_MS;
|
|
52
57
|
}
|
|
53
58
|
id() { return this._id; }
|
|
54
59
|
modelId() { return this._modelId; }
|
|
@@ -61,15 +66,29 @@ export class HttpEmbeddingProvider {
|
|
|
61
66
|
model: this._modelId,
|
|
62
67
|
input_type: kind,
|
|
63
68
|
};
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
const controller = new AbortController();
|
|
70
|
+
const timer = setTimeout(() => controller.abort(), this._timeoutMs);
|
|
71
|
+
let res;
|
|
72
|
+
try {
|
|
73
|
+
res = await fetch(this._url, {
|
|
74
|
+
method: "POST",
|
|
75
|
+
headers: { "Content-Type": "application/json" },
|
|
76
|
+
body: JSON.stringify(body),
|
|
77
|
+
signal: controller.signal,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
clearTimeout(timer);
|
|
82
|
+
}
|
|
69
83
|
if (!res.ok) {
|
|
70
84
|
const text = await res.text().catch(() => "(no body)");
|
|
71
85
|
throw new Error(`HTTP embedding server error ${res.status}: ${text}`);
|
|
72
86
|
}
|
|
87
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
88
|
+
if (!contentType.includes("application/json")) {
|
|
89
|
+
const text = await res.text().catch(() => "(unreadable body)");
|
|
90
|
+
throw new Error(`HTTP embedding server returned non-JSON response (${contentType}): ${text.slice(0, 200)}`);
|
|
91
|
+
}
|
|
73
92
|
const json = (await res.json());
|
|
74
93
|
// OpenAI-compatible shape: { data: [{ embedding: [...] }, ...] }
|
|
75
94
|
if ("data" in json && Array.isArray(json.data)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/embed/providers/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,MAAM,YAAY,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/embed/providers/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,9 @@ export declare class VoyageEmbeddingProvider implements EmbeddingProvider {
|
|
|
24
24
|
private readonly _modelId;
|
|
25
25
|
private readonly _dims;
|
|
26
26
|
private readonly _apiKey;
|
|
27
|
+
private readonly _timeoutMs;
|
|
28
|
+
/** True only when the user explicitly set REPOSKEIN_EMBED_DIMS. */
|
|
29
|
+
private readonly _dimsExplicit;
|
|
27
30
|
constructor(env?: NodeJS.ProcessEnv);
|
|
28
31
|
id(): string;
|
|
29
32
|
modelId(): string;
|
|
@@ -23,11 +23,16 @@ const DEFAULT_MODEL = "voyage-code-3";
|
|
|
23
23
|
const DEFAULT_DIMS = 1024;
|
|
24
24
|
/** Max texts per request (Voyage API limit). */
|
|
25
25
|
const BATCH_SIZE = 1000;
|
|
26
|
+
/** Default embedding request timeout in ms. Override with REPOSKEIN_EMBED_TIMEOUT_MS. */
|
|
27
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
26
28
|
export class VoyageEmbeddingProvider {
|
|
27
29
|
_id = "voyage";
|
|
28
30
|
_modelId;
|
|
29
31
|
_dims;
|
|
30
32
|
_apiKey;
|
|
33
|
+
_timeoutMs;
|
|
34
|
+
/** True only when the user explicitly set REPOSKEIN_EMBED_DIMS. */
|
|
35
|
+
_dimsExplicit;
|
|
31
36
|
constructor(env = process.env) {
|
|
32
37
|
const apiKey = env["VOYAGE_API_KEY"];
|
|
33
38
|
if (!apiKey) {
|
|
@@ -42,10 +47,14 @@ export class VoyageEmbeddingProvider {
|
|
|
42
47
|
throw new Error(`Invalid REPOSKEIN_EMBED_DIMS="${rawDims}" — must be a positive integer (e.g. 256, 512, 1024, 2048)`);
|
|
43
48
|
}
|
|
44
49
|
this._dims = d;
|
|
50
|
+
this._dimsExplicit = true;
|
|
45
51
|
}
|
|
46
52
|
else {
|
|
47
53
|
this._dims = DEFAULT_DIMS;
|
|
54
|
+
this._dimsExplicit = false;
|
|
48
55
|
}
|
|
56
|
+
const rawTimeout = env["REPOSKEIN_EMBED_TIMEOUT_MS"];
|
|
57
|
+
this._timeoutMs = rawTimeout !== undefined ? Number(rawTimeout) : DEFAULT_TIMEOUT_MS;
|
|
49
58
|
}
|
|
50
59
|
id() { return this._id; }
|
|
51
60
|
modelId() { return this._modelId; }
|
|
@@ -61,20 +70,38 @@ export class VoyageEmbeddingProvider {
|
|
|
61
70
|
input: batch,
|
|
62
71
|
model: this._modelId,
|
|
63
72
|
input_type: kind,
|
|
64
|
-
output_dimension: this._dims,
|
|
65
73
|
};
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
+
// Only send output_dimension when the user explicitly configured it.
|
|
75
|
+
// Voyage defaults to the model's native dimensionality when omitted.
|
|
76
|
+
if (this._dimsExplicit) {
|
|
77
|
+
body["output_dimension"] = this._dims;
|
|
78
|
+
}
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const timer = setTimeout(() => controller.abort(), this._timeoutMs);
|
|
81
|
+
let res;
|
|
82
|
+
try {
|
|
83
|
+
res = await fetch(VOYAGE_ENDPOINT, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/json",
|
|
87
|
+
"Authorization": `Bearer ${this._apiKey}`,
|
|
88
|
+
},
|
|
89
|
+
body: JSON.stringify(body),
|
|
90
|
+
signal: controller.signal,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
clearTimeout(timer);
|
|
95
|
+
}
|
|
74
96
|
if (!res.ok) {
|
|
75
97
|
const text = await res.text().catch(() => "(no body)");
|
|
76
98
|
throw new Error(`Voyage API error ${res.status}: ${text}`);
|
|
77
99
|
}
|
|
100
|
+
const contentType = res.headers.get("content-type") ?? "";
|
|
101
|
+
if (!contentType.includes("application/json")) {
|
|
102
|
+
const text = await res.text().catch(() => "(unreadable body)");
|
|
103
|
+
throw new Error(`Voyage API returned non-JSON response (${contentType}): ${text.slice(0, 200)}`);
|
|
104
|
+
}
|
|
78
105
|
const json = (await res.json());
|
|
79
106
|
if (!Array.isArray(json.embeddings)) {
|
|
80
107
|
throw new Error(`Voyage API response missing embeddings array: ${JSON.stringify(json)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"voyage.js","sourceRoot":"","sources":["../../../src/embed/providers/voyage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,eAAe,GAAG,wCAAwC,CAAC;AACjE,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,gDAAgD;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"voyage.js","sourceRoot":"","sources":["../../../src/embed/providers/voyage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,eAAe,GAAG,wCAAwC,CAAC;AACjE,MAAM,aAAa,GAAG,eAAe,CAAC;AACtC,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,gDAAgD;AAChD,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAOjC,MAAM,OAAO,uBAAuB;IACjB,GAAG,GAAG,QAAQ,CAAC;IACf,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,OAAO,CAAS;IAChB,UAAU,CAAS;IACpC,mEAAmE;IAClD,aAAa,CAAU;IAExC,YAAY,MAAyB,OAAO,CAAC,GAAG;QAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,uBAAuB,CAAC,IAAI,aAAa,CAAC;QAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CACb,iCAAiC,OAAO,4DAA4D,CACrG,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACf,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACvF,CAAC;IAED,EAAE,KAAa,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,KAAa,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,IAAI,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAErC,KAAK,CAAC,KAAK,CAAC,KAAe,EAAE,IAAe;QAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAe,EAAE,CAAC;QAE/B,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7C,MAAM,IAAI,GAA4B;gBACpC,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,UAAU,EAAE,IAAI;aACjB,CAAC;YACF,qEAAqE;YACrE,qEAAqE;YACrE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACxC,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACpE,IAAI,GAAa,CAAC;YAClB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;qBAC1C;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,CAAC;gBAC/D,MAAM,IAAI,KAAK,CAAC,0CAA0C,WAAW,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACnG,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,CAAC,UAAU,CAAC,MAAM,4BAA4B,KAAK,CAAC,MAAM,+BAA+B,CACrH,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,CAAC,MAAM,yBAAyB,KAAK,CAAC,MAAM,qCAAqC,CAChH,CAAC;QACJ,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { pathToFileURL } from "node:url";
|
|
2
|
-
import { runInit } from "./cli/init.js";
|
|
2
|
+
import { runInit, runIndex } from "./cli/init.js";
|
|
3
3
|
import { runDoctor } from "./cli/doctor.js";
|
|
4
4
|
import { existsSync } from "node:fs";
|
|
5
5
|
import { join } from "node:path";
|
|
@@ -176,7 +176,16 @@ export async function main() {
|
|
|
176
176
|
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
177
177
|
const sub = process.argv[2];
|
|
178
178
|
if (sub === "init") {
|
|
179
|
-
|
|
179
|
+
const rest = process.argv.slice(3);
|
|
180
|
+
const noIndex = rest.includes("--no-index");
|
|
181
|
+
const path = rest.find((a) => !a.startsWith("-")) ?? ".";
|
|
182
|
+
runInit(path, { index: !noIndex })
|
|
183
|
+
.then((code) => process.exit(code))
|
|
184
|
+
.catch((err) => { console.error(err); process.exit(1); });
|
|
185
|
+
}
|
|
186
|
+
else if (sub === "index") {
|
|
187
|
+
const path = process.argv.slice(3).find((a) => !a.startsWith("-")) ?? process.env.REPOSKEIN_REPO_PATH ?? ".";
|
|
188
|
+
runIndex(path)
|
|
180
189
|
.then((code) => process.exit(code))
|
|
181
190
|
.catch((err) => { console.error(err); process.exit(1); });
|
|
182
191
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;;uDAKuD;AACvD,SAAS,UAAU,CAAC,QAA4B,EAAE,MAA0B;IAC1E,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACnE,MAAM,UAAU,GACd,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAEpF,MAAM,KAAK,GAAG,GAAe,EAAE;QAC7B,IAAI,CAAC;YACH,OAAO,eAAe,CAAC,OAAO,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,QAAS,EAAE,MAAO,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,OAAO;IACP,IAAI,UAAU;QAAE,OAAO,IAAI,eAAe,CAAC,QAAS,EAAE,MAAO,CAAC,CAAC;IAC/D,OAAO,KAAK,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,iBAAiB,GACrB,2EAA2E;IAC3E,8EAA8E,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE3C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,qQAAqQ;QACvQ,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;YACpD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAClC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CACjC,CAAC;IAEF,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,mSAAmS;QACrS,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YACtD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAClC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CACF,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,sMAAsM;QACxM,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;YACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC7B;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,uJAAuJ;QACzJ,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC7B;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,4FAA4F;QAC9F,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;KAClC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CACF,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,6PAA6P;QAC/P,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;YACnE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAClC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CACF,CAAC;IAEF,2FAA2F;IAC3F,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,4UAA4U;QAC9U,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;KAClC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzD,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,gCAAgC;QACvC,WAAW,EACT,+OAA+O;QACjP,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;YAChD,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAClC;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CACF,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CACX,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,+DAA+D;AAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;QACzD,OAAO,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;aAC/B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC;QAC7G,QAAQ,CAAC,IAAI,CAAC;aACX,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC;QAC5F,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;aAClB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/** Custom error class for integrity check failures. */
|
|
2
|
+
export declare class IntegrityError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
1
5
|
/** `<platform>-<arch>` for the current host, or null if unsupported. */
|
|
2
6
|
export declare function platformKey(platform?: string, arch?: string): string | null;
|
|
3
7
|
export declare function isWindows(platform?: string): boolean;
|
|
@@ -11,8 +15,20 @@ export declare function packageRoot(): string;
|
|
|
11
15
|
export declare function cachedBinaryPath(): string;
|
|
12
16
|
/** Reads this package's version (the release tag to fetch). */
|
|
13
17
|
export declare function packageVersion(): string;
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
18
|
+
/** Returns the expected sha256 hex digest for the given platform key's asset,
|
|
19
|
+
* or null if binary-digests.json doesn't exist (dev/source build).
|
|
20
|
+
* Throws IntegrityError if the file exists but has no entry for this platform. */
|
|
21
|
+
export declare function expectedDigest(key: string): string | null;
|
|
22
|
+
/** For testing only: reset the cached digest map so the next call re-reads from disk. */
|
|
23
|
+
export declare function _resetDigestCache(): void;
|
|
24
|
+
/** Verifies the sha256 digest of the file at `tempPath`.
|
|
25
|
+
* If `expected` is non-null and doesn't match, deletes the temp file and throws IntegrityError.
|
|
26
|
+
* If `expected` is null (dev/source build), writes a warning to stderr and returns. */
|
|
27
|
+
export declare function verifyDigest(tempPath: string, expected: string | null): void;
|
|
28
|
+
/** Downloads the indexer binary for this host into the package cache, verifies
|
|
29
|
+
* its integrity, makes it executable, and atomically renames it into place.
|
|
30
|
+
* Throws IntegrityError on digest mismatch. Throws on unsupported platform or
|
|
31
|
+
* download failure. */
|
|
16
32
|
export declare function downloadBinary(version?: string): Promise<string>;
|
|
17
33
|
/** Resolves the indexer binary for runtime use, in priority order:
|
|
18
34
|
* 1) REPOSKEIN_INDEXER_BIN (dev/tests/override),
|
|
@@ -20,5 +36,6 @@ export declare function downloadBinary(version?: string): Promise<string>;
|
|
|
20
36
|
* 3) lazily download it,
|
|
21
37
|
* 4) fall back to `reposkein-indexer` on PATH (best effort).
|
|
22
38
|
* Never throws for case 4 — returns the PATH name so spawn surfaces a clear
|
|
23
|
-
* ENOENT if it's truly absent.
|
|
39
|
+
* ENOENT if it's truly absent.
|
|
40
|
+
* Always re-throws IntegrityError — never falls back to PATH on integrity failure. */
|
|
24
41
|
export declare function ensureIndexerBinary(): Promise<string>;
|