a2a-memory 0.5.0 → 0.6.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 (99) hide show
  1. package/README.md +262 -45
  2. package/dist/adapters/anthropic.d.ts +69 -0
  3. package/dist/adapters/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/anthropic.js +116 -0
  5. package/dist/adapters/anthropic.js.map +1 -0
  6. package/dist/claude/sync.d.ts +57 -0
  7. package/dist/claude/sync.d.ts.map +1 -0
  8. package/dist/claude/sync.js +201 -0
  9. package/dist/claude/sync.js.map +1 -0
  10. package/dist/cli/commands/claude-sync.d.ts +11 -0
  11. package/dist/cli/commands/claude-sync.d.ts.map +1 -0
  12. package/dist/cli/commands/claude-sync.js +69 -0
  13. package/dist/cli/commands/claude-sync.js.map +1 -0
  14. package/dist/cli/commands/health.d.ts +8 -0
  15. package/dist/cli/commands/health.d.ts.map +1 -0
  16. package/dist/cli/commands/health.js +108 -0
  17. package/dist/cli/commands/health.js.map +1 -0
  18. package/dist/cli/commands/sync.d.ts.map +1 -1
  19. package/dist/cli/commands/sync.js +52 -0
  20. package/dist/cli/commands/sync.js.map +1 -1
  21. package/dist/cli/index.js +27 -1
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/config/manager.d.ts +9 -0
  24. package/dist/config/manager.d.ts.map +1 -1
  25. package/dist/config/manager.js +74 -0
  26. package/dist/config/manager.js.map +1 -1
  27. package/dist/db/database.d.ts +4 -2
  28. package/dist/db/database.d.ts.map +1 -1
  29. package/dist/db/database.js +116 -17
  30. package/dist/db/database.js.map +1 -1
  31. package/dist/embedding/index.d.ts +1 -0
  32. package/dist/embedding/index.d.ts.map +1 -1
  33. package/dist/embedding/index.js +1 -0
  34. package/dist/embedding/index.js.map +1 -1
  35. package/dist/embedding/quantization.d.ts +34 -0
  36. package/dist/embedding/quantization.d.ts.map +1 -0
  37. package/dist/embedding/quantization.js +89 -0
  38. package/dist/embedding/quantization.js.map +1 -0
  39. package/dist/extraction/filter.d.ts.map +1 -1
  40. package/dist/extraction/filter.js +25 -3
  41. package/dist/extraction/filter.js.map +1 -1
  42. package/dist/hooks/post-tool-use.d.ts.map +1 -1
  43. package/dist/hooks/post-tool-use.js +64 -49
  44. package/dist/hooks/post-tool-use.js.map +1 -1
  45. package/dist/hooks/session-end.d.ts.map +1 -1
  46. package/dist/hooks/session-end.js +45 -28
  47. package/dist/hooks/session-end.js.map +1 -1
  48. package/dist/hooks/session-start.d.ts.map +1 -1
  49. package/dist/hooks/session-start.js +21 -3
  50. package/dist/hooks/session-start.js.map +1 -1
  51. package/dist/i18n/index.d.ts +3 -0
  52. package/dist/i18n/index.d.ts.map +1 -0
  53. package/dist/i18n/index.js +2 -0
  54. package/dist/i18n/index.js.map +1 -0
  55. package/dist/i18n/messages.d.ts +82 -0
  56. package/dist/i18n/messages.d.ts.map +1 -0
  57. package/dist/i18n/messages.js +150 -0
  58. package/dist/i18n/messages.js.map +1 -0
  59. package/dist/index.d.ts +18 -7
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +11 -3
  62. package/dist/index.js.map +1 -1
  63. package/dist/lifecycle/index.d.ts +3 -0
  64. package/dist/lifecycle/index.d.ts.map +1 -1
  65. package/dist/lifecycle/index.js +2 -0
  66. package/dist/lifecycle/index.js.map +1 -1
  67. package/dist/lifecycle/tiering.d.ts +50 -0
  68. package/dist/lifecycle/tiering.d.ts.map +1 -0
  69. package/dist/lifecycle/tiering.js +235 -0
  70. package/dist/lifecycle/tiering.js.map +1 -0
  71. package/dist/sync/client.d.ts +20 -2
  72. package/dist/sync/client.d.ts.map +1 -1
  73. package/dist/sync/client.js +82 -10
  74. package/dist/sync/client.js.map +1 -1
  75. package/dist/sync/encryption.d.ts +72 -0
  76. package/dist/sync/encryption.d.ts.map +1 -0
  77. package/dist/sync/encryption.js +203 -0
  78. package/dist/sync/encryption.js.map +1 -0
  79. package/dist/sync/index.d.ts +4 -0
  80. package/dist/sync/index.d.ts.map +1 -1
  81. package/dist/sync/index.js +3 -0
  82. package/dist/sync/index.js.map +1 -1
  83. package/dist/sync/scheduler.d.ts +69 -0
  84. package/dist/sync/scheduler.d.ts.map +1 -0
  85. package/dist/sync/scheduler.js +140 -0
  86. package/dist/sync/scheduler.js.map +1 -0
  87. package/dist/types/index.d.ts +32 -0
  88. package/dist/types/index.d.ts.map +1 -1
  89. package/dist/types/index.js +34 -4
  90. package/dist/types/index.js.map +1 -1
  91. package/dist/utils/keychain.d.ts +50 -0
  92. package/dist/utils/keychain.d.ts.map +1 -0
  93. package/dist/utils/keychain.js +166 -0
  94. package/dist/utils/keychain.js.map +1 -0
  95. package/dist/utils/logger.d.ts +16 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +118 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/package.json +1 -1
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Sync Scheduler
3
+ *
4
+ * 주기적으로 MemorySynchronizer.sync()를 실행하는 스케줄러.
5
+ * CLI `sync --watch` 또는 라이브러리로 사용 가능.
6
+ */
7
+ export class SyncScheduler {
8
+ synchronizer;
9
+ options;
10
+ logger;
11
+ timer = null;
12
+ running = false;
13
+ syncing = false;
14
+ syncCount = 0;
15
+ lastSyncAt = null;
16
+ lastResult = null;
17
+ startedAt = null;
18
+ constructor(synchronizer, options, logger) {
19
+ this.synchronizer = synchronizer;
20
+ this.options = options;
21
+ this.logger = logger;
22
+ }
23
+ /**
24
+ * 스케줄러 시작
25
+ */
26
+ async start() {
27
+ if (this.running) {
28
+ this.logger?.warn('Scheduler already running');
29
+ return;
30
+ }
31
+ if (this.options.intervalMs <= 0) {
32
+ this.logger?.warn('Scheduler disabled (intervalMs <= 0)');
33
+ return;
34
+ }
35
+ this.running = true;
36
+ this.startedAt = new Date();
37
+ this.logger?.info('Scheduler started', { intervalMs: this.options.intervalMs });
38
+ // 시작 시 즉시 sync (기본 동작)
39
+ if (this.options.syncOnStart !== false) {
40
+ await this.tick();
41
+ }
42
+ this.timer = setInterval(() => {
43
+ this.tick().catch((err) => {
44
+ this.logger?.error('Scheduler tick error', err instanceof Error ? err : new Error(String(err)));
45
+ });
46
+ }, this.options.intervalMs);
47
+ // unref: Node.js 프로세스가 타이머 때문에 종료되지 않는 것을 방지
48
+ if (this.timer && typeof this.timer === 'object' && 'unref' in this.timer) {
49
+ this.timer.unref();
50
+ }
51
+ }
52
+ /**
53
+ * 스케줄러 중지
54
+ */
55
+ stop() {
56
+ if (!this.running)
57
+ return;
58
+ if (this.timer) {
59
+ clearInterval(this.timer);
60
+ this.timer = null;
61
+ }
62
+ this.running = false;
63
+ this.logger?.info('Scheduler stopped', { syncCount: this.syncCount });
64
+ }
65
+ /**
66
+ * 실행 중 여부
67
+ */
68
+ isRunning() {
69
+ return this.running;
70
+ }
71
+ /**
72
+ * 현재 sync 중 여부
73
+ */
74
+ isSyncing() {
75
+ return this.syncing;
76
+ }
77
+ /**
78
+ * 스케줄러 상태
79
+ */
80
+ getStatus() {
81
+ let nextSyncAt = null;
82
+ if (this.running && this.lastSyncAt) {
83
+ const next = new Date(this.lastSyncAt.getTime() + this.options.intervalMs);
84
+ nextSyncAt = next.toISOString();
85
+ }
86
+ else if (this.running && this.startedAt) {
87
+ const next = new Date(this.startedAt.getTime() + this.options.intervalMs);
88
+ nextSyncAt = next.toISOString();
89
+ }
90
+ return {
91
+ running: this.running,
92
+ syncing: this.syncing,
93
+ syncCount: this.syncCount,
94
+ lastSyncAt: this.lastSyncAt?.toISOString() ?? null,
95
+ lastResult: this.lastResult,
96
+ intervalMs: this.options.intervalMs,
97
+ nextSyncAt,
98
+ };
99
+ }
100
+ /**
101
+ * 수동으로 즉시 sync 실행 (스케줄러 타이머와 무관)
102
+ */
103
+ async syncNow() {
104
+ return this.tick();
105
+ }
106
+ /**
107
+ * 한 번의 sync 사이클
108
+ */
109
+ async tick() {
110
+ if (this.syncing) {
111
+ this.logger?.debug('Sync already in progress, skipping');
112
+ return null;
113
+ }
114
+ this.syncing = true;
115
+ try {
116
+ const result = await this.synchronizer.sync();
117
+ this.syncCount++;
118
+ this.lastSyncAt = new Date();
119
+ this.lastResult = result;
120
+ this.logger?.info('Sync completed', {
121
+ pushed: result.pushed,
122
+ pulled: result.pulled,
123
+ errors: result.errors.length,
124
+ duration: result.duration,
125
+ });
126
+ this.options.onSync?.(result);
127
+ return result;
128
+ }
129
+ catch (error) {
130
+ const err = error instanceof Error ? error : new Error(String(error));
131
+ this.logger?.error('Sync failed', err);
132
+ this.options.onError?.(err);
133
+ return null;
134
+ }
135
+ finally {
136
+ this.syncing = false;
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"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"}
@@ -92,16 +92,33 @@ export interface LLMConfig {
92
92
  model?: string;
93
93
  maxTokens?: number;
94
94
  }
95
+ export type QuantizationLevel = 'none' | 'float32' | 'int8';
95
96
  export interface EmbeddingConfig {
96
97
  enabled: boolean;
97
98
  provider: 'local' | 'openai';
98
99
  dimensions: number;
100
+ quantization?: QuantizationLevel;
101
+ }
102
+ export type StorageTier = 'hot' | 'warm' | 'cold';
103
+ export interface TieringConfig {
104
+ enabled: boolean;
105
+ hotThresholdDays: number;
106
+ warmThresholdDays: number;
107
+ coldCompressionEnabled: boolean;
108
+ autoPromote: boolean;
109
+ }
110
+ export interface TieringResult {
111
+ promoted: number;
112
+ demoted: number;
113
+ compressed: number;
114
+ totalProcessed: number;
99
115
  }
100
116
  export interface LifecycleConfig {
101
117
  ttlDays: number;
102
118
  maxMemories: number;
103
119
  cleanupOnSessionEnd: boolean;
104
120
  qualityThreshold: number;
121
+ tiering?: TieringConfig;
105
122
  }
106
123
  export interface MemoryQuality {
107
124
  relevance: number;
@@ -109,6 +126,14 @@ export interface MemoryQuality {
109
126
  usage: number;
110
127
  overall: number;
111
128
  }
129
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
130
+ export interface LoggingConfig {
131
+ enabled: boolean;
132
+ level: LogLevel;
133
+ outputDir: string;
134
+ maxFileSizeMB: number;
135
+ maxFiles: number;
136
+ }
112
137
  export interface A2AConfig {
113
138
  server: {
114
139
  url: string;
@@ -143,7 +168,14 @@ export interface A2AConfig {
143
168
  pushOnSessionEnd: boolean;
144
169
  pullOnSessionStart: boolean;
145
170
  timeoutMs: number;
171
+ intervalMs: number;
172
+ encryption?: {
173
+ enabled: boolean;
174
+ algorithm: 'aes-256-gcm';
175
+ };
146
176
  };
177
+ logging?: LoggingConfig;
178
+ locale?: 'en' | 'ko';
147
179
  }
148
180
  export declare const DEFAULT_CONFIG: A2AConfig;
149
181
  export interface HookContext {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -52,19 +52,49 @@ export const DEFAULT_CONFIG = {
52
52
  pushOnSessionEnd: true,
53
53
  pullOnSessionStart: true,
54
54
  timeoutMs: 5000,
55
+ intervalMs: 1800000, // 30분
56
+ },
57
+ logging: {
58
+ enabled: false,
59
+ level: 'info',
60
+ outputDir: '~/.a2a/logs',
61
+ maxFileSizeMB: 10,
62
+ maxFiles: 3,
55
63
  },
56
64
  };
57
65
  // ============================================================
58
- // Sensitive Info Patterns
66
+ // Sensitive Info Patterns (카테고리별)
59
67
  // ============================================================
60
68
  export const SENSITIVE_PATTERNS = [
61
- /(?:api[_-]?key|apikey)\s*[:=]\s*['"]?[\w-]{20,}/gi,
62
- /(?:secret|password|passwd|pwd)\s*[:=]\s*['"]?[^\s'"]{8,}/gi,
69
+ // --- 구체적 패턴 우선 (Cloud Provider Keys) ---
70
+ /AKIA[0-9A-Z]{16}/g, // AWS Access Key
71
+ /(?:aws[_-]?secret[_-]?access[_-]?key)\s*[:=]\s*['"]?[A-Za-z0-9\/+=]{40}/gi, // AWS Secret
72
+ /(?:GOOG|AIza)[A-Za-z0-9_\\-]{35,}/g, // Google API Key
73
+ /(?:az|azure)[_-]?(?:storage|account)[_-]?key\s*[:=]\s*['"]?[A-Za-z0-9\/+=]{80,}/gi, // Azure Key
74
+ // --- API Keys & Secrets (기존 8개 유지) ---
63
75
  /sk-[a-zA-Z0-9]{20,}/g, // OpenAI keys
64
76
  /sk_live_[a-zA-Z0-9]{20,}/g, // Stripe keys
65
77
  /ghp_[a-zA-Z0-9]{36,}/g, // GitHub tokens
78
+ /(?:api[_-]?key|apikey)\s*[:=]\s*['"]?[\w-]{20,}/gi,
79
+ /(?:secret|password|passwd|pwd)\s*[:=]\s*['"]?[^\s'"]{8,}/gi,
66
80
  /(?:Bearer\s+)[a-zA-Z0-9._-]{20,}/gi, // Bearer tokens
67
81
  /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, // emails
68
- /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/g, // private keys
82
+ /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/g, // private keys (RSA)
83
+ // --- Service Tokens ---
84
+ /xox[bpsar]-[0-9a-zA-Z-]{10,}/g, // Slack tokens
85
+ /(?:discord|webhook)[_-]?(?:token|key)\s*[:=]\s*['"]?[A-Za-z0-9._-]{50,}/gi, // Discord
86
+ /(?:npm_|npm)[A-Za-z0-9]{36,}/g, // npm tokens
87
+ /(?:pypi-)[A-Za-z0-9-_]{100,}/g, // PyPI tokens
88
+ // --- Database / Connection Strings ---
89
+ /(?:mongodb(?:\+srv)?|postgres(?:ql)?|mysql|redis):\/\/[^\s'"]{10,}/gi, // DB connection strings
90
+ /(?:DATABASE_URL|DB_URL|REDIS_URL)\s*[:=]\s*['"]?[^\s'"]{10,}/gi, // DB env vars
91
+ // --- SSH / Certificates ---
92
+ /-----BEGIN\s+(?:EC|DSA|OPENSSH)\s+PRIVATE\s+KEY-----/g, // SSH private keys (EC, DSA, OPENSSH)
93
+ /-----BEGIN\s+CERTIFICATE-----/g, // X.509 certificates
94
+ // --- JWT / Session ---
95
+ /eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g, // JWT tokens
96
+ // --- Personal Identifiable Info (Korean) ---
97
+ /\b\d{6}[-]\d{7}\b/g, // 주민등록번호
98
+ /\b\d{3}[-]?\d{2}[-]?\d{5}\b/g, // 사업자등록번호
69
99
  ];
70
100
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmMH,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,MAAM,EAAE;QACN,GAAG,EAAE,gDAAgD;KACtD;IACD,IAAI,EAAE,OAAO;IACb,GAAG,EAAE;QACH,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,GAAG;KACf;IACD,SAAS,EAAE;QACT,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,EAAE;KACf;IACD,SAAS,EAAE;QACT,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,IAAI;QACjB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,GAAG;KACtB;IACD,WAAW,EAAE;QACX,OAAO,EAAE,KAAK,EAAG,gBAAgB;QACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;QACnC,eAAe,EAAE;YACf,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB;YAC5C,cAAc,EAAE,MAAM,EAAE,WAAW;SACpC;QACD,qBAAqB,EAAE,GAAG;KAC3B;IACD,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,IAAI;KAChB;IACD,cAAc,EAAE;QACd,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,CAAC;KACd;IACD,EAAE,EAAE;QACF,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,GAAG;KACf;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AA8CF,+DAA+D;AAC/D,0BAA0B;AAC1B,+DAA+D;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,mDAAmD;IACnD,4DAA4D;IAC5D,sBAAsB,EAAqB,cAAc;IACzD,2BAA2B,EAAgB,cAAc;IACzD,uBAAuB,EAAoB,gBAAgB;IAC3D,oCAAoC,EAAO,gBAAgB;IAC3D,iDAAiD,EAAG,SAAS;IAC7D,6CAA6C,EAAS,eAAe;CACtE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA6OH,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,MAAM,EAAE;QACN,GAAG,EAAE,gDAAgD;KACtD;IACD,IAAI,EAAE,OAAO;IACb,GAAG,EAAE;QACH,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,GAAG;KACf;IACD,SAAS,EAAE;QACT,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,EAAE;KACf;IACD,SAAS,EAAE;QACT,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,IAAI;QACjB,mBAAmB,EAAE,KAAK;QAC1B,gBAAgB,EAAE,GAAG;KACtB;IACD,WAAW,EAAE;QACX,OAAO,EAAE,KAAK,EAAG,gBAAgB;QACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC;QACnC,eAAe,EAAE;YACf,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB;YAC5C,cAAc,EAAE,MAAM,EAAE,WAAW;SACpC;QACD,qBAAqB,EAAE,GAAG;KAC3B;IACD,UAAU,EAAE;QACV,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,IAAI;KAChB;IACD,cAAc,EAAE;QACd,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,CAAC;KACd;IACD,EAAE,EAAE;QACF,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,GAAG;KACf;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,IAAI;QACtB,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,OAAO,EAAE,MAAM;KAC5B;IACD,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,aAAa;QACxB,aAAa,EAAE,EAAE;QACjB,QAAQ,EAAE,CAAC;KACZ;CACF,CAAC;AA8CF,+DAA+D;AAC/D,kCAAkC;AAClC,+DAA+D;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,0CAA0C;IAC1C,mBAAmB,EAAqC,iBAAiB;IACzE,2EAA2E,EAAG,aAAa;IAC3F,oCAAoC,EAAoB,iBAAiB;IACzE,mFAAmF,EAAG,YAAY;IAElG,wCAAwC;IACxC,sBAAsB,EAAqB,cAAc;IACzD,2BAA2B,EAAgB,cAAc;IACzD,uBAAuB,EAAoB,gBAAgB;IAC3D,mDAAmD;IACnD,4DAA4D;IAC5D,oCAAoC,EAAO,gBAAgB;IAC3D,iDAAiD,EAAG,SAAS;IAC7D,6CAA6C,EAAS,qBAAqB;IAE3E,yBAAyB;IACzB,+BAA+B,EAAyB,eAAe;IACvE,2EAA2E,EAAG,UAAU;IACxF,+BAA+B,EAA0B,aAAa;IACtE,+BAA+B,EAA0B,cAAc;IAEvE,wCAAwC;IACxC,sEAAsE,EAAG,wBAAwB;IACjG,gEAAgE,EAAQ,cAAc;IAEtF,6BAA6B;IAC7B,uDAAuD,EAAG,sCAAsC;IAChG,gCAAgC,EAA2B,qBAAqB;IAEhF,wBAAwB;IACxB,mEAAmE,EAAG,aAAa;IAEnF,8CAA8C;IAC9C,oBAAoB,EAAsC,SAAS;IACnE,8BAA8B,EAA4B,UAAU;CACrE,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * OS Keychain Integration
3
+ *
4
+ * macOS: `security` CLI (Keychain Services)
5
+ * Linux: `secret-tool` CLI (libsecret)
6
+ * Fallback: null (config.json 평문 유지)
7
+ *
8
+ * 외부 의존성 없이 OS CLI만 사용합니다.
9
+ */
10
+ export interface KeychainStore {
11
+ get(account: string): string | null;
12
+ set(account: string, password: string): boolean;
13
+ delete(account: string): boolean;
14
+ isAvailable(): boolean;
15
+ }
16
+ /**
17
+ * macOS Keychain (security CLI)
18
+ */
19
+ declare class MacOSKeychain implements KeychainStore {
20
+ isAvailable(): boolean;
21
+ get(account: string): string | null;
22
+ set(account: string, password: string): boolean;
23
+ delete(account: string): boolean;
24
+ }
25
+ /**
26
+ * Linux Secret Service (secret-tool CLI)
27
+ */
28
+ declare class LinuxKeychain implements KeychainStore {
29
+ isAvailable(): boolean;
30
+ get(account: string): string | null;
31
+ set(account: string, password: string): boolean;
32
+ delete(account: string): boolean;
33
+ }
34
+ /**
35
+ * Fallback (항상 null 반환 — config.json 평문 사용)
36
+ */
37
+ declare class NoOpKeychain implements KeychainStore {
38
+ isAvailable(): boolean;
39
+ get(_account: string): string | null;
40
+ set(_account: string, _password: string): boolean;
41
+ delete(_account: string): boolean;
42
+ }
43
+ /**
44
+ * 플랫폼에 맞는 KeychainStore 생성
45
+ */
46
+ export declare function createKeychainStore(): KeychainStore;
47
+ export declare function getKeychainStore(): KeychainStore;
48
+ export declare function resetKeychainStore(): void;
49
+ export { MacOSKeychain, LinuxKeychain, NoOpKeychain };
50
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../src/utils/keychain.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,WAAW,IAAI,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,cAAM,aAAc,YAAW,aAAa;IAC1C,WAAW,IAAI,OAAO;IAStB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAcnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAgB/C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAYjC;AAED;;GAEG;AACH,cAAM,aAAc,YAAW,aAAa;IAC1C,WAAW,IAAI,OAAO;IAStB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAanC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAiB/C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAYjC;AAED;;GAEG;AACH,cAAM,YAAa,YAAW,aAAa;IACzC,WAAW,IAAI,OAAO;IACtB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IACpC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IACjD,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAClC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAcnD;AAKD,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAGD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * OS Keychain Integration
3
+ *
4
+ * macOS: `security` CLI (Keychain Services)
5
+ * Linux: `secret-tool` CLI (libsecret)
6
+ * Fallback: null (config.json 평문 유지)
7
+ *
8
+ * 외부 의존성 없이 OS CLI만 사용합니다.
9
+ */
10
+ import { execFileSync } from 'node:child_process';
11
+ import { platform } from 'node:os';
12
+ const SERVICE_NAME = 'a2a-memory';
13
+ /**
14
+ * macOS Keychain (security CLI)
15
+ */
16
+ class MacOSKeychain {
17
+ isAvailable() {
18
+ try {
19
+ execFileSync('security', ['help'], { stdio: 'ignore' });
20
+ return true;
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ }
26
+ get(account) {
27
+ try {
28
+ const result = execFileSync('security', [
29
+ 'find-generic-password',
30
+ '-a', account,
31
+ '-s', SERVICE_NAME,
32
+ '-w',
33
+ ], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
34
+ return result.trim() || null;
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ set(account, password) {
41
+ try {
42
+ // 기존 항목 삭제 (중복 방지)
43
+ this.delete(account);
44
+ execFileSync('security', [
45
+ 'add-generic-password',
46
+ '-a', account,
47
+ '-s', SERVICE_NAME,
48
+ '-w', password,
49
+ ], { stdio: 'ignore' });
50
+ return true;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ delete(account) {
57
+ try {
58
+ execFileSync('security', [
59
+ 'delete-generic-password',
60
+ '-a', account,
61
+ '-s', SERVICE_NAME,
62
+ ], { stdio: 'ignore' });
63
+ return true;
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ }
69
+ }
70
+ /**
71
+ * Linux Secret Service (secret-tool CLI)
72
+ */
73
+ class LinuxKeychain {
74
+ isAvailable() {
75
+ try {
76
+ execFileSync('which', ['secret-tool'], { stdio: 'ignore' });
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ get(account) {
84
+ try {
85
+ const result = execFileSync('secret-tool', [
86
+ 'lookup',
87
+ 'service', SERVICE_NAME,
88
+ 'account', account,
89
+ ], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
90
+ return result.trim() || null;
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ set(account, password) {
97
+ try {
98
+ execFileSync('secret-tool', [
99
+ 'store',
100
+ '--label', `${SERVICE_NAME}: ${account}`,
101
+ 'service', SERVICE_NAME,
102
+ 'account', account,
103
+ ], {
104
+ input: password,
105
+ stdio: ['pipe', 'ignore', 'ignore'],
106
+ });
107
+ return true;
108
+ }
109
+ catch {
110
+ return false;
111
+ }
112
+ }
113
+ delete(account) {
114
+ try {
115
+ execFileSync('secret-tool', [
116
+ 'clear',
117
+ 'service', SERVICE_NAME,
118
+ 'account', account,
119
+ ], { stdio: 'ignore' });
120
+ return true;
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Fallback (항상 null 반환 — config.json 평문 사용)
129
+ */
130
+ class NoOpKeychain {
131
+ isAvailable() { return false; }
132
+ get(_account) { return null; }
133
+ set(_account, _password) { return false; }
134
+ delete(_account) { return false; }
135
+ }
136
+ /**
137
+ * 플랫폼에 맞는 KeychainStore 생성
138
+ */
139
+ export function createKeychainStore() {
140
+ const os = platform();
141
+ if (os === 'darwin') {
142
+ const store = new MacOSKeychain();
143
+ if (store.isAvailable())
144
+ return store;
145
+ }
146
+ if (os === 'linux') {
147
+ const store = new LinuxKeychain();
148
+ if (store.isAvailable())
149
+ return store;
150
+ }
151
+ return new NoOpKeychain();
152
+ }
153
+ // 싱글톤
154
+ let _instance = null;
155
+ export function getKeychainStore() {
156
+ if (!_instance) {
157
+ _instance = createKeychainStore();
158
+ }
159
+ return _instance;
160
+ }
161
+ export function resetKeychainStore() {
162
+ _instance = null;
163
+ }
164
+ // 테스트용 export
165
+ export { MacOSKeychain, LinuxKeychain, NoOpKeychain };
166
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/utils/keychain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Logging Infrastructure
3
+ *
4
+ * JSON Lines 포맷으로 Hook 로그를 파일에 기록합니다.
5
+ * 외부 의존성 없이 native Node.js API만 사용.
6
+ */
7
+ import type { LoggingConfig } from '../types/index.js';
8
+ export interface HookLogger {
9
+ debug(msg: string, meta?: Record<string, unknown>): void;
10
+ info(msg: string, meta?: Record<string, unknown>): void;
11
+ warn(msg: string, meta?: Record<string, unknown>): void;
12
+ error(msg: string, err?: Error, meta?: Record<string, unknown>): void;
13
+ flush(): void;
14
+ }
15
+ export declare function createLogger(hookName: string, config?: LoggingConfig): HookLogger;
16
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAY,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAgBjE,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACtE,KAAK,IAAI,IAAI,CAAC;CACf;AAkGD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,UAAU,CAcjF"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Logging Infrastructure
3
+ *
4
+ * JSON Lines 포맷으로 Hook 로그를 파일에 기록합니다.
5
+ * 외부 의존성 없이 native Node.js API만 사용.
6
+ */
7
+ import { appendFileSync, existsSync, mkdirSync, statSync, renameSync } from 'node:fs';
8
+ import { dirname, join } from 'node:path';
9
+ import { homedir } from 'node:os';
10
+ const LEVEL_PRIORITY = {
11
+ debug: 0,
12
+ info: 1,
13
+ warn: 2,
14
+ error: 3,
15
+ };
16
+ function resolvePath(p) {
17
+ if (p.startsWith('~')) {
18
+ return p.replace('~', homedir());
19
+ }
20
+ return p;
21
+ }
22
+ class FileLogger {
23
+ hookName;
24
+ config;
25
+ logPath;
26
+ buffer = [];
27
+ constructor(hookName, config) {
28
+ this.hookName = hookName;
29
+ this.config = config;
30
+ const resolvedDir = resolvePath(config.outputDir);
31
+ if (!existsSync(resolvedDir)) {
32
+ mkdirSync(resolvedDir, { recursive: true });
33
+ }
34
+ this.logPath = join(resolvedDir, 'hooks.log');
35
+ }
36
+ debug(msg, meta) {
37
+ this.log('debug', msg, meta);
38
+ }
39
+ info(msg, meta) {
40
+ this.log('info', msg, meta);
41
+ }
42
+ warn(msg, meta) {
43
+ this.log('warn', msg, meta);
44
+ }
45
+ error(msg, err, meta) {
46
+ const errorMeta = err ? { error: err.message, stack: err.stack, ...meta } : meta;
47
+ this.log('error', msg, errorMeta);
48
+ }
49
+ flush() {
50
+ if (this.buffer.length === 0)
51
+ return;
52
+ const content = this.buffer.join('\n') + '\n';
53
+ this.buffer = [];
54
+ try {
55
+ appendFileSync(this.logPath, content, 'utf-8');
56
+ this.rotateIfNeeded();
57
+ }
58
+ catch {
59
+ // 파일 쓰기 실패 무시
60
+ }
61
+ }
62
+ log(level, msg, meta) {
63
+ if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[this.config.level]) {
64
+ return;
65
+ }
66
+ const line = JSON.stringify({
67
+ ts: new Date().toISOString(),
68
+ level,
69
+ hook: this.hookName,
70
+ msg,
71
+ ...(meta && { meta }),
72
+ });
73
+ this.buffer.push(line);
74
+ }
75
+ rotateIfNeeded() {
76
+ try {
77
+ const stats = statSync(this.logPath);
78
+ const sizeMB = stats.size / (1024 * 1024);
79
+ if (sizeMB > this.config.maxFileSizeMB) {
80
+ // hooks.1.log → hooks.2.log ... (오래된 것 삭제)
81
+ const dir = dirname(this.logPath);
82
+ for (let i = this.config.maxFiles - 1; i > 0; i--) {
83
+ const oldPath = join(dir, `hooks.${i}.log`);
84
+ const newPath = join(dir, `hooks.${i + 1}.log`);
85
+ if (existsSync(oldPath)) {
86
+ renameSync(oldPath, newPath);
87
+ }
88
+ }
89
+ // hooks.log → hooks.1.log
90
+ renameSync(this.logPath, join(dir, 'hooks.1.log'));
91
+ }
92
+ }
93
+ catch {
94
+ // 로테이션 실패 무시
95
+ }
96
+ }
97
+ }
98
+ class NoOpLogger {
99
+ debug() { }
100
+ info() { }
101
+ warn() { }
102
+ error() { }
103
+ flush() { }
104
+ }
105
+ export function createLogger(hookName, config) {
106
+ if (!config || !config.enabled) {
107
+ return new NoOpLogger();
108
+ }
109
+ const fullConfig = {
110
+ enabled: config.enabled,
111
+ level: config.level ?? 'info',
112
+ outputDir: config.outputDir ?? '~/.a2a/logs',
113
+ maxFileSizeMB: config.maxFileSizeMB ?? 10,
114
+ maxFiles: config.maxFiles ?? 3,
115
+ };
116
+ return new FileLogger(hookName, fullConfig);
117
+ }
118
+ //# sourceMappingURL=logger.js.map