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,538 @@
1
+ /**
2
+ * ACP 세션 라이프사이클·구독.
3
+ * initialize→session/new→prompt 루프.
4
+ * session/update 이벤트 구독 → transcript·injector·gate 라우팅.
5
+ */
6
+ import { t, tFor } from "../../shared/i18n.js";
7
+ import { errMsg } from "../../shared/errors.js";
8
+ import { Writable, Readable } from "node:stream";
9
+ import { writeFile, mkdir } from "node:fs/promises";
10
+ import { dirname } from "node:path";
11
+ import * as acp from "@agentclientprotocol/sdk";
12
+ import { spawnEngine } from "./spawn.js";
13
+ import { appendTranscript } from "../../core/transcript.js";
14
+ import { maskSecrets } from "../../shared/mask.js";
15
+ import { comparePerm, formatWarn } from "./perm-diff.js";
16
+ import { formatException, formatWarnNote } from "../../shared/notify.js";
17
+ import { matchesDenylist } from "../../shared/deny-match.js";
18
+ import { withTimeout, killChild, closeChild } from "./lifecycle.js";
19
+ /** 핸드셰이크(initialize·newSession) 최대 대기. 초과 시 launch 실패 + child kill. */
20
+ const HANDSHAKE_TIMEOUT_MS = 30_000;
21
+ /** close() 시 SIGTERM 후 종료 유예. 초과 시 SIGKILL. */
22
+ const CHILD_GRACE_MS = 5_000;
23
+ /** allowlist 자동 허용 판정 — 도구명이 레인 allowlist 에 있으면 true. */
24
+ export function shouldAutoAllow(allowlist, toolName) {
25
+ return allowlist?.includes(toolName) ?? false;
26
+ }
27
+ /**
28
+ * autopass 자동 허용 판정 — perm_tier=autopass 이고 denylist 에 걸리지 않으면 true.
29
+ * denylist 는 `Tool`(전체)·`Tool(glob)`(대표 인자 패턴) 을 지원하며,
30
+ * 매칭 도구는 false → 기존 채널 승인 게이트(fail-closed)로 폴백한다.
31
+ */
32
+ export function shouldAutopass(policy, toolName, rawInput) {
33
+ if (policy?.perm_tier !== "autopass")
34
+ return false;
35
+ return !matchesDenylist(policy.denylist, toolName, rawInput);
36
+ }
37
+ /** toolCallId→원시 도구명 맵 상한 — 초과 시 가장 오래된 항목부터 제거(장수 세션 메모리 상한). */
38
+ const TOOL_NAME_MAP_MAX = 512;
39
+ /**
40
+ * tool_call 세션 업데이트에서 원시 도구명을 기록한다.
41
+ * requestPermission 의 toolCall.title 은 인자 포함 표시 문자열(예: Bash → "`rm -rf build/`")이라
42
+ * allowlist/denylist 매칭 키로 쓸 수 없다 — claude-code-acp 는 원시 도구명을
43
+ * tool_call 업데이트의 _meta.claudeCode.toolName 으로만 노출한다.
44
+ */
45
+ export function recordToolName(map, update) {
46
+ if (update["sessionUpdate"] !== "tool_call")
47
+ return;
48
+ const toolCallId = update["toolCallId"];
49
+ if (typeof toolCallId !== "string")
50
+ return;
51
+ const meta = update["_meta"];
52
+ if (!meta || typeof meta !== "object")
53
+ return;
54
+ const claudeCode = meta["claudeCode"];
55
+ if (!claudeCode || typeof claudeCode !== "object")
56
+ return;
57
+ const toolName = claudeCode["toolName"];
58
+ if (typeof toolName !== "string" || toolName.length === 0)
59
+ return;
60
+ map.set(toolCallId, toolName);
61
+ if (map.size > TOOL_NAME_MAP_MAX) {
62
+ const oldest = map.keys().next().value;
63
+ if (oldest !== undefined)
64
+ map.delete(oldest);
65
+ }
66
+ }
67
+ /** 권한 요청의 원시 도구명 해석 — 맵 우선, 요청 자체의 _meta 폴백. 미해석 시 undefined. */
68
+ export function resolveToolName(map, toolCall) {
69
+ const toolCallId = toolCall["toolCallId"];
70
+ if (typeof toolCallId === "string") {
71
+ const fromMap = map.get(toolCallId);
72
+ if (fromMap)
73
+ return fromMap;
74
+ }
75
+ const meta = toolCall["_meta"];
76
+ if (meta && typeof meta === "object") {
77
+ const claudeCode = meta["claudeCode"];
78
+ if (claudeCode && typeof claudeCode === "object") {
79
+ const toolName = claudeCode["toolName"];
80
+ if (typeof toolName === "string" && toolName.length > 0)
81
+ return toolName;
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+ /**
87
+ * 자동 허용 판정 통합 — 반환 "allowlist" | "autopass" | null(채널 승인 경로).
88
+ * fail-closed: 도구명 미해석(undefined) 시 자동 허용하지 않는다(채널 승인 폴백).
89
+ * autopass 의 denylist 는 allowlist 보다 우선한다 — 매칭되면 채널 승인.
90
+ */
91
+ export function decideAutoAllow(policy, toolName, rawInput) {
92
+ if (toolName === undefined)
93
+ return null;
94
+ if (policy?.perm_tier === "autopass" && matchesDenylist(policy.denylist, toolName, rawInput)) {
95
+ return null;
96
+ }
97
+ if (shouldAutoAllow(policy?.allowlist, toolName))
98
+ return "allowlist";
99
+ if (shouldAutopass(policy, toolName, rawInput))
100
+ return "autopass";
101
+ return null;
102
+ }
103
+ /**
104
+ * 방어심화 하드-거부 판정 — 티어 무관, hard_deny 매칭 시 true(즉시 거부, 채널 프롬프트 없음).
105
+ * 도구명 미해석(undefined)이면 판정 불가 → false(채널 승인 경로로; 자동허용도 fail-closed 로 차단됨).
106
+ * autopass denylist("물어봄")보다 강하며 자동허용 판정보다 먼저 평가되어야 한다.
107
+ */
108
+ export function isHardDenied(policy, toolName, rawInput) {
109
+ if (toolName === undefined)
110
+ return false;
111
+ return matchesDenylist(policy?.hard_deny, toolName, rawInput);
112
+ }
113
+ /**
114
+ * 권한 결정 순서의 단일 출처(SoT) — hard-deny → 자동허용 → 채널 승인.
115
+ * 이 순서가 보안 핵심이다: hard_deny 는 allowlist/autopass 자동허용보다 반드시 먼저 평가되어야
116
+ * allowlist 에도 hard_deny 에도 있는 위험 도구(예: sudo)가 자동승인되지 않는다. 순서를 뒤집으면
117
+ * 그런 도구가 새므로, requestPermission 클로저는 반드시 이 함수를 통해 결정한다(순서 테스트 가능).
118
+ */
119
+ export function resolvePermDecision(policy, toolName, rawInput) {
120
+ if (isHardDenied(policy, toolName, rawInput))
121
+ return { kind: "hard_deny" };
122
+ const via = decideAutoAllow(policy, toolName, rawInput);
123
+ if (via)
124
+ return { kind: "auto", via };
125
+ return { kind: "ask" };
126
+ }
127
+ export class AcpBackendImpl {
128
+ adapterBin;
129
+ lanes = new Map();
130
+ laneConfigs = new Map();
131
+ /**
132
+ * relaunch → launch 로 전달되는 승계분(구독자·권한 핸들러) — launch 가 상태 생성 시 1회 소비.
133
+ * 인스턴스당 단일 슬롯이라 **한 impl = 한 레인** 불변식에 의존한다(supervisor 가 레인마다
134
+ * 별도 AcpBackendImpl 생성). 한 인스턴스가 다중 레인을 동시 relaunch 하면 승계가 레인 간
135
+ * 오염될 수 있으므로, 그 경우 Map<lane> 으로 키잉해야 한다.
136
+ */
137
+ pendingInherit = null;
138
+ constructor(adapterBin) {
139
+ this.adapterBin = adapterBin;
140
+ }
141
+ /**
142
+ * launch 전 레인별 경로·정책 설정.
143
+ * AcpBackend 인터페이스 계약 외부 — 구체 타입(AcpBackendImpl) 사용자만 호출.
144
+ */
145
+ configureLane(lane, config) {
146
+ this.laneConfigs.set(lane, config);
147
+ }
148
+ caps() {
149
+ return {
150
+ plane: "acp",
151
+ perm_tier: "acp",
152
+ supports_attachments: false,
153
+ acp_version: "v1",
154
+ };
155
+ }
156
+ async launch(lane, opts) {
157
+ const config = this.laneConfigs.get(lane);
158
+ const paths = config?.paths;
159
+ const addePolicy = config?.addePolicy;
160
+ const channelWarn = config?.channelWarn;
161
+ const tl = tFor(config?.lang);
162
+ const laneCwd = config?.cwd && config.cwd.length > 0 ? config.cwd : process.cwd();
163
+ const channel = config?.channel ?? "telegram";
164
+ // paths 가 있으면 엔진 stderr 를 레인 engine.log 로 캡처(없으면 inherit — 테스트/레거시).
165
+ const child = spawnEngine(this.adapterBin, [], paths ? { stderrPath: paths.engineLog } : {});
166
+ // child 'error'(예: 바이너리 ENOENT) 는 미처리 시 프로세스를 크래시시킨다.
167
+ // 핸드셰이크 완료 전에는 launch 실패로 전환하고, 이후에는 로깅한다(상시 리스너 유지).
168
+ let onSpawnError = (err) => console.error(t("log.acp.engineProcessError", { lane, error: err.message }));
169
+ const spawnFailed = new Promise((_, reject) => {
170
+ onSpawnError = (err) => reject(new Error(formatException({
171
+ situation: t("acp.spawnFail.situation", {
172
+ bin: this.adapterBin,
173
+ error: err.message,
174
+ }),
175
+ action: t("acp.spawnFail.action"),
176
+ }, tl)));
177
+ });
178
+ child.on("error", (err) => onSpawnError(err));
179
+ const toAgent = Writable.toWeb(child.stdin);
180
+ const fromAgent = Readable.toWeb(child.stdout);
181
+ const stream = acp.ndJsonStream(toAgent, fromAgent);
182
+ const laneRef = { state: null };
183
+ // toolCallId→원시 도구명 — tool_call 업데이트에서 채집, 권한 매칭에 사용.
184
+ const toolNames = new Map();
185
+ const conn = new acp.ClientSideConnection((_agent) => {
186
+ const clientImpl = {
187
+ async sessionUpdate(params) {
188
+ const update = params.update;
189
+ recordToolName(toolNames, update);
190
+ if (laneRef.state) {
191
+ for (const sub of laneRef.state.subscribers) {
192
+ try {
193
+ sub(update);
194
+ }
195
+ catch (err) {
196
+ // 무음 흡수 금지 — 다른 구독자는 계속하되 실패 신호는 큰소리로 기록.
197
+ console.error(t("log.acp.subscriberError", {
198
+ lane,
199
+ error: errMsg(err),
200
+ }));
201
+ if (paths) {
202
+ await appendTranscript(paths, {
203
+ sessionUpdate: "adde_warn",
204
+ message: t("acp.subscriberError", {
205
+ error: errMsg(err),
206
+ }),
207
+ }).catch((e) => console.error(t("log.acp.transcriptWriteFail", {
208
+ lane,
209
+ error: errMsg(e),
210
+ })));
211
+ }
212
+ }
213
+ }
214
+ if (paths) {
215
+ await appendTranscript(paths, update).catch((e) => console.error(t("log.acp.transcriptWriteFail", {
216
+ lane,
217
+ error: errMsg(e),
218
+ })));
219
+ }
220
+ const updateKind = "sessionUpdate" in update && typeof update["sessionUpdate"] === "string"
221
+ ? update["sessionUpdate"]
222
+ : "";
223
+ if (updateKind === "available_commands_update") {
224
+ // 무크래시 처리 — 로깅만
225
+ console.log(`[acp] lane=${lane} available_commands_update`);
226
+ }
227
+ if (updateKind === "current_mode_update" && laneRef.state && addePolicy) {
228
+ const engineEffective = extractEngineMode(update);
229
+ const result = comparePerm(addePolicy, engineEffective, tl);
230
+ if (result.diff && result.warn) {
231
+ const msg = result.warn.message;
232
+ console.warn(`[acp] ${msg}`);
233
+ if (channelWarn)
234
+ channelWarn(msg);
235
+ if (paths) {
236
+ await appendTranscript(paths, {
237
+ sessionUpdate: "adde_warn",
238
+ message: msg,
239
+ }).catch(() => { });
240
+ }
241
+ }
242
+ }
243
+ }
244
+ },
245
+ async requestPermission(params) {
246
+ // 표시용 제목(인자 포함) — 채널 프롬프트에 노출. 매칭 키가 아니다(인자 포함 문자열이라 도구명과 불일치).
247
+ const toolTitle = params.toolCall.title ?? "unknown";
248
+ // 매칭용 원시 도구명 — tool_call 업데이트 채집 맵에서 해석. 미해석 시 자동 허용 안 함(fail-closed).
249
+ const rawToolName = resolveToolName(toolNames, params.toolCall);
250
+ const rawInput = params.toolCall["rawInput"];
251
+ // 권한 결정은 resolvePermDecision 단일 출처를 통해 내린다 — hard-deny → 자동허용 → 채널 승인
252
+ // 순서가 그 안에 고정돼 있어(보안 핵심) 순서 회귀를 단위 테스트로 잡는다.
253
+ const decision = resolvePermDecision(addePolicy, rawToolName, rawInput);
254
+ // 방어심화 하드-거부 — 매칭 도구는 티어 무관하게 즉시 거부(채널 승인 프롬프트도 없음).
255
+ // acp 티어의 실수 승인 방지. 도구명 미해석 시엔 hard_deny 아님 → 아래 자동허용도 fail-closed.
256
+ if (decision.kind === "hard_deny") {
257
+ const msg = `hard-deny: ${rawToolName} — ${toolTitle}`;
258
+ console.warn(`[acp] ${msg}`);
259
+ if (channelWarn)
260
+ channelWarn(maskSecrets(tl("gate.hardDeny", { tool: rawToolName })));
261
+ if (paths) {
262
+ await appendTranscript(paths, {
263
+ sessionUpdate: "adde_hard_deny",
264
+ message: maskSecrets(msg),
265
+ }).catch(() => { });
266
+ }
267
+ return { outcome: { outcome: "cancelled" } };
268
+ }
269
+ // allowlist / autopass 자동 허용 — 채널 프롬프트 없이 allow 로 결정(게이트는 끄지 않고 결정).
270
+ // autopass: denylist 외 전 도구 자동 허용, denylist 도구는 아래 채널 승인 폴백.
271
+ // 투명성(no-silent): 트랜스크립트에 auto-allow 기록.
272
+ if (decision.kind === "auto") {
273
+ const autoAllowVia = decision.via;
274
+ const allowOption = params.options.find((o) => o.kind === "allow_once" || o.kind === "allow_always");
275
+ if (allowOption) {
276
+ if (paths) {
277
+ await appendTranscript(paths, {
278
+ sessionUpdate: "adde_auto_allow",
279
+ message: `auto-allow (${autoAllowVia}): ${rawToolName} — ${toolTitle}`,
280
+ }).catch(() => { });
281
+ }
282
+ return { outcome: { outcome: "selected", optionId: allowOption.optionId } };
283
+ }
284
+ }
285
+ if (!laneRef.state?.permHandler) {
286
+ return { outcome: { outcome: "cancelled" } };
287
+ }
288
+ const req = {
289
+ v: 1,
290
+ id: params.sessionId,
291
+ lane,
292
+ channel,
293
+ // 채널 표시: "도구명 · 제목" — 제목(인자 포함)은 사용자 판단 근거, 도구명은 식별자.
294
+ // 제목은 도구 인자를 포함하므로 detail 과 동일하게 마스킹한다.
295
+ tool: maskSecrets(rawToolName ? `${rawToolName} · ${toolTitle}` : toolTitle),
296
+ // 시크릿 마스킹(⑦) — detail 은 채널(telegram 메시지·markdown 승인 노트)에 평문 표면화된다.
297
+ detail: maskSecrets(JSON.stringify(params.toolCall)),
298
+ cwd: laneCwd,
299
+ ts: new Date().toISOString(),
300
+ };
301
+ const response = await laneRef.state.permHandler(req);
302
+ if (response.decision === "allow") {
303
+ const allowOption = params.options.find((o) => o.kind === "allow_once" || o.kind === "allow_always");
304
+ if (allowOption) {
305
+ return {
306
+ outcome: { outcome: "selected", optionId: allowOption.optionId },
307
+ };
308
+ }
309
+ }
310
+ return { outcome: { outcome: "cancelled" } };
311
+ },
312
+ async writeTextFile(_params) {
313
+ return {};
314
+ },
315
+ async readTextFile(_params) {
316
+ return { content: "" };
317
+ },
318
+ };
319
+ return clientImpl;
320
+ }, stream);
321
+ // 핸드셰이크 단계에서 spawn 실패가 나면 즉시 reject (행 방지). 추가로 시한을 둬
322
+ // 엔진이 응답 없이 멈춰도 영구 hang 하지 않게 한다 — 실패 시 child 를 정리하고 actionable 로 던진다.
323
+ const handshakeTimeoutErr = (phase) => new Error(formatException({
324
+ situation: t("acp.handshakeTimeout.situation", {
325
+ phase,
326
+ seconds: HANDSHAKE_TIMEOUT_MS / 1000,
327
+ }),
328
+ action: t("acp.handshakeTimeout.action"),
329
+ }, tl));
330
+ try {
331
+ await withTimeout(Promise.race([
332
+ conn.initialize({
333
+ protocolVersion: acp.PROTOCOL_VERSION,
334
+ clientCapabilities: {
335
+ fs: { readTextFile: true, writeTextFile: true },
336
+ },
337
+ }),
338
+ spawnFailed,
339
+ ]), HANDSHAKE_TIMEOUT_MS, () => handshakeTimeoutErr("initialize"));
340
+ }
341
+ catch (err) {
342
+ killChild(child);
343
+ throw err;
344
+ }
345
+ // resumeSessionId 지정 시 session/load 우선 시도 — 이 시점엔 laneRef.state 가 아직 null 이라
346
+ // 어댑터의 과거 대화 replay(update 재방출)는 구독자·transcript 에 닿지 않고 무해하게 흘려진다.
347
+ let sessionResp;
348
+ let resumed = false;
349
+ if (opts?.resumeSessionId) {
350
+ const resumeId = opts.resumeSessionId;
351
+ try {
352
+ await withTimeout(Promise.race([
353
+ conn.loadSession({ sessionId: resumeId, cwd: laneCwd, mcpServers: [] }),
354
+ spawnFailed,
355
+ ]), HANDSHAKE_TIMEOUT_MS, () => handshakeTimeoutErr("loadSession"));
356
+ sessionResp = { sessionId: resumeId };
357
+ resumed = true;
358
+ }
359
+ catch (err) {
360
+ // 세션 부재("Session not found") 등 — 새 세션 폴백. 호출자가 resumed=false 로 통지.
361
+ console.warn(t("log.acp.loadSessionFail", { lane, error: errMsg(err) }));
362
+ sessionResp = { sessionId: "" };
363
+ }
364
+ }
365
+ else {
366
+ sessionResp = { sessionId: "" };
367
+ }
368
+ if (!resumed) {
369
+ try {
370
+ sessionResp = await withTimeout(Promise.race([
371
+ conn.newSession({
372
+ cwd: laneCwd,
373
+ mcpServers: [],
374
+ }),
375
+ spawnFailed,
376
+ ]), HANDSHAKE_TIMEOUT_MS, () => handshakeTimeoutErr("newSession"));
377
+ }
378
+ catch (err) {
379
+ killChild(child);
380
+ throw err;
381
+ }
382
+ }
383
+ // 핸드셰이크 성공 — 이후 child 'error' 는 크래시 대신 로깅(spawnFailed 는 더 이상 소비 안 됨).
384
+ onSpawnError = (err) => console.error(t("log.acp.engineProcessError", { lane, error: err.message }));
385
+ const sessionId = sessionResp.sessionId;
386
+ if (paths) {
387
+ await mkdir(dirname(paths.sessionIdFile), { recursive: true });
388
+ await writeFile(paths.sessionIdFile, sessionId, "utf8");
389
+ }
390
+ // relaunch 승계는 상태 생성 시점에 원자 적용 — 등록 후 재부착 방식은 그 사이(perm-diff 조회 등)
391
+ // 도착하는 이벤트(예: session/load 직후 엔진 초기 청크)를 유실한다.
392
+ const inherit = this.pendingInherit;
393
+ this.pendingInherit = null;
394
+ const state = {
395
+ conn,
396
+ sessionId,
397
+ child,
398
+ subscribers: inherit ? [...inherit.subscribers] : [],
399
+ permHandler: inherit?.permHandler ?? null,
400
+ paths: paths ?? {},
401
+ addePolicy: addePolicy ?? { perm_tier: "acp", allowlist: [] },
402
+ onIdle: inherit?.onIdle ?? null,
403
+ };
404
+ laneRef.state = state;
405
+ this.lanes.set(lane, state);
406
+ if (paths && addePolicy) {
407
+ const engineEffective = await this.fetchEngineEffective(lane);
408
+ const result = comparePerm(addePolicy, engineEffective, tl);
409
+ if (result.diff && result.warn) {
410
+ // 차이 확인(정책차이)·확인불가(조회실패) 모두 경고 후 기동 계속 — 이전의 launch 거부를
411
+ // 사용자 요청으로 완화. 요구는 "차이 표기"이며 여기서 충족한다.
412
+ const note = result.warn.reason === "정책차이"
413
+ ? formatWarnNote({
414
+ situation: result.warn.message,
415
+ action: tl("acp.bypassAction"),
416
+ }, tl)
417
+ : result.warn.message;
418
+ console.warn(t("log.acp.permDiff", { note }));
419
+ if (channelWarn)
420
+ channelWarn(note);
421
+ await appendTranscript(paths, {
422
+ sessionUpdate: "adde_warn",
423
+ message: note,
424
+ }).catch((e) => console.error(t("log.acp.transcriptWriteFail", {
425
+ lane,
426
+ error: errMsg(e),
427
+ })));
428
+ }
429
+ }
430
+ return { sessionId, resumed };
431
+ }
432
+ /** 세션 리셋(/clear) — 재기동 + 새 세션. 구독자·핸들러 승계는 relaunch 공통부. */
433
+ async reset(lane) {
434
+ const { sessionId } = await this.relaunch(lane);
435
+ return { sessionId };
436
+ }
437
+ /** 지정 세션 복귀(/resume) — 재기동 + session/load. 실패 시 새 세션 폴백(resumed=false). */
438
+ async resumeSession(lane, sessionId) {
439
+ return this.relaunch(lane, sessionId);
440
+ }
441
+ /**
442
+ * 엔진 child 재기동 공통부 — 기존 구독자·권한 핸들러·onIdle 을 새 LaneState 로 승계한다
443
+ * (supervisor 배선은 launch 후 1회만 이뤄지므로 승계 없이는 재기동 시 이벤트가 유실된다).
444
+ * 승계는 launch 의 상태 생성 시점에 원자 적용(pendingInherit) — 등록·재부착 사이 유실 창 제거.
445
+ * launch 실패 시 레인은 미등록 상태로 남는다(엔진 사망) — 호출자(runControl)가 사용자에게
446
+ * 복구 절차(adde restart)를 명시 통지한다. 자가 재기동 감시는 후속 과제(백로그).
447
+ */
448
+ async relaunch(lane, resumeSessionId) {
449
+ const old = this.lanes.get(lane);
450
+ this.pendingInherit = {
451
+ subscribers: old ? [...old.subscribers] : [],
452
+ permHandler: old?.permHandler ?? null,
453
+ onIdle: old?.onIdle ?? null,
454
+ };
455
+ try {
456
+ await this.close(lane);
457
+ const res = await this.launch(lane, resumeSessionId ? { resumeSessionId } : undefined);
458
+ return { sessionId: res.sessionId, resumed: res.resumed ?? false };
459
+ }
460
+ finally {
461
+ this.pendingInherit = null;
462
+ }
463
+ }
464
+ async fetchEngineEffective(lane) {
465
+ const state = this.lanes.get(lane);
466
+ if (!state)
467
+ return null;
468
+ try {
469
+ const result = await state.conn.extMethod("session/getMode", {
470
+ sessionId: state.sessionId,
471
+ });
472
+ if (result && typeof result === "object") {
473
+ const r = result;
474
+ const effective = {};
475
+ if (typeof r["permissionMode"] === "string") {
476
+ effective.permissionMode = r["permissionMode"];
477
+ }
478
+ if (typeof r["bypassPermissions"] === "boolean") {
479
+ effective.bypassPermissions = r["bypassPermissions"];
480
+ }
481
+ return effective;
482
+ }
483
+ }
484
+ catch {
485
+ // 조회 실패 → null (안전망으로 보수 WARN)
486
+ }
487
+ return null;
488
+ }
489
+ async inject(lane, text) {
490
+ const state = this.lanes.get(lane);
491
+ if (!state)
492
+ throw new Error(`[acp] lane "${lane}" not launched`);
493
+ // prompt 는 turn 종료에 resolve 한다 — injector 는 inject() resolve 로 turn 종료를 감지해 다음 큐를
494
+ // 진행하므로(injector.ts) 별도 idle 콜백 배선은 불필요. stopReason 분기 없이 완료만 대기한다.
495
+ await state.conn.prompt({
496
+ sessionId: state.sessionId,
497
+ prompt: [{ type: "text", text }],
498
+ });
499
+ }
500
+ subscribe(lane, on) {
501
+ const state = this.lanes.get(lane);
502
+ if (!state) {
503
+ throw new Error(`[acp] lane "${lane}" not launched`);
504
+ }
505
+ state.subscribers.push(on);
506
+ }
507
+ onPermissionRequest(lane, handler) {
508
+ const state = this.lanes.get(lane);
509
+ if (!state)
510
+ throw new Error(`[acp] lane "${lane}" not launched`);
511
+ state.permHandler = handler;
512
+ }
513
+ /** 레인 종료 — 엔진 child 정리(SIGTERM→유예→SIGKILL) + 상태 제거. */
514
+ async close(lane) {
515
+ const state = this.lanes.get(lane);
516
+ this.lanes.delete(lane);
517
+ if (!state)
518
+ return;
519
+ await closeChild(state.child, CHILD_GRACE_MS);
520
+ }
521
+ }
522
+ function extractEngineMode(update) {
523
+ const mode = update["mode"];
524
+ if (!mode || typeof mode !== "object")
525
+ return null;
526
+ const m = mode;
527
+ const effective = {};
528
+ if (typeof m["permissionMode"] === "string") {
529
+ effective.permissionMode = m["permissionMode"];
530
+ }
531
+ if (typeof m["bypassPermissions"] === "boolean") {
532
+ effective.bypassPermissions = m["bypassPermissions"];
533
+ }
534
+ return effective;
535
+ }
536
+ /** formatWarn re-export — 채널 WARN 포맷 일관성. */
537
+ export { formatWarn };
538
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/backend/acp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ACP 백엔드 — 범용 ACP(JSON-RPC/stdio) 클라이언트 어댑터. 엔진 차이는 기동 프로필로 흡수.
3
+ */
4
+ export { AcpBackendImpl } from "./client.js";
5
+ export type { AcpBackend } from "./client.js";
6
+ export { spawnEngine, cleanEnv } from "./spawn.js";
7
+ export { comparePerm, formatWarn } from "./perm-diff.js";
8
+ export type { AddePolicy, EngineEffective, PermDiffResult } from "./perm-diff.js";
@@ -0,0 +1,7 @@
1
+ /**
2
+ * ACP 백엔드 — 범용 ACP(JSON-RPC/stdio) 클라이언트 어댑터. 엔진 차이는 기동 프로필로 흡수.
3
+ */
4
+ export { AcpBackendImpl } from "./client.js";
5
+ export { spawnEngine, cleanEnv } from "./spawn.js";
6
+ export { comparePerm, formatWarn } from "./perm-diff.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/backend/acp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 엔진 child 프로세스 수명 헬퍼 — 타임아웃·종료(SIGTERM→유예→SIGKILL).
3
+ * client.ts 에서 분리(테스트 가능성·관심사 분리).
4
+ */
5
+ import type { ChildProcess } from "node:child_process";
6
+ /** Promise 를 시한부로 감싼다 — 초과 시 onTimeout() 으로 reject. settle 시 타이머 정리(누수 방지). */
7
+ export declare function withTimeout<T>(p: Promise<T>, ms: number, onTimeout: () => Error): Promise<T>;
8
+ /**
9
+ * 실패 경로용 즉시 강제 종료 — 핸드셰이크 실패 등에서 child 누수 방지.
10
+ * 종료 판정은 exitCode===null(생존)로만 한다 — child.killed 는 "신호를 보냈다"는 뜻이지
11
+ * "죽었다"가 아니므로 가드에 쓰면 SIGKILL 이 누락된다.
12
+ */
13
+ export declare function killChild(child: ChildProcess): void;
14
+ /** graceful 종료: SIGTERM → graceMs 유예 → 미종료 시 SIGKILL. child exit 시 조기 정리. */
15
+ export declare function closeChild(child: ChildProcess, graceMs: number): Promise<void>;