memento-mcp-server 1.11.0 → 1.11.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 (75) hide show
  1. package/README.md +7 -0
  2. package/dist/server/context.d.ts +36 -0
  3. package/dist/server/context.d.ts.map +1 -0
  4. package/dist/server/context.js +45 -0
  5. package/dist/server/context.js.map +1 -0
  6. package/dist/server/handlers/anchor-map.handler.d.ts +60 -0
  7. package/dist/server/handlers/anchor-map.handler.d.ts.map +1 -0
  8. package/dist/server/handlers/anchor-map.handler.js +190 -0
  9. package/dist/server/handlers/anchor-map.handler.js.map +1 -0
  10. package/dist/server/http-server.d.ts.map +1 -1
  11. package/dist/server/http-server.js +41 -1131
  12. package/dist/server/http-server.js.map +1 -1
  13. package/dist/server/middleware/error-handler.middleware.d.ts +25 -0
  14. package/dist/server/middleware/error-handler.middleware.d.ts.map +1 -0
  15. package/dist/server/middleware/error-handler.middleware.js +97 -0
  16. package/dist/server/middleware/error-handler.middleware.js.map +1 -0
  17. package/dist/server/middleware/index.d.ts +8 -0
  18. package/dist/server/middleware/index.d.ts.map +1 -0
  19. package/dist/server/middleware/index.js +8 -0
  20. package/dist/server/middleware/index.js.map +1 -0
  21. package/dist/server/middleware/service-injector.middleware.d.ts +30 -0
  22. package/dist/server/middleware/service-injector.middleware.d.ts.map +1 -0
  23. package/dist/server/middleware/service-injector.middleware.js +20 -0
  24. package/dist/server/middleware/service-injector.middleware.js.map +1 -0
  25. package/dist/server/middleware/tool-context.middleware.d.ts +29 -0
  26. package/dist/server/middleware/tool-context.middleware.d.ts.map +1 -0
  27. package/dist/server/middleware/tool-context.middleware.js +34 -0
  28. package/dist/server/middleware/tool-context.middleware.js.map +1 -0
  29. package/dist/server/routes/admin.routes.d.ts +12 -0
  30. package/dist/server/routes/admin.routes.d.ts.map +1 -0
  31. package/dist/server/routes/admin.routes.js +338 -0
  32. package/dist/server/routes/admin.routes.js.map +1 -0
  33. package/dist/server/routes/api.routes.d.ts +13 -0
  34. package/dist/server/routes/api.routes.d.ts.map +1 -0
  35. package/dist/server/routes/api.routes.js +122 -0
  36. package/dist/server/routes/api.routes.js.map +1 -0
  37. package/dist/server/routes/mcp.routes.d.ts +22 -0
  38. package/dist/server/routes/mcp.routes.d.ts.map +1 -0
  39. package/dist/server/routes/mcp.routes.js +383 -0
  40. package/dist/server/routes/mcp.routes.js.map +1 -0
  41. package/dist/server/routes/tools.routes.d.ts +13 -0
  42. package/dist/server/routes/tools.routes.d.ts.map +1 -0
  43. package/dist/server/routes/tools.routes.js +99 -0
  44. package/dist/server/routes/tools.routes.js.map +1 -0
  45. package/dist/services/anchor/anchor-cache-service.d.ts +77 -0
  46. package/dist/services/anchor/anchor-cache-service.d.ts.map +1 -0
  47. package/dist/services/anchor/anchor-cache-service.js +193 -0
  48. package/dist/services/anchor/anchor-cache-service.js.map +1 -0
  49. package/dist/services/anchor/anchor-interfaces.d.ts +143 -0
  50. package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -0
  51. package/dist/services/anchor/anchor-interfaces.js +24 -0
  52. package/dist/services/anchor/anchor-interfaces.js.map +1 -0
  53. package/dist/services/anchor/anchor-manager.d.ts +71 -0
  54. package/dist/services/anchor/anchor-manager.d.ts.map +1 -0
  55. package/dist/services/anchor/anchor-manager.js +205 -0
  56. package/dist/services/anchor/anchor-manager.js.map +1 -0
  57. package/dist/services/anchor/anchor-search-service.d.ts +115 -0
  58. package/dist/services/anchor/anchor-search-service.d.ts.map +1 -0
  59. package/dist/services/anchor/anchor-search-service.js +799 -0
  60. package/dist/services/anchor/anchor-search-service.js.map +1 -0
  61. package/dist/services/anchor/index.d.ts +11 -0
  62. package/dist/services/anchor/index.d.ts.map +1 -0
  63. package/dist/services/anchor/index.js +10 -0
  64. package/dist/services/anchor/index.js.map +1 -0
  65. package/dist/services/anchor-manager.d.ts +22 -208
  66. package/dist/services/anchor-manager.d.ts.map +1 -1
  67. package/dist/services/anchor-manager.js +72 -1088
  68. package/dist/services/anchor-manager.js.map +1 -1
  69. package/dist/services/error-logging-service.d.ts +1 -0
  70. package/dist/services/error-logging-service.d.ts.map +1 -1
  71. package/dist/services/error-logging-service.js +2 -0
  72. package/dist/services/error-logging-service.js.map +1 -1
  73. package/dist/tools/forget-tool.js +1 -1
  74. package/dist/tools/forget-tool.js.map +1 -1
  75. package/package.json +3 -1
