bikky 0.3.0 → 0.3.1
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/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -1
- package/dist/daemon/qdrant.d.ts.map +1 -1
- package/dist/daemon/qdrant.js +22 -17
- package/dist/daemon/qdrant.js.map +1 -1
- package/dist/daemon/relations.d.ts +4 -1
- package/dist/daemon/relations.d.ts.map +1 -1
- package/dist/daemon/relations.js +40 -17
- package/dist/daemon/relations.js.map +1 -1
- package/dist/lib/qdrant-client.d.ts +89 -0
- package/dist/lib/qdrant-client.d.ts.map +1 -0
- package/dist/lib/qdrant-client.js +242 -0
- package/dist/lib/qdrant-client.js.map +1 -0
- package/dist/lib/qdrant-client.test.d.ts +8 -0
- package/dist/lib/qdrant-client.test.d.ts.map +1 -0
- package/dist/lib/qdrant-client.test.js +207 -0
- package/dist/lib/qdrant-client.test.js.map +1 -0
- package/dist/mcp/api.d.ts.map +1 -1
- package/dist/mcp/api.js +42 -44
- package/dist/mcp/api.js.map +1 -1
- package/package.json +1 -1
package/dist/config.d.ts
CHANGED
|
@@ -32,6 +32,11 @@ export interface DaemonConfig {
|
|
|
32
32
|
relation_inference_enabled: boolean;
|
|
33
33
|
staleness_threshold_days: number;
|
|
34
34
|
}
|
|
35
|
+
export interface QdrantClientConfig {
|
|
36
|
+
timeout_ms: number;
|
|
37
|
+
retries: number;
|
|
38
|
+
retry_base_delay_ms: number;
|
|
39
|
+
}
|
|
35
40
|
export interface WatcherConfig {
|
|
36
41
|
copilot: {
|
|
37
42
|
enabled: boolean;
|
|
@@ -51,6 +56,7 @@ export interface BikkyConfig {
|
|
|
51
56
|
llm: LLMConfig;
|
|
52
57
|
daemon: DaemonConfig;
|
|
53
58
|
watchers: WatcherConfig;
|
|
59
|
+
qdrant_client: QdrantClientConfig;
|
|
54
60
|
}
|
|
55
61
|
declare const DEFAULTS: BikkyConfig;
|
|
56
62
|
export declare function loadConfig(): BikkyConfig;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,SAAS,QAAoC,CAAC;AAC3D,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,OAAO,QAA+B,CAAC;AACpD,eAAO,MAAM,SAAS,QAAgC,CAAC;AACvD,eAAO,MAAM,QAAQ,QAAqC,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,SAAS,QAAoC,CAAC;AAC3D,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,OAAO,QAA+B,CAAC;AACpD,eAAO,MAAM,SAAS,QAAgC,CAAC;AACvD,eAAO,MAAM,QAAQ,QAAqC,CAAC;AAM3D,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,kBAAkB,CAAC;CACnC;AAMD,QAAA,MAAM,QAAQ,EAAE,WAqCf,CAAC;AA0BF,wBAAgB,UAAU,IAAI,WAAW,CAqExC;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAIpD;AAED,yCAAyC;AACzC,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -50,6 +50,11 @@ const DEFAULTS = {
|
|
|
50
50
|
copilot: { enabled: true, path: path.join(os.homedir(), ".copilot", "session-state") },
|
|
51
51
|
claude: { enabled: false, path: path.join(os.homedir(), ".claude", "projects") },
|
|
52
52
|
},
|
|
53
|
+
qdrant_client: {
|
|
54
|
+
timeout_ms: 10_000,
|
|
55
|
+
retries: 3,
|
|
56
|
+
retry_base_delay_ms: 250,
|
|
57
|
+
},
|
|
53
58
|
};
|
|
54
59
|
// ---------------------------------------------------------------------------
|
|
55
60
|
// Deep merge utility
|
|
@@ -124,6 +129,22 @@ export function loadConfig() {
|
|
|
124
129
|
config.llm.bedrock_region = process.env.AWS_REGION;
|
|
125
130
|
if (process.env.AWS_PROFILE)
|
|
126
131
|
config.aws_profile = process.env.AWS_PROFILE;
|
|
132
|
+
// Qdrant client tuning env overrides
|
|
133
|
+
if (process.env.QDRANT_TIMEOUT_MS) {
|
|
134
|
+
const n = parseInt(process.env.QDRANT_TIMEOUT_MS, 10);
|
|
135
|
+
if (Number.isFinite(n) && n >= 0)
|
|
136
|
+
config.qdrant_client.timeout_ms = n;
|
|
137
|
+
}
|
|
138
|
+
if (process.env.QDRANT_RETRIES) {
|
|
139
|
+
const n = parseInt(process.env.QDRANT_RETRIES, 10);
|
|
140
|
+
if (Number.isFinite(n) && n >= 0)
|
|
141
|
+
config.qdrant_client.retries = n;
|
|
142
|
+
}
|
|
143
|
+
if (process.env.QDRANT_RETRY_BASE_DELAY_MS) {
|
|
144
|
+
const n = parseInt(process.env.QDRANT_RETRY_BASE_DELAY_MS, 10);
|
|
145
|
+
if (Number.isFinite(n) && n >= 0)
|
|
146
|
+
config.qdrant_client.retry_base_delay_ms = n;
|
|
147
|
+
}
|
|
127
148
|
// Propagate aws_profile into env so both Bedrock clients (LLM + embedding)
|
|
128
149
|
// pick it up via the SDK's default credential chain.
|
|
129
150
|
if (config.aws_profile && !process.env.AWS_PROFILE) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/daemon/qdrant.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,KAAK,EAAqC,MAAM,iBAAiB,CAAC;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/daemon/qdrant.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/qdrant.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { randomUUID } from "node:crypto";
|
|
8
8
|
import { loadConfig } from "../config.js";
|
|
9
9
|
import { embed, initEmbedding } from "../llm/index.js";
|
|
10
|
+
import { QdrantClient } from "../lib/qdrant-client.js";
|
|
10
11
|
// ---------------------------------------------------------------------------
|
|
11
12
|
// State
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
@@ -14,11 +15,13 @@ let qdrantUrl = null;
|
|
|
14
15
|
let qdrantApiKey = null;
|
|
15
16
|
let collection = "bikky";
|
|
16
17
|
let logFn = () => { };
|
|
18
|
+
let client = null;
|
|
17
19
|
const setLogger = (fn) => { logFn = fn; };
|
|
18
20
|
const setEmbeddingConfig = (overrides) => {
|
|
19
21
|
if (overrides)
|
|
20
22
|
initEmbedding(overrides);
|
|
21
23
|
};
|
|
24
|
+
const clientLogAdapter = (level, msg) => logFn(level, msg);
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
23
26
|
// Init — reads credentials from loadConfig()
|
|
24
27
|
// ---------------------------------------------------------------------------
|
|
@@ -39,32 +42,34 @@ const init = () => {
|
|
|
39
42
|
});
|
|
40
43
|
logFn("INFO", `Embedding provider: ${embCfg.provider}/${embCfg.model} (${embCfg.dimensions}d) @ ${embCfg.baseUrl}`);
|
|
41
44
|
const ready = !!(qdrantUrl && qdrantApiKey);
|
|
42
|
-
if (
|
|
45
|
+
if (ready) {
|
|
46
|
+
client = new QdrantClient({
|
|
47
|
+
url: qdrantUrl,
|
|
48
|
+
apiKey: qdrantApiKey,
|
|
49
|
+
collection,
|
|
50
|
+
timeoutMs: cfg.qdrant_client.timeout_ms,
|
|
51
|
+
retries: cfg.qdrant_client.retries,
|
|
52
|
+
retryBaseDelayMs: cfg.qdrant_client.retry_base_delay_ms,
|
|
53
|
+
log: clientLogAdapter,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
client = null;
|
|
43
58
|
logFn("WARN", "Qdrant client: missing credentials (some memory features disabled)");
|
|
44
59
|
}
|
|
45
60
|
return ready;
|
|
46
61
|
};
|
|
47
|
-
const isReady = () => !!(qdrantUrl && qdrantApiKey);
|
|
62
|
+
const isReady = () => !!(qdrantUrl && qdrantApiKey && client);
|
|
48
63
|
// ---------------------------------------------------------------------------
|
|
49
64
|
// HTTP requests
|
|
50
65
|
// ---------------------------------------------------------------------------
|
|
51
66
|
const qdrantRequest = async (method, urlPath, body) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
method,
|
|
55
|
-
headers: {
|
|
56
|
-
"Content-Type": "application/json",
|
|
57
|
-
"api-key": qdrantApiKey,
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
if (body)
|
|
61
|
-
opts.body = JSON.stringify(body);
|
|
62
|
-
const resp = await fetch(url, opts);
|
|
63
|
-
if (!resp.ok) {
|
|
64
|
-
const text = await resp.text().catch(() => "");
|
|
65
|
-
throw new Error(`Qdrant ${method} ${urlPath} failed (${resp.status}): ${text.slice(0, 200)}`);
|
|
67
|
+
if (!client) {
|
|
68
|
+
throw new Error(`Qdrant client not initialized — call init() first (${method} ${urlPath})`);
|
|
66
69
|
}
|
|
67
|
-
|
|
70
|
+
const result = await client.request(method, urlPath, body);
|
|
71
|
+
// Some Qdrant endpoints return empty bodies on success — preserve old return shape.
|
|
72
|
+
return result ?? {};
|
|
68
73
|
};
|
|
69
74
|
// ---------------------------------------------------------------------------
|
|
70
75
|
// Read methods
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant.js","sourceRoot":"","sources":["../../src/daemon/qdrant.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAsB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"qdrant.js","sourceRoot":"","sources":["../../src/daemon/qdrant.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,18 +35,21 @@ declare const getExistingRelations: () => Promise<Set<string>>;
|
|
|
35
35
|
/**
|
|
36
36
|
* Use LLM to infer a relationship label from shared facts.
|
|
37
37
|
* Returns null if the LLM can't determine a meaningful relationship.
|
|
38
|
+
* The LLM decides directionality — `from` is the subject, `to` is the object.
|
|
38
39
|
*/
|
|
39
40
|
declare const inferRelation: (entityA: string, entityB: string, sharedFacts: Array<{
|
|
40
41
|
content: string;
|
|
41
42
|
category: string;
|
|
42
43
|
}>) => Promise<{
|
|
44
|
+
from: string;
|
|
43
45
|
type: string;
|
|
46
|
+
to: string;
|
|
44
47
|
content: string;
|
|
45
48
|
} | null>;
|
|
46
49
|
/**
|
|
47
50
|
* Store an inferred relation as a memory fact.
|
|
48
51
|
*/
|
|
49
|
-
declare const storeRelation: (
|
|
52
|
+
declare const storeRelation: (fromEntity: string, toEntity: string, relationType: string, content: string, sharedFactIds: string[]) => Promise<string>;
|
|
50
53
|
declare const tick: (config: BikkyConfig) => Promise<void>;
|
|
51
54
|
/** Reset state (for testing). */
|
|
52
55
|
declare const _reset: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/daemon/relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAOxD,QAAA,MAAM,SAAS,GAAI,IAAI,KAAK,KAAG,IAAuB,CAAC;AAcvD,2DAA2D;AAC3D,QAAA,MAAM,OAAO,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAGvC,CAAC;AAEF,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,QAAA,MAAM,oBAAoB,QAAa,OAAO,CAAC,YAAY,EAAE,CA2E5D,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,oBAAoB,QAAa,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CA8CzD,CAAC;AAqBF
|
|
1
|
+
{"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/daemon/relations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAOxD,QAAA,MAAM,SAAS,GAAI,IAAI,KAAK,KAAG,IAAuB,CAAC;AAcvD,2DAA2D;AAC3D,QAAA,MAAM,OAAO,GAAI,GAAG,MAAM,EAAE,GAAG,MAAM,KAAG,MAGvC,CAAC;AAEF,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;GAGG;AACH,QAAA,MAAM,oBAAoB,QAAa,OAAO,CAAC,YAAY,EAAE,CA2E5D,CAAC;AAEF;;;GAGG;AACH,QAAA,MAAM,oBAAoB,QAAa,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CA8CzD,CAAC;AAqBF;;;;GAIG;AACH,QAAA,MAAM,aAAa,GACjB,SAAS,MAAM,EACf,SAAS,MAAM,EACf,aAAa,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,KACxD,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAuE5E,CAAC;AAEF;;GAEG;AACH,QAAA,MAAM,aAAa,GACjB,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,cAAc,MAAM,EACpB,SAAS,MAAM,EACf,eAAe,MAAM,EAAE,KACtB,OAAO,CAAC,MAAM,CA4BhB,CAAC;AAIF,QAAA,MAAM,IAAI,GAAU,QAAQ,WAAW,KAAG,OAAO,CAAC,IAAI,CA+DrD,CAAC;AAEF,iCAAiC;AACjC,QAAA,MAAM,MAAM,QAAO,IAElB,CAAC;AAEF,OAAO,EACL,IAAI,EACJ,SAAS,EACT,MAAM,EAEN,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,OAAO,GACR,CAAC"}
|
package/dist/daemon/relations.js
CHANGED
|
@@ -152,6 +152,7 @@ const fetchFactContents = async (factIds) => {
|
|
|
152
152
|
/**
|
|
153
153
|
* Use LLM to infer a relationship label from shared facts.
|
|
154
154
|
* Returns null if the LLM can't determine a meaningful relationship.
|
|
155
|
+
* The LLM decides directionality — `from` is the subject, `to` is the object.
|
|
155
156
|
*/
|
|
156
157
|
const inferRelation = async (entityA, entityB, sharedFacts) => {
|
|
157
158
|
const factsText = sharedFacts
|
|
@@ -161,20 +162,26 @@ const inferRelation = async (entityA, entityB, sharedFacts) => {
|
|
|
161
162
|
messages: [
|
|
162
163
|
{
|
|
163
164
|
role: "system",
|
|
164
|
-
content: `You infer relationships between entities based on shared facts.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
content: `You infer directed relationships between entities based on shared facts.
|
|
166
|
+
|
|
167
|
+
Output ONLY valid JSON with this exact shape:
|
|
168
|
+
{ "from": "subject-entity", "type": "verb-phrase", "to": "object-entity", "content": "one sentence" }
|
|
169
|
+
|
|
170
|
+
Direction matters — "from" is the entity that DOES the action, "to" is acted upon:
|
|
171
|
+
✅ { "from": "telegrambot", "type": "depends-on", "to": "bedrock" }
|
|
172
|
+
❌ { "from": "bedrock", "type": "depends-on", "to": "telegrambot" }
|
|
173
|
+
|
|
174
|
+
The "type" should be a 1-3 word verb phrase (e.g. "depends-on", "uses", "runs-on", "owns", "manages").
|
|
175
|
+
The "from" and "to" MUST be one of the two entities provided — do not invent new names.
|
|
176
|
+
If the facts don't suggest a clear directional relationship, output: { "type": null }`,
|
|
169
177
|
},
|
|
170
178
|
{
|
|
171
179
|
role: "user",
|
|
172
|
-
content: `
|
|
173
|
-
Entity B: "${entityB}"
|
|
180
|
+
content: `Entities: "${entityA}", "${entityB}"
|
|
174
181
|
Shared facts (${sharedFacts.length}):
|
|
175
182
|
${factsText}
|
|
176
183
|
|
|
177
|
-
Infer the primary relationship between these two entities.`,
|
|
184
|
+
Infer the primary directed relationship between these two entities.`,
|
|
178
185
|
},
|
|
179
186
|
],
|
|
180
187
|
temperature: 0.1,
|
|
@@ -187,7 +194,23 @@ Infer the primary relationship between these two entities.`,
|
|
|
187
194
|
const parsed = JSON.parse(jsonStr);
|
|
188
195
|
if (!parsed.type)
|
|
189
196
|
return null;
|
|
190
|
-
|
|
197
|
+
// Validate that from/to are the provided entities (not hallucinated)
|
|
198
|
+
const entities = new Set([entityA.toLowerCase(), entityB.toLowerCase()]);
|
|
199
|
+
const from = parsed.from?.toLowerCase() ?? "";
|
|
200
|
+
const to = parsed.to?.toLowerCase() ?? "";
|
|
201
|
+
if (!entities.has(from) || !entities.has(to) || from === to) {
|
|
202
|
+
logFn("WARN", `Relations: LLM returned invalid from/to for ${entityA}↔${entityB}: from="${parsed.from}", to="${parsed.to}"`);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
// Use the LLM's chosen direction (normalised to original casing)
|
|
206
|
+
const resolvedFrom = from === entityA.toLowerCase() ? entityA : entityB;
|
|
207
|
+
const resolvedTo = to === entityA.toLowerCase() ? entityA : entityB;
|
|
208
|
+
return {
|
|
209
|
+
from: resolvedFrom,
|
|
210
|
+
type: parsed.type,
|
|
211
|
+
to: resolvedTo,
|
|
212
|
+
content: parsed.content || `${resolvedFrom} ${parsed.type} ${resolvedTo}`,
|
|
213
|
+
};
|
|
191
214
|
}
|
|
192
215
|
catch {
|
|
193
216
|
logFn("WARN", `Relations: failed to parse LLM response for ${entityA}↔${entityB}: ${raw.slice(0, 100)}`);
|
|
@@ -197,16 +220,16 @@ Infer the primary relationship between these two entities.`,
|
|
|
197
220
|
/**
|
|
198
221
|
* Store an inferred relation as a memory fact.
|
|
199
222
|
*/
|
|
200
|
-
const storeRelation = async (
|
|
223
|
+
const storeRelation = async (fromEntity, toEntity, relationType, content, sharedFactIds) => {
|
|
201
224
|
const hash = createHash("sha256")
|
|
202
|
-
.update(`daemon-relation:${pairKey(
|
|
225
|
+
.update(`daemon-relation:${pairKey(fromEntity, toEntity)}:${relationType}`)
|
|
203
226
|
.digest("hex");
|
|
204
227
|
const id = await qdrant.storeFact({
|
|
205
228
|
content,
|
|
206
229
|
category: "team", // relations are about entity structure
|
|
207
230
|
domain: "work",
|
|
208
231
|
kind: "relation",
|
|
209
|
-
entities: [
|
|
232
|
+
entities: [fromEntity, toEntity],
|
|
210
233
|
source: "daemon",
|
|
211
234
|
confidence: 0.7,
|
|
212
235
|
importance: 0.6,
|
|
@@ -216,12 +239,12 @@ const storeRelation = async (entityA, entityB, relationType, content, sharedFact
|
|
|
216
239
|
shared_fact_count: String(sharedFactIds.length),
|
|
217
240
|
},
|
|
218
241
|
relation: {
|
|
219
|
-
from:
|
|
242
|
+
from: fromEntity,
|
|
220
243
|
type: relationType,
|
|
221
|
-
to:
|
|
244
|
+
to: toEntity,
|
|
222
245
|
},
|
|
223
246
|
});
|
|
224
|
-
logFn("INFO", `Relations: inferred ${
|
|
247
|
+
logFn("INFO", `Relations: inferred ${fromEntity} —[${relationType}]→ ${toEntity} (id: ${id})`);
|
|
225
248
|
return id;
|
|
226
249
|
};
|
|
227
250
|
// ─── Main Tick ───────────────────────────────────────────────────────────────
|
|
@@ -260,14 +283,14 @@ const tick = async (config) => {
|
|
|
260
283
|
continue;
|
|
261
284
|
// Dedup check before storing
|
|
262
285
|
const hash = createHash("sha256")
|
|
263
|
-
.update(`daemon-relation:${pairKey(
|
|
286
|
+
.update(`daemon-relation:${pairKey(result.from, result.to)}:${result.type}`)
|
|
264
287
|
.digest("hex");
|
|
265
288
|
const dedup = await qdrant.dedupCheck(result.content, hash);
|
|
266
289
|
if (dedup.action === "skip") {
|
|
267
290
|
logFn("DEBUG", `Relations: skipping duplicate ${candidate.entityA}↔${candidate.entityB}`);
|
|
268
291
|
continue;
|
|
269
292
|
}
|
|
270
|
-
await storeRelation(
|
|
293
|
+
await storeRelation(result.from, result.to, result.type, result.content, candidate.factIds);
|
|
271
294
|
inferred++;
|
|
272
295
|
}
|
|
273
296
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/daemon/relations.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/daemon/relations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Qdrant HTTP client used by both the daemon and the MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Adds the resilience features that the previous inline `fetch` wrappers lacked:
|
|
5
|
+
* - per-request timeout via AbortSignal
|
|
6
|
+
* - retry with exponential backoff + jitter on transient errors (5xx, 408, 425)
|
|
7
|
+
* - 429 handling that honours Retry-After
|
|
8
|
+
* - typed errors so callers can branch on status class instead of string-matching
|
|
9
|
+
*
|
|
10
|
+
* The client is intentionally minimal — it exposes a generic `request<T>` and a
|
|
11
|
+
* dedicated `ensureCollection` helper. Higher-level Qdrant operations
|
|
12
|
+
* (search/scroll/upsert/etc.) stay in the daemon and MCP modules so this lib
|
|
13
|
+
* does not need to know about payload shapes.
|
|
14
|
+
*/
|
|
15
|
+
export type QdrantLogLevel = "DEBUG" | "INFO" | "WARN" | "ERROR";
|
|
16
|
+
export type QdrantLogFn = (level: QdrantLogLevel, msg: string) => void;
|
|
17
|
+
export interface QdrantClientOptions {
|
|
18
|
+
url: string;
|
|
19
|
+
apiKey: string;
|
|
20
|
+
collection: string;
|
|
21
|
+
/** Per-request timeout in ms (default 10_000). */
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
/** Max retry attempts for transient errors (default 3). 0 disables retries. */
|
|
24
|
+
retries?: number;
|
|
25
|
+
/** Base delay for exponential backoff in ms (default 250). */
|
|
26
|
+
retryBaseDelayMs?: number;
|
|
27
|
+
/** Optional logger — quiet by default. */
|
|
28
|
+
log?: QdrantLogFn;
|
|
29
|
+
}
|
|
30
|
+
export interface QdrantRequestOptions {
|
|
31
|
+
/** Override the client default for this call. */
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
/** Override the client default for this call. */
|
|
34
|
+
retries?: number;
|
|
35
|
+
}
|
|
36
|
+
export interface QdrantIndexSpec {
|
|
37
|
+
field_name: string;
|
|
38
|
+
field_schema: string;
|
|
39
|
+
}
|
|
40
|
+
export declare class QdrantError extends Error {
|
|
41
|
+
readonly status?: number;
|
|
42
|
+
readonly responseBody?: string;
|
|
43
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
44
|
+
}
|
|
45
|
+
/** 401 / 403 — credentials are missing, wrong, or revoked. Not retried. */
|
|
46
|
+
export declare class QdrantAuthError extends QdrantError {
|
|
47
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
48
|
+
}
|
|
49
|
+
/** 404 — collection or point not found. Not retried. */
|
|
50
|
+
export declare class QdrantNotFoundError extends QdrantError {
|
|
51
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
52
|
+
}
|
|
53
|
+
/** 429 — rate limit. Retried (Retry-After honoured if present). */
|
|
54
|
+
export declare class QdrantRateLimitError extends QdrantError {
|
|
55
|
+
readonly retryAfterMs?: number;
|
|
56
|
+
constructor(message: string, status?: number, responseBody?: string, retryAfterMs?: number);
|
|
57
|
+
}
|
|
58
|
+
/** 408, 425, 5xx, network failures, timeouts. Retried. */
|
|
59
|
+
export declare class QdrantTransientError extends QdrantError {
|
|
60
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
61
|
+
}
|
|
62
|
+
/** 400, 422 — malformed request. Not retried. */
|
|
63
|
+
export declare class QdrantBadRequestError extends QdrantError {
|
|
64
|
+
constructor(message: string, status?: number, responseBody?: string);
|
|
65
|
+
}
|
|
66
|
+
export declare class QdrantClient {
|
|
67
|
+
private readonly url;
|
|
68
|
+
private readonly apiKey;
|
|
69
|
+
readonly collection: string;
|
|
70
|
+
private readonly timeoutMs;
|
|
71
|
+
private readonly retries;
|
|
72
|
+
private readonly retryBaseDelayMs;
|
|
73
|
+
private readonly log;
|
|
74
|
+
constructor(opts: QdrantClientOptions);
|
|
75
|
+
/**
|
|
76
|
+
* Perform a single Qdrant REST request. Retries transient errors and 429s
|
|
77
|
+
* with exponential backoff. Errors are classified into the typed hierarchy.
|
|
78
|
+
*/
|
|
79
|
+
request<T = unknown>(method: string, path: string, body?: unknown, opts?: QdrantRequestOptions): Promise<T>;
|
|
80
|
+
private doRequest;
|
|
81
|
+
/**
|
|
82
|
+
* Ensure the configured collection exists with the given vector size, then
|
|
83
|
+
* (re-)create the supplied payload indexes. Index creation failures are
|
|
84
|
+
* logged but not fatal — Qdrant returns an error when an index already
|
|
85
|
+
* exists, and we want this to be idempotent.
|
|
86
|
+
*/
|
|
87
|
+
ensureCollection(vectorSize: number, indexes: ReadonlyArray<QdrantIndexSpec>): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=qdrant-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-client.d.ts","sourceRoot":"","sources":["../../src/lib/qdrant-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Qdrant HTTP client used by both the daemon and the MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Adds the resilience features that the previous inline `fetch` wrappers lacked:
|
|
5
|
+
* - per-request timeout via AbortSignal
|
|
6
|
+
* - retry with exponential backoff + jitter on transient errors (5xx, 408, 425)
|
|
7
|
+
* - 429 handling that honours Retry-After
|
|
8
|
+
* - typed errors so callers can branch on status class instead of string-matching
|
|
9
|
+
*
|
|
10
|
+
* The client is intentionally minimal — it exposes a generic `request<T>` and a
|
|
11
|
+
* dedicated `ensureCollection` helper. Higher-level Qdrant operations
|
|
12
|
+
* (search/scroll/upsert/etc.) stay in the daemon and MCP modules so this lib
|
|
13
|
+
* does not need to know about payload shapes.
|
|
14
|
+
*/
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Error hierarchy
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export class QdrantError extends Error {
|
|
19
|
+
status;
|
|
20
|
+
responseBody;
|
|
21
|
+
constructor(message, status, responseBody) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = "QdrantError";
|
|
24
|
+
this.status = status;
|
|
25
|
+
this.responseBody = responseBody;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** 401 / 403 — credentials are missing, wrong, or revoked. Not retried. */
|
|
29
|
+
export class QdrantAuthError extends QdrantError {
|
|
30
|
+
constructor(message, status, responseBody) {
|
|
31
|
+
super(message, status, responseBody);
|
|
32
|
+
this.name = "QdrantAuthError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** 404 — collection or point not found. Not retried. */
|
|
36
|
+
export class QdrantNotFoundError extends QdrantError {
|
|
37
|
+
constructor(message, status, responseBody) {
|
|
38
|
+
super(message, status, responseBody);
|
|
39
|
+
this.name = "QdrantNotFoundError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** 429 — rate limit. Retried (Retry-After honoured if present). */
|
|
43
|
+
export class QdrantRateLimitError extends QdrantError {
|
|
44
|
+
retryAfterMs;
|
|
45
|
+
constructor(message, status, responseBody, retryAfterMs) {
|
|
46
|
+
super(message, status, responseBody);
|
|
47
|
+
this.name = "QdrantRateLimitError";
|
|
48
|
+
this.retryAfterMs = retryAfterMs;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** 408, 425, 5xx, network failures, timeouts. Retried. */
|
|
52
|
+
export class QdrantTransientError extends QdrantError {
|
|
53
|
+
constructor(message, status, responseBody) {
|
|
54
|
+
super(message, status, responseBody);
|
|
55
|
+
this.name = "QdrantTransientError";
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** 400, 422 — malformed request. Not retried. */
|
|
59
|
+
export class QdrantBadRequestError extends QdrantError {
|
|
60
|
+
constructor(message, status, responseBody) {
|
|
61
|
+
super(message, status, responseBody);
|
|
62
|
+
this.name = "QdrantBadRequestError";
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Client
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
69
|
+
const DEFAULT_RETRIES = 3;
|
|
70
|
+
const DEFAULT_RETRY_BASE_DELAY_MS = 250;
|
|
71
|
+
const MAX_BACKOFF_MS = 5_000;
|
|
72
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
73
|
+
const jitter = (base) => {
|
|
74
|
+
const factor = 0.8 + Math.random() * 0.4; // ±20%
|
|
75
|
+
return Math.round(base * factor);
|
|
76
|
+
};
|
|
77
|
+
const parseRetryAfter = (header) => {
|
|
78
|
+
if (!header)
|
|
79
|
+
return undefined;
|
|
80
|
+
const seconds = Number(header);
|
|
81
|
+
if (Number.isFinite(seconds) && seconds >= 0)
|
|
82
|
+
return seconds * 1000;
|
|
83
|
+
// HTTP date format
|
|
84
|
+
const ts = Date.parse(header);
|
|
85
|
+
if (Number.isFinite(ts)) {
|
|
86
|
+
const delta = ts - Date.now();
|
|
87
|
+
return delta > 0 ? delta : 0;
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
const classifyStatus = (status, responseBody, method, path, retryAfterMs) => {
|
|
92
|
+
const summary = responseBody.slice(0, 500);
|
|
93
|
+
const message = `Qdrant ${method} ${path} failed (${status}): ${summary}`;
|
|
94
|
+
if (status === 401 || status === 403)
|
|
95
|
+
return new QdrantAuthError(message, status, responseBody);
|
|
96
|
+
if (status === 404)
|
|
97
|
+
return new QdrantNotFoundError(message, status, responseBody);
|
|
98
|
+
if (status === 429)
|
|
99
|
+
return new QdrantRateLimitError(message, status, responseBody, retryAfterMs);
|
|
100
|
+
if (status === 408 || status === 425 || status >= 500) {
|
|
101
|
+
return new QdrantTransientError(message, status, responseBody);
|
|
102
|
+
}
|
|
103
|
+
if (status === 400 || status === 422)
|
|
104
|
+
return new QdrantBadRequestError(message, status, responseBody);
|
|
105
|
+
return new QdrantError(message, status, responseBody);
|
|
106
|
+
};
|
|
107
|
+
export class QdrantClient {
|
|
108
|
+
url;
|
|
109
|
+
apiKey;
|
|
110
|
+
collection;
|
|
111
|
+
timeoutMs;
|
|
112
|
+
retries;
|
|
113
|
+
retryBaseDelayMs;
|
|
114
|
+
log;
|
|
115
|
+
constructor(opts) {
|
|
116
|
+
if (!opts.url)
|
|
117
|
+
throw new Error("QdrantClient: url is required");
|
|
118
|
+
if (!opts.apiKey)
|
|
119
|
+
throw new Error("QdrantClient: apiKey is required");
|
|
120
|
+
if (!opts.collection)
|
|
121
|
+
throw new Error("QdrantClient: collection is required");
|
|
122
|
+
this.url = opts.url.replace(/\/+$/, "");
|
|
123
|
+
this.apiKey = opts.apiKey;
|
|
124
|
+
this.collection = opts.collection;
|
|
125
|
+
this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
126
|
+
this.retries = opts.retries ?? DEFAULT_RETRIES;
|
|
127
|
+
this.retryBaseDelayMs = opts.retryBaseDelayMs ?? DEFAULT_RETRY_BASE_DELAY_MS;
|
|
128
|
+
this.log = opts.log ?? (() => { });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Perform a single Qdrant REST request. Retries transient errors and 429s
|
|
132
|
+
* with exponential backoff. Errors are classified into the typed hierarchy.
|
|
133
|
+
*/
|
|
134
|
+
async request(method, path, body, opts) {
|
|
135
|
+
const maxAttempts = (opts?.retries ?? this.retries) + 1;
|
|
136
|
+
const timeoutMs = opts?.timeoutMs ?? this.timeoutMs;
|
|
137
|
+
let attempt = 0;
|
|
138
|
+
let lastErr;
|
|
139
|
+
while (attempt < maxAttempts) {
|
|
140
|
+
attempt++;
|
|
141
|
+
try {
|
|
142
|
+
return await this.doRequest(method, path, body, timeoutMs);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
lastErr = err;
|
|
146
|
+
const retryable = err instanceof QdrantTransientError || err instanceof QdrantRateLimitError;
|
|
147
|
+
if (!retryable || attempt >= maxAttempts)
|
|
148
|
+
throw err;
|
|
149
|
+
const baseDelay = err instanceof QdrantRateLimitError && err.retryAfterMs !== undefined
|
|
150
|
+
? err.retryAfterMs
|
|
151
|
+
: Math.min(this.retryBaseDelayMs * 2 ** (attempt - 1), MAX_BACKOFF_MS);
|
|
152
|
+
const delay = jitter(baseDelay);
|
|
153
|
+
const status = err instanceof QdrantError ? err.status ?? "?" : "?";
|
|
154
|
+
this.log("WARN", `Qdrant retry ${attempt}/${maxAttempts - 1} after ${status} on ${method} ${path} (sleeping ${delay}ms)`);
|
|
155
|
+
await sleep(delay);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Defensive — loop always either returns or throws.
|
|
159
|
+
throw lastErr instanceof Error ? lastErr : new QdrantError(String(lastErr));
|
|
160
|
+
}
|
|
161
|
+
async doRequest(method, path, body, timeoutMs) {
|
|
162
|
+
const url = `${this.url}${path}`;
|
|
163
|
+
const headers = {
|
|
164
|
+
"Content-Type": "application/json",
|
|
165
|
+
"api-key": this.apiKey,
|
|
166
|
+
};
|
|
167
|
+
const init = { method, headers };
|
|
168
|
+
if (body !== undefined)
|
|
169
|
+
init.body = JSON.stringify(body);
|
|
170
|
+
let signal;
|
|
171
|
+
if (timeoutMs > 0) {
|
|
172
|
+
// AbortSignal.timeout is available in Node >= 17.3
|
|
173
|
+
signal = AbortSignal.timeout(timeoutMs);
|
|
174
|
+
init.signal = signal;
|
|
175
|
+
}
|
|
176
|
+
let resp;
|
|
177
|
+
try {
|
|
178
|
+
resp = await fetch(url, init);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
const isAbort = (err instanceof DOMException && err.name === "TimeoutError") ||
|
|
182
|
+
(err instanceof Error && (err.name === "AbortError" || err.name === "TimeoutError"));
|
|
183
|
+
if (isAbort) {
|
|
184
|
+
throw new QdrantTransientError(`Qdrant ${method} ${path} timed out after ${timeoutMs}ms`);
|
|
185
|
+
}
|
|
186
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
187
|
+
throw new QdrantTransientError(`Qdrant ${method} ${path} network error: ${msg}`);
|
|
188
|
+
}
|
|
189
|
+
if (!resp.ok) {
|
|
190
|
+
const text = await resp.text().catch(() => "");
|
|
191
|
+
const retryAfter = parseRetryAfter(resp.headers.get("retry-after"));
|
|
192
|
+
throw classifyStatus(resp.status, text, method, path, retryAfter);
|
|
193
|
+
}
|
|
194
|
+
// Some Qdrant endpoints (rare) return empty bodies on success.
|
|
195
|
+
const text = await resp.text();
|
|
196
|
+
if (!text)
|
|
197
|
+
return undefined;
|
|
198
|
+
try {
|
|
199
|
+
return JSON.parse(text);
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
throw new QdrantError(`Qdrant ${method} ${path} returned invalid JSON: ${err instanceof Error ? err.message : String(err)}`, resp.status, text.slice(0, 500));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Ensure the configured collection exists with the given vector size, then
|
|
207
|
+
* (re-)create the supplied payload indexes. Index creation failures are
|
|
208
|
+
* logged but not fatal — Qdrant returns an error when an index already
|
|
209
|
+
* exists, and we want this to be idempotent.
|
|
210
|
+
*/
|
|
211
|
+
async ensureCollection(vectorSize, indexes) {
|
|
212
|
+
const col = this.collection;
|
|
213
|
+
let exists = false;
|
|
214
|
+
try {
|
|
215
|
+
await this.request("GET", `/collections/${col}`);
|
|
216
|
+
exists = true;
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
if (!(err instanceof QdrantNotFoundError))
|
|
220
|
+
throw err;
|
|
221
|
+
}
|
|
222
|
+
if (!exists) {
|
|
223
|
+
await this.request("PUT", `/collections/${col}`, {
|
|
224
|
+
vectors: { size: vectorSize, distance: "Cosine" },
|
|
225
|
+
});
|
|
226
|
+
this.log("INFO", `Qdrant collection '${col}' created (vector size ${vectorSize})`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
this.log("DEBUG", `Qdrant collection '${col}' already exists`);
|
|
230
|
+
}
|
|
231
|
+
for (const idx of indexes) {
|
|
232
|
+
try {
|
|
233
|
+
await this.request("PUT", `/collections/${col}/index`, idx);
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
// Index already-exists / harmless conflicts surface as 4xx — log and continue.
|
|
237
|
+
this.log("WARN", `Qdrant index ${idx.field_name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=qdrant-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-client.js","sourceRoot":"","sources":["../../src/lib/qdrant-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-client.test.d.ts","sourceRoot":"","sources":["../../src/lib/qdrant-client.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the shared QdrantClient.
|
|
3
|
+
*
|
|
4
|
+
* No real network — `globalThis.fetch` is monkey-patched per test to return
|
|
5
|
+
* scripted responses or throw scripted errors.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, afterEach } from "node:test";
|
|
8
|
+
import assert from "node:assert/strict";
|
|
9
|
+
import { QdrantClient, QdrantAuthError, QdrantBadRequestError, QdrantNotFoundError, QdrantRateLimitError, QdrantTransientError, } from "./qdrant-client.js";
|
|
10
|
+
const buildResponse = (step) => {
|
|
11
|
+
const body = step.body ?? "";
|
|
12
|
+
return new Response(body, { status: step.status, headers: step.headers });
|
|
13
|
+
};
|
|
14
|
+
const installFetchMock = (steps) => {
|
|
15
|
+
const original = globalThis.fetch;
|
|
16
|
+
const calls = [];
|
|
17
|
+
let i = 0;
|
|
18
|
+
globalThis.fetch = (async (input, init) => {
|
|
19
|
+
calls.push({ url: String(input), init });
|
|
20
|
+
const step = steps[i++];
|
|
21
|
+
if (!step)
|
|
22
|
+
throw new Error(`fetch mock exhausted after ${i} call(s)`);
|
|
23
|
+
if ("error" in step)
|
|
24
|
+
throw step.error;
|
|
25
|
+
return buildResponse(step);
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
calls,
|
|
29
|
+
restore: () => {
|
|
30
|
+
globalThis.fetch = original;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
const baseOpts = {
|
|
35
|
+
url: "https://example.qdrant.io",
|
|
36
|
+
apiKey: "test-key",
|
|
37
|
+
collection: "bikky-test",
|
|
38
|
+
retryBaseDelayMs: 1, // keep tests fast
|
|
39
|
+
};
|
|
40
|
+
describe("QdrantClient", () => {
|
|
41
|
+
let mock = null;
|
|
42
|
+
afterEach(() => {
|
|
43
|
+
if (mock) {
|
|
44
|
+
mock.restore();
|
|
45
|
+
mock = null;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
describe("request — happy path", () => {
|
|
49
|
+
it("parses JSON success response and sends api-key header", async () => {
|
|
50
|
+
mock = installFetchMock([{ status: 200, body: JSON.stringify({ result: { ok: true } }) }]);
|
|
51
|
+
const client = new QdrantClient(baseOpts);
|
|
52
|
+
const out = await client.request("GET", "/collections");
|
|
53
|
+
assert.deepEqual(out, { result: { ok: true } });
|
|
54
|
+
assert.equal(mock.calls.length, 1);
|
|
55
|
+
assert.equal(mock.calls[0].url, "https://example.qdrant.io/collections");
|
|
56
|
+
const headers = mock.calls[0].init?.headers;
|
|
57
|
+
assert.equal(headers["api-key"], "test-key");
|
|
58
|
+
assert.equal(headers["Content-Type"], "application/json");
|
|
59
|
+
});
|
|
60
|
+
it("strips trailing slashes from the configured URL", async () => {
|
|
61
|
+
mock = installFetchMock([{ status: 200, body: "{}" }]);
|
|
62
|
+
const client = new QdrantClient({ ...baseOpts, url: "https://example.qdrant.io///" });
|
|
63
|
+
await client.request("GET", "/collections");
|
|
64
|
+
assert.equal(mock.calls[0].url, "https://example.qdrant.io/collections");
|
|
65
|
+
});
|
|
66
|
+
it("returns undefined for empty success bodies", async () => {
|
|
67
|
+
mock = installFetchMock([{ status: 200, body: "" }]);
|
|
68
|
+
const client = new QdrantClient(baseOpts);
|
|
69
|
+
const out = await client.request("GET", "/collections/foo");
|
|
70
|
+
assert.equal(out, undefined);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("error classification", () => {
|
|
74
|
+
it("401 → QdrantAuthError, no retry", async () => {
|
|
75
|
+
mock = installFetchMock([{ status: 401, body: "unauthorized" }]);
|
|
76
|
+
const client = new QdrantClient(baseOpts);
|
|
77
|
+
await assert.rejects(() => client.request("GET", "/collections"), QdrantAuthError);
|
|
78
|
+
assert.equal(mock.calls.length, 1);
|
|
79
|
+
});
|
|
80
|
+
it("404 → QdrantNotFoundError, no retry", async () => {
|
|
81
|
+
mock = installFetchMock([{ status: 404, body: "not found" }]);
|
|
82
|
+
const client = new QdrantClient(baseOpts);
|
|
83
|
+
await assert.rejects(() => client.request("GET", "/collections/missing"), QdrantNotFoundError);
|
|
84
|
+
assert.equal(mock.calls.length, 1);
|
|
85
|
+
});
|
|
86
|
+
it("400 → QdrantBadRequestError, no retry", async () => {
|
|
87
|
+
mock = installFetchMock([{ status: 400, body: "bad request" }]);
|
|
88
|
+
const client = new QdrantClient(baseOpts);
|
|
89
|
+
await assert.rejects(() => client.request("PUT", "/collections/foo", {}), QdrantBadRequestError);
|
|
90
|
+
assert.equal(mock.calls.length, 1);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe("retry on transient errors", () => {
|
|
94
|
+
it("retries 503 then succeeds", async () => {
|
|
95
|
+
mock = installFetchMock([
|
|
96
|
+
{ status: 503, body: "service unavailable" },
|
|
97
|
+
{ status: 200, body: JSON.stringify({ ok: true }) },
|
|
98
|
+
]);
|
|
99
|
+
const client = new QdrantClient(baseOpts);
|
|
100
|
+
const out = await client.request("POST", "/collections/foo/points/search");
|
|
101
|
+
assert.deepEqual(out, { ok: true });
|
|
102
|
+
assert.equal(mock.calls.length, 2);
|
|
103
|
+
});
|
|
104
|
+
it("retries network failure (TypeError) then succeeds", async () => {
|
|
105
|
+
mock = installFetchMock([
|
|
106
|
+
{ error: new TypeError("network down") },
|
|
107
|
+
{ status: 200, body: "{}" },
|
|
108
|
+
]);
|
|
109
|
+
const client = new QdrantClient(baseOpts);
|
|
110
|
+
await client.request("GET", "/collections");
|
|
111
|
+
assert.equal(mock.calls.length, 2);
|
|
112
|
+
});
|
|
113
|
+
it("exhausts retries and throws QdrantTransientError", async () => {
|
|
114
|
+
mock = installFetchMock([
|
|
115
|
+
{ status: 502, body: "bad gateway" },
|
|
116
|
+
{ status: 502, body: "bad gateway" },
|
|
117
|
+
{ status: 502, body: "bad gateway" },
|
|
118
|
+
{ status: 502, body: "bad gateway" },
|
|
119
|
+
]);
|
|
120
|
+
const client = new QdrantClient({ ...baseOpts, retries: 3 });
|
|
121
|
+
await assert.rejects(() => client.request("GET", "/collections"), QdrantTransientError);
|
|
122
|
+
assert.equal(mock.calls.length, 4); // initial + 3 retries
|
|
123
|
+
});
|
|
124
|
+
it("does not retry when retries=0", async () => {
|
|
125
|
+
mock = installFetchMock([{ status: 503, body: "" }]);
|
|
126
|
+
const client = new QdrantClient({ ...baseOpts, retries: 0 });
|
|
127
|
+
await assert.rejects(() => client.request("GET", "/collections"), QdrantTransientError);
|
|
128
|
+
assert.equal(mock.calls.length, 1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
describe("rate limiting", () => {
|
|
132
|
+
it("retries 429 then succeeds", async () => {
|
|
133
|
+
mock = installFetchMock([
|
|
134
|
+
{ status: 429, body: "slow down", headers: { "retry-after": "0" } },
|
|
135
|
+
{ status: 200, body: "{}" },
|
|
136
|
+
]);
|
|
137
|
+
const client = new QdrantClient(baseOpts);
|
|
138
|
+
await client.request("POST", "/collections/foo/points");
|
|
139
|
+
assert.equal(mock.calls.length, 2);
|
|
140
|
+
});
|
|
141
|
+
it("attaches retryAfterMs from Retry-After header", async () => {
|
|
142
|
+
mock = installFetchMock([{ status: 429, body: "", headers: { "retry-after": "2" } }]);
|
|
143
|
+
const client = new QdrantClient({ ...baseOpts, retries: 0 });
|
|
144
|
+
try {
|
|
145
|
+
await client.request("GET", "/collections");
|
|
146
|
+
assert.fail("should have thrown");
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
assert.ok(err instanceof QdrantRateLimitError);
|
|
150
|
+
assert.equal(err.retryAfterMs, 2000);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe("timeout", () => {
|
|
155
|
+
it("aborted fetch surfaces as QdrantTransientError", async () => {
|
|
156
|
+
const abortErr = new Error("The operation was aborted");
|
|
157
|
+
abortErr.name = "TimeoutError";
|
|
158
|
+
mock = installFetchMock([{ error: abortErr }, { error: abortErr }]);
|
|
159
|
+
const client = new QdrantClient({ ...baseOpts, retries: 1, timeoutMs: 1 });
|
|
160
|
+
await assert.rejects(() => client.request("GET", "/collections"), QdrantTransientError);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe("ensureCollection", () => {
|
|
164
|
+
it("creates collection when GET returns 404", async () => {
|
|
165
|
+
mock = installFetchMock([
|
|
166
|
+
{ status: 404, body: "not found" }, // GET /collections/foo
|
|
167
|
+
{ status: 200, body: "{}" }, // PUT /collections/foo
|
|
168
|
+
{ status: 200, body: "{}" }, // PUT index 1
|
|
169
|
+
]);
|
|
170
|
+
const client = new QdrantClient(baseOpts);
|
|
171
|
+
await client.ensureCollection(1024, [{ field_name: "category", field_schema: "keyword" }]);
|
|
172
|
+
assert.equal(mock.calls.length, 3);
|
|
173
|
+
assert.equal(mock.calls[1].init?.method, "PUT");
|
|
174
|
+
const putBody = JSON.parse(mock.calls[1].init?.body);
|
|
175
|
+
assert.deepEqual(putBody, { vectors: { size: 1024, distance: "Cosine" } });
|
|
176
|
+
});
|
|
177
|
+
it("skips creation when collection already exists", async () => {
|
|
178
|
+
mock = installFetchMock([
|
|
179
|
+
{ status: 200, body: "{}" }, // GET succeeds
|
|
180
|
+
{ status: 200, body: "{}" }, // PUT index
|
|
181
|
+
]);
|
|
182
|
+
const client = new QdrantClient(baseOpts);
|
|
183
|
+
await client.ensureCollection(1024, [{ field_name: "category", field_schema: "keyword" }]);
|
|
184
|
+
assert.equal(mock.calls.length, 2);
|
|
185
|
+
});
|
|
186
|
+
it("swallows index creation failures", async () => {
|
|
187
|
+
mock = installFetchMock([
|
|
188
|
+
{ status: 200, body: "{}" }, // GET
|
|
189
|
+
{ status: 400, body: "index already exists" }, // PUT index — error swallowed
|
|
190
|
+
]);
|
|
191
|
+
const client = new QdrantClient(baseOpts);
|
|
192
|
+
await client.ensureCollection(1024, [{ field_name: "category", field_schema: "keyword" }]);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe("constructor validation", () => {
|
|
196
|
+
it("rejects empty url", () => {
|
|
197
|
+
assert.throws(() => new QdrantClient({ ...baseOpts, url: "" }), /url is required/);
|
|
198
|
+
});
|
|
199
|
+
it("rejects empty apiKey", () => {
|
|
200
|
+
assert.throws(() => new QdrantClient({ ...baseOpts, apiKey: "" }), /apiKey is required/);
|
|
201
|
+
});
|
|
202
|
+
it("rejects empty collection", () => {
|
|
203
|
+
assert.throws(() => new QdrantClient({ ...baseOpts, collection: "" }), /collection is required/);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
//# sourceMappingURL=qdrant-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-client.test.js","sourceRoot":"","sources":["../../src/lib/qdrant-client.test.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AAC5H,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAA2B,MAAM,iBAAiB,CAAC;AAC5H,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAU5E,eAAO,MAAM,UAAU,QAAY,CAAC;AAGpC,wBAAgB,aAAa,IAAI,MAAM,CAA2B;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGhD;AAWD,eAAO,IAAI,SAAS,EAAE,MAAM,GAAG,IAAW,CAAC;AAC3C,eAAO,IAAI,YAAY,EAAE,MAAM,GAAG,IAAW,CAAC;AAC9C,eAAO,IAAI,KAAK,SAAQ,CAAC;AAIzB,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGnD;AACD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAGtD;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAe;AAMzD,eAAO,MAAM,GAAG,8BAGd,CAAC;AA0BH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6B5F;AAgBD,wBAAsB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAE9F;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlH;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAInH;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAO7H;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAMhG;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAKxG;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAK7E"}
|
package/dist/mcp/api.js
CHANGED
|
@@ -8,13 +8,17 @@ import { embed, getEmbeddingDimensions, getEmbeddingConfig, initEmbedding, chatC
|
|
|
8
8
|
export { embed, getEmbeddingDimensions, getEmbeddingConfig, initEmbedding };
|
|
9
9
|
import { createLogger } from "../logger.js";
|
|
10
10
|
import { BIKKY_DIR, LOG_DIR, loadConfig } from "../config.js";
|
|
11
|
+
import { QdrantClient } from "../lib/qdrant-client.js";
|
|
11
12
|
// ---------------------------------------------------------------------------
|
|
12
13
|
// Config
|
|
13
14
|
// ---------------------------------------------------------------------------
|
|
14
15
|
export const MEMORY_DIR = BIKKY_DIR;
|
|
15
16
|
let collectionName = "bikky";
|
|
16
17
|
export function getCollection() { return collectionName; }
|
|
17
|
-
export function setCollection(name) {
|
|
18
|
+
export function setCollection(name) {
|
|
19
|
+
collectionName = name;
|
|
20
|
+
rebuildClient();
|
|
21
|
+
}
|
|
18
22
|
fs.mkdirSync(MEMORY_DIR, { recursive: true });
|
|
19
23
|
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
20
24
|
let llmInitialized = false;
|
|
@@ -24,8 +28,15 @@ let llmInitialized = false;
|
|
|
24
28
|
export let qdrantUrl = null;
|
|
25
29
|
export let qdrantApiKey = null;
|
|
26
30
|
export let ready = false;
|
|
27
|
-
|
|
28
|
-
export function
|
|
31
|
+
let client = null;
|
|
32
|
+
export function setQdrantUrl(v) {
|
|
33
|
+
qdrantUrl = v ? v.replace(/\/+$/, "") : v;
|
|
34
|
+
rebuildClient();
|
|
35
|
+
}
|
|
36
|
+
export function setQdrantApiKey(v) {
|
|
37
|
+
qdrantApiKey = v;
|
|
38
|
+
rebuildClient();
|
|
39
|
+
}
|
|
29
40
|
export function setReady(v) { ready = v; }
|
|
30
41
|
// ---------------------------------------------------------------------------
|
|
31
42
|
// Logging (to file only — stdout/stderr are MCP stdio transport)
|
|
@@ -34,6 +45,25 @@ export const log = createLogger("memory-mcp", path.join(LOG_DIR, "mcp.log"), {
|
|
|
34
45
|
maxSize: 2 * 1024 * 1024,
|
|
35
46
|
maxFiles: 3,
|
|
36
47
|
});
|
|
48
|
+
// Adapter to bridge QdrantClient's QdrantLogFn signature to our file logger.
|
|
49
|
+
const qdrantLogAdapter = (level, msg) => log(level, msg);
|
|
50
|
+
function rebuildClient() {
|
|
51
|
+
if (qdrantUrl && qdrantApiKey && collectionName) {
|
|
52
|
+
const cfg = loadConfig();
|
|
53
|
+
client = new QdrantClient({
|
|
54
|
+
url: qdrantUrl,
|
|
55
|
+
apiKey: qdrantApiKey,
|
|
56
|
+
collection: collectionName,
|
|
57
|
+
timeoutMs: cfg.qdrant_client.timeout_ms,
|
|
58
|
+
retries: cfg.qdrant_client.retries,
|
|
59
|
+
retryBaseDelayMs: cfg.qdrant_client.retry_base_delay_ms,
|
|
60
|
+
log: qdrantLogAdapter,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
client = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
37
67
|
// ---------------------------------------------------------------------------
|
|
38
68
|
// LLM Chat Completion (for distillation)
|
|
39
69
|
// ---------------------------------------------------------------------------
|
|
@@ -69,51 +99,19 @@ export async function chatComplete(systemPrompt, userPrompt) {
|
|
|
69
99
|
// ---------------------------------------------------------------------------
|
|
70
100
|
// Qdrant REST Client
|
|
71
101
|
// ---------------------------------------------------------------------------
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
}
|
|
102
|
+
function getClient() {
|
|
103
|
+
if (!client) {
|
|
104
|
+
throw new Error("Qdrant client not initialized — credentials missing. " +
|
|
105
|
+
"Use configure_credentials or set QDRANT_URL + QDRANT_API_KEY.");
|
|
106
|
+
}
|
|
107
|
+
return client;
|
|
77
108
|
}
|
|
78
109
|
export async function qdrantReq(method, urlPath, body) {
|
|
79
|
-
|
|
80
|
-
const opts = { method, headers: qdrantHeaders() };
|
|
81
|
-
if (body)
|
|
82
|
-
opts.body = JSON.stringify(body);
|
|
83
|
-
const resp = await fetch(url, opts);
|
|
84
|
-
if (!resp.ok) {
|
|
85
|
-
const text = await resp.text();
|
|
86
|
-
throw new Error(`Qdrant ${method} ${urlPath} failed (${resp.status}): ${text}`);
|
|
87
|
-
}
|
|
88
|
-
return resp.json();
|
|
110
|
+
return getClient().request(method, urlPath, body);
|
|
89
111
|
}
|
|
90
112
|
export async function ensureCollection(indexes) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
await qdrantReq("GET", `/collections/${col}`);
|
|
95
|
-
log("INFO", `Collection '${col}' exists ✓`);
|
|
96
|
-
exists = true;
|
|
97
|
-
}
|
|
98
|
-
catch (e) {
|
|
99
|
-
if (!(e instanceof Error && e.message.includes("404")))
|
|
100
|
-
throw e;
|
|
101
|
-
}
|
|
102
|
-
if (!exists) {
|
|
103
|
-
await qdrantReq("PUT", `/collections/${col}`, {
|
|
104
|
-
vectors: { size: getEmbeddingDimensions(), distance: "Cosine" },
|
|
105
|
-
});
|
|
106
|
-
log("INFO", `Collection '${col}' created`);
|
|
107
|
-
}
|
|
108
|
-
for (const idx of indexes) {
|
|
109
|
-
try {
|
|
110
|
-
await qdrantReq("PUT", `/collections/${col}/index`, idx);
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
log("WARN", `Index creation for ${idx.field_name}: ${e instanceof Error ? e.message : String(e)}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
log("INFO", "Payload indexes created");
|
|
113
|
+
await getClient().ensureCollection(getEmbeddingDimensions(), indexes);
|
|
114
|
+
log("INFO", `Collection '${getCollection()}' ready (vector size ${getEmbeddingDimensions()}, ${indexes.length} indexes)`);
|
|
117
115
|
}
|
|
118
116
|
export async function qdrantUpsert(id, vector, payload) {
|
|
119
117
|
return qdrantReq("PUT", `/collections/${getCollection()}/points`, {
|
package/dist/mcp/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE5H,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"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"}
|