a2a-memory 0.11.5 → 0.11.6

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 (259) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.js +1 -298
  10. package/dist/cli/commands/add.js +1 -80
  11. package/dist/cli/commands/claude-sync.js +1 -70
  12. package/dist/cli/commands/cleanup.js +1 -83
  13. package/dist/cli/commands/config.js +1 -79
  14. package/dist/cli/commands/edit.js +1 -69
  15. package/dist/cli/commands/embed.js +1 -92
  16. package/dist/cli/commands/extract.js +1 -103
  17. package/dist/cli/commands/health.js +1 -105
  18. package/dist/cli/commands/list.js +1 -46
  19. package/dist/cli/commands/migrate-chunks.js +1 -205
  20. package/dist/cli/commands/migrate-file-refs.js +1 -183
  21. package/dist/cli/commands/proficiency.js +1 -146
  22. package/dist/cli/commands/rm.js +1 -64
  23. package/dist/cli/commands/search.js +1 -90
  24. package/dist/cli/commands/setup-wizard.js +1 -387
  25. package/dist/cli/commands/setup.js +1 -170
  26. package/dist/cli/commands/skill.js +1 -151
  27. package/dist/cli/commands/status.js +1 -70
  28. package/dist/cli/commands/sync.js +1 -202
  29. package/dist/cli/commands/team.js +1 -142
  30. package/dist/cli/index.js +1 -87
  31. package/dist/config/manager.js +1 -372
  32. package/dist/db/database.js +1 -1400
  33. package/dist/embedding/e5-provider.js +1 -147
  34. package/dist/embedding/index.js +1 -34
  35. package/dist/embedding/local-provider.js +1 -157
  36. package/dist/embedding/openai-provider.js +1 -92
  37. package/dist/embedding/quantization.js +1 -89
  38. package/dist/extraction/dedup-manager.js +1 -161
  39. package/dist/extraction/emotion-filter.js +1 -33
  40. package/dist/extraction/extractor.js +1 -648
  41. package/dist/extraction/file-reference.js +1 -77
  42. package/dist/extraction/filter.js +1 -86
  43. package/dist/extraction/scorer.js +1 -142
  44. package/dist/extraction/similarity.js +1 -85
  45. package/dist/hooks/client-factory.js +1 -44
  46. package/dist/hooks/post-tool-use.js +1 -518
  47. package/dist/hooks/pre-compact.js +1 -209
  48. package/dist/hooks/session-end.js +1 -633
  49. package/dist/hooks/session-start.js +1 -549
  50. package/dist/hooks/shared.js +1 -110
  51. package/dist/hooks/user-prompt-submit.js +1 -316
  52. package/dist/i18n/index.js +1 -2
  53. package/dist/i18n/messages.js +1 -150
  54. package/dist/index.js +1 -43
  55. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  56. package/dist/lifecycle/cleanup.js +1 -116
  57. package/dist/lifecycle/index.js +1 -13
  58. package/dist/lifecycle/quality-scorer.js +1 -46
  59. package/dist/lifecycle/tiering.js +1 -246
  60. package/dist/llm/client.js +1 -226
  61. package/dist/llm/index.js +1 -5
  62. package/dist/proficiency/actr-engine.js +1 -106
  63. package/dist/proficiency/detection.js +1 -77
  64. package/dist/proficiency/index.js +1 -9
  65. package/dist/proficiency/tracker.js +1 -173
  66. package/dist/proficiency/types.js +1 -8
  67. package/dist/providers/adapters.js +1 -140
  68. package/dist/providers/detector.js +1 -57
  69. package/dist/search/adaptive-router.js +1 -93
  70. package/dist/search/index.js +1 -9
  71. package/dist/search/ranker.js +1 -171
  72. package/dist/search/reranker.js +1 -155
  73. package/dist/session/parser.js +1 -130
  74. package/dist/skill/evaluator.js +1 -509
  75. package/dist/skill/index.js +1 -7
  76. package/dist/skill/types.js +1 -7
  77. package/dist/sync/client.js +1 -597
  78. package/dist/sync/encryption.js +1 -203
  79. package/dist/sync/index.js +1 -12
  80. package/dist/sync/queue.js +1 -214
  81. package/dist/sync/scheduler.js +1 -140
  82. package/dist/sync/synchronizer.js +1 -241
  83. package/dist/sync/team-synchronizer.js +1 -204
  84. package/dist/sync/vector-clock.js +1 -70
  85. package/dist/types/index.d.ts +1 -1
  86. package/dist/types/index.js +1 -132
  87. package/dist/utils/keychain.js +1 -170
  88. package/dist/utils/logger.js +1 -128
  89. package/package.json +14 -10
  90. package/dist/a2a/client.d.ts.map +0 -1
  91. package/dist/a2a/client.js.map +0 -1
  92. package/dist/a2a/discovery.d.ts.map +0 -1
  93. package/dist/a2a/discovery.js.map +0 -1
  94. package/dist/a2a/index.d.ts.map +0 -1
  95. package/dist/a2a/index.js.map +0 -1
  96. package/dist/a2a/types.d.ts.map +0 -1
  97. package/dist/a2a/types.js.map +0 -1
  98. package/dist/adapters/anthropic.d.ts.map +0 -1
  99. package/dist/adapters/anthropic.js.map +0 -1
  100. package/dist/chunking/chunker.d.ts.map +0 -1
  101. package/dist/chunking/chunker.js.map +0 -1
  102. package/dist/claude/sync.d.ts.map +0 -1
  103. package/dist/claude/sync.js.map +0 -1
  104. package/dist/cli/commands/add.d.ts.map +0 -1
  105. package/dist/cli/commands/add.js.map +0 -1
  106. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  107. package/dist/cli/commands/claude-sync.js.map +0 -1
  108. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  109. package/dist/cli/commands/cleanup.js.map +0 -1
  110. package/dist/cli/commands/config.d.ts.map +0 -1
  111. package/dist/cli/commands/config.js.map +0 -1
  112. package/dist/cli/commands/edit.d.ts.map +0 -1
  113. package/dist/cli/commands/edit.js.map +0 -1
  114. package/dist/cli/commands/embed.d.ts.map +0 -1
  115. package/dist/cli/commands/embed.js.map +0 -1
  116. package/dist/cli/commands/extract.d.ts.map +0 -1
  117. package/dist/cli/commands/extract.js.map +0 -1
  118. package/dist/cli/commands/health.d.ts.map +0 -1
  119. package/dist/cli/commands/health.js.map +0 -1
  120. package/dist/cli/commands/list.d.ts.map +0 -1
  121. package/dist/cli/commands/list.js.map +0 -1
  122. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  123. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  124. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  125. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  126. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  127. package/dist/cli/commands/proficiency.js.map +0 -1
  128. package/dist/cli/commands/rm.d.ts.map +0 -1
  129. package/dist/cli/commands/rm.js.map +0 -1
  130. package/dist/cli/commands/search.d.ts.map +0 -1
  131. package/dist/cli/commands/search.js.map +0 -1
  132. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  133. package/dist/cli/commands/setup-wizard.js.map +0 -1
  134. package/dist/cli/commands/setup.d.ts.map +0 -1
  135. package/dist/cli/commands/setup.js.map +0 -1
  136. package/dist/cli/commands/skill.d.ts.map +0 -1
  137. package/dist/cli/commands/skill.js.map +0 -1
  138. package/dist/cli/commands/status.d.ts.map +0 -1
  139. package/dist/cli/commands/status.js.map +0 -1
  140. package/dist/cli/commands/sync.d.ts.map +0 -1
  141. package/dist/cli/commands/sync.js.map +0 -1
  142. package/dist/cli/commands/team.d.ts.map +0 -1
  143. package/dist/cli/commands/team.js.map +0 -1
  144. package/dist/cli/index.d.ts.map +0 -1
  145. package/dist/cli/index.js.map +0 -1
  146. package/dist/config/manager.d.ts.map +0 -1
  147. package/dist/config/manager.js.map +0 -1
  148. package/dist/db/database.d.ts.map +0 -1
  149. package/dist/db/database.js.map +0 -1
  150. package/dist/embedding/e5-provider.d.ts.map +0 -1
  151. package/dist/embedding/e5-provider.js.map +0 -1
  152. package/dist/embedding/index.d.ts.map +0 -1
  153. package/dist/embedding/index.js.map +0 -1
  154. package/dist/embedding/local-provider.d.ts.map +0 -1
  155. package/dist/embedding/local-provider.js.map +0 -1
  156. package/dist/embedding/openai-provider.d.ts.map +0 -1
  157. package/dist/embedding/openai-provider.js.map +0 -1
  158. package/dist/embedding/quantization.d.ts.map +0 -1
  159. package/dist/embedding/quantization.js.map +0 -1
  160. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  161. package/dist/extraction/dedup-manager.js.map +0 -1
  162. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  163. package/dist/extraction/emotion-filter.js.map +0 -1
  164. package/dist/extraction/extractor.d.ts.map +0 -1
  165. package/dist/extraction/extractor.js.map +0 -1
  166. package/dist/extraction/file-reference.d.ts.map +0 -1
  167. package/dist/extraction/file-reference.js.map +0 -1
  168. package/dist/extraction/filter.d.ts.map +0 -1
  169. package/dist/extraction/filter.js.map +0 -1
  170. package/dist/extraction/scorer.d.ts.map +0 -1
  171. package/dist/extraction/scorer.js.map +0 -1
  172. package/dist/extraction/similarity.d.ts.map +0 -1
  173. package/dist/extraction/similarity.js.map +0 -1
  174. package/dist/hooks/client-factory.d.ts.map +0 -1
  175. package/dist/hooks/client-factory.js.map +0 -1
  176. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  177. package/dist/hooks/post-tool-use.js.map +0 -1
  178. package/dist/hooks/pre-compact.d.ts.map +0 -1
  179. package/dist/hooks/pre-compact.js.map +0 -1
  180. package/dist/hooks/session-end.d.ts.map +0 -1
  181. package/dist/hooks/session-end.js.map +0 -1
  182. package/dist/hooks/session-start.d.ts.map +0 -1
  183. package/dist/hooks/session-start.js.map +0 -1
  184. package/dist/hooks/shared.d.ts.map +0 -1
  185. package/dist/hooks/shared.js.map +0 -1
  186. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  187. package/dist/hooks/user-prompt-submit.js.map +0 -1
  188. package/dist/i18n/index.d.ts.map +0 -1
  189. package/dist/i18n/index.js.map +0 -1
  190. package/dist/i18n/messages.d.ts.map +0 -1
  191. package/dist/i18n/messages.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  195. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  196. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  197. package/dist/lifecycle/cleanup.js.map +0 -1
  198. package/dist/lifecycle/index.d.ts.map +0 -1
  199. package/dist/lifecycle/index.js.map +0 -1
  200. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  201. package/dist/lifecycle/quality-scorer.js.map +0 -1
  202. package/dist/lifecycle/tiering.d.ts.map +0 -1
  203. package/dist/lifecycle/tiering.js.map +0 -1
  204. package/dist/llm/client.d.ts.map +0 -1
  205. package/dist/llm/client.js.map +0 -1
  206. package/dist/llm/index.d.ts.map +0 -1
  207. package/dist/llm/index.js.map +0 -1
  208. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  209. package/dist/proficiency/actr-engine.js.map +0 -1
  210. package/dist/proficiency/detection.d.ts.map +0 -1
  211. package/dist/proficiency/detection.js.map +0 -1
  212. package/dist/proficiency/index.d.ts.map +0 -1
  213. package/dist/proficiency/index.js.map +0 -1
  214. package/dist/proficiency/tracker.d.ts.map +0 -1
  215. package/dist/proficiency/tracker.js.map +0 -1
  216. package/dist/proficiency/types.d.ts.map +0 -1
  217. package/dist/proficiency/types.js.map +0 -1
  218. package/dist/providers/adapters.d.ts.map +0 -1
  219. package/dist/providers/adapters.js.map +0 -1
  220. package/dist/providers/detector.d.ts.map +0 -1
  221. package/dist/providers/detector.js.map +0 -1
  222. package/dist/search/adaptive-router.d.ts.map +0 -1
  223. package/dist/search/adaptive-router.js.map +0 -1
  224. package/dist/search/index.d.ts.map +0 -1
  225. package/dist/search/index.js.map +0 -1
  226. package/dist/search/ranker.d.ts.map +0 -1
  227. package/dist/search/ranker.js.map +0 -1
  228. package/dist/search/reranker.d.ts.map +0 -1
  229. package/dist/search/reranker.js.map +0 -1
  230. package/dist/session/parser.d.ts.map +0 -1
  231. package/dist/session/parser.js.map +0 -1
  232. package/dist/skill/evaluator.d.ts.map +0 -1
  233. package/dist/skill/evaluator.js.map +0 -1
  234. package/dist/skill/index.d.ts.map +0 -1
  235. package/dist/skill/index.js.map +0 -1
  236. package/dist/skill/types.d.ts.map +0 -1
  237. package/dist/skill/types.js.map +0 -1
  238. package/dist/sync/client.d.ts.map +0 -1
  239. package/dist/sync/client.js.map +0 -1
  240. package/dist/sync/encryption.d.ts.map +0 -1
  241. package/dist/sync/encryption.js.map +0 -1
  242. package/dist/sync/index.d.ts.map +0 -1
  243. package/dist/sync/index.js.map +0 -1
  244. package/dist/sync/queue.d.ts.map +0 -1
  245. package/dist/sync/queue.js.map +0 -1
  246. package/dist/sync/scheduler.d.ts.map +0 -1
  247. package/dist/sync/scheduler.js.map +0 -1
  248. package/dist/sync/synchronizer.d.ts.map +0 -1
  249. package/dist/sync/synchronizer.js.map +0 -1
  250. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  251. package/dist/sync/team-synchronizer.js.map +0 -1
  252. package/dist/sync/vector-clock.d.ts.map +0 -1
  253. package/dist/sync/vector-clock.js.map +0 -1
  254. package/dist/types/index.d.ts.map +0 -1
  255. package/dist/types/index.js.map +0 -1
  256. package/dist/utils/keychain.d.ts.map +0 -1
  257. package/dist/utils/keychain.js.map +0 -1
  258. package/dist/utils/logger.d.ts.map +0 -1
  259. package/dist/utils/logger.js.map +0 -1