package/README.md CHANGED
@@ -277,6 +277,7 @@ const results = await client.callTool({
277
277
  - [성능 벤치마크](docs/ko/embedding-performance-benchmark.md) - 성능 비교 결과
278
278
  - [API 레퍼런스](docs/ko/embedding-api-reference.md) - API 상세 문서
279
279
  - [설정 가이드](docs/ko/embedding-configuration.md) - 환경 설정 방법
280
+ - [Consolidation Score 테스트 가이드](docs/testing/consolidation-quality-testing.md) - Consolidation Score 검색 품질 테스트 가이드
280
281
 
281
282
  ## 📋 API 문서
282
283
 
@@ -323,6 +324,10 @@ const results = await client.callTool({
323
324
  | `DB_PATH` | ./data/memory.db | 데이터베이스 경로 |
324
325
  | `LOG_LEVEL` | info | 로그 레벨 |
325
326
  | `OPENAI_API_KEY` | - | OpenAI API 키 (선택사항) |
327
+ | `CONSOLIDATION_SCORE_ENABLED` | false | Consolidation Score System 활성화 여부 |
328
+ | `CONSOLIDATION_TEST_SEED_PATH` | ./data/consolidation-seed.json | 테스트 Seed 데이터 파일 경로 |
329
+ | `CONSOLIDATION_BASELINE_PATH` | ./data/consolidation-baseline.json | Baseline 스냅샷 저장 경로 |
330
+ | `CONSOLIDATION_TEST_ITEM_COUNT` | 100 | 벤치마크 테스트 데이터 크기 |
326
331
 
327
332
  ### 망각 정책 설정
328
333
 
@@ -355,6 +360,8 @@ npm run test:performance # 성능 벤치마크
355
360
  npm run test:monitoring # 성능 모니터링 테스트
356
361
  npm run test:error-logging # 에러 로깅 테스트
357
362
  npm run test:performance-alerts # 성능 알림 테스트
363
+ npm run test:consolidation-quality # Consolidation Score 품질 검증 테스트
364
+ npm run benchmark:consolidation-quality # Consolidation Score 벤치마크 테스트
358
365
 
359
366
  # 테스트 감시 모드
360
367
  npm run test -- --watch
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 서버 컨텍스트 모듈
3
+ * 공통 서비스 접근 및 컨텍스트 관리를 위한 모듈
4
+ * Phase 0: 공통 모듈 설계
5
+ */
6
+ import type Database from 'better-sqlite3';
7
+ import type { ServerServices } from './bootstrap.js';
8
+ import type { ToolContext } from '../tools/types.js';
9
+ /**
10
+ * 서버 컨텍스트 인터페이스
11
+ * 서버에서 공통으로 사용하는 서비스 및 데이터베이스 접근
12
+ */
13
+ export interface ServerContext {
14
+ /** 데이터베이스 인스턴스 */
15
+ db: Database.Database;
16
+ /** 초기화된 서비스 집합 */
17
+ services: ServerServices;
18
+ }
19
+ /**
20
+ * 서버 컨텍스트 생성 함수
21
+ *
22
+ * @param db 데이터베이스 인스턴스
23
+ * @param services 초기화된 서비스 집합
24
+ * @returns 서버 컨텍스트
25
+ */
26
+ export declare function createServerContext(db: Database.Database, services: ServerServices): ServerContext;
27
+ /**
28
+ * ToolContext 생성 함수
29
+ * ServerServices를 기반으로 ToolContext 생성
30
+ * Phase 5.1과 통합: ToolContext 생성 팩토리
31
+ *
32
+ * @param serverContext 서버 컨텍스트
33
+ * @returns ToolContext
34
+ */
35
+ export declare function createToolContext(serverContext: ServerContext): ToolContext;
36
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,kBAAkB;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,cAAc,GACvB,aAAa,CAKf;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,aAAa,GAAG,WAAW,CAiB3E"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 서버 컨텍스트 모듈
3
+ * 공통 서비스 접근 및 컨텍스트 관리를 위한 모듈
4
+ * Phase 0: 공통 모듈 설계
5
+ */
6
+ /**
7
+ * 서버 컨텍스트 생성 함수
8
+ *
9
+ * @param db 데이터베이스 인스턴스
10
+ * @param services 초기화된 서비스 집합
11
+ * @returns 서버 컨텍스트
12
+ */
13
+ export function createServerContext(db, services) {
14
+ return {
15
+ db,
16
+ services
17
+ };
18
+ }
19
+ /**
20
+ * ToolContext 생성 함수
21
+ * ServerServices를 기반으로 ToolContext 생성
22
+ * Phase 5.1과 통합: ToolContext 생성 팩토리
23
+ *
24
+ * @param serverContext 서버 컨텍스트
25
+ * @returns ToolContext
26
+ */
27
+ export function createToolContext(serverContext) {
28
+ return {
29
+ db: serverContext.db,
30
+ services: {
31
+ searchEngine: serverContext.services.searchEngine,
32
+ hybridSearchEngine: serverContext.services.hybridSearchEngine,
33
+ embeddingService: serverContext.services.embeddingService,
34
+ forgettingPolicyService: serverContext.services.forgettingPolicyService,
35
+ performanceMonitor: serverContext.services.performanceMonitor,
36
+ databaseOptimizer: serverContext.services.databaseOptimizer,
37
+ errorLoggingService: serverContext.services.errorLoggingService,
38
+ performanceAlertService: serverContext.services.performanceAlertService,
39
+ consolidationScoreService: serverContext.services.consolidationScoreService,
40
+ writeCoalescingManager: serverContext.services.writeCoalescingManager,
41
+ anchorManager: serverContext.services.anchorManager
42
+ }
43
+ };
44
+ }
45
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,EAAqB,EACrB,QAAwB;IAExB,OAAO;QACL,EAAE;QACF,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,aAA4B;IAC5D,OAAO;QACL,EAAE,EAAE,aAAa,CAAC,EAAE;QACpB,QAAQ,EAAE;YACR,YAAY,EAAE,aAAa,CAAC,QAAQ,CAAC,YAAY;YACjD,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC,kBAAkB;YAC7D,gBAAgB,EAAE,aAAa,CAAC,QAAQ,CAAC,gBAAgB;YACzD,uBAAuB,EAAE,aAAa,CAAC,QAAQ,CAAC,uBAAuB;YACvE,kBAAkB,EAAE,aAAa,CAAC,QAAQ,CAAC,kBAAkB;YAC7D,iBAAiB,EAAE,aAAa,CAAC,QAAQ,CAAC,iBAAiB;YAC3D,mBAAmB,EAAE,aAAa,CAAC,QAAQ,CAAC,mBAAmB;YAC/D,uBAAuB,EAAE,aAAa,CAAC,QAAQ,CAAC,uBAAuB;YACvE,yBAAyB,EAAE,aAAa,CAAC,QAAQ,CAAC,yBAAyB;YAC3E,sBAAsB,EAAE,aAAa,CAAC,QAAQ,CAAC,sBAAsB;YACrE,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa;SACpD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Anchor Map 핸들러
3
+ * Anchor Map 데이터 생성 및 브로드캐스트 로직
4
+ * Phase 1.2: http-server.ts 리팩토링
5
+ */
6
+ import type Database from 'better-sqlite3';
7
+ import type { ServerServices } from '../bootstrap.js';
8
+ import type { WebSocket } from 'ws';
9
+ /**
10
+ * Anchor Map 노드 타입
11
+ */
12
+ export interface AnchorMapNode {
13
+ id: string;
14
+ type: 'anchor' | 'memory';
15
+ slot?: string;
16
+ content: string;
17
+ hop_distance?: number;
18
+ similarity?: number;
19
+ importance?: number;
20
+ created_at?: string;
21
+ }
22
+ /**
23
+ * Anchor Map 링크 타입
24
+ */
25
+ export interface AnchorMapLink {
26
+ source: string;
27
+ target: string;
28
+ type: 'anchor' | 'hop' | 'link';
29
+ hop_distance?: number;
30
+ similarity?: number;
31
+ }
32
+ /**
33
+ * Anchor Map 데이터 타입
34
+ */
35
+ export interface AnchorMapData {
36
+ agent_id: string;
37
+ anchors: Array<{
38
+ agent_id: string;
39
+ slot: string;
40
+ memory_id: string | null;
41
+ created_at: string;
42
+ updated_at: string;
43
+ }>;
44
+ nodes: AnchorMapNode[];
45
+ links: AnchorMapLink[];
46
+ timestamp: string;
47
+ }
48
+ /**
49
+ * Anchor Map 데이터 생성
50
+ */
51
+ export declare function buildAnchorMapData(db: Database.Database, serverServices: ServerServices, agentId: string): Promise<AnchorMapData>;
52
+ /**
53
+ * WebSocket 구독자에게 브로드캐스트
54
+ */
55
+ export declare function broadcastToSubscribers(subscribers: Set<WebSocket>, updateData: AnchorMapData): void;
56
+ /**
57
+ * Anchor Map 업데이트 브로드캐스트
58
+ */
59
+ export declare function broadcastAnchorMapUpdate(db: Database.Database | null, serverServices: ServerServices | null, anchorMapSubscribers: Map<string, Set<WebSocket>>, agentId: string): Promise<void>;
60
+ //# sourceMappingURL=anchor-map.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-map.handler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/anchor-map.handler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC,CAmCxB;AAsJD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,EAC3B,UAAU,EAAE,aAAa,GACxB,IAAI,CAeN;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAC5B,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,EACjD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Anchor Map 핸들러
3
+ * Anchor Map 데이터 생성 및 브로드캐스트 로직
4
+ * Phase 1.2: http-server.ts 리팩토링
5
+ */
6
+ import { logger } from '../../utils/logger.js';
7
+ /**
8
+ * Anchor Map 데이터 생성
9
+ */
10
+ export async function buildAnchorMapData(db, serverServices, agentId) {
11
+ const anchorManager = serverServices.anchorManager;
12
+ if (!anchorManager) {
13
+ throw new Error('AnchorManager not available');
14
+ }
15
+ // 앵커 정보 조회
16
+ const anchors = await anchorManager.getAnchor(agentId);
17
+ if (!anchors || (Array.isArray(anchors) && anchors.length === 0)) {
18
+ return {
19
+ agent_id: agentId,
20
+ anchors: [],
21
+ nodes: [],
22
+ links: [],
23
+ timestamp: new Date().toISOString()
24
+ };
25
+ }
26
+ const anchorList = Array.isArray(anchors) ? anchors : [anchors];
27
+ // 네트워크 노드 및 링크 생성
28
+ const { nodes, links } = await buildNetworkNodesAndLinks(db, anchorManager, agentId, anchorList);
29
+ return {
30
+ agent_id: agentId,
31
+ anchors: anchorList,
32
+ nodes,
33
+ links,
34
+ timestamp: new Date().toISOString()
35
+ };
36
+ }
37
+ /**
38
+ * 네트워크 노드 및 링크 생성
39
+ */
40
+ async function buildNetworkNodesAndLinks(db, anchorManager, agentId, anchorList) {
41
+ const nodes = [];
42
+ const links = [];
43
+ const processedMemoryIds = new Set();
44
+ // 각 앵커에 대해 처리
45
+ for (const anchor of anchorList) {
46
+ if (!anchor.memory_id)
47
+ continue;
48
+ // 앵커 노드 추가
49
+ const anchorMemory = db.prepare(`
50
+ SELECT id, content, type, importance, created_at
51
+ FROM memory_item
52
+ WHERE id = ?
53
+ `).get(anchor.memory_id);
54
+ if (anchorMemory) {
55
+ nodes.push({
56
+ id: anchor.memory_id,
57
+ type: 'anchor',
58
+ slot: anchor.slot,
59
+ content: anchorMemory.content.substring(0, 100),
60
+ importance: anchorMemory.importance,
61
+ created_at: anchorMemory.created_at
62
+ });
63
+ processedMemoryIds.add(anchor.memory_id);
64
+ // 앵커 주변 메모리 검색
65
+ try {
66
+ const slotConfig = anchorManager.getSlotConfig(anchor.slot);
67
+ const searchResult = await anchorManager.searchLocal(agentId, anchor.slot, undefined, slotConfig.hop_limit, { limit: 50 });
68
+ // 검색 결과를 노드와 링크로 변환
69
+ for (const item of searchResult.items) {
70
+ if (processedMemoryIds.has(item.id))
71
+ continue;
72
+ nodes.push({
73
+ id: item.id,
74
+ type: 'memory',
75
+ content: item.content.substring(0, 100),
76
+ hop_distance: item.hop_distance || 0,
77
+ similarity: item.similarity,
78
+ importance: item.importance,
79
+ created_at: item.created_at
80
+ });
81
+ processedMemoryIds.add(item.id);
82
+ // 링크 추가 (앵커에서 메모리로)
83
+ if (item.hop_distance === 1) {
84
+ links.push({
85
+ source: anchor.memory_id,
86
+ target: item.id,
87
+ type: 'hop',
88
+ hop_distance: 1,
89
+ similarity: item.similarity
90
+ });
91
+ }
92
+ }
93
+ }
94
+ catch (error) {
95
+ logger.error('Anchor search failed', {
96
+ slot: anchor.slot,
97
+ error: error instanceof Error ? error.message : String(error)
98
+ });
99
+ }
100
+ }
101
+ }
102
+ // memory_link 테이블을 활용한 직접 연결 정보 추가
103
+ const memoryLinks = buildNetworkLinks(db, nodes, processedMemoryIds);
104
+ links.push(...memoryLinks);
105
+ return { nodes, links };
106
+ }
107
+ /**
108
+ * memory_link 테이블을 활용한 네트워크 링크 생성
109
+ */
110
+ function buildNetworkLinks(db, nodes, processedMemoryIds) {
111
+ const links = [];
112
+ for (const node of nodes) {
113
+ if (node.type === 'anchor')
114
+ continue;
115
+ // memory_link 테이블 조회
116
+ const linkedMemories = db.prepare(`
117
+ SELECT target_id, relation_type, created_at
118
+ FROM memory_link
119
+ WHERE source_id = ?
120
+ UNION
121
+ SELECT source_id, relation_type, created_at
122
+ FROM memory_link
123
+ WHERE target_id = ?
124
+ `).all(node.id, node.id);
125
+ for (const link of linkedMemories) {
126
+ const linkedId = link.target_id || link.source_id;
127
+ if (linkedId && processedMemoryIds.has(linkedId)) {
128
+ // relation_type을 기반으로 similarity 추정
129
+ const similarity = link.relation_type === 'derived_from' ? 0.9 :
130
+ link.relation_type === 'cause_of' ? 0.8 : 0.7;
131
+ links.push({
132
+ source: node.id,
133
+ target: linkedId,
134
+ type: 'link',
135
+ similarity: similarity
136
+ });
137
+ }
138
+ }
139
+ }
140
+ return links;
141
+ }
142
+ /**
143
+ * WebSocket 구독자에게 브로드캐스트
144
+ */
145
+ export function broadcastToSubscribers(subscribers, updateData) {
146
+ for (const ws of subscribers) {
147
+ if (ws.readyState === 1) { // WebSocket.OPEN
148
+ try {
149
+ ws.send(JSON.stringify({
150
+ type: 'anchor_map_update',
151
+ data: updateData
152
+ }));
153
+ }
154
+ catch (error) {
155
+ logger.error('WebSocket broadcast failed', {
156
+ error: error instanceof Error ? error.message : String(error)
157
+ });
158
+ }
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Anchor Map 업데이트 브로드캐스트
164
+ */
165
+ export async function broadcastAnchorMapUpdate(db, serverServices, anchorMapSubscribers, agentId) {
166
+ if (!anchorMapSubscribers.has(agentId) || anchorMapSubscribers.get(agentId).size === 0) {
167
+ return; // 구독자가 없으면 브로드캐스트하지 않음
168
+ }
169
+ try {
170
+ if (!db || !serverServices || !serverServices.anchorManager) {
171
+ return;
172
+ }
173
+ // Anchor Map 데이터 생성
174
+ const updateData = await buildAnchorMapData(db, serverServices, agentId);
175
+ // 구독자에게 브로드캐스트
176
+ const subscribers = anchorMapSubscribers.get(agentId);
177
+ broadcastToSubscribers(subscribers, updateData);
178
+ logger.info('Anchor Map update broadcasted', {
179
+ agentId,
180
+ subscriberCount: subscribers.size
181
+ });
182
+ }
183
+ catch (error) {
184
+ logger.error('Anchor Map broadcast failed', {
185
+ agentId,
186
+ error: error instanceof Error ? error.message : String(error)
187
+ });
188
+ }
189
+ }
190
+ //# sourceMappingURL=anchor-map.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-map.handler.js","sourceRoot":"","sources":["../../../src/server/handlers/anchor-map.handler.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAO9B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAG3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AASjF,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAmBtC,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C,CAAC;AAk3CF,iBAAe,OAAO,kBA4BrB;AAwJD,iBAAe,WAAW,kBAmCzB;AAUD,eAAO,MAAM,MAAM,EAAE;IACnB,mBAAmB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,WAAW,EAAE,MAAM,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAChD,qBAAqB,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAC;IAC5D,mBAAmB,EAAE,MAAM,sBAAsB,GAAG,SAAS,CAAC;CAS/D,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAO9B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAG3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AASjF,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AA+BtC,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC5B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C,CAAC;AAyJF,iBAAe,OAAO,kBA4BrB;AAuJD,iBAAe,WAAW,kBAmCzB;AAUD,eAAO,MAAM,MAAM,EAAE;IACnB,mBAAmB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACtD,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC;IAClC,SAAS,EAAE,MAAM,GAAG,CAAC;IACrB,WAAW,EAAE,MAAM,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,YAAY,GAAG,SAAS,CAAC;IAChD,qBAAqB,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAC;IAC5D,mBAAmB,EAAE,MAAM,sBAAsB,GAAG,SAAS,CAAC;CAS/D,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC"}