@yuaone/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @module constants
3
+ * @description YUAN Agent 상수 정의.
4
+ *
5
+ * 보안 관련 패턴(DANGEROUS_PATTERNS, SENSITIVE_FILE_PATTERNS, ALLOWED_EXECUTABLES)은
6
+ * security.ts가 SSOT이며, 여기서는 re-export만 한다.
7
+ */
8
+ // Security constants (DANGEROUS_PATTERNS, SENSITIVE_FILE_PATTERNS, ALLOWED_EXECUTABLES)
9
+ // are defined in security.ts (SSOT) and exported directly from index.ts.
10
+ // Do NOT re-export them here to avoid duplicate export paths.
11
+ /**
12
+ * 플랜별 리소스 제한 (SSOT — 설계 문서 11.2 기준)
13
+ */
14
+ export const PLAN_LIMITS = {
15
+ FREE: {
16
+ dailyExecutions: 3,
17
+ maxIterations: 5,
18
+ maxParallelAgents: 1,
19
+ tokensPerRequest: 20_000,
20
+ sessionTtlMs: 5 * 60 * 1000, // 5분
21
+ concurrentSessions: 1,
22
+ },
23
+ PRO: {
24
+ dailyExecutions: 15,
25
+ maxIterations: 25,
26
+ maxParallelAgents: 3,
27
+ tokensPerRequest: 72_000,
28
+ sessionTtlMs: 30 * 60 * 1000, // 30분
29
+ concurrentSessions: 2,
30
+ },
31
+ BUSINESS: {
32
+ dailyExecutions: 50,
33
+ maxIterations: 50,
34
+ maxParallelAgents: 7,
35
+ tokensPerRequest: 140_000,
36
+ sessionTtlMs: 2 * 60 * 60 * 1000, // 2시간
37
+ concurrentSessions: 5,
38
+ },
39
+ ENTERPRISE: {
40
+ dailyExecutions: 150,
41
+ maxIterations: 100,
42
+ maxParallelAgents: Infinity,
43
+ tokensPerRequest: 240_000,
44
+ sessionTtlMs: 8 * 60 * 60 * 1000, // 8시간
45
+ concurrentSessions: 20,
46
+ },
47
+ };
48
+ /**
49
+ * 프로바이더별 기본 모델
50
+ */
51
+ export const MODEL_DEFAULTS = {
52
+ openai: "gpt-4o",
53
+ anthropic: "claude-sonnet-4-20250514",
54
+ google: "gemini-2.5-flash",
55
+ yua: "yua-pro",
56
+ deepseek: "deepseek-chat",
57
+ };
58
+ /**
59
+ * 프로바이더별 API Base URL
60
+ */
61
+ export const PROVIDER_BASE_URLS = {
62
+ openai: "https://api.openai.com/v1",
63
+ anthropic: "https://api.anthropic.com",
64
+ google: "https://generativelanguage.googleapis.com/v1beta/openai",
65
+ yua: "https://yuaone.com/api/v1",
66
+ deepseek: "https://api.deepseek.com/v1",
67
+ };
68
+ /**
69
+ * 도구 결과 크기 제한 (바이트)
70
+ */
71
+ export const TOOL_RESULT_LIMITS = {
72
+ file_read: 50_000,
73
+ shell_exec: 100_000,
74
+ grep: 10_000,
75
+ glob: 5_000,
76
+ test_run: 20_000,
77
+ };
78
+ /**
79
+ * 히스토리 압축 설정
80
+ */
81
+ export const HISTORY_COMPACTION = {
82
+ /** 원본 유지하는 최근 iteration 수 */
83
+ recentWindow: 5,
84
+ /** 도구 결과만 요약으로 교체하는 범위 */
85
+ summaryWindow: 10,
86
+ };
87
+ /**
88
+ * YUAN.md 탐색 경로 (우선순위 순)
89
+ */
90
+ export const YUAN_MD_SEARCH_PATHS = [
91
+ "YUAN.md",
92
+ ".yuan/config.md",
93
+ ".yuan/YUAN.md",
94
+ "docs/YUAN.md",
95
+ ];
96
+ /**
97
+ * 기본 AgentLoop 설정값
98
+ */
99
+ export const DEFAULT_LOOP_CONFIG = {
100
+ maxIterations: 25,
101
+ maxTokensPerIteration: 8_000,
102
+ totalTokenBudget: 200_000,
103
+ };
104
+ /** Design Mode: allowed edit paths (Governor enforced) */
105
+ export const DESIGN_ALLOWED_PATHS = [
106
+ "src/",
107
+ "app/",
108
+ "components/",
109
+ "styles/",
110
+ "pages/",
111
+ "public/",
112
+ "assets/",
113
+ ];
114
+ /** Design Mode: blocked edit paths */
115
+ export const DESIGN_BLOCKED_PATHS = [
116
+ "node_modules/",
117
+ ".env",
118
+ "package.json",
119
+ "package-lock.json",
120
+ "pnpm-lock.yaml",
121
+ "yarn.lock",
122
+ ".git/",
123
+ ];
124
+ /** Design Mode: security scan patterns */
125
+ export const DESIGN_SECURITY_PATTERNS = {
126
+ xss: [
127
+ /dangerouslySetInnerHTML/,
128
+ /\bonclick\s*=/i,
129
+ /\bonerror\s*=/i,
130
+ /\bonload\s*=/i,
131
+ /javascript:/i,
132
+ ],
133
+ csp: [
134
+ /style\s*=\s*["']/,
135
+ /<script[^>]*>/i,
136
+ ],
137
+ injection: [
138
+ /\$\{[^}]*(?:user|input|query|param)/i,
139
+ ],
140
+ };
141
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,435 @@
1
+ /**
2
+ * @module context-budget
3
+ * @description 컨텍스트 윈도우 예산 관리자.
4
+ *
5
+ * LLM 컨텍스트 오버플로우를 방지하기 위한 고급 예산 관리 시스템.
6
+ * - 카테고리별 토큰 예산 배분 및 강제
7
+ * - 우선순위 기반 선택적 유지/제거
8
+ * - LLM 기반 요약을 통한 오래된 메시지 압축
9
+ * - 관련성 기반 검색으로 필요한 컨텍스트만 로드
10
+ * - 슬라이딩 윈도우 + 체크포인트로 핵심 결정 보존
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const budget = new ContextBudgetManager({ totalBudget: 128_000 });
15
+ *
16
+ * budget.addItem({
17
+ * category: "systemPrompt",
18
+ * priority: "critical",
19
+ * content: systemPrompt,
20
+ * role: "system",
21
+ * });
22
+ *
23
+ * budget.addItem({
24
+ * category: "conversationHistory",
25
+ * priority: "high",
26
+ * content: userMessage,
27
+ * role: "user",
28
+ * });
29
+ *
30
+ * // Auto-manage when nearing limits
31
+ * await budget.autoManage(async (text) => llm.summarize(text));
32
+ *
33
+ * // Build context for LLM call
34
+ * const messages = budget.toMessages();
35
+ * ```
36
+ */
37
+ import { EventEmitter } from "node:events";
38
+ import type { Message } from "./types.js";
39
+ /** 카테고리별 토큰 예산 배분 (합계 = 100) */
40
+ export interface BudgetAllocation {
41
+ /** 시스템 프롬프트 비율 (기본 15%) */
42
+ systemPrompt: number;
43
+ /** 프로젝트 컨텍스트 비율 — YUAN.md, 파일 컨텍스트 (기본 10%) */
44
+ projectContext: number;
45
+ /** 대화 히스토리 비율 (기본 40%) */
46
+ conversationHistory: number;
47
+ /** 도구 결과 비율 (기본 25%) */
48
+ toolResults: number;
49
+ /** 워킹 메모리 비율 (기본 10%) */
50
+ workingMemory: number;
51
+ }
52
+ /** 컨텍스트 아이템 우선순위 */
53
+ export type ContextPriority = "critical" | "high" | "medium" | "low" | "ephemeral";
54
+ /** 컨텍스트 아이템 — 예산 관리의 최소 단위 */
55
+ export interface ContextItem {
56
+ /** 고유 ID */
57
+ id: string;
58
+ /** 소속 카테고리 */
59
+ category: keyof BudgetAllocation;
60
+ /** 우선순위 */
61
+ priority: ContextPriority;
62
+ /** 콘텐츠 문자열 */
63
+ content: string;
64
+ /** 추정 토큰 수 */
65
+ tokenCount: number;
66
+ /** 생성 시각 (epoch ms) */
67
+ timestamp: number;
68
+ /** 메시지 역할 */
69
+ role?: "system" | "user" | "assistant" | "tool";
70
+ /** 도구 이름 (role=tool 일 때) */
71
+ toolName?: string;
72
+ /** 연관 파일 경로 */
73
+ file?: string;
74
+ /** 이미 요약되었는지 여부 */
75
+ summarized?: boolean;
76
+ /** 이 아이템이 요약한 원본 아이템 ID 목록 */
77
+ summaryOf?: string[];
78
+ /** 사용자가 수동으로 고정했는지 여부 */
79
+ pinned?: boolean;
80
+ }
81
+ /** 요약 결과 */
82
+ export interface ContextSummary {
83
+ /** 요약된 원본 아이템 ID 목록 */
84
+ originalIds: string[];
85
+ /** 원본 총 토큰 수 */
86
+ originalTokens: number;
87
+ /** 요약된 콘텐츠 */
88
+ summarizedContent: string;
89
+ /** 요약 토큰 수 */
90
+ summarizedTokens: number;
91
+ /** 압축률 (요약/원본) */
92
+ compressionRatio: number;
93
+ /** 생성 시각 (epoch ms) */
94
+ createdAt: number;
95
+ }
96
+ /** 검색 쿼리 — 관련성 기반 컨텍스트 필터링 */
97
+ export interface RetrievalQuery {
98
+ /** 현재 태스크 목표 */
99
+ goal: string;
100
+ /** 현재 작업 중인 파일 */
101
+ currentFiles: string[];
102
+ /** 최근 사용한 도구 */
103
+ recentTools: string[];
104
+ /** 추출된 키워드 */
105
+ keywords: string[];
106
+ }
107
+ /** 검색 결과 */
108
+ export interface RetrievalResult {
109
+ /** 검색된 아이템 목록 */
110
+ items: ContextItem[];
111
+ /** 총 토큰 수 */
112
+ totalTokens: number;
113
+ /** 예산 초과로 잘렸는지 여부 */
114
+ truncated: boolean;
115
+ /** 평균 관련성 점수 (0-1) */
116
+ retrievalScore: number;
117
+ }
118
+ /** ContextBudgetManager 설정 */
119
+ export interface ContextBudgetConfig {
120
+ /** 총 토큰 예산 (기본 128,000) */
121
+ totalBudget: number;
122
+ /** 카테고리별 예산 배분 */
123
+ allocation: BudgetAllocation;
124
+ /** 요약 기능 활성화 (기본 true) */
125
+ enableSummarization: boolean;
126
+ /** 요약 트리거 사용률 (기본 0.75) */
127
+ summarizationThreshold: number;
128
+ /** 최소 요약 배치 크기 (기본 5) */
129
+ minItemsToSummarize: number;
130
+ /** 요약 최대 토큰 수 (기본 500) */
131
+ maxSummaryLength: number;
132
+ /** 검색 기능 활성화 (기본 true) */
133
+ enableRetrieval: boolean;
134
+ /** 검색 시 최대 반환 아이템 수 (기본 20) */
135
+ retrievalTopK: number;
136
+ /** 체크포인트 기능 활성화 (기본 true) */
137
+ enableCheckpoints: boolean;
138
+ /** 체크포인트 생성 간격 (메시지 수, 기본 10) */
139
+ checkpointInterval: number;
140
+ /** 최대 유지 체크포인트 수 (기본 5) */
141
+ maxCheckpoints: number;
142
+ /** 제거 전략 (기본 "hybrid") */
143
+ evictionStrategy: "lru" | "priority" | "hybrid";
144
+ }
145
+ /** 예산 현황 */
146
+ export interface BudgetStatus {
147
+ /** 총 예산 */
148
+ totalBudget: number;
149
+ /** 사용 중인 토큰 수 */
150
+ usedTokens: number;
151
+ /** 사용률 (0-1) */
152
+ usagePercent: number;
153
+ /** 카테고리별 현황 */
154
+ byCategory: Record<keyof BudgetAllocation, {
155
+ budget: number;
156
+ used: number;
157
+ percent: number;
158
+ itemCount: number;
159
+ }>;
160
+ /** 요약 수행 횟수 */
161
+ summarizationCount: number;
162
+ /** 제거된 아이템 수 */
163
+ evictionCount: number;
164
+ /** 체크포인트 수 */
165
+ checkpointCount: number;
166
+ /** 건강 상태 */
167
+ health: "healthy" | "warning" | "critical" | "overflow";
168
+ }
169
+ /** ContextBudgetManager의 직렬화 스냅샷 — 세션 영속성용 */
170
+ export interface ContextBudgetSnapshot {
171
+ /** 모든 컨텍스트 아이템 (Map → 배열 변환) */
172
+ items: Array<{
173
+ key: string;
174
+ item: ContextItem;
175
+ }>;
176
+ /** 요약 기록 */
177
+ summaries: ContextSummary[];
178
+ /** 체크포인트 목록 */
179
+ checkpoints: ContextCheckpoint[];
180
+ /** 내부 ID 카운터 */
181
+ idCounter: number;
182
+ /** 요약 수행 횟수 */
183
+ summarizationCount: number;
184
+ /** 제거된 아이템 수 */
185
+ evictionCount: number;
186
+ }
187
+ /** 컨텍스트 체크포인트 — 슬라이딩 윈도우의 스냅샷 */
188
+ export interface ContextCheckpoint {
189
+ /** 체크포인트 ID */
190
+ id: string;
191
+ /** 생성 시각 (epoch ms) */
192
+ timestamp: number;
193
+ /** 메시지 인덱스 */
194
+ messageIndex: number;
195
+ /** 축약된 요약 */
196
+ summary: string;
197
+ /** 핵심 결정 목록 */
198
+ keyDecisions: string[];
199
+ /** 현재 작업 중인 파일 목록 */
200
+ activeFiles: string[];
201
+ /** 토큰 수 */
202
+ tokenCount: number;
203
+ }
204
+ /**
205
+ * ContextBudgetManager — LLM 컨텍스트 윈도우 예산을 지능적으로 관리.
206
+ *
207
+ * 핵심 기능:
208
+ * - 카테고리별 토큰 예산 배분 및 강제
209
+ * - 우선순위 기반 아이템 제거 (hybrid LRU + priority)
210
+ * - LLM 기반 요약을 통한 오래된 메시지 압축
211
+ * - 관련성 점수 기반 검색으로 필요한 컨텍스트만 로드
212
+ * - 슬라이딩 윈도우 + 체크포인트로 핵심 결정 보존
213
+ *
214
+ * 이벤트:
215
+ * - `budget:warning` — 사용률 > 75%
216
+ * - `budget:critical` — 사용률 > 90%
217
+ * - `budget:overflow` — 사용률 > 100%, 강제 제거 수행
218
+ * - `summarize:start` — 요약 시작
219
+ * - `summarize:complete` — 요약 완료 (압축률 포함)
220
+ * - `evict:items` — 아이템 제거됨
221
+ * - `checkpoint:created` — 체크포인트 저장됨
222
+ */
223
+ export declare class ContextBudgetManager extends EventEmitter {
224
+ private readonly config;
225
+ private items;
226
+ private summaries;
227
+ private checkpoints;
228
+ private idCounter;
229
+ private summarizationCount;
230
+ private evictionCount;
231
+ constructor(config?: Partial<ContextBudgetConfig>);
232
+ /**
233
+ * 컨텍스트 아이템을 추가하고 자동으로 예산을 강제한다.
234
+ * 추가 후 전체 사용률이 90%를 넘으면 `budget:critical` 이벤트를 발생시킨다.
235
+ *
236
+ * @param item - 아이템 메타데이터 (id, tokenCount, timestamp 자동 생성)
237
+ * @param content - 아이템 콘텐츠
238
+ * @returns 생성된 ContextItem
239
+ */
240
+ addItem(item: Omit<ContextItem, "id" | "tokenCount" | "timestamp">, content: string): ContextItem;
241
+ /**
242
+ * 기존 아이템의 콘텐츠를 업데이트한다.
243
+ * @param id - 아이템 ID
244
+ * @param content - 새 콘텐츠
245
+ */
246
+ updateItem(id: string, content: string): void;
247
+ /**
248
+ * 아이템을 제거한다.
249
+ * @param id - 제거할 아이템 ID
250
+ */
251
+ removeItem(id: string): void;
252
+ /**
253
+ * 아이템을 고정/해제한다. 고정된 아이템은 절대 제거되지 않는다.
254
+ * @param id - 아이템 ID
255
+ * @param pinned - 고정 여부 (기본 true)
256
+ */
257
+ pinItem(id: string, pinned?: boolean): void;
258
+ /**
259
+ * 현재 예산 현황을 반환한다.
260
+ * @returns 카테고리별 사용량, 건강 상태 등
261
+ */
262
+ getStatus(): BudgetStatus;
263
+ /**
264
+ * 특정 카테고리의 예산 토큰 수를 반환한다.
265
+ * @param category - 카테고리 이름
266
+ * @returns 해당 카테고리의 토큰 예산
267
+ */
268
+ getCategoryBudget(category: keyof BudgetAllocation): number;
269
+ /**
270
+ * 지정된 토큰 수를 추가할 공간이 있는지 확인한다.
271
+ * @param tokens - 필요한 토큰 수
272
+ * @param category - 특정 카테고리 체크 (미지정 시 전체)
273
+ * @returns 공간 있으면 true
274
+ */
275
+ hasRoom(tokens: number, category?: keyof BudgetAllocation): boolean;
276
+ /**
277
+ * 카테고리의 남은 토큰 수를 반환한다.
278
+ * 카테고리 간 차용을 허용하여 소프트 예산의 20% 오버플로우까지 허용한다.
279
+ * @param category - 카테고리 이름
280
+ * @returns 남은 토큰 수
281
+ */
282
+ getRemainingTokens(category: keyof BudgetAllocation): number;
283
+ /**
284
+ * LLM 호출을 위한 최종 컨텍스트를 구축한다.
285
+ * 예산 내에서 우선순위 순으로 아이템을 정렬하여 반환한다.
286
+ * @returns 예산 내의 ContextItem 배열
287
+ */
288
+ buildContext(): ContextItem[];
289
+ /**
290
+ * 관련성 기반 검색으로 컨텍스트를 구축한다.
291
+ * 현재 작업과 관련 없는 아이템은 제외하여 토큰을 절약한다.
292
+ * @param query - 검색 쿼리
293
+ * @returns 검색 결과
294
+ */
295
+ buildContextWithRetrieval(query: RetrievalQuery): RetrievalResult;
296
+ /**
297
+ * 카테고리별 아이템을 우선순위 → 최신순으로 정렬하여 반환한다.
298
+ * @param category - 카테고리 이름
299
+ * @returns 정렬된 ContextItem 배열
300
+ */
301
+ getItemsByCategory(category: keyof BudgetAllocation): ContextItem[];
302
+ /**
303
+ * 오래된 medium 우선순위 메시지를 LLM으로 요약한다.
304
+ * 연속된 medium 아이템을 그룹화하여 하나의 요약으로 교체한다.
305
+ *
306
+ * @param summarizeFn - LLM 요약 호출 함수
307
+ * @returns 요약 결과 또는 null (요약 불필요 시)
308
+ */
309
+ summarize(summarizeFn: (messages: string) => Promise<string>): Promise<ContextSummary | null>;
310
+ /**
311
+ * 요약이 필요한지 확인한다.
312
+ * 전체 사용률이 summarizationThreshold를 초과하고
313
+ * 요약 가능한 medium 아이템이 충분하면 true.
314
+ * @returns 요약 필요 여부
315
+ */
316
+ needsSummarization(): boolean;
317
+ /**
318
+ * 지정된 토큰 수를 확보하기 위해 아이템을 제거한다.
319
+ *
320
+ * Hybrid 전략:
321
+ * 1. ephemeral 아이템 먼저 제거
322
+ * 2. low 우선순위 아이템 제거 (LRU 순)
323
+ * 3. medium 우선순위 아이템 제거 (LRU 순)
324
+ * 4. high는 최후의 수단으로만
325
+ * 5. critical/pinned는 절대 제거 불가
326
+ *
327
+ * @param tokensNeeded - 확보해야 할 토큰 수
328
+ * @returns 제거된 아이템 목록
329
+ */
330
+ evict(tokensNeeded: number): ContextItem[];
331
+ /**
332
+ * 예산을 자동으로 관리한다.
333
+ * 사용률에 따라 요약 → 제거 순서로 토큰을 확보한다.
334
+ *
335
+ * @param summarizeFn - LLM 요약 호출 함수 (선택)
336
+ * @returns 요약/제거된 아이템 수
337
+ */
338
+ autoManage(summarizeFn?: (messages: string) => Promise<string>): Promise<{
339
+ summarized: number;
340
+ evicted: number;
341
+ }>;
342
+ /**
343
+ * 현재 상태의 체크포인트를 생성한다.
344
+ * 체크포인트는 전체 컨텍스트의 축약 요약 + 핵심 결정 목록을 포함한다.
345
+ *
346
+ * @param messageIndex - 현재 메시지 인덱스
347
+ * @param summarizeFn - LLM 요약 호출 함수
348
+ * @returns 생성된 체크포인트
349
+ */
350
+ createCheckpoint(messageIndex: number, summarizeFn: (text: string) => Promise<string>): Promise<ContextCheckpoint>;
351
+ /**
352
+ * 체크포인트에서 복원한다.
353
+ * 현재 아이템을 모두 지우고 체크포인트 요약을 시스템 메시지로 추가한다.
354
+ *
355
+ * @param checkpoint - 복원할 체크포인트
356
+ */
357
+ restoreFromCheckpoint(checkpoint: ContextCheckpoint): void;
358
+ /**
359
+ * 모든 체크포인트를 반환한다.
360
+ * @returns 읽기 전용 체크포인트 배열
361
+ */
362
+ getCheckpoints(): readonly ContextCheckpoint[];
363
+ /**
364
+ * 아이템의 현재 작업에 대한 관련성 점수를 계산한다.
365
+ *
366
+ * 점수 구성:
367
+ * - fileMatch (0.3): 현재 작업 파일과 일치
368
+ * - keywordMatch (0.25): 키워드 겹침
369
+ * - recencyScore (0.2): 최신일수록 높음
370
+ * - priorityScore (0.15): 높은 우선순위일수록 높음
371
+ * - toolMatch (0.1): 최근 사용 도구와 일치
372
+ *
373
+ * @param item - 평가할 아이템
374
+ * @param query - 검색 쿼리
375
+ * @returns 관련성 점수 (0-1)
376
+ */
377
+ scoreRelevance(item: ContextItem, query: RetrievalQuery): number;
378
+ /**
379
+ * JSON 직렬화 — 세션 영속성을 위해 전체 상태를 스냅샷으로 변환한다.
380
+ * Map/Set → 배열 변환을 수행한다.
381
+ *
382
+ * @returns ContextBudgetSnapshot
383
+ */
384
+ toJSON(): ContextBudgetSnapshot;
385
+ /**
386
+ * JSON에서 ContextBudgetManager를 복구한다.
387
+ * 기존 config를 유지하면서 저장된 런타임 상태를 복원한다.
388
+ *
389
+ * @param snapshot - 저장된 스냅샷
390
+ * @param config - 예산 설정 (미지정 시 기본값)
391
+ * @returns 복원된 ContextBudgetManager
392
+ */
393
+ static fromJSON(snapshot: ContextBudgetSnapshot, config?: Partial<ContextBudgetConfig>): ContextBudgetManager;
394
+ /**
395
+ * 문자열의 대략적인 토큰 수를 추정한다.
396
+ *
397
+ * CJK 문자가 30% 이상이면 CJK 모드 (~2 chars/token),
398
+ * 그 외에는 영어 모드 (~3.5 chars/token).
399
+ *
400
+ * @param text - 추정할 문자열
401
+ * @returns 추정 토큰 수
402
+ */
403
+ estimateTokens(text: string): number;
404
+ /**
405
+ * 현재 아이템을 LLM 호출용 Message[] 로 변환한다.
406
+ * 예산 내의 아이템만 포함하며, timestamp 순으로 정렬한다.
407
+ *
408
+ * @returns Message 배열
409
+ */
410
+ toMessages(): Message[];
411
+ /**
412
+ * 기존 Message[] 히스토리를 아이템으로 임포트한다.
413
+ * 각 메시지를 적절한 카테고리와 우선순위로 분류한다.
414
+ *
415
+ * @param messages - 임포트할 메시지 배열
416
+ */
417
+ importMessages(messages: Message[]): void;
418
+ /**
419
+ * 전체 사용 중인 토큰 수를 계산한다.
420
+ */
421
+ private getTotalUsedTokens;
422
+ /**
423
+ * 예산 건강 상태를 확인하고 필요 시 이벤트를 발생시킨다.
424
+ */
425
+ private checkBudgetHealth;
426
+ /**
427
+ * 제거 전략에 따라 아이템을 정렬한다.
428
+ * 제거 순서: ephemeral → low → medium → high (oldest first within each)
429
+ *
430
+ * @param items - 정렬할 아이템 배열
431
+ * @returns 제거 우선순위 순으로 정렬된 배열
432
+ */
433
+ private sortForEviction;
434
+ }
435
+ //# sourceMappingURL=context-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-budget.d.ts","sourceRoot":"","sources":["../src/context-budget.ts"],"names":[],"mappings":"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"}