@@ -1,372 +1 @@
1
- /**
2
- * Config Manager
3
- *
4
- * ~/.a2a/config.json 설정 파일을 관리합니다.
5
- */
6
- import { readFileSync, writeFileSync, existsSync, mkdirSync, statSync, copyFileSync } from 'node:fs';
7
- import { join, dirname } from 'node:path';
8
- import { homedir } from 'node:os';
9
- import { randomUUID } from 'node:crypto';
10
- import { z } from 'zod';
11
- import { DEFAULT_CONFIG } from '../types/index.js';
12
- import { getKeychainStore } from '../utils/keychain.js';
13
- const DEFAULT_CONFIG_DIR = join(homedir(), '.a2a');
14
- const DEFAULT_CONFIG_PATH = join(DEFAULT_CONFIG_DIR, 'config.json');
15
- export const ConfigSchema = z.object({
16
- server: z.object({
17
- url: z.string().url(),
18
- apiKey: z.string().optional(),
19
- }),
20
- mode: z.enum(['local', 'team']),
21
- team: z.object({
22
- teamId: z.string(),
23
- teamPath: z.string(),
24
- nodeId: z.string(),
25
- }).optional(),
26
- llm: z.object({
27
- enabled: z.boolean(),
28
- provider: z.enum(['openai', 'anthropic', 'none']),
29
- apiKey: z.string().optional(),
30
- model: z.string().optional(),
31
- maxTokens: z.number().int().positive().optional(),
32
- }).optional().default({
33
- enabled: false,
34
- provider: 'none',
35
- maxTokens: 500,
36
- }),
37
- embedding: z.object({
38
- enabled: z.boolean(),
39
- provider: z.enum(['local', 'openai', 'e5']),
40
- dimensions: z.number().int().positive(),
41
- }).optional().default({
42
- enabled: false,
43
- provider: 'local',
44
- dimensions: 64,
45
- }),
46
- lifecycle: z.object({
47
- ttlDays: z.number().int().nonnegative(),
48
- maxMemories: z.number().int().positive(),
49
- maxMemoriesPerProject: z.number().int().positive().optional(),
50
- cleanupOnSessionEnd: z.boolean(),
51
- qualityThreshold: z.number().min(0).max(1),
52
- tiering: z.object({
53
- enabled: z.boolean(),
54
- hotThresholdDays: z.number().int().positive(),
55
- warmThresholdDays: z.number().int().positive(),
56
- coldCompressionEnabled: z.boolean(),
57
- autoPromote: z.boolean(),
58
- }).optional(),
59
- }).optional().default({
60
- ttlDays: 90,
61
- maxMemories: 20000,
62
- cleanupOnSessionEnd: true,
63
- qualityThreshold: 0.3,
64
- }),
65
- autoCapture: z.object({
66
- enabled: z.boolean(),
67
- triggers: z.array(z.string()),
68
- excludePatterns: z.array(z.string()),
69
- significanceThreshold: z.number().min(0).max(1),
70
- }),
71
- autoInject: z.object({
72
- enabled: z.boolean(),
73
- maxMemories: z.number().int().positive(),
74
- maxTokens: z.number().int().positive(),
75
- }),
76
- sessionSummary: z.object({
77
- enabled: z.boolean(),
78
- minActions: z.number().int().nonnegative(),
79
- }),
80
- db: z.object({
81
- path: z.string(),
82
- maxSizeMB: z.number().positive(),
83
- }),
84
- autoSync: z.object({
85
- enabled: z.boolean(),
86
- pushOnSessionEnd: z.boolean(),
87
- pullOnSessionStart: z.boolean(),
88
- timeoutMs: z.number().int().nonnegative(), // 0 = unlimited (CLI용)
89
- intervalMs: z.number().int().nonnegative().default(1800000),
90
- encryption: z.object({
91
- enabled: z.boolean(),
92
- algorithm: z.literal('aes-256-gcm'),
93
- }).optional(),
94
- }).optional().default({
95
- enabled: false,
96
- pushOnSessionEnd: true,
97
- pullOnSessionStart: true,
98
- timeoutMs: 30000,
99
- intervalMs: 1800000,
100
- }),
101
- logging: z.object({
102
- enabled: z.boolean(),
103
- level: z.enum(['debug', 'info', 'warn', 'error']),
104
- outputDir: z.string(),
105
- maxFileSizeMB: z.number().positive(),
106
- maxFiles: z.number().int().positive(),
107
- }).optional().default({
108
- enabled: false,
109
- level: 'info',
110
- outputDir: '~/.a2a/logs',
111
- maxFileSizeMB: 10,
112
- maxFiles: 3,
113
- }),
114
- skillConversion: z.object({
115
- enabled: z.boolean(),
116
- evaluationInterval: z.number().int().positive(),
117
- minRepetitions: z.number().int().positive(),
118
- similarityThreshold: z.number().min(0).max(1),
119
- minConfidence: z.number().min(0).max(1),
120
- reviewCycleDays: z.number().int().positive(),
121
- maxSkills: z.number().int().positive(),
122
- llmValidation: z.boolean(),
123
- }).optional().default({
124
- enabled: false,
125
- evaluationInterval: 5,
126
- minRepetitions: 3,
127
- similarityThreshold: 0.85,
128
- minConfidence: 0.7,
129
- reviewCycleDays: 90,
130
- maxSkills: 100,
131
- llmValidation: true,
132
- }),
133
- proficiency: z.object({
134
- enabled: z.boolean(),
135
- actr: z.object({
136
- decayRate: z.number().nonnegative(),
137
- baseLevelConstant: z.number(),
138
- maxAssociativeStrength: z.number().nonnegative(),
139
- fanEffectFactor: z.number().nonnegative(),
140
- mismatchPenalty: z.number().nonnegative(),
141
- retrievalThreshold: z.number(),
142
- }),
143
- levelFormula: z.enum(['activation', 'powerLaw']),
144
- maxLevel: z.number().int().min(1).max(100),
145
- }).optional().default({
146
- enabled: true,
147
- actr: {
148
- decayRate: 0.5,
149
- baseLevelConstant: 0.0,
150
- maxAssociativeStrength: 2.0,
151
- fanEffectFactor: 1.0,
152
- mismatchPenalty: 1.0,
153
- retrievalThreshold: 0.0,
154
- },
155
- levelFormula: 'activation',
156
- maxLevel: 10,
157
- }),
158
- realtimeInject: z.object({
159
- enabled: z.boolean(),
160
- maxMemories: z.number().int().positive(),
161
- maxTokens: z.number().int().positive(),
162
- cacheSize: z.number().int().positive(),
163
- cacheTTLSeconds: z.number().int().positive(),
164
- timeoutMs: z.number().int().positive(),
165
- }).optional().default({
166
- enabled: true,
167
- maxMemories: 3,
168
- maxTokens: 1000,
169
- cacheSize: 20,
170
- cacheTTLSeconds: 60,
171
- timeoutMs: 100,
172
- }),
173
- emotionTracking: z.object({
174
- enabled: z.boolean(),
175
- maxPerSession: z.number().int().positive(),
176
- }).optional().default({
177
- enabled: false,
178
- maxPerSession: 10,
179
- }),
180
- abTest: z.object({
181
- enabled: z.boolean(),
182
- }).optional().default({
183
- enabled: false,
184
- }),
185
- locale: z.enum(['en', 'ko']).optional(),
186
- }).refine((data) => data.mode !== 'team' || data.team !== undefined, { message: "Team configuration is required when mode is 'team'" });
187
- /**
188
- * 고유 노드 ID 생성 (UUID)
189
- */
190
- export function generateNodeId() {
191
- return randomUUID();
192
- }
193
- export class ConfigManager {
194
- configPath;
195
- config = null;
196
- lastMtime = 0;
197
- _validationFailed = false;
198
- constructor(configPath) {
199
- // 환경변수 우선 (테스트용)
200
- this.configPath = configPath ?? process.env.A2A_CONFIG_PATH ?? DEFAULT_CONFIG_PATH;
201
- }
202
- load() {
203
- if (!existsSync(this.configPath)) {
204
- this.config = structuredClone(DEFAULT_CONFIG);
205
- this.lastMtime = 0;
206
- this.save(this.config);
207
- return this.config;
208
- }
209
- // mtime 비교: 변경 없으면 캐시 반환
210
- try {
211
- const currentMtime = statSync(this.configPath).mtimeMs;
212
- if (this.config && currentMtime === this.lastMtime) {
213
- return this.config;
214
- }
215
- this.lastMtime = currentMtime;
216
- }
217
- catch {
218
- if (this.config)
219
- return this.config;
220
- }
221
- try {
222
- const raw = readFileSync(this.configPath, 'utf-8');
223
- const parsed = JSON.parse(raw);
224
- const validated = ConfigSchema.parse(parsed);
225
- this.config = validated;
226
- this._validationFailed = false; // 검증 성공
227
- // 키체인에서 API 키 로드 (config에 없을 때)
228
- if (!this.config.server.apiKey) {
229
- try {
230
- const keychain = getKeychainStore();
231
- const stored = keychain.get('server.apiKey');
232
- if (stored) {
233
- this.config.server.apiKey = stored;
234
- }
235
- }
236
- catch {
237
- // 키체인 접근 실패 무시
238
- }
239
- }
240
- return this.config;
241
- }
242
- catch (err) {
243
- // 검증 실패 시 플래그 설정 + 원본 백업
244
- this._validationFailed = true;
245
- // 원본 백업
246
- try {
247
- const backupPath = this.configPath + '.bak';
248
- const original = readFileSync(this.configPath, 'utf-8');
249
- writeFileSync(backupPath, original, 'utf-8');
250
- }
251
- catch {
252
- // 백업 실패 무시 (읽기 전용 파일 시스템 등)
253
- }
254
- // 검증 실패 원인 출력
255
- if (err instanceof z.ZodError) {
256
- console.error('[a2a] Config validation failed. Backup saved to config.json.bak');
257
- console.error('[a2a] Invalid fields:');
258
- for (const issue of err.issues) {
259
- console.error(` ${issue.path.join('.')}: ${issue.message}`);
260
- }
261
- }
262
- else {
263
- console.error('[a2a] Config file corrupted:', err instanceof Error ? err.message : String(err));
264
- }
265
- console.error('[a2a] Using default configuration. Fix the errors and restart, or use "a2a config reset".');
266
- this.config = structuredClone(DEFAULT_CONFIG);
267
- return this.config;
268
- }
269
- }
270
- save(config) {
271
- // 검증 실패 상태에서 save 시 경고
272
- if (this._validationFailed) {
273
- console.warn('[a2a] Warning: Previous config validation failed. Saving may overwrite your original settings.');
274
- console.warn('[a2a] Original config backed up to config.json.bak');
275
- }
276
- const dir = dirname(this.configPath);
277
- if (!existsSync(dir)) {
278
- mkdirSync(dir, { recursive: true });
279
- }
280
- // 기존 파일이 있으면 .bak으로 백업 후 쓰기
281
- if (existsSync(this.configPath)) {
282
- try {
283
- copyFileSync(this.configPath, this.configPath + '.bak');
284
- }
285
- catch {
286
- // 백업 실패는 저장을 막지 않음 (읽기 전용 파일 시스템 등)
287
- }
288
- }
289
- writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
290
- this.config = config;
291
- this._validationFailed = false; // 저장 성공 시 플래그 리셋
292
- try {
293
- this.lastMtime = statSync(this.configPath).mtimeMs;
294
- }
295
- catch {
296
- // ignore
297
- }
298
- }
299
- get(key) {
300
- const config = this.load();
301
- return config[key];
302
- }
303
- set(key, value) {
304
- const config = this.load();
305
- config[key] = value;
306
- this.save(config);
307
- }
308
- /**
309
- * API 키 설정 (키체인 우선, 실패 시 config.json)
310
- * @returns 'keychain' | 'config' — 저장 위치
311
- */
312
- setApiKey(apiKey) {
313
- const keychain = getKeychainStore();
314
- if (keychain.isAvailable() && keychain.set('server.apiKey', apiKey)) {
315
- // 키체인에 저장 성공 → config.json에서 제거
316
- const config = this.load();
317
- delete config.server.apiKey;
318
- this.save(config);
319
- // 메모리 캐시에는 유지
320
- if (this.config) {
321
- this.config.server.apiKey = apiKey;
322
- }
323
- return 'keychain';
324
- }
325
- // 키체인 미지원 → config.json에 저장
326
- const config = this.load();
327
- config.server.apiKey = apiKey;
328
- this.save(config);
329
- return 'config';
330
- }
331
- /**
332
- * API 키 삭제 (키체인 + config.json 모두)
333
- */
334
- deleteApiKey() {
335
- const keychain = getKeychainStore();
336
- keychain.delete('server.apiKey');
337
- const config = this.load();
338
- delete config.server.apiKey;
339
- this.save(config);
340
- }
341
- reset() {
342
- this.config = structuredClone(DEFAULT_CONFIG);
343
- this._validationFailed = false; // 리셋 시 플래그 해제
344
- this.save(this.config);
345
- }
346
- getConfigDir() {
347
- const dir = dirname(this.configPath);
348
- if (!existsSync(dir)) {
349
- mkdirSync(dir, { recursive: true });
350
- }
351
- return dir;
352
- }
353
- }
354
- // ============================
355
- // Singleton Factory
356
- // ============================
357
- let _instance = null;
358
- let _instancePath;
359
- export function getConfigManager(configPath) {
360
- const path = configPath ?? process.env.A2A_CONFIG_PATH ?? DEFAULT_CONFIG_PATH;
361
- if (_instance && _instancePath === path) {
362
- return _instance;
363
- }
364
- _instance = new ConfigManager(path);
365
- _instancePath = path;
366
- return _instance;
367
- }
368
- export function resetConfigManager() {
369
- _instance = null;
370
- _instancePath = undefined;
371
- }
372
- //# sourceMappingURL=manager.js.map
1
+ (function(_0x5c3d66,_0x3b737d){function _0x14ebbd(_0x4bcdf0,_0x44e40c){return _0x34e7(_0x44e40c- -0x1f3,_0x4bcdf0);}function _0x3b6dd7(_0x1cfa2f,_0x28d0d3){return _0x34e7(_0x28d0d3- -0x385,_0x1cfa2f);}const _0x22df6b=_0x5c3d66();while(!![]){try{const _0x5eadab=parseInt(_0x3b6dd7(-0x1c1,-0x188))/0x1*(-parseInt(_0x3b6dd7(-0x190,-0x15a))/0x2)+parseInt(_0x3b6dd7(-0x191,-0x16c))/0x3*(-parseInt(_0x14ebbd(0x4d,0x18))/0x4)+parseInt(_0x14ebbd(-0x47,-0x14))/0x5*(-parseInt(_0x14ebbd(0x52,0xf))/0x6)+-parseInt(_0x3b6dd7(-0x1a6,-0x171))/0x7*(-parseInt(_0x3b6dd7(-0x1cf,-0x1c7))/0x8)+-parseInt(_0x3b6dd7(-0x15a,-0x155))/0x9*(parseInt(_0x14ebbd(-0x46,-0x3))/0xa)+parseInt(_0x3b6dd7(-0x1d2,-0x1a2))/0xb+parseInt(_0x3b6dd7(-0x188,-0x1ca))/0xc;if(_0x5eadab===_0x3b737d)break;else _0x22df6b['push'](_0x22df6b['shift']());}catch(_0x51970e){_0x22df6b['push'](_0x22df6b['shift']());}}}(_0x2c58,0x208eb));import{readFileSync,writeFileSync,existsSync,mkdirSync,statSync,copyFileSync}from'node:fs';import{join,dirname}from'node:path';import{homedir}from'node:os';import{randomUUID}from'node:crypto';import{z}from'zod';import{DEFAULT_CONFIG}from'../types/index.js';import{getKeychainStore}from'../utils/keychain.js';const DEFAULT_CONFIG_DIR=join(homedir(),_0x46988f(0x4b1,0x475)),DEFAULT_CONFIG_PATH=join(DEFAULT_CONFIG_DIR,_0x44574d(0x9f,0xc2)+'n');function _0x46988f(_0x2cb64c,_0x201a46){return _0x34e7(_0x2cb64c-0x2de,_0x201a46);}function _0x2c58(){const _0xa58ecc=['mJK4nde0ogHNyvfcvW','AguGzxjYB3jZia','zgvSzxrL','ntm2BhPjrwLl','y29UzMLNlMPZBW','lMjHAW','zgvSzxrLqxbPsW','AwCGDMfSAwrHDa','lIbcywnRDxaGCW','CMvMAw5L','BxrPBwvnCW','B2jQzwn0','B3bLBMfP','DxjS','yM9VBgvHBG','r1jTqMu','BgfZDe10Aw1L','w2eYyv0Gq29UzG','BNvTyMvY','w2eYyv0Gt3jPzW','uxnWC3u','Axrlsg4','Cg9ZAxrPDMu','C2vYDMvYlMfWAq','lMeYyq','ihDOzw4GBw9Kzq','CNj1ChrLzdO','Bwf4','tKHnsu4','v1rRu3G','C1Pkrgq','vw1iCxK','zxjYB3i','CYbYzxf1AxjLza','y29UzMLNugf0Aa','uvn3rNq','mZK1weXIywnU','yxjYyxK','CgDeEhq','B3bewNi','mJqZodmXnwj5DMTOsG','C3rYAw5NAwz5','B3b0Aw9UywW','AM9PBG','zwv5zgC','BwvZC2fNzq','yw50AhjVCgLJ','w2eYyv0Gsw52yq','sxnmy1C','B3vZignVBMzPzW','BwLU','C2vYDMvY','Aw9UlIbgAxGGDa','ndbvuLrTswK','EgLfCwm','BKzHAwXLza','zY5QC29UlMjHAW','Ccb0BYbJB25MAq','A2v5y2HHAw4','u2f2Aw5Nig1HEq','wM9KrxjYB3i','ig92zxj3CML0zq','BM9UBMvNyxrPDG','BIbMywLSzwqUia','qurUCxC','DcWGB3iGDxnLia','mtq0EKnSuw5r','v1Pxz1m','BM9Uzq','Aw5MBW','zuLtsvO','mZe5mNrMwNLmrW','C3rYAw5N','zfPKwu8','rNvsrvi','w2eYyv0Gv2fYBG','DvDlBem','zYbYzxnLDciU','CNDLruW','BgL0zxjHBa','ogzPCLnzvG','CgfYC2u','uhvQDKK','ywvZlti1nI1NyW','wgHKz04','DgvHBq','Bg9JywW','yvf1qxm','CMvZzxq','nJGZowjwEgvWua','y29UzMLN','uvr4zuG','vgvHBsbJB25MAq','D2fYBG','mJuWnJC0BhLisfbA','zgvIDwC','C2v0','Aw5NoIbqCMv2Aq','BMDZlG','C2f2zq','yxbPs2v5','z2v0','Cgf0Aa','quXhww8','CvPwD0m','ywn0AxzHDgLVBG','yMfR','zgvMyxvSDa','ihLVDxiGB3jPzW','Au5yu0i','thL5sNO','rwLnDLy','mtq2AgXuuKDh','zw51Bq','zYbIywnRzwqGDq','tfvTqwu','Aw9UigzHAwXLza','ndeXmJGYv2XWEhvk','BgLKigzPzwXKCW','x3zHBgLKyxrPBW','A1vUquy','z3vYyxrPB24GAq','y29UzMLNDxjHDa','Bg9Hza','ihzHBgLKyxrPBW','yw5KihjLC3rHCG','iMeYysbJB25MAq','y0HZzui','DxrMltG','z2v0q29UzMLNra','Cg93zxjmyxC','s2v5','ug1AEMe','yxzLzcb0BYbJBW','FI8UytjHl2XVzW','DwnOtfy','Aw50','A2XOq1y','Bw9Kzq'];_0x2c58=function(){return _0xa58ecc;};return _0x2c58();}export const ConfigSchema=z[_0x46988f(0x4a4,0x4c6)]({'server':z['object']({'url':z['string']()[_0x46988f(0x4a6,0x4c4)](),'apiKey':z[_0x46988f(0x4e1,0x4f4)]()[_0x46988f(0x4c3,0x4bd)]()}),'mode':z[_0x44574d(0x10c,0x10f)]([_0x46988f(0x4ef,0x4dc),_0x44574d(0xf0,0x136)]),'team':z[_0x44574d(0xa6,0xa4)]({'teamId':z['string'](),'teamPath':z[_0x46988f(0x4e1,0x4d9)](),'nodeId':z[_0x46988f(0x4e1,0x4e8)]()})[_0x46988f(0x4c3,0x4ac)](),'llm':z[_0x44574d(0xa6,0x94)]({'enabled':z[_0x46988f(0x4a7,0x497)](),'provider':z['enum']([_0x46988f(0x4a5,0x4b5),_0x46988f(0x4c7,0x4a5),'none']),'apiKey':z[_0x44574d(0xe3,0xb5)]()['optional'](),'model':z[_0x44574d(0xe3,0x127)]()['optional'](),'maxTokens':z[_0x44574d(0xad,0xea)]()[_0x46988f(0x496,0x4bd)]()[_0x46988f(0x4af,0x47d)]()[_0x44574d(0xc5,0xc3)]()})['optional']()[_0x44574d(0x106,0xfc)]({'enabled':![],'provider':_0x44574d(0xdf,0xbb),'maxTokens':0x1f4}),'embedding':z[_0x46988f(0x4a4,0x4ab)]({'enabled':z[_0x44574d(0xa9,0xe9)](),'provider':z['enum']([_0x44574d(0xf1,0xc3),_0x46988f(0x4a5,0x475),'e5']),'dimensions':z[_0x46988f(0x4ab,0x4cc)]()['int']()[_0x46988f(0x4af,0x4ed)]()})['optional']()[_0x46988f(0x504,0x4fb)]({'enabled':![],'provider':'local','dimensions':0x40}),'lifecycle':z[_0x46988f(0x4a4,0x489)]({'ttlDays':z[_0x44574d(0xad,0x82)]()[_0x46988f(0x496,0x455)]()[_0x46988f(0x4d7,0x4b1)+'e'](),'maxMemories':z[_0x44574d(0xad,0xd7)]()[_0x44574d(0x98,0xda)]()[_0x44574d(0xb1,0xe3)](),'maxMemoriesPerProject':z[_0x46988f(0x4ab,0x4b7)]()['int']()[_0x46988f(0x4af,0x4bb)]()[_0x46988f(0x4c3,0x4df)](),'cleanupOnSessionEnd':z[_0x44574d(0xa9,0x75)](),'qualityThreshold':z[_0x44574d(0xad,0xc6)]()[_0x46988f(0x4cb,0x4e5)](0x0)[_0x46988f(0x4b4,0x49e)](0x1),'tiering':z[_0x46988f(0x4a4,0x472)]({'enabled':z['boolean'](),'hotThresholdDays':z[_0x44574d(0xad,0xef)]()[_0x44574d(0x98,0x7e)]()[_0x44574d(0xb1,0x6e)](),'warmThresholdDays':z[_0x44574d(0xad,0xeb)]()['int']()[_0x46988f(0x4af,0x485)](),'coldCompressionEnabled':z[_0x46988f(0x4a7,0x4d5)](),'autoPromote':z[_0x46988f(0x4a7,0x49e)]()})['optional']()})[_0x46988f(0x4c3,0x4b5)]()[_0x46988f(0x504,0x4e3)]({'ttlDays':0x5a,'maxMemories':0x4e20,'cleanupOnSessionEnd':!![],'qualityThreshold':0.3}),'autoCapture':z[_0x44574d(0xa6,0xde)]({'enabled':z[_0x46988f(0x4a7,0x48f)](),'triggers':z[_0x44574d(0xc0,0xcd)](z['string']()),'excludePatterns':z[_0x46988f(0x4be,0x488)](z[_0x46988f(0x4e1,0x4ba)]()),'significanceThreshold':z['number']()[_0x44574d(0xcd,0xf3)](0x0)['max'](0x1)}),'autoInject':z[_0x46988f(0x4a4,0x488)]({'enabled':z['boolean'](),'maxMemories':z[_0x44574d(0xad,0xe3)]()[_0x44574d(0x98,0xb4)]()[_0x44574d(0xb1,0xdf)](),'maxTokens':z[_0x46988f(0x4ab,0x4a9)]()[_0x44574d(0x98,0xc0)]()[_0x44574d(0xb1,0xa1)]()}),'sessionSummary':z[_0x44574d(0xa6,0x98)]({'enabled':z[_0x46988f(0x4a7,0x4ce)](),'minActions':z[_0x44574d(0xad,0xd1)]()[_0x44574d(0x98,0xc0)]()[_0x44574d(0xd9,0xe7)+'e']()}),'db':z[_0x44574d(0xa6,0x66)]({'path':z['string'](),'maxSizeMB':z['number']()['positive']()}),'autoSync':z[_0x46988f(0x4a4,0x4a7)]({'enabled':z[_0x44574d(0xa9,0x7f)](),'pushOnSessionEnd':z[_0x46988f(0x4a7,0x481)](),'pullOnSessionStart':z[_0x44574d(0xa9,0xd1)](),'timeoutMs':z[_0x46988f(0x4ab,0x488)]()[_0x46988f(0x496,0x4d4)]()['nonnegativ'+'e'](),'intervalMs':z['number']()['int']()[_0x44574d(0xd9,0xeb)+'e']()[_0x46988f(0x504,0x4ca)](0x1b7740),'encryption':z[_0x46988f(0x4a4,0x4b9)]({'enabled':z[_0x44574d(0xa9,0x69)](),'algorithm':z[_0x44574d(0xea,0xfc)](_0x46988f(0x4ec,0x528)+'m')})[_0x44574d(0xc5,0xb7)]()})[_0x44574d(0xc5,0xde)]()['default']({'enabled':![],'pushOnSessionEnd':!![],'pullOnSessionStart':!![],'timeoutMs':0x7530,'intervalMs':0x1b7740}),'logging':z[_0x44574d(0xa6,0xb6)]({'enabled':z[_0x46988f(0x4a7,0x4b7)](),'level':z[_0x44574d(0x10c,0x105)]([_0x46988f(0x4f8,0x51d),'info','warn','error']),'outputDir':z[_0x44574d(0xe3,0xb4)](),'maxFileSizeMB':z['number']()['positive'](),'maxFiles':z[_0x46988f(0x4ab,0x48a)]()[_0x44574d(0x98,0x9a)]()[_0x44574d(0xb1,0xc9)]()})[_0x44574d(0xc5,0xf8)]()[_0x46988f(0x504,0x4f6)]({'enabled':![],'level':_0x44574d(0xe0,0xa8),'outputDir':_0x44574d(0x96,0x8f)+'s','maxFileSizeMB':0xa,'maxFiles':0x3}),'skillConversion':z[_0x44574d(0xa6,0x78)]({'enabled':z[_0x46988f(0x4a7,0x46d)](),'evaluationInterval':z[_0x46988f(0x4ab,0x479)]()[_0x44574d(0x98,0x5f)]()[_0x46988f(0x4af,0x4d2)](),'minRepetitions':z[_0x44574d(0xad,0xee)]()[_0x46988f(0x496,0x4b4)]()[_0x44574d(0xb1,0xa0)](),'similarityThreshold':z[_0x46988f(0x4ab,0x4a3)]()[_0x46988f(0x4cb,0x494)](0x0)['max'](0x1),'minConfidence':z['number']()[_0x44574d(0xcd,0x99)](0x0)[_0x44574d(0xb6,0xcf)](0x1),'reviewCycleDays':z[_0x46988f(0x4ab,0x4cb)]()[_0x46988f(0x496,0x4a5)]()['positive'](),'maxSkills':z[_0x44574d(0xad,0xc5)]()['int']()[_0x44574d(0xb1,0xca)](),'llmValidation':z[_0x46988f(0x4a7,0x479)]()})[_0x46988f(0x4c3,0x499)]()['default']({'enabled':![],'evaluationInterval':0x5,'minRepetitions':0x3,'similarityThreshold':0.85,'minConfidence':0.7,'reviewCycleDays':0x5a,'maxSkills':0x64,'llmValidation':!![]}),'proficiency':z['object']({'enabled':z['boolean'](),'actr':z[_0x46988f(0x4a4,0x470)]({'decayRate':z[_0x44574d(0xad,0x73)]()[_0x46988f(0x4d7,0x513)+'e'](),'baseLevelConstant':z[_0x44574d(0xad,0xc7)](),'maxAssociativeStrength':z[_0x44574d(0xad,0x92)]()[_0x44574d(0xd9,0xa3)+'e'](),'fanEffectFactor':z['number']()[_0x46988f(0x4d7,0x4d5)+'e'](),'mismatchPenalty':z[_0x44574d(0xad,0x69)]()['nonnegativ'+'e'](),'retrievalThreshold':z[_0x46988f(0x4ab,0x4a2)]()}),'levelFormula':z['enum']([_0x44574d(0x104,0x12d),_0x46988f(0x490,0x451)]),'maxLevel':z['number']()[_0x44574d(0x98,0x5d)]()[_0x44574d(0xcd,0x90)](0x1)[_0x46988f(0x4b4,0x4ea)](0x64)})['optional']()[_0x46988f(0x504,0x4fa)]({'enabled':!![],'actr':{'decayRate':0.5,'baseLevelConstant':0x0,'maxAssociativeStrength':0x2,'fanEffectFactor':0x1,'mismatchPenalty':0x1,'retrievalThreshold':0x0},'levelFormula':_0x46988f(0x502,0x4e7),'maxLevel':0xa}),'realtimeInject':z['object']({'enabled':z[_0x44574d(0xa9,0x7e)](),'maxMemories':z[_0x46988f(0x4ab,0x488)]()[_0x44574d(0x98,0x94)]()['positive'](),'maxTokens':z[_0x46988f(0x4ab,0x4ef)]()[_0x44574d(0x98,0x7b)]()['positive'](),'cacheSize':z[_0x46988f(0x4ab,0x48f)]()[_0x46988f(0x496,0x4c5)]()[_0x46988f(0x4af,0x4dc)](),'cacheTTLSeconds':z[_0x44574d(0xad,0x6d)]()[_0x46988f(0x496,0x456)]()['positive'](),'timeoutMs':z[_0x46988f(0x4ab,0x479)]()['int']()[_0x44574d(0xb1,0xcf)]()})[_0x46988f(0x4c3,0x48e)]()[_0x46988f(0x504,0x52d)]({'enabled':!![],'maxMemories':0x3,'maxTokens':0x3e8,'cacheSize':0x14,'cacheTTLSeconds':0x3c,'timeoutMs':0x64}),'emotionTracking':z['object']({'enabled':z['boolean'](),'maxPerSession':z[_0x44574d(0xad,0xbc)]()[_0x44574d(0x98,0xb6)]()['positive']()})[_0x44574d(0xc5,0xdc)]()[_0x46988f(0x504,0x4ca)]({'enabled':![],'maxPerSession':0xa}),'abTest':z['object']({'enabled':z['boolean']()})[_0x46988f(0x4c3,0x4da)]()[_0x46988f(0x504,0x538)]({'enabled':![]}),'locale':z[_0x46988f(0x50a,0x4d4)](['en','ko'])['optional']()})[_0x44574d(0xa4,0xe7)](_0x6ccf26=>_0x6ccf26[_0x46988f(0x498,0x498)]!==_0x44574d(0xf0,0x10a)||_0x6ccf26[_0x44574d(0xf0,0xc5)]!==undefined,{'message':_0x44574d(0xf7,0x138)+_0x44574d(0x114,0x104)+_0x44574d(0xbc,0xe9)+_0x44574d(0xb4,0xaf)+'\x20is\x20\x27team\x27'});export function generateNodeId(){function _0x5d1d2b(_0x2aa24a,_0x558971){return _0x46988f(_0x558971- -0x300,_0x2aa24a);}const _0x202c99={'uchLV':function(_0x519fd3){return _0x519fd3();}};return _0x202c99[_0x5d1d2b(0x1b4,0x195)](randomUUID);}export class ConfigManager{[_0x44574d(0xbd,0xf4)];[_0x44574d(0xf5,0xbd)]=null;['lastMtime']=0x0;[_0x46988f(0x510,0x4ee)+_0x44574d(0xd2,0x97)]=![];constructor(_0x2445ed){function _0x1e58d2(_0x3cb249,_0x1aca2b){return _0x44574d(_0x1aca2b-0x35d,_0x3cb249);}this[_0x1e58d2(0x3dc,0x41a)]=_0x2445ed??process.env.A2A_CONFIG_PATH??DEFAULT_CONFIG_PATH;}[_0x44574d(0x116,0x141)](){const _0x3a1d22={'sZJDd':_0x5a8be1(0x255,0x262)+_0x5a8be1(0x273,0x258)+_0x3b00a8(0x51c,0x4f8)+_0x5a8be1(0x280,0x259)+_0x3b00a8(0x4a2,0x48a)+'nfig.json.'+_0x3b00a8(0x512,0x4e1),'kUnAF':function(_0x177ac3,_0x174c52){return _0x177ac3(_0x174c52);},'nSKFD':function(_0x508fdb,_0x3be1d8){return _0x508fdb===_0x3be1d8;},'WTkSx':'iNFFN','ADnqw':_0x3b00a8(0x4ee,0x50d),'ALGYo':function(_0x13acd9,_0x265151){return _0x13acd9(_0x265151);},'opDZr':_0x3b00a8(0x4f6,0x4c5),'GRmBe':function(_0x7074c3,_0x26248e,_0xe174e0){return _0x7074c3(_0x26248e,_0xe174e0);},'IsLcW':_0x5a8be1(0x2f0,0x2d1),'QNood':function(_0x32f0f1){return _0x32f0f1();},'uWKlC':_0x5a8be1(0x298,0x280)+_0x5a8be1(0x2cb,0x2c7)+':','PmZza':_0x5a8be1(0x221,0x262)+'ig\x20file\x20co'+_0x3b00a8(0x4c2,0x4fe),'QTxeH':'[a2a]\x20Usin'+'g\x20default\x20'+_0x3b00a8(0x522,0x54f)+_0x5a8be1(0x2c2,0x285)+_0x5a8be1(0x280,0x252)+_0x3b00a8(0x525,0x536)+_0x3b00a8(0x4e9,0x4d2)+_0x5a8be1(0x2fd,0x2cf)+_0x3b00a8(0x4f5,0x4f2)};function _0x5a8be1(_0x32a063,_0x3a3c73){return _0x44574d(_0x3a3c73-0x1b6,_0x32a063);}function _0x3b00a8(_0x277c9c,_0x12d7dc){return _0x44574d(_0x277c9c-0x40d,_0x12d7dc);}if(!_0x3a1d22[_0x5a8be1(0x2c0,0x2c9)](existsSync,this[_0x3b00a8(0x4ca,0x50d)])){if(_0x3a1d22['nSKFD'](_0x3a1d22[_0x3b00a8(0x4c5,0x4d7)],_0x3b00a8(0x4cb,0x506))){_0x2b3810['error'](_0x3a1d22[_0x5a8be1(0x22b,0x26f)]),_0x1bc3e4[_0x3b00a8(0x4c8,0x492)](_0x5a8be1(0x253,0x280)+'lid\x20fields'+':');for(const _0x1798a9 of _0xc7cda3['issues']){_0x9700f6[_0x3b00a8(0x4c8,0x4b1)]('\x20\x20'+_0x1798a9[_0x5a8be1(0x29b,0x2b7)][_0x5a8be1(0x2ac,0x27c)]('.')+':\x20'+_0x1798a9[_0x5a8be1(0x239,0x27e)]);}}else return this[_0x3b00a8(0x502,0x4c1)]=_0x3a1d22[_0x5a8be1(0x2c3,0x2c9)](structuredClone,DEFAULT_CONFIG),this[_0x3b00a8(0x4b8,0x498)]=0x0,this[_0x3b00a8(0x50b,0x4d7)](this[_0x3b00a8(0x502,0x4ed)]),this[_0x5a8be1(0x2d1,0x2ab)];}try{if(_0x3a1d22[_0x5a8be1(0x274,0x291)]!==_0x3a1d22[_0x3b00a8(0x4e8,0x4ef)])_0x5d61bb=null,_0x58aff4=_0x40acda;else{const _0xa77777=_0x3a1d22[_0x3b00a8(0x50f,0x502)](statSync,this['configPath'])[_0x5a8be1(0x29d,0x25b)];if(this['config']&&_0x3a1d22['nSKFD'](_0xa77777,this[_0x5a8be1(0x224,0x261)])){if(_0x3a1d22['nSKFD'](_0x3a1d22[_0x3b00a8(0x4cf,0x4a3)],_0x3b00a8(0x4f6,0x4b7)))return this[_0x5a8be1(0x28b,0x2ab)];else _0x2a943b(_0x135c11,{'recursive':!![]});}this[_0x3b00a8(0x4b8,0x49e)]=_0xa77777;}}catch{if(this[_0x3b00a8(0x502,0x52b)])return this[_0x5a8be1(0x2a7,0x2ab)];}try{const _0x4e446a=_0x3a1d22[_0x5a8be1(0x24e,0x260)](readFileSync,this[_0x3b00a8(0x4ca,0x49b)],_0x3a1d22[_0x3b00a8(0x4d8,0x4cf)]),_0x3d059e=JSON[_0x3b00a8(0x4f9,0x4c2)](_0x4e446a),_0x92e428=ConfigSchema[_0x5a8be1(0x27f,0x2a2)](_0x3d059e);this[_0x3b00a8(0x502,0x52c)]=_0x92e428,this['_validatio'+_0x3b00a8(0x4df,0x4c1)]=![];if(!this[_0x3b00a8(0x502,0x4bc)][_0x3b00a8(0x4db,0x4e3)][_0x5a8be1(0x2ad,0x2b5)])try{const _0x52c7fc=_0x3a1d22['QNood'](getKeychainStore),_0x306a19=_0x52c7fc[_0x5a8be1(0x273,0x2b6)](_0x5a8be1(0x299,0x268)+'Key');_0x306a19&&(this[_0x5a8be1(0x2c1,0x2ab)][_0x3b00a8(0x4db,0x4d1)]['apiKey']=_0x306a19);}catch{}return this['config'];}catch(_0x228e2a){this[_0x3b00a8(0x51f,0x4e0)+_0x5a8be1(0x2a6,0x288)]=!![];try{const _0x3bfd55=this[_0x5a8be1(0x23c,0x273)]+_0x5a8be1(0x238,0x256),_0x1a2b40=_0x3a1d22[_0x5a8be1(0x25e,0x260)](readFileSync,this[_0x5a8be1(0x292,0x273)],_0x3a1d22[_0x3b00a8(0x4d8,0x4d9)]);writeFileSync(_0x3bfd55,_0x1a2b40,_0x3a1d22[_0x3b00a8(0x4d8,0x4d4)]);}catch{}if(_0x228e2a instanceof z[_0x5a8be1(0x24b,0x28d)]){console[_0x3b00a8(0x4c8,0x4e9)](_0x3a1d22[_0x3b00a8(0x4c6,0x4f2)]),console[_0x3b00a8(0x4c8,0x507)](_0x3a1d22[_0x5a8be1(0x258,0x29d)]);for(const _0x397cc2 of _0x228e2a['issues']){console['error']('\x20\x20'+_0x397cc2[_0x3b00a8(0x50e,0x53b)][_0x5a8be1(0x25d,0x27c)]('.')+':\x20'+_0x397cc2[_0x3b00a8(0x4d5,0x4d7)]);}}else console[_0x3b00a8(0x4c8,0x4c4)](_0x3a1d22[_0x3b00a8(0x4a1,0x4df)],_0x228e2a instanceof Error?_0x228e2a[_0x5a8be1(0x269,0x27e)]:String(_0x228e2a));return console[_0x3b00a8(0x4c8,0x4fb)](_0x3a1d22[_0x5a8be1(0x2b0,0x2ac)]),this[_0x3b00a8(0x502,0x509)]=structuredClone(DEFAULT_CONFIG),this[_0x3b00a8(0x502,0x4d5)];}}[_0x44574d(0xfe,0xcf)](_0x3f5800){const _0x290985={'LyyJz':function(_0x3735e8){return _0x3735e8();},'aQuAs':function(_0x5ed1d0,_0x1a94b0){return _0x5ed1d0!==_0x1a94b0;},'cHseB':_0x4c75de(0x56b,0x532)+_0x44cea0(0x229,0x256)+_0x44cea0(0x230,0x226)+_0x4c75de(0x53e,0x563)+_0x4c75de(0x551,0x526)+_0x44cea0(0x261,0x230)+_0x4c75de(0x512,0x524)+_0x44cea0(0x239,0x261)+'inal\x20setti'+_0x44cea0(0x287,0x257),'eeydg':function(_0x503a7a,_0x43382d){return _0x503a7a(_0x43382d);},'FuRER':function(_0x16e9c4,_0x5b59f7,_0x2bb5c6){return _0x16e9c4(_0x5b59f7,_0x2bb5c6);}};this[_0x4c75de(0x573,0x55e)+_0x4c75de(0x561,0x51e)]&&(_0x290985[_0x4c75de(0x532,0x53e)](_0x4c75de(0x4f6,0x50d),_0x44cea0(0x22a,0x249))?(console[_0x4c75de(0x4fe,0x544)](_0x290985[_0x44cea0(0x2ad,0x274)]),console[_0x44cea0(0x253,0x252)](_0x4c75de(0x50d,0x4fa)+'inal\x20confi'+_0x44cea0(0x29d,0x267)+_0x44cea0(0x273,0x22e)+_0x4c75de(0x513,0x51f))):_0x1f83c9(_0x12462b,{'recursive':!![]}));const _0xe81294=_0x290985[_0x4c75de(0x4fd,0x513)](dirname,this['configPath']);function _0x44cea0(_0x209502,_0x49f9da){return _0x46988f(_0x49f9da- -0x2a4,_0x209502);}!existsSync(_0xe81294)&&_0x290985[_0x44cea0(0x280,0x23f)](mkdirSync,_0xe81294,{'recursive':!![]});if(existsSync(this[_0x4c75de(0x510,0x509)]))try{copyFileSync(this[_0x4c75de(0x530,0x509)],this[_0x44cea0(0x1f5,0x217)]+_0x4c75de(0x503,0x4ec));}catch{}writeFileSync(this[_0x44cea0(0x1d8,0x217)],JSON[_0x4c75de(0x546,0x510)](_0x3f5800,null,0x2),_0x4c75de(0x526,0x567)),this['config']=_0x3f5800;function _0x4c75de(_0x449cd4,_0x1a7411){return _0x46988f(_0x1a7411-0x4e,_0x449cd4);}this['_validatio'+_0x44cea0(0x26d,0x22c)]=![];try{if(_0x44cea0(0x20f,0x214)!==_0x4c75de(0x4ef,0x506)){const _0x5e3466=woRDCL[_0x44cea0(0x26c,0x263)](_0x556742),_0x178b48=_0x5e3466[_0x4c75de(0x510,0x54c)](_0x44cea0(0x23f,0x20c)+_0x44cea0(0x1ad,0x1ed));_0x178b48&&(this['config'][_0x4c75de(0x4eb,0x51a)][_0x44cea0(0x29b,0x259)]=_0x178b48);}else this[_0x4c75de(0x528,0x4f7)]=statSync(this[_0x4c75de(0x500,0x509)])['mtimeMs'];}catch{}}['get'](_0x234d8e){function _0x1253d3(_0x2c6061,_0x5c3531){return _0x44574d(_0x5c3531-0x3a2,_0x2c6061);}const _0x77915d=this[_0x1253d3(0x491,0x4b8)]();return _0x77915d[_0x234d8e];}[_0x44574d(0xfb,0x12b)](_0x2c1be2,_0x2cf49e){const _0x289381=this[_0x4cf20f(0x255,0x233)]();function _0x4cf20f(_0x3df391,_0x184ec2){return _0x46988f(_0x184ec2- -0x2e1,_0x3df391);}_0x289381[_0x2c1be2]=_0x2cf49e;function _0x2d677c(_0x1de1d7,_0xf1febe){return _0x46988f(_0x1de1d7- -0x43f,_0xf1febe);}this[_0x4cf20f(0x1de,0x21b)](_0x289381);}['setApiKey'](_0x1abe81){const _0x46eb9b={'EiMvV':function(_0x39c7e1,_0x58cc3b){return _0x39c7e1!==_0x58cc3b;},'iNXSB':_0x3b419b(-0xc,0x3a),'WZWgS':_0x4473bf(-0xb3,-0xb9)},_0x396cf5=getKeychainStore();if(_0x396cf5['isAvailabl'+'e']()&&_0x396cf5[_0x4473bf(-0xad,-0x9d)](_0x4473bf(-0xf6,-0xb2)+_0x4473bf(-0x115,-0xd6),_0x1abe81)){const _0x65ddf8=this[_0x3b419b(0x3e,0x7b)]();delete _0x65ddf8[_0x4473bf(-0xda,-0xce)][_0x3b419b(0x42,0x64)],this['save'](_0x65ddf8);if(this[_0x3b419b(0x93,0x5a)]){if(_0x46eb9b[_0x4473bf(-0x9e,-0x87)]('heSBk',_0x4473bf(-0xc4,-0xe3)))this[_0x3b419b(0x52,0x5a)][_0x4473bf(-0xda,-0xbc)][_0x3b419b(0x5a,0x64)]=_0x1abe81;else{const _0x3ea279=_0x3abc3d();_0x3ea279[_0x3b419b(-0x3a,0x2)]('server.api'+_0x3b419b(0x38,-0x8));const _0x524aad=this[_0x4473bf(-0x92,-0xca)]();delete _0x524aad['server']['apiKey'],this[_0x3b419b(0x4d,0x63)](_0x524aad);}}return _0x46eb9b[_0x4473bf(-0xa0,-0xb0)];}const _0x1643fb=this['load']();function _0x3b419b(_0x4096a5,_0x3ca3ce){return _0x44574d(_0x3ca3ce- -0x9b,_0x4096a5);}_0x1643fb[_0x4473bf(-0xda,-0xf7)][_0x3b419b(0xa8,0x64)]=_0x1abe81,this[_0x3b419b(0x2a,0x63)](_0x1643fb);function _0x4473bf(_0x5f0a60,_0x3bad4d){return _0x44574d(_0x5f0a60- -0x1a8,_0x3bad4d);}return _0x46eb9b[_0x3b419b(0x81,0x43)];}[_0x44574d(0xa1,0xdd)+'ey'](){const _0x443fbe=getKeychainStore();_0x443fbe['delete']('server.api'+_0x470f44(-0x192,-0x1c5));function _0x18d4e3(_0x1b7d1e,_0x1320cf){return _0x46988f(_0x1320cf- -0x2ce,_0x1b7d1e);}const _0x318122=this[_0x18d4e3(0x237,0x246)]();function _0x470f44(_0x2f86d0,_0x458de6){return _0x46988f(_0x458de6- -0x656,_0x2f86d0);}delete _0x318122[_0x470f44(-0x150,-0x18a)]['apiKey'],this['save'](_0x318122);}[_0x44574d(0xf3,0xeb)](){this[_0x37d560(0x4cb,0x4a7)]=structuredClone(DEFAULT_CONFIG);function _0x3fd869(_0x5a0c18,_0xe27ce9){return _0x44574d(_0xe27ce9- -0xad,_0x5a0c18);}this[_0x3fd869(0x8b,0x65)+'nFailed']=![];function _0x37d560(_0xe4745f,_0x2bd9f3){return _0x44574d(_0xe4745f-0x3d6,_0x2bd9f3);}this[_0x3fd869(0x80,0x51)](this[_0x3fd869(0x51,0x48)]);}[_0x46988f(0x51a,0x518)+'ir'](){const _0x1441e8={'SKMAA':function(_0x545961,_0x2f284c){return _0x545961+_0x2f284c;},'qZVwC':function(_0x5ec02d,_0x17f8e0,_0x230102){return _0x5ec02d(_0x17f8e0,_0x230102);},'itKHn':function(_0x4b617c,_0x1926bd,_0x26ef8b,_0x14f84f){return _0x4b617c(_0x1926bd,_0x26ef8b,_0x14f84f);},'Qspsu':'utf-8','klhCV':function(_0x4e16f7,_0x3981e3){return _0x4e16f7!==_0x3981e3;},'NHMIN':_0x30f323(-0x128,-0x109),'LUmAe':_0x5cffd2(0x224,0x246)};function _0x30f323(_0x180b0c,_0x36d3f7){return _0x44574d(_0x180b0c- -0x215,_0x36d3f7);}const _0x3c24b0=dirname(this[_0x30f323(-0x158,-0x11b)]);function _0x5cffd2(_0x5779a1,_0x3a2f12){return _0x44574d(_0x3a2f12-0x175,_0x5779a1);}if(!existsSync(_0x3c24b0)){if(_0x1441e8[_0x5cffd2(0x1db,0x20e)](_0x1441e8[_0x30f323(-0x15e,-0x12d)],_0x1441e8[_0x30f323(-0x107,-0xd4)]))mkdirSync(_0x3c24b0,{'recursive':!![]});else{const _0x119874=vgnPhL['SKMAA'](this[_0x30f323(-0x158,-0x139)],_0x30f323(-0x175,-0x1b0)),_0x25fadc=vgnPhL[_0x5cffd2(0x251,0x278)](_0x195eb0,this[_0x30f323(-0x158,-0x12c)],'utf-8');vgnPhL[_0x5cffd2(0x261,0x225)](_0x880dc6,_0x119874,_0x25fadc,vgnPhL[_0x30f323(-0x166,-0x137)]);}}return _0x3c24b0;}}function _0x34e7(_0x315f06,_0x1812d0){_0x315f06=_0x315f06-0x1b2;const _0x2c5848=_0x2c58();let _0x34e739=_0x2c5848[_0x315f06];if(_0x34e7['jVXqyG']===undefined){var _0x1c3d3c=function(_0x5b84dc){const _0x45f475='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1baa24='',_0x9d114b='';for(let _0x3c82cf=0x0,_0x4bc487,_0x464d29,_0x165e2f=0x0;_0x464d29=_0x5b84dc['charAt'](_0x165e2f++);~_0x464d29&&(_0x4bc487=_0x3c82cf%0x4?_0x4bc487*0x40+_0x464d29:_0x464d29,_0x3c82cf++%0x4)?_0x1baa24+=String['fromCharCode'](0xff&_0x4bc487>>(-0x2*_0x3c82cf&0x6)):0x0){_0x464d29=_0x45f475['indexOf'](_0x464d29);}for(let _0x55e3b6=0x0,_0x5e573b=_0x1baa24['length'];_0x55e3b6<_0x5e573b;_0x55e3b6++){_0x9d114b+='%'+('00'+_0x1baa24['charCodeAt'](_0x55e3b6)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x9d114b);};_0x34e7['ygoRba']=_0x1c3d3c,_0x34e7['Wdibtr']={},_0x34e7['jVXqyG']=!![];}const _0x5f5719=_0x2c5848[0x0],_0x1fd819=_0x315f06+_0x5f5719,_0x2c9092=_0x34e7['Wdibtr'][_0x1fd819];return!_0x2c9092?(_0x34e739=_0x34e7['ygoRba'](_0x34e739),_0x34e7['Wdibtr'][_0x1fd819]=_0x34e739):_0x34e739=_0x2c9092,_0x34e739;}let _instance=null,_instancePath;function _0x44574d(_0x2e68ca,_0xfebc10){return _0x34e7(_0x2e68ca- -0x120,_0xfebc10);}export function getConfigManager(_0x3249b4){const _0x16bbdb=_0x3249b4??process.env.A2A_CONFIG_PATH??DEFAULT_CONFIG_PATH;if(_instance&&_instancePath===_0x16bbdb)return _instance;return _instance=new ConfigManager(_0x16bbdb),_instancePath=_0x16bbdb,_instance;}export function resetConfigManager(){_instance=null,_instancePath=undefined;}