aiwf 0.3.21 → 0.3.23

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 (140) hide show
  1. package/package.json +3 -2
  2. package/src/cli/index.js +39 -336
  3. package/src/lib/installer.js +310 -90
  4. package/src/utils/messages.js +24 -0
  5. package/src/DEPENDENCY_MAP.md +0 -90
  6. package/src/cli/cache-cli.js +0 -459
  7. package/src/cli/checkpoint-cli.js +0 -417
  8. package/src/cli/language-cli.js +0 -286
  9. package/src/cli/sprint-cli.js +0 -287
  10. package/src/commands/ai-tool.js +0 -383
  11. package/src/commands/compress.js +0 -60
  12. package/src/commands/create-project.js +0 -160
  13. package/src/commands/evaluate.js +0 -459
  14. package/src/commands/persona.js +0 -309
  15. package/src/commands/sprint-task.js +0 -262
  16. package/src/commands/token.js +0 -312
  17. package/src/lib/ai-persona-manager.js +0 -711
  18. package/src/lib/cache-system.js +0 -332
  19. package/src/lib/context-engine.js +0 -568
  20. package/src/lib/github-integration.js +0 -402
  21. package/src/lib/memory-profiler.js +0 -471
  22. package/src/lib/metrics-collector.js +0 -885
  23. package/src/lib/offline-detector.js +0 -386
  24. package/src/lib/resource-loader-enhanced.js +0 -399
  25. package/src/lib/resource-loader.js +0 -250
  26. package/src/lib/resources/commands/ai-persona.js +0 -602
  27. package/src/lib/resources/commands/compress-context.js +0 -389
  28. package/src/lib/resources/commands/evaluate.js +0 -246
  29. package/src/lib/resources/commands/persona-context-apply.js +0 -562
  30. package/src/lib/resources/commands/token-tracking.js +0 -443
  31. package/src/lib/resources/config/commit-patterns.js +0 -103
  32. package/src/lib/resources/config/language.json +0 -6
  33. package/src/lib/resources/personas/PERSONA_INDEX.md +0 -57
  34. package/src/lib/resources/personas/analyst.json +0 -44
  35. package/src/lib/resources/personas/architect/best_practices.md +0 -136
  36. package/src/lib/resources/personas/architect/knowledge_base.md +0 -377
  37. package/src/lib/resources/personas/architect.json +0 -44
  38. package/src/lib/resources/personas/backend/best_practices.md +0 -766
  39. package/src/lib/resources/personas/backend/knowledge_base.md +0 -1070
  40. package/src/lib/resources/personas/data_analyst/best_practices.md +0 -594
  41. package/src/lib/resources/personas/data_analyst/knowledge_base.md +0 -1057
  42. package/src/lib/resources/personas/developer.json +0 -44
  43. package/src/lib/resources/personas/developer.md +0 -37
  44. package/src/lib/resources/personas/evaluation_criteria.json +0 -137
  45. package/src/lib/resources/personas/frontend/best_practices.md +0 -445
  46. package/src/lib/resources/personas/frontend/knowledge_base.md +0 -729
  47. package/src/lib/resources/personas/persona-index.json +0 -31
  48. package/src/lib/resources/personas/reviewer.json +0 -44
  49. package/src/lib/resources/personas/security/best_practices.md +0 -307
  50. package/src/lib/resources/personas/security/knowledge_base.md +0 -498
  51. package/src/lib/resources/personas/tester.json +0 -44
  52. package/src/lib/resources/templates/README.md +0 -78
  53. package/src/lib/resources/templates/api-server/config.json +0 -64
  54. package/src/lib/resources/templates/api-server/template/.aiwf/config.json +0 -56
  55. package/src/lib/resources/templates/api-server/template/.aiwf/feature-ledger.json +0 -42
  56. package/src/lib/resources/templates/api-server/template/.aiwf/personas/backend-engineer.json +0 -40
  57. package/src/lib/resources/templates/api-server/template/.aiwf/scripts/cli.js +0 -111
  58. package/src/lib/resources/templates/api-server/template/.env.example +0 -29
  59. package/src/lib/resources/templates/api-server/template/.eslintrc.json +0 -23
  60. package/src/lib/resources/templates/api-server/template/README.md +0 -171
  61. package/src/lib/resources/templates/api-server/template/jest.config.js +0 -26
  62. package/src/lib/resources/templates/api-server/template/nodemon.json +0 -9
  63. package/src/lib/resources/templates/api-server/template/package.json +0 -61
  64. package/src/lib/resources/templates/api-server/template/src/app.ts +0 -60
  65. package/src/lib/resources/templates/api-server/template/src/config/swagger.ts +0 -38
  66. package/src/lib/resources/templates/api-server/template/src/controllers/aiwfController.ts +0 -54
  67. package/src/lib/resources/templates/api-server/template/src/controllers/authController.ts +0 -128
  68. package/src/lib/resources/templates/api-server/template/src/controllers/statusController.ts +0 -28
  69. package/src/lib/resources/templates/api-server/template/src/index.ts +0 -28
  70. package/src/lib/resources/templates/api-server/template/src/middleware/aiwfMiddleware.ts +0 -50
  71. package/src/lib/resources/templates/api-server/template/src/middleware/authMiddleware.ts +0 -41
  72. package/src/lib/resources/templates/api-server/template/src/middleware/errorHandler.ts +0 -42
  73. package/src/lib/resources/templates/api-server/template/src/middleware/notFoundHandler.ts +0 -14
  74. package/src/lib/resources/templates/api-server/template/src/middleware/requestLogger.ts +0 -20
  75. package/src/lib/resources/templates/api-server/template/src/routes/aiwf.ts +0 -31
  76. package/src/lib/resources/templates/api-server/template/src/routes/index.ts +0 -13
  77. package/src/lib/resources/templates/api-server/template/src/routes/v1/index.ts +0 -67
  78. package/src/lib/resources/templates/api-server/template/src/utils/logger.ts +0 -37
  79. package/src/lib/resources/templates/api-server/template/tests/app.test.ts +0 -40
  80. package/src/lib/resources/templates/api-server/template/tsconfig.json +0 -43
  81. package/src/lib/resources/templates/npm-library/config.json +0 -61
  82. package/src/lib/resources/templates/npm-library/template/LICENSE +0 -21
  83. package/src/lib/resources/templates/npm-library/template/README.md +0 -201
  84. package/src/lib/resources/templates/npm-library/template/package.json +0 -78
  85. package/src/lib/resources/templates/web-app/config.json +0 -53
  86. package/src/lib/resources/templates/web-app/template/.aiwf/config.json +0 -54
  87. package/src/lib/resources/templates/web-app/template/.aiwf/feature-ledger.json +0 -37
  88. package/src/lib/resources/templates/web-app/template/.aiwf/personas/fullstack-developer.json +0 -40
  89. package/src/lib/resources/templates/web-app/template/.aiwf/scripts/cli.js +0 -110
  90. package/src/lib/resources/templates/web-app/template/.eslintrc.cjs +0 -20
  91. package/src/lib/resources/templates/web-app/template/README.md +0 -151
  92. package/src/lib/resources/templates/web-app/template/index.html +0 -14
  93. package/src/lib/resources/templates/web-app/template/package.json +0 -44
  94. package/src/lib/resources/templates/web-app/template/postcss.config.js +0 -6
  95. package/src/lib/resources/templates/web-app/template/public/vite.svg +0 -1
  96. package/src/lib/resources/templates/web-app/template/src/App.tsx +0 -21
  97. package/src/lib/resources/templates/web-app/template/src/components/Layout.tsx +0 -57
  98. package/src/lib/resources/templates/web-app/template/src/components/aiwf/ContextStatus.tsx +0 -107
  99. package/src/lib/resources/templates/web-app/template/src/components/aiwf/TokenUsage.tsx +0 -71
  100. package/src/lib/resources/templates/web-app/template/src/index.css +0 -60
  101. package/src/lib/resources/templates/web-app/template/src/main.tsx +0 -10
  102. package/src/lib/resources/templates/web-app/template/src/pages/AiwfDashboard.tsx +0 -57
  103. package/src/lib/resources/templates/web-app/template/src/pages/HomePage.tsx +0 -89
  104. package/src/lib/resources/templates/web-app/template/src/pages/NotFound.tsx +0 -25
  105. package/src/lib/resources/templates/web-app/template/src/stores/aiwfStore.ts +0 -126
  106. package/src/lib/resources/templates/web-app/template/src/types/global.d.ts +0 -9
  107. package/src/lib/resources/templates/web-app/template/src/vite-env.d.ts +0 -1
  108. package/src/lib/resources/templates/web-app/template/tailwind.config.js +0 -30
  109. package/src/lib/resources/templates/web-app/template/tsconfig.json +0 -37
  110. package/src/lib/resources/templates/web-app/template/tsconfig.node.json +0 -10
  111. package/src/lib/resources/templates/web-app/template/vite.config.ts +0 -23
  112. package/src/lib/resources/utils/background-monitor.js +0 -223
  113. package/src/lib/resources/utils/compression-metrics.js +0 -1031
  114. package/src/lib/resources/utils/compression-strategies.js +0 -557
  115. package/src/lib/resources/utils/content-normalizer.js +0 -455
  116. package/src/lib/resources/utils/context-compressor.js +0 -583
  117. package/src/lib/resources/utils/context-rule-parser.js +0 -180
  118. package/src/lib/resources/utils/context-token-monitor.js +0 -463
  119. package/src/lib/resources/utils/context-update-manager.js +0 -502
  120. package/src/lib/resources/utils/git-utils.js +0 -220
  121. package/src/lib/resources/utils/importance-classifier.js +0 -645
  122. package/src/lib/resources/utils/information-filter.js +0 -710
  123. package/src/lib/resources/utils/persona-aware-compressor.js +0 -598
  124. package/src/lib/resources/utils/prompt-injector.js +0 -242
  125. package/src/lib/resources/utils/simplified-evaluator.js +0 -119
  126. package/src/lib/resources/utils/text-summarizer.js +0 -492
  127. package/src/lib/resources/utils/token-counter.js +0 -177
  128. package/src/lib/resources/utils/token-monitor.js +0 -484
  129. package/src/lib/resources/utils/token-reporter.js +0 -452
  130. package/src/lib/resources/utils/token-storage.js +0 -433
  131. package/src/lib/resources/utils/token-tracker.js +0 -283
  132. package/src/lib/state/priority-calculator.js +0 -217
  133. package/src/lib/state/state-index.js +0 -155
  134. package/src/lib/state/task-scanner.js +0 -328
  135. package/src/lib/task-analyzer.js +0 -599
  136. package/src/lib/template-cache-system.js +0 -559
  137. package/src/lib/template-downloader.js +0 -467
  138. package/src/lib/template-version-manager.js +0 -491
  139. package/src/lib/token-optimizer.js +0 -517
  140. package/src/utils/engineering-guard.js +0 -399
