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.
- package/LICENSE +21 -0
- package/README.ko.md +88 -0
- package/README.md +88 -0
- package/dist/backend/acp/client.d.ts +149 -0
- package/dist/backend/acp/client.js +538 -0
- package/dist/backend/acp/client.js.map +1 -0
- package/dist/backend/acp/index.d.ts +8 -0
- package/dist/backend/acp/index.js +7 -0
- package/dist/backend/acp/index.js.map +1 -0
- package/dist/backend/acp/lifecycle.d.ts +15 -0
- package/dist/backend/acp/lifecycle.js +56 -0
- package/dist/backend/acp/lifecycle.js.map +1 -0
- package/dist/backend/acp/perm-diff.d.ts +37 -0
- package/dist/backend/acp/perm-diff.js +58 -0
- package/dist/backend/acp/perm-diff.js.map +1 -0
- package/dist/backend/acp/spawn.d.ts +20 -0
- package/dist/backend/acp/spawn.js +70 -0
- package/dist/backend/acp/spawn.js.map +1 -0
- package/dist/cli/adde.d.ts +2 -0
- package/dist/cli/adde.js +11 -0
- package/dist/cli/adde.js.map +1 -0
- package/dist/cli/alias.d.ts +45 -0
- package/dist/cli/alias.js +94 -0
- package/dist/cli/alias.js.map +1 -0
- package/dist/cli/completion.d.ts +4 -0
- package/dist/cli/completion.js +209 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.js +114 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/lane.d.ts +20 -0
- package/dist/cli/lane.js +350 -0
- package/dist/cli/lane.js.map +1 -0
- package/dist/cli/ops.d.ts +5 -0
- package/dist/cli/ops.js +230 -0
- package/dist/cli/ops.js.map +1 -0
- package/dist/cli/prompt.d.ts +15 -0
- package/dist/cli/prompt.js +41 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/run.d.ts +5 -0
- package/dist/cli/run.js +216 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/spec.d.ts +48 -0
- package/dist/cli/spec.js +98 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/core/diagnostics.d.ts +73 -0
- package/dist/core/diagnostics.js +333 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/injector.d.ts +27 -0
- package/dist/core/injector.js +297 -0
- package/dist/core/injector.js.map +1 -0
- package/dist/core/lane-config.d.ts +80 -0
- package/dist/core/lane-config.js +303 -0
- package/dist/core/lane-config.js.map +1 -0
- package/dist/core/launchd.d.ts +81 -0
- package/dist/core/launchd.js +216 -0
- package/dist/core/launchd.js.map +1 -0
- package/dist/core/messages.d.ts +31 -0
- package/dist/core/messages.js +71 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/queue.d.ts +74 -0
- package/dist/core/queue.js +227 -0
- package/dist/core/queue.js.map +1 -0
- package/dist/core/runtime-state.d.ts +52 -0
- package/dist/core/runtime-state.js +90 -0
- package/dist/core/runtime-state.js.map +1 -0
- package/dist/core/session-ledger.d.ts +25 -0
- package/dist/core/session-ledger.js +89 -0
- package/dist/core/session-ledger.js.map +1 -0
- package/dist/core/supervisor.d.ts +41 -0
- package/dist/core/supervisor.js +315 -0
- package/dist/core/supervisor.js.map +1 -0
- package/dist/core/transcript.d.ts +22 -0
- package/dist/core/transcript.js +93 -0
- package/dist/core/transcript.js.map +1 -0
- package/dist/core/update-check.d.ts +25 -0
- package/dist/core/update-check.js +142 -0
- package/dist/core/update-check.js.map +1 -0
- package/dist/core/version.d.ts +7 -0
- package/dist/core/version.js +32 -0
- package/dist/core/version.js.map +1 -0
- package/dist/gate/gate.d.ts +41 -0
- package/dist/gate/gate.js +28 -0
- package/dist/gate/gate.js.map +1 -0
- package/dist/gate/index.d.ts +6 -0
- package/dist/gate/index.js +6 -0
- package/dist/gate/index.js.map +1 -0
- package/dist/shared/conf.d.ts +54 -0
- package/dist/shared/conf.js +85 -0
- package/dist/shared/conf.js.map +1 -0
- package/dist/shared/deny-match.d.ts +19 -0
- package/dist/shared/deny-match.js +122 -0
- package/dist/shared/deny-match.js.map +1 -0
- package/dist/shared/envelope.d.ts +37 -0
- package/dist/shared/envelope.js +91 -0
- package/dist/shared/envelope.js.map +1 -0
- package/dist/shared/errors.d.ts +8 -0
- package/dist/shared/errors.js +23 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/fs-atomic.d.ts +17 -0
- package/dist/shared/fs-atomic.js +31 -0
- package/dist/shared/fs-atomic.js.map +1 -0
- package/dist/shared/i18n.d.ts +23 -0
- package/dist/shared/i18n.js +53 -0
- package/dist/shared/i18n.js.map +1 -0
- package/dist/shared/locales/en.d.ts +393 -0
- package/dist/shared/locales/en.js +447 -0
- package/dist/shared/locales/en.js.map +1 -0
- package/dist/shared/locales/ko.d.ts +389 -0
- package/dist/shared/locales/ko.js +443 -0
- package/dist/shared/locales/ko.js.map +1 -0
- package/dist/shared/mask.d.ts +6 -0
- package/dist/shared/mask.js +28 -0
- package/dist/shared/mask.js.map +1 -0
- package/dist/shared/notify.d.ts +15 -0
- package/dist/shared/notify.js +20 -0
- package/dist/shared/notify.js.map +1 -0
- package/dist/shared/paths.d.ts +42 -0
- package/dist/shared/paths.js +83 -0
- package/dist/shared/paths.js.map +1 -0
- package/dist/src-adapters/index.d.ts +8 -0
- package/dist/src-adapters/index.js +6 -0
- package/dist/src-adapters/index.js.map +1 -0
- package/dist/src-adapters/markdown.d.ts +80 -0
- package/dist/src-adapters/markdown.js +794 -0
- package/dist/src-adapters/markdown.js.map +1 -0
- package/dist/src-adapters/source.d.ts +33 -0
- package/dist/src-adapters/source.js +3 -0
- package/dist/src-adapters/source.js.map +1 -0
- package/dist/src-adapters/telegram.d.ts +48 -0
- package/dist/src-adapters/telegram.js +412 -0
- package/dist/src-adapters/telegram.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 직렬 idle 게이트·dedup·turn 라이프사이클 루프.
|
|
3
|
+
* state=idle|active. active 동안 다음 envelope 미주입.
|
|
4
|
+
* 크래시 재개: 기동 시 scanProcessing → 각 id 에 isDone? 스킵 : 재처리.
|
|
5
|
+
* 응답 캡처: backend.inject() resolve(=turn 종료) 시 누적 응답을 writeOut + 렌더 트리거 → 다음 큐 진행.
|
|
6
|
+
* turn 종료 신호는 inject() resolve 로 감지한다(conn.prompt 가 turn 종료에 resolve) — 별도 idleCallback 배선 불요.
|
|
7
|
+
*/
|
|
8
|
+
import { t } from "../shared/i18n.js";
|
|
9
|
+
import { readFile } from "node:fs/promises";
|
|
10
|
+
import { appendTranscript } from "./transcript.js";
|
|
11
|
+
import { recordSession, touchSession, readLedger, formatWhen } from "./session-ledger.js";
|
|
12
|
+
import { errMsg } from "../shared/errors.js";
|
|
13
|
+
import { claimNext, scanProcessing, isDone, writeOut, writeFailed, processingFilePath, markSent, isSent, findUnsent, quarantineCorrupt, } from "./queue.js";
|
|
14
|
+
import { maskSecrets } from "../shared/mask.js";
|
|
15
|
+
import { parseEnvelope } from "../shared/envelope.js";
|
|
16
|
+
/** agent_message_chunk 이벤트 종류 판정(ACP sessionUpdate / 단순 type 양식 모두). */
|
|
17
|
+
function isAgentMessageChunk(event) {
|
|
18
|
+
const kind = "sessionUpdate" in event && typeof event["sessionUpdate"] === "string"
|
|
19
|
+
? event["sessionUpdate"]
|
|
20
|
+
: "type" in event && typeof event["type"] === "string"
|
|
21
|
+
? event["type"]
|
|
22
|
+
: "";
|
|
23
|
+
return kind === "agent_message_chunk";
|
|
24
|
+
}
|
|
25
|
+
/** 질문 발췌(첫 줄 80자, 마스킹) — 채널 렌더 헤더의 맥락 표시용 보조 정보. */
|
|
26
|
+
export function questionExcerpt(text) {
|
|
27
|
+
const firstLine = text.split("\n", 1)[0] ?? "";
|
|
28
|
+
const masked = maskSecrets(firstLine.trim());
|
|
29
|
+
return masked.length > 80 ? `${masked.slice(0, 79)}…` : masked;
|
|
30
|
+
}
|
|
31
|
+
/** agent_message_chunk content 에서 텍스트 추출(string | {type,text}). */
|
|
32
|
+
function chunkText(event) {
|
|
33
|
+
const raw = event["content"];
|
|
34
|
+
if (typeof raw === "string")
|
|
35
|
+
return raw;
|
|
36
|
+
if (raw && typeof raw === "object") {
|
|
37
|
+
const c = raw;
|
|
38
|
+
return c.type === "text" ? (c.text ?? "") : "";
|
|
39
|
+
}
|
|
40
|
+
return "";
|
|
41
|
+
}
|
|
42
|
+
export function createInjector(paths, lane, backend, render, onFail,
|
|
43
|
+
/** 제어 결과 등 채널 대면 문구의 로케일(레인 lang). 미지정 시 전역 t. */
|
|
44
|
+
laneT = t) {
|
|
45
|
+
let state = "idle";
|
|
46
|
+
let responseText = "";
|
|
47
|
+
// claim→처리 진입을 직렬화(E4): idle 체크와 processOne(state=active) 사이의 두 await(claimNext·isDone)
|
|
48
|
+
// 창에서 두 injectNext 가 각각 다른 메시지를 claim 해 동시 turn 이 뜨는 경합 방지(rename 은 동일
|
|
49
|
+
// 메시지 중복만 막음). advancing 은 injectNext 전 구간을 감싸 한 번에 하나만 진행하게 한다.
|
|
50
|
+
let advancing = false;
|
|
51
|
+
// 전송 중인 id — start() 의 flushUnsent 는 advancing 가드 밖이라, 기동 중 notify 발 injectNext 의
|
|
52
|
+
// flushUnsent 와 동시 진입할 수 있다. deliver 진입 가드(in-flight Set + isSent 재확인)로 같은 응답의
|
|
53
|
+
// 이중 전송(중복 render)을 차단한다.
|
|
54
|
+
const delivering = new Set();
|
|
55
|
+
function onSessionEvent(event) {
|
|
56
|
+
if (state !== "active")
|
|
57
|
+
return;
|
|
58
|
+
if (isAgentMessageChunk(event))
|
|
59
|
+
responseText += chunkText(event);
|
|
60
|
+
}
|
|
61
|
+
/** state/<lane>/session.id 읽기 — 장부 갱신용(부재 시 null, 보조 데이터). */
|
|
62
|
+
async function currentSessionId() {
|
|
63
|
+
try {
|
|
64
|
+
return (await readFile(paths.sessionIdFile, "utf8")).trim() || null;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/** 제어 요청 수행 — 채널 통지 문구를 반환(레인 로케일). 실패는 throw(처리부 공통 실패 경로). */
|
|
71
|
+
async function runControl(envelope) {
|
|
72
|
+
const control = envelope.control;
|
|
73
|
+
switch (control.kind) {
|
|
74
|
+
case "clear": {
|
|
75
|
+
if (!backend.reset)
|
|
76
|
+
return laneT("injector.control.unsupported");
|
|
77
|
+
let sessionId;
|
|
78
|
+
try {
|
|
79
|
+
({ sessionId } = await backend.reset(lane));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
// 재기동 실패 = 레인 엔진 사망 가능 — 일반 실패와 구분해 복구 절차를 명시 통지.
|
|
83
|
+
console.error(t("log.injector.relaunchError", { lane, error: errMsg(err) }));
|
|
84
|
+
return laneT("injector.control.relaunchFailed", { error: maskSecrets(errMsg(err)) });
|
|
85
|
+
}
|
|
86
|
+
await recordSession(paths, sessionId).catch(() => { });
|
|
87
|
+
return laneT("injector.control.cleared");
|
|
88
|
+
}
|
|
89
|
+
case "compact": {
|
|
90
|
+
// 엔진 위임 — 슬래시 텍스트를 그대로 주입하면 엔진이 compaction 수행.
|
|
91
|
+
// 어댑터가 커맨드 출력을 삼키므로(local-command-stdout) 완료 통지는 여기서 생성.
|
|
92
|
+
await backend.inject(lane, "/compact");
|
|
93
|
+
const sid = await currentSessionId();
|
|
94
|
+
if (sid)
|
|
95
|
+
await touchSession(paths, sid).catch(() => { });
|
|
96
|
+
return laneT("injector.control.compacted");
|
|
97
|
+
}
|
|
98
|
+
case "resume": {
|
|
99
|
+
if (!backend.resumeSession)
|
|
100
|
+
return laneT("injector.control.unsupported");
|
|
101
|
+
if (!control.sessionId)
|
|
102
|
+
return laneT("injector.control.resumeMissing");
|
|
103
|
+
let r;
|
|
104
|
+
try {
|
|
105
|
+
r = await backend.resumeSession(lane, control.sessionId);
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
console.error(t("log.injector.relaunchError", { lane, error: errMsg(err) }));
|
|
109
|
+
return laneT("injector.control.relaunchFailed", { error: maskSecrets(errMsg(err)) });
|
|
110
|
+
}
|
|
111
|
+
await recordSession(paths, r.sessionId).catch(() => { });
|
|
112
|
+
return r.resumed
|
|
113
|
+
? laneT("injector.control.resumed", { id: r.sessionId })
|
|
114
|
+
: laneT("injector.control.resumeFallback", { id: control.sessionId });
|
|
115
|
+
}
|
|
116
|
+
case "sessions": {
|
|
117
|
+
const entries = await readLedger(paths);
|
|
118
|
+
if (entries.length === 0)
|
|
119
|
+
return laneT("injector.control.sessionsEmpty");
|
|
120
|
+
const current = await currentSessionId();
|
|
121
|
+
const lines = entries.map((e, i) => {
|
|
122
|
+
const label = e.label ?? laneT("injector.control.sessionsNoLabel");
|
|
123
|
+
const mark = e.id === current ? " ◀" : "";
|
|
124
|
+
return (laneT("injector.control.sessionsItem", {
|
|
125
|
+
n: i + 1,
|
|
126
|
+
label,
|
|
127
|
+
last: formatWhen(e.lastActivityAt),
|
|
128
|
+
id: e.id,
|
|
129
|
+
}) + mark);
|
|
130
|
+
});
|
|
131
|
+
return `${laneT("injector.control.sessionsHeader")}\n${lines.join("\n")}\n\n${laneT("injector.control.sessionsHint")}`;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** 한 메시지의 turn 을 처리: inject → (turn 종료) 응답 기록 + 렌더. 제어 envelope 는 세션 제어로 분기. */
|
|
136
|
+
async function processOne(id, envelope) {
|
|
137
|
+
state = "active";
|
|
138
|
+
responseText = "";
|
|
139
|
+
try {
|
|
140
|
+
if (envelope.control) {
|
|
141
|
+
const message = await runControl(envelope);
|
|
142
|
+
await appendTranscript(paths, {
|
|
143
|
+
sessionUpdate: "adde_control",
|
|
144
|
+
message: `${envelope.control.kind}: ${message}`,
|
|
145
|
+
}).catch(() => { });
|
|
146
|
+
const sidecar = { ts: new Date().toISOString(), origin_ts: envelope.ts };
|
|
147
|
+
if (envelope.reply_ref?.channel_msg_id) {
|
|
148
|
+
sidecar.reply_ref = { channel_msg_id: envelope.reply_ref.channel_msg_id };
|
|
149
|
+
}
|
|
150
|
+
await writeOut(paths, id, message, sidecar);
|
|
151
|
+
await deliver(id);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
await backend.inject(lane, envelope.text);
|
|
155
|
+
// inject resolve = turn 종료 — 누적 응답을 마스킹 후 out 기록 + 렌더.
|
|
156
|
+
const sidecar = { ts: new Date().toISOString(), origin_ts: envelope.ts };
|
|
157
|
+
if (envelope.reply_ref?.channel_msg_id) {
|
|
158
|
+
sidecar.reply_ref = { channel_msg_id: envelope.reply_ref.channel_msg_id };
|
|
159
|
+
}
|
|
160
|
+
const question = questionExcerpt(envelope.text);
|
|
161
|
+
if (question.length > 0)
|
|
162
|
+
sidecar.question = question;
|
|
163
|
+
await writeOut(paths, id, maskSecrets(responseText), sidecar);
|
|
164
|
+
await deliver(id);
|
|
165
|
+
// 세션 장부 갱신(보조): 마지막 대화 시각 + 미기재 시 첫 프롬프트 발췌를 라벨로.
|
|
166
|
+
const sid = await currentSessionId();
|
|
167
|
+
if (sid)
|
|
168
|
+
await touchSession(paths, sid, question || undefined).catch(() => { });
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const detail = errMsg(err);
|
|
172
|
+
console.error(t("log.injector.injectError", { lane, id, detail }));
|
|
173
|
+
// 실패를 .failed 사이드카로 보존(E1) — processing/<id>.msg 는 남아 재기동 시 재처리(at-least-once).
|
|
174
|
+
await writeFailed(paths, id, t("injector.injectFailed", { ts: new Date().toISOString(), detail })).catch((e) => console.error(t("log.injector.failedWriteFail", {
|
|
175
|
+
lane,
|
|
176
|
+
id,
|
|
177
|
+
error: errMsg(e),
|
|
178
|
+
})));
|
|
179
|
+
// 실패를 채널에도 표면화(보조) — 노트/메시지 없이 조용히 사라진 것처럼 보이는 것을 방지.
|
|
180
|
+
if (onFail) {
|
|
181
|
+
await onFail(id, detail).catch((e) => console.error(t("log.injector.failNotifyError", {
|
|
182
|
+
lane,
|
|
183
|
+
id,
|
|
184
|
+
error: errMsg(e),
|
|
185
|
+
})));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
state = "idle";
|
|
190
|
+
responseText = "";
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 응답을 채널로 전송하고 성공 시 .sent 마커 기록.
|
|
195
|
+
* render 실패(부분 청크 실패 포함)는 .sent 미기록 → out/ 에 durable 하게 남아 재전송 대상(flushUnsent).
|
|
196
|
+
*/
|
|
197
|
+
async function deliver(id) {
|
|
198
|
+
// 이중 전송 가드: in-flight 클레임은 await 이전에 동기적으로 잡아야 두 동시 호출이 모두 통과하는
|
|
199
|
+
// 창이 없다. add 후 .sent 재확인으로 직전(완료된) flush 가 이미 보낸 경우(stale 목록)도 건너뛴다.
|
|
200
|
+
if (delivering.has(id))
|
|
201
|
+
return;
|
|
202
|
+
delivering.add(id);
|
|
203
|
+
try {
|
|
204
|
+
if (await isSent(paths, id))
|
|
205
|
+
return;
|
|
206
|
+
if (!render) {
|
|
207
|
+
// 렌더 대상 없음(예: chat_id 미설정) — 전송 개념 부재로 즉시 종결 처리.
|
|
208
|
+
await markSent(paths, id);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
await render(id);
|
|
212
|
+
await markSent(paths, id);
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
console.error(t("log.injector.renderError", {
|
|
216
|
+
lane,
|
|
217
|
+
id,
|
|
218
|
+
error: errMsg(err),
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
delivering.delete(id);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/** out/ 에 응답은 있으나(.out) 미전송(.sent 부재)인 항목 재전송 — render 실패·크래시 복구. */
|
|
226
|
+
async function flushUnsent() {
|
|
227
|
+
const ids = await findUnsent(paths);
|
|
228
|
+
for (const id of ids)
|
|
229
|
+
await deliver(id);
|
|
230
|
+
}
|
|
231
|
+
/** 다음 injectNext 를 비동기 예약 — rejection(예: 일시적 fs 오류)은 로깅(unhandled 방지). */
|
|
232
|
+
function scheduleNext() {
|
|
233
|
+
setImmediate(() => {
|
|
234
|
+
void injectNext().catch((err) => {
|
|
235
|
+
console.error(t("log.injector.advanceError", {
|
|
236
|
+
lane,
|
|
237
|
+
error: errMsg(err),
|
|
238
|
+
}));
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
async function injectNext() {
|
|
243
|
+
if (state !== "idle" || advancing)
|
|
244
|
+
return;
|
|
245
|
+
advancing = true;
|
|
246
|
+
try {
|
|
247
|
+
// 미전송(.out 있고 .sent 부재) 응답을 먼저 재전송 — render 실패·크래시 복구.
|
|
248
|
+
await flushUnsent();
|
|
249
|
+
const claimed = await claimNext(paths);
|
|
250
|
+
if (!claimed)
|
|
251
|
+
return;
|
|
252
|
+
const { id, envelope } = claimed;
|
|
253
|
+
if (await isDone(paths, id)) {
|
|
254
|
+
// dedup: out 이미 존재 → prompt 미호출, 다음으로 진행.
|
|
255
|
+
scheduleNext();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
await processOne(id, envelope);
|
|
259
|
+
// turn 종료 후 다음 큐 메시지로 진행.
|
|
260
|
+
scheduleNext();
|
|
261
|
+
}
|
|
262
|
+
finally {
|
|
263
|
+
advancing = false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async function start() {
|
|
267
|
+
// 크래시 재개: 응답은 기록됐으나 미전송된 항목 먼저 재전송.
|
|
268
|
+
await flushUnsent();
|
|
269
|
+
// processing 잔존 파일을 순차 재처리.
|
|
270
|
+
const pendingIds = await scanProcessing(paths);
|
|
271
|
+
for (const id of pendingIds) {
|
|
272
|
+
if (await isDone(paths, id))
|
|
273
|
+
continue; // dedup — 이미 out 있음
|
|
274
|
+
let envelope;
|
|
275
|
+
try {
|
|
276
|
+
const { readFile } = await import("node:fs/promises");
|
|
277
|
+
envelope = parseEnvelope(await readFile(processingFilePath(paths, id), "utf8"));
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
// 손상 메시지 — 격리 후 다음으로(매 기동 동일 파싱오류 반복 차단).
|
|
281
|
+
await quarantineCorrupt(paths, id, err);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
await processOne(id, envelope); // processOne 은 자체 try/catch(.failed)로 throw 하지 않음
|
|
285
|
+
}
|
|
286
|
+
await injectNext();
|
|
287
|
+
}
|
|
288
|
+
function notify() {
|
|
289
|
+
scheduleNext();
|
|
290
|
+
}
|
|
291
|
+
function getState() {
|
|
292
|
+
return state;
|
|
293
|
+
}
|
|
294
|
+
return { start, notify, onSessionEvent, getState };
|
|
295
|
+
}
|
|
296
|
+
export { writeOut };
|
|
297
|
+
//# sourceMappingURL=injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/core/injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { LaneConf } from "../shared/conf.js";
|
|
2
|
+
/** 파일 권한 모드 허용값. 미지정 시 private(secure-by-default). */
|
|
3
|
+
export declare const KNOWN_FILE_MODES: readonly ["private", "shared"];
|
|
4
|
+
/** 구현된 perm_tier 값. 오타 시 acp 처럼 동작(안전 방향)하지만 의도와 다르므로 생성 시 경고. */
|
|
5
|
+
export declare const KNOWN_PERM_TIERS: readonly ["acp", "autopass"];
|
|
6
|
+
/** 검증 실패를 식별하기 위한 전용 에러(흡수 금지 — 호출자가 메시지를 사용자에게 전달). */
|
|
7
|
+
export declare class LaneConfigError extends Error {
|
|
8
|
+
name: string;
|
|
9
|
+
}
|
|
10
|
+
export interface LaneCommandBaseOptions {
|
|
11
|
+
/** 설정 base 경로(테스트 override). 미지정 시 $ADDE_HOME 또는 ~/.config/adde. */
|
|
12
|
+
base?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface LaneAddOptions extends LaneCommandBaseOptions {
|
|
15
|
+
source?: string;
|
|
16
|
+
backend?: string;
|
|
17
|
+
engine?: string;
|
|
18
|
+
channel?: string;
|
|
19
|
+
perm_tier?: string;
|
|
20
|
+
acp_version?: string;
|
|
21
|
+
allowlist?: string[];
|
|
22
|
+
denylist?: string[];
|
|
23
|
+
/** 방어심화 하드-거부 목록(티어 무관 즉시 거부). `Tool`/`Tool(글롭)` 형식. */
|
|
24
|
+
hard_deny?: string[];
|
|
25
|
+
/** true 면 hard_deny 에 내장 위험명령 기본 목록을 채운다(explicit hard_deny 와 합집합). */
|
|
26
|
+
safe_defaults?: boolean;
|
|
27
|
+
cwd?: string;
|
|
28
|
+
chat_id?: string;
|
|
29
|
+
root?: string;
|
|
30
|
+
inbox?: string;
|
|
31
|
+
approvals?: string;
|
|
32
|
+
outbox?: string;
|
|
33
|
+
/** 레인별 채널 메시지 로케일(en|ko). 미지정 시 전역 로케일. */
|
|
34
|
+
lang?: string;
|
|
35
|
+
/** telegram 인바운드 허용 발신자(CSV, 숫자 user/chat id). */
|
|
36
|
+
allow_from?: string;
|
|
37
|
+
/** 상태·출력·큐 디렉터리 권한(private|shared). 미지정 시 private. */
|
|
38
|
+
file_mode?: string;
|
|
39
|
+
/** 봇 토큰(telegram). 주어지면 state/<lane>/.env 에 0600 으로 기록. */
|
|
40
|
+
token?: string;
|
|
41
|
+
/** 기존 conf(및 token 지정 시 .env) 를 덮어쓴다. */
|
|
42
|
+
force?: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface LaneAddResult {
|
|
45
|
+
lane: string;
|
|
46
|
+
confPath: string;
|
|
47
|
+
conf: LaneConf;
|
|
48
|
+
/** token 을 .env 에 기록한 경우 그 경로. */
|
|
49
|
+
envPath?: string;
|
|
50
|
+
/** 생성을 막지 않는 사전 검증 경고(액션형). 기동 전 점검 항목. */
|
|
51
|
+
warnings: string[];
|
|
52
|
+
}
|
|
53
|
+
export interface LaneListResult {
|
|
54
|
+
lanes: string[];
|
|
55
|
+
}
|
|
56
|
+
export interface LaneShowResult {
|
|
57
|
+
lane: string;
|
|
58
|
+
confPath: string;
|
|
59
|
+
conf: LaneConf;
|
|
60
|
+
text: string;
|
|
61
|
+
}
|
|
62
|
+
export interface LaneRemoveResult {
|
|
63
|
+
lane: string;
|
|
64
|
+
confPath: string;
|
|
65
|
+
}
|
|
66
|
+
/** CSV 를 트림·빈값 제거해 항목 배열로. allow_from 등 목록 문자열 파싱 공용. */
|
|
67
|
+
export declare function parseCsv(raw: string): string[];
|
|
68
|
+
/** conf.file_mode → 정규화된 권한 모드. 미지정/미지값은 private(secure-by-default). */
|
|
69
|
+
export declare function resolveFileMode(mode: string | undefined): "private" | "shared";
|
|
70
|
+
/**
|
|
71
|
+
* `adde lane add` — 레인 conf 생성. 검증 통과 후 원자적 기록.
|
|
72
|
+
* 기존 conf 가 있으면 force 없이는 거부한다.
|
|
73
|
+
*/
|
|
74
|
+
export declare function laneAdd(proj: string, lane: string, opts?: LaneAddOptions): Promise<LaneAddResult>;
|
|
75
|
+
/** `adde lane ls` — proj 의 레인 ID 목록(정렬). lanes.d 부재 시 빈 배열. */
|
|
76
|
+
export declare function laneList(proj: string, opts?: LaneCommandBaseOptions): Promise<LaneListResult>;
|
|
77
|
+
/** `adde lane show` — 레인 conf 의 파싱 결과와 원본 텍스트. */
|
|
78
|
+
export declare function laneShow(proj: string, lane: string, opts?: LaneCommandBaseOptions): Promise<LaneShowResult>;
|
|
79
|
+
/** `adde lane rm` — 레인 conf 삭제. 부재 시 에러. state/queue 등 부수 데이터는 보존. */
|
|
80
|
+
export declare function laneRemove(proj: string, lane: string, opts?: LaneCommandBaseOptions): Promise<LaneRemoveResult>;
|