bikky 0.3.1 → 0.3.3
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 +124 -35
- package/dist/cli.d.ts +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +22 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +61 -6
- package/dist/config.js.map +1 -1
- package/dist/config.test.js +17 -9
- package/dist/config.test.js.map +1 -1
- package/dist/daemon/capture-policy.d.ts +95 -0
- package/dist/daemon/capture-policy.d.ts.map +1 -0
- package/dist/daemon/capture-policy.js +139 -0
- package/dist/daemon/capture-policy.js.map +1 -0
- package/dist/daemon/capture-policy.test.d.ts +2 -0
- package/dist/daemon/capture-policy.test.d.ts.map +1 -0
- package/dist/daemon/capture-policy.test.js +46 -0
- package/dist/daemon/capture-policy.test.js.map +1 -0
- package/dist/daemon/consolidation.d.ts.map +1 -1
- package/dist/daemon/consolidation.js +84 -98
- package/dist/daemon/consolidation.js.map +1 -1
- package/dist/daemon/episode-summary.d.ts +72 -0
- package/dist/daemon/episode-summary.d.ts.map +1 -0
- package/dist/daemon/episode-summary.js +208 -0
- package/dist/daemon/episode-summary.js.map +1 -0
- package/dist/daemon/episode-summary.test.d.ts +2 -0
- package/dist/daemon/episode-summary.test.d.ts.map +1 -0
- package/dist/daemon/episode-summary.test.js +101 -0
- package/dist/daemon/episode-summary.test.js.map +1 -0
- package/dist/daemon/extraction.d.ts +25 -0
- package/dist/daemon/extraction.d.ts.map +1 -1
- package/dist/daemon/extraction.js +244 -124
- package/dist/daemon/extraction.js.map +1 -1
- package/dist/daemon/extraction.test.d.ts +2 -0
- package/dist/daemon/extraction.test.d.ts.map +1 -0
- package/dist/daemon/extraction.test.js +106 -0
- package/dist/daemon/extraction.test.js.map +1 -0
- package/dist/daemon/loop.d.ts.map +1 -1
- package/dist/daemon/loop.js +8 -6
- package/dist/daemon/loop.js.map +1 -1
- package/dist/daemon/qdrant.d.ts +59 -8
- package/dist/daemon/qdrant.d.ts.map +1 -1
- package/dist/daemon/qdrant.js +74 -23
- package/dist/daemon/qdrant.js.map +1 -1
- package/dist/daemon/qdrant.test.js +2 -2
- package/dist/daemon/qdrant.test.js.map +1 -1
- package/dist/daemon/relations.d.ts +6 -1
- package/dist/daemon/relations.d.ts.map +1 -1
- package/dist/daemon/relations.js +44 -63
- package/dist/daemon/relations.js.map +1 -1
- package/dist/daemon/session-index.d.ts +60 -0
- package/dist/daemon/session-index.d.ts.map +1 -0
- package/dist/daemon/session-index.js +136 -0
- package/dist/daemon/session-index.js.map +1 -0
- package/dist/daemon/session-index.test.d.ts +2 -0
- package/dist/daemon/session-index.test.d.ts.map +1 -0
- package/dist/daemon/session-index.test.js +54 -0
- package/dist/daemon/session-index.test.js.map +1 -0
- package/dist/daemon/session-summary.d.ts +69 -0
- package/dist/daemon/session-summary.d.ts.map +1 -0
- package/dist/daemon/session-summary.js +200 -0
- package/dist/daemon/session-summary.js.map +1 -0
- package/dist/daemon/session-summary.test.d.ts +2 -0
- package/dist/daemon/session-summary.test.d.ts.map +1 -0
- package/dist/daemon/session-summary.test.js +160 -0
- package/dist/daemon/session-summary.test.js.map +1 -0
- package/dist/daemon/staleness.test.d.ts +7 -0
- package/dist/daemon/staleness.test.d.ts.map +1 -0
- package/dist/daemon/staleness.test.js +128 -0
- package/dist/daemon/staleness.test.js.map +1 -0
- package/dist/daemon/workstream-summary.d.ts +61 -0
- package/dist/daemon/workstream-summary.d.ts.map +1 -0
- package/dist/daemon/workstream-summary.js +220 -0
- package/dist/daemon/workstream-summary.js.map +1 -0
- package/dist/daemon/workstream-summary.test.d.ts +2 -0
- package/dist/daemon/workstream-summary.test.d.ts.map +1 -0
- package/dist/daemon/workstream-summary.test.js +86 -0
- package/dist/daemon/workstream-summary.test.js.map +1 -0
- package/dist/lib/qdrant-client.d.ts +6 -1
- package/dist/lib/qdrant-client.d.ts.map +1 -1
- package/dist/lib/qdrant-client.js +3 -4
- package/dist/lib/qdrant-client.js.map +1 -1
- package/dist/lib/qdrant-client.test.js +21 -2
- package/dist/lib/qdrant-client.test.js.map +1 -1
- package/dist/lifecycle.test.d.ts +8 -0
- package/dist/lifecycle.test.d.ts.map +1 -0
- package/dist/lifecycle.test.js +74 -0
- package/dist/lifecycle.test.js.map +1 -0
- package/dist/llm/embedding/index.d.ts +42 -0
- package/dist/llm/embedding/index.d.ts.map +1 -0
- package/dist/llm/embedding/index.js +78 -0
- package/dist/llm/embedding/index.js.map +1 -0
- package/dist/llm/embedding/index.test.d.ts +8 -0
- package/dist/llm/embedding/index.test.d.ts.map +1 -0
- package/dist/llm/embedding/index.test.js +100 -0
- package/dist/llm/embedding/index.test.js.map +1 -0
- package/dist/llm/embedding/providers/bedrock.d.ts +16 -0
- package/dist/llm/embedding/providers/bedrock.d.ts.map +1 -0
- package/dist/llm/embedding/providers/bedrock.js +90 -0
- package/dist/llm/embedding/providers/bedrock.js.map +1 -0
- package/dist/llm/embedding/providers/bedrock.test.d.ts +2 -0
- package/dist/llm/embedding/providers/bedrock.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/bedrock.test.js +24 -0
- package/dist/llm/embedding/providers/bedrock.test.js.map +1 -0
- package/dist/llm/embedding/providers/index.d.ts +9 -0
- package/dist/llm/embedding/providers/index.d.ts.map +1 -0
- package/dist/llm/embedding/providers/index.js +9 -0
- package/dist/llm/embedding/providers/index.js.map +1 -0
- package/dist/llm/embedding/providers/ollama.d.ts +6 -0
- package/dist/llm/embedding/providers/ollama.d.ts.map +1 -0
- package/dist/llm/embedding/providers/ollama.js +39 -0
- package/dist/llm/embedding/providers/ollama.js.map +1 -0
- package/dist/llm/embedding/providers/ollama.test.d.ts +2 -0
- package/dist/llm/embedding/providers/ollama.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/ollama.test.js +54 -0
- package/dist/llm/embedding/providers/ollama.test.js.map +1 -0
- package/dist/llm/embedding/providers/openai.d.ts +6 -0
- package/dist/llm/embedding/providers/openai.d.ts.map +1 -0
- package/dist/llm/embedding/providers/openai.js +44 -0
- package/dist/llm/embedding/providers/openai.js.map +1 -0
- package/dist/llm/embedding/providers/openai.test.d.ts +2 -0
- package/dist/llm/embedding/providers/openai.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/openai.test.js +48 -0
- package/dist/llm/embedding/providers/openai.test.js.map +1 -0
- package/dist/llm/embedding/providers/portkey.d.ts +15 -0
- package/dist/llm/embedding/providers/portkey.d.ts.map +1 -0
- package/dist/llm/embedding/providers/portkey.js +58 -0
- package/dist/llm/embedding/providers/portkey.js.map +1 -0
- package/dist/llm/embedding/providers/portkey.test.d.ts +2 -0
- package/dist/llm/embedding/providers/portkey.test.d.ts.map +1 -0
- package/dist/llm/embedding/providers/portkey.test.js +56 -0
- package/dist/llm/embedding/providers/portkey.test.js.map +1 -0
- package/dist/llm/embedding/registry.d.ts +14 -0
- package/dist/llm/embedding/registry.d.ts.map +1 -0
- package/dist/llm/embedding/registry.js +27 -0
- package/dist/llm/embedding/registry.js.map +1 -0
- package/dist/llm/embedding/registry.test.d.ts +7 -0
- package/dist/llm/embedding/registry.test.d.ts.map +1 -0
- package/dist/llm/embedding/registry.test.js +68 -0
- package/dist/llm/embedding/registry.test.js.map +1 -0
- package/dist/llm/embedding/types.d.ts +55 -0
- package/dist/llm/embedding/types.d.ts.map +1 -0
- package/dist/llm/embedding/types.js +12 -0
- package/dist/llm/embedding/types.js.map +1 -0
- package/dist/llm/errors.d.ts +95 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +164 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/errors.test.d.ts +2 -0
- package/dist/llm/errors.test.d.ts.map +1 -0
- package/dist/llm/errors.test.js +103 -0
- package/dist/llm/errors.test.js.map +1 -0
- package/dist/llm/fetch.d.ts +39 -0
- package/dist/llm/fetch.d.ts.map +1 -0
- package/dist/llm/fetch.js +52 -0
- package/dist/llm/fetch.js.map +1 -0
- package/dist/llm/index.d.ts +6 -3
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +2 -2
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/inference/index.d.ts +39 -0
- package/dist/llm/inference/index.d.ts.map +1 -0
- package/dist/llm/inference/index.js +118 -0
- package/dist/llm/inference/index.js.map +1 -0
- package/dist/llm/inference/index.test.d.ts +6 -0
- package/dist/llm/inference/index.test.d.ts.map +1 -0
- package/dist/llm/inference/index.test.js +109 -0
- package/dist/llm/inference/index.test.js.map +1 -0
- package/dist/llm/inference/providers/bedrock.d.ts +18 -0
- package/dist/llm/inference/providers/bedrock.d.ts.map +1 -0
- package/dist/llm/inference/providers/bedrock.js +105 -0
- package/dist/llm/inference/providers/bedrock.js.map +1 -0
- package/dist/llm/inference/providers/bedrock.test.d.ts +2 -0
- package/dist/llm/inference/providers/bedrock.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/bedrock.test.js +21 -0
- package/dist/llm/inference/providers/bedrock.test.js.map +1 -0
- package/dist/llm/inference/providers/index.d.ts +10 -0
- package/dist/llm/inference/providers/index.d.ts.map +1 -0
- package/dist/llm/inference/providers/index.js +10 -0
- package/dist/llm/inference/providers/index.js.map +1 -0
- package/dist/llm/inference/providers/ollama.d.ts +8 -0
- package/dist/llm/inference/providers/ollama.d.ts.map +1 -0
- package/dist/llm/inference/providers/ollama.js +63 -0
- package/dist/llm/inference/providers/ollama.js.map +1 -0
- package/dist/llm/inference/providers/ollama.test.d.ts +2 -0
- package/dist/llm/inference/providers/ollama.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/ollama.test.js +57 -0
- package/dist/llm/inference/providers/ollama.test.js.map +1 -0
- package/dist/llm/inference/providers/openai.d.ts +11 -0
- package/dist/llm/inference/providers/openai.d.ts.map +1 -0
- package/dist/llm/inference/providers/openai.js +73 -0
- package/dist/llm/inference/providers/openai.js.map +1 -0
- package/dist/llm/inference/providers/openai.test.d.ts +2 -0
- package/dist/llm/inference/providers/openai.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/openai.test.js +46 -0
- package/dist/llm/inference/providers/openai.test.js.map +1 -0
- package/dist/llm/inference/providers/portkey.d.ts +13 -0
- package/dist/llm/inference/providers/portkey.d.ts.map +1 -0
- package/dist/llm/inference/providers/portkey.js +80 -0
- package/dist/llm/inference/providers/portkey.js.map +1 -0
- package/dist/llm/inference/providers/portkey.test.d.ts +2 -0
- package/dist/llm/inference/providers/portkey.test.d.ts.map +1 -0
- package/dist/llm/inference/providers/portkey.test.js +48 -0
- package/dist/llm/inference/providers/portkey.test.js.map +1 -0
- package/dist/llm/inference/registry.d.ts +15 -0
- package/dist/llm/inference/registry.d.ts.map +1 -0
- package/dist/llm/inference/registry.js +28 -0
- package/dist/llm/inference/registry.js.map +1 -0
- package/dist/llm/inference/registry.test.d.ts +6 -0
- package/dist/llm/inference/registry.test.d.ts.map +1 -0
- package/dist/llm/inference/registry.test.js +63 -0
- package/dist/llm/inference/registry.test.js.map +1 -0
- package/dist/llm/inference/types.d.ts +84 -0
- package/dist/llm/inference/types.d.ts.map +1 -0
- package/dist/llm/inference/types.js +9 -0
- package/dist/llm/inference/types.js.map +1 -0
- package/dist/llm/telemetry.d.ts +25 -0
- package/dist/llm/telemetry.d.ts.map +1 -0
- package/dist/llm/telemetry.js +43 -0
- package/dist/llm/telemetry.js.map +1 -0
- package/dist/llm/telemetry.test.d.ts +5 -0
- package/dist/llm/telemetry.test.d.ts.map +1 -0
- package/dist/llm/telemetry.test.js +89 -0
- package/dist/llm/telemetry.test.js.map +1 -0
- package/dist/llm/types.d.ts +4 -37
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +4 -1
- package/dist/llm/types.js.map +1 -1
- package/dist/logger.d.ts +18 -3
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +102 -20
- package/dist/logger.js.map +1 -1
- package/dist/logger.test.d.ts +5 -0
- package/dist/logger.test.d.ts.map +1 -0
- package/dist/logger.test.js +103 -0
- package/dist/logger.test.js.map +1 -0
- package/dist/mcp/api.d.ts +15 -1
- package/dist/mcp/api.d.ts.map +1 -1
- package/dist/mcp/api.js +44 -19
- package/dist/mcp/api.js.map +1 -1
- package/dist/mcp/api.test.d.ts +6 -0
- package/dist/mcp/api.test.d.ts.map +1 -0
- package/dist/mcp/api.test.js +130 -0
- package/dist/mcp/api.test.js.map +1 -0
- package/dist/mcp/helpers.d.ts +1 -0
- package/dist/mcp/helpers.d.ts.map +1 -1
- package/dist/mcp/helpers.js +62 -6
- package/dist/mcp/helpers.js.map +1 -1
- package/dist/mcp/helpers.test.js +71 -10
- package/dist/mcp/helpers.test.js.map +1 -1
- package/dist/mcp/index.d.ts +7 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +46 -21
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/taxonomy.d.ts +251 -31
- package/dist/mcp/taxonomy.d.ts.map +1 -1
- package/dist/mcp/taxonomy.js +603 -171
- package/dist/mcp/taxonomy.js.map +1 -1
- package/dist/mcp/taxonomy.test.d.ts +1 -1
- package/dist/mcp/taxonomy.test.js +141 -302
- package/dist/mcp/taxonomy.test.js.map +1 -1
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.integration.itest.d.ts +23 -0
- package/dist/mcp/tools.integration.itest.d.ts.map +1 -0
- package/dist/mcp/tools.integration.itest.js +172 -0
- package/dist/mcp/tools.integration.itest.js.map +1 -0
- package/dist/mcp/tools.js +422 -357
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/tools.test.d.ts +16 -0
- package/dist/mcp/tools.test.d.ts.map +1 -0
- package/dist/mcp/tools.test.js +472 -0
- package/dist/mcp/tools.test.js.map +1 -0
- package/dist/mcp/types.d.ts +63 -8
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/prompts/brief.d.ts +19 -0
- package/dist/prompts/brief.d.ts.map +1 -0
- package/dist/prompts/brief.js +67 -0
- package/dist/prompts/brief.js.map +1 -0
- package/dist/prompts/contradiction.d.ts +24 -0
- package/dist/prompts/contradiction.d.ts.map +1 -0
- package/dist/prompts/contradiction.js +73 -0
- package/dist/prompts/contradiction.js.map +1 -0
- package/dist/prompts/distill.d.ts +21 -0
- package/dist/prompts/distill.d.ts.map +1 -0
- package/dist/prompts/distill.js +92 -0
- package/dist/prompts/distill.js.map +1 -0
- package/dist/prompts/episode-summary.d.ts +15 -0
- package/dist/prompts/episode-summary.d.ts.map +1 -0
- package/dist/prompts/episode-summary.js +60 -0
- package/dist/prompts/episode-summary.js.map +1 -0
- package/dist/prompts/extraction.d.ts +14 -0
- package/dist/prompts/extraction.d.ts.map +1 -0
- package/dist/prompts/extraction.js +110 -0
- package/dist/prompts/extraction.js.map +1 -0
- package/dist/prompts/index.d.ts +52 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +104 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/prompts.test.d.ts +8 -0
- package/dist/prompts/prompts.test.d.ts.map +1 -0
- package/dist/prompts/prompts.test.js +140 -0
- package/dist/prompts/prompts.test.js.map +1 -0
- package/dist/prompts/relations.d.ts +17 -0
- package/dist/prompts/relations.d.ts.map +1 -0
- package/dist/prompts/relations.js +72 -0
- package/dist/prompts/relations.js.map +1 -0
- package/dist/prompts/workstream-summary.d.ts +17 -0
- package/dist/prompts/workstream-summary.d.ts.map +1 -0
- package/dist/prompts/workstream-summary.js +72 -0
- package/dist/prompts/workstream-summary.js.map +1 -0
- package/dist/render.d.ts +41 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +185 -0
- package/dist/render.js.map +1 -0
- package/dist/render.test.d.ts +8 -0
- package/dist/render.test.d.ts.map +1 -0
- package/dist/render.test.js +243 -0
- package/dist/render.test.js.map +1 -0
- package/docs/diagrams/architecture.svg +87 -0
- package/docs/diagrams/team-memory.svg +250 -0
- package/docs/screenshots/dashboard.png +0 -0
- package/docs/screenshots/graph.png +0 -0
- package/docs/screenshots/memory.png +0 -0
- package/package.json +12 -3
- package/dist/llm/embedding.d.ts +0 -13
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -127
- package/dist/llm/embedding.js.map +0 -1
- package/dist/llm/embedding.test.d.ts +0 -8
- package/dist/llm/embedding.test.d.ts.map +0 -1
- package/dist/llm/embedding.test.js +0 -117
- package/dist/llm/embedding.test.js.map +0 -1
- package/dist/llm/inference.d.ts +0 -12
- package/dist/llm/inference.d.ts.map +0 -1
- package/dist/llm/inference.js +0 -146
- package/dist/llm/inference.js.map +0 -1
- package/dist/llm/inference.test.d.ts +0 -8
- package/dist/llm/inference.test.d.ts.map +0 -1
- package/dist/llm/inference.test.js +0 -117
- package/dist/llm/inference.test.js.map +0 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for daemon lifecycle PID-file management.
|
|
3
|
+
*
|
|
4
|
+
* Backs up and restores the real PID file at ~/.bikky/state/daemon.pid so
|
|
5
|
+
* we don't clobber an actual running daemon during the test run.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, before, after, beforeEach, afterEach } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import fs from "node:fs";
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { getDaemonStatus, killDaemon } from "./lifecycle.js";
|
|
12
|
+
import { PID_PATH } from "./config.js";
|
|
13
|
+
let backup = null;
|
|
14
|
+
describe("lifecycle (PID file)", () => {
|
|
15
|
+
before(() => {
|
|
16
|
+
if (fs.existsSync(PID_PATH)) {
|
|
17
|
+
backup = fs.readFileSync(PID_PATH, "utf-8");
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
after(() => {
|
|
21
|
+
if (backup !== null) {
|
|
22
|
+
fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });
|
|
23
|
+
fs.writeFileSync(PID_PATH, backup);
|
|
24
|
+
}
|
|
25
|
+
else if (fs.existsSync(PID_PATH)) {
|
|
26
|
+
fs.unlinkSync(PID_PATH);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
if (fs.existsSync(PID_PATH))
|
|
31
|
+
fs.unlinkSync(PID_PATH);
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
if (fs.existsSync(PID_PATH))
|
|
35
|
+
fs.unlinkSync(PID_PATH);
|
|
36
|
+
});
|
|
37
|
+
it("returns running:false when no PID file exists", () => {
|
|
38
|
+
const status = getDaemonStatus();
|
|
39
|
+
assert.deepEqual(status, { running: false, pid: null });
|
|
40
|
+
});
|
|
41
|
+
it("returns running:true when PID belongs to a live process", () => {
|
|
42
|
+
fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });
|
|
43
|
+
fs.writeFileSync(PID_PATH, String(process.pid));
|
|
44
|
+
const status = getDaemonStatus();
|
|
45
|
+
assert.equal(status.running, true);
|
|
46
|
+
assert.equal(status.pid, process.pid);
|
|
47
|
+
});
|
|
48
|
+
it("returns running:false and cleans up a stale PID file", () => {
|
|
49
|
+
// PID 999999 is virtually guaranteed not to exist
|
|
50
|
+
fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });
|
|
51
|
+
fs.writeFileSync(PID_PATH, "999999");
|
|
52
|
+
const status = getDaemonStatus();
|
|
53
|
+
assert.deepEqual(status, { running: false, pid: null });
|
|
54
|
+
assert.ok(!fs.existsSync(PID_PATH), "stale PID file should be removed");
|
|
55
|
+
});
|
|
56
|
+
it("treats unparseable PID file as 'no daemon'", () => {
|
|
57
|
+
fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });
|
|
58
|
+
fs.writeFileSync(PID_PATH, "not-a-number\n");
|
|
59
|
+
const status = getDaemonStatus();
|
|
60
|
+
assert.equal(status.running, false);
|
|
61
|
+
assert.equal(status.pid, null);
|
|
62
|
+
});
|
|
63
|
+
it("killDaemon returns false when no PID file exists", () => {
|
|
64
|
+
assert.equal(killDaemon(), false);
|
|
65
|
+
});
|
|
66
|
+
it("killDaemon removes the PID file even for a stale entry", () => {
|
|
67
|
+
fs.mkdirSync(path.dirname(PID_PATH), { recursive: true });
|
|
68
|
+
fs.writeFileSync(PID_PATH, "999999");
|
|
69
|
+
const result = killDaemon();
|
|
70
|
+
assert.equal(result, true);
|
|
71
|
+
assert.ok(!fs.existsSync(PID_PATH));
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=lifecycle.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.test.js","sourceRoot":"","sources":["../src/lifecycle.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public embedding API.
|
|
3
|
+
*
|
|
4
|
+
* - initEmbedding(cfg) — resolve provider + defaults, run optional init().
|
|
5
|
+
* - embed(text) — compute one embedding via the resolved provider.
|
|
6
|
+
* - getEmbeddingConfig() — current resolved config (throws if not initialised).
|
|
7
|
+
* - getEmbeddingDimensions() — convenience accessor used by Qdrant collection setup.
|
|
8
|
+
*
|
|
9
|
+
* Provider routing is delegated to the registry — see ./registry.ts and
|
|
10
|
+
* ./providers/*.ts.
|
|
11
|
+
*
|
|
12
|
+
* Errors: providers throw typed `LlmHttpError` subclasses (see `../errors.ts`)
|
|
13
|
+
* — `LlmAuthError`, `LlmRateLimitError`, `LlmTransientError`, `LlmTimeoutError`,
|
|
14
|
+
* `LlmBadRequestError`. Dimension mismatches throw
|
|
15
|
+
* `EmbeddingDimensionMismatchError`. Callers should catch these and convert
|
|
16
|
+
* to a user-facing message rather than letting them leak through MCP transport.
|
|
17
|
+
*/
|
|
18
|
+
import "./providers/index.js";
|
|
19
|
+
import type { ResolvedEmbeddingConfig } from "./types.js";
|
|
20
|
+
export type { EmbeddingProvider, ResolvedEmbeddingConfig } from "./types.js";
|
|
21
|
+
export { registerEmbeddingProvider, getEmbeddingProvider, listEmbeddingProviders, } from "./registry.js";
|
|
22
|
+
export interface InitEmbeddingInput {
|
|
23
|
+
provider: string;
|
|
24
|
+
model?: string;
|
|
25
|
+
dimensions?: number;
|
|
26
|
+
baseUrl?: string;
|
|
27
|
+
apiKey?: string | null;
|
|
28
|
+
extra?: Record<string, string | undefined>;
|
|
29
|
+
/** Per-request HTTP timeout. Defaults to 30s. */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
/** Max retries on transient/rate-limit/timeout failures. Defaults to 2. */
|
|
32
|
+
retries?: number;
|
|
33
|
+
/** Base backoff delay (ms) for retries. Defaults to 250ms. */
|
|
34
|
+
retryBaseDelayMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function initEmbedding(input: InitEmbeddingInput): ResolvedEmbeddingConfig;
|
|
37
|
+
export declare function getEmbeddingConfig(): ResolvedEmbeddingConfig;
|
|
38
|
+
export declare function getEmbeddingDimensions(): number;
|
|
39
|
+
export declare function embed(text: string): Promise<number[]>;
|
|
40
|
+
/** Test-only: drop cached config so initEmbedding can be called fresh. */
|
|
41
|
+
export declare function _resetEmbedding(): void;
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/embedding/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAMvB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,uBAAuB,CAehF;AAED,wBAAgB,kBAAkB,IAAI,uBAAuB,CAG5D;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAG/C;AAED,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAqB3D;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public embedding API.
|
|
3
|
+
*
|
|
4
|
+
* - initEmbedding(cfg) — resolve provider + defaults, run optional init().
|
|
5
|
+
* - embed(text) — compute one embedding via the resolved provider.
|
|
6
|
+
* - getEmbeddingConfig() — current resolved config (throws if not initialised).
|
|
7
|
+
* - getEmbeddingDimensions() — convenience accessor used by Qdrant collection setup.
|
|
8
|
+
*
|
|
9
|
+
* Provider routing is delegated to the registry — see ./registry.ts and
|
|
10
|
+
* ./providers/*.ts.
|
|
11
|
+
*
|
|
12
|
+
* Errors: providers throw typed `LlmHttpError` subclasses (see `../errors.ts`)
|
|
13
|
+
* — `LlmAuthError`, `LlmRateLimitError`, `LlmTransientError`, `LlmTimeoutError`,
|
|
14
|
+
* `LlmBadRequestError`. Dimension mismatches throw
|
|
15
|
+
* `EmbeddingDimensionMismatchError`. Callers should catch these and convert
|
|
16
|
+
* to a user-facing message rather than letting them leak through MCP transport.
|
|
17
|
+
*/
|
|
18
|
+
// Side-effect: registers every built-in provider before anyone calls us.
|
|
19
|
+
import "./providers/index.js";
|
|
20
|
+
import { getEmbeddingProvider } from "./registry.js";
|
|
21
|
+
import { EmbeddingDimensionMismatchError } from "../errors.js";
|
|
22
|
+
export { registerEmbeddingProvider, getEmbeddingProvider, listEmbeddingProviders, } from "./registry.js";
|
|
23
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
24
|
+
const DEFAULT_RETRIES = 2;
|
|
25
|
+
const DEFAULT_RETRY_BASE_MS = 250;
|
|
26
|
+
let resolved = null;
|
|
27
|
+
/** Tracks whether we've successfully validated the model's actual dimensions. */
|
|
28
|
+
let dimensionsValidated = false;
|
|
29
|
+
export function initEmbedding(input) {
|
|
30
|
+
const provider = getEmbeddingProvider(input.provider);
|
|
31
|
+
resolved = {
|
|
32
|
+
provider: provider.name,
|
|
33
|
+
model: input.model ?? provider.defaults.model,
|
|
34
|
+
dimensions: input.dimensions ?? provider.defaults.dimensions,
|
|
35
|
+
baseUrl: (input.baseUrl ?? provider.defaults.baseUrl ?? "").replace(/\/+$/, ""),
|
|
36
|
+
apiKey: input.apiKey ?? null,
|
|
37
|
+
extra: input.extra ?? {},
|
|
38
|
+
timeoutMs: input.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
39
|
+
retries: input.retries ?? DEFAULT_RETRIES,
|
|
40
|
+
retryBaseDelayMs: input.retryBaseDelayMs ?? DEFAULT_RETRY_BASE_MS,
|
|
41
|
+
};
|
|
42
|
+
dimensionsValidated = false;
|
|
43
|
+
return resolved;
|
|
44
|
+
}
|
|
45
|
+
export function getEmbeddingConfig() {
|
|
46
|
+
if (!resolved)
|
|
47
|
+
throw new Error("Embedding not initialized — call initEmbedding() first");
|
|
48
|
+
return resolved;
|
|
49
|
+
}
|
|
50
|
+
export function getEmbeddingDimensions() {
|
|
51
|
+
if (!resolved)
|
|
52
|
+
throw new Error("Embedding not initialized — call initEmbedding() first");
|
|
53
|
+
return resolved.dimensions;
|
|
54
|
+
}
|
|
55
|
+
export async function embed(text) {
|
|
56
|
+
if (!resolved)
|
|
57
|
+
throw new Error("Embedding not initialized — call initEmbedding() first");
|
|
58
|
+
if (!text?.trim())
|
|
59
|
+
throw new Error("embed() called with empty text");
|
|
60
|
+
const provider = getEmbeddingProvider(resolved.provider);
|
|
61
|
+
const vec = await provider.embed(text, resolved);
|
|
62
|
+
// First-success dimension validation. Catches the classic "config says
|
|
63
|
+
// 1536 but the model returns 3072" foot-gun before it cascades into a
|
|
64
|
+
// cryptic Qdrant 400 "vector size mismatch".
|
|
65
|
+
if (!dimensionsValidated) {
|
|
66
|
+
if (vec.length !== resolved.dimensions) {
|
|
67
|
+
throw new EmbeddingDimensionMismatchError(resolved.provider, resolved.model, resolved.dimensions, vec.length);
|
|
68
|
+
}
|
|
69
|
+
dimensionsValidated = true;
|
|
70
|
+
}
|
|
71
|
+
return vec;
|
|
72
|
+
}
|
|
73
|
+
/** Test-only: drop cached config so initEmbedding can be called fresh. */
|
|
74
|
+
export function _resetEmbedding() {
|
|
75
|
+
resolved = null;
|
|
76
|
+
dimensionsValidated = false;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/llm/embedding/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/llm/embedding/index.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the public embedding API.
|
|
3
|
+
*
|
|
4
|
+
* Provider request shapes are tested in providers/*.test.ts; this file covers
|
|
5
|
+
* resolution (defaults, overrides, baseUrl normalisation) and error paths.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, beforeEach } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { initEmbedding, getEmbeddingConfig, getEmbeddingDimensions, embed, _resetEmbedding, } from "./index.js";
|
|
10
|
+
describe("initEmbedding — resolution", () => {
|
|
11
|
+
beforeEach(() => _resetEmbedding());
|
|
12
|
+
it("applies ollama defaults when no overrides given", async () => {
|
|
13
|
+
const cfg = await initEmbedding({ provider: "ollama" });
|
|
14
|
+
assert.strictEqual(cfg.provider, "ollama");
|
|
15
|
+
assert.strictEqual(cfg.model, "qwen3-embedding:0.6b");
|
|
16
|
+
assert.strictEqual(cfg.dimensions, 1024);
|
|
17
|
+
assert.strictEqual(cfg.baseUrl, "http://localhost:11434");
|
|
18
|
+
assert.strictEqual(cfg.apiKey, null);
|
|
19
|
+
assert.deepStrictEqual(cfg.extra, {});
|
|
20
|
+
});
|
|
21
|
+
it("applies openai defaults", async () => {
|
|
22
|
+
const cfg = await initEmbedding({ provider: "openai", apiKey: "sk-test" });
|
|
23
|
+
assert.strictEqual(cfg.model, "text-embedding-3-small");
|
|
24
|
+
assert.strictEqual(cfg.dimensions, 1536);
|
|
25
|
+
assert.strictEqual(cfg.baseUrl, "https://api.openai.com");
|
|
26
|
+
assert.strictEqual(cfg.apiKey, "sk-test");
|
|
27
|
+
});
|
|
28
|
+
it("applies bedrock defaults (no baseUrl)", async () => {
|
|
29
|
+
const cfg = await initEmbedding({ provider: "bedrock" });
|
|
30
|
+
assert.strictEqual(cfg.model, "amazon.titan-embed-text-v2:0");
|
|
31
|
+
assert.strictEqual(cfg.dimensions, 1024);
|
|
32
|
+
assert.strictEqual(cfg.baseUrl, "");
|
|
33
|
+
});
|
|
34
|
+
it("applies portkey defaults", async () => {
|
|
35
|
+
const cfg = await initEmbedding({ provider: "portkey", apiKey: "pk-test" });
|
|
36
|
+
assert.strictEqual(cfg.model, "@openai/text-embedding-3-small");
|
|
37
|
+
assert.strictEqual(cfg.baseUrl, "https://api.portkey.ai");
|
|
38
|
+
assert.strictEqual(cfg.dimensions, 1536);
|
|
39
|
+
});
|
|
40
|
+
it("overrides win over defaults", async () => {
|
|
41
|
+
const cfg = await initEmbedding({
|
|
42
|
+
provider: "ollama",
|
|
43
|
+
model: "nomic-embed-text",
|
|
44
|
+
dimensions: 768,
|
|
45
|
+
baseUrl: "http://custom:11434",
|
|
46
|
+
});
|
|
47
|
+
assert.strictEqual(cfg.model, "nomic-embed-text");
|
|
48
|
+
assert.strictEqual(cfg.dimensions, 768);
|
|
49
|
+
assert.strictEqual(cfg.baseUrl, "http://custom:11434");
|
|
50
|
+
});
|
|
51
|
+
it("strips trailing slashes from baseUrl", async () => {
|
|
52
|
+
const cfg = await initEmbedding({
|
|
53
|
+
provider: "ollama",
|
|
54
|
+
baseUrl: "http://localhost:11434///",
|
|
55
|
+
});
|
|
56
|
+
assert.strictEqual(cfg.baseUrl, "http://localhost:11434");
|
|
57
|
+
});
|
|
58
|
+
it("passes extra bag through unchanged", async () => {
|
|
59
|
+
const cfg = await initEmbedding({
|
|
60
|
+
provider: "portkey",
|
|
61
|
+
apiKey: "pk",
|
|
62
|
+
extra: { virtual_key: "vk-1", config_id: "cfg-2" },
|
|
63
|
+
});
|
|
64
|
+
assert.deepStrictEqual(cfg.extra, { virtual_key: "vk-1", config_id: "cfg-2" });
|
|
65
|
+
});
|
|
66
|
+
it("throws when provider is unknown", () => {
|
|
67
|
+
assert.throws(() => initEmbedding({ provider: "nope" }), {
|
|
68
|
+
message: /Unknown embedding provider: "nope"/,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("getEmbeddingConfig / getEmbeddingDimensions", () => {
|
|
73
|
+
it("throws when not initialised", () => {
|
|
74
|
+
_resetEmbedding();
|
|
75
|
+
assert.throws(() => getEmbeddingConfig(), { message: /not initialized/ });
|
|
76
|
+
assert.throws(() => getEmbeddingDimensions(), { message: /not initialized/ });
|
|
77
|
+
});
|
|
78
|
+
it("returns the resolved config / dimensions", async () => {
|
|
79
|
+
await initEmbedding({ provider: "openai", apiKey: "k", dimensions: 512 });
|
|
80
|
+
assert.strictEqual(getEmbeddingDimensions(), 512);
|
|
81
|
+
assert.strictEqual(getEmbeddingConfig().provider, "openai");
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe("embed — input validation", () => {
|
|
85
|
+
beforeEach(async () => {
|
|
86
|
+
_resetEmbedding();
|
|
87
|
+
await initEmbedding({ provider: "ollama", baseUrl: "http://localhost:99999" });
|
|
88
|
+
});
|
|
89
|
+
it("throws on empty text", async () => {
|
|
90
|
+
await assert.rejects(() => embed(""), { message: /empty text/ });
|
|
91
|
+
});
|
|
92
|
+
it("throws on whitespace-only text", async () => {
|
|
93
|
+
await assert.rejects(() => embed(" "), { message: /empty text/ });
|
|
94
|
+
});
|
|
95
|
+
it("throws when called before init", async () => {
|
|
96
|
+
_resetEmbedding();
|
|
97
|
+
await assert.rejects(() => embed("hello"), { message: /not initialized/ });
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/llm/embedding/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Bedrock embedding provider — Titan Embed V2 via the Bedrock Runtime SDK.
|
|
3
|
+
*
|
|
4
|
+
* The @aws-sdk/client-bedrock-runtime package is heavy (~5 MB), so we
|
|
5
|
+
* dynamic-import it inside init() — users on Ollama/OpenAI/Portkey never pay
|
|
6
|
+
* the cold-start cost.
|
|
7
|
+
*
|
|
8
|
+
* Errors: SDK exceptions are translated into the shared `LlmHttpError`
|
|
9
|
+
* hierarchy when possible (using `$metadata.httpStatusCode`) so callers can
|
|
10
|
+
* branch on `err.kind` the same way they do for HTTP-based providers.
|
|
11
|
+
*/
|
|
12
|
+
import type { EmbeddingProvider } from "../types.js";
|
|
13
|
+
export declare const bedrockEmbeddingProvider: EmbeddingProvider;
|
|
14
|
+
/** Test-only: drop the cached SDK so unit tests can re-mock the dynamic import. */
|
|
15
|
+
export declare function _resetBedrockEmbeddingClient(): void;
|
|
16
|
+
//# sourceMappingURL=bedrock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/bedrock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,aAAa,CAAC;AA2D9E,eAAO,MAAM,wBAAwB,EAAE,iBAiCtC,CAAC;AAIF,mFAAmF;AACnF,wBAAgB,4BAA4B,IAAI,IAAI,CAGnD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Bedrock embedding provider — Titan Embed V2 via the Bedrock Runtime SDK.
|
|
3
|
+
*
|
|
4
|
+
* The @aws-sdk/client-bedrock-runtime package is heavy (~5 MB), so we
|
|
5
|
+
* dynamic-import it inside init() — users on Ollama/OpenAI/Portkey never pay
|
|
6
|
+
* the cold-start cost.
|
|
7
|
+
*
|
|
8
|
+
* Errors: SDK exceptions are translated into the shared `LlmHttpError`
|
|
9
|
+
* hierarchy when possible (using `$metadata.httpStatusCode`) so callers can
|
|
10
|
+
* branch on `err.kind` the same way they do for HTTP-based providers.
|
|
11
|
+
*/
|
|
12
|
+
import { registerEmbeddingProvider } from "../registry.js";
|
|
13
|
+
import { classifyHttpStatus, LlmAuthError, LlmBadRequestError, LlmRateLimitError, LlmTransientError, LlmUnknownError, } from "../../errors.js";
|
|
14
|
+
let client = null;
|
|
15
|
+
let InvokeModelCommand = null;
|
|
16
|
+
async function ensureSdk(cfg) {
|
|
17
|
+
if (client && InvokeModelCommand)
|
|
18
|
+
return;
|
|
19
|
+
const region = cfg.extra.region ??
|
|
20
|
+
process.env.AWS_BEDROCK_REGION ??
|
|
21
|
+
process.env.AWS_REGION ??
|
|
22
|
+
"us-east-1";
|
|
23
|
+
const sdk = await import("@aws-sdk/client-bedrock-runtime");
|
|
24
|
+
// SDK resolves credentials via its default chain (env → shared credentials → SSO → IAM role).
|
|
25
|
+
client = new sdk.BedrockRuntimeClient({ region });
|
|
26
|
+
InvokeModelCommand = sdk.InvokeModelCommand;
|
|
27
|
+
}
|
|
28
|
+
function translateSdkError(err, model) {
|
|
29
|
+
const e = err;
|
|
30
|
+
const status = e.$metadata?.httpStatusCode;
|
|
31
|
+
const details = {
|
|
32
|
+
provider: "bedrock",
|
|
33
|
+
model,
|
|
34
|
+
status,
|
|
35
|
+
body: e.message ?? e.name,
|
|
36
|
+
cause: err,
|
|
37
|
+
};
|
|
38
|
+
if (status === undefined) {
|
|
39
|
+
return new LlmTransientError(details);
|
|
40
|
+
}
|
|
41
|
+
switch (classifyHttpStatus(status)) {
|
|
42
|
+
case "auth": return new LlmAuthError(details);
|
|
43
|
+
case "rate_limit": return new LlmRateLimitError(details);
|
|
44
|
+
case "bad_request": return new LlmBadRequestError(details);
|
|
45
|
+
case "transient": return new LlmTransientError(details);
|
|
46
|
+
default: return new LlmUnknownError(details);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export const bedrockEmbeddingProvider = {
|
|
50
|
+
name: "bedrock",
|
|
51
|
+
label: "AWS Bedrock (Titan Embed)",
|
|
52
|
+
browserCompatible: false,
|
|
53
|
+
defaults: {
|
|
54
|
+
model: "amazon.titan-embed-text-v2:0",
|
|
55
|
+
dimensions: 1024,
|
|
56
|
+
},
|
|
57
|
+
async embed(text, cfg) {
|
|
58
|
+
await ensureSdk(cfg);
|
|
59
|
+
const payload = JSON.stringify({
|
|
60
|
+
inputText: text,
|
|
61
|
+
dimensions: cfg.dimensions,
|
|
62
|
+
normalize: true,
|
|
63
|
+
});
|
|
64
|
+
const command = new InvokeModelCommand({
|
|
65
|
+
modelId: cfg.model,
|
|
66
|
+
contentType: "application/json",
|
|
67
|
+
accept: "application/json",
|
|
68
|
+
body: new TextEncoder().encode(payload),
|
|
69
|
+
});
|
|
70
|
+
let resp;
|
|
71
|
+
try {
|
|
72
|
+
resp = await client.send(command);
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
throw translateSdkError(e, cfg.model);
|
|
76
|
+
}
|
|
77
|
+
const raw = JSON.parse(new TextDecoder().decode(resp.body));
|
|
78
|
+
if (!raw.embedding) {
|
|
79
|
+
throw new Error(`Embedding response from bedrock missing data (model: ${cfg.model})`);
|
|
80
|
+
}
|
|
81
|
+
return raw.embedding;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
registerEmbeddingProvider(bedrockEmbeddingProvider);
|
|
85
|
+
/** Test-only: drop the cached SDK so unit tests can re-mock the dynamic import. */
|
|
86
|
+
export function _resetBedrockEmbeddingClient() {
|
|
87
|
+
client = null;
|
|
88
|
+
InvokeModelCommand = null;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=bedrock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/bedrock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.test.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/bedrock.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { bedrockEmbeddingProvider } from "./bedrock.js";
|
|
4
|
+
describe("bedrock embedding provider — metadata", () => {
|
|
5
|
+
it("declares the correct name + label", () => {
|
|
6
|
+
assert.strictEqual(bedrockEmbeddingProvider.name, "bedrock");
|
|
7
|
+
assert.strictEqual(bedrockEmbeddingProvider.label, "AWS Bedrock (Titan Embed)");
|
|
8
|
+
});
|
|
9
|
+
it("is NOT browserCompatible (cannot be called from the UI)", () => {
|
|
10
|
+
assert.strictEqual(bedrockEmbeddingProvider.browserCompatible, false);
|
|
11
|
+
});
|
|
12
|
+
it("defaults to titan-embed-text-v2 with 1024 dimensions and no baseUrl", () => {
|
|
13
|
+
assert.strictEqual(bedrockEmbeddingProvider.defaults.model, "amazon.titan-embed-text-v2:0");
|
|
14
|
+
assert.strictEqual(bedrockEmbeddingProvider.defaults.dimensions, 1024);
|
|
15
|
+
assert.strictEqual(bedrockEmbeddingProvider.defaults.baseUrl, undefined);
|
|
16
|
+
});
|
|
17
|
+
it("loads the AWS SDK lazily on first embed() call (not at module load)", () => {
|
|
18
|
+
// The provider intentionally has no init() hook — the SDK is dynamic-imported
|
|
19
|
+
// inside embed(). Just verify the provider only exposes embed().
|
|
20
|
+
assert.strictEqual(typeof bedrockEmbeddingProvider.embed, "function");
|
|
21
|
+
assert.strictEqual(bedrockEmbeddingProvider.init, undefined);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=bedrock.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock.test.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/bedrock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAExD,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,QAAQ,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;QAC5F,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,wBAAwB,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,8EAA8E;QAC9E,iEAAiE;QACjE,MAAM,CAAC,WAAW,CAAC,OAAO,wBAAwB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAE,wBAA0D,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Side-effect barrel — importing this file registers every built-in embedding
|
|
3
|
+
* provider. Adding a new provider? Add a line here and a file alongside.
|
|
4
|
+
*/
|
|
5
|
+
import "./ollama.js";
|
|
6
|
+
import "./openai.js";
|
|
7
|
+
import "./bedrock.js";
|
|
8
|
+
import "./portkey.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC;AACrB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Side-effect barrel — importing this file registers every built-in embedding
|
|
3
|
+
* provider. Adding a new provider? Add a line here and a file alongside.
|
|
4
|
+
*/
|
|
5
|
+
import "./ollama.js";
|
|
6
|
+
import "./openai.js";
|
|
7
|
+
import "./bedrock.js";
|
|
8
|
+
import "./portkey.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,aAAa,CAAC;AACrB,OAAO,aAAa,CAAC;AACrB,OAAO,cAAc,CAAC;AACtB,OAAO,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/ollama.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,aAAa,CAAC;AAQ9E,eAAO,MAAM,uBAAuB,EAAE,iBA6BrC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama embedding provider — local /v1/embeddings (OpenAI-compatible).
|
|
3
|
+
*/
|
|
4
|
+
import { registerEmbeddingProvider } from "../registry.js";
|
|
5
|
+
import { resilientFetch } from "../../fetch.js";
|
|
6
|
+
const RETRY_CAP_MS = 5_000;
|
|
7
|
+
export const ollamaEmbeddingProvider = {
|
|
8
|
+
name: "ollama",
|
|
9
|
+
label: "Ollama (local)",
|
|
10
|
+
browserCompatible: true,
|
|
11
|
+
defaults: {
|
|
12
|
+
model: "qwen3-embedding:0.6b",
|
|
13
|
+
dimensions: 1024,
|
|
14
|
+
baseUrl: "http://localhost:11434",
|
|
15
|
+
},
|
|
16
|
+
async embed(text, cfg) {
|
|
17
|
+
const resp = await resilientFetch({
|
|
18
|
+
url: `${cfg.baseUrl}/v1/embeddings`,
|
|
19
|
+
init: {
|
|
20
|
+
method: "POST",
|
|
21
|
+
headers: { "Content-Type": "application/json" },
|
|
22
|
+
body: JSON.stringify({ model: cfg.model, input: text }),
|
|
23
|
+
},
|
|
24
|
+
timeoutMs: cfg.timeoutMs,
|
|
25
|
+
retries: cfg.retries,
|
|
26
|
+
baseDelayMs: cfg.retryBaseDelayMs,
|
|
27
|
+
capDelayMs: RETRY_CAP_MS,
|
|
28
|
+
provider: "ollama",
|
|
29
|
+
model: cfg.model,
|
|
30
|
+
});
|
|
31
|
+
const data = (await resp.json());
|
|
32
|
+
const first = data.data[0];
|
|
33
|
+
if (!first)
|
|
34
|
+
throw new Error(`Embedding response from ollama missing data`);
|
|
35
|
+
return first.embedding;
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
registerEmbeddingProvider(ollamaEmbeddingProvider);
|
|
39
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/ollama.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAOhD,MAAM,YAAY,GAAG,KAAK,CAAC;AAE3B,MAAM,CAAC,MAAM,uBAAuB,GAAsB;IACxD,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,gBAAgB;IACvB,iBAAiB,EAAE,IAAI;IACvB,QAAQ,EAAE;QACR,KAAK,EAAE,sBAAsB;QAC7B,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,wBAAwB;KAClC;IACD,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,GAA4B;QACpD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;YAChC,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,gBAAgB;YACnC,IAAI,EAAE;gBACJ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aACxD;YACD,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,WAAW,EAAE,GAAG,CAAC,gBAAgB;YACjC,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAyB,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;CACF,CAAC;AAEF,yBAAyB,CAAC,uBAAuB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.test.d.ts","sourceRoot":"","sources":["../../../../src/llm/embedding/providers/ollama.test.ts"],"names":[],"mappings":""}
|