@jee1/memento-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/client/agent-client.d.ts +15 -0
  4. package/dist/client/agent-client.d.ts.map +1 -0
  5. package/dist/client/agent-client.js +64 -0
  6. package/dist/client/agent-client.js.map +1 -0
  7. package/dist/client/client-context.d.ts +14 -0
  8. package/dist/client/client-context.d.ts.map +1 -0
  9. package/dist/client/client-context.js +2 -0
  10. package/dist/client/client-context.js.map +1 -0
  11. package/dist/client/factory.d.ts +7 -0
  12. package/dist/client/factory.d.ts.map +1 -0
  13. package/dist/client/factory.js +8 -0
  14. package/dist/client/factory.js.map +1 -0
  15. package/dist/client/format-utils.d.ts +10 -0
  16. package/dist/client/format-utils.d.ts.map +1 -0
  17. package/dist/client/format-utils.js +79 -0
  18. package/dist/client/format-utils.js.map +1 -0
  19. package/dist/client/http-transport.d.ts +29 -0
  20. package/dist/client/http-transport.d.ts.map +1 -0
  21. package/dist/client/http-transport.js +123 -0
  22. package/dist/client/http-transport.js.map +1 -0
  23. package/dist/client/memory-client.d.ts +27 -0
  24. package/dist/client/memory-client.d.ts.map +1 -0
  25. package/dist/client/memory-client.js +128 -0
  26. package/dist/client/memory-client.js.map +1 -0
  27. package/dist/client/memory-utils.d.ts +30 -0
  28. package/dist/client/memory-utils.d.ts.map +1 -0
  29. package/dist/client/memory-utils.js +121 -0
  30. package/dist/client/memory-utils.js.map +1 -0
  31. package/dist/client/search-client.d.ts +14 -0
  32. package/dist/client/search-client.d.ts.map +1 -0
  33. package/dist/client/search-client.js +54 -0
  34. package/dist/client/search-client.js.map +1 -0
  35. package/dist/client/search-utils.d.ts +14 -0
  36. package/dist/client/search-utils.d.ts.map +1 -0
  37. package/dist/client/search-utils.js +46 -0
  38. package/dist/client/search-utils.js.map +1 -0
  39. package/dist/client/time-utils.d.ts +9 -0
  40. package/dist/client/time-utils.d.ts.map +1 -0
  41. package/dist/client/time-utils.js +36 -0
  42. package/dist/client/time-utils.js.map +1 -0
  43. package/dist/client/tools-client.d.ts +23 -0
  44. package/dist/client/tools-client.d.ts.map +1 -0
  45. package/dist/client/tools-client.js +57 -0
  46. package/dist/client/tools-client.js.map +1 -0
  47. package/dist/client/validation-utils.d.ts +28 -0
  48. package/dist/client/validation-utils.d.ts.map +1 -0
  49. package/dist/client/validation-utils.js +93 -0
  50. package/dist/client/validation-utils.js.map +1 -0
  51. package/dist/context-injector.d.ts +106 -0
  52. package/dist/context-injector.d.ts.map +1 -0
  53. package/dist/context-injector.js +299 -0
  54. package/dist/context-injector.js.map +1 -0
  55. package/dist/index.d.ts +43 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +44 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/logger.d.ts +11 -0
  60. package/dist/logger.d.ts.map +1 -0
  61. package/dist/logger.js +27 -0
  62. package/dist/logger.js.map +1 -0
  63. package/dist/memento-client.d.ts +64 -0
  64. package/dist/memento-client.d.ts.map +1 -0
  65. package/dist/memento-client.js +146 -0
  66. package/dist/memento-client.js.map +1 -0
  67. package/dist/memory-manager.d.ts +137 -0
  68. package/dist/memory-manager.d.ts.map +1 -0
  69. package/dist/memory-manager.js +342 -0
  70. package/dist/memory-manager.js.map +1 -0
  71. package/dist/types.d.ts +288 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +44 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/utils.d.ts +11 -0
  76. package/dist/utils.d.ts.map +1 -0
  77. package/dist/utils.js +11 -0
  78. package/dist/utils.js.map +1 -0
  79. package/package.json +53 -0
