bikky 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +323 -0
  3. package/bin/bikky.js +6 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +51 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +59 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +141 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/config.test.d.ts +8 -0
  13. package/dist/config.test.d.ts.map +1 -0
  14. package/dist/config.test.js +449 -0
  15. package/dist/config.test.js.map +1 -0
  16. package/dist/daemon/consolidation.d.ts +60 -0
  17. package/dist/daemon/consolidation.d.ts.map +1 -0
  18. package/dist/daemon/consolidation.js +448 -0
  19. package/dist/daemon/consolidation.js.map +1 -0
  20. package/dist/daemon/extraction.d.ts +17 -0
  21. package/dist/daemon/extraction.d.ts.map +1 -0
  22. package/dist/daemon/extraction.js +465 -0
  23. package/dist/daemon/extraction.js.map +1 -0
  24. package/dist/daemon/index.d.ts +3 -0
  25. package/dist/daemon/index.d.ts.map +1 -0
  26. package/dist/daemon/index.js +3 -0
  27. package/dist/daemon/index.js.map +1 -0
  28. package/dist/daemon/loop.d.ts +3 -0
  29. package/dist/daemon/loop.d.ts.map +1 -0
  30. package/dist/daemon/loop.js +93 -0
  31. package/dist/daemon/loop.js.map +1 -0
  32. package/dist/daemon/qdrant.d.ts +103 -0
  33. package/dist/daemon/qdrant.d.ts.map +1 -0
  34. package/dist/daemon/qdrant.js +273 -0
  35. package/dist/daemon/qdrant.js.map +1 -0
  36. package/dist/daemon/qdrant.test.d.ts +8 -0
  37. package/dist/daemon/qdrant.test.d.ts.map +1 -0
  38. package/dist/daemon/qdrant.test.js +209 -0
  39. package/dist/daemon/qdrant.test.js.map +1 -0
  40. package/dist/daemon/relations.d.ts +54 -0
  41. package/dist/daemon/relations.d.ts.map +1 -0
  42. package/dist/daemon/relations.js +290 -0
  43. package/dist/daemon/relations.js.map +1 -0
  44. package/dist/daemon/staleness.d.ts +24 -0
  45. package/dist/daemon/staleness.d.ts.map +1 -0
  46. package/dist/daemon/staleness.js +63 -0
  47. package/dist/daemon/staleness.js.map +1 -0
  48. package/dist/daemon/watcher.d.ts +11 -0
  49. package/dist/daemon/watcher.d.ts.map +1 -0
  50. package/dist/daemon/watcher.js +38 -0
  51. package/dist/daemon/watcher.js.map +1 -0
  52. package/dist/daemon/watcher.test.d.ts +8 -0
  53. package/dist/daemon/watcher.test.d.ts.map +1 -0
  54. package/dist/daemon/watcher.test.js +214 -0
  55. package/dist/daemon/watcher.test.js.map +1 -0
  56. package/dist/install.d.ts +5 -0
  57. package/dist/install.d.ts.map +1 -0
  58. package/dist/install.js +49 -0
  59. package/dist/install.js.map +1 -0
  60. package/dist/install.test.d.ts +9 -0
  61. package/dist/install.test.d.ts.map +1 -0
  62. package/dist/install.test.js +126 -0
  63. package/dist/install.test.js.map +1 -0
  64. package/dist/llm/embedding.d.ts +13 -0
  65. package/dist/llm/embedding.d.ts.map +1 -0
  66. package/dist/llm/embedding.js +127 -0
  67. package/dist/llm/embedding.js.map +1 -0
  68. package/dist/llm/embedding.test.d.ts +8 -0
  69. package/dist/llm/embedding.test.d.ts.map +1 -0
  70. package/dist/llm/embedding.test.js +117 -0
  71. package/dist/llm/embedding.test.js.map +1 -0
  72. package/dist/llm/index.d.ts +4 -0
  73. package/dist/llm/index.d.ts.map +1 -0
  74. package/dist/llm/index.js +3 -0
  75. package/dist/llm/index.js.map +1 -0
  76. package/dist/llm/inference.d.ts +12 -0
  77. package/dist/llm/inference.d.ts.map +1 -0
  78. package/dist/llm/inference.js +146 -0
  79. package/dist/llm/inference.js.map +1 -0
  80. package/dist/llm/inference.test.d.ts +8 -0
  81. package/dist/llm/inference.test.d.ts.map +1 -0
  82. package/dist/llm/inference.test.js +117 -0
  83. package/dist/llm/inference.test.js.map +1 -0
  84. package/dist/llm/types.d.ts +41 -0
  85. package/dist/llm/types.d.ts.map +1 -0
  86. package/dist/llm/types.js +5 -0
  87. package/dist/llm/types.js.map +1 -0
  88. package/dist/logger.d.ts +13 -0
  89. package/dist/logger.d.ts.map +1 -0
  90. package/dist/logger.js +41 -0
  91. package/dist/logger.js.map +1 -0
  92. package/dist/mcp/api.d.ts +30 -0
  93. package/dist/mcp/api.d.ts.map +1 -0
  94. package/dist/mcp/api.js +150 -0
  95. package/dist/mcp/api.js.map +1 -0
  96. package/dist/mcp/helpers.d.ts +35 -0
  97. package/dist/mcp/helpers.d.ts.map +1 -0
  98. package/dist/mcp/helpers.js +152 -0
  99. package/dist/mcp/helpers.js.map +1 -0
  100. package/dist/mcp/helpers.test.d.ts +5 -0
  101. package/dist/mcp/helpers.test.d.ts.map +1 -0
  102. package/dist/mcp/helpers.test.js +487 -0
  103. package/dist/mcp/helpers.test.js.map +1 -0
  104. package/dist/mcp/index.d.ts +9 -0
  105. package/dist/mcp/index.d.ts.map +1 -0
  106. package/dist/mcp/index.js +67 -0
  107. package/dist/mcp/index.js.map +1 -0
  108. package/dist/mcp/taxonomy.d.ts +38 -0
  109. package/dist/mcp/taxonomy.d.ts.map +1 -0
  110. package/dist/mcp/taxonomy.js +223 -0
  111. package/dist/mcp/taxonomy.js.map +1 -0
  112. package/dist/mcp/taxonomy.test.d.ts +5 -0
  113. package/dist/mcp/taxonomy.test.d.ts.map +1 -0
  114. package/dist/mcp/taxonomy.test.js +341 -0
  115. package/dist/mcp/taxonomy.test.js.map +1 -0
  116. package/dist/mcp/tools.d.ts +6 -0
  117. package/dist/mcp/tools.d.ts.map +1 -0
  118. package/dist/mcp/tools.js +958 -0
  119. package/dist/mcp/tools.js.map +1 -0
  120. package/dist/mcp/types.d.ts +118 -0
  121. package/dist/mcp/types.d.ts.map +1 -0
  122. package/dist/mcp/types.js +5 -0
  123. package/dist/mcp/types.js.map +1 -0
  124. package/package.json +56 -0
