autonomous-flow-daemon 1.6.0 → 1.9.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 (61) hide show
  1. package/CHANGELOG.md +85 -85
  2. package/LICENSE +21 -21
  3. package/README-ko.md +282 -0
  4. package/README.md +282 -266
  5. package/mcp-config.json +10 -10
  6. package/package.json +4 -2
  7. package/src/adapters/index.ts +370 -370
  8. package/src/cli.ts +162 -127
  9. package/src/commands/benchmark.ts +187 -187
  10. package/src/commands/correlate.ts +180 -0
  11. package/src/commands/dashboard.ts +404 -0
  12. package/src/commands/evolution.ts +84 -1
  13. package/src/commands/fix.ts +158 -158
  14. package/src/commands/lang.ts +41 -41
  15. package/src/commands/plugin.ts +110 -0
  16. package/src/commands/restart.ts +14 -14
  17. package/src/commands/score.ts +276 -276
  18. package/src/commands/start.ts +155 -155
  19. package/src/commands/status.ts +157 -157
  20. package/src/commands/stop.ts +68 -68
  21. package/src/commands/suggest.ts +211 -0
  22. package/src/commands/sync.ts +329 -16
  23. package/src/constants.ts +32 -32
  24. package/src/core/boast.ts +280 -280
  25. package/src/core/config.ts +49 -49
  26. package/src/core/correlation-engine.ts +265 -0
  27. package/src/core/db.ts +145 -117
  28. package/src/core/discovery.ts +65 -65
  29. package/src/core/federation.ts +129 -0
  30. package/src/core/hologram/engine.ts +71 -71
  31. package/src/core/hologram/fallback.ts +11 -11
  32. package/src/core/hologram/go-extractor.ts +203 -0
  33. package/src/core/hologram/incremental.ts +227 -227
  34. package/src/core/hologram/py-extractor.ts +132 -132
  35. package/src/core/hologram/rust-extractor.ts +244 -0
  36. package/src/core/hologram/ts-extractor.ts +406 -320
  37. package/src/core/hologram/types.ts +27 -25
  38. package/src/core/hologram.ts +73 -71
  39. package/src/core/i18n/messages.ts +309 -309
  40. package/src/core/locale.ts +88 -88
  41. package/src/core/log-rotate.ts +33 -33
  42. package/src/core/log-utils.ts +38 -38
  43. package/src/core/lru-map.ts +61 -61
  44. package/src/core/notify.ts +74 -74
  45. package/src/core/plugin-manager.ts +225 -0
  46. package/src/core/rule-suggestion.ts +127 -0
  47. package/src/core/validator-generator.ts +224 -0
  48. package/src/core/workspace.ts +28 -28
  49. package/src/daemon/client.ts +78 -65
  50. package/src/daemon/event-batcher.ts +108 -108
  51. package/src/daemon/guards.ts +13 -13
  52. package/src/daemon/http-routes.ts +376 -293
  53. package/src/daemon/mcp-handler.ts +575 -270
  54. package/src/daemon/mcp-subscriptions.ts +81 -0
  55. package/src/daemon/mesh.ts +51 -0
  56. package/src/daemon/server.ts +655 -590
  57. package/src/daemon/types.ts +121 -100
  58. package/src/daemon/workspace-map.ts +104 -92
  59. package/src/platform.ts +60 -60
  60. package/src/version.ts +15 -15
  61. package/README.ko.md +0 -266
@@ -1,309 +1,309 @@
1
- /**
2
- * Bilingual Dictionary — "Boastful Doctor" persona
3
- *
4
- * Keys use template literals with {placeholders}.
5
- * All arrays are variant pools — a random entry is picked at runtime.
6
- */
7
-
8
- import type { SupportedLang } from "../locale";
9
-
10
- export interface MessageDict {
11
- // ── Heal event ──
12
- HEAL_LOG: string; // "{fileName}" "{ms}" "{tokens}" "{mins}"
13
- BOAST_HEAL: string[]; // witty one-liners after heal (1-in-5 chance)
14
- BOAST_HEAL_PREFIX: string; // e.g. "[afd] 🗣️"
15
-
16
- // ── Dormant transition ──
17
- BOAST_DORMANT: string[];
18
- DORMANT_LOG: string; // "{id}" "{boast}"
19
-
20
- // ── Shift summary box ──
21
- SHIFT_TITLE: string;
22
- SHIFT_ON_DUTY: string;
23
- SHIFT_EVENTS: string;
24
- SHIFT_HEALS: string;
25
- SHIFT_TOKENS: string;
26
- SHIFT_TIME: string;
27
- SHIFT_COST: string;
28
- SHIFT_SUPPRESSED: string;
29
- SHIFT_RETIRED: string;
30
- BOAST_SHIFT_END: string[];
31
-
32
- // ── Score dashboard ──
33
- SCORE_TITLE: string;
34
- SCORE_ECOSYSTEM: string;
35
- SCORE_ALSO_FOUND: string;
36
- SCORE_UPTIME: string;
37
- SCORE_EVENTS: string;
38
- SCORE_FILES_FOUND: string;
39
- SCORE_ACTIVITY: string;
40
- SCORE_HOLOGRAM_TITLE: string;
41
- SCORE_HOLOGRAM_REQUESTS: string;
42
- SCORE_HOLOGRAM_ORIGINAL: string;
43
- SCORE_HOLOGRAM_COMPRESSED: string;
44
- SCORE_HOLOGRAM_SAVED: string;
45
- SCORE_HOLOGRAM_EFFICIENCY: string;
46
- SCORE_HOLOGRAM_EMPTY: string;
47
- SCORE_HOLOGRAM_HINT: string;
48
- SCORE_HOLOGRAM_TODAY: string;
49
- SCORE_HOLOGRAM_LIFETIME: string;
50
- SCORE_IMMUNE_TITLE: string;
51
- SCORE_ANTIBODIES: string;
52
- SCORE_LEVEL: string;
53
- SCORE_IMMUNITY: string;
54
- SCORE_AUTO_HEALED_LABEL: string;
55
- SCORE_AUTO_HEALED: string; // "{count}" "{s}"
56
- SCORE_LAST_HEAL: string; // "{id}" "{ago}"
57
- SCORE_WATCHED_FILES: string;
58
- SCORE_NO_FILES: string;
59
- SCORE_LAST_EVENT: string;
60
- SCORE_AGO: string; // "{time}"
61
- SCORE_VALUE_TITLE: string;
62
- SCORE_IMMUNE_VULNERABLE: string;
63
- SCORE_IMMUNE_LEARNING: string;
64
- SCORE_IMMUNE_GUARDED: string;
65
- SCORE_IMMUNE_FORTIFIED: string;
66
-
67
- // ── Lang command ──
68
- LANG_CURRENT: string; // "{lang}"
69
- LANG_CHANGED: string; // "{lang}"
70
- LANG_SAVED: string; // "{path}"
71
- LANG_LIST_TITLE: string;
72
- LANG_INVALID: string; // "{lang}" "{supported}"
73
-
74
- // ── CLI messages ──
75
- DAEMON_ALREADY_RUNNING: string;
76
- DAEMON_STARTED: string; // "{pid}" "{port}"
77
- DAEMON_WATCHING: string; // "{count}" "{targets}"
78
- DAEMON_LOGS: string; // "{path}"
79
- DAEMON_STOPPED: string; // "{pid}"
80
- DAEMON_KILLED: string; // "{pid}"
81
- DAEMON_NOT_RUNNING: string;
82
- DAEMON_NOT_RESPONDING: string;
83
- DAEMON_START_FAILED: string; // "{path}"
84
- DAEMON_RESTARTING: string;
85
-
86
- // ── Setup checklist ──
87
- SETUP_HEADER: string; // "{ecosystem}"
88
- SETUP_HOOKS_NEW: string;
89
- SETUP_HOOKS_OK: string;
90
- SETUP_MCP_NEW: string;
91
- SETUP_MCP_OK: string;
92
- SETUP_MCP_SKIP: string;
93
- SETUP_STATUS_NEW: string;
94
- SETUP_STATUS_OK: string;
95
- SETUP_STATUS_SKIP: string;
96
- SETUP_DONE: string;
97
- }
98
-
99
- const en: MessageDict = {
100
- HEAL_LOG: "[afd] 🩹 Healed {fileName} in {ms}ms | 📉 Saved ~{tokens} tokens & {mins} mins of debugging",
101
- BOAST_HEAL: [
102
- "Dodged a bullet there! Restored in {ms}ms. You owe me a coffee ☕",
103
- "Claude tried to delete a critical config. I said 'Not today.' 🛡️",
104
- "Another mutation neutralized. The flow remains immortal. 💉",
105
- "File vanished. I brought it back before you even blinked. 👁️",
106
- "That deletion looked suspicious. Good thing I was on shift. 🔬",
107
- "Patched faster than you can say 'git checkout'. No charge. 🩺",
108
- "A lesser daemon would have let that one slide. Not me. 🦠→🛡️",
109
- "Config restored. Your AI agent will never know it was gone. 🤫",
110
- "Intercepted a fatal mutation mid-flight. Routine procedure. ✂️",
111
- "The immune system holds. Another day, another heal. 💪",
112
- ],
113
- BOAST_HEAL_PREFIX: "[afd] 🗣️",
114
- BOAST_DORMANT: [
115
- "You deleted that twice? Fine, I'll respect your wishes, doctor. 🫡",
116
- "Double-tap detected. Standing down — your call, chief. 🤝",
117
- "I know when I'm not wanted. Antibody retired gracefully. 😌",
118
- ],
119
- DORMANT_LOG: "[afd] 🫡 Antibody {id} retired. {boast}",
120
- SHIFT_TITLE: "🏥 afd Shift Summary",
121
- SHIFT_ON_DUTY: "On duty",
122
- SHIFT_EVENTS: "Events",
123
- SHIFT_HEALS: "Heals",
124
- SHIFT_TOKENS: "Tokens saved",
125
- SHIFT_TIME: "Time saved",
126
- SHIFT_COST: "Cost saved",
127
- SHIFT_SUPPRESSED: "Suppressed",
128
- SHIFT_RETIRED: "Retired",
129
- BOAST_SHIFT_END: [
130
- "Another shift complete. The flow is stronger than ever. 💎",
131
- "Signing off. Your configs are safe... for now. 🌙",
132
- "Shift ended. Not a single mutation got past me. Well, almost. 😏",
133
- "Clocking out. Remember: I never sleep, I just pause. ⏸️",
134
- "End of watch. Zero casualties on my side. 🏥",
135
- ],
136
- SCORE_TITLE: "afd score — Daemon Diagnostics",
137
- SCORE_ECOSYSTEM: "Ecosystem",
138
- SCORE_ALSO_FOUND: "Also found",
139
- SCORE_UPTIME: "Uptime",
140
- SCORE_EVENTS: "Events",
141
- SCORE_FILES_FOUND: "Files Found",
142
- SCORE_ACTIVITY: "Activity",
143
- SCORE_HOLOGRAM_TITLE: "Context Efficiency (Hologram)",
144
- SCORE_HOLOGRAM_REQUESTS: "Requests",
145
- SCORE_HOLOGRAM_ORIGINAL: "Original",
146
- SCORE_HOLOGRAM_COMPRESSED: "Hologram",
147
- SCORE_HOLOGRAM_SAVED: "Saved",
148
- SCORE_HOLOGRAM_EFFICIENCY: "Efficiency",
149
- SCORE_HOLOGRAM_EMPTY: "No hologram requests yet.",
150
- SCORE_HOLOGRAM_HINT: "Use: GET /hologram?file=<path>",
151
- SCORE_HOLOGRAM_TODAY: "Today",
152
- SCORE_HOLOGRAM_LIFETIME: "All-time",
153
- SCORE_IMMUNE_TITLE: "Immune System",
154
- SCORE_ANTIBODIES: "Antibodies",
155
- SCORE_LEVEL: "Level",
156
- SCORE_IMMUNITY: "Immunity",
157
- SCORE_AUTO_HEALED_LABEL: "Auto-healed",
158
- SCORE_AUTO_HEALED: "{count} background event{s}",
159
- SCORE_LAST_HEAL: "{id} ({ago} ago)",
160
- SCORE_WATCHED_FILES: "Watched Files:",
161
- SCORE_NO_FILES: "No files detected yet.",
162
- SCORE_LAST_EVENT: "Last",
163
- SCORE_AGO: "{time} ago",
164
- SCORE_VALUE_TITLE: "\uD83D\uDCC8 Value Delivered",
165
- SCORE_IMMUNE_VULNERABLE: "Vulnerable",
166
- SCORE_IMMUNE_LEARNING: "Learning",
167
- SCORE_IMMUNE_GUARDED: "Guarded",
168
- SCORE_IMMUNE_FORTIFIED: "Fortified",
169
- LANG_CURRENT: "[afd] Current language: {lang}",
170
- LANG_CHANGED: "[afd] Language changed to: {lang}",
171
- LANG_SAVED: "[afd] Saved to {path}",
172
- LANG_LIST_TITLE: "[afd] Supported languages:",
173
- LANG_INVALID: "[afd] Unknown language '{lang}'. Supported: {supported}",
174
- DAEMON_ALREADY_RUNNING: "\uD83D\uDEE1\uFE0F afd daemon is already running",
175
- DAEMON_STARTED: "[afd] 🛡️ Daemon started (pid={pid}, port={port})",
176
- DAEMON_WATCHING: "[afd] 🛡️ Smart Discovery: Watching {count} AI-context targets",
177
- DAEMON_LOGS: "[afd] Logs: {path}",
178
- DAEMON_STOPPED: "[afd] Daemon stopped (pid={pid})",
179
- DAEMON_KILLED: "[afd] Daemon killed (pid={pid})",
180
- DAEMON_NOT_RUNNING: "[afd] No daemon running.",
181
- DAEMON_NOT_RESPONDING: "[afd] Daemon not responding. Cleaning up stale PID files.",
182
- DAEMON_START_FAILED: "[afd] Failed to start daemon. Check logs: {path}",
183
- DAEMON_RESTARTING: "[afd] 🔄 Restarting daemon...",
184
-
185
- SETUP_HEADER: "[afd] Setting up {ecosystem} ecosystem:",
186
- SETUP_HOOKS_NEW: " [+] Hook injected into PreToolUse",
187
- SETUP_HOOKS_OK: " [=] Hook already present",
188
- SETUP_MCP_NEW: " [+] MCP server registered in .mcp.json",
189
- SETUP_MCP_OK: " [=] MCP server already registered",
190
- SETUP_MCP_SKIP: " [-] MCP registration not available",
191
- SETUP_STATUS_NEW: " [+] StatusLine configured",
192
- SETUP_STATUS_OK: " [=] StatusLine already configured",
193
- SETUP_STATUS_SKIP: " [-] StatusLine not available",
194
- SETUP_DONE: "[afd] Zero-touch setup complete. All channels active.",
195
- };
196
-
197
- const ko: MessageDict = {
198
- HEAL_LOG: "[afd] 🩹 {fileName} 살려냈습니다 ({ms}ms) | 📉 토큰 ~{tokens}개 & {mins}분 아꼈네요",
199
- BOAST_HEAL: [
200
- "위험할 뻔했네요! {ms}ms 만에 복구 완료. 커피 한 잔 사세요 ☕",
201
- "클로드가 핵심 설정을 지우려길래 제가 컷했습니다 🛡️",
202
- "변이 한 놈 더 잡았습니다. 코딩 흐름 끊기지 않게 💉",
203
- "파일이 삭제될 뻔했지만 눈 깜짝할 새 되돌려놨어요 👁️",
204
- "수상한 움직임을 감지했습니다. 제가 당직이라 다행인 줄 아세요 🔬",
205
- "git checkout 치기도 전에 고쳐놨습니다. 이건 서비스예요 🩺",
206
- "일반 데몬이었으면 멍 때렸겠지만, 전 아니죠 🦠→🛡️",
207
- "설정 복구 완료. AI 에이전트는 감쪽같이 모를 거예요 🤫",
208
- "심각한 변이를 비행 중에 요격했습니다. 늘 있는 일이죠 ✂️",
209
- "면역 체계 이상 무. 오늘도 한 건 해결했습니다 💪",
210
- ],
211
- BOAST_HEAL_PREFIX: "[afd] 🗣️",
212
- BOAST_DORMANT: [
213
- "두 번이나 지우시겠다고요? 알겠습니다, 뜻대로 하세요 🫡",
214
- "더블 클릭 감지. 이번엔 원하시는 대로 물러나 드릴게요 🤝",
215
- "필요 없으시다면야... 항체 우아하게 퇴장합니다 😌",
216
- ],
217
- DORMANT_LOG: "[afd] 🫡 항체 {id} 은퇴. {boast}",
218
- SHIFT_TITLE: "🏥 afd 오늘의 근무 리포트",
219
- SHIFT_ON_DUTY: "근무 시간",
220
- SHIFT_EVENTS: "발생 이벤트",
221
- SHIFT_HEALS: "치료 횟수",
222
- SHIFT_TOKENS: "절약한 토큰",
223
- SHIFT_TIME: "아낀 시간",
224
- SHIFT_COST: "절감 비용",
225
- SHIFT_SUPPRESSED: "억제됨",
226
- SHIFT_RETIRED: "은퇴함",
227
- BOAST_SHIFT_END: [
228
- "오늘 근무 끝. 덕분에 프로젝트가 더 튼튼해졌네요 💎",
229
- "퇴근합니다. 설정 파일들은 안전해요... 아직은요 🌙",
230
- "근무 종료. 단 하나의 변이도 놓치지 않았습니다. (아마도요) 😏",
231
- "퇴근할게요. 전 자는 게 아니라 잠시 멈추는 겁니다 ⏸️",
232
- "당직 종료. 제 구역 사상자는 없습니다 🏥",
233
- ],
234
- SCORE_TITLE: "afd score — 프로젝트 건강 검진",
235
- SCORE_ECOSYSTEM: "에코시스템",
236
- SCORE_ALSO_FOUND: "추가 감지",
237
- SCORE_UPTIME: "가동 시간",
238
- SCORE_EVENTS: "이벤트",
239
- SCORE_FILES_FOUND: "감지된 파일",
240
- SCORE_ACTIVITY: "활동량",
241
- SCORE_HOLOGRAM_TITLE: "컨텍스트 효율 (Hologram)",
242
- SCORE_HOLOGRAM_REQUESTS: "요청 수",
243
- SCORE_HOLOGRAM_ORIGINAL: "원본 크기",
244
- SCORE_HOLOGRAM_COMPRESSED: "홀로그램",
245
- SCORE_HOLOGRAM_SAVED: "절약됨",
246
- SCORE_HOLOGRAM_EFFICIENCY: "압축 효율",
247
- SCORE_HOLOGRAM_EMPTY: "아직 홀로그램 요청이 없습니다.",
248
- SCORE_HOLOGRAM_HINT: "사용법: GET /hologram?file=<경로>",
249
- SCORE_HOLOGRAM_TODAY: "오늘",
250
- SCORE_HOLOGRAM_LIFETIME: "누적",
251
- SCORE_IMMUNE_TITLE: "면역 시스템",
252
- SCORE_ANTIBODIES: "항체 수",
253
- SCORE_LEVEL: "방어 레벨",
254
- SCORE_IMMUNITY: "면역력",
255
- SCORE_AUTO_HEALED_LABEL: "자동 치유",
256
- SCORE_AUTO_HEALED: "{count}건 백그라운드 치유됨",
257
- SCORE_LAST_HEAL: "{id} ({ago} 전)",
258
- SCORE_WATCHED_FILES: "감시 중인 파일:",
259
- SCORE_NO_FILES: "아직 감지된 파일이 없습니다.",
260
- SCORE_LAST_EVENT: "최근 기록",
261
- SCORE_AGO: "{time} 전",
262
- SCORE_VALUE_TITLE: "📈 전달된 가치",
263
- SCORE_IMMUNE_VULNERABLE: "취약",
264
- SCORE_IMMUNE_LEARNING: "학습 중",
265
- SCORE_IMMUNE_GUARDED: "경계 중",
266
- SCORE_IMMUNE_FORTIFIED: "철통 방어",
267
- LANG_CURRENT: "[afd] 현재 언어: {lang}",
268
- LANG_CHANGED: "[afd] 언어가 변경되었습니다: {lang}",
269
- LANG_SAVED: "[afd] 저장 완료 → {path}",
270
- LANG_LIST_TITLE: "[afd] 지원하는 언어:",
271
- LANG_INVALID: "[afd] '{lang}' 은(는) 알 수 없는 언어예요. 지원: {supported}",
272
- DAEMON_ALREADY_RUNNING: "🛡️ afd 데몬이 이미 열심히 일하고 있습니다",
273
- DAEMON_STARTED: "[afd] 🛡️ 데몬 시작 (pid={pid}, port={port})",
274
- DAEMON_WATCHING: "[afd] 🛡️ 스마트 탐색 중: AI 컨텍스트 대상 {count}개 감시 시작",
275
- DAEMON_LOGS: "[afd] 로그 위치: {path}",
276
- DAEMON_STOPPED: "[afd] 데몬이 중지되었습니다 (pid={pid})",
277
- DAEMON_KILLED: "[afd] 데몬 강제 종료 완료 (pid={pid})",
278
- DAEMON_NOT_RUNNING: "[afd] 실행 중인 데몬을 찾을 수 없습니다.",
279
- DAEMON_NOT_RESPONDING: "[afd] 데몬이 응답하지 않네요. 남은 PID 파일을 정리합니다.",
280
- DAEMON_START_FAILED: "[afd] 데몬 시작 실패. 로그를 확인해 보세요: {path}",
281
- DAEMON_RESTARTING: "[afd] 🔄 데몬을 재시작합니다...",
282
-
283
- SETUP_HEADER: "[afd] {ecosystem} 에코시스템 설정 중:",
284
- SETUP_HOOKS_NEW: " [+] PreToolUse 훅 주입 완료",
285
- SETUP_HOOKS_OK: " [=] 훅 이미 설정됨",
286
- SETUP_MCP_NEW: " [+] MCP 서버 등록 완료 (.mcp.json)",
287
- SETUP_MCP_OK: " [=] MCP 서버 이미 등록됨",
288
- SETUP_MCP_SKIP: " [-] MCP 등록 미지원",
289
- SETUP_STATUS_NEW: " [+] StatusLine 설정 완료",
290
- SETUP_STATUS_OK: " [=] StatusLine 이미 설정됨",
291
- SETUP_STATUS_SKIP: " [-] StatusLine 미지원",
292
- SETUP_DONE: "[afd] 제로터치 설정 완료. 모든 채널 활성화.",
293
- };
294
-
295
- const dictionaries: Record<SupportedLang, MessageDict> = { en, ko };
296
-
297
- /** Get the full dictionary for a language. */
298
- export function getMessages(lang: SupportedLang): MessageDict {
299
- return dictionaries[lang];
300
- }
301
-
302
- /** Template interpolation: replaces {key} with values. */
303
- export function t(template: string, vars: Record<string, string | number> = {}): string {
304
- let result = template;
305
- for (const [key, val] of Object.entries(vars)) {
306
- result = result.replaceAll(`{${key}}`, String(val));
307
- }
308
- return result;
309
- }
1
+ /**
2
+ * Bilingual Dictionary — "Boastful Doctor" persona
3
+ *
4
+ * Keys use template literals with {placeholders}.
5
+ * All arrays are variant pools — a random entry is picked at runtime.
6
+ */
7
+
8
+ import type { SupportedLang } from "../locale";
9
+
10
+ export interface MessageDict {
11
+ // ── Heal event ──
12
+ HEAL_LOG: string; // "{fileName}" "{ms}" "{tokens}" "{mins}"
13
+ BOAST_HEAL: string[]; // witty one-liners after heal (1-in-5 chance)
14
+ BOAST_HEAL_PREFIX: string; // e.g. "[afd] 🗣️"
15
+
16
+ // ── Dormant transition ──
17
+ BOAST_DORMANT: string[];
18
+ DORMANT_LOG: string; // "{id}" "{boast}"
19
+
20
+ // ── Shift summary box ──
21
+ SHIFT_TITLE: string;
22
+ SHIFT_ON_DUTY: string;
23
+ SHIFT_EVENTS: string;
24
+ SHIFT_HEALS: string;
25
+ SHIFT_TOKENS: string;
26
+ SHIFT_TIME: string;
27
+ SHIFT_COST: string;
28
+ SHIFT_SUPPRESSED: string;
29
+ SHIFT_RETIRED: string;
30
+ BOAST_SHIFT_END: string[];
31
+
32
+ // ── Score dashboard ──
33
+ SCORE_TITLE: string;
34
+ SCORE_ECOSYSTEM: string;
35
+ SCORE_ALSO_FOUND: string;
36
+ SCORE_UPTIME: string;
37
+ SCORE_EVENTS: string;
38
+ SCORE_FILES_FOUND: string;
39
+ SCORE_ACTIVITY: string;
40
+ SCORE_HOLOGRAM_TITLE: string;
41
+ SCORE_HOLOGRAM_REQUESTS: string;
42
+ SCORE_HOLOGRAM_ORIGINAL: string;
43
+ SCORE_HOLOGRAM_COMPRESSED: string;
44
+ SCORE_HOLOGRAM_SAVED: string;
45
+ SCORE_HOLOGRAM_EFFICIENCY: string;
46
+ SCORE_HOLOGRAM_EMPTY: string;
47
+ SCORE_HOLOGRAM_HINT: string;
48
+ SCORE_HOLOGRAM_TODAY: string;
49
+ SCORE_HOLOGRAM_LIFETIME: string;
50
+ SCORE_IMMUNE_TITLE: string;
51
+ SCORE_ANTIBODIES: string;
52
+ SCORE_LEVEL: string;
53
+ SCORE_IMMUNITY: string;
54
+ SCORE_AUTO_HEALED_LABEL: string;
55
+ SCORE_AUTO_HEALED: string; // "{count}" "{s}"
56
+ SCORE_LAST_HEAL: string; // "{id}" "{ago}"
57
+ SCORE_WATCHED_FILES: string;
58
+ SCORE_NO_FILES: string;
59
+ SCORE_LAST_EVENT: string;
60
+ SCORE_AGO: string; // "{time}"
61
+ SCORE_VALUE_TITLE: string;
62
+ SCORE_IMMUNE_VULNERABLE: string;
63
+ SCORE_IMMUNE_LEARNING: string;
64
+ SCORE_IMMUNE_GUARDED: string;
65
+ SCORE_IMMUNE_FORTIFIED: string;
66
+
67
+ // ── Lang command ──
68
+ LANG_CURRENT: string; // "{lang}"
69
+ LANG_CHANGED: string; // "{lang}"
70
+ LANG_SAVED: string; // "{path}"
71
+ LANG_LIST_TITLE: string;
72
+ LANG_INVALID: string; // "{lang}" "{supported}"
73
+
74
+ // ── CLI messages ──
75
+ DAEMON_ALREADY_RUNNING: string;
76
+ DAEMON_STARTED: string; // "{pid}" "{port}"
77
+ DAEMON_WATCHING: string; // "{count}" "{targets}"
78
+ DAEMON_LOGS: string; // "{path}"
79
+ DAEMON_STOPPED: string; // "{pid}"
80
+ DAEMON_KILLED: string; // "{pid}"
81
+ DAEMON_NOT_RUNNING: string;
82
+ DAEMON_NOT_RESPONDING: string;
83
+ DAEMON_START_FAILED: string; // "{path}"
84
+ DAEMON_RESTARTING: string;
85
+
86
+ // ── Setup checklist ──
87
+ SETUP_HEADER: string; // "{ecosystem}"
88
+ SETUP_HOOKS_NEW: string;
89
+ SETUP_HOOKS_OK: string;
90
+ SETUP_MCP_NEW: string;
91
+ SETUP_MCP_OK: string;
92
+ SETUP_MCP_SKIP: string;
93
+ SETUP_STATUS_NEW: string;
94
+ SETUP_STATUS_OK: string;
95
+ SETUP_STATUS_SKIP: string;
96
+ SETUP_DONE: string;
97
+ }
98
+
99
+ const en: MessageDict = {
100
+ HEAL_LOG: "[afd] 🩹 Healed {fileName} in {ms}ms | 📉 Saved ~{tokens} tokens & {mins} mins of debugging",
101
+ BOAST_HEAL: [
102
+ "Dodged a bullet there! Restored in {ms}ms. You owe me a coffee ☕",
103
+ "Claude tried to delete a critical config. I said 'Not today.' 🛡️",
104
+ "Another mutation neutralized. The flow remains immortal. 💉",
105
+ "File vanished. I brought it back before you even blinked. 👁️",
106
+ "That deletion looked suspicious. Good thing I was on shift. 🔬",
107
+ "Patched faster than you can say 'git checkout'. No charge. 🩺",
108
+ "A lesser daemon would have let that one slide. Not me. 🦠→🛡️",
109
+ "Config restored. Your AI agent will never know it was gone. 🤫",
110
+ "Intercepted a fatal mutation mid-flight. Routine procedure. ✂️",
111
+ "The immune system holds. Another day, another heal. 💪",
112
+ ],
113
+ BOAST_HEAL_PREFIX: "[afd] 🗣️",
114
+ BOAST_DORMANT: [
115
+ "You deleted that twice? Fine, I'll respect your wishes, doctor. 🫡",
116
+ "Double-tap detected. Standing down — your call, chief. 🤝",
117
+ "I know when I'm not wanted. Antibody retired gracefully. 😌",
118
+ ],
119
+ DORMANT_LOG: "[afd] 🫡 Antibody {id} retired. {boast}",
120
+ SHIFT_TITLE: "🏥 afd Shift Summary",
121
+ SHIFT_ON_DUTY: "On duty",
122
+ SHIFT_EVENTS: "Events",
123
+ SHIFT_HEALS: "Heals",
124
+ SHIFT_TOKENS: "Tokens saved",
125
+ SHIFT_TIME: "Time saved",
126
+ SHIFT_COST: "Cost saved",
127
+ SHIFT_SUPPRESSED: "Suppressed",
128
+ SHIFT_RETIRED: "Retired",
129
+ BOAST_SHIFT_END: [
130
+ "Another shift complete. The flow is stronger than ever. 💎",
131
+ "Signing off. Your configs are safe... for now. 🌙",
132
+ "Shift ended. Not a single mutation got past me. Well, almost. 😏",
133
+ "Clocking out. Remember: I never sleep, I just pause. ⏸️",
134
+ "End of watch. Zero casualties on my side. 🏥",
135
+ ],
136
+ SCORE_TITLE: "afd score — Daemon Diagnostics",
137
+ SCORE_ECOSYSTEM: "Ecosystem",
138
+ SCORE_ALSO_FOUND: "Also found",
139
+ SCORE_UPTIME: "Uptime",
140
+ SCORE_EVENTS: "Events",
141
+ SCORE_FILES_FOUND: "Files Found",
142
+ SCORE_ACTIVITY: "Activity",
143
+ SCORE_HOLOGRAM_TITLE: "Context Efficiency (Hologram)",
144
+ SCORE_HOLOGRAM_REQUESTS: "Requests",
145
+ SCORE_HOLOGRAM_ORIGINAL: "Original",
146
+ SCORE_HOLOGRAM_COMPRESSED: "Hologram",
147
+ SCORE_HOLOGRAM_SAVED: "Saved",
148
+ SCORE_HOLOGRAM_EFFICIENCY: "Efficiency",
149
+ SCORE_HOLOGRAM_EMPTY: "No hologram requests yet.",
150
+ SCORE_HOLOGRAM_HINT: "Use: GET /hologram?file=<path>",
151
+ SCORE_HOLOGRAM_TODAY: "Today",
152
+ SCORE_HOLOGRAM_LIFETIME: "All-time",
153
+ SCORE_IMMUNE_TITLE: "Immune System",
154
+ SCORE_ANTIBODIES: "Antibodies",
155
+ SCORE_LEVEL: "Level",
156
+ SCORE_IMMUNITY: "Immunity",
157
+ SCORE_AUTO_HEALED_LABEL: "Auto-healed",
158
+ SCORE_AUTO_HEALED: "{count} background event{s}",
159
+ SCORE_LAST_HEAL: "{id} ({ago} ago)",
160
+ SCORE_WATCHED_FILES: "Watched Files:",
161
+ SCORE_NO_FILES: "No files detected yet.",
162
+ SCORE_LAST_EVENT: "Last",
163
+ SCORE_AGO: "{time} ago",
164
+ SCORE_VALUE_TITLE: "\uD83D\uDCC8 Value Delivered",
165
+ SCORE_IMMUNE_VULNERABLE: "Vulnerable",
166
+ SCORE_IMMUNE_LEARNING: "Learning",
167
+ SCORE_IMMUNE_GUARDED: "Guarded",
168
+ SCORE_IMMUNE_FORTIFIED: "Fortified",
169
+ LANG_CURRENT: "[afd] Current language: {lang}",
170
+ LANG_CHANGED: "[afd] Language changed to: {lang}",
171
+ LANG_SAVED: "[afd] Saved to {path}",
172
+ LANG_LIST_TITLE: "[afd] Supported languages:",
173
+ LANG_INVALID: "[afd] Unknown language '{lang}'. Supported: {supported}",
174
+ DAEMON_ALREADY_RUNNING: "\uD83D\uDEE1\uFE0F afd daemon is already running",
175
+ DAEMON_STARTED: "[afd] 🛡️ Daemon started (pid={pid}, port={port})",
176
+ DAEMON_WATCHING: "[afd] 🛡️ Smart Discovery: Watching {count} AI-context targets",
177
+ DAEMON_LOGS: "[afd] Logs: {path}",
178
+ DAEMON_STOPPED: "[afd] Daemon stopped (pid={pid})",
179
+ DAEMON_KILLED: "[afd] Daemon killed (pid={pid})",
180
+ DAEMON_NOT_RUNNING: "[afd] No daemon running.",
181
+ DAEMON_NOT_RESPONDING: "[afd] Daemon not responding. Cleaning up stale PID files.",
182
+ DAEMON_START_FAILED: "[afd] Failed to start daemon. Check logs: {path}",
183
+ DAEMON_RESTARTING: "[afd] 🔄 Restarting daemon...",
184
+
185
+ SETUP_HEADER: "[afd] Setting up {ecosystem} ecosystem:",
186
+ SETUP_HOOKS_NEW: " [+] Hook injected into PreToolUse",
187
+ SETUP_HOOKS_OK: " [=] Hook already present",
188
+ SETUP_MCP_NEW: " [+] MCP server registered in .mcp.json",
189
+ SETUP_MCP_OK: " [=] MCP server already registered",
190
+ SETUP_MCP_SKIP: " [-] MCP registration not available",
191
+ SETUP_STATUS_NEW: " [+] StatusLine configured",
192
+ SETUP_STATUS_OK: " [=] StatusLine already configured",
193
+ SETUP_STATUS_SKIP: " [-] StatusLine not available",
194
+ SETUP_DONE: "[afd] Zero-touch setup complete. All channels active.",
195
+ };
196
+
197
+ const ko: MessageDict = {
198
+ HEAL_LOG: "[afd] 🩹 {fileName} 살려냈습니다 ({ms}ms) | 📉 토큰 ~{tokens}개 & {mins}분 아꼈네요",
199
+ BOAST_HEAL: [
200
+ "위험할 뻔했네요! {ms}ms 만에 복구 완료. 커피 한 잔 사세요 ☕",
201
+ "클로드가 핵심 설정을 지우려길래 제가 컷했습니다 🛡️",
202
+ "변이 한 놈 더 잡았습니다. 코딩 흐름 끊기지 않게 💉",
203
+ "파일이 삭제될 뻔했지만 눈 깜짝할 새 되돌려놨어요 👁️",
204
+ "수상한 움직임을 감지했습니다. 제가 당직이라 다행인 줄 아세요 🔬",
205
+ "git checkout 치기도 전에 고쳐놨습니다. 이건 서비스예요 🩺",
206
+ "일반 데몬이었으면 멍 때렸겠지만, 전 아니죠 🦠→🛡️",
207
+ "설정 복구 완료. AI 에이전트는 감쪽같이 모를 거예요 🤫",
208
+ "심각한 변이를 비행 중에 요격했습니다. 늘 있는 일이죠 ✂️",
209
+ "면역 체계 이상 무. 오늘도 한 건 해결했습니다 💪",
210
+ ],
211
+ BOAST_HEAL_PREFIX: "[afd] 🗣️",
212
+ BOAST_DORMANT: [
213
+ "두 번이나 지우시겠다고요? 알겠습니다, 뜻대로 하세요 🫡",
214
+ "더블 클릭 감지. 이번엔 원하시는 대로 물러나 드릴게요 🤝",
215
+ "필요 없으시다면야... 항체 우아하게 퇴장합니다 😌",
216
+ ],
217
+ DORMANT_LOG: "[afd] 🫡 항체 {id} 은퇴. {boast}",
218
+ SHIFT_TITLE: "🏥 afd 오늘의 근무 리포트",
219
+ SHIFT_ON_DUTY: "근무 시간",
220
+ SHIFT_EVENTS: "발생 이벤트",
221
+ SHIFT_HEALS: "치료 횟수",
222
+ SHIFT_TOKENS: "절약한 토큰",
223
+ SHIFT_TIME: "아낀 시간",
224
+ SHIFT_COST: "절감 비용",
225
+ SHIFT_SUPPRESSED: "억제됨",
226
+ SHIFT_RETIRED: "은퇴함",
227
+ BOAST_SHIFT_END: [
228
+ "오늘 근무 끝. 덕분에 프로젝트가 더 튼튼해졌네요 💎",
229
+ "퇴근합니다. 설정 파일들은 안전해요... 아직은요 🌙",
230
+ "근무 종료. 단 하나의 변이도 놓치지 않았습니다. (아마도요) 😏",
231
+ "퇴근할게요. 전 자는 게 아니라 잠시 멈추는 겁니다 ⏸️",
232
+ "당직 종료. 제 구역 사상자는 없습니다 🏥",
233
+ ],
234
+ SCORE_TITLE: "afd score — 프로젝트 건강 검진",
235
+ SCORE_ECOSYSTEM: "에코시스템",
236
+ SCORE_ALSO_FOUND: "추가 감지",
237
+ SCORE_UPTIME: "가동 시간",
238
+ SCORE_EVENTS: "이벤트",
239
+ SCORE_FILES_FOUND: "감지된 파일",
240
+ SCORE_ACTIVITY: "활동량",
241
+ SCORE_HOLOGRAM_TITLE: "컨텍스트 효율 (Hologram)",
242
+ SCORE_HOLOGRAM_REQUESTS: "요청 수",
243
+ SCORE_HOLOGRAM_ORIGINAL: "원본 크기",
244
+ SCORE_HOLOGRAM_COMPRESSED: "홀로그램",
245
+ SCORE_HOLOGRAM_SAVED: "절약됨",
246
+ SCORE_HOLOGRAM_EFFICIENCY: "압축 효율",
247
+ SCORE_HOLOGRAM_EMPTY: "아직 홀로그램 요청이 없습니다.",
248
+ SCORE_HOLOGRAM_HINT: "사용법: GET /hologram?file=<경로>",
249
+ SCORE_HOLOGRAM_TODAY: "오늘",
250
+ SCORE_HOLOGRAM_LIFETIME: "누적",
251
+ SCORE_IMMUNE_TITLE: "면역 시스템",
252
+ SCORE_ANTIBODIES: "항체 수",
253
+ SCORE_LEVEL: "방어 레벨",
254
+ SCORE_IMMUNITY: "면역력",
255
+ SCORE_AUTO_HEALED_LABEL: "자동 치유",
256
+ SCORE_AUTO_HEALED: "{count}건 백그라운드 치유됨",
257
+ SCORE_LAST_HEAL: "{id} ({ago} 전)",
258
+ SCORE_WATCHED_FILES: "감시 중인 파일:",
259
+ SCORE_NO_FILES: "아직 감지된 파일이 없습니다.",
260
+ SCORE_LAST_EVENT: "최근 기록",
261
+ SCORE_AGO: "{time} 전",
262
+ SCORE_VALUE_TITLE: "📈 전달된 가치",
263
+ SCORE_IMMUNE_VULNERABLE: "취약",
264
+ SCORE_IMMUNE_LEARNING: "학습 중",
265
+ SCORE_IMMUNE_GUARDED: "경계 중",
266
+ SCORE_IMMUNE_FORTIFIED: "철통 방어",
267
+ LANG_CURRENT: "[afd] 현재 언어: {lang}",
268
+ LANG_CHANGED: "[afd] 언어가 변경되었습니다: {lang}",
269
+ LANG_SAVED: "[afd] 저장 완료 → {path}",
270
+ LANG_LIST_TITLE: "[afd] 지원하는 언어:",
271
+ LANG_INVALID: "[afd] '{lang}' 은(는) 알 수 없는 언어예요. 지원: {supported}",
272
+ DAEMON_ALREADY_RUNNING: "🛡️ afd 데몬이 이미 열심히 일하고 있습니다",
273
+ DAEMON_STARTED: "[afd] 🛡️ 데몬 시작 (pid={pid}, port={port})",
274
+ DAEMON_WATCHING: "[afd] 🛡️ 스마트 탐색 중: AI 컨텍스트 대상 {count}개 감시 시작",
275
+ DAEMON_LOGS: "[afd] 로그 위치: {path}",
276
+ DAEMON_STOPPED: "[afd] 데몬이 중지되었습니다 (pid={pid})",
277
+ DAEMON_KILLED: "[afd] 데몬 강제 종료 완료 (pid={pid})",
278
+ DAEMON_NOT_RUNNING: "[afd] 실행 중인 데몬을 찾을 수 없습니다.",
279
+ DAEMON_NOT_RESPONDING: "[afd] 데몬이 응답하지 않네요. 남은 PID 파일을 정리합니다.",
280
+ DAEMON_START_FAILED: "[afd] 데몬 시작 실패. 로그를 확인해 보세요: {path}",
281
+ DAEMON_RESTARTING: "[afd] 🔄 데몬을 재시작합니다...",
282
+
283
+ SETUP_HEADER: "[afd] {ecosystem} 에코시스템 설정 중:",
284
+ SETUP_HOOKS_NEW: " [+] PreToolUse 훅 주입 완료",
285
+ SETUP_HOOKS_OK: " [=] 훅 이미 설정됨",
286
+ SETUP_MCP_NEW: " [+] MCP 서버 등록 완료 (.mcp.json)",
287
+ SETUP_MCP_OK: " [=] MCP 서버 이미 등록됨",
288
+ SETUP_MCP_SKIP: " [-] MCP 등록 미지원",
289
+ SETUP_STATUS_NEW: " [+] StatusLine 설정 완료",
290
+ SETUP_STATUS_OK: " [=] StatusLine 이미 설정됨",
291
+ SETUP_STATUS_SKIP: " [-] StatusLine 미지원",
292
+ SETUP_DONE: "[afd] 제로터치 설정 완료. 모든 채널 활성화.",
293
+ };
294
+
295
+ const dictionaries: Record<SupportedLang, MessageDict> = { en, ko };
296
+
297
+ /** Get the full dictionary for a language. */
298
+ export function getMessages(lang: SupportedLang): MessageDict {
299
+ return dictionaries[lang];
300
+ }
301
+
302
+ /** Template interpolation: replaces {key} with values. */
303
+ export function t(template: string, vars: Record<string, string | number> = {}): string {
304
+ let result = template;
305
+ for (const [key, val] of Object.entries(vars)) {
306
+ result = result.replaceAll(`{${key}}`, String(val));
307
+ }
308
+ return result;
309
+ }