@@ -1,583 +0,0 @@
1
- import { AggressiveCompressionStrategy, BalancedCompressionStrategy, MinimalCompressionStrategy } from './compression-strategies.js';
2
- import { TextSummarizer } from './text-summarizer.js';
3
- import { ContentNormalizer } from './content-normalizer.js';
4
- import { ImportanceClassifier } from './importance-classifier.js';
5
- import { InformationFilter } from './information-filter.js';
6
- import { TokenCounter } from './token-counter.js';
7
- import { TokenTracker } from './token-tracker.js';
8
-
9
- /**
10
- * 통합 Context 압축 시스템
11
- */
12
- export class ContextCompressor {
13
- constructor(mode = 'balanced') {
14
- this.mode = mode;
15
- this.tokenCounter = new TokenCounter();
16
- this.tokenTracker = new TokenTracker();
17
- this.initializeStrategies();
18
- this.initializeComponents();
19
- }
20
-
21
- /**
22
- * 압축 전략을 초기화합니다
23
- */
24
- initializeStrategies() {
25
- this.strategies = {
26
- aggressive: new AggressiveCompressionStrategy(),
27
- balanced: new BalancedCompressionStrategy(),
28
- minimal: new MinimalCompressionStrategy()
29
- };
30
- }
31
-
32
- /**
33
- * 컴포넌트를 초기화합니다
34
- */
35
- initializeComponents() {
36
- this.summarizer = new TextSummarizer();
37
- this.normalizer = new ContentNormalizer();
38
- this.classifier = new ImportanceClassifier();
39
- this.filter = new InformationFilter();
40
- }
41
-
42
- /**
43
- * 콘텐츠를 압축합니다
44
- * @param {string} content - 압축할 콘텐츠
45
- * @param {Object} options - 압축 옵션
46
- * @returns {Object} 압축 결과
47
- */
48
- async compress(content, options = {}) {
49
- const startTime = Date.now();
50
-
51
- const {
52
- strategy = this.mode,
53
- targetRatio = null,
54
- maxTokens = null,
55
- preserveStructure = true,
56
- enableSummarization = true,
57
- enableNormalization = true,
58
- enableFiltering = true,
59
- customFilters = {},
60
- generateMetadata = true
61
- } = options;
62
-
63
- try {
64
- // 원본 토큰 수 계산
65
- const originalTokens = this.tokenCounter.countTokens(content);
66
-
67
- // 압축 파이프라인 실행
68
- const pipeline = this.createCompressionPipeline(strategy, options);
69
- const result = await this.executePipeline(pipeline, content);
70
-
71
- // 압축 결과 구성
72
- const compressedTokens = this.tokenCounter.countTokens(result.content);
73
- const compressionRatio = ((originalTokens - compressedTokens) / originalTokens) * 100;
74
-
75
- // 토큰 추적
76
- this.tokenTracker.trackCompression(originalTokens, compressedTokens);
77
-
78
- const compressionResult = {
79
- original: content,
80
- compressed: result.content,
81
- originalTokens,
82
- compressedTokens,
83
- compressionRatio,
84
- tokensReduced: originalTokens - compressedTokens,
85
- strategy,
86
- processingTime: Date.now() - startTime,
87
- success: true
88
- };
89
-
90
- if (generateMetadata) {
91
- compressionResult.metadata = {
92
- ...result.metadata,
93
- compressionId: this.generateCompressionId(),
94
- timestamp: new Date().toISOString(),
95
- pipelineStages: result.stages,
96
- tokenTracker: this.tokenTracker.generateReport()
97
- };
98
- }
99
-
100
- return compressionResult;
101
-
102
- } catch (error) {
103
- console.error('압축 중 오류 발생:', error);
104
- return {
105
- original: content,
106
- compressed: content,
107
- originalTokens: this.tokenCounter.countTokens(content),
108
- compressedTokens: this.tokenCounter.countTokens(content),
109
- compressionRatio: 0,
110
- tokensReduced: 0,
111
- strategy,
112
- processingTime: Date.now() - startTime,
113
- success: false,
114
- error: error.message
115
- };
116
- }
117
- }
118
-
119
- /**
120
- * 압축 파이프라인을 생성합니다
121
- * @param {string} strategy - 압축 전략
122
- * @param {Object} options - 옵션
123
- * @returns {Array<Object>} 파이프라인 스테이지
124
- */
125
- createCompressionPipeline(strategy, options) {
126
- const pipeline = [];
127
-
128
- // 1. 토큰 분석 스테이지
129
- pipeline.push({
130
- name: 'TokenAnalysis',
131
- processor: this.tokenAnalysisStage.bind(this),
132
- options: {}
133
- });
134
-
135
- // 2. 중요도 분석 스테이지
136
- pipeline.push({
137
- name: 'ImportanceAnalysis',
138
- processor: this.importanceAnalysisStage.bind(this),
139
- options: {}
140
- });
141
-
142
- // 3. 정규화 스테이지 (옵션)
143
- if (options.enableNormalization) {
144
- pipeline.push({
145
- name: 'Normalization',
146
- processor: this.normalizationStage.bind(this),
147
- options: {}
148
- });
149
- }
150
-
151
- // 4. 필터링 스테이지 (옵션)
152
- if (options.enableFiltering) {
153
- pipeline.push({
154
- name: 'Filtering',
155
- processor: this.filteringStage.bind(this),
156
- options: {
157
- customFilters: options.customFilters || {},
158
- maxTokens: options.maxTokens
159
- }
160
- });
161
- }
162
-
163
- // 5. 요약 스테이지 (옵션)
164
- if (options.enableSummarization) {
165
- pipeline.push({
166
- name: 'Summarization',
167
- processor: this.summarizationStage.bind(this),
168
- options: {
169
- targetRatio: options.targetRatio || 0.7
170
- }
171
- });
172
- }
173
-
174
- // 6. 전략 압축 스테이지
175
- pipeline.push({
176
- name: 'StrategyCompression',
177
- processor: this.strategyCompressionStage.bind(this),
178
- options: {
179
- strategy,
180
- preserveStructure: options.preserveStructure
181
- }
182
- });
183
-
184
- // 7. 검증 스테이지
185
- pipeline.push({
186
- name: 'Validation',
187
- processor: this.validationStage.bind(this),
188
- options: {}
189
- });
190
-
191
- return pipeline;
192
- }
193
-
194
- /**
195
- * 파이프라인을 실행합니다
196
- * @param {Array<Object>} pipeline - 파이프라인 스테이지
197
- * @param {string} content - 처리할 콘텐츠
198
- * @returns {Object} 파이프라인 결과
199
- */
200
- async executePipeline(pipeline, content) {
201
- let result = { content, metadata: {}, stages: [] };
202
-
203
- for (const stage of pipeline) {
204
- const stageStartTime = Date.now();
205
-
206
- try {
207
- const stageResult = await stage.processor(result, stage.options);
208
- result = {
209
- ...result,
210
- ...stageResult,
211
- stages: [...result.stages, {
212
- name: stage.name,
213
- duration: Date.now() - stageStartTime,
214
- success: true,
215
- tokensAfter: this.tokenCounter.countTokens(stageResult.content)
216
- }]
217
- };
218
- } catch (error) {
219
- console.error(`파이프라인 스테이지 ${stage.name}에서 오류 발생:`, error);
220
- result.stages.push({
221
- name: stage.name,
222
- duration: Date.now() - stageStartTime,
223
- success: false,
224
- error: error.message
225
- });
226
- }
227
- }
228
-
229
- return result;
230
- }
231
-
232
- /**
233
- * 토큰 분석 스테이지
234
- * @param {Object} input - 입력 데이터
235
- * @param {Object} options - 옵션
236
- * @returns {Object} 스테이지 결과
237
- */
238
- async tokenAnalysisStage(input, options) {
239
- const tokenAnalysis = this.tokenCounter.analyzeTokenDistribution(input.content);
240
-
241
- return {
242
- content: input.content,
243
- metadata: {
244
- ...input.metadata,
245
- tokenAnalysis,
246
- originalTokens: this.tokenCounter.countTokens(input.content)
247
- }
248
- };
249
- }
250
-
251
- /**
252
- * 중요도 분석 스테이지
253
- * @param {Object} input - 입력 데이터
254
- * @param {Object} options - 옵션
255
- * @returns {Object} 스테이지 결과
256
- */
257
- async importanceAnalysisStage(input, options) {
258
- const importanceResult = this.classifier.analyzeImportance(input.content);
259
-
260
- return {
261
- content: input.content,
262
- metadata: {
263
- ...input.metadata,
264
- importanceAnalysis: importanceResult
265
- }
266
- };
267
- }
268
-
269
- /**
270
- * 정규화 스테이지
271
- * @param {Object} input - 입력 데이터
272
- * @param {Object} options - 옵션
273
- * @returns {Object} 스테이지 결과
274
- */
275
- async normalizationStage(input, options) {
276
- const normalizeResult = this.normalizer.normalize(input.content);
277
-
278
- return {
279
- content: normalizeResult.normalized,
280
- metadata: {
281
- ...input.metadata,
282
- normalization: normalizeResult.metadata
283
- }
284
- };
285
- }
286
-
287
- /**
288
- * 필터링 스테이지
289
- * @param {Object} input - 입력 데이터
290
- * @param {Object} options - 옵션
291
- * @returns {Object} 스테이지 결과
292
- */
293
- async filteringStage(input, options) {
294
- const filterResult = this.filter.filter(input.content, {
295
- customRules: options.customFilters,
296
- maxTokens: options.maxTokens
297
- });
298
-
299
- return {
300
- content: filterResult.filtered,
301
- metadata: {
302
- ...input.metadata,
303
- filtering: filterResult.metadata
304
- }
305
- };
306
- }
307
-
308
- /**
309
- * 요약 스테이지
310
- * @param {Object} input - 입력 데이터
311
- * @param {Object} options - 옵션
312
- * @returns {Object} 스테이지 결과
313
- */
314
- async summarizationStage(input, options) {
315
- const summarizeResult = this.summarizer.summarize(input.content, {
316
- targetRatio: options.targetRatio
317
- });
318
-
319
- return {
320
- content: summarizeResult.summary,
321
- metadata: {
322
- ...input.metadata,
323
- summarization: summarizeResult.metadata
324
- }
325
- };
326
- }
327
-
328
- /**
329
- * 전략 압축 스테이지
330
- * @param {Object} input - 입력 데이터
331
- * @param {Object} options - 옵션
332
- * @returns {Object} 스테이지 결과
333
- */
334
- async strategyCompressionStage(input, options) {
335
- const strategy = this.strategies[options.strategy];
336
- if (!strategy) {
337
- throw new Error(`압축 전략을 찾을 수 없습니다: ${options.strategy}`);
338
- }
339
-
340
- const compressionResult = strategy.compress(input.content, {
341
- preserveStructure: options.preserveStructure
342
- });
343
-
344
- return {
345
- content: compressionResult.content,
346
- metadata: {
347
- ...input.metadata,
348
- strategyCompression: compressionResult.metadata
349
- }
350
- };
351
- }
352
-
353
- /**
354
- * 검증 스테이지
355
- * @param {Object} input - 입력 데이터
356
- * @param {Object} options - 옵션
357
- * @returns {Object} 스테이지 결과
358
- */
359
- async validationStage(input, options) {
360
- const validationResult = this.validateCompression(input.content, input.metadata);
361
-
362
- return {
363
- content: input.content,
364
- metadata: {
365
- ...input.metadata,
366
- validation: validationResult
367
- }
368
- };
369
- }
370
-
371
- /**
372
- * 압축 결과를 검증합니다
373
- * @param {string} content - 압축된 콘텐츠
374
- * @param {Object} metadata - 메타데이터
375
- * @returns {Object} 검증 결과
376
- */
377
- validateCompression(content, metadata) {
378
- const validation = {
379
- isValid: true,
380
- warnings: [],
381
- errors: [],
382
- qualityScore: 0
383
- };
384
-
385
- // 1. 콘텐츠 유효성 검증
386
- if (!content || content.trim().length === 0) {
387
- validation.isValid = false;
388
- validation.errors.push('압축된 콘텐츠가 비어있습니다.');
389
- }
390
-
391
- // 2. 압축률 검증
392
- if (metadata.originalTokens && metadata.originalTokens > 0) {
393
- const currentTokens = this.tokenCounter.countTokens(content);
394
- const compressionRatio = ((metadata.originalTokens - currentTokens) / metadata.originalTokens) * 100;
395
-
396
- if (compressionRatio < 5) {
397
- validation.warnings.push('압축률이 낮습니다 (5% 미만).');
398
- } else if (compressionRatio > 90) {
399
- validation.warnings.push('압축률이 너무 높습니다 (90% 초과). 중요한 정보가 손실될 수 있습니다.');
400
- }
401
-
402
- // 품질 점수 계산
403
- validation.qualityScore = this.calculateQualityScore(compressionRatio, metadata);
404
- }
405
-
406
- // 3. 구조 유지 검증
407
- if (metadata.importanceAnalysis) {
408
- const criticalSections = metadata.importanceAnalysis.sections.filter(s => s.importance === 'critical');
409
- const preservedCritical = criticalSections.filter(s =>
410
- content.includes(s.name) || content.includes(s.content.substring(0, 50))
411
- );
412
-
413
- if (preservedCritical.length < criticalSections.length) {
414
- validation.warnings.push('일부 중요한 섹션이 압축 과정에서 손실되었을 수 있습니다.');
415
- }
416
- }
417
-
418
- return validation;
419
- }
420
-
421
- /**
422
- * 품질 점수를 계산합니다
423
- * @param {number} compressionRatio - 압축률
424
- * @param {Object} metadata - 메타데이터
425
- * @returns {number} 품질 점수 (0-100)
426
- */
427
- calculateQualityScore(compressionRatio, metadata) {
428
- let score = 0;
429
-
430
- // 압축률 점수 (40점 만점)
431
- if (compressionRatio >= 20 && compressionRatio <= 70) {
432
- score += 40;
433
- } else if (compressionRatio >= 10 && compressionRatio <= 80) {
434
- score += 30;
435
- } else if (compressionRatio >= 5 && compressionRatio <= 90) {
436
- score += 20;
437
- } else {
438
- score += 10;
439
- }
440
-
441
- // 정보 보존 점수 (30점 만점)
442
- if (metadata.importanceAnalysis) {
443
- const preservedImportant = metadata.importanceAnalysis.sections.filter(s =>
444
- s.importance === 'critical' || s.importance === 'high'
445
- ).length;
446
- const totalImportant = metadata.importanceAnalysis.sections.filter(s =>
447
- s.importance === 'critical' || s.importance === 'high'
448
- ).length;
449
-
450
- if (totalImportant > 0) {
451
- score += (preservedImportant / totalImportant) * 30;
452
- } else {
453
- score += 30;
454
- }
455
- } else {
456
- score += 20; // 기본 점수
457
- }
458
-
459
- // 구조 유지 점수 (20점 만점)
460
- if (metadata.strategyCompression) {
461
- score += metadata.strategyCompression.preservedSections ? 20 : 10;
462
- } else {
463
- score += 15; // 기본 점수
464
- }
465
-
466
- // 성능 점수 (10점 만점)
467
- score += 10; // 기본 점수 (실제로는 처리 시간 등을 고려)
468
-
469
- return Math.min(100, Math.max(0, score));
470
- }
471
-
472
- /**
473
- * 압축된 콘텐츠를 복원합니다
474
- * @param {string} compressedContent - 압축된 콘텐츠
475
- * @param {Object} metadata - 복원 메타데이터
476
- * @returns {Object} 복원 결과
477
- */
478
- async decompress(compressedContent, metadata) {
479
- const startTime = Date.now();
480
-
481
- try {
482
- // 메타데이터에서 압축 정보 추출
483
- const compressionStrategy = metadata.strategyCompression?.strategy || 'balanced';
484
- const strategy = this.strategies[compressionStrategy];
485
-
486
- if (!strategy) {
487
- throw new Error(`복원 전략을 찾을 수 없습니다: ${compressionStrategy}`);
488
- }
489
-
490
- // 전략별 복원 수행
491
- const decompressed = strategy.decompress(compressedContent, metadata);
492
-
493
- const result = {
494
- compressed: compressedContent,
495
- decompressed,
496
- strategy: compressionStrategy,
497
- processingTime: Date.now() - startTime,
498
- success: true,
499
- metadata: {
500
- decompressionId: this.generateCompressionId(),
501
- timestamp: new Date().toISOString(),
502
- originalMetadata: metadata
503
- }
504
- };
505
-
506
- return result;
507
-
508
- } catch (error) {
509
- console.error('복원 중 오류 발생:', error);
510
- return {
511
- compressed: compressedContent,
512
- decompressed: compressedContent, // 복원 실패 시 압축된 콘텐츠 반환
513
- strategy: 'fallback',
514
- processingTime: Date.now() - startTime,
515
- success: false,
516
- error: error.message
517
- };
518
- }
519
- }
520
-
521
- /**
522
- * 압축 ID를 생성합니다
523
- * @returns {string} 압축 ID
524
- */
525
- generateCompressionId() {
526
- const timestamp = Date.now();
527
- const random = Math.random().toString(36).substr(2, 9);
528
- return `comp_${timestamp}_${random}`;
529
- }
530
-
531
- /**
532
- * 압축 통계를 반환합니다
533
- * @returns {Object} 압축 통계
534
- */
535
- getStatistics() {
536
- return {
537
- tokenTracker: this.tokenTracker.getSessionStats(),
538
- filter: this.filter.getStatistics(),
539
- supportedStrategies: Object.keys(this.strategies),
540
- currentMode: this.mode
541
- };
542
- }
543
-
544
- /**
545
- * 모드를 변경합니다
546
- * @param {string} mode - 새로운 모드
547
- */
548
- setMode(mode) {
549
- if (this.strategies[mode]) {
550
- this.mode = mode;
551
- } else {
552
- throw new Error(`지원되지 않는 압축 모드: ${mode}`);
553
- }
554
- }
555
-
556
- /**
557
- * 사용자 정의 전략을 추가합니다
558
- * @param {string} name - 전략 이름
559
- * @param {Object} strategy - 전략 객체
560
- */
561
- addStrategy(name, strategy) {
562
- this.strategies[name] = strategy;
563
- }
564
-
565
- /**
566
- * 리소스를 정리합니다
567
- */
568
- cleanup() {
569
- if (this.tokenCounter) this.tokenCounter.cleanup();
570
- if (this.tokenTracker) this.tokenTracker.cleanup();
571
- if (this.summarizer) this.summarizer.cleanup();
572
- if (this.normalizer) this.normalizer.cleanup();
573
- if (this.classifier) this.classifier.cleanup();
574
- if (this.filter) this.filter.cleanup();
575
-
576
- // 전략들 정리
577
- Object.values(this.strategies).forEach(strategy => {
578
- if (strategy.cleanup) strategy.cleanup();
579
- });
580
- }
581
- }
582
-
583
- export default ContextCompressor;