@@ -0,0 +1,150 @@
1
+ /**
2
+ * External API helpers — Qdrant REST client, LLM chat, logging.
3
+ * Credentials come from config (~/.bikky/config.json) or env vars.
4
+ */
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import { embed, getEmbeddingDimensions, getEmbeddingConfig, initEmbedding, chatCompletion, initLLM } from "../llm/index.js";
8
+ export { embed, getEmbeddingDimensions, getEmbeddingConfig, initEmbedding };
9
+ import { createLogger } from "../logger.js";
10
+ import { BIKKY_DIR, LOG_DIR, loadConfig } from "../config.js";
11
+ // ---------------------------------------------------------------------------
12
+ // Config
13
+ // ---------------------------------------------------------------------------
14
+ export const MEMORY_DIR = BIKKY_DIR;
15
+ let collectionName = "bikky";
16
+ export function getCollection() { return collectionName; }
17
+ export function setCollection(name) { collectionName = name; }
18
+ fs.mkdirSync(MEMORY_DIR, { recursive: true });
19
+ fs.mkdirSync(LOG_DIR, { recursive: true });
20
+ let llmInitialized = false;
21
+ // ---------------------------------------------------------------------------
22
+ // Runtime state — populated at startup
23
+ // ---------------------------------------------------------------------------
24
+ export let qdrantUrl = null;
25
+ export let qdrantApiKey = null;
26
+ export let ready = false;
27
+ export function setQdrantUrl(v) { qdrantUrl = v; }
28
+ export function setQdrantApiKey(v) { qdrantApiKey = v; }
29
+ export function setReady(v) { ready = v; }
30
+ // ---------------------------------------------------------------------------
31
+ // Logging (to file only — stdout/stderr are MCP stdio transport)
32
+ // ---------------------------------------------------------------------------
33
+ export const log = createLogger("memory-mcp", path.join(LOG_DIR, "mcp.log"), {
34
+ maxSize: 2 * 1024 * 1024,
35
+ maxFiles: 3,
36
+ });
37
+ // ---------------------------------------------------------------------------
38
+ // LLM Chat Completion (for distillation)
39
+ // ---------------------------------------------------------------------------
40
+ export async function chatComplete(systemPrompt, userPrompt) {
41
+ if (!llmInitialized) {
42
+ const cfg = loadConfig();
43
+ initLLM({
44
+ config: {
45
+ provider: cfg.llm.provider,
46
+ ollama_url: cfg.llm.base_url,
47
+ ollama_model: cfg.llm.model,
48
+ openai_api_key: cfg.llm.api_key ?? null,
49
+ openai_model: cfg.llm.model,
50
+ bedrock_region: cfg.llm.bedrock_region,
51
+ bedrock_model: cfg.llm.model,
52
+ },
53
+ logger: log,
54
+ });
55
+ llmInitialized = true;
56
+ }
57
+ const result = await chatCompletion({
58
+ messages: [
59
+ { role: "system", content: systemPrompt },
60
+ { role: "user", content: userPrompt },
61
+ ],
62
+ max_tokens: 1000,
63
+ temperature: 0.3,
64
+ });
65
+ if (!result)
66
+ throw new Error("LLM chat completion failed");
67
+ return result;
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Qdrant REST Client
71
+ // ---------------------------------------------------------------------------
72
+ function qdrantHeaders() {
73
+ return {
74
+ "Content-Type": "application/json",
75
+ "api-key": qdrantApiKey ?? "",
76
+ };
77
+ }
78
+ export async function qdrantReq(method, urlPath, body) {
79
+ const url = `${qdrantUrl}${urlPath}`;
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();
89
+ }
90
+ export async function ensureCollection(indexes) {
91
+ const col = getCollection();
92
+ let exists = false;
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");
117
+ }
118
+ export async function qdrantUpsert(id, vector, payload) {
119
+ return qdrantReq("PUT", `/collections/${getCollection()}/points`, {
120
+ points: [{ id, vector, payload }],
121
+ });
122
+ }
123
+ export async function qdrantSearch(vector, filter, limit = 5) {
124
+ return qdrantReq("POST", `/collections/${getCollection()}/points/search`, {
125
+ vector,
126
+ filter: filter ?? undefined,
127
+ limit,
128
+ with_payload: true,
129
+ });
130
+ }
131
+ export async function qdrantScroll(filter, limit = 10) {
132
+ return qdrantReq("POST", `/collections/${getCollection()}/points/scroll`, {
133
+ filter,
134
+ limit,
135
+ with_payload: true,
136
+ });
137
+ }
138
+ export async function qdrantSetPayload(ids, payload) {
139
+ return qdrantReq("POST", `/collections/${getCollection()}/points/payload`, {
140
+ points: ids,
141
+ payload,
142
+ });
143
+ }
144
+ export async function qdrantGetPoints(ids) {
145
+ return qdrantReq("POST", `/collections/${getCollection()}/points`, {
146
+ ids,
147
+ with_payload: true,
148
+ });
149
+ }
150
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/mcp/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Pure helper functions for the Memory MCP server.
3
+ *
4
+ * Every function here is pure (or depends only on its inputs + Date.now()).
5
+ */
6
+ import type { FactPayload, FilterParams, QdrantFilter, QdrantPoint } from "./types.js";
7
+ export declare function contentHash(category: string, content: string): string;
8
+ /** Days between an ISO timestamp and now. Returns Infinity for null/undefined. */
9
+ export declare function daysSince(isoTimestamp: string | undefined | null): number;
10
+ /** The most recent "activity" timestamp for a fact (verified > reinforced > created). */
11
+ export declare function lastActivityDate(payload: FactPayload): string | undefined;
12
+ /**
13
+ * Compute effective confidence using exponential decay.
14
+ * Categories with null half-life (session_summary, distilled) don't decay.
15
+ */
16
+ export declare function computeEffectiveConfidence(payload: FactPayload): number;
17
+ /**
18
+ * Freshness score for recall re-ranking.
19
+ * 1.0 for facts < 7 days old, linear decay to 0.3 at 180 days, floor at 0.3.
20
+ */
21
+ export declare function computeFreshnessScore(payload: FactPayload): number;
22
+ /** Reinforcement score: min(reinforcement_count / 5, 1.0). */
23
+ export declare function computeReinforcementScore(payload: FactPayload): number;
24
+ /**
25
+ * Combined re-ranking score for recall results.
26
+ * Blends vector similarity with freshness, reinforcement, importance, and confidence decay.
27
+ */
28
+ export declare function computeCombinedScore(point: QdrantPoint): number;
29
+ /** Check if a fact is stale (old + not recently reinforced/verified). */
30
+ export declare function isStale(payload: FactPayload): boolean;
31
+ /** Build a Qdrant filter object from optional params. */
32
+ export declare function buildFilter(params?: FilterParams): QdrantFilter | undefined;
33
+ /** Format a Qdrant point into a human-readable fact string. */
34
+ export declare function formatFact(point: QdrantPoint): string;
35
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOvF,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrE;AAMD,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAGzE;AAED,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAEzE;AAMD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAOvE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAKlE;AAED,8DAA8D;AAC9D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAEtE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAO/D;AAED,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAErD;AAMD,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,MAAM,GAAE,YAAiB,GAAG,YAAY,GAAG,SAAS,CAgC/E;AAMD,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAyBrD"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Pure helper functions for the Memory MCP server.
3
+ *
4
+ * Every function here is pure (or depends only on its inputs + Date.now()).
5
+ */
6
+ import crypto from "node:crypto";
7
+ import { DECAY_HALF_LIFE, DECAY_DEFAULT_HALF_LIFE, STALENESS_DAYS } from "./taxonomy.js";
8
+ // ---------------------------------------------------------------------------
9
+ // Hashing
10
+ // ---------------------------------------------------------------------------
11
+ export function contentHash(category, content) {
12
+ const normalized = `${category}:${content.toLowerCase().trim().replace(/\s+/g, " ")}`;
13
+ return crypto.createHash("sha256").update(normalized).digest("hex");
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Time helpers
17
+ // ---------------------------------------------------------------------------
18
+ /** Days between an ISO timestamp and now. Returns Infinity for null/undefined. */
19
+ export function daysSince(isoTimestamp) {
20
+ if (!isoTimestamp)
21
+ return Infinity;
22
+ return Math.max(0, (Date.now() - new Date(isoTimestamp).getTime()) / 86400000);
23
+ }
24
+ /** The most recent "activity" timestamp for a fact (verified > reinforced > created). */
25
+ export function lastActivityDate(payload) {
26
+ return payload.last_verified_at ?? payload.last_reinforced_at ?? payload.created_at;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Scoring functions (all computed at read time, never mutate stored data)
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Compute effective confidence using exponential decay.
33
+ * Categories with null half-life (session_summary, distilled) don't decay.
34
+ */
35
+ export function computeEffectiveConfidence(payload) {
36
+ const cat = payload.category;
37
+ const halfLife = cat in DECAY_HALF_LIFE ? DECAY_HALF_LIFE[cat] : DECAY_DEFAULT_HALF_LIFE;
38
+ if (halfLife === null || halfLife === undefined)
39
+ return payload.confidence;
40
+ const days = daysSince(lastActivityDate(payload));
41
+ const decayFactor = Math.pow(0.5, days / halfLife);
42
+ return Math.round(payload.confidence * decayFactor * 100) / 100;
43
+ }
44
+ /**
45
+ * Freshness score for recall re-ranking.
46
+ * 1.0 for facts < 7 days old, linear decay to 0.3 at 180 days, floor at 0.3.
47
+ */
48
+ export function computeFreshnessScore(payload) {
49
+ const days = daysSince(lastActivityDate(payload));
50
+ if (days <= 7)
51
+ return 1.0;
52
+ if (days >= 180)
53
+ return 0.3;
54
+ return 1.0 - (days - 7) * (0.7 / 173);
55
+ }
56
+ /** Reinforcement score: min(reinforcement_count / 5, 1.0). */
57
+ export function computeReinforcementScore(payload) {
58
+ return Math.min((payload.reinforcement_count || 1) / 5, 1.0);
59
+ }
60
+ /**
61
+ * Combined re-ranking score for recall results.
62
+ * Blends vector similarity with freshness, reinforcement, importance, and confidence decay.
63
+ */
64
+ export function computeCombinedScore(point) {
65
+ const vectorScore = point.score ?? 0;
66
+ const freshness = computeFreshnessScore(point.payload);
67
+ const reinforcement = computeReinforcementScore(point.payload);
68
+ const importance = point.payload.importance ?? 0.5;
69
+ const confidenceDecay = computeEffectiveConfidence(point.payload) / Math.max(point.payload.confidence, 0.01);
70
+ return (vectorScore * 0.55 + freshness * 0.15 + reinforcement * 0.1 + importance * 0.1) * (0.7 + 0.3 * confidenceDecay);
71
+ }
72
+ /** Check if a fact is stale (old + not recently reinforced/verified). */
73
+ export function isStale(payload) {
74
+ return daysSince(lastActivityDate(payload)) > STALENESS_DAYS;
75
+ }
76
+ // ---------------------------------------------------------------------------
77
+ // Filter building
78
+ // ---------------------------------------------------------------------------
79
+ /** Build a Qdrant filter object from optional params. */
80
+ export function buildFilter(params = {}) {
81
+ const { category, domain, kind, entity, since, until, excludeSuperseded = true, metadata } = params;
82
+ const must = [];
83
+ if (excludeSuperseded) {
84
+ must.push({ is_null: { key: "superseded_by" } });
85
+ }
86
+ if (category) {
87
+ must.push({ key: "category", match: { value: category } });
88
+ }
89
+ if (domain) {
90
+ must.push({ key: "domain", match: { value: domain } });
91
+ }
92
+ if (kind) {
93
+ must.push({ key: "kind", match: { value: kind } });
94
+ }
95
+ if (entity) {
96
+ must.push({ key: "entities", match: { value: entity.toLowerCase() } });
97
+ }
98
+ if (since && until) {
99
+ must.push({ key: "created_at", range: { gte: since, lte: until } });
100
+ }
101
+ else if (since) {
102
+ must.push({ key: "created_at", range: { gte: since } });
103
+ }
104
+ else if (until) {
105
+ must.push({ key: "created_at", range: { lte: until } });
106
+ }
107
+ if (metadata && typeof metadata === "object") {
108
+ for (const [k, v] of Object.entries(metadata)) {
109
+ must.push({ key: `metadata.${k}`, match: { value: v } });
110
+ }
111
+ }
112
+ return must.length > 0 ? { must } : undefined;
113
+ }
114
+ // ---------------------------------------------------------------------------
115
+ // Formatting
116
+ // ---------------------------------------------------------------------------
117
+ /** Format a Qdrant point into a human-readable fact string. */
118
+ export function formatFact(point) {
119
+ const p = point.payload;
120
+ const effectiveConf = computeEffectiveConfidence(p);
121
+ const stale = isStale(p);
122
+ const parts = [`${stale ? "🕰️ " : ""}[${p.category}] ${p.content}`];
123
+ if (p.domain && p.domain !== "work")
124
+ parts.push(`domain: ${p.domain}`);
125
+ if (p.kind && p.kind !== "fact")
126
+ parts.push(`kind: ${p.kind}`);
127
+ if (p.entities?.length)
128
+ parts.push(`entities: ${p.entities.join(", ")}`);
129
+ if (effectiveConf < p.confidence) {
130
+ parts.push(`confidence: ${p.confidence} → effective: ${effectiveConf}`);
131
+ }
132
+ else {
133
+ parts.push(`confidence: ${p.confidence}`);
134
+ }
135
+ if (p.reinforcement_count > 1)
136
+ parts.push(`reinforced: ${p.reinforcement_count}x`);
137
+ if ((p.verification_count ?? 0) > 0)
138
+ parts.push(`verified: ${p.verification_count}x`);
139
+ if (p.metadata && Object.keys(p.metadata).length > 0) {
140
+ const metaPairs = Object.entries(p.metadata).map(([k, v]) => `${k}=${v}`).join(", ");
141
+ parts.push(`metadata: {${metaPairs}}`);
142
+ }
143
+ if (p.created_at)
144
+ parts.push(`created: ${p.created_at}`);
145
+ parts.push(`id: ${point.id}`);
146
+ if (point.score !== undefined)
147
+ parts.push(`score: ${point.score.toFixed(3)}`);
148
+ if (point._combinedScore !== undefined)
149
+ parts.push(`rank: ${point._combinedScore.toFixed(3)}`);
150
+ return parts.join(" | ");
151
+ }
152
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/mcp/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for pure helper functions in the Memory MCP server.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../../src/mcp/helpers.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}