@@ -0,0 +1,30 @@
1
+ import type { MemoryType, PrivacyScope } from '../types.js';
2
+ /**
3
+ * 메모리 내용에서 태그 추출
4
+ */
5
+ export declare function extractTagsFromContent(content: string): string[];
6
+ /**
7
+ * 메모리 내용 요약 (지정된 길이로)
8
+ */
9
+ export declare function summarizeContent(content: string, maxLength?: number): string;
10
+ /**
11
+ * 메모리 중요도 계산 (내용 길이, 태그 수, 타입 기반)
12
+ */
13
+ export declare function calculateImportance(content: string, tags?: string[], type?: MemoryType): number;
14
+ /**
15
+ * 메모리 타입별 기본 설정
16
+ */
17
+ export declare function getDefaultSettingsForType(type: MemoryType): {
18
+ importance: number;
19
+ privacyScope: PrivacyScope;
20
+ ttlDays?: number;
21
+ };
22
+ /**
23
+ * 메모리를 JSON으로 직렬화
24
+ */
25
+ export declare function serializeMemory(memory: import('../types.js').MemoryItem): string;
26
+ /**
27
+ * JSON에서 메모리 역직렬화
28
+ */
29
+ export declare function deserializeMemory(json: string): import('../types.js').MemoryItem;
30
+ //# sourceMappingURL=memory-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-utils.d.ts","sourceRoot":"","sources":["../../src/client/memory-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAiBjF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,IAAI,GAAE,UAAuB,GAC5B,MAAM,CA0BR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAwCA;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,UAAU,GAAG,MAAM,CAEhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,aAAa,EAAE,UAAU,CAEhF"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * 메모리 내용에서 태그 추출
3
+ */
4
+ export function extractTagsFromContent(content) {
5
+ const hashtags = content.match(/#[\w가-힣]+/g) || [];
6
+ const mentions = content.match(/@[\w가-힣]+/g) || [];
7
+ const tagPatterns = content.match(/[\w가-힣]+:/g) || [];
8
+ return [
9
+ ...hashtags.map(tag => tag.substring(1)),
10
+ ...mentions.map(mention => mention.substring(1)),
11
+ ...tagPatterns.map(tag => tag.substring(0, tag.length - 1)),
12
+ ];
13
+ }
14
+ /**
15
+ * 메모리 내용 요약 (지정된 길이로)
16
+ */
17
+ export function summarizeContent(content, maxLength = 200) {
18
+ if (content.length <= maxLength) {
19
+ return content;
20
+ }
21
+ const sentences = content.split(/[.!?]+/);
22
+ let summary = '';
23
+ for (const sentence of sentences) {
24
+ if (summary.length + sentence.length <= maxLength) {
25
+ summary += sentence + '.';
26
+ }
27
+ else {
28
+ break;
29
+ }
30
+ }
31
+ return summary || content.substring(0, maxLength) + '...';
32
+ }
33
+ /**
34
+ * 메모리 중요도 계산 (내용 길이, 태그 수, 타입 기반)
35
+ */
36
+ export function calculateImportance(content, tags = [], type = 'episodic') {
37
+ let importance = 0.5;
38
+ const contentLength = content.length;
39
+ if (contentLength > 500)
40
+ importance += 0.2;
41
+ else if (contentLength > 200)
42
+ importance += 0.1;
43
+ else if (contentLength < 50)
44
+ importance -= 0.1;
45
+ const tagCount = tags.length;
46
+ if (tagCount > 5)
47
+ importance += 0.2;
48
+ else if (tagCount > 2)
49
+ importance += 0.1;
50
+ else if (tagCount === 0)
51
+ importance -= 0.1;
52
+ switch (type) {
53
+ case 'semantic':
54
+ importance += 0.2;
55
+ break;
56
+ case 'procedural':
57
+ importance += 0.1;
58
+ break;
59
+ case 'working':
60
+ importance -= 0.1;
61
+ break;
62
+ }
63
+ return Math.max(0, Math.min(1, importance));
64
+ }
65
+ /**
66
+ * 메모리 타입별 기본 설정
67
+ */
68
+ export function getDefaultSettingsForType(type) {
69
+ switch (type) {
70
+ case 'working':
71
+ return {
72
+ importance: 0.3,
73
+ privacyScope: 'private',
74
+ ttlDays: 2,
75
+ };
76
+ case 'episodic':
77
+ return {
78
+ importance: 0.6,
79
+ privacyScope: 'private',
80
+ ttlDays: 90,
81
+ };
82
+ case 'semantic':
83
+ return {
84
+ importance: 0.8,
85
+ privacyScope: 'team',
86
+ };
87
+ case 'procedural':
88
+ return {
89
+ importance: 0.7,
90
+ privacyScope: 'team',
91
+ ttlDays: 180,
92
+ };
93
+ case 'core':
94
+ return {
95
+ importance: 1.0,
96
+ privacyScope: 'private',
97
+ };
98
+ case 'vault':
99
+ return {
100
+ importance: 1.0,
101
+ privacyScope: 'private',
102
+ };
103
+ default: {
104
+ const _exhaustive = type;
105
+ throw new Error(`Unknown memory type: ${_exhaustive}`);
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * 메모리를 JSON으로 직렬화
111
+ */
112
+ export function serializeMemory(memory) {
113
+ return JSON.stringify(memory, null, 2);
114
+ }
115
+ /**
116
+ * JSON에서 메모리 역직렬화
117
+ */
118
+ export function deserializeMemory(json) {
119
+ return JSON.parse(json);
120
+ }
121
+ //# sourceMappingURL=memory-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-utils.js","sourceRoot":"","sources":["../../src/client/memory-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SearchFilters, RecallCallOptions, SearchResult, HybridSearchParams, HybridSearchResult } from '../types.js';
2
+ import type { MementoClientCore } from './client-context.js';
3
+ /**
4
+ * 기억 검색
5
+ *
6
+ * `feedback()`에 넘길 `score_breakdown`을 얻으려면 `recallOptions`에
7
+ * `{ include_metadata: true, include_score_breakdown: true }`를 지정한다(서버 계약).
8
+ */
9
+ export declare function recall(client: MementoClientCore, query: string, filters?: SearchFilters, limit?: number, recallOptions?: RecallCallOptions): Promise<SearchResult>;
10
+ /**
11
+ * 하이브리드 검색
12
+ */
13
+ export declare function hybridSearch(client: MementoClientCore, params: HybridSearchParams): Promise<HybridSearchResult>;
14
+ //# sourceMappingURL=search-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-client.d.ts","sourceRoot":"","sources":["../../src/client/search-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;GAKG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,iBAAiB,GAChC,OAAO,CAAC,YAAY,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA0B7B"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 기억 검색
3
+ *
4
+ * `feedback()`에 넘길 `score_breakdown`을 얻으려면 `recallOptions`에
5
+ * `{ include_metadata: true, include_score_breakdown: true }`를 지정한다(서버 계약).
6
+ */
7
+ export async function recall(client, query, filters, limit, recallOptions) {
8
+ client.ensureConnected();
9
+ const response = await client.httpClient.post('/tools/recall', {
10
+ query,
11
+ filters,
12
+ limit,
13
+ ...recallOptions,
14
+ });
15
+ const result = response.data.result;
16
+ if (result.items && result.items.items && Array.isArray(result.items.items)) {
17
+ return {
18
+ ...result,
19
+ items: result.items.items,
20
+ total_count: result.items.total_count || result.items.items.length,
21
+ query_time: result.items.query_time || 0,
22
+ };
23
+ }
24
+ return result;
25
+ }
26
+ /**
27
+ * 하이브리드 검색
28
+ */
29
+ export async function hybridSearch(client, params) {
30
+ client.ensureConnected();
31
+ const recallExtras = {
32
+ include_metadata: params.include_metadata,
33
+ include_score_breakdown: params.include_score_breakdown,
34
+ };
35
+ if (params.vectorWeight !== undefined) {
36
+ recallExtras.vector_weight = params.vectorWeight;
37
+ }
38
+ if (params.textWeight !== undefined) {
39
+ recallExtras.text_weight = params.textWeight;
40
+ }
41
+ const searchResult = await recall(client, params.query, params.filters, params.limit, recallExtras);
42
+ return {
43
+ items: searchResult.items.map(item => ({
44
+ ...item,
45
+ textScore: item.score || 0,
46
+ vectorScore: 0,
47
+ finalScore: item.score || 0,
48
+ })),
49
+ total_count: searchResult.total_count,
50
+ query_time: searchResult.query_time,
51
+ search_type: 'hybrid',
52
+ };
53
+ }
54
+ //# sourceMappingURL=search-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-client.js","sourceRoot":"","sources":["../../src/client/search-client.ts"],"names":[],"mappings":"AASA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAAyB,EACzB,KAAa,EACb,OAAuB,EACvB,KAAc,EACd,aAAiC;IAEjC,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE;QAC7D,KAAK;QACL,OAAO;QACP,KAAK;QACL,GAAG,aAAa;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAEpC,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5E,OAAO;YACL,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;YACzB,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM;YAClE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAyB,EACzB,MAA0B;IAE1B,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,YAAY,GAAsB;QACtC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;KACxD,CAAC;IACF,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,YAAY,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC;IACnD,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,YAAY,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/C,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAEpG,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;YAC1B,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;SAC5B,CAAC,CAAC;QACH,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,WAAW,EAAE,QAAQ;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { MemoryItem } from '../types.js';
2
+ /**
3
+ * 검색 쿼리 정규화
4
+ */
5
+ export declare function normalizeQuery(query: string): string;
6
+ /**
7
+ * 검색 결과 점수 정규화 (0-1 범위)
8
+ */
9
+ export declare function normalizeScore(score: number, minScore?: number, maxScore?: number): number;
10
+ /**
11
+ * 검색 결과 그룹화 (타입별, 태그별)
12
+ */
13
+ export declare function groupSearchResults(results: MemoryItem[], groupBy: 'type' | 'tags' | 'privacy_scope'): Record<string, MemoryItem[]>;
14
+ //# sourceMappingURL=search-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-utils.d.ts","sourceRoot":"","sources":["../../src/client/search-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM,CAGhG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EAAE,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,GACzC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CA2B9B"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * 검색 쿼리 정규화
3
+ */
4
+ export function normalizeQuery(query) {
5
+ return query
6
+ .trim()
7
+ .toLowerCase()
8
+ .replace(/\s+/g, ' ')
9
+ .replace(/[^\w\s가-힣]/g, '');
10
+ }
11
+ /**
12
+ * 검색 결과 점수 정규화 (0-1 범위)
13
+ */
14
+ export function normalizeScore(score, minScore = 0, maxScore = 1) {
15
+ if (maxScore === minScore)
16
+ return 0;
17
+ return Math.max(0, Math.min(1, (score - minScore) / (maxScore - minScore)));
18
+ }
19
+ /**
20
+ * 검색 결과 그룹화 (타입별, 태그별)
21
+ */
22
+ export function groupSearchResults(results, groupBy) {
23
+ const groups = {};
24
+ for (const result of results) {
25
+ let key;
26
+ switch (groupBy) {
27
+ case 'type':
28
+ key = result.type;
29
+ break;
30
+ case 'tags':
31
+ key = result.tags?.join(',') || 'untagged';
32
+ break;
33
+ case 'privacy_scope':
34
+ key = result.privacy_scope;
35
+ break;
36
+ default:
37
+ key = 'unknown';
38
+ }
39
+ if (!groups[key]) {
40
+ groups[key] = [];
41
+ }
42
+ groups[key].push(result);
43
+ }
44
+ return groups;
45
+ }
46
+ //# sourceMappingURL=search-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-utils.js","sourceRoot":"","sources":["../../src/client/search-utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,WAAmB,CAAC,EAAE,WAAmB,CAAC;IACtF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAqB,EACrB,OAA0C;IAE1C,MAAM,MAAM,GAAiC,EAAE,CAAC;IAEhD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,GAAW,CAAC;QAEhB,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,MAAM;gBACT,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;gBAClB,MAAM;YACR,KAAK,MAAM;gBACT,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC;gBAC3C,MAAM;YACR,KAAK,eAAe;gBAClB,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC;gBAC3B,MAAM;YACR;gBACE,GAAG,GAAG,SAAS,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function getRelativeTime(date: string | Date): string;
2
+ /**
3
+ * 날짜 범위 필터 생성
4
+ */
5
+ export declare function createDateRangeFilter(days: number): {
6
+ time_from: string;
7
+ time_to: string;
8
+ };
9
+ //# sourceMappingURL=time-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-utils.d.ts","sourceRoot":"","sources":["../../src/client/time-utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAiB3D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CAQA"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 상대적 시간 문자열 생성
3
+ */
4
+ const DAY_MS = 86_400_000;
5
+ export function getRelativeTime(date) {
6
+ const now = new Date();
7
+ const target = new Date(date);
8
+ const diffMs = now.getTime() - target.getTime();
9
+ const diffDays = Math.floor(diffMs / DAY_MS);
10
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
11
+ const diffMinutes = Math.floor(diffMs / (1000 * 60));
12
+ if (diffDays > 0) {
13
+ return `${diffDays}일 전`;
14
+ }
15
+ else if (diffHours > 0) {
16
+ return `${diffHours}시간 전`;
17
+ }
18
+ else if (diffMinutes > 0) {
19
+ return `${diffMinutes}분 전`;
20
+ }
21
+ else {
22
+ return '방금 전';
23
+ }
24
+ }
25
+ /**
26
+ * 날짜 범위 필터 생성
27
+ */
28
+ export function createDateRangeFilter(days) {
29
+ const now = new Date();
30
+ const from = new Date(now.getTime() - days * DAY_MS);
31
+ return {
32
+ time_from: from.toISOString(),
33
+ time_to: now.toISOString(),
34
+ };
35
+ }
36
+ //# sourceMappingURL=time-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-utils.js","sourceRoot":"","sources":["../../src/client/time-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,UAAU,eAAe,CAAC,IAAmB;IACjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;IAErD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,QAAQ,KAAK,CAAC;IAC1B,CAAC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,SAAS,MAAM,CAAC;IAC5B,CAAC;SAAM,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,GAAG,WAAW,KAAK,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAIhD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;IAErD,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,WAAW,EAAE;QAC7B,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { LinkResult, ExportResult, FeedbackResult, FeedbackCallOptions, RecordRecallFeedbackOptions, SearchResult, ContextInjectionParams, ContextInjectionResult } from '../types.js';
2
+ import type { MementoClientCore } from './client-context.js';
3
+ /**
4
+ * 기억 간 관계 생성
5
+ */
6
+ export declare function link(client: MementoClientCore, sourceId: string, targetId: string, relationType: 'cause_of' | 'derived_from' | 'duplicates' | 'contradicts'): Promise<LinkResult>;
7
+ /**
8
+ * 기억보내기
9
+ */
10
+ export declare function exportMemories(client: MementoClientCore, format: 'json' | 'csv' | 'markdown', filters?: import('../types.js').SearchFilters): Promise<ExportResult>;
11
+ /**
12
+ * 피드백 제공
13
+ */
14
+ export declare function feedback(client: MementoClientCore, memoryId: string, helpful: boolean, comment?: string, score?: number, score_breakdown?: unknown, options?: FeedbackCallOptions): Promise<FeedbackResult>;
15
+ /**
16
+ * recall 결과 항목의 score_breakdown을 추출해 feedback()을 호출합니다 (Issue #666).
17
+ */
18
+ export declare function recordRecallFeedback(client: MementoClientCore, recallResult: SearchResult, memoryId: string, helpful: boolean, options?: RecordRecallFeedbackOptions): Promise<FeedbackResult>;
19
+ /**
20
+ * 컨텍스트 주입
21
+ */
22
+ export declare function injectContext(client: MementoClientCore, params: ContextInjectionParams): Promise<ContextInjectionResult>;
23
+ //# sourceMappingURL=tools-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-client.d.ts","sourceRoot":"","sources":["../../src/client/tools-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,wBAAsB,IAAI,CACxB,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,UAAU,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GACvE,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,EACnC,OAAO,CAAC,EAAE,OAAO,aAAa,EAAE,aAAa,GAC5C,OAAO,CAAC,YAAY,CAAC,CASvB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,eAAe,CAAC,EAAE,OAAO,EACzB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAezB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,2BAA2B,GACpC,OAAO,CAAC,cAAc,CAAC,CAYzB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAKjC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 기억 간 관계 생성
3
+ */
4
+ export async function link(client, sourceId, targetId, relationType) {
5
+ client.ensureConnected();
6
+ const response = await client.httpClient.post('/tools/link', {
7
+ source_id: sourceId,
8
+ target_id: targetId,
9
+ relation_type: relationType,
10
+ });
11
+ return response.data;
12
+ }
13
+ /**
14
+ * 기억보내기
15
+ */
16
+ export async function exportMemories(client, format, filters) {
17
+ client.ensureConnected();
18
+ const response = await client.httpClient.post('/tools/export', {
19
+ format,
20
+ filters,
21
+ });
22
+ return response.data;
23
+ }
24
+ /**
25
+ * 피드백 제공
26
+ */
27
+ export async function feedback(client, memoryId, helpful, comment, score, score_breakdown, options) {
28
+ client.ensureConnected();
29
+ const response = await client.httpClient.post('/tools/feedback', {
30
+ memory_id: memoryId,
31
+ helpful,
32
+ comment,
33
+ score,
34
+ ...(score_breakdown !== undefined ? { score_breakdown } : {}),
35
+ ...(options?.session_id !== undefined ? { session_id: options.session_id } : {}),
36
+ ...(options?.agent_id !== undefined ? { agent_id: options.agent_id } : {}),
37
+ });
38
+ const result = response.data.result;
39
+ return result;
40
+ }
41
+ /**
42
+ * recall 결과 항목의 score_breakdown을 추출해 feedback()을 호출합니다 (Issue #666).
43
+ */
44
+ export async function recordRecallFeedback(client, recallResult, memoryId, helpful, options) {
45
+ const item = recallResult.items.find(i => i.id === memoryId);
46
+ const scoreBreakdown = item?.score_breakdown;
47
+ return feedback(client, memoryId, helpful, options?.comment, options?.score, scoreBreakdown, options);
48
+ }
49
+ /**
50
+ * 컨텍스트 주입
51
+ */
52
+ export async function injectContext(client, params) {
53
+ client.ensureConnected();
54
+ const response = await client.httpClient.post('/prompts/memory_injection', params);
55
+ return response.data;
56
+ }
57
+ //# sourceMappingURL=tools-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools-client.js","sourceRoot":"","sources":["../../src/client/tools-client.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,MAAyB,EACzB,QAAgB,EAChB,QAAgB,EAChB,YAAwE;IAExE,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,EAAE;QAC3D,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAyB,EACzB,MAAmC,EACnC,OAA6C;IAE7C,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE;QAC7D,MAAM;QACN,OAAO;KACR,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAyB,EACzB,QAAgB,EAChB,OAAgB,EAChB,OAAgB,EAChB,KAAc,EACd,eAAyB,EACzB,OAA6B;IAE7B,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE;QAC/D,SAAS,EAAE,QAAQ;QACnB,OAAO;QACP,OAAO;QACP,KAAK;QACL,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAyB,EACzB,YAA0B,EAC1B,QAAgB,EAChB,OAAgB,EAChB,OAAqC;IAErC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,EAAE,eAAe,CAAC;IAC7C,OAAO,QAAQ,CACb,MAAM,EACN,QAAQ,EACR,OAAO,EACP,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,KAAK,EACd,cAAc,EACd,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAyB,EACzB,MAA8B;IAE9B,MAAM,CAAC,eAAe,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;IACnF,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { MemoryType, PrivacyScope } from '../types.js';
2
+ /**
3
+ * 유효한 메모리 타입인지 확인
4
+ */
5
+ export declare function isValidMemoryType(type: string): type is MemoryType;
6
+ /**
7
+ * 유효한 프라이버시 스코프인지 확인
8
+ */
9
+ export declare function isValidPrivacyScope(scope: string): scope is PrivacyScope;
10
+ /**
11
+ * 유효한 중요도 값인지 확인 (0-1 범위)
12
+ */
13
+ export declare function isValidImportance(importance: number): boolean;
14
+ /**
15
+ * 메모리 생성 파라미터 검증
16
+ */
17
+ export declare function validateCreateMemoryParams(params: unknown): {
18
+ isValid: boolean;
19
+ errors: string[];
20
+ };
21
+ /**
22
+ * 검색 파라미터 검증
23
+ */
24
+ export declare function validateSearchParams(params: unknown): {
25
+ isValid: boolean;
26
+ errors: string[];
27
+ };
28
+ //# sourceMappingURL=validation-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-utils.d.ts","sourceRoot":"","sources":["../../src/client/validation-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,UAAU,CAElE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAExE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,GAAG;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAkDA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG;IACrD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAgCA"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * 유효한 메모리 타입인지 확인
3
+ */
4
+ export function isValidMemoryType(type) {
5
+ return ['working', 'episodic', 'semantic', 'procedural', 'core', 'vault'].includes(type);
6
+ }
7
+ /**
8
+ * 유효한 프라이버시 스코프인지 확인
9
+ */
10
+ export function isValidPrivacyScope(scope) {
11
+ return ['private', 'team', 'public'].includes(scope);
12
+ }
13
+ /**
14
+ * 유효한 중요도 값인지 확인 (0-1 범위)
15
+ */
16
+ export function isValidImportance(importance) {
17
+ return typeof importance === 'number' && importance >= 0 && importance <= 1;
18
+ }
19
+ /**
20
+ * 메모리 생성 파라미터 검증
21
+ */
22
+ export function validateCreateMemoryParams(params) {
23
+ const errors = [];
24
+ if (typeof params !== 'object' || params === null) {
25
+ return { isValid: false, errors: ['params는 객체여야 합니다'] };
26
+ }
27
+ const p = params;
28
+ if (p.type === 'core' || p.type === 'vault') {
29
+ if (!p.key || typeof p.key !== 'string') {
30
+ errors.push('type이 "core" 또는 "vault"일 때 key는 필수이며 문자열이어야 합니다');
31
+ }
32
+ if (!p.value || typeof p.value !== 'string') {
33
+ errors.push('type이 "core" 또는 "vault"일 때 value는 필수이며 문자열이어야 합니다');
34
+ }
35
+ }
36
+ else {
37
+ if (!p.content || typeof p.content !== 'string') {
38
+ errors.push('content는 필수이며 문자열이어야 합니다 (type이 "core" 또는 "vault"가 아닌 경우)');
39
+ }
40
+ }
41
+ if (p.type && typeof p.type === 'string' && !isValidMemoryType(p.type)) {
42
+ errors.push('type은 working, episodic, semantic, procedural, core, vault 중 하나여야 합니다');
43
+ }
44
+ if (p.importance !== undefined && (typeof p.importance !== 'number' || !isValidImportance(p.importance))) {
45
+ errors.push('importance는 0과 1 사이의 숫자여야 합니다');
46
+ }
47
+ if (p.privacy_scope && typeof p.privacy_scope === 'string' && !isValidPrivacyScope(p.privacy_scope)) {
48
+ errors.push('privacy_scope는 private, team, public 중 하나여야 합니다');
49
+ }
50
+ if (p.tags && !Array.isArray(p.tags)) {
51
+ errors.push('tags는 배열이어야 합니다');
52
+ }
53
+ if (p.always_load !== undefined && typeof p.always_load !== 'boolean') {
54
+ errors.push('always_load는 boolean이어야 합니다');
55
+ }
56
+ if (p.immutable !== undefined && typeof p.immutable !== 'boolean') {
57
+ errors.push('immutable은 boolean이어야 합니다');
58
+ }
59
+ return {
60
+ isValid: errors.length === 0,
61
+ errors,
62
+ };
63
+ }
64
+ /**
65
+ * 검색 파라미터 검증
66
+ */
67
+ export function validateSearchParams(params) {
68
+ const errors = [];
69
+ if (typeof params !== 'object' || params === null) {
70
+ return { isValid: false, errors: ['params는 객체여야 합니다'] };
71
+ }
72
+ const p = params;
73
+ if (!p.query || typeof p.query !== 'string') {
74
+ errors.push('query는 필수이며 문자열이어야 합니다');
75
+ }
76
+ if (p.limit !== undefined && (typeof p.limit !== 'number' || p.limit < 0)) {
77
+ errors.push('limit은 0 이상의 숫자여야 합니다');
78
+ }
79
+ if (p.filters && typeof p.filters === 'object') {
80
+ const filters = p.filters;
81
+ if (filters.type && !Array.isArray(filters.type)) {
82
+ errors.push('filters.type은 배열이어야 합니다');
83
+ }
84
+ if (filters.tags && !Array.isArray(filters.tags)) {
85
+ errors.push('filters.tags는 배열이어야 합니다');
86
+ }
87
+ }
88
+ return {
89
+ isValid: errors.length === 0,
90
+ errors,
91
+ };
92
+ }
93
+ //# sourceMappingURL=validation-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-utils.js","sourceRoot":"","sources":["../../src/client/validation-utils.ts"],"names":[],"mappings":"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"}