kakaotalk-chat-analyzer 0.18.3 → 0.18.7

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 (50) hide show
  1. package/dist/src/analysis-capability.d.ts +4 -0
  2. package/dist/src/analysis-capability.js +11 -4
  3. package/dist/src/analysis-capability.js.map +1 -1
  4. package/dist/src/analysis-effective-config.d.ts +67 -0
  5. package/dist/src/analysis-effective-config.js +311 -0
  6. package/dist/src/analysis-effective-config.js.map +1 -0
  7. package/dist/src/analysis-preset.d.ts +1 -1
  8. package/dist/src/analysis-preset.js +15 -5
  9. package/dist/src/analysis-preset.js.map +1 -1
  10. package/dist/src/analysis-profile.d.ts +2 -2
  11. package/dist/src/analysis-profile.js +4 -4
  12. package/dist/src/analysis-profile.js.map +1 -1
  13. package/dist/src/analysis.js +7 -7
  14. package/dist/src/analysis.js.map +1 -1
  15. package/dist/src/cli.js +55 -62
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/keyword-seed-topics.js +46 -9
  18. package/dist/src/keyword-seed-topics.js.map +1 -1
  19. package/dist/src/kiwi-worker-config.js +4 -3
  20. package/dist/src/kiwi-worker-config.js.map +1 -1
  21. package/dist/src/llm-policy.d.ts +1 -1
  22. package/dist/src/llm-policy.js +5 -3
  23. package/dist/src/llm-policy.js.map +1 -1
  24. package/dist/src/memory-probe.d.ts +18 -0
  25. package/dist/src/memory-probe.js +115 -0
  26. package/dist/src/memory-probe.js.map +1 -0
  27. package/dist/src/ml-batch-size.js +7 -4
  28. package/dist/src/ml-batch-size.js.map +1 -1
  29. package/dist/src/report-charts.d.ts +1 -1
  30. package/dist/src/report-charts.js +72 -46
  31. package/dist/src/report-charts.js.map +1 -1
  32. package/dist/src/report-provenance.d.ts +11 -0
  33. package/dist/src/report-provenance.js +49 -8
  34. package/dist/src/report-provenance.js.map +1 -1
  35. package/dist/src/report-styles.d.ts +1 -1
  36. package/dist/src/report-styles.js +105 -34
  37. package/dist/src/report-styles.js.map +1 -1
  38. package/dist/src/report.js +27 -5
  39. package/dist/src/report.js.map +1 -1
  40. package/dist/src/topic-map.js +5 -1
  41. package/dist/src/topic-map.js.map +1 -1
  42. package/dist/src/topic-merge.js +102 -55
  43. package/dist/src/topic-merge.js.map +1 -1
  44. package/dist/src/topic-normalize.d.ts +8 -0
  45. package/dist/src/topic-normalize.js +110 -0
  46. package/dist/src/topic-normalize.js.map +1 -0
  47. package/dist/src/types.d.ts +10 -0
  48. package/dist/src/version.d.ts +2 -2
  49. package/dist/src/version.js +1 -1
  50. package/package.json +1 -1
@@ -1,12 +1,16 @@
1
1
  export type GpuKind = "none" | "cuda" | "dml" | "metal" | "webgpu";
2
2
  export interface MachineProfile {
3
3
  totalMemGb: number;
4
+ /** os.freemem() — 즉시 해제 가능( macOS에서 과소 ) */
4
5
  freeMemGb: number;
6
+ /** OS별 가용 추정 — preset·배치·LLM 판단 */
7
+ availableMemGb: number;
5
8
  cpuCores: number;
6
9
  platform: NodeJS.Platform;
7
10
  arch: string;
8
11
  gpu: GpuKind;
9
12
  }
13
+ export declare function memoryHeadroomGb(profile: MachineProfile): number;
10
14
  export declare function probeMachineProfileSync(): MachineProfile;
11
15
  export declare function probeMachineProfile(): Promise<MachineProfile>;
12
16
  /** preset·코퍼스·RAM 기준 분석 예산(ms) — 5분 SLA 휴리스틱 */
@@ -1,11 +1,17 @@
1
- import { freemem, totalmem, cpus, platform, arch } from "node:os";
1
+ import { totalmem, cpus, platform, arch } from "node:os";
2
+ import { formatMemoryLine, probeAvailableMemoryBytes, probeFreeMemoryBytes, } from "./memory-probe.js";
2
3
  import { probeOnnxGpu } from "./ml-runtime.js";
4
+ export function memoryHeadroomGb(profile) {
5
+ return profile.availableMemGb ?? profile.freeMemGb;
6
+ }
3
7
  export function probeMachineProfileSync() {
4
8
  const totalMemGb = totalmem() / 1024 ** 3;
5
- const freeMemGb = freemem() / 1024 ** 3;
9
+ const freeMemGb = probeFreeMemoryBytes() / 1024 ** 3;
10
+ const availableMemGb = probeAvailableMemoryBytes() / 1024 ** 3;
6
11
  return {
7
12
  totalMemGb: Math.round(totalMemGb * 10) / 10,
8
13
  freeMemGb: Math.round(freeMemGb * 10) / 10,
14
+ availableMemGb: Math.round(availableMemGb * 10) / 10,
9
15
  cpuCores: cpus().length,
10
16
  platform: platform(),
11
17
  arch: arch(),
@@ -27,13 +33,14 @@ export function analysisBudgetMs(preset, messageCount, profile) {
27
33
  export function estimateAnalysisSeconds(preset, messageCount, profile) {
28
34
  const n = Math.max(messageCount, 1);
29
35
  const base = n / 900;
30
- const memFactor = profile.freeMemGb < 6 ? 1.4 : profile.freeMemGb < 12 ? 1.1 : 1;
36
+ const headroom = memoryHeadroomGb(profile);
37
+ const memFactor = headroom < 6 ? 1.4 : headroom < 12 ? 1.1 : 1;
31
38
  const presetFactor = preset === "speed" ? 0.55 : preset === "balanced" ? 1 : preset === "quality" ? 1.45 : 1.1;
32
39
  return Math.max(1, Math.round(base * memFactor * presetFactor));
33
40
  }
34
41
  export function formatCapabilitiesReport(profile, opts) {
35
42
  const lines = [
36
- `RAM: ${profile.freeMemGb} GiB free / ${profile.totalMemGb} GiB total`,
43
+ formatMemoryLine(profile),
37
44
  `CPU: ${profile.cpuCores} cores · ${profile.platform}/${profile.arch}`,
38
45
  `GPU (ONNX): ${profile.gpu}`,
39
46
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-capability.js","sourceRoot":"","sources":["../../src/analysis-capability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analysis-capability.js","sourceRoot":"","sources":["../../src/analysis-capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { type MachineProfile } from "./analysis-capability.js";
2
+ import { type AnalysisPresetName } from "./analysis-preset.js";
3
+ import { type LlmTier } from "./llm-policy.js";
4
+ import type { BuildReportProvenanceOptions } from "./report-provenance.js";
5
+ import type { PrivacyMode, ReportData } from "./types.js";
6
+ export type PresetSource = "cli" | "env" | "auto-ram" | "auto-corpus" | "legacy-fast";
7
+ export interface PhaseEffectiveState {
8
+ requested: boolean | "auto";
9
+ used: boolean;
10
+ model?: string;
11
+ sampleCap?: number;
12
+ skippedReason?: string;
13
+ }
14
+ export interface AnalysisEffectiveConfig {
15
+ preset: AnalysisPresetName;
16
+ presetSource: PresetSource;
17
+ profile: "quality" | "fast";
18
+ privacy: PrivacyMode;
19
+ top: number;
20
+ since?: string;
21
+ workerRequested: boolean | "auto";
22
+ workerUsed: boolean;
23
+ semantic: PhaseEffectiveState;
24
+ sentiment: PhaseEffectiveState;
25
+ llm: {
26
+ tier: LlmTier;
27
+ used: boolean;
28
+ modelId?: string;
29
+ skippedReason?: string;
30
+ };
31
+ topicModel: "graph" | "embedding" | "hybrid";
32
+ embeddingTopics: boolean;
33
+ budgetMs: number;
34
+ envOverrides: string[];
35
+ invokedVia?: {
36
+ name: "kcachat";
37
+ version: string;
38
+ };
39
+ messageCount: number;
40
+ machine: Pick<MachineProfile, "freeMemGb" | "availableMemGb" | "totalMemGb" | "gpu">;
41
+ }
42
+ export interface CliPipelineOptions {
43
+ privacy: PrivacyMode;
44
+ top: number;
45
+ since?: string;
46
+ preset?: AnalysisPresetName;
47
+ worker?: boolean;
48
+ semanticKeywords?: boolean;
49
+ sentiment?: boolean;
50
+ }
51
+ export declare function resolvePresetSource(cliPreset: AnalysisPresetName | undefined, worker: boolean | undefined, messageCount: number, machine: MachineProfile): PresetSource;
52
+ /** 집계 완료 후 실제 적용 설정 */
53
+ export declare function buildAnalysisEffectiveConfig(data: ReportData, cli: CliPipelineOptions, machine?: MachineProfile): AnalysisEffectiveConfig;
54
+ export declare function withWorkerUsed(config: AnalysisEffectiveConfig, workerUsed: boolean): AnalysisEffectiveConfig;
55
+ /** 집계 전 예상 preset (stderr 힌트) */
56
+ export declare function estimatePresetBeforeParse(cli: Pick<CliPipelineOptions, "preset" | "worker">, messageEstimate?: number): {
57
+ preset: AnalysisPresetName;
58
+ source: PresetSource;
59
+ };
60
+ export declare function formatEstimatedPresetHint(cli: Pick<CliPipelineOptions, "preset" | "worker">, messageEstimate?: number): string;
61
+ export declare function formatConfigSummaryKo(config: AnalysisEffectiveConfig): string;
62
+ export declare function configToJson(config: AnalysisEffectiveConfig): string;
63
+ export declare function toProvenanceOptions(config: AnalysisEffectiveConfig, data: ReportData, extras: {
64
+ kiwiAvailable: boolean;
65
+ buildTiming?: BuildReportProvenanceOptions["buildTiming"];
66
+ htmlBytes?: number;
67
+ }): BuildReportProvenanceOptions;
@@ -0,0 +1,311 @@
1
+ import { analysisBudgetMs, memoryHeadroomGb, probeMachineProfileSync, } from "./analysis-capability.js";
2
+ import { formatMemoryLine } from "./memory-probe.js";
3
+ import { autoPresetFromMachine, presetForcesSemanticOff, presetForcesSentimentOff, resolvePresetName, resolvePresetNameWithAuto, } from "./analysis-preset.js";
4
+ import { getAnalysisProfileSettings } from "./analysis-profile.js";
5
+ import { resolveLlmTier, qwenModelIdForTier } from "./llm-policy.js";
6
+ import { parseKcaInvokerEnv } from "./report-provenance.js";
7
+ import { resolveTopicModel } from "./report-provenance.js";
8
+ import { effectiveSemanticSampleCap, semanticEmbeddingModelId, } from "./semantic-policy.js";
9
+ import { sentimentModelId } from "./sentiment-policy.js";
10
+ function collectEnvOverrides() {
11
+ const keys = [
12
+ "KCA_PRESET",
13
+ "KCA_PROFILE",
14
+ "KCA_NO_SEMANTIC",
15
+ "KCA_SEMANTIC",
16
+ "KCA_SEMANTIC_DEFAULT",
17
+ "KCA_SEMANTIC_MODEL",
18
+ "KCA_NO_SENTIMENT",
19
+ "KCA_SENTIMENT",
20
+ "KCA_SENTIMENT_DEFAULT",
21
+ "KCA_SENTIMENT_MODEL",
22
+ "KCA_LLM",
23
+ "KCA_LLM_MODEL",
24
+ "KCA_LLM_MOCK",
25
+ "KCA_LLM_BACKEND",
26
+ "KCA_EMBEDDING_TOPICS",
27
+ "KCA_INVOKER",
28
+ "KCA_MEMORY_PROBE",
29
+ ];
30
+ const out = [];
31
+ for (const key of keys) {
32
+ const v = process.env[key];
33
+ if (v !== undefined && v !== "")
34
+ out.push(`${key}=${v}`);
35
+ }
36
+ return out;
37
+ }
38
+ export function resolvePresetSource(cliPreset, worker, messageCount, machine) {
39
+ if (cliPreset)
40
+ return "cli";
41
+ const env = process.env.KCA_PRESET?.trim().toLowerCase();
42
+ if (env === "speed" || env === "balanced" || env === "quality" || env === "custom")
43
+ return "env";
44
+ if (worker === true || process.env.KCA_PROFILE === "fast")
45
+ return "legacy-fast";
46
+ const auto = autoPresetFromMachine(machine, messageCount);
47
+ const ramOnly = autoPresetFromMachine(machine, 0);
48
+ if (auto !== ramOnly)
49
+ return "auto-corpus";
50
+ return "auto-ram";
51
+ }
52
+ function presetSourceLabel(source) {
53
+ const labels = {
54
+ cli: "CLI --preset",
55
+ env: "환경 변수 KCA_PRESET",
56
+ "auto-ram": "RAM 기준 자동",
57
+ "auto-corpus": "RAM·메시지 수 기준 자동",
58
+ "legacy-fast": "CLI --fast / KCA_PROFILE=fast",
59
+ };
60
+ return labels[source];
61
+ }
62
+ function resolveWorkerRequested(worker) {
63
+ if (worker === false)
64
+ return false;
65
+ if (worker === true)
66
+ return true;
67
+ return "auto";
68
+ }
69
+ function resolveSemanticRequested(semanticKeywords) {
70
+ if (semanticKeywords === false)
71
+ return false;
72
+ if (semanticKeywords === true)
73
+ return true;
74
+ return "auto";
75
+ }
76
+ function resolveSentimentRequested(sentiment) {
77
+ if (sentiment === false)
78
+ return false;
79
+ if (sentiment === true)
80
+ return true;
81
+ return "auto";
82
+ }
83
+ function inferSemanticSkipReason(options, preset, used) {
84
+ if (used)
85
+ return undefined;
86
+ if (process.env.KCA_NO_SEMANTIC === "1")
87
+ return "KCA_NO_SEMANTIC=1";
88
+ if (options?.semanticKeywords === false)
89
+ return "CLI --no-semantic-keywords";
90
+ if (presetForcesSemanticOff(options))
91
+ return `${preset} preset`;
92
+ if (process.env.KCA_SEMANTIC === "0")
93
+ return "KCA_SEMANTIC=0";
94
+ if (process.env.KCA_SEMANTIC_DEFAULT === "opt-in")
95
+ return "KCA_SEMANTIC_DEFAULT=opt-in";
96
+ if (options?.semanticKeywords !== true && process.env.KCA_SEMANTIC !== "1") {
97
+ return "auto: 한국어 비중·샘플 조건 미충족 또는 실행 중 오류";
98
+ }
99
+ return "실행 중 오류 또는 샘플 부족";
100
+ }
101
+ function inferSentimentSkipReason(options, preset, used) {
102
+ if (used)
103
+ return undefined;
104
+ if (process.env.KCA_NO_SENTIMENT === "1")
105
+ return "KCA_NO_SENTIMENT=1";
106
+ if (options?.sentiment === false)
107
+ return "CLI --no-sentiment";
108
+ if (presetForcesSentimentOff(options))
109
+ return `${preset} preset`;
110
+ if (process.env.KCA_SENTIMENT === "0")
111
+ return "KCA_SENTIMENT=0";
112
+ if (process.env.KCA_SENTIMENT_DEFAULT === "opt-in")
113
+ return "KCA_SENTIMENT_DEFAULT=opt-in";
114
+ if (options?.sentiment !== true && process.env.KCA_SENTIMENT !== "1") {
115
+ return "auto: 한국어 비중·샘플 조건 미충족 또는 실행 중 오류";
116
+ }
117
+ return "실행 중 오류 또는 샘플 부족";
118
+ }
119
+ function inferLlmSkipReason(preset, tier, used, profile) {
120
+ if (used)
121
+ return undefined;
122
+ if (process.env.KCA_LLM === "0")
123
+ return "KCA_LLM=0";
124
+ if (tier !== "off") {
125
+ return "GGUF 없음·예산 부족·추론 실패 또는 JSON 파싱 실패";
126
+ }
127
+ if (preset === "speed" || preset === "balanced") {
128
+ return `${preset} preset (KCA_LLM=1 없음)`;
129
+ }
130
+ if (preset === "custom" && process.env.KCA_LLM !== "1")
131
+ return "custom preset (KCA_LLM=1 필요)";
132
+ const headroom = memoryHeadroomGb(profile);
133
+ if (headroom < 8)
134
+ return `가용 RAM ${headroom}GB (< 8GB)`;
135
+ return "LLM tier off";
136
+ }
137
+ /** 집계 완료 후 실제 적용 설정 */
138
+ export function buildAnalysisEffectiveConfig(data, cli, machine) {
139
+ const profileMachine = machine ?? probeMachineProfileSync();
140
+ const buildOpts = {
141
+ preset: cli.preset,
142
+ worker: cli.worker,
143
+ semanticKeywords: cli.semanticKeywords,
144
+ sentiment: cli.sentiment,
145
+ since: cli.since,
146
+ };
147
+ const messageCount = data.summary.totalMessages;
148
+ const preset = resolvePresetNameWithAuto(buildOpts, messageCount);
149
+ const presetSource = resolvePresetSource(cli.preset, cli.worker, messageCount, profileMachine);
150
+ const profileSettings = getAnalysisProfileSettings(buildOpts, messageCount);
151
+ const semanticModel = semanticEmbeddingModelId(buildOpts, messageCount);
152
+ const sentimentModel = sentimentModelId(preset);
153
+ const semanticCap = effectiveSemanticSampleCap(messageCount, buildOpts);
154
+ const llmTier = resolveLlmTier(preset, profileMachine);
155
+ const semanticUsed = data.summary.usedSemanticKeywords === true;
156
+ const sentimentUsed = data.summary.usedSentimentAnalysis === true;
157
+ const llmUsed = data.summary.usedLlmAnalysis === true;
158
+ return {
159
+ preset,
160
+ presetSource,
161
+ profile: profileSettings.profile,
162
+ privacy: cli.privacy,
163
+ top: cli.top,
164
+ since: cli.since,
165
+ workerRequested: resolveWorkerRequested(cli.worker),
166
+ workerUsed: false,
167
+ semantic: {
168
+ requested: resolveSemanticRequested(cli.semanticKeywords),
169
+ used: semanticUsed,
170
+ model: semanticModel,
171
+ sampleCap: semanticCap,
172
+ skippedReason: inferSemanticSkipReason(buildOpts, preset, semanticUsed),
173
+ },
174
+ sentiment: {
175
+ requested: resolveSentimentRequested(cli.sentiment),
176
+ used: sentimentUsed,
177
+ model: sentimentModel,
178
+ skippedReason: inferSentimentSkipReason(buildOpts, preset, sentimentUsed),
179
+ },
180
+ llm: {
181
+ tier: llmTier,
182
+ used: llmUsed,
183
+ modelId: qwenModelIdForTier(llmTier),
184
+ skippedReason: inferLlmSkipReason(preset, llmTier, llmUsed, profileMachine),
185
+ },
186
+ topicModel: resolveTopicModel(data),
187
+ embeddingTopics: profileSettings.useEmbeddingTopics,
188
+ budgetMs: analysisBudgetMs(preset, messageCount, profileMachine),
189
+ envOverrides: collectEnvOverrides(),
190
+ invokedVia: parseKcaInvokerEnv(process.env.KCA_INVOKER),
191
+ messageCount,
192
+ machine: {
193
+ freeMemGb: profileMachine.freeMemGb,
194
+ availableMemGb: profileMachine.availableMemGb,
195
+ totalMemGb: profileMachine.totalMemGb,
196
+ gpu: profileMachine.gpu,
197
+ },
198
+ };
199
+ }
200
+ export function withWorkerUsed(config, workerUsed) {
201
+ return { ...config, workerUsed };
202
+ }
203
+ /** 집계 전 예상 preset (stderr 힌트) */
204
+ export function estimatePresetBeforeParse(cli, messageEstimate) {
205
+ const machine = probeMachineProfileSync();
206
+ if (cli.preset) {
207
+ return {
208
+ preset: cli.preset,
209
+ source: "cli",
210
+ };
211
+ }
212
+ const env = process.env.KCA_PRESET?.trim().toLowerCase();
213
+ if (env === "speed" || env === "balanced" || env === "quality" || env === "custom") {
214
+ return { preset: env, source: "env" };
215
+ }
216
+ if (cli.worker === true || process.env.KCA_PROFILE === "fast") {
217
+ return {
218
+ preset: resolvePresetName({ worker: cli.worker }),
219
+ source: "legacy-fast",
220
+ };
221
+ }
222
+ const n = messageEstimate ?? 0;
223
+ return {
224
+ preset: autoPresetFromMachine(machine, n),
225
+ source: resolvePresetSource(undefined, undefined, n, machine),
226
+ };
227
+ }
228
+ export function formatEstimatedPresetHint(cli, messageEstimate) {
229
+ const machine = probeMachineProfileSync();
230
+ const { preset, source } = estimatePresetBeforeParse(cli, messageEstimate);
231
+ const n = messageEstimate !== undefined
232
+ ? ` · 메시지 ~${messageEstimate.toLocaleString("ko-KR")}건`
233
+ : "";
234
+ const ram = Math.abs(machine.availableMemGb - machine.freeMemGb) < 0.3
235
+ ? `가용 RAM ${machine.availableMemGb}GB`
236
+ : `가용 RAM ${machine.availableMemGb}GB (free ${machine.freeMemGb}GB)`;
237
+ return `[kca] 예상 preset: ${preset} (${presetSourceLabel(source)} · ${ram}${n})`;
238
+ }
239
+ function formatRequested(req) {
240
+ if (req === "auto")
241
+ return "auto";
242
+ return req ? "on" : "off";
243
+ }
244
+ export function formatConfigSummaryKo(config) {
245
+ const lines = [
246
+ "=== kca 분석 설정 ===",
247
+ `preset: ${config.preset} (${presetSourceLabel(config.presetSource)})`,
248
+ `프로필: ${config.profile} · 프라이버시: ${config.privacy} · 상위 목록: ${config.top}`,
249
+ `메시지: ${config.messageCount.toLocaleString("ko-KR")}건 · ${formatMemoryLine(config.machine).replace(/^RAM: /, "")} · GPU ${config.machine.gpu}`,
250
+ `Worker: 요청 ${formatRequested(config.workerRequested)} · 실제 ${config.workerUsed ? "사용" : "미사용"}`,
251
+ ];
252
+ if (config.since)
253
+ lines.push(`기간 필터: ${config.since} 이후`);
254
+ const sem = config.semantic;
255
+ lines.push(`시맨틱: 요청 ${formatRequested(sem.requested)} · 실제 ${sem.used ? "사용" : "미사용"} · 모델 ${sem.model}${sem.sampleCap ? ` · 상한 ${sem.sampleCap}` : ""}`);
256
+ if (!sem.used && sem.skippedReason)
257
+ lines.push(` ↳ 미사용 사유: ${sem.skippedReason}`);
258
+ const sent = config.sentiment;
259
+ lines.push(`감정: 요청 ${formatRequested(sent.requested)} · 실제 ${sent.used ? "사용" : "미사용"} · 모델 ${sent.model}`);
260
+ if (!sent.used && sent.skippedReason)
261
+ lines.push(` ↳ 미사용 사유: ${sent.skippedReason}`);
262
+ const llm = config.llm;
263
+ lines.push(`LLM: tier ${llm.tier} · 실제 ${llm.used ? "사용" : "미사용"}${llm.modelId ? ` · ${llm.modelId}` : ""}`);
264
+ if (!llm.used && llm.skippedReason)
265
+ lines.push(` ↳ 미사용 사유: ${llm.skippedReason}`);
266
+ lines.push(`주제: ${config.topicModel} · 임베딩 주제 레인: ${config.embeddingTopics ? "on" : "off"} · 분석 예산 ~${Math.round(config.budgetMs / 1000)}s`);
267
+ if (config.invokedVia) {
268
+ lines.push(`실행 경로: ${config.invokedVia.name} ${config.invokedVia.version} → kca`);
269
+ }
270
+ if (config.envOverrides.length > 0) {
271
+ lines.push(`환경 변수: ${config.envOverrides.join(", ")}`);
272
+ }
273
+ return lines.join("\n");
274
+ }
275
+ export function configToJson(config) {
276
+ return JSON.stringify(config, null, 2);
277
+ }
278
+ export function toProvenanceOptions(config, data, extras) {
279
+ return {
280
+ privacy: config.privacy,
281
+ top: config.top,
282
+ since: config.since,
283
+ workerRequested: config.workerRequested,
284
+ workerUsed: config.workerUsed,
285
+ semanticRequested: config.semantic.requested,
286
+ sentimentRequested: config.sentiment.requested,
287
+ kiwiAvailable: extras.kiwiAvailable,
288
+ preset: config.preset,
289
+ presetSource: config.presetSource,
290
+ semanticModel: config.semantic.model,
291
+ semanticCap: config.semantic.sampleCap,
292
+ semanticSkippedReason: !config.semantic.used && config.semantic.skippedReason
293
+ ? config.semantic.skippedReason
294
+ : undefined,
295
+ sentimentModel: config.sentiment.model,
296
+ sentimentSkippedReason: !config.sentiment.used && config.sentiment.skippedReason
297
+ ? config.sentiment.skippedReason
298
+ : undefined,
299
+ llmTier: config.llm.tier,
300
+ llmUsed: config.llm.used,
301
+ llmSkippedReason: !config.llm.used && config.llm.skippedReason ? config.llm.skippedReason : undefined,
302
+ llmModelId: config.llm.modelId,
303
+ gpu: config.machine.gpu,
304
+ budgetMs: config.budgetMs,
305
+ envOverrides: config.envOverrides.length > 0 ? config.envOverrides : undefined,
306
+ embeddingTopics: config.embeddingTopics,
307
+ buildTiming: extras.buildTiming,
308
+ htmlBytes: extras.htmlBytes,
309
+ };
310
+ }
311
+ //# sourceMappingURL=analysis-effective-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis-effective-config.js","sourceRoot":"","sources":["../../src/analysis-effective-config.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ export interface PresetEffectiveFlags {
10
10
  preferWorker: boolean;
11
11
  }
12
12
  export declare function resolvePresetName(options?: BuildReportOptions): AnalysisPresetName;
13
- /** CLI 인자 없을 때 RAM·메시지 수 기반 자동 preset */
13
+ /** CLI 인자 없을 때 가용 RAM·총 RAM·메시지 수 기반 자동 preset (품질 우선) */
14
14
  export declare function autoPresetFromMachine(profile: MachineProfile, messageCount?: number): AnalysisPresetName;
15
15
  export declare function resolvePresetNameWithAuto(options?: BuildReportOptions, messageCount?: number): AnalysisPresetName;
16
16
  export declare function getPresetEffectiveFlags(options?: BuildReportOptions, messageCount?: number): PresetEffectiveFlags;
@@ -1,4 +1,4 @@
1
- import { probeMachineProfileSync } from "./analysis-capability.js";
1
+ import { memoryHeadroomGb, probeMachineProfileSync, } from "./analysis-capability.js";
2
2
  function presetFromEnv() {
3
3
  const raw = process.env.KCA_PRESET?.trim().toLowerCase();
4
4
  if (raw === "speed" || raw === "balanced" || raw === "quality" || raw === "custom")
@@ -15,13 +15,23 @@ export function resolvePresetName(options) {
15
15
  return "speed";
16
16
  return "balanced";
17
17
  }
18
- /** CLI 인자 없을 때 RAM·메시지 수 기반 자동 preset */
18
+ /** CLI 인자 없을 때 가용 RAM·총 RAM·메시지 수 기반 자동 preset (품질 우선) */
19
19
  export function autoPresetFromMachine(profile, messageCount) {
20
- if (profile.freeMemGb < 6)
20
+ const headroom = memoryHeadroomGb(profile);
21
+ const total = profile.totalMemGb;
22
+ const n = messageCount ?? 0;
23
+ if (headroom < 4 || (headroom < 6 && total < 16))
21
24
  return "speed";
22
- if (profile.freeMemGb < 12)
25
+ if (total >= 32 && headroom >= 12) {
26
+ return n >= 80_000 ? "balanced" : "quality";
27
+ }
28
+ if (total >= 16 && headroom >= 10) {
29
+ return n >= 40_000 ? "balanced" : "quality";
30
+ }
31
+ if (headroom < 8)
32
+ return "speed";
33
+ if (headroom < 12)
23
34
  return "balanced";
24
- const n = messageCount ?? 0;
25
35
  if (n >= 30_000)
26
36
  return "balanced";
27
37
  return "quality";
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-preset.js","sourceRoot":"","sources":["../../src/analysis-preset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analysis-preset.js","sourceRoot":"","sources":["../../src/analysis-preset.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,5 @@ export interface AnalysisProfileSettings {
6
6
  semanticSupplementRrfWeight: number;
7
7
  semanticClusterMinCoherence: number;
8
8
  }
9
- export declare function resolveAnalysisProfile(options?: BuildReportOptions): AnalysisProfile;
10
- export declare function getAnalysisProfileSettings(options?: BuildReportOptions): AnalysisProfileSettings;
9
+ export declare function resolveAnalysisProfile(options?: BuildReportOptions, messageCount?: number): AnalysisProfile;
10
+ export declare function getAnalysisProfileSettings(options?: BuildReportOptions, messageCount?: number): AnalysisProfileSettings;
@@ -1,14 +1,14 @@
1
1
  import { getPresetEffectiveFlags } from "./analysis-preset.js";
2
- export function resolveAnalysisProfile(options) {
3
- const preset = getPresetEffectiveFlags(options);
2
+ export function resolveAnalysisProfile(options, messageCount) {
3
+ const preset = getPresetEffectiveFlags(options, messageCount);
4
4
  if (preset.profile === "fast")
5
5
  return "fast";
6
6
  if (options?.worker === true || process.env.KCA_PROFILE === "fast")
7
7
  return "fast";
8
8
  return "quality";
9
9
  }
10
- export function getAnalysisProfileSettings(options) {
11
- const profile = resolveAnalysisProfile(options);
10
+ export function getAnalysisProfileSettings(options, messageCount) {
11
+ const profile = resolveAnalysisProfile(options, messageCount);
12
12
  if (profile === "fast") {
13
13
  return {
14
14
  profile,
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-profile.js","sourceRoot":"","sources":["../../src/analysis-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAW/D,MAAM,UAAU,sBAAsB,CAAC,OAA4B;IACjE,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,OAA4B;IACrE,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO;YACL,OAAO;YACP,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;YAC5D,2BAA2B,EAAE,IAAI;YACjC,2BAA2B,EAAE,IAAI;SAClC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO;QACP,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;QAC5D,2BAA2B,EAAE,GAAG;QAChC,2BAA2B,EAAE,IAAI;KAClC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"analysis-profile.js","sourceRoot":"","sources":["../../src/analysis-profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAW/D,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,YAAqB;IAErB,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,OAAO,EAAE,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,OAA4B,EAC5B,YAAqB;IAErB,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9D,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO;YACL,OAAO;YACP,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;YAC5D,2BAA2B,EAAE,IAAI;YACjC,2BAA2B,EAAE,IAAI;SAClC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO;QACP,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;QAC5D,2BAA2B,EAAE,GAAG;QAChC,2BAA2B,EAAE,IAAI;KAClC,CAAC;AACJ,CAAC"}
@@ -25,8 +25,8 @@ import { stat } from "node:fs/promises";
25
25
  import { estimateKakaoMessageCount, streamKakaoExport } from "./stream-parser.js";
26
26
  import { recordOnOrAfter } from "./report-date-filter.js";
27
27
  const DEFAULT_TOP = 30;
28
- function finalizeProfileOpts(options, extra) {
29
- const settings = getAnalysisProfileSettings(options);
28
+ function finalizeProfileOpts(options, extra, messageCount) {
29
+ const settings = getAnalysisProfileSettings(options, messageCount);
30
30
  return {
31
31
  ...extra,
32
32
  useEmbeddingTopics: settings.useEmbeddingTopics,
@@ -60,7 +60,7 @@ async function applySemanticKeywords(agg, enabled, showProgress, options) {
60
60
  const samples = agg.drainSemanticSamples(options);
61
61
  if (samples.length < 48)
62
62
  return false;
63
- const profileSettings = getAnalysisProfileSettings(options);
63
+ const profileSettings = getAnalysisProfileSettings(options, corpusMessages);
64
64
  if (showProgress)
65
65
  logReportProgress({ phase: "시맨틱 키워드", current: 0 });
66
66
  try {
@@ -135,7 +135,7 @@ export function buildReportData(result, options) {
135
135
  encoding: result.encoding,
136
136
  physicalLines: result.physicalLines,
137
137
  warningCount: result.warnings.length,
138
- }, finalizeProfileOpts(options, { koreanPrimary: korean })));
138
+ }, finalizeProfileOpts(options, { koreanPrimary: korean }, result.records.length)));
139
139
  }
140
140
  export async function buildReportDataAsync(result, options) {
141
141
  await prepareReportEngine();
@@ -167,7 +167,7 @@ export async function buildReportDataAsync(result, options) {
167
167
  usedSemanticKeywords: usedSemantic,
168
168
  usedSentimentAnalysis: usedSentiment,
169
169
  koreanPrimary: prepass.isPrimarilyKorean(),
170
- })));
170
+ }, result.records.length)));
171
171
  }
172
172
  function messageTextFromRecord(record) {
173
173
  return record.message;
@@ -359,7 +359,7 @@ export async function buildReportFromExportSync(filePath, options) {
359
359
  usedSemanticKeywords: usedSemanticOverlap,
360
360
  usedSentimentAnalysis: usedSentimentOverlap,
361
361
  koreanPrimary: prepass.isPrimarilyKorean(),
362
- }));
362
+ }, prepass.messageCount));
363
363
  const llmTier = resolveLlmTier(preset, probeMachineProfileSync());
364
364
  phaseProfiler.start("llm");
365
365
  if (llmTier !== "off" && !budget.shouldSkip("llm")) {
@@ -432,7 +432,7 @@ export async function buildReportFromExportSync(filePath, options) {
432
432
  usedSemanticKeywords: usedSemantic,
433
433
  usedSentimentAnalysis: usedSentiment,
434
434
  koreanPrimary: prepass.isPrimarilyKorean(),
435
- }));
435
+ }, prepass.messageCount));
436
436
  const llmTier = resolveLlmTier(preset, probeMachineProfileSync());
437
437
  phaseProfiler.start("llm");
438
438
  if (llmTier !== "off" && !budget.shouldSkip("llm")) {