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,83 @@
1
+ /**
2
+ * 레인별 경로 동적 구성. 레인 ID 하드코딩 금지 — 전부 파라미터.
3
+ * 레인 A 가 레인 B 의 경로에 접근하지 않도록 파라미터 기반 격리.
4
+ */
5
+ import { join, relative, isAbsolute } from "node:path";
6
+ import { homedir } from "node:os";
7
+ /** 기본 base 경로. 테스트 환경 override 용으로 분리 주입 가능. */
8
+ function defaultBase() {
9
+ const override = process.env["ADDE_HOME"];
10
+ if (override)
11
+ return override;
12
+ return join(homedir(), ".config", "adde");
13
+ }
14
+ /**
15
+ * 선행 `~`/`~/` 를 홈 디렉터리로 확장. (Node 는 셸과 달리 ~ 를 자동 확장하지 않음)
16
+ * conf 의 cwd/root 같은 사용자 입력 경로에 적용한다. ~user 형태는 미지원.
17
+ */
18
+ export function expandTilde(p) {
19
+ if (p === "~")
20
+ return homedir();
21
+ if (p.startsWith("~/"))
22
+ return join(homedir(), p.slice(2));
23
+ return p;
24
+ }
25
+ /** proj/lane 식별자 허용 문자셋 — 경로 세그먼트로 안전(`..`·`/`·구분자 차단). lane-config 의 NAME_RE 와 동일 규약. */
26
+ const SAFE_SEGMENT_RE = /^[A-Za-z0-9_-]+$/;
27
+ /**
28
+ * proj/lane 이 경로 세그먼트로 안전한지 검증 — 위반 시 throw.
29
+ * lanePaths 가 경로 구성의 SSOT 이므로 여기서 막으면 모든 호출부(진단·수퍼바이저 등)가 일괄 보호된다(디렉터리 탈출·레인 격리 위반 차단).
30
+ */
31
+ export function assertSafeSegment(kind, value) {
32
+ if (!SAFE_SEGMENT_RE.test(value)) {
33
+ throw new Error(`잘못된 ${kind} 이름 "${value}" — 영숫자·_·- 만 허용됩니다(경로 탈출 차단).`);
34
+ }
35
+ }
36
+ /** proj/lane 세그먼트 안전성 여부(throw 없이). 디렉터리 열거 등에서 비안전 이름을 걸러낼 때 사용. */
37
+ export function isSafeSegment(value) {
38
+ return SAFE_SEGMENT_RE.test(value);
39
+ }
40
+ // --- 경로 포함/중첩 판정 ------------------------------------------------------
41
+ // markdown 어댑터의 기동 fail-closed 가드와 lane-config 의 생성 시 사전 경고가
42
+ // 반드시 같은 규칙으로 판정해야 하므로(어긋나면 경고 없이 기동만 거부되는 갈림),
43
+ // 판정 로직의 SSOT 를 여기 둔다.
44
+ /** child 가 parent 와 같거나 그 내부인지(대소문자 정규화 없음 — 필요 시 normCasePath 로 감싼다). */
45
+ export function isPathInside(child, parent) {
46
+ const rel = relative(parent, child);
47
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
48
+ }
49
+ /**
50
+ * 대소문자 정규화 — macOS 기본 FS 는 대소문자 무시라 Shared/shared 가 같은 물리 디렉터리.
51
+ * darwin 은 소문자 정규화 후 비교한다(대소문자 구분 볼륨에선 과차단이나 fail-closed 방향이라 수용).
52
+ */
53
+ export function normCasePath(p) {
54
+ return process.platform === "darwin" ? p.toLowerCase() : p;
55
+ }
56
+ /** 두 경로가 같거나 포함 관계인지(대소문자 정규화 적용). */
57
+ export function pathsOverlap(a, b) {
58
+ const na = normCasePath(a);
59
+ const nb = normCasePath(b);
60
+ return isPathInside(na, nb) || isPathInside(nb, na);
61
+ }
62
+ export function lanePaths(base, proj, lane) {
63
+ assertSafeSegment("proj", proj);
64
+ assertSafeSegment("lane", lane);
65
+ const root = join(base, proj);
66
+ const stateDir = join(root, "state", lane);
67
+ return {
68
+ lanesDir: join(root, "lanes.d"),
69
+ queueDir: join(root, "queue", lane),
70
+ processingDir: join(root, "processing", lane),
71
+ outDir: join(root, "out", lane),
72
+ stateDir,
73
+ envFile: join(stateDir, ".env"),
74
+ sessionIdFile: join(stateDir, "session.id"),
75
+ sessionsFile: join(stateDir, "sessions.json"),
76
+ transcriptLog: join(stateDir, "transcript.log"),
77
+ engineLog: join(stateDir, "engine.log"),
78
+ runtimeJson: join(stateDir, "runtime.json"),
79
+ confFile: join(root, "lanes.d", `${lane}.conf`),
80
+ };
81
+ }
82
+ export { defaultBase };
83
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/shared/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,gDAAgD;AAChD,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAoBD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,0FAA0F;AAC1F,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAqB,EAAE,KAAa;IACpE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,QAAQ,KAAK,gCAAgC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,yEAAyE;AACzE,6DAA6D;AAC7D,gDAAgD;AAChD,uBAAuB;AAEvB,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,MAAc;IACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY;IAChE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC/B,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;QACnC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC;QAC7C,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC;QAC/B,QAAQ;QACR,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC/B,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QAC3C,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC;QAC7C,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC;QAC/C,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC;QACvC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC;QAC3C,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC;KAChD,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 소스 어댑터 — telegram(long-poll)·markdown(fs watch, 예: Obsidian). discord(Gateway WS)는 보류.
3
+ */
4
+ export { createTelegramSource } from "./telegram.js";
5
+ export type { TelegramSource, TelegramConfig, GateDecisionCallback } from "./telegram.js";
6
+ export { createMarkdownSource } from "./markdown.js";
7
+ export type { MarkdownConfig } from "./markdown.js";
8
+ export type { Source, Decision, DecisionCallback } from "./source.js";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 소스 어댑터 — telegram(long-poll)·markdown(fs watch, 예: Obsidian). discord(Gateway WS)는 보류.
3
+ */
4
+ export { createTelegramSource } from "./telegram.js";
5
+ export { createMarkdownSource } from "./markdown.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/src-adapters/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,80 @@
1
+ import type { LanePaths } from "../shared/paths.js";
2
+ import type { LaneConf } from "../shared/conf.js";
3
+ import type { PermRequest } from "../gate/gate.js";
4
+ import type { Source, Decision } from "./source.js";
5
+ import type { NotifyT } from "../shared/notify.js";
6
+ export interface MarkdownConfig {
7
+ lane: string;
8
+ proj: string;
9
+ engine: string;
10
+ paths: LanePaths;
11
+ conf: LaneConf;
12
+ /** 인바운드 enqueue 직후 호출(injector 깨우기). in-process 신호 — watch 불요. */
13
+ onInbound?: (() => void) | undefined;
14
+ }
15
+ /** 동기 충돌 파일 판별 — 파싱·실행 금지 대상(Obsidian Sync/Syncthing 등). */
16
+ export declare function isConflictFile(filename: string): boolean;
17
+ /** 전송 스탬프 표기 — 로컬 시각 `YYYYMMDD-HHmmss`. */
18
+ export declare function formatStamp(d: Date): string;
19
+ /** ISO 타임스탬프(envelope.ts/sidecar)로부터 스탬프 도출. */
20
+ export declare function stampFromIso(iso: string): string;
21
+ /** out 응답 노트 basename(확장자 제외) — sent 위키링크 텍스트와 동일해야 한다. */
22
+ export declare function outNoteBase(stamp: string, id: string): string;
23
+ /**
24
+ * 스탬프를 로컬 시각으로 되돌려 ISO 로 복원 — 재개(re-enqueue) 시 envelope.ts 가
25
+ * sending 라인의 스탬프와 같은 값을 재현해야 sent 위키링크와 노트 파일명이 일치한다.
26
+ * 형식 불일치(구버전 라인 등)면 null.
27
+ */
28
+ export declare function isoFromStamp(stamp: string): string | null;
29
+ /** 인박스 액션 — main 이 id 부여·enqueue·종단 마킹을 수행. */
30
+ export interface InboxAction {
31
+ /** fresh=신규 트리거 · resume=`sending <id>` 재개 · empty=빈 트리거 · control=세션 제어 라벨. */
32
+ kind: "fresh" | "resume" | "empty" | "control";
33
+ lineIndex: number;
34
+ text: string;
35
+ /** resume 시 기존 id. */
36
+ id?: string;
37
+ /** resume 시 sending 라인에 기록된 전송 스탬프(구버전 라인엔 없음). */
38
+ stamp?: string;
39
+ /** control 시 제어 종류·인자(resume 의 번호/세션 id). */
40
+ controlKind?: "clear" | "compact" | "resume" | "sessions";
41
+ controlArg?: string;
42
+ }
43
+ export interface InboxParse {
44
+ actions: InboxAction[];
45
+ lines: string[];
46
+ trailingNewline: boolean;
47
+ }
48
+ /** send 트리거 라인을 단계별 마커로 재작성하는 헬퍼(2단계 내구 마킹). */
49
+ export declare function sendingLine(id: string, stamp: string): string;
50
+ export declare function sentLine(id: string, stamp: string): string;
51
+ export declare function emptyLine(): string;
52
+ /**
53
+ * 인박스 본문을 파싱해 액션 목록을 만든다(파일은 쓰지 않음, id 부여도 main 책임).
54
+ * - 경계 라인: send 트리거(라벨=send)·`sending <id>`·종단(`sent`/`empty`) 체크박스.
55
+ * - 그 외 체크박스(사용자 todo 등)는 메시지 본문으로 취급(경계 아님).
56
+ * - 체크된 send 트리거 직전 세그먼트가 메시지(빈 세그먼트는 empty 액션).
57
+ * - `sending <id>` 는 크래시 재개 후보(resume) — main 이 hasId 로 존재검사 후 보정.
58
+ */
59
+ export declare function parseInbox(content: string): InboxParse;
60
+ /** 권한 요청 1건을 approvals 노트 블록 문자열로 렌더(append 용, 말미 개행 포함). */
61
+ export declare function renderApprovalBlock(req: PermRequest, tl?: NotifyT, now?: Date): string;
62
+ export interface ApprovalDecision {
63
+ reqId: string;
64
+ decision: Decision;
65
+ }
66
+ export interface ApprovalsParse {
67
+ decisions: ApprovalDecision[];
68
+ newContent: string;
69
+ changed: boolean;
70
+ }
71
+ /**
72
+ * approvals 노트에서 결정된 권한 블록을 추출하고 종단 재작성한다.
73
+ * - status=pending 블록에서 allow/deny 중 정확히 하나 체크 → 결정.
74
+ * - 0개/2개 체크 = 모호 → pending 유지.
75
+ * - 결정 블록은 marker status 와 헤딩을 종단 상태로 재작성(멱등 가드).
76
+ */
77
+ export declare function parseApprovals(content: string): ApprovalsParse;
78
+ /** 타임아웃·강제 종단 시 pending 블록을 deny 로 재작성. 변경 없으면 changed=false. */
79
+ export declare function finalizeApprovalDeny(content: string, reqId: string, reason: string): ApprovalsParse;
80
+ export declare function createMarkdownSource(cfg: MarkdownConfig): Source;