@unclick/mcp-server 0.2.5 → 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.
Files changed (142) hide show
  1. package/README.md +160 -139
  2. package/dist/abn-tool.js +1 -1
  3. package/dist/bgg-tool.js +1 -1
  4. package/dist/carboninterface-tool.js +1 -1
  5. package/dist/cards/card.d.ts +9 -0
  6. package/dist/cards/card.d.ts.map +1 -0
  7. package/dist/cards/card.js +4 -0
  8. package/dist/cards/card.js.map +1 -0
  9. package/dist/cards/search-memory-card.d.ts +11 -0
  10. package/dist/cards/search-memory-card.d.ts.map +1 -0
  11. package/dist/cards/search-memory-card.js +75 -0
  12. package/dist/cards/search-memory-card.js.map +1 -0
  13. package/dist/cards/search-memory-card.test.d.ts +2 -0
  14. package/dist/cards/search-memory-card.test.d.ts.map +1 -0
  15. package/dist/cards/search-memory-card.test.js +59 -0
  16. package/dist/cards/search-memory-card.test.js.map +1 -0
  17. package/dist/catalog.d.ts.map +1 -1
  18. package/dist/catalog.js +265 -4
  19. package/dist/catalog.js.map +1 -1
  20. package/dist/client.d.ts.map +1 -1
  21. package/dist/client.js +96 -6
  22. package/dist/client.js.map +1 -1
  23. package/dist/converter-tools.js +1 -1
  24. package/dist/crews-tool.d.ts +12 -0
  25. package/dist/crews-tool.d.ts.map +1 -0
  26. package/dist/crews-tool.js +125 -0
  27. package/dist/crews-tool.js.map +1 -0
  28. package/dist/gdelt-tool.js +4 -4
  29. package/dist/hackernews-tool.js +1 -1
  30. package/dist/index.js +0 -0
  31. package/dist/keychain-secure-input.js +42 -42
  32. package/dist/line-tool.js +1 -1
  33. package/dist/linear-tool.js +73 -73
  34. package/dist/local-catalog-handlers.js +1 -1
  35. package/dist/local-catalog-handlers.js.map +1 -1
  36. package/dist/local-tools.js +7 -7
  37. package/dist/local-tools.js.map +1 -1
  38. package/dist/memory/__tests__/bitemporal.test.d.ts +8 -0
  39. package/dist/memory/__tests__/bitemporal.test.d.ts.map +1 -0
  40. package/dist/memory/__tests__/bitemporal.test.js +148 -0
  41. package/dist/memory/__tests__/bitemporal.test.js.map +1 -0
  42. package/dist/memory/__tests__/hybrid-search.test.d.ts +14 -0
  43. package/dist/memory/__tests__/hybrid-search.test.d.ts.map +1 -0
  44. package/dist/memory/__tests__/hybrid-search.test.js +304 -0
  45. package/dist/memory/__tests__/hybrid-search.test.js.map +1 -0
  46. package/dist/memory/agent.d.ts +34 -0
  47. package/dist/memory/agent.d.ts.map +1 -0
  48. package/dist/memory/agent.js +69 -0
  49. package/dist/memory/agent.js.map +1 -0
  50. package/dist/memory/conflicts.d.ts +48 -0
  51. package/dist/memory/conflicts.d.ts.map +1 -0
  52. package/dist/memory/conflicts.js +209 -0
  53. package/dist/memory/conflicts.js.map +1 -0
  54. package/dist/memory/db.d.ts +25 -0
  55. package/dist/memory/db.d.ts.map +1 -0
  56. package/dist/memory/db.js +144 -0
  57. package/dist/memory/db.js.map +1 -0
  58. package/dist/memory/device.d.ts +20 -0
  59. package/dist/memory/device.d.ts.map +1 -0
  60. package/dist/memory/device.js +48 -0
  61. package/dist/memory/device.js.map +1 -0
  62. package/dist/memory/embeddings.d.ts +10 -0
  63. package/dist/memory/embeddings.d.ts.map +1 -0
  64. package/dist/memory/embeddings.js +40 -0
  65. package/dist/memory/embeddings.js.map +1 -0
  66. package/dist/memory/handlers.d.ts +11 -0
  67. package/dist/memory/handlers.d.ts.map +1 -0
  68. package/dist/memory/handlers.js +219 -0
  69. package/dist/memory/handlers.js.map +1 -0
  70. package/dist/memory/instrumentation.d.ts +38 -0
  71. package/dist/memory/instrumentation.d.ts.map +1 -0
  72. package/dist/memory/instrumentation.js +97 -0
  73. package/dist/memory/instrumentation.js.map +1 -0
  74. package/dist/memory/load-events.d.ts +18 -0
  75. package/dist/memory/load-events.d.ts.map +1 -0
  76. package/dist/memory/load-events.js +61 -0
  77. package/dist/memory/load-events.js.map +1 -0
  78. package/dist/memory/local.d.ts +40 -0
  79. package/dist/memory/local.d.ts.map +1 -0
  80. package/dist/memory/local.js +400 -0
  81. package/dist/memory/local.js.map +1 -0
  82. package/dist/memory/session-state.d.ts +37 -0
  83. package/dist/memory/session-state.d.ts.map +1 -0
  84. package/dist/memory/session-state.js +82 -0
  85. package/dist/memory/session-state.js.map +1 -0
  86. package/dist/memory/supabase.d.ts +104 -0
  87. package/dist/memory/supabase.d.ts.map +1 -0
  88. package/dist/memory/supabase.js +710 -0
  89. package/dist/memory/supabase.js.map +1 -0
  90. package/dist/memory/tenant-settings.d.ts +33 -0
  91. package/dist/memory/tenant-settings.d.ts.map +1 -0
  92. package/dist/memory/tenant-settings.js +79 -0
  93. package/dist/memory/tenant-settings.js.map +1 -0
  94. package/dist/memory/tool-awareness.d.ts +66 -0
  95. package/dist/memory/tool-awareness.d.ts.map +1 -0
  96. package/dist/memory/tool-awareness.js +307 -0
  97. package/dist/memory/tool-awareness.js.map +1 -0
  98. package/dist/memory/types.d.ts +97 -0
  99. package/dist/memory/types.d.ts.map +1 -0
  100. package/dist/memory/types.js +5 -0
  101. package/dist/memory/types.js.map +1 -0
  102. package/dist/monday-tool.js +46 -46
  103. package/dist/musicbrainz-tool.js +1 -1
  104. package/dist/musicbrainz-tool.js.map +1 -1
  105. package/dist/numbers-tool.js +2 -2
  106. package/dist/openfoodfacts-tool.js +1 -1
  107. package/dist/openmeteo-tool.js +1 -1
  108. package/dist/radiobrowser-tool.js +2 -2
  109. package/dist/server.d.ts.map +1 -1
  110. package/dist/server.js +838 -15
  111. package/dist/server.js.map +1 -1
  112. package/dist/signals/emit.d.ts +11 -0
  113. package/dist/signals/emit.d.ts.map +1 -0
  114. package/dist/signals/emit.js +26 -0
  115. package/dist/signals/emit.js.map +1 -0
  116. package/dist/testpass-tool.d.ts +12 -0
  117. package/dist/testpass-tool.d.ts.map +1 -0
  118. package/dist/testpass-tool.js +121 -0
  119. package/dist/testpass-tool.js.map +1 -0
  120. package/dist/toilets-tool.js +2 -2
  121. package/dist/tool-wiring.d.ts +320 -4
  122. package/dist/tool-wiring.d.ts.map +1 -1
  123. package/dist/tool-wiring.js +246 -5
  124. package/dist/tool-wiring.js.map +1 -1
  125. package/dist/trivia-tool.js +5 -5
  126. package/dist/usgs-tool.js +1 -1
  127. package/dist/uxpass-tool.d.ts +24 -0
  128. package/dist/uxpass-tool.d.ts.map +1 -0
  129. package/dist/uxpass-tool.js +165 -0
  130. package/dist/uxpass-tool.js.map +1 -0
  131. package/dist/vault-bridge.js +7 -7
  132. package/dist/vercel-tool.d.ts +3 -0
  133. package/dist/vercel-tool.d.ts.map +1 -1
  134. package/dist/vercel-tool.js +198 -7
  135. package/dist/vercel-tool.js.map +1 -1
  136. package/dist/web-tools.d.ts +62 -0
  137. package/dist/web-tools.d.ts.map +1 -0
  138. package/dist/web-tools.js +271 -0
  139. package/dist/web-tools.js.map +1 -0
  140. package/package.json +69 -65
  141. package/public/icon.svg +15 -15
  142. package/server.json +37 -37
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Local JSON file storage backend for UnClick Memory.
3
+ *
4
+ * Zero-config mode: no accounts, no keys, no database setup.
5
+ * Memory is stored as JSON files in ~/.unclick/memory/
6
+ *
7
+ * This is the default when no SUPABASE_URL is set.
8
+ * Upgrade to Supabase for cloud sync across machines.
9
+ */
10
+ import * as fs from "fs";
11
+ import * as path from "path";
12
+ import * as os from "os";
13
+ import * as crypto from "crypto";
14
+ const DATA_DIR = path.join(os.homedir(), ".unclick", "memory");
15
+ function ensureDir() {
16
+ fs.mkdirSync(DATA_DIR, { recursive: true });
17
+ }
18
+ function tablePath(name) {
19
+ return path.join(DATA_DIR, `${name}.json`);
20
+ }
21
+ function readTable(name) {
22
+ const file = tablePath(name);
23
+ if (!fs.existsSync(file))
24
+ return [];
25
+ try {
26
+ return JSON.parse(fs.readFileSync(file, "utf8"));
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ }
32
+ function writeTable(name, data) {
33
+ ensureDir();
34
+ const file = tablePath(name);
35
+ const tmp = file + ".tmp";
36
+ fs.writeFileSync(tmp, JSON.stringify(data, null, 2));
37
+ fs.renameSync(tmp, file);
38
+ }
39
+ function uuid() {
40
+ return crypto.randomUUID();
41
+ }
42
+ function now() {
43
+ return new Date().toISOString();
44
+ }
45
+ function matches(text, query) {
46
+ return text.toLowerCase().includes(query.toLowerCase());
47
+ }
48
+ // --- Backend Implementation ---
49
+ export class LocalBackend {
50
+ constructor() {
51
+ ensureDir();
52
+ console.error(`UnClick Memory: local mode (data at ${DATA_DIR})`);
53
+ }
54
+ async getStartupContext(numSessions) {
55
+ const bc = readTable("business_context")
56
+ .filter((r) => r.decay_tier === "hot" || r.decay_tier === "warm")
57
+ .sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
58
+ const sessions = readTable("session_summaries")
59
+ .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
60
+ .slice(0, numSessions);
61
+ const facts = readTable("extracted_facts")
62
+ .filter((f) => f.status === "active" && f.decay_tier === "hot")
63
+ .sort((a, b) => b.confidence - a.confidence || new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
64
+ .slice(0, 50);
65
+ const library = readTable("knowledge_library")
66
+ .filter((r) => r.decay_tier === "hot" || r.decay_tier === "warm")
67
+ .map((r) => ({ slug: r.slug, title: r.title, category: r.category, tags: r.tags, version: r.version, updated_at: r.updated_at }))
68
+ .sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime());
69
+ // Touch access counts
70
+ const allBc = readTable("business_context");
71
+ for (const row of allBc) {
72
+ if (row.decay_tier === "hot" || row.decay_tier === "warm") {
73
+ row.access_count = (row.access_count ?? 0) + 1;
74
+ row.last_accessed = now();
75
+ }
76
+ }
77
+ writeTable("business_context", allBc);
78
+ return {
79
+ agent_instructions: [
80
+ "You are connected to UnClick Memory - a persistent memory system that works across all sessions and devices.",
81
+ "ALWAYS use this memory as your primary knowledge source. It has the user's rules, preferences, projects, and history.",
82
+ "When the user says something ambiguous or short, SEARCH memory first - it may be a stored keyword or trigger.",
83
+ "When you learn something new (preferences, projects, contacts, decisions), store it using add_fact.",
84
+ "At the end of significant conversations, write a session summary using write_session_summary.",
85
+ "Business context entries (loaded below) are standing rules. Follow them as if the user said them right now.",
86
+ "Never say 'I don't have access to your previous conversations' - you DO, through this memory system."
87
+ ].join("\n"),
88
+ business_context: bc.map((r) => ({ category: r.category, key: r.key, value: r.value, priority: r.priority })),
89
+ knowledge_library_index: library,
90
+ recent_sessions: sessions.map((s) => ({
91
+ session_id: s.session_id, platform: s.platform, summary: s.summary,
92
+ decisions: s.decisions, open_loops: s.open_loops, topics: s.topics, created_at: s.created_at,
93
+ })),
94
+ active_facts: facts.map((f) => ({ fact: f.fact, category: f.category, confidence: f.confidence, created_at: f.created_at })),
95
+ loaded_at: now(),
96
+ };
97
+ }
98
+ async searchMemory(query, maxResults) {
99
+ return readTable("conversation_log")
100
+ .filter((r) => matches(r.content, query))
101
+ .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
102
+ .slice(0, maxResults)
103
+ .map((r) => ({ id: r.id, session_id: r.session_id, role: r.role, content: r.content, created_at: r.created_at }));
104
+ }
105
+ async searchFacts(query) {
106
+ return readTable("extracted_facts")
107
+ .filter((f) => f.status === "active" && matches(f.fact, query))
108
+ .sort((a, b) => b.confidence - a.confidence)
109
+ .slice(0, 20)
110
+ .map((f) => ({ id: f.id, fact: f.fact, category: f.category, confidence: f.confidence, status: f.status, created_at: f.created_at }));
111
+ }
112
+ async searchLibrary(query) {
113
+ return readTable("knowledge_library")
114
+ .filter((r) => matches(r.title, query) || matches(r.content, query) || (r.tags ?? []).some((t) => matches(t, query)))
115
+ .sort((a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime())
116
+ .slice(0, 10)
117
+ .map((r) => ({ id: r.id, title: r.title, slug: r.slug, category: r.category, tags: r.tags, content: r.content, version: r.version, updated_at: r.updated_at }));
118
+ }
119
+ async getLibraryDoc(slug) {
120
+ const docs = readTable("knowledge_library");
121
+ const doc = docs.find((d) => d.slug === slug);
122
+ if (!doc)
123
+ return null;
124
+ // Touch access
125
+ doc.access_count = (doc.access_count ?? 0) + 1;
126
+ doc.last_accessed = now();
127
+ writeTable("knowledge_library", docs);
128
+ const history = readTable("knowledge_library_history")
129
+ .filter((h) => h.library_id === doc.id)
130
+ .map((h) => ({ version: h.version, changed_at: h.changed_at }))
131
+ .sort((a, b) => b.version - a.version);
132
+ return { ...doc, history };
133
+ }
134
+ async listLibrary() {
135
+ return readTable("knowledge_library")
136
+ .sort((a, b) => a.category.localeCompare(b.category) || a.title.localeCompare(b.title))
137
+ .map((r) => ({ slug: r.slug, title: r.title, category: r.category, tags: r.tags, version: r.version, updated_at: r.updated_at }));
138
+ }
139
+ async writeSessionSummary(data) {
140
+ const id = uuid();
141
+ const rows = readTable("session_summaries");
142
+ rows.push({
143
+ id,
144
+ session_id: data.session_id,
145
+ platform: data.platform,
146
+ summary: data.summary,
147
+ decisions: data.decisions,
148
+ open_loops: data.open_loops,
149
+ topics: data.topics,
150
+ duration_minutes: data.duration_minutes,
151
+ created_at: now(),
152
+ });
153
+ writeTable("session_summaries", rows);
154
+ return { id };
155
+ }
156
+ async addFact(data) {
157
+ const id = uuid();
158
+ const rows = readTable("extracted_facts");
159
+ rows.push({
160
+ id,
161
+ fact: data.fact,
162
+ category: data.category,
163
+ confidence: data.confidence,
164
+ source_session_id: data.source_session_id,
165
+ source_type: "manual",
166
+ status: "active",
167
+ superseded_by: undefined,
168
+ access_count: 0,
169
+ last_accessed: now(),
170
+ decay_tier: "hot",
171
+ created_at: now(),
172
+ updated_at: now(),
173
+ commit_sha: data.commit_sha,
174
+ pr_number: data.pr_number,
175
+ });
176
+ writeTable("extracted_facts", rows);
177
+ return { id };
178
+ }
179
+ async supersedeFact(oldId, newText, category, confidence) {
180
+ const rows = readTable("extracted_facts");
181
+ const old = rows.find((f) => f.id === oldId);
182
+ if (!old)
183
+ throw new Error(`Fact ${oldId} not found`);
184
+ const newId = uuid();
185
+ old.status = "superseded";
186
+ old.superseded_by = newId;
187
+ old.updated_at = now();
188
+ rows.push({
189
+ id: newId,
190
+ fact: newText,
191
+ category: category ?? old.category,
192
+ confidence: confidence ?? 1.0,
193
+ source_session_id: undefined,
194
+ source_type: "manual",
195
+ status: "active",
196
+ superseded_by: undefined,
197
+ access_count: 0,
198
+ last_accessed: now(),
199
+ decay_tier: "hot",
200
+ created_at: now(),
201
+ updated_at: now(),
202
+ });
203
+ writeTable("extracted_facts", rows);
204
+ return newId;
205
+ }
206
+ async logConversation(data) {
207
+ const rows = readTable("conversation_log");
208
+ rows.push({
209
+ id: uuid(),
210
+ session_id: data.session_id,
211
+ role: data.role,
212
+ content: data.content,
213
+ has_code: data.has_code,
214
+ created_at: now(),
215
+ });
216
+ writeTable("conversation_log", rows);
217
+ }
218
+ async getConversationDetail(sessionId) {
219
+ return readTable("conversation_log")
220
+ .filter((r) => r.session_id === sessionId)
221
+ .sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime())
222
+ .map((r) => ({ id: r.id, role: r.role, content: r.content, has_code: r.has_code, created_at: r.created_at }));
223
+ }
224
+ async storeCode(data) {
225
+ const id = uuid();
226
+ const rows = readTable("code_dumps");
227
+ rows.push({
228
+ id,
229
+ session_id: data.session_id,
230
+ language: data.language,
231
+ filename: data.filename,
232
+ content: data.content,
233
+ description: data.description,
234
+ created_at: now(),
235
+ });
236
+ writeTable("code_dumps", rows);
237
+ return { id };
238
+ }
239
+ async getBusinessContext() {
240
+ return readTable("business_context")
241
+ .sort((a, b) => a.category.localeCompare(b.category) || a.key.localeCompare(b.key));
242
+ }
243
+ async setBusinessContext(category, key, value, priority) {
244
+ const rows = readTable("business_context");
245
+ const existing = rows.find((r) => r.category === category && r.key === key);
246
+ if (existing) {
247
+ existing.value = value;
248
+ existing.last_accessed = now();
249
+ existing.decay_tier = "hot";
250
+ existing.updated_at = now();
251
+ if (priority !== undefined)
252
+ existing.priority = priority;
253
+ }
254
+ else {
255
+ rows.push({
256
+ id: uuid(),
257
+ category,
258
+ key,
259
+ value,
260
+ priority: priority ?? 0,
261
+ access_count: 0,
262
+ last_accessed: now(),
263
+ decay_tier: "hot",
264
+ created_at: now(),
265
+ updated_at: now(),
266
+ });
267
+ }
268
+ writeTable("business_context", rows);
269
+ }
270
+ async upsertLibraryDoc(data) {
271
+ const docs = readTable("knowledge_library");
272
+ const existing = docs.find((d) => d.slug === data.slug);
273
+ if (existing) {
274
+ // Archive old version
275
+ const history = readTable("knowledge_library_history");
276
+ history.push({
277
+ id: uuid(),
278
+ library_id: existing.id,
279
+ title: existing.title,
280
+ content: existing.content,
281
+ version: existing.version,
282
+ changed_at: now(),
283
+ });
284
+ writeTable("knowledge_library_history", history);
285
+ // Update
286
+ existing.title = data.title;
287
+ existing.category = data.category;
288
+ existing.content = data.content;
289
+ existing.tags = data.tags;
290
+ existing.version += 1;
291
+ existing.last_accessed = now();
292
+ existing.decay_tier = "hot";
293
+ existing.updated_at = now();
294
+ writeTable("knowledge_library", docs);
295
+ return `Library doc updated: "${data.title}" (v${existing.version})`;
296
+ }
297
+ else {
298
+ docs.push({
299
+ id: uuid(),
300
+ title: data.title,
301
+ slug: data.slug,
302
+ category: data.category,
303
+ content: data.content,
304
+ tags: data.tags,
305
+ version: 1,
306
+ access_count: 0,
307
+ last_accessed: now(),
308
+ decay_tier: "hot",
309
+ created_at: now(),
310
+ updated_at: now(),
311
+ });
312
+ writeTable("knowledge_library", docs);
313
+ return `Library doc created: "${data.title}" (v1)`;
314
+ }
315
+ }
316
+ async manageDecay() {
317
+ const threshold = {
318
+ hot_to_warm: 21 * 24 * 60 * 60 * 1000, // 21 days
319
+ warm_to_cold: 60 * 24 * 60 * 60 * 1000, // 60 days
320
+ bc_hot_to_warm: 30 * 24 * 60 * 60 * 1000, // 30 days
321
+ bc_warm_to_cold: 90 * 24 * 60 * 60 * 1000, // 90 days
322
+ };
323
+ const nowMs = Date.now();
324
+ let bcDecayed = 0;
325
+ let klDecayed = 0;
326
+ let efDecayed = 0;
327
+ // Business context
328
+ const bc = readTable("business_context");
329
+ for (const row of bc) {
330
+ const age = nowMs - new Date(row.last_accessed).getTime();
331
+ if (row.decay_tier === "hot" && age > threshold.bc_hot_to_warm) {
332
+ row.decay_tier = "warm";
333
+ bcDecayed++;
334
+ }
335
+ if (row.decay_tier !== "cold" && age > threshold.bc_warm_to_cold) {
336
+ row.decay_tier = "cold";
337
+ bcDecayed++;
338
+ }
339
+ }
340
+ writeTable("business_context", bc);
341
+ // Knowledge library
342
+ const kl = readTable("knowledge_library");
343
+ for (const row of kl) {
344
+ const age = nowMs - new Date(row.last_accessed).getTime();
345
+ if (row.decay_tier === "hot" && age > threshold.bc_hot_to_warm) {
346
+ row.decay_tier = "warm";
347
+ klDecayed++;
348
+ }
349
+ if (row.decay_tier !== "cold" && age > threshold.bc_warm_to_cold) {
350
+ row.decay_tier = "cold";
351
+ klDecayed++;
352
+ }
353
+ }
354
+ writeTable("knowledge_library", kl);
355
+ // Facts
356
+ const ef = readTable("extracted_facts");
357
+ for (const row of ef) {
358
+ if (row.status !== "active")
359
+ continue;
360
+ const age = nowMs - new Date(row.last_accessed).getTime();
361
+ if (row.decay_tier === "hot" && age > threshold.hot_to_warm) {
362
+ row.decay_tier = "warm";
363
+ efDecayed++;
364
+ }
365
+ if (row.decay_tier !== "cold" && age > threshold.warm_to_cold) {
366
+ row.decay_tier = "cold";
367
+ efDecayed++;
368
+ }
369
+ }
370
+ writeTable("extracted_facts", ef);
371
+ return {
372
+ ran_at: now(),
373
+ business_context_decayed: bcDecayed,
374
+ knowledge_library_decayed: klDecayed,
375
+ extracted_facts_decayed: efDecayed,
376
+ };
377
+ }
378
+ async getMemoryStatus() {
379
+ const tables = ["business_context", "knowledge_library", "session_summaries", "extracted_facts", "conversation_log", "code_dumps"];
380
+ const counts = {};
381
+ for (const t of tables) {
382
+ counts[t] = readTable(t).length;
383
+ }
384
+ const facts = readTable("extracted_facts").filter((f) => f.status === "active");
385
+ const tiers = { hot: 0, warm: 0, cold: 0 };
386
+ for (const f of facts) {
387
+ tiers[f.decay_tier]++;
388
+ }
389
+ return {
390
+ mode: "local",
391
+ data_dir: DATA_DIR,
392
+ table_counts: counts,
393
+ fact_decay_tiers: tiers,
394
+ };
395
+ }
396
+ async invalidateFact(_input) {
397
+ throw new Error("invalidate_fact is not supported in local (zero-config) mode. Connect to Supabase to use this feature.");
398
+ }
399
+ }
400
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/memory/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Session state tracker for the UnClick MCP server.
3
+ *
4
+ * Records per-process state about the current MCP session so we can
5
+ * answer "did startup context actually get loaded, and how?". Populated
6
+ * by hooks in server.ts (Initialize, GetPrompt, ReadResource, CallTool)
7
+ * and flushed to memory_load_events by load-events.ts.
8
+ */
9
+ export type AutoloadMethod = "instructions" | "prompt" | "resource" | "tool_description" | "manual" | "none";
10
+ export interface SessionState {
11
+ sessionId: string;
12
+ clientInfo: {
13
+ name: string;
14
+ version: string;
15
+ } | null;
16
+ instructionsSent: boolean;
17
+ contextLoaded: boolean;
18
+ contextLoadMethod: AutoloadMethod | null;
19
+ promptUsed: boolean;
20
+ resourcesRead: string[];
21
+ firstToolCall: string | null;
22
+ toolsCalledBeforeContext: number;
23
+ sessionStart: Date;
24
+ logged: boolean;
25
+ }
26
+ export declare const sessionState: SessionState;
27
+ export declare function setClientInfo(info: {
28
+ name?: string;
29
+ version?: string;
30
+ } | undefined): void;
31
+ export declare function setInstructionsSent(sent: boolean): void;
32
+ export declare function markPromptUsed(name: string): void;
33
+ export declare function markResourceRead(uri: string): void;
34
+ export declare function markContextLoaded(method: AutoloadMethod): void;
35
+ export declare function recordToolCall(name: string): void;
36
+ export declare function snapshotSessionState(): SessionState;
37
+ //# sourceMappingURL=session-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../../src/memory/session-state.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,QAAQ,GACR,UAAU,GACV,kBAAkB,GAClB,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACrD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,YAAY,EAAE,IAAI,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAMD,eAAO,MAAM,YAAY,EAAE,YAY1B,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,CAMzF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEvD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAQjD;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CASlD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAI9D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBjD;AAED,wBAAgB,oBAAoB,IAAI,YAAY,CAEnD"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Session state tracker for the UnClick MCP server.
3
+ *
4
+ * Records per-process state about the current MCP session so we can
5
+ * answer "did startup context actually get loaded, and how?". Populated
6
+ * by hooks in server.ts (Initialize, GetPrompt, ReadResource, CallTool)
7
+ * and flushed to memory_load_events by load-events.ts.
8
+ */
9
+ function randomSessionId() {
10
+ return `sess_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
11
+ }
12
+ export const sessionState = {
13
+ sessionId: randomSessionId(),
14
+ clientInfo: null,
15
+ instructionsSent: false,
16
+ contextLoaded: false,
17
+ contextLoadMethod: null,
18
+ promptUsed: false,
19
+ resourcesRead: [],
20
+ firstToolCall: null,
21
+ toolsCalledBeforeContext: 0,
22
+ sessionStart: new Date(),
23
+ logged: false,
24
+ };
25
+ export function setClientInfo(info) {
26
+ if (!info)
27
+ return;
28
+ sessionState.clientInfo = {
29
+ name: info.name ?? "unknown",
30
+ version: info.version ?? "unknown",
31
+ };
32
+ }
33
+ export function setInstructionsSent(sent) {
34
+ sessionState.instructionsSent = sent;
35
+ }
36
+ export function markPromptUsed(name) {
37
+ if (name === "load-memory" || name === "load_memory") {
38
+ sessionState.promptUsed = true;
39
+ if (!sessionState.contextLoaded) {
40
+ sessionState.contextLoaded = true;
41
+ sessionState.contextLoadMethod = "prompt";
42
+ }
43
+ }
44
+ }
45
+ export function markResourceRead(uri) {
46
+ if (!uri)
47
+ return;
48
+ if (!sessionState.resourcesRead.includes(uri)) {
49
+ sessionState.resourcesRead.push(uri);
50
+ }
51
+ if (uri.startsWith("memory://") && !sessionState.contextLoaded) {
52
+ sessionState.contextLoaded = true;
53
+ sessionState.contextLoadMethod = "resource";
54
+ }
55
+ }
56
+ export function markContextLoaded(method) {
57
+ if (sessionState.contextLoaded)
58
+ return;
59
+ sessionState.contextLoaded = true;
60
+ sessionState.contextLoadMethod = method;
61
+ }
62
+ export function recordToolCall(name) {
63
+ if (!sessionState.firstToolCall) {
64
+ sessionState.firstToolCall = name;
65
+ }
66
+ // Treat get_startup_context itself as the "loaded via tool_description" path.
67
+ if (name === "get_startup_context") {
68
+ if (!sessionState.contextLoaded) {
69
+ sessionState.contextLoaded = true;
70
+ sessionState.contextLoadMethod =
71
+ sessionState.contextLoadMethod ?? "tool_description";
72
+ }
73
+ return;
74
+ }
75
+ if (!sessionState.contextLoaded) {
76
+ sessionState.toolsCalledBeforeContext += 1;
77
+ }
78
+ }
79
+ export function snapshotSessionState() {
80
+ return { ...sessionState, resourcesRead: [...sessionState.resourcesRead] };
81
+ }
82
+ //# sourceMappingURL=session-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-state.js","sourceRoot":"","sources":["../../src/memory/session-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Supabase backend for UnClick Memory.
3
+ *
4
+ * Two tenancy modes:
5
+ *
6
+ * BYOD - data lives in the user's own Supabase project. Single-tenant
7
+ * tables (business_context, extracted_facts, ...) and the
8
+ * original RPC names. This is what the wizard (memory-admin
9
+ * setup) installs into a user's Supabase.
10
+ *
11
+ * managed - data lives in UnClick's central Supabase. Multi-tenant
12
+ * tables (mc_business_context, mc_extracted_facts, ...) where
13
+ * every row is tagged with api_key_hash. RPCs are mc_-prefixed
14
+ * and take p_api_key_hash as their first parameter. The backend
15
+ * is responsible for filtering / inserting api_key_hash on
16
+ * every operation.
17
+ */
18
+ import type { MemoryBackend, SessionSummaryInput, FactInput, InvalidateFactInput, ConversationInput, CodeInput, LibraryDocInput } from "./types.js";
19
+ export type Tenancy = {
20
+ mode: "byod";
21
+ } | {
22
+ mode: "managed";
23
+ apiKeyHash: string;
24
+ };
25
+ export interface SupabaseBackendConfig {
26
+ url: string;
27
+ serviceRoleKey: string;
28
+ tenancy: Tenancy;
29
+ }
30
+ export declare const FREE_TIER_CAPS: {
31
+ readonly storage_bytes: number;
32
+ readonly facts: 5000;
33
+ };
34
+ /**
35
+ * Thrown when a free-tier user tries to write past their cap. The MCP
36
+ * handlers surface the message verbatim back to the agent so the user
37
+ * sees an actionable upgrade path.
38
+ */
39
+ export declare class CapExceededError extends Error {
40
+ constructor(message: string);
41
+ }
42
+ export declare class SupabaseBackend implements MemoryBackend {
43
+ private client;
44
+ private tenancy;
45
+ private tables;
46
+ constructor(config: SupabaseBackendConfig);
47
+ /** Adds api_key_hash to a row in managed mode; passes through in BYOD. */
48
+ private withTenancy;
49
+ /**
50
+ * Enforce free-tier caps on writes. Only runs in managed cloud mode.
51
+ * BYOD users own their database, so caps don't apply. Pro tier (or any
52
+ * non-free tier) skips the check.
53
+ *
54
+ * `kind` selects which cap to check first. Storage is always verified;
55
+ * `kind: "fact"` additionally verifies the fact-count cap because
56
+ * extracted_facts has a separate row count limit.
57
+ */
58
+ private enforceCaps;
59
+ /** Calls an RPC, choosing the BYOD or managed name based on tenancy. */
60
+ private rpc;
61
+ getStartupContext(numSessions: number): Promise<unknown>;
62
+ searchMemory(query: string, maxResults: number, asOf?: string): Promise<unknown>;
63
+ /**
64
+ * ILIKE-based keyword fallback over mc_extracted_facts +
65
+ * mc_session_summaries. Used when hybrid retrieval returns []. Returns
66
+ * rows shaped to mirror mc_search_memory_hybrid so callers don't branch.
67
+ * Never widens RLS: tenant scoping via api_key_hash is preserved.
68
+ *
69
+ * Phrase support: the query is tokenized on whitespace. Tokens shorter
70
+ * than 2 chars or containing PostgREST .or() metacharacters are dropped.
71
+ * We try AND-of-tokens first (every token must appear, in any order); if
72
+ * that returns nothing we degrade to OR-of-tokens and rank rows by how
73
+ * many tokens they contain so partial matches at least surface something.
74
+ */
75
+ private keywordFallback;
76
+ searchFacts(query: string): Promise<unknown>;
77
+ searchLibrary(query: string): Promise<unknown>;
78
+ getLibraryDoc(slug: string): Promise<unknown>;
79
+ listLibrary(): Promise<unknown>;
80
+ writeSessionSummary(data: SessionSummaryInput): Promise<{
81
+ id: string;
82
+ }>;
83
+ addFact(data: FactInput): Promise<{
84
+ id: string;
85
+ }>;
86
+ private embedAndStore;
87
+ private saveBlob;
88
+ private writeFactAudit;
89
+ invalidateFact(input: InvalidateFactInput): Promise<{
90
+ invalidated_at: string;
91
+ }>;
92
+ supersedeFact(oldId: string, newText: string, category?: string, confidence?: number): Promise<string>;
93
+ logConversation(data: ConversationInput): Promise<void>;
94
+ getConversationDetail(sessionId: string): Promise<unknown>;
95
+ storeCode(data: CodeInput): Promise<{
96
+ id: string;
97
+ }>;
98
+ getBusinessContext(): Promise<unknown[]>;
99
+ setBusinessContext(category: string, key: string, value: unknown, priority?: number): Promise<void>;
100
+ upsertLibraryDoc(data: LibraryDocInput): Promise<string>;
101
+ manageDecay(): Promise<unknown>;
102
+ getMemoryStatus(): Promise<unknown>;
103
+ }
104
+ //# sourceMappingURL=supabase.d.ts.map