memento-mcp-server 1.11.0-a1 → 1.11.1-a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/server/context.d.ts +36 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +45 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/handlers/anchor-map.handler.d.ts +60 -0
- package/dist/server/handlers/anchor-map.handler.d.ts.map +1 -0
- package/dist/server/handlers/anchor-map.handler.js +190 -0
- package/dist/server/handlers/anchor-map.handler.js.map +1 -0
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +41 -1131
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/middleware/error-handler.middleware.d.ts +25 -0
- package/dist/server/middleware/error-handler.middleware.d.ts.map +1 -0
- package/dist/server/middleware/error-handler.middleware.js +97 -0
- package/dist/server/middleware/error-handler.middleware.js.map +1 -0
- package/dist/server/middleware/index.d.ts +8 -0
- package/dist/server/middleware/index.d.ts.map +1 -0
- package/dist/server/middleware/index.js +8 -0
- package/dist/server/middleware/index.js.map +1 -0
- package/dist/server/middleware/service-injector.middleware.d.ts +30 -0
- package/dist/server/middleware/service-injector.middleware.d.ts.map +1 -0
- package/dist/server/middleware/service-injector.middleware.js +20 -0
- package/dist/server/middleware/service-injector.middleware.js.map +1 -0
- package/dist/server/middleware/tool-context.middleware.d.ts +29 -0
- package/dist/server/middleware/tool-context.middleware.d.ts.map +1 -0
- package/dist/server/middleware/tool-context.middleware.js +34 -0
- package/dist/server/middleware/tool-context.middleware.js.map +1 -0
- package/dist/server/routes/admin.routes.d.ts +12 -0
- package/dist/server/routes/admin.routes.d.ts.map +1 -0
- package/dist/server/routes/admin.routes.js +338 -0
- package/dist/server/routes/admin.routes.js.map +1 -0
- package/dist/server/routes/api.routes.d.ts +13 -0
- package/dist/server/routes/api.routes.d.ts.map +1 -0
- package/dist/server/routes/api.routes.js +122 -0
- package/dist/server/routes/api.routes.js.map +1 -0
- package/dist/server/routes/mcp.routes.d.ts +22 -0
- package/dist/server/routes/mcp.routes.d.ts.map +1 -0
- package/dist/server/routes/mcp.routes.js +383 -0
- package/dist/server/routes/mcp.routes.js.map +1 -0
- package/dist/server/routes/tools.routes.d.ts +13 -0
- package/dist/server/routes/tools.routes.d.ts.map +1 -0
- package/dist/server/routes/tools.routes.js +99 -0
- package/dist/server/routes/tools.routes.js.map +1 -0
- package/dist/services/anchor/anchor-cache-service.d.ts +77 -0
- package/dist/services/anchor/anchor-cache-service.d.ts.map +1 -0
- package/dist/services/anchor/anchor-cache-service.js +193 -0
- package/dist/services/anchor/anchor-cache-service.js.map +1 -0
- package/dist/services/anchor/anchor-interfaces.d.ts +143 -0
- package/dist/services/anchor/anchor-interfaces.d.ts.map +1 -0
- package/dist/services/anchor/anchor-interfaces.js +24 -0
- package/dist/services/anchor/anchor-interfaces.js.map +1 -0
- package/dist/services/anchor/anchor-manager.d.ts +71 -0
- package/dist/services/anchor/anchor-manager.d.ts.map +1 -0
- package/dist/services/anchor/anchor-manager.js +205 -0
- package/dist/services/anchor/anchor-manager.js.map +1 -0
- package/dist/services/anchor/anchor-search-service.d.ts +115 -0
- package/dist/services/anchor/anchor-search-service.d.ts.map +1 -0
- package/dist/services/anchor/anchor-search-service.js +799 -0
- package/dist/services/anchor/anchor-search-service.js.map +1 -0
- package/dist/services/anchor/index.d.ts +11 -0
- package/dist/services/anchor/index.d.ts.map +1 -0
- package/dist/services/anchor/index.js +10 -0
- package/dist/services/anchor/index.js.map +1 -0
- package/dist/services/anchor-manager.d.ts +22 -208
- package/dist/services/anchor-manager.d.ts.map +1 -1
- package/dist/services/anchor-manager.js +72 -1088
- package/dist/services/anchor-manager.js.map +1 -1
- package/dist/services/error-logging-service.d.ts +1 -0
- package/dist/services/error-logging-service.d.ts.map +1 -1
- package/dist/services/error-logging-service.js +2 -0
- package/dist/services/error-logging-service.js.map +1 -1
- package/dist/tools/forget-tool.js +1 -1
- package/dist/tools/forget-tool.js.map +1 -1
- 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;
|
|
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"}
|