@brain-protocol/mcp 0.4.1 → 0.5.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.
@@ -0,0 +1,86 @@
1
+ import type { StoreAdapter } from "./adapter.js";
2
+ export interface SyncState {
3
+ mode: "local" | "cloud" | "hybrid";
4
+ pendingUploads: number;
5
+ pendingDownloads: number;
6
+ lastSyncAt: string | null;
7
+ conflicts: SyncConflict[];
8
+ stats: SyncStats;
9
+ }
10
+ export interface SyncStats {
11
+ totalUploads: number;
12
+ totalDownloads: number;
13
+ totalConflicts: number;
14
+ totalErrors: number;
15
+ totalIntegrityErrors: number;
16
+ lastSyncDurationMs: number | null;
17
+ lastSyncSuccessAt: string | null;
18
+ }
19
+ export interface SyncConflict {
20
+ entryId: string;
21
+ localUpdatedAt: string;
22
+ cloudUpdatedAt: string;
23
+ resolvedAt: string | null;
24
+ }
25
+ export type ConflictResolution = "keep_local" | "keep_cloud" | "keep_both";
26
+ export interface SyncResult {
27
+ uploaded: number;
28
+ downloaded: number;
29
+ conflicts: number;
30
+ errors: string[];
31
+ integrityErrors: IntegrityError[];
32
+ }
33
+ export interface IntegrityError {
34
+ entryId: string;
35
+ expected: string;
36
+ actual: string;
37
+ }
38
+ export interface SyncLogEntry {
39
+ id: string;
40
+ entryId: string;
41
+ action: "upload" | "download" | "conflict" | "resolve";
42
+ timestamp: string;
43
+ error: string | null;
44
+ }
45
+ /**
46
+ * Sync engine implementing fork-on-conflict strategy.
47
+ * Zero data loss: conflicting entries are forked with parent_id linkage
48
+ * and a conflicts_with edge.
49
+ */
50
+ export declare class SyncEngine {
51
+ private local;
52
+ private cloud;
53
+ private _stats;
54
+ constructor(local: StoreAdapter, cloud: StoreAdapter);
55
+ /** Get cumulative sync statistics */
56
+ getStats(): SyncStats;
57
+ /**
58
+ * Run a full sync cycle: push local changes, pull cloud changes, detect conflicts.
59
+ */
60
+ sync(): Promise<SyncResult>;
61
+ /**
62
+ * Push locally-created entries that haven't been synced yet.
63
+ * Entries with sync_status='pending' are candidates for upload.
64
+ */
65
+ private pushPending;
66
+ /**
67
+ * Pull entries from cloud that are newer than local or don't exist locally.
68
+ * On conflict: fork the entry (create new with parent_id → original + conflicts_with edge).
69
+ */
70
+ private pullFromCloud;
71
+ /**
72
+ * Verify integrity of downloaded entries by comparing content hashes.
73
+ * Logs mismatches to sync_log via the local store.
74
+ */
75
+ private verifyIntegrity;
76
+ /**
77
+ * Resolve a sync conflict.
78
+ */
79
+ resolveConflict(entryId: string, resolution: ConflictResolution): Promise<{
80
+ resolved: boolean;
81
+ kept: string[];
82
+ }>;
83
+ }
84
+ /** Compute SHA-256 content hash for integrity verification */
85
+ export declare function computeContentHash(content: string): string;
86
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/store/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;AAE3E,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,UAAU;IAYnB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IAZf,OAAO,CAAC,MAAM,CAQZ;gBAGQ,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,YAAY;IAG7B,qCAAqC;IACrC,QAAQ,IAAI,SAAS;IAIrB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAyCjC;;;OAGG;YACW,WAAW;IA0DzB;;;OAGG;YACW,aAAa;IA6F3B;;;OAGG;YACW,eAAe;IAmC7B;;OAEG;IACG,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CA0DlD;AAED,8DAA8D;AAC9D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,293 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Sync engine implementing fork-on-conflict strategy.
4
+ * Zero data loss: conflicting entries are forked with parent_id linkage
5
+ * and a conflicts_with edge.
6
+ */
7
+ export class SyncEngine {
8
+ local;
9
+ cloud;
10
+ _stats = {
11
+ totalUploads: 0,
12
+ totalDownloads: 0,
13
+ totalConflicts: 0,
14
+ totalErrors: 0,
15
+ totalIntegrityErrors: 0,
16
+ lastSyncDurationMs: null,
17
+ lastSyncSuccessAt: null,
18
+ };
19
+ constructor(local, cloud) {
20
+ this.local = local;
21
+ this.cloud = cloud;
22
+ }
23
+ /** Get cumulative sync statistics */
24
+ getStats() {
25
+ return { ...this._stats };
26
+ }
27
+ /**
28
+ * Run a full sync cycle: push local changes, pull cloud changes, detect conflicts.
29
+ */
30
+ async sync() {
31
+ const result = { uploaded: 0, downloaded: 0, conflicts: 0, errors: [], integrityErrors: [] };
32
+ const startMs = Date.now();
33
+ try {
34
+ // Phase 1: Push pending local entries to cloud
35
+ const uploadResult = await this.pushPending();
36
+ result.uploaded = uploadResult.count;
37
+ result.errors.push(...uploadResult.errors);
38
+ // Phase 2: Pull new/updated entries from cloud
39
+ const downloadResult = await this.pullFromCloud();
40
+ result.downloaded = downloadResult.count;
41
+ result.conflicts = downloadResult.conflicts;
42
+ result.errors.push(...downloadResult.errors);
43
+ // Phase 3: Verify integrity of downloaded entries
44
+ if (downloadResult.downloadedIds.length > 0) {
45
+ const integrityErrors = await this.verifyIntegrity(downloadResult.downloadedIds);
46
+ result.integrityErrors = integrityErrors;
47
+ }
48
+ // Update cumulative stats
49
+ this._stats.totalUploads += result.uploaded;
50
+ this._stats.totalDownloads += result.downloaded;
51
+ this._stats.totalConflicts += result.conflicts;
52
+ this._stats.totalErrors += result.errors.length;
53
+ this._stats.totalIntegrityErrors += result.integrityErrors.length;
54
+ this._stats.lastSyncDurationMs = Date.now() - startMs;
55
+ if (result.errors.length === 0) {
56
+ this._stats.lastSyncSuccessAt = new Date().toISOString();
57
+ }
58
+ }
59
+ catch (err) {
60
+ result.errors.push(err instanceof Error ? err.message : String(err));
61
+ this._stats.totalErrors++;
62
+ this._stats.lastSyncDurationMs = Date.now() - startMs;
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Push locally-created entries that haven't been synced yet.
68
+ * Entries with sync_status='pending' are candidates for upload.
69
+ */
70
+ async pushPending() {
71
+ const errors = [];
72
+ let count = 0;
73
+ // Query local entries that need syncing
74
+ const { entries } = await this.local.query({ limit: 100 });
75
+ const pendingEntries = entries.filter((e) => e.sync_status === "pending" || !e.last_synced_at);
76
+ for (const entry of pendingEntries) {
77
+ try {
78
+ // Check if entry exists in cloud
79
+ const cloudEntry = await this.cloud.getById(entry.id);
80
+ if (cloudEntry) {
81
+ // Entry exists — check for conflict
82
+ const localUpdated = new Date(entry.updated_at).getTime();
83
+ const cloudUpdated = new Date(cloudEntry.updated_at).getTime();
84
+ if (cloudUpdated > localUpdated) {
85
+ // Cloud is newer — this will be handled in pull phase
86
+ continue;
87
+ }
88
+ if (cloudUpdated === localUpdated) {
89
+ // Same timestamp — skip (already in sync)
90
+ continue;
91
+ }
92
+ // Local is newer — push update
93
+ await this.cloud.update(entry.id, {
94
+ content: entry.content,
95
+ content_type: entry.content_type,
96
+ author: entry.author,
97
+ category: entry.category,
98
+ tags: entry.tags,
99
+ confidence: entry.confidence,
100
+ metadata: entry.metadata,
101
+ });
102
+ }
103
+ else {
104
+ // New entry — create in cloud
105
+ await this.cloud.create({
106
+ content: entry.content,
107
+ content_type: entry.content_type,
108
+ author: entry.author,
109
+ category: entry.category,
110
+ tags: entry.tags,
111
+ confidence: entry.confidence,
112
+ metadata: { ...entry.metadata, _sync_source_id: entry.id },
113
+ });
114
+ }
115
+ count++;
116
+ }
117
+ catch (err) {
118
+ errors.push(`Upload ${entry.id}: ${err instanceof Error ? err.message : String(err)}`);
119
+ }
120
+ }
121
+ return { count, errors };
122
+ }
123
+ /**
124
+ * Pull entries from cloud that are newer than local or don't exist locally.
125
+ * On conflict: fork the entry (create new with parent_id → original + conflicts_with edge).
126
+ */
127
+ async pullFromCloud() {
128
+ const errors = [];
129
+ let count = 0;
130
+ let conflicts = 0;
131
+ const downloadedIds = [];
132
+ const { entries: cloudEntries } = await this.cloud.query({ limit: 100 });
133
+ for (const cloudEntry of cloudEntries) {
134
+ try {
135
+ const localEntry = await this.local.getById(cloudEntry.id);
136
+ if (!localEntry) {
137
+ // New from cloud — create locally
138
+ const created = await this.local.create({
139
+ content: cloudEntry.content,
140
+ content_type: cloudEntry.content_type,
141
+ author: cloudEntry.author,
142
+ category: cloudEntry.category,
143
+ tags: cloudEntry.tags,
144
+ confidence: cloudEntry.confidence,
145
+ metadata: { ...cloudEntry.metadata, _sync_source: "cloud" },
146
+ });
147
+ downloadedIds.push(created.id);
148
+ count++;
149
+ continue;
150
+ }
151
+ const localUpdated = new Date(localEntry.updated_at).getTime();
152
+ const cloudUpdated = new Date(cloudEntry.updated_at).getTime();
153
+ if (cloudUpdated <= localUpdated) {
154
+ // Local is same or newer — skip
155
+ continue;
156
+ }
157
+ // Cloud is newer, but local may also have been modified
158
+ const syncable = localEntry;
159
+ const lastSynced = syncable.last_synced_at
160
+ ? new Date(syncable.last_synced_at).getTime()
161
+ : 0;
162
+ if (localUpdated > lastSynced && lastSynced > 0) {
163
+ // CONFLICT: both sides modified since last sync
164
+ // Fork strategy: create new entry with conflicts_with edge
165
+ const forkedEntry = await this.local.create({
166
+ content: cloudEntry.content,
167
+ content_type: cloudEntry.content_type,
168
+ author: cloudEntry.author,
169
+ category: cloudEntry.category,
170
+ tags: [...cloudEntry.tags, "sync-conflict"],
171
+ confidence: cloudEntry.confidence,
172
+ metadata: {
173
+ ...cloudEntry.metadata,
174
+ _sync_conflict: true,
175
+ _sync_original_id: localEntry.id,
176
+ _sync_cloud_updated_at: cloudEntry.updated_at,
177
+ },
178
+ });
179
+ // Create conflicts_with edge
180
+ await this.local.createEdge({
181
+ source_id: forkedEntry.id,
182
+ target_id: localEntry.id,
183
+ edge_type: "conflicts_with",
184
+ confidence: 1.0,
185
+ });
186
+ downloadedIds.push(forkedEntry.id);
187
+ conflicts++;
188
+ count++;
189
+ }
190
+ else {
191
+ // No conflict — cloud is simply newer, update local
192
+ await this.local.update(localEntry.id, {
193
+ content: cloudEntry.content,
194
+ content_type: cloudEntry.content_type,
195
+ author: cloudEntry.author,
196
+ category: cloudEntry.category,
197
+ tags: cloudEntry.tags,
198
+ confidence: cloudEntry.confidence,
199
+ metadata: cloudEntry.metadata,
200
+ });
201
+ downloadedIds.push(localEntry.id);
202
+ count++;
203
+ }
204
+ }
205
+ catch (err) {
206
+ errors.push(`Download ${cloudEntry.id}: ${err instanceof Error ? err.message : String(err)}`);
207
+ }
208
+ }
209
+ return { count, conflicts, errors, downloadedIds };
210
+ }
211
+ /**
212
+ * Verify integrity of downloaded entries by comparing content hashes.
213
+ * Logs mismatches to sync_log via the local store.
214
+ */
215
+ async verifyIntegrity(downloadedIds) {
216
+ const errors = [];
217
+ for (const id of downloadedIds) {
218
+ try {
219
+ const localEntry = await this.local.getById(id);
220
+ if (!localEntry)
221
+ continue;
222
+ const expectedHash = computeContentHash(localEntry.content);
223
+ // Re-fetch from local to confirm write integrity
224
+ const refetched = await this.local.getById(id);
225
+ if (!refetched)
226
+ continue;
227
+ const actualHash = computeContentHash(refetched.content);
228
+ if (expectedHash !== actualHash) {
229
+ errors.push({ entryId: id, expected: expectedHash, actual: actualHash });
230
+ // Log to sync_log if the store supports it
231
+ if ("logSyncAction" in this.local) {
232
+ this.local.logSyncAction(id, "integrity_error", `Hash mismatch: expected=${expectedHash} actual=${actualHash}`);
233
+ }
234
+ }
235
+ }
236
+ catch {
237
+ // Non-fatal: skip verification for this entry
238
+ }
239
+ }
240
+ return errors;
241
+ }
242
+ /**
243
+ * Resolve a sync conflict.
244
+ */
245
+ async resolveConflict(entryId, resolution) {
246
+ const entry = await this.local.getById(entryId);
247
+ if (!entry) {
248
+ return { resolved: false, kept: [] };
249
+ }
250
+ const metadata = entry.metadata;
251
+ const originalId = metadata._sync_original_id;
252
+ if (!originalId) {
253
+ return { resolved: false, kept: [] };
254
+ }
255
+ const original = await this.local.getById(originalId);
256
+ if (!original) {
257
+ return { resolved: false, kept: [] };
258
+ }
259
+ switch (resolution) {
260
+ case "keep_local":
261
+ // Delete the forked cloud entry
262
+ await this.local.delete(entryId);
263
+ return { resolved: true, kept: [originalId] };
264
+ case "keep_cloud":
265
+ // Replace original with cloud content, delete fork
266
+ await this.local.update(originalId, {
267
+ content: entry.content,
268
+ content_type: entry.content_type,
269
+ author: entry.author,
270
+ category: entry.category,
271
+ tags: entry.tags.filter(t => t !== "sync-conflict"),
272
+ confidence: entry.confidence,
273
+ metadata: Object.fromEntries(Object.entries(entry.metadata).filter(([k]) => !k.startsWith("_sync_"))),
274
+ });
275
+ await this.local.delete(entryId);
276
+ return { resolved: true, kept: [originalId] };
277
+ case "keep_both":
278
+ // Just remove conflict metadata — both entries stay
279
+ await this.local.update(entryId, {
280
+ tags: entry.tags.filter(t => t !== "sync-conflict"),
281
+ metadata: Object.fromEntries(Object.entries(entry.metadata).filter(([k]) => !k.startsWith("_sync_"))),
282
+ });
283
+ return { resolved: true, kept: [originalId, entryId] };
284
+ default:
285
+ return { resolved: false, kept: [] };
286
+ }
287
+ }
288
+ }
289
+ /** Compute SHA-256 content hash for integrity verification */
290
+ export function computeContentHash(content) {
291
+ return createHash("sha256").update(content, "utf8").digest("hex");
292
+ }
293
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/store/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Consciousness & Self-Healing MCP Tools — Epoch 25
3
+ *
4
+ * Academic ref: "Tool Use in Large Language Models: A Survey" (Qin et al., 2024).
5
+ *
6
+ * Provides MCP tools for:
7
+ * - get_consciousness_trend: Historical consciousness score analysis
8
+ * - suggest_connections: Find potential graph connections for an entry
9
+ * - search_with_context: Graph-enriched search (search + connected entries)
10
+ */
11
+ import type { StoreAdapter } from "../store/adapter.js";
12
+ /**
13
+ * Fetch consciousness trend from Brain API (cloud mode only).
14
+ * Wraps GET /health/vitals/history.
15
+ */
16
+ export declare function getConsciousnessTrend(store: StoreAdapter, args: Record<string, unknown>): Promise<unknown>;
17
+ /**
18
+ * Suggest potential connections for an entry by finding similar entries.
19
+ * Wraps the graph enrichment discovery logic.
20
+ */
21
+ export declare function suggestConnections(store: StoreAdapter, args: Record<string, unknown>): Promise<unknown>;
22
+ /**
23
+ * Search with context: combines search results with graph-connected entries.
24
+ * Returns search results enriched with their graph neighbors.
25
+ */
26
+ export declare function searchWithContext(store: StoreAdapter, args: Record<string, unknown>): Promise<unknown>;
27
+ //# sourceMappingURL=consciousness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consciousness.d.ts","sourceRoot":"","sources":["../../src/tools/consciousness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CAqDlB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,CAAC,CA+DlB"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Fetch consciousness trend from Brain API (cloud mode only).
3
+ * Wraps GET /health/vitals/history.
4
+ */
5
+ export async function getConsciousnessTrend(store, args) {
6
+ if (store.mode !== "cloud") {
7
+ return { error: "Consciousness trend requires cloud mode" };
8
+ }
9
+ const period = args.period || "7d";
10
+ const validPeriods = ["1d", "7d", "30d", "90d"];
11
+ if (!validPeriods.includes(period)) {
12
+ return { error: `Invalid period. Use one of: ${validPeriods.join(", ")}` };
13
+ }
14
+ try {
15
+ // Use the store's HTTP client to fetch vitals history
16
+ const httpStore = store;
17
+ const client = httpStore.client;
18
+ if (client && typeof client.http === "function") {
19
+ const resp = await client.http(`/health/vitals/history?period=${period}`);
20
+ return resp.data;
21
+ }
22
+ // Fallback: return instruction to use direct API
23
+ return {
24
+ info: `Use GET /health/vitals/history?period=${period} to retrieve consciousness trend.`,
25
+ period,
26
+ };
27
+ }
28
+ catch {
29
+ return {
30
+ info: `Use GET /health/vitals/history?period=${period} to retrieve consciousness trend.`,
31
+ period,
32
+ };
33
+ }
34
+ }
35
+ /**
36
+ * Suggest potential connections for an entry by finding similar entries.
37
+ * Wraps the graph enrichment discovery logic.
38
+ */
39
+ export async function suggestConnections(store, args) {
40
+ const entryId = args.entry_id;
41
+ if (!entryId) {
42
+ return { error: "entry_id is required" };
43
+ }
44
+ const limit = Math.min(Math.max(Number(args.limit) || 5, 1), 20);
45
+ try {
46
+ // Get the entry's graph to see existing connections
47
+ const graph = await store.traverseGraph(entryId, 1);
48
+ // Query for similar entries via the store
49
+ const entry = await store.getById(entryId);
50
+ if (!entry) {
51
+ return { error: "Entry not found" };
52
+ }
53
+ // Find entries in the same category that aren't already connected
54
+ const connectedIds = new Set();
55
+ if (graph && typeof graph === "object" && "nodes" in graph) {
56
+ const nodes = graph.nodes;
57
+ for (const node of nodes) {
58
+ connectedIds.add(node.entry.id);
59
+ }
60
+ }
61
+ // Search for similar content
62
+ const similar = await store.query({
63
+ q: entry.content.slice(0, 200),
64
+ category: entry.category,
65
+ limit: limit + connectedIds.size,
66
+ });
67
+ const suggestions = similar.entries
68
+ .filter((e) => !connectedIds.has(e.id) && e.id !== entryId)
69
+ .slice(0, limit)
70
+ .map((e) => ({
71
+ id: e.id,
72
+ category: e.category,
73
+ content_preview: e.content.slice(0, 150),
74
+ confidence: e.confidence,
75
+ suggested_edge_type: inferEdgeType(entry.category, e.category),
76
+ }));
77
+ return {
78
+ entry_id: entryId,
79
+ existing_connections: connectedIds.size - 1, // exclude self
80
+ suggestions,
81
+ };
82
+ }
83
+ catch (error) {
84
+ return { error: `Failed to suggest connections: ${error instanceof Error ? error.message : String(error)}` };
85
+ }
86
+ }
87
+ /**
88
+ * Search with context: combines search results with graph-connected entries.
89
+ * Returns search results enriched with their graph neighbors.
90
+ */
91
+ export async function searchWithContext(store, args) {
92
+ const q = args.q;
93
+ if (!q) {
94
+ return { error: "q (search query) is required" };
95
+ }
96
+ const limit = Math.min(Math.max(Number(args.limit) || 5, 1), 20);
97
+ const graphDepth = Math.min(Math.max(Number(args.graph_depth) || 1, 0), 2);
98
+ try {
99
+ // Step 1: Search
100
+ const searchResults = await store.query({ q, limit });
101
+ if (searchResults.entries.length === 0) {
102
+ return { results: [], total: 0, context_entries: 0 };
103
+ }
104
+ // Step 2: Get graph context for top results (up to 3)
105
+ const topEntries = searchResults.entries.slice(0, 3);
106
+ const contextEntries = new Map();
107
+ if (graphDepth > 0) {
108
+ for (const entry of topEntries) {
109
+ try {
110
+ const graph = await store.traverseGraph(entry.id, graphDepth);
111
+ if (graph && typeof graph === "object" && "nodes" in graph) {
112
+ const nodes = graph.nodes;
113
+ for (const node of nodes) {
114
+ if (node.depth > 0 && !searchResults.entries.some((e) => e.id === node.entry.id)) {
115
+ contextEntries.set(node.entry.id, {
116
+ content_preview: node.entry.content.slice(0, 150),
117
+ category: node.entry.category,
118
+ relation: `connected to "${entry.content.slice(0, 50)}..."`,
119
+ });
120
+ }
121
+ }
122
+ }
123
+ }
124
+ catch {
125
+ // Skip graph traversal errors for individual entries
126
+ }
127
+ }
128
+ }
129
+ // Step 3: Truncate results for token efficiency
130
+ const results = searchResults.entries.map((e) => ({
131
+ id: e.id,
132
+ content: e.content.slice(0, 500),
133
+ category: e.category,
134
+ confidence: e.confidence,
135
+ tags: e.tags,
136
+ }));
137
+ return {
138
+ results,
139
+ total: searchResults.total,
140
+ context_entries: Array.from(contextEntries.entries()).map(([id, ctx]) => ({
141
+ id,
142
+ ...ctx,
143
+ })),
144
+ };
145
+ }
146
+ catch (error) {
147
+ return { error: `Search failed: ${error instanceof Error ? error.message : String(error)}` };
148
+ }
149
+ }
150
+ /** Simple edge type inference for suggestions. */
151
+ function inferEdgeType(sourceCategory, targetCategory) {
152
+ if (sourceCategory === targetCategory)
153
+ return "related_to";
154
+ const map = {
155
+ "pattern→decision": "derives_from",
156
+ "decision→pattern": "implements",
157
+ "security→pattern": "validates",
158
+ "code→pattern": "implements",
159
+ "documentation→code": "documents",
160
+ };
161
+ return map[`${sourceCategory}→${targetCategory}`] || "related_to";
162
+ }
163
+ //# sourceMappingURL=consciousness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consciousness.js","sourceRoot":"","sources":["../../src/tools/consciousness.ts"],"names":[],"mappings":"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"}