adde-acp 0.1.3

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 (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +88 -0
  3. package/README.md +88 -0
  4. package/dist/backend/acp/client.d.ts +149 -0
  5. package/dist/backend/acp/client.js +538 -0
  6. package/dist/backend/acp/client.js.map +1 -0
  7. package/dist/backend/acp/index.d.ts +8 -0
  8. package/dist/backend/acp/index.js +7 -0
  9. package/dist/backend/acp/index.js.map +1 -0
  10. package/dist/backend/acp/lifecycle.d.ts +15 -0
  11. package/dist/backend/acp/lifecycle.js +56 -0
  12. package/dist/backend/acp/lifecycle.js.map +1 -0
  13. package/dist/backend/acp/perm-diff.d.ts +37 -0
  14. package/dist/backend/acp/perm-diff.js +58 -0
  15. package/dist/backend/acp/perm-diff.js.map +1 -0
  16. package/dist/backend/acp/spawn.d.ts +20 -0
  17. package/dist/backend/acp/spawn.js +70 -0
  18. package/dist/backend/acp/spawn.js.map +1 -0
  19. package/dist/cli/adde.d.ts +2 -0
  20. package/dist/cli/adde.js +11 -0
  21. package/dist/cli/adde.js.map +1 -0
  22. package/dist/cli/alias.d.ts +45 -0
  23. package/dist/cli/alias.js +94 -0
  24. package/dist/cli/alias.js.map +1 -0
  25. package/dist/cli/completion.d.ts +4 -0
  26. package/dist/cli/completion.js +209 -0
  27. package/dist/cli/completion.js.map +1 -0
  28. package/dist/cli/init.d.ts +3 -0
  29. package/dist/cli/init.js +114 -0
  30. package/dist/cli/init.js.map +1 -0
  31. package/dist/cli/lane.d.ts +20 -0
  32. package/dist/cli/lane.js +350 -0
  33. package/dist/cli/lane.js.map +1 -0
  34. package/dist/cli/ops.d.ts +5 -0
  35. package/dist/cli/ops.js +230 -0
  36. package/dist/cli/ops.js.map +1 -0
  37. package/dist/cli/prompt.d.ts +15 -0
  38. package/dist/cli/prompt.js +41 -0
  39. package/dist/cli/prompt.js.map +1 -0
  40. package/dist/cli/run.d.ts +5 -0
  41. package/dist/cli/run.js +216 -0
  42. package/dist/cli/run.js.map +1 -0
  43. package/dist/cli/spec.d.ts +48 -0
  44. package/dist/cli/spec.js +98 -0
  45. package/dist/cli/spec.js.map +1 -0
  46. package/dist/core/diagnostics.d.ts +73 -0
  47. package/dist/core/diagnostics.js +333 -0
  48. package/dist/core/diagnostics.js.map +1 -0
  49. package/dist/core/index.d.ts +11 -0
  50. package/dist/core/index.js +9 -0
  51. package/dist/core/index.js.map +1 -0
  52. package/dist/core/injector.d.ts +27 -0
  53. package/dist/core/injector.js +297 -0
  54. package/dist/core/injector.js.map +1 -0
  55. package/dist/core/lane-config.d.ts +80 -0
  56. package/dist/core/lane-config.js +303 -0
  57. package/dist/core/lane-config.js.map +1 -0
  58. package/dist/core/launchd.d.ts +81 -0
  59. package/dist/core/launchd.js +216 -0
  60. package/dist/core/launchd.js.map +1 -0
  61. package/dist/core/messages.d.ts +31 -0
  62. package/dist/core/messages.js +71 -0
  63. package/dist/core/messages.js.map +1 -0
  64. package/dist/core/queue.d.ts +74 -0
  65. package/dist/core/queue.js +227 -0
  66. package/dist/core/queue.js.map +1 -0
  67. package/dist/core/runtime-state.d.ts +52 -0
  68. package/dist/core/runtime-state.js +90 -0
  69. package/dist/core/runtime-state.js.map +1 -0
  70. package/dist/core/session-ledger.d.ts +25 -0
  71. package/dist/core/session-ledger.js +89 -0
  72. package/dist/core/session-ledger.js.map +1 -0
  73. package/dist/core/supervisor.d.ts +41 -0
  74. package/dist/core/supervisor.js +315 -0
  75. package/dist/core/supervisor.js.map +1 -0
  76. package/dist/core/transcript.d.ts +22 -0
  77. package/dist/core/transcript.js +93 -0
  78. package/dist/core/transcript.js.map +1 -0
  79. package/dist/core/update-check.d.ts +25 -0
  80. package/dist/core/update-check.js +142 -0
  81. package/dist/core/update-check.js.map +1 -0
  82. package/dist/core/version.d.ts +7 -0
  83. package/dist/core/version.js +32 -0
  84. package/dist/core/version.js.map +1 -0
  85. package/dist/gate/gate.d.ts +41 -0
  86. package/dist/gate/gate.js +28 -0
  87. package/dist/gate/gate.js.map +1 -0
  88. package/dist/gate/index.d.ts +6 -0
  89. package/dist/gate/index.js +6 -0
  90. package/dist/gate/index.js.map +1 -0
  91. package/dist/shared/conf.d.ts +54 -0
  92. package/dist/shared/conf.js +85 -0
  93. package/dist/shared/conf.js.map +1 -0
  94. package/dist/shared/deny-match.d.ts +19 -0
  95. package/dist/shared/deny-match.js +122 -0
  96. package/dist/shared/deny-match.js.map +1 -0
  97. package/dist/shared/envelope.d.ts +37 -0
  98. package/dist/shared/envelope.js +91 -0
  99. package/dist/shared/envelope.js.map +1 -0
  100. package/dist/shared/errors.d.ts +8 -0
  101. package/dist/shared/errors.js +23 -0
  102. package/dist/shared/errors.js.map +1 -0
  103. package/dist/shared/fs-atomic.d.ts +17 -0
  104. package/dist/shared/fs-atomic.js +31 -0
  105. package/dist/shared/fs-atomic.js.map +1 -0
  106. package/dist/shared/i18n.d.ts +23 -0
  107. package/dist/shared/i18n.js +53 -0
  108. package/dist/shared/i18n.js.map +1 -0
  109. package/dist/shared/locales/en.d.ts +393 -0
  110. package/dist/shared/locales/en.js +447 -0
  111. package/dist/shared/locales/en.js.map +1 -0
  112. package/dist/shared/locales/ko.d.ts +389 -0
  113. package/dist/shared/locales/ko.js +443 -0
  114. package/dist/shared/locales/ko.js.map +1 -0
  115. package/dist/shared/mask.d.ts +6 -0
  116. package/dist/shared/mask.js +28 -0
  117. package/dist/shared/mask.js.map +1 -0
  118. package/dist/shared/notify.d.ts +15 -0
  119. package/dist/shared/notify.js +20 -0
  120. package/dist/shared/notify.js.map +1 -0
  121. package/dist/shared/paths.d.ts +42 -0
  122. package/dist/shared/paths.js +83 -0
  123. package/dist/shared/paths.js.map +1 -0
  124. package/dist/src-adapters/index.d.ts +8 -0
  125. package/dist/src-adapters/index.js +6 -0
  126. package/dist/src-adapters/index.js.map +1 -0
  127. package/dist/src-adapters/markdown.d.ts +80 -0
  128. package/dist/src-adapters/markdown.js +794 -0
  129. package/dist/src-adapters/markdown.js.map +1 -0
  130. package/dist/src-adapters/source.d.ts +33 -0
  131. package/dist/src-adapters/source.js +3 -0
  132. package/dist/src-adapters/source.js.map +1 -0
  133. package/dist/src-adapters/telegram.d.ts +48 -0
  134. package/dist/src-adapters/telegram.js +412 -0
  135. package/dist/src-adapters/telegram.js.map +1 -0
  136. package/package.json +62 -0
@@ -0,0 +1,443 @@
1
+ export const ko = {
2
+ usage: {
3
+ main: `{{primary}} — AI Driven Development Engine
4
+
5
+ 사용법:
6
+ {{primary}} [command] 주 진입점 ('adde alias' 후 {{short}} 사용 가능)
7
+
8
+ 명령:
9
+ init [<proj>] 가이드 설정 (doctor + 짧은 별칭 + 레인 생성)
10
+ up <proj> 프로젝트의 모든 레인 백그라운드 데몬으로 기동
11
+ down <proj> 데몬 종료 (어느 터미널에서든 동작)
12
+ restart <proj> 데몬 재기동 (down + up)
13
+ status [<proj>] [--all] 레인 상태 조회 (<proj> 생략 시 실행 중 전체, --all 정지 포함)
14
+ doctor [<proj>] 환경·설정 정적 점검(상태 비의존)
15
+ logs <proj> <lane> [N] 레인 transcript 최근 N줄(기본 50, --engine 시 엔진 stderr)
16
+ sessions <proj> <lane> 기록된 엔진 세션 목록(재개는 채널에서: /resume 또는 resume 체크박스)
17
+ lane add <proj> <lane> 레인 conf 생성
18
+ lane ls <proj> 레인 목록
19
+ lane show <proj> <lane> 레인 conf 출력
20
+ lane rm <proj> <lane> 레인 conf 삭제
21
+ completion <bash|zsh> 셸 자동완성 스크립트 출력
22
+ alias [names...] 짧은 별칭 설치(기본 ad, add) — adde 실행 파일 옆에
23
+
24
+ 옵션:
25
+ -v, --version 버전 출력
26
+ -h, --help 도움말 출력
27
+
28
+ 명령별 도움말은 \`{{primary}} <command> --help\`, 레인 옵션은 \`adde lane help\` 참조.`,
29
+ up: "사용법: adde up <proj>",
30
+ down: "사용법: adde down <proj>",
31
+ restart: "사용법: adde restart <proj>",
32
+ status: "사용법: adde status [<proj>] [--all] [--json]",
33
+ doctor: "사용법: adde doctor [<proj>]",
34
+ logs: "사용법: adde logs <proj> <lane> [N] [--engine]",
35
+ sessions: "사용법: adde sessions <proj> <lane>",
36
+ completion: "사용법: adde completion <bash|zsh> (셸 자동완성 스크립트 출력)",
37
+ init: "사용법: adde init [<proj>] (가이드 설정: doctor + 짧은 별칭 + 레인 생성; TTY 전용)",
38
+ alias: "사용법: adde alias [names...] (adde 실행 파일 옆에 짧은 별칭 설치; 기본: ad add)",
39
+ laneAdd: "사용법: adde lane add <proj> <lane> [옵션]",
40
+ laneLs: "사용법: adde lane ls <proj>",
41
+ laneShow: "사용법: adde lane show <proj> <lane>",
42
+ laneRm: "사용법: adde lane rm <proj> <lane>",
43
+ daemon: "사용법: adde __daemon <proj> (내부 명령)",
44
+ lane: `사용법:
45
+ adde lane add <proj> <lane> [옵션] 레인 conf 생성
46
+ adde lane ls <proj> 레인 목록
47
+ adde lane show <proj> <lane> 레인 conf 출력
48
+ adde lane rm <proj> <lane> 레인 conf 삭제
49
+
50
+ lane add 옵션:
51
+ --source <telegram|markdown> (기본 telegram)
52
+ --engine <name> (기본 claude-code-acp)
53
+ --backend <name> (기본 acp)
54
+ --channel <name> (기본 source 값)
55
+ --perm-tier <acp|autopass> (기본 acp — 전 도구 채널 승인 / autopass — denylist 외 자동 허용)
56
+ --acp-version <v> (기본 v1)
57
+ --cwd <abs-path> 레인 작업 폴더(프로젝트 매핑)
58
+ --allowlist <a,b,c> 자동 허용 도구(게이트 유지, perm_tier=acp 용)
59
+ --denylist <항목,...> autopass 에서 채널 승인으로 폴백할 도구·패턴
60
+ (예: "Bash,Write(/etc/*)" · 미지정 시 내장 기본 목록: sudo·rm -rf·git 강제 변경·자격증명 읽기 차단)
61
+ --hard-deny <항목,...> 방어심화: 티어 무관 즉시 거부(프롬프트 없음)할 도구·패턴
62
+ --safe-defaults hard-deny 에 내장 위험 목록 채우기(sudo·rm -rf·git 강제·자격증명 읽기)
63
+ --lang <en|ko> 이 레인의 채널 메시지 로케일 (기본: 전역 로케일)
64
+ --chat-id <id> telegram 회신 대상(해당 chat 인바운드도 허용)
65
+ --allow-from <ids> 추가 허용 인바운드 발신자 id(콤마 구분 user/chat id)
66
+ --file-mode <private|shared> state/out/queue 디렉터리 권한(기본 private=0700 소유자 전용; shared=umask 기본 유지, 통상 타 사용자 열람 가능)
67
+ --token-stdin telegram 봇 토큰을 stdin 에서 읽어 .env(0600) 기록
68
+ --root <abs-path> markdown 루트(예: Obsidian vault)
69
+ --inbox <rel> --approvals <rel> --outbox <rel> markdown 노트 경로
70
+ --force 기존 conf 덮어쓰기
71
+ --interactive 대화형 위저드 강제(TTY 에서 기본; 봇 토큰은 가려진 입력)
72
+ --no-interactive 대화형 기본을 끄고 플래그/기본값 사용(스크립트용)`,
73
+ },
74
+ cli: {
75
+ cmdError: "[adde {{cmd}}] 오류: {{detail}}",
76
+ laneError: "[adde lane] {{detail}}",
77
+ unknownSub: "알 수 없는 lane 서브커맨드: {{sub}}",
78
+ unknownCmd: "알 수 없는 명령: {{cmd}}",
79
+ didYouMean: "이것을 찾으셨나요: {{cmds}}?",
80
+ },
81
+ completion: {
82
+ unknownShell: '미지원 셸 "{{shell}}" — {{supported}} 중 하나',
83
+ },
84
+ run: {
85
+ laneStartFailed: {
86
+ situation: '레인 "{{lane}}" 기동 실패: {{error}}',
87
+ action: "adde doctor {{proj}} 로 환경·설정을 점검하고, adde logs {{proj}} {{lane}} --engine 으로 엔진 출력을 확인하세요.",
88
+ },
89
+ unknownCause: "원인 미상",
90
+ noLanes: {
91
+ situation: "기동할 레인이 없습니다 — {{proj}} 에 레인 설정(conf)이 없습니다",
92
+ action: "adde lane add {{proj}} <lane> --source telegram (또는 markdown) 으로 레인을 먼저 만드세요. 옵션은 adde lane help.",
93
+ },
94
+ signalShutdown: "[adde] {{sig}} 수신 — 레인 종료 중...",
95
+ shutdownError: {
96
+ situation: "종료 처리 중 오류: {{error}}",
97
+ action: "잔존 엔진 프로세스를 수동 확인/종료하세요(ps | grep claude-code-acp).",
98
+ },
99
+ upDone: "[adde] {{proj}} 데몬 등록 완료. 백그라운드에서 레인이 기동됩니다.",
100
+ statusHint: " 상태 확인: adde status {{proj}}",
101
+ downDone: "[adde] {{proj}} 데몬 종료 완료.",
102
+ restartDone: "[adde] {{proj}} 재기동 완료. 백그라운드에서 레인이 기동됩니다.",
103
+ },
104
+ ops: {
105
+ status: {
106
+ noLanesConf: "레인 없음 — lanes.d 에 conf 가 없습니다 (adde lane add <proj> <lane>).",
107
+ noLanesRegistered: "레인 없음 — 등록된 레인이 없습니다 (adde lane add <proj> <lane>).",
108
+ noRunning: "실행 중인 레인 없음 — 정지 포함 전체는 `adde status --all`, 특정 프로젝트는 `adde status <proj>`.",
109
+ deadWarnAggregate: "경고: {{lanes}} 레인이 비정상 종료(dead)했습니다.\n ↳ 조치: adde down <proj> 로 정리한 뒤 adde up <proj> 로 재기동하세요.",
110
+ staleWarnAggregate: "경고: {{lanes}} 레인이 응답 없음(stale — 하트비트 끊김).\n ↳ 조치: adde logs <proj> <lane> --engine 으로 진단 후 adde down/up <proj> 로 재기동하세요.",
111
+ deadWarnSingle: "경고: {{lanes}} 레인이 비정상 종료(dead)했습니다.\n ↳ 조치: adde down {{proj}} 로 상태를 정리한 뒤 adde up {{proj}} 로 재기동하세요.",
112
+ staleWarnSingle: "경고: {{lanes}} 레인이 응답 없음(stale — 프로세스는 살아있으나 하트비트 끊김).\n ↳ 조치: 행(hang) 가능성. adde logs {{proj}} <lane> --engine 으로 진단 후 adde down/up {{proj}} 로 재기동하세요.",
113
+ },
114
+ doctor: {
115
+ hint: " ↳ 조치: {{hint}}",
116
+ summary: "요약: {{pass}} PASS / {{warn}} WARN / {{fail}} FAIL",
117
+ },
118
+ logs: {
119
+ whatEngine: "engine 로그",
120
+ whatTranscript: "transcript",
121
+ notFound: "{{what}} 없음: {{path}}\n ↳ 조치: 레인이 아직 활동하지 않았거나 기동되지 않았습니다. adde status {{proj}} 로 상태를 확인하세요.",
122
+ empty: "({{path}} 비어있음)",
123
+ },
124
+ },
125
+ lane: {
126
+ valueRequired: "--{{key}} 에 값이 필요합니다",
127
+ sourceRetry: " telegram 또는 markdown 중 하나를 입력하세요",
128
+ retry: {
129
+ permTier: " perm_tier — acp 또는 autopass 를 입력하세요",
130
+ fileMode: " file_mode — private 또는 shared 를 입력하세요",
131
+ lang: " lang — en 또는 ko 를 입력하세요(전역은 비움)",
132
+ chatId: " chat_id — 숫자 id 를 입력하세요(없으면 비움)",
133
+ allowFrom: " allow_from — 콤마 구분 숫자 id 를 입력하세요(없으면 비움)",
134
+ },
135
+ prompt: {
136
+ source: "source (telegram 또는 markdown)",
137
+ permTier: "perm_tier (acp 또는 autopass)",
138
+ allowlist: "allowlist (콤마 구분, 없으면 비움)",
139
+ denylist: "denylist (채널 승인으로 폴백할 도구·패턴, 콤마 구분)",
140
+ safeDefaults: "방어심화 하드-거부 기본값을 켤까요? sudo / rm -rf / git 강제 / 자격증명 읽기를 즉시 차단 (y/N)",
141
+ lang: "lang (채널 메시지 로케일: en/ko, 전역은 비움)",
142
+ token: "telegram 봇 토큰 (가려진 입력, 나중에 설정하려면 비움)",
143
+ cwd: "cwd (레인 작업 폴더 절대경로, 없으면 비움)",
144
+ chatId: "chat_id (회신 대상 + 해당 chat 인바운드 허용, 없으면 비움)",
145
+ allowFrom: "allow_from (추가 허용 발신자 id, 콤마 구분, 없으면 비움)",
146
+ fileMode: "file_mode (private=소유자 전용 0700 / shared=umask 기본 유지, 통상 타 사용자 열람)",
147
+ root: "root (markdown 루트 절대경로)",
148
+ inbox: "inbox (root 상대)",
149
+ approvals: "approvals (root 상대, 없으면 기본)",
150
+ outbox: "outbox (root 상대, 없으면 기본)",
151
+ },
152
+ ttyOnly: {
153
+ situation: "--interactive 는 대화형 터미널(TTY)에서만 동작합니다",
154
+ action: "플래그로 지정하세요(예: adde lane add <proj> <lane> --source telegram). 옵션 목록은 adde lane help.",
155
+ },
156
+ created: '레인 "{{lane}}" 생성: {{confPath}}',
157
+ noLanes: "{{proj}}: 레인 없음",
158
+ removed: '레인 "{{lane}}" 삭제: {{confPath}}',
159
+ tokenWritten: "토큰 기록: {{envPath}} (0600)",
160
+ tokenNext: "다음: 봇 토큰을 {{envPath}} 에 TELEGRAM_BOT_TOKEN=... 으로 두세요",
161
+ startHint: "기동: adde up {{proj}}",
162
+ },
163
+ doctor: {
164
+ node: {
165
+ name: "Node 버전",
166
+ hint: "Node 22 이상으로 업그레이드하세요(nvm install 22 등).",
167
+ },
168
+ adapter: {
169
+ name: "ACP 어댑터 바이너리",
170
+ missing: "해석된 경로에 파일 없음: {{path}}",
171
+ hint: "의존성을 설치하세요(pnpm install) — @zed-industries/claude-code-acp 누락.",
172
+ },
173
+ daemonEntry: {
174
+ name: "데몬 진입 파일",
175
+ missing: "데몬 진입 파일을 찾을 수 없음: {{path}}",
176
+ hint: "데몬 모드는 빌드가 필요합니다. `pnpm build` 후 dist 로 실행(`node dist/cli/adde.js up <proj>`)하거나 전역 설치(`npm i -g .`)하세요. `pnpm run dev up` 으로는 데몬을 띄울 수 없습니다.",
177
+ },
178
+ base: {
179
+ name: "설정 base 디렉터리",
180
+ hint: "레인을 추가하면 생성됩니다(adde lane add <proj> <lane>).",
181
+ },
182
+ missingPath: "없음: {{path}}",
183
+ daemon: {
184
+ name: "daemon 등록 ({{proj}})",
185
+ registered: "plist 존재 + launchctl 등록 완료",
186
+ notRunning: "데몬 미기동 상태 (adde up {{proj}} 으로 기동 가능)",
187
+ plistOnly: "plist 존재하나 launchctl 미등록",
188
+ launchctlOnly: "launchctl 등록되어 있으나 plist 없음",
189
+ mismatchHint: "등록 불일치 상태입니다. adde down {{proj}} 후 adde up {{proj}} 으로 재등록하세요.",
190
+ queryFailed: "등록 상태 조회 실패",
191
+ queryFailedHint: "adde down {{proj}} 후 adde up {{proj}} 으로 재등록하거나, launchctl list | grep com.qwertygeon.adde.{{proj}} 로 수동 확인하세요.",
192
+ },
193
+ lanes: {
194
+ name: "레인 ({{proj}})",
195
+ none: "lanes.d 에 conf 없음",
196
+ addHint: "레인을 추가하세요: adde lane add {{proj}} <lane>",
197
+ },
198
+ conf: {
199
+ readFailed: "읽기 실패: {{path}}",
200
+ readFailedHint: "conf 파일 권한/존재를 확인하세요.",
201
+ },
202
+ source: {
203
+ unsupported: '미지원 source: "{{source}}"',
204
+ hint: "conf 의 source 를 telegram 또는 markdown 으로 설정하세요.",
205
+ },
206
+ cwd: {
207
+ hint: "conf 의 cwd 를 존재하는 작업 폴더로 수정하세요.",
208
+ },
209
+ token: {
210
+ name: "{{lane}}: 토큰",
211
+ present: ".env 에 TELEGRAM_BOT_TOKEN 존재",
212
+ missing: "토큰 없음: {{path}}",
213
+ hint: "봇 토큰을 기록하세요: {{path}} 에 TELEGRAM_BOT_TOKEN=... (또는 lane add --token-stdin).",
214
+ },
215
+ perms: {
216
+ name: "{{lane}}: 파일 권한",
217
+ ok: "state 디렉터리/.env 권한이 제한적입니다",
218
+ envLoose: "state/.env 가 그룹/기타에서 접근 가능(mode {{mode}}) — 봇 토큰 노출 위험",
219
+ envHint: "권한을 제한하세요: chmod 600 {{path}}",
220
+ stateLoose: "state 디렉터리가 그룹/기타에서 접근 가능(mode {{mode}}) — file_mode=private 는 0700 을 기대합니다",
221
+ stateHint: "권한을 제한하세요: chmod 700 {{path}} — 또는 레인을 재시작(adde restart {{proj}})하면 다시 잠급니다.",
222
+ },
223
+ },
224
+ update: {
225
+ available: "adde 새 버전이 있습니다: {{current}} → {{latest}}. `npm i -g adde-acp@latest` 로 업데이트하세요(이후 `adde restart <proj>`).",
226
+ },
227
+ gate: {
228
+ hardDeny: "⛔ 하드-거부로 차단됨: {{tool}} — 이 도구는 레인 hard_deny 목록에 있어 승인 프롬프트 없이 거부되었습니다.",
229
+ },
230
+ init: {
231
+ ttyOnly: {
232
+ situation: "adde init 는 대화형 터미널(TTY)이 필요합니다",
233
+ action: "터미널에서 실행하거나 수동 설정: adde doctor / adde lane add <proj> <lane> --interactive / adde alias.",
234
+ },
235
+ intro: "adde 설정 — 환경 점검, 짧은 별칭, 첫 레인을 만듭니다.",
236
+ doctorWarn: "위에 FAIL 항목이 있습니다. 계속 진행할 수 있으나 데몬 기동(adde up) 전에 해결하세요.",
237
+ aliasPrompt: "짧은 별칭({{names}})을 adde 명령 옆에 설치할까요? (Y/n)",
238
+ aliasNoBin: "PATH 에서 adde 명령을 찾지 못했습니다 — 별칭 설치를 건너뜁니다(전역 설치에서만 가능).",
239
+ aliasCreated: " ✔ 별칭 생성: {{name}} → {{dir}}",
240
+ aliasAlready: " = 별칭이 이미 adde 를 가리킴: {{name}}",
241
+ aliasSkipped: " ✘ {{name}} 건너뜀 — 동명 명령이 PATH 에 이미 존재합니다",
242
+ aliasFailed: " ✘ 별칭 {{name}} 생성 실패 — {{detail}}",
243
+ projPrompt: "프로젝트 이름",
244
+ projRetry: "프로젝트 이름 (영숫자/_/- 만)",
245
+ lanePrompt: "레인 이름",
246
+ laneRetry: "레인 이름 (영숫자/_/- 만)",
247
+ done: "프로젝트 '{{proj}}' 설정 완료.",
248
+ },
249
+ laneConfig: {
250
+ warn: {
251
+ cwdMissing: "[경고] cwd 경로가 없습니다: {{path}}\n ↳ 조치: 기동 전 폴더를 만들거나 conf 의 cwd 를 수정하세요.",
252
+ mdRootMissingConf: "[경고] markdown 레인에 root 가 없습니다.\n ↳ 조치: --root <vault 절대경로> 를 지정하세요(없으면 인바운드 감시 불가).",
253
+ mdRootNotFound: "[경고] markdown root 경로가 없습니다: {{path}}\n ↳ 조치: 경로를 확인하거나 생성하세요.",
254
+ mdPathOverlap: "[경고] markdown 경로가 겹칩니다(inbox={{inbox}} / approvals={{approvals}} / outbox={{outbox}}) — 기동이 거부됩니다.\n ↳ 조치: 승인·출력·입력 경로를 서로 분리하세요.",
255
+ tokenFormat: "[경고] 봇 토큰 형식이 예상과 다릅니다(<숫자>:<영숫자> 아님).\n ↳ 조치: BotFather 발급 토큰을 다시 확인하세요.",
256
+ permTierUnknown: '[경고] perm_tier "{{tier}}" 는 알려진 값({{known}})이 아닙니다 — acp 처럼 동작합니다.\n ↳ 조치: 오타라면 conf 의 perm_tier 를 수정하세요.',
257
+ autopassBanner: "[경고] perm_tier=autopass — denylist 외 모든 도구(파일 쓰기·Bash 실행 포함)가 채널 확인 없이 자동 허용됩니다.\n ↳ 확인이 필요한 도구는 denylist 에 두세요(예: denylist=Bash). 자동 허용 내역은 transcript 에 기록됩니다.",
258
+ autopassEmptyDeny: "[경고] autopass 레인에 denylist 가 비어 있습니다 — 모든 권한 요청이 무확인 통과됩니다.",
259
+ allowDenyOverlap: "[경고] allowlist 와 denylist 에 같은 도구가 있습니다: {{tools}} — denylist 가 우선하여 채널 승인을 거칩니다.\n ↳ 조치: 의도가 아니라면 한쪽에서 제거하세요.",
260
+ badLang: '[경고] lang "{{lang}}" 은 지원 로케일({{supported}})이 아닙니다 — 전역 로케일이 적용됩니다.\n ↳ 조치: 오타라면 conf 의 lang 을 수정하세요.',
261
+ telegramNoAuth: "[경고] telegram 레인에 허용 인바운드 발신자가 없습니다 — 모든 인바운드가 거부됩니다(fail-closed). 개인 chat_id 는 자기 인증되지만, 그룹 chat_id(음수)는 회신 대상일 뿐 멤버를 인증하지 않습니다.\n ↳ 조치: --chat-id <본인 개인 chat id> 설정, 및/또는 --allow-from <id들> 로 멤버 id 를 지정하세요.",
262
+ },
263
+ err: {
264
+ emptyIdent: "{{kind}} 가 비어있습니다",
265
+ badIdent: '{{kind}} "{{value}}" 가 올바르지 않습니다 — 영문/숫자/_/- 만 허용',
266
+ badSource: 'source "{{source}}" 미지원 — {{supported}} 중 하나',
267
+ badChatId: 'chat_id "{{chatId}}" 가 숫자가 아닙니다',
268
+ tokenOnlyTelegram: "token 은 source=telegram 레인에서만 사용합니다",
269
+ allowFromOnlyTelegram: "allow_from 은 source=telegram 레인에서만 사용합니다",
270
+ badAllowFrom: 'allow_from 항목 "{{id}}" 가 숫자가 아닙니다(telegram user/chat id)',
271
+ badFileMode: 'file_mode "{{mode}}" 가 올바르지 않습니다 — {{known}} 중 하나',
272
+ badAllowTool: 'allowlist 도구명 "{{tool}}" 가 올바르지 않습니다 — 영숫자/_/./- 만 허용',
273
+ badDenyEntry: 'denylist 항목 "{{entry}}" 가 올바르지 않습니다 — "Bash" 또는 "Bash(git push*)" 형식(콤마 불가)',
274
+ laneExists: '레인 "{{lane}}" 이 이미 존재합니다 ({{confFile}}) — 덮어쓰려면 --force',
275
+ tokenEmpty: "token 이 비어있습니다",
276
+ envHasToken: "{{envFile}} 에 이미 토큰이 있습니다 — 덮어쓰려면 --force",
277
+ laneNotFound: '레인 "{{lane}}" 을 찾을 수 없습니다 ({{confFile}})',
278
+ },
279
+ },
280
+ telegram: {
281
+ permPrompt: "권한 요청: {{tool}}\n{{detail}}",
282
+ enqueueFail: {
283
+ situation: "수신 메시지 큐 적재(enqueue)가 연속 {{count}}회 실패했습니다",
284
+ action: "서버 디스크 용량과 state 디렉터리 권한을 확인하세요. 해소되기 전까지 수신 메시지가 처리되지 않을 수 있습니다.",
285
+ },
286
+ },
287
+ markdown: {
288
+ enqueueFail: {
289
+ situation: "수신 메시지 큐 적재(enqueue)가 연속 {{count}}회 실패했습니다",
290
+ action: "서버 디스크 용량과 state 디렉터리 권한을 확인하세요. 해소 전까지 인박스 지시가 처리되지 않을 수 있습니다.",
291
+ },
292
+ confRootMissing: "[markdown] conf.root 누락 — 마크다운 루트 절대경로 필수",
293
+ confInboxMissing: "[markdown] conf.inbox 누락 — 입력 노트(root 상대) 필수",
294
+ rootNotFound: "[markdown] root 경로 없음: {{path}}",
295
+ pathNotRelative: "[markdown] {{name}} 경로는 root 상대여야 하며 '..'·절대경로 금지: {{rel}}",
296
+ controlNoteInCwd: "[markdown] 제어 노트({{name}})가 AI 작업폴더 내부에 있음: {{path}} (cwd={{cwd}}) — 자기승인 위험, cwd 밖으로 분리 필요",
297
+ pathsOverlap: "[markdown] {{nameA}}({{a}})와 {{nameB}}({{b}})가 같거나 포함 관계 — 출력·알림·격리 노트가 승인/입력 감시에 잡힙니다. 경로를 분리하세요.",
298
+ inboxInsideDir: "[markdown] 입력 노트({{inbox}})가 {{name}} 디렉터리({{dir}}) 내부 — 입력/제어 경로가 겹칩니다. 경로를 분리하세요.",
299
+ badApprovalId: '잘못된 승인 요청 id "{{reqId}}" — 경로 탈출 차단(fail-closed deny).',
300
+ outMeta: "🕒 요청 {{sent}} · 완료 {{done}}",
301
+ approvalMeta: "🕒 요청 {{requested}} · 무응답 시 {{deadline}} 자동 거부",
302
+ },
303
+ supervisor: {
304
+ noLanesMsg: "{{proj}}: 레인 0개 — lanes.d 에 conf 없음",
305
+ alreadyRunning: '[adde] 레인 "{{lane}}" 이미 실행 중 (pid {{pid}})\n ↳ 조치: adde down {{proj}} 후 재기동 또는 adde status {{proj}} 확인',
306
+ autopassDenySome: "denylist({{tools}}) 도구만 채널 승인을 거칩니다",
307
+ autopassDenyEmpty: "denylist 가 비어 있어 모든 권한 요청이 확인 없이 통과됩니다",
308
+ autopassBanner: {
309
+ situation: "이 레인은 자동 허용 모드(perm_tier=autopass)로 기동했습니다 — {{denyDesc}}. 그 외 도구(파일 쓰기·Bash 실행 포함)는 자동 허용됩니다",
310
+ action: "확인이 필요한 도구는 lanes.d/{{lane}}.conf 의 denylist 에 추가하세요. 자동 허용 내역은 adde logs {{proj}} {{lane}} 으로 확인할 수 있습니다.",
311
+ },
312
+ upStarted: "{{proj}}: {{count}}개 레인 기동",
313
+ upSkipped: "{{count}}개 이미 실행 중(스킵)",
314
+ downStopped: "{{proj}}: {{count}}개 레인 종료",
315
+ },
316
+ launchd: {
317
+ macOnly: {
318
+ situation: "launchd 기능은 macOS 에서만 동작합니다 (현재 플랫폼: {{platform}})",
319
+ action: "macOS 에서 실행하세요. Linux/WSL 지원은 추후 spec 범위.",
320
+ },
321
+ loadFail: {
322
+ situation: "launchctl load 실패 (exit {{code}}): {{output}}",
323
+ action: "adde doctor {{proj}} 로 등록 상태를 점검하거나, 기존 등록을 먼저 해제하세요 (adde down {{proj}}).",
324
+ },
325
+ binMissing: {
326
+ situation: "데몬 실행 파일을 찾을 수 없습니다: {{path}}",
327
+ action: "데몬 모드는 빌드가 필요합니다 — `pnpm build` 후 dist 로 실행(`node dist/cli/adde.js up <proj>`)하거나 전역 설치(`npm i -g .`) 후 `adde up <proj>` 하세요. `pnpm run dev up` 으로는 데몬을 띄울 수 없습니다(launchd 가 분리 프로세스를 스폰하므로 tsx 트랜스파일이 적용되지 않습니다).",
328
+ },
329
+ },
330
+ queue: {
331
+ claimFail: {
332
+ situation: "큐 메시지 claim 실패({{code}}): {{path}}",
333
+ action: "디스크 용량·파일 권한·마운트(NFS/EBUSY)를 확인하세요. 메시지는 큐에 남아 다음 신호에 재시도됩니다.",
334
+ },
335
+ quarantined: "손상 메시지 격리 @ {{ts}}: {{detail}}",
336
+ },
337
+ injector: {
338
+ injectFailed: "inject 실패 @ {{ts}}: {{detail}}",
339
+ control: {
340
+ cleared: "🧹 새 세션을 시작했습니다 — 이전 대화 맥락은 비워졌습니다.",
341
+ compacted: "✂️ 대화 컨텍스트를 압축했습니다(/compact).",
342
+ resumed: "⏪ 세션 {{id}} 를 재개했습니다.",
343
+ resumeFallback: "⚠️ 세션 {{id}} 복귀에 실패해 새 세션으로 시작했습니다.",
344
+ resumeMissing: "⚠️ 재개할 세션 id 가 없습니다 — 목록에서 선택해 주세요.",
345
+ unsupported: "⚠️ 이 백엔드는 세션 제어를 지원하지 않습니다.",
346
+ relaunchFailed: "🛑 세션 제어 실패 — 엔진 재기동 오류: {{error}}. 레인이 중단됐을 수 있습니다 — `adde restart <proj>` 로 복구하세요.",
347
+ sessionsHeader: "📋 최근 세션 목록 (현재 세션 ◀):",
348
+ sessionsItem: "{{n}}. {{label}} — 마지막 대화 {{last}} ({{id}})",
349
+ sessionsNoLabel: "(프롬프트 없음)",
350
+ sessionsEmpty: "📋 기록된 세션이 아직 없습니다.",
351
+ sessionsHint: "재개: 체크박스 라벨 `resume <번호>` 또는 `/resume <번호>`.",
352
+ },
353
+ failNote: {
354
+ situation: "메시지 처리 실패 — id {{id}}: {{detail}}",
355
+ action: "메시지는 보존되어 재기동 시 재처리됩니다. 반복되면 트랜스크립트·로그를 확인하세요.",
356
+ },
357
+ },
358
+ transcript: {
359
+ commandsUpdated: "[{{ts}}] commands_update: (갱신)",
360
+ },
361
+ acp: {
362
+ spawnFail: {
363
+ situation: "엔진 프로세스 spawn 실패 ({{bin}}): {{error}}",
364
+ action: "어댑터 바이너리 설치를 확인하세요(pnpm install) 후 adde up 재시도.",
365
+ },
366
+ handshakeTimeout: {
367
+ situation: "엔진 핸드셰이크({{phase}}) {{seconds}}초 내 무응답",
368
+ action: "엔진 바이너리·헬스를 확인하세요 후 adde up 재시도.",
369
+ },
370
+ subscriberError: "구독자 처리 오류: {{error}}",
371
+ bypassAction: "게이트가 무력화될 수 있습니다 — 엔진 권한 설정에서 bypassPermissions 를 해제하거나 ADDE 정책(perm_tier)에 맞게 정렬하세요. 기동은 계속합니다.",
372
+ },
373
+ permDiff: {
374
+ queryFailedMsg: "엔진 실효 설정 조회 실패 — 확인불가(보수적 차이 간주)",
375
+ warnLine: "[ADDE WARN] 권한 설정 차이: {{reason}} | adde.perm_tier={{tier}} | engine={{engine}}",
376
+ looseEngine: "ADDE 정책(acp) 보다 느슨한 엔진 설정 감지",
377
+ bypassMsg: "엔진 bypass — 권한 요청 미발화로 autopass denylist·자동허용 기록이 무력화됨",
378
+ engineUnknown: "(조회실패)",
379
+ },
380
+ log: {
381
+ supervisor: {
382
+ noConf: "[supervisor] {{proj}}: lanes.d 에 conf 없음",
383
+ heartbeatFail: "[supervisor] lane={{lane}} 하트비트 touch 실패(보조): {{error}}",
384
+ ledgerFail: "[supervisor] lane={{lane}} 세션 장부 갱신 실패(보조): {{error}}",
385
+ deadCleanupFail: "[supervisor] lane={{lane}} dead runtime.json 정리 실패(보조): {{error}}",
386
+ channelWarnFail: "[supervisor] lane={{lane}} 채널 경고 전송 실패(보조): {{error}}",
387
+ injectorStartFail: "[supervisor] lane={{lane}} injector 기동 오류: {{error}}",
388
+ runtimeWriteFail: "[supervisor] lane={{lane}} runtime.json 기록 실패(보조): {{error}}",
389
+ runtimeRemoveFail: "[supervisor] lane={{lane}} runtime.json 제거 실패(보조): {{error}}",
390
+ securePermsFail: "[supervisor] lane={{lane}} 상태 디렉터리 권한 잠금 실패(보조 — 파일이 타 사용자에 노출될 수 있음): {{error}}",
391
+ laneStartFail: "[supervisor] lane={{lane}} 기동 실패: {{reason}}",
392
+ },
393
+ queue: {
394
+ quarantineFail: "[queue] 손상 메시지 격리 실패 id={{id}}: {{code}}",
395
+ failedWriteFail: "[queue] .failed 기록 실패 id={{id}}: {{error}}",
396
+ },
397
+ injector: {
398
+ injectError: "[injector] inject 오류 lane={{lane}} id={{id}}: {{detail}}",
399
+ failedWriteFail: "[injector] .failed 기록 실패 lane={{lane}} id={{id}}: {{error}}",
400
+ renderError: "[injector] 렌더 오류 lane={{lane}} id={{id}} — 재전송 대기: {{error}}",
401
+ advanceError: "[injector] 진행 오류 lane={{lane}}: {{error}}",
402
+ failNotifyError: "[injector] 실패 알림 전달 오류 lane={{lane}} id={{id}}: {{error}}",
403
+ relaunchError: "[injector] 세션 제어 엔진 재기동 실패 lane={{lane}} — 재시작 전까지 레인이 중단될 수 있음: {{error}}",
404
+ },
405
+ telegram: {
406
+ rateLimit: "[telegram] {{method}} 429 레이트리밋 — {{waitMs}}ms 후 재시도({{attempt}})",
407
+ enqueueError: "[telegram] enqueue 오류({{count}}회 연속): {{error}}",
408
+ answerCallbackError: "[telegram] answerCallbackQuery 오류: {{error}}",
409
+ unknownCallback: "[telegram] 알 수 없는 callback decision 무시: {{decision}}",
410
+ unauthorizedMessage: "[telegram] 미허가 발신자의 인바운드 무시(from={{from}} chat={{chat}}) — chat_id/allow_from 에 추가해 허용",
411
+ unauthorizedCallback: "[telegram] 미허가 발신자의 권한 콜백 무시(from={{from}})",
412
+ noAuthConfigured: "[telegram] 허용 발신자 미설정(chat_id/allow_from 비어있음) — 모든 인바운드 거부(fail-closed)",
413
+ pollError: "[telegram] poll 오류({{count}}회 연속, {{backoff}}ms 후 재시도): {{error}}",
414
+ alertSendError: "[telegram] enqueue 실패 알림 전송 오류: {{error}}",
415
+ pollLoopEnd: "[telegram] poll 루프 종료: {{error}}",
416
+ },
417
+ markdown: {
418
+ quarantineFail: "[markdown] 충돌파일 격리 실패 {{filename}}: {{error}}",
419
+ enqueueError: "[markdown] enqueue 오류({{count}}회 연속) lane={{lane}} id={{id}}: {{error}}",
420
+ alertWriteError: "[markdown] enqueue 실패 알림 기록 오류: {{error}}",
421
+ inboxError: "[markdown] inbox 처리 오류: {{error}}",
422
+ approvalsError: "[markdown] approvals 처리 오류: {{error}}",
423
+ pollError: "[markdown] 폴링 오류: {{error}}",
424
+ },
425
+ transcript: {
426
+ auditAppendFail: "[transcript] 감사 이벤트({{kind}}) append 실패 — 감사 추적 불완전: {{detail}}",
427
+ appendFail: "[transcript] append 실패(보조 — 흡수): {{detail}}",
428
+ },
429
+ acp: {
430
+ engineProcessError: "[acp] lane={{lane}} 엔진 프로세스 오류: {{error}}",
431
+ loadSessionFail: "[acp] lane={{lane}} 세션 복귀(session/load) 실패 — 새 세션으로 폴백: {{error}}",
432
+ subscriberError: "[acp] lane={{lane}} 구독자 오류: {{error}}",
433
+ transcriptWriteFail: "[acp] lane={{lane}} transcript 기록 실패: {{error}}",
434
+ permDiff: "[acp] launch perm-diff: {{note}}",
435
+ },
436
+ },
437
+ notify: {
438
+ block: "[ADDE 차단] {{situation}}\n ↳ 조치: {{action}}",
439
+ exception: "[ADDE 오류] {{situation}}\n ↳ 조치: {{action}}",
440
+ warn: "[ADDE 경고] {{situation}}\n ↳ 조치: {{action}}",
441
+ },
442
+ };
443
+ //# sourceMappingURL=ko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ko.js","sourceRoot":"","sources":["../../../src/shared/locales/ko.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 시크릿 마스킹 필터.
3
+ * 봇 토큰 패턴 + 민감 경로를 *** 로 치환하여
4
+ * 트랜스크립트·WARN·로그에 시크릿이 노출되지 않도록 한다.
5
+ */
6
+ export declare function maskSecrets(text: string): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 시크릿 마스킹 필터.
3
+ * 봇 토큰 패턴 + 민감 경로를 *** 로 치환하여
4
+ * 트랜스크립트·WARN·로그에 시크릿이 노출되지 않도록 한다.
5
+ */
6
+ /**
7
+ * Telegram 봇 토큰 패턴: <bot_id>:<token_part>.
8
+ * token_part 길이를 {30,} 로 둔다 — Telegram 이 35자를 계약상 보장하지 않으므로(형식 드리프트)
9
+ * 고정 {35} 는 마지막 방어선으로 취약. 하한만 두어 과소마스킹을 막는다(과대마스킹은 안전한 방향).
10
+ */
11
+ const BOT_TOKEN_PATTERN = /\d{5,}:[A-Za-z0-9_-]{30,}/g;
12
+ /** 마스킹 대상 민감 키워드 패턴 (state/.env 경로 등) */
13
+ const SENSITIVE_PATH_PATTERN = /(?:state\/[^/\s]+\/\.env)[^\s]*/g;
14
+ /** 흔한 API 키 접두(보수적 — 접두가 명확해 과대마스킹 위험 낮음). */
15
+ const API_KEY_PATTERN = /\b(?:sk-[A-Za-z0-9]{16,}|ghp_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9-]{10,})\b/g;
16
+ /** Authorization Bearer 토큰. */
17
+ const BEARER_PATTERN = /\bBearer\s+[A-Za-z0-9._-]{8,}/gi;
18
+ /** KEY=값 / KEY: 값 형태의 시크릿 키워드 — 값만 마스킹(키 보존). */
19
+ const KV_SECRET_PATTERN = /\b(TOKEN|KEY|SECRET|PASSWORD|PASSWD|API[_-]?KEY)(\s*[=:]\s*)\S+/gi;
20
+ export function maskSecrets(text) {
21
+ return text
22
+ .replace(BOT_TOKEN_PATTERN, "***")
23
+ .replace(API_KEY_PATTERN, "***")
24
+ .replace(BEARER_PATTERN, "Bearer ***")
25
+ .replace(KV_SECRET_PATTERN, (_m, key, sep) => `${key}${sep}***`)
26
+ .replace(SENSITIVE_PATH_PATTERN, "***");
27
+ }
28
+ //# sourceMappingURL=mask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mask.js","sourceRoot":"","sources":["../../src/shared/mask.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAEvD,yCAAyC;AACzC,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAElE,8CAA8C;AAC9C,MAAM,eAAe,GACnB,gFAAgF,CAAC;AACnF,+BAA+B;AAC/B,MAAM,cAAc,GAAG,iCAAiC,CAAC;AACzD,iDAAiD;AACjD,MAAM,iBAAiB,GAAG,mEAAmE,CAAC;AAE9F,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,OAAO,CAAC,iBAAiB,EAAE,KAAK,CAAC;SACjC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC;SAC/B,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC;SACrC,OAAO,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,GAAG,KAAK,CAAC;SAC/E,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { t } from "./i18n.js";
2
+ export interface ActionableNote {
3
+ /** 무슨 상황인가. */
4
+ situation: string;
5
+ /** 어떻게 조치하는가. */
6
+ action: string;
7
+ }
8
+ /** 포매터가 받는 로케일 고정 t (레인별 채널 로케일). 미지정 시 전역 로케일. */
9
+ export type NotifyT = typeof t;
10
+ /** fail-closed 차단 알림. */
11
+ export declare function formatBlock(note: ActionableNote, tl?: NotifyT): string;
12
+ /** 비차단 예외(오류) 알림. */
13
+ export declare function formatException(note: ActionableNote, tl?: NotifyT): string;
14
+ /** 비차단 경고 알림 — 진행은 계속하되 사용자가 인지해야 하는 상황. */
15
+ export declare function formatWarnNote(note: ActionableNote, tl?: NotifyT): string;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 액션형 알림 포매터 — 차단·예외 시 "상황 + 조치" 2요소를 일관 포맷.
3
+ * 운영자가 무엇이 일어났고(상황) 어떻게 대응할지(조치)를 항상 함께 받도록 한다.
4
+ * 시크릿 노출 방지를 위해 최종 문자열에 마스킹을 적용한다.
5
+ */
6
+ import { maskSecrets } from "./mask.js";
7
+ import { t } from "./i18n.js";
8
+ /** fail-closed 차단 알림. */
9
+ export function formatBlock(note, tl = t) {
10
+ return maskSecrets(tl("notify.block", { situation: note.situation, action: note.action }));
11
+ }
12
+ /** 비차단 예외(오류) 알림. */
13
+ export function formatException(note, tl = t) {
14
+ return maskSecrets(tl("notify.exception", { situation: note.situation, action: note.action }));
15
+ }
16
+ /** 비차단 경고 알림 — 진행은 계속하되 사용자가 인지해야 하는 상황. */
17
+ export function formatWarnNote(note, tl = t) {
18
+ return maskSecrets(tl("notify.warn", { situation: note.situation, action: note.action }));
19
+ }
20
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/shared/notify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAY9B,yBAAyB;AACzB,MAAM,UAAU,WAAW,CAAC,IAAoB,EAAE,KAAc,CAAC;IAC/D,OAAO,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,eAAe,CAAC,IAAoB,EAAE,KAAc,CAAC;IACnE,OAAO,WAAW,CAAC,EAAE,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,cAAc,CAAC,IAAoB,EAAE,KAAc,CAAC;IAClE,OAAO,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,42 @@
1
+ /** 기본 base 경로. 테스트 환경 override 용으로 분리 주입 가능. */
2
+ declare function defaultBase(): string;
3
+ export interface LanePaths {
4
+ lanesDir: string;
5
+ queueDir: string;
6
+ processingDir: string;
7
+ outDir: string;
8
+ stateDir: string;
9
+ envFile: string;
10
+ sessionIdFile: string;
11
+ /** 세션 장부(sessions.json) — /resume 목록·마지막 대화 시각의 SSOT(ADDE 자체 관리). */
12
+ sessionsFile: string;
13
+ transcriptLog: string;
14
+ /** 엔진 서브프로세스 stderr 캡처 파일(append). ACP stdout 은 프로토콜 채널이라 대상 아님. */
15
+ engineLog: string;
16
+ /** up 프로세스가 기동 시 기록하는 라이브니스 상태 파일(pid 등). 별도 status 프로세스가 교차 읽기. */
17
+ runtimeJson: string;
18
+ confFile: string;
19
+ }
20
+ /**
21
+ * 선행 `~`/`~/` 를 홈 디렉터리로 확장. (Node 는 셸과 달리 ~ 를 자동 확장하지 않음)
22
+ * conf 의 cwd/root 같은 사용자 입력 경로에 적용한다. ~user 형태는 미지원.
23
+ */
24
+ export declare function expandTilde(p: string): string;
25
+ /**
26
+ * proj/lane 이 경로 세그먼트로 안전한지 검증 — 위반 시 throw.
27
+ * lanePaths 가 경로 구성의 SSOT 이므로 여기서 막으면 모든 호출부(진단·수퍼바이저 등)가 일괄 보호된다(디렉터리 탈출·레인 격리 위반 차단).
28
+ */
29
+ export declare function assertSafeSegment(kind: "proj" | "lane", value: string): void;
30
+ /** proj/lane 세그먼트 안전성 여부(throw 없이). 디렉터리 열거 등에서 비안전 이름을 걸러낼 때 사용. */
31
+ export declare function isSafeSegment(value: string): boolean;
32
+ /** child 가 parent 와 같거나 그 내부인지(대소문자 정규화 없음 — 필요 시 normCasePath 로 감싼다). */
33
+ export declare function isPathInside(child: string, parent: string): boolean;
34
+ /**
35
+ * 대소문자 정규화 — macOS 기본 FS 는 대소문자 무시라 Shared/shared 가 같은 물리 디렉터리.
36
+ * darwin 은 소문자 정규화 후 비교한다(대소문자 구분 볼륨에선 과차단이나 fail-closed 방향이라 수용).
37
+ */
38
+ export declare function normCasePath(p: string): string;
39
+ /** 두 경로가 같거나 포함 관계인지(대소문자 정규화 적용). */
40
+ export declare function pathsOverlap(a: string, b: string): boolean;
41
+ export declare function lanePaths(base: string, proj: string, lane: string): LanePaths;
42
+ export { defaultBase };