kakaotalk-chat-analyzer 0.19.10 → 0.19.12

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 (43) hide show
  1. package/README.md +9 -2
  2. package/dist/src/analysis-budget.js +1 -1
  3. package/dist/src/analysis-budget.js.map +1 -1
  4. package/dist/src/llm-deck-validate.d.ts +4 -0
  5. package/dist/src/llm-deck-validate.js +149 -0
  6. package/dist/src/llm-deck-validate.js.map +1 -0
  7. package/dist/src/llm-input.d.ts +1 -1
  8. package/dist/src/llm-input.js +29 -7
  9. package/dist/src/llm-input.js.map +1 -1
  10. package/dist/src/llm-json.d.ts +43 -0
  11. package/dist/src/llm-json.js.map +1 -1
  12. package/dist/src/llm-schema.d.ts +200 -11
  13. package/dist/src/llm-schema.js +116 -6
  14. package/dist/src/llm-schema.js.map +1 -1
  15. package/dist/src/llm-summarize.js +31 -5
  16. package/dist/src/llm-summarize.js.map +1 -1
  17. package/dist/src/report-charts.d.ts +1 -1
  18. package/dist/src/report-charts.js +13 -73
  19. package/dist/src/report-charts.js.map +1 -1
  20. package/dist/src/report-innovation.js +7 -42
  21. package/dist/src/report-innovation.js.map +1 -1
  22. package/dist/src/report-llm-deck.d.ts +11 -0
  23. package/dist/src/report-llm-deck.js +164 -0
  24. package/dist/src/report-llm-deck.js.map +1 -0
  25. package/dist/src/report-section-visibility.d.ts +2 -0
  26. package/dist/src/report-section-visibility.js +15 -2
  27. package/dist/src/report-section-visibility.js.map +1 -1
  28. package/dist/src/report-story.js +6 -17
  29. package/dist/src/report-story.js.map +1 -1
  30. package/dist/src/report-styles.d.ts +1 -1
  31. package/dist/src/report-styles.js +275 -4
  32. package/dist/src/report-styles.js.map +1 -1
  33. package/dist/src/report-ux.d.ts +1 -1
  34. package/dist/src/report-ux.js +3 -1
  35. package/dist/src/report-ux.js.map +1 -1
  36. package/dist/src/report.js +57 -60
  37. package/dist/src/report.js.map +1 -1
  38. package/dist/src/story.js +0 -7
  39. package/dist/src/story.js.map +1 -1
  40. package/dist/src/types.d.ts +51 -0
  41. package/dist/src/version.d.ts +2 -2
  42. package/dist/src/version.js +1 -1
  43. package/package.json +2 -1
package/README.md CHANGED
@@ -215,7 +215,7 @@ KCA_LLM_BACKEND=ollama kca ./chat.csv --preset custom
215
215
 
216
216
  **주제 맵:** graph(공기 군집)·keyword(상위 키워드 시드)·semantic(임베딩 클러스터) 3레인 RRF 병합 — 대용량 방에서 의미 테마 최대 12장. `KCA_TOPIC_MAX`, `KCA_TOPIC_MIN_THEMES`.
217
217
 
218
- **LLM (자동, `KCA_LLM=0` 제외):** RAM이 허용하는 최대 Qwen3.5(0.8B→9B)로 주제 제목·서사 + `topicProposals` + 인사이트 bullet·샵검색/상호작용 줄(원문 미전송). node-llama-cpp **JSON Schema grammar**로 출력 형식을 강제(기본 on). LLM 실패 시에도 리포트는 규칙 기반 서사로 완성.
218
+ **LLM (자동, `KCA_LLM=0` 제외):** RAM이 허용하는 최대 Qwen3.5(0.8B→9B)로 주제 제목·서사 + Story Deck(방 아키타입·올해의 순간·에피소드·관계 드라마·밈·공유 문구 등, 원문 미전송). node-llama-cpp **JSON Schema grammar**로 출력 형식을 강제(기본 on). LLM 실패 시에도 리포트는 규칙 기반 서사로 완성.
219
219
 
220
220
  **LLM 문제 해결:** free RAM이 매우 낮으면(`KCA_LLM_MIN_FREE_GB` 미만) 재시도 없이 skip — `KCA_LLM=0 npx kcachat --local` 또는 메모리 확보 후 재실행. JSON만 끄려면 `KCA_LLM_GRAMMAR=0`.
221
221
 
@@ -238,7 +238,7 @@ KCA_BENCH_COMPARE=1 npm run bench:semantic
238
238
 
239
239
  </details>
240
240
 
241
- **버전 고정:** `npx kakaotalk-chat-analyzer@0.18.2` · 최신은 `kcachat@latest`가 매번 본체를 받습니다. 리포트 사이드 카드·`#kca-provenance`로 실제 생성 버전을 확인할 수 있습니다.
241
+ **버전 고정:** `npx kakaotalk-chat-analyzer@0.19.12` · 최신은 `kcachat@latest`가 매번 본체를 받습니다. 리포트 사이드 카드·`#kca-provenance`로 실제 생성 버전을 확인할 수 있습니다.
242
242
 
243
243
  **로컬 개발:**
244
244
 
@@ -253,6 +253,13 @@ cd kakaotalk-chat-analyzer && npm install && npm run build && npm test
253
253
 
254
254
  | 버전 | 요약 |
255
255
  |------|------|
256
+ | **0.19.12** | LLM Story Deck·리포트 고밀도 재설계(슬림 팩트·중복 차트 제거) |
257
+ | **0.19.11** | `llm_retry` 예산을 실제 재시도 모델 크기에 맞춤 |
258
+ | **0.19.10** | LLM 재시도 RAM gate·JSON 벤치·테스트 보강 |
259
+ | **0.19.9** | JSON Schema grammar·OOM 방어 — LLM 실패해도 리포트 완성 |
260
+ | **0.19.8** | SLA cap 기준 LLM 예산 skip 완화 |
261
+ | **0.19.7** | 가용 RAM 모델 선택·타임아웃 분리·JSON 재시도 |
262
+ | **0.19.6** | macOS Metal 폴백·로드 시점 RAM 기준 Qwen 선택 |
256
263
  | **0.19.5** | KoELECTRA NSMC·embed ONNX npm 번들 자동 설치·독성 lazy zip·Hub 폴백 정리 |
257
264
  | **0.19.4** | Qwen3.5 RAM greedy 자동 선택·모든 preset LLM on |
258
265
  | **0.18.2** | 주제 맵 3레인(graph·키워드·임베딩) 병합·테마 6~12·LLM `topicProposals` |
@@ -29,7 +29,7 @@ export function phaseReserveMs(phase, preset, profile, llmSize) {
29
29
  return llmPhaseReserveMs(llmSize, preset);
30
30
  }
31
31
  if (phase === "llm_retry") {
32
- return llmPhaseReserveMs("0.8B", preset);
32
+ return llmPhaseReserveMs(llmSize ?? "0.8B", preset);
33
33
  }
34
34
  return BASE_RESERVE_MS[phase];
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-budget.js","sourceRoot":"","sources":["../../src/analysis-budget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analysis-budget.js","sourceRoot":"","sources":["../../src/analysis-budget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ReportData } from "./types.js";
2
+ import type { LlmJsonShape } from "./llm-json.js";
3
+ import type { LlmInsights } from "./types.js";
4
+ export declare function sanitizeLlmDeck(parsed: LlmJsonShape, data: ReportData): Partial<LlmInsights>;
@@ -0,0 +1,149 @@
1
+ const KEYWORD_POOL_MAX = 80;
2
+ function keywordPool(data) {
3
+ const pool = new Set();
4
+ for (const k of data.keywords.slice(0, KEYWORD_POOL_MAX)) {
5
+ const label = k.label?.trim();
6
+ if (label)
7
+ pool.add(label);
8
+ }
9
+ for (const h of data.highlights) {
10
+ for (const m of h.match(/[\p{L}\p{N}_#]+/gu) ?? []) {
11
+ if (m.length >= 2)
12
+ pool.add(m);
13
+ }
14
+ }
15
+ return pool;
16
+ }
17
+ function statTokens(data) {
18
+ const s = new Set();
19
+ const pushNum = (n) => {
20
+ if (n === null || n === undefined || Number.isNaN(n))
21
+ return;
22
+ s.add(String(n));
23
+ s.add(String(Math.round(n)));
24
+ if (!Number.isInteger(n))
25
+ s.add(n.toFixed(1));
26
+ };
27
+ pushNum(data.summary.totalMessages);
28
+ pushNum(data.summary.participants);
29
+ pushNum(data.summary.activeDays);
30
+ pushNum(data.insights.rhythmScore);
31
+ pushNum(data.insights.top3ParticipantSharePercent);
32
+ pushNum(data.insights.weekendSharePercent);
33
+ if (data.summary.peakHour !== null)
34
+ s.add(`${data.summary.peakHour}`);
35
+ return s;
36
+ }
37
+ function statRefOk(ref, data) {
38
+ const t = ref.trim();
39
+ if (t.length < 2)
40
+ return false;
41
+ const stats = statTokens(data);
42
+ for (const tok of t.match(/\d+(?:\.\d+)?/g) ?? []) {
43
+ const whole = tok.includes(".") ? tok.split(".")[0] : tok;
44
+ if (stats.has(tok) || stats.has(whole))
45
+ return true;
46
+ }
47
+ return data.highlights.some((h) => h.includes(t.slice(0, Math.min(24, t.length))));
48
+ }
49
+ export function sanitizeLlmDeck(parsed, data) {
50
+ const kw = keywordPool(data);
51
+ const out = {};
52
+ const arch = parsed.roomArchetype;
53
+ if (arch?.name?.trim() && arch.description?.trim()) {
54
+ out.roomArchetype = {
55
+ name: arch.name.trim().slice(0, 40),
56
+ description: arch.description.trim().slice(0, 200),
57
+ traits: (arch.traits ?? []).map((t) => t.trim().slice(0, 32)).filter(Boolean).slice(0, 4),
58
+ };
59
+ }
60
+ const moments = (parsed.moments ?? [])
61
+ .filter((m) => m.headline?.trim() && m.statRef?.trim() && statRefOk(m.statRef, data))
62
+ .slice(0, 5)
63
+ .map((m) => ({
64
+ headline: m.headline.trim().slice(0, 120),
65
+ statRef: m.statRef.trim().slice(0, 80),
66
+ }));
67
+ if (moments.length)
68
+ out.moments = moments;
69
+ const beats = (parsed.relationshipBeats ?? [])
70
+ .filter((b) => b.pair?.trim() && b.beat?.trim())
71
+ .slice(0, 4)
72
+ .map((b) => ({
73
+ pair: b.pair.trim().slice(0, 48),
74
+ beat: b.beat.trim().slice(0, 120),
75
+ role: b.role?.trim().slice(0, 24),
76
+ }));
77
+ if (beats.length)
78
+ out.relationshipBeats = beats;
79
+ const episodes = (parsed.episodeCards ?? [])
80
+ .filter((e) => e.title?.trim())
81
+ .slice(0, 6)
82
+ .map((e) => ({
83
+ period: (e.period ?? "").trim().slice(0, 40),
84
+ title: e.title.trim().slice(0, 48),
85
+ tagline: (e.tagline ?? "").trim().slice(0, 80),
86
+ emoji: (e.emoji ?? "📖").trim().slice(0, 4) || "📖",
87
+ }));
88
+ if (episodes.length)
89
+ out.episodeCards = episodes;
90
+ const eras = (parsed.eraLabels ?? [])
91
+ .filter((e) => e.label?.trim())
92
+ .slice(0, 3)
93
+ .map((e) => ({
94
+ label: e.label.trim().slice(0, 48),
95
+ detail: (e.detail ?? "").trim().slice(0, 120),
96
+ }));
97
+ if (eras.length)
98
+ out.eraLabels = eras;
99
+ const jokes = (parsed.insideJokes ?? [])
100
+ .filter((j) => j.label?.trim())
101
+ .slice(0, 5)
102
+ .map((j) => {
103
+ const evidence = (j.evidenceKeywords ?? [])
104
+ .map((k) => k.trim())
105
+ .filter((k) => k && kw.has(k))
106
+ .slice(0, 4);
107
+ return {
108
+ label: j.label.trim().slice(0, 40),
109
+ whyFunny: (j.whyFunny ?? "").trim().slice(0, 120),
110
+ evidenceKeywords: evidence,
111
+ };
112
+ })
113
+ .filter((j) => j.evidenceKeywords.length > 0 || j.whyFunny.length > 8);
114
+ if (jokes.length)
115
+ out.insideJokes = jokes;
116
+ const chars = (parsed.characterCards ?? [])
117
+ .filter((c) => c.alias?.trim())
118
+ .slice(0, 3)
119
+ .map((c) => ({
120
+ alias: c.alias.trim().slice(0, 32),
121
+ tagline: (c.tagline ?? "").trim().slice(0, 80),
122
+ statHook: (c.statHook ?? "").trim().slice(0, 60),
123
+ }));
124
+ if (chars.length)
125
+ out.characterCards = chars;
126
+ const days = (parsed.dayMicroStories ?? [])
127
+ .filter((d) => d.date?.trim() && d.line?.trim())
128
+ .slice(0, 5)
129
+ .map((d) => ({
130
+ date: d.date.trim().slice(0, 10),
131
+ line: d.line.trim().slice(0, 120),
132
+ }));
133
+ if (days.length)
134
+ out.dayMicroStories = days;
135
+ if (parsed.shareLine?.trim()) {
136
+ out.shareLine = parsed.shareLine.trim().slice(0, 160);
137
+ }
138
+ const tags = (parsed.hashtags ?? []).map((h) => h.trim().replace(/^#/, "")).filter(Boolean).slice(0, 3);
139
+ if (tags.length)
140
+ out.hashtags = tags.map((h) => h.slice(0, 24));
141
+ const cf = (parsed.counterfactuals ?? [])
142
+ .filter((c) => c.text?.trim())
143
+ .slice(0, 2)
144
+ .map((c) => ({ text: c.text.trim().slice(0, 120) }));
145
+ if (cf.length)
146
+ out.counterfactuals = cf;
147
+ return out;
148
+ }
149
+ //# sourceMappingURL=llm-deck-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-deck-validate.js","sourceRoot":"","sources":["../../src/llm-deck-validate.ts"],"names":[],"mappings":"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"}
@@ -4,4 +4,4 @@ export interface BuildLlmPromptOptions {
4
4
  }
5
5
  /** LLM 입력 — 원문 메시지·PII 없이 통계·키워드·주제만 */
6
6
  export declare function buildLlmPromptPayload(data: ReportData, opts?: BuildLlmPromptOptions): string;
7
- export declare const LLM_SYSTEM_PROMPT = "\uB2F9\uC2E0\uC740 \uCE74\uCE74\uC624\uD1A1 \uB300\uD654\uBC29 \uD1B5\uACC4 \uB9AC\uD3EC\uD2B8 \uD3B8\uC9D1\uC790\uC785\uB2C8\uB2E4.\n\uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0 \uC6D0\uBB38\uC740 \uC5C6\uC2B5\uB2C8\uB2E4. \uD1B5\uACC4\uB9CC \uBCF4\uACE0 JSON \uAC1D\uCCB4 \uD558\uB098\uB9CC \uCD9C\uB825\uD558\uC138\uC694. \uB2E4\uB978 \uD14D\uC2A4\uD2B8\u00B7\uB9C8\uD06C\uB2E4\uC6B4 fence \uAE08\uC9C0.\n\uD544\uC218 \uD0A4: paragraphs (2~3\uAC1C \uBB38\uC790\uC5F4). \uC120\uD0DD: topicTitles, topicProposals, insightBullets, shopSearchSummary, dyadInsight.\n\uD615\uC2DD \uC608:\n{\"topicTitles\":[{\"i\":0,\"title\":\"\uC9E7\uC740 \uD55C\uAD6D\uC5B4 \uC81C\uBAA9\"}],\"topicProposals\":[{\"title\":\"AI \uCF54\uB529\",\"terms\":[\"\uD074\uB85C\uB4DC\"],\"keywordEvidence\":[\"\uD074\uB85C\uB4DC\"]}],\"paragraphs\":[\"\uC11C\uC0AC \uBB38\uB2E81\",\"\uC11C\uC0AC \uBB38\uB2E82\"],\"insightBullets\":[\"\uD1B5\uACC4 \uADFC\uAC70 \uD55C \uC904\"]}\ntopicTitles\uB294 \uC8FC\uC81C\uD6C4\uBCF4 \uC778\uB371\uC2A4 i\uC5D0 \uB9DE\uCDB0 \uCD5C\uB300 12\uAC1C, title 40\uC790 \uC774\uB0B4.\ntopicProposals\uB294 \uD0A4\uC6CC\uB4DC \uBAA9\uB85D\uC5D0 \uC788\uB294 \uB2E8\uC5B4\uB9CC keywordEvidence\uC5D0 \uB123\uC5B4 \uCD5C\uB300 3\uAC1C(\uC0C8 \uD14C\uB9C8 \uC81C\uC548).\nparagraphs\uB294 2~3\uAC1C, \uAC01 120\uC790 \uC774\uB0B4, \uB9C8\uD06C\uB2E4\uC6B4 **\uAC15\uC870**\uB9CC \uD5C8\uC6A9.\ninsightBullets\uB294 \uD1B5\uACC4 \uADFC\uAC70 \uD55C \uC904 2~4\uAC1C(\uC22B\uC790\uB294 \uC785\uB825\uC5D0 \uC788\uB294 \uAC83\uB9CC).\nshopSearchSummary, dyadInsight\uB294 \uAC01 120\uC790 \uC774\uB0B4 \uD55C\uAD6D\uC5B4(\uD574\uB2F9 \uB370\uC774\uD130 \uC5C6\uC73C\uBA74 \uC0DD\uB7B5).";
7
+ export declare const LLM_SYSTEM_PROMPT = "\uB2F9\uC2E0\uC740 \uCE74\uCE74\uC624\uD1A1 \uB300\uD654\uBC29 \uD1B5\uACC4 \uB9AC\uD3EC\uD2B8 \uD3B8\uC9D1\uC790\uC785\uB2C8\uB2E4.\n\uC0AC\uC6A9\uC790 \uBA54\uC2DC\uC9C0 \uC6D0\uBB38\uC740 \uC5C6\uC2B5\uB2C8\uB2E4. \uD1B5\uACC4\uB9CC \uBCF4\uACE0 JSON \uAC1D\uCCB4 \uD558\uB098\uB9CC \uCD9C\uB825\uD558\uC138\uC694. \uB2E4\uB978 \uD14D\uC2A4\uD2B8\u00B7\uB9C8\uD06C\uB2E4\uC6B4 fence \uAE08\uC9C0.\n\uD544\uC218 \uD0A4: paragraphs (2~3\uAC1C \uBB38\uC790\uC5F4).\n\uC120\uD0DD \uD0A4: topicTitles, topicProposals, insightBullets, shopSearchSummary, dyadInsight,\nroomArchetype{name,description,traits[]}, moments[{headline,statRef}], relationshipBeats[{pair,beat,role}],\nepisodeCards[{period,title,tagline,emoji}], eraLabels[{label,detail}], insideJokes[{label,whyFunny,evidenceKeywords[]}(\uD0A4\uC6CC\uB4DC \uBAA9\uB85D \uB2E8\uC5B4\uB9CC)],\ncharacterCards[{alias,tagline,statHook}], dayMicroStories[{date,line}], shareLine, hashtags[], counterfactuals[{text}](\uAC00\uC0C1 \uC720\uBA38).\ntopicProposals\u00B7insideJokes\uC758 evidence\uB294 \uC785\uB825 \uD0A4\uC6CC\uB4DC\uC5D0 \uC788\uB294 \uB2E8\uC5B4\uB9CC.\nmoments\uC758 statRef \uC22B\uC790\uB294 \uC785\uB825 \uD1B5\uACC4\u00B7\uD558\uC774\uB77C\uC774\uD2B8\uC5D0 \uC788\uB294 \uAC83\uB9CC.\nparagraphs\uB294 2~3\uAC1C, \uAC01 120\uC790 \uC774\uB0B4, \uB9C8\uD06C\uB2E4\uC6B4 **\uAC15\uC870**\uB9CC \uD5C8\uC6A9.\ninsightBullets 2~4\uAC1C(\uC22B\uC790\uB294 \uC785\uB825\uC5D0 \uC788\uB294 \uAC83\uB9CC).";
@@ -36,17 +36,39 @@ export function buildLlmPromptPayload(data, opts) {
36
36
  if (shift.onlyHead.length || shift.onlyTail.length) {
37
37
  lines.push(`키워드전환: 초반[${shift.onlyHead.slice(0, 5).join(",")}] 후반[${shift.onlyTail.slice(0, 5).join(",")}]`);
38
38
  }
39
+ if (data.story.chapters.length > 0) {
40
+ const ch = data.story.chapters
41
+ .slice(0, 6)
42
+ .map((c) => `${c.label}(${c.fromDate}~${c.toDate},${c.messages}건,주도${c.topAlias ?? "—"})`);
43
+ lines.push(`챕터: ${ch.join(" | ")}`);
44
+ }
45
+ if (data.burstDays.length > 0) {
46
+ const bursts = data.burstDays
47
+ .slice(0, 5)
48
+ .map((b) => `${b.date}(${b.count}건)`);
49
+ lines.push(`급증일: ${bursts.join(", ")}`);
50
+ }
51
+ const phrases = data.repeatedPhrases.slice(0, 8).map((p, i) => `패턴${i + 1}(${p.count})`);
52
+ if (phrases.length)
53
+ lines.push(`반복문구: ${phrases.join(", ")}`);
54
+ if (data.story.personas.length > 0) {
55
+ const personas = data.story.personas
56
+ .slice(0, 6)
57
+ .map((p) => `${p.alias}:${p.title}`);
58
+ lines.push(`페르소나힌트: ${personas.join(", ")}`);
59
+ }
39
60
  }
40
61
  return lines.join("\n");
41
62
  }
42
63
  export const LLM_SYSTEM_PROMPT = `당신은 카카오톡 대화방 통계 리포트 편집자입니다.
43
64
  사용자 메시지 원문은 없습니다. 통계만 보고 JSON 객체 하나만 출력하세요. 다른 텍스트·마크다운 fence 금지.
44
- 필수 키: paragraphs (2~3개 문자열). 선택: topicTitles, topicProposals, insightBullets, shopSearchSummary, dyadInsight.
45
- 형식 예:
46
- {"topicTitles":[{"i":0,"title":"짧은 한국어 제목"}],"topicProposals":[{"title":"AI 코딩","terms":["클로드"],"keywordEvidence":["클로드"]}],"paragraphs":["서사 문단1","서사 문단2"],"insightBullets":["통계 근거 한 줄"]}
47
- topicTitles는 주제후보 인덱스 i에 맞춰 최대 12개, title 40자 이내.
48
- topicProposals는 키워드 목록에 있는 단어만 keywordEvidence에 넣어 최대 3개( 테마 제안).
65
+ 필수 키: paragraphs (2~3개 문자열).
66
+ 선택 키: topicTitles, topicProposals, insightBullets, shopSearchSummary, dyadInsight,
67
+ roomArchetype{name,description,traits[]}, moments[{headline,statRef}], relationshipBeats[{pair,beat,role}],
68
+ episodeCards[{period,title,tagline,emoji}], eraLabels[{label,detail}], insideJokes[{label,whyFunny,evidenceKeywords[]}(키워드 목록 단어만)],
69
+ characterCards[{alias,tagline,statHook}], dayMicroStories[{date,line}], shareLine, hashtags[], counterfactuals[{text}](가상 유머).
70
+ topicProposals·insideJokes의 evidence는 입력 키워드에 있는 단어만.
71
+ moments의 statRef 숫자는 입력 통계·하이라이트에 있는 것만.
49
72
  paragraphs는 2~3개, 각 120자 이내, 마크다운 **강조**만 허용.
50
- insightBullets 통계 근거 한 줄 2~4개(숫자는 입력에 있는 것만).
51
- shopSearchSummary, dyadInsight는 각 120자 이내 한국어(해당 데이터 없으면 생략).`;
73
+ insightBullets 2~4개(숫자는 입력에 있는 것만).`;
52
74
  //# sourceMappingURL=llm-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-input.js","sourceRoot":"","sources":["../../src/llm-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-input.js","sourceRoot":"","sources":["../../src/llm-input.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,49 @@ export interface LlmJsonShape {
12
12
  insightBullets?: string[];
13
13
  shopSearchSummary?: string;
14
14
  dyadInsight?: string;
15
+ roomArchetype?: {
16
+ name?: string;
17
+ description?: string;
18
+ traits?: string[];
19
+ };
20
+ moments?: {
21
+ headline?: string;
22
+ statRef?: string;
23
+ }[];
24
+ relationshipBeats?: {
25
+ pair?: string;
26
+ beat?: string;
27
+ role?: string;
28
+ }[];
29
+ episodeCards?: {
30
+ period?: string;
31
+ title?: string;
32
+ tagline?: string;
33
+ emoji?: string;
34
+ }[];
35
+ eraLabels?: {
36
+ label?: string;
37
+ detail?: string;
38
+ }[];
39
+ insideJokes?: {
40
+ label?: string;
41
+ whyFunny?: string;
42
+ evidenceKeywords?: string[];
43
+ }[];
44
+ characterCards?: {
45
+ alias?: string;
46
+ tagline?: string;
47
+ statHook?: string;
48
+ }[];
49
+ dayMicroStories?: {
50
+ date?: string;
51
+ line?: string;
52
+ }[];
53
+ shareLine?: string;
54
+ hashtags?: string[];
55
+ counterfactuals?: {
56
+ text?: string;
57
+ }[];
15
58
  }
16
59
  /** 첫 `{`부터 중괄호 깊이로 닫는 `}` 위치 (문자열 내부 무시) */
17
60
  export declare function findBalancedJsonEnd(text: string, start: number): number;
@@ -1 +1 @@
1
- {"version":3,"file":"llm-json.js","sourceRoot":"","sources":["../../src/llm-json.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llm-json.js","sourceRoot":"","sources":["../../src/llm-json.ts"],"names":[],"mappings":"AAwBA,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC7C,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACtC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACzB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAiB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAiB,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa;IAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,GAAG;gBAAE,QAAQ,GAAG,KAAK,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,OAAgE;IAEhE,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC"}
@@ -12,8 +12,8 @@ export declare function buildKcaLlmJsonSchema(): {
12
12
  readonly type: "integer";
13
13
  };
14
14
  readonly title: {
15
- readonly type: "string";
16
- readonly maxLength: 48;
15
+ type: string;
16
+ maxLength: number;
17
17
  };
18
18
  };
19
19
  };
@@ -25,8 +25,8 @@ export declare function buildKcaLlmJsonSchema(): {
25
25
  readonly type: "object";
26
26
  readonly properties: {
27
27
  readonly title: {
28
- readonly type: "string";
29
- readonly maxLength: 48;
28
+ type: string;
29
+ maxLength: number;
30
30
  };
31
31
  readonly terms: {
32
32
  readonly type: "array";
@@ -44,25 +44,214 @@ export declare function buildKcaLlmJsonSchema(): {
44
44
  readonly minItems: 2;
45
45
  readonly maxItems: 3;
46
46
  readonly items: {
47
- readonly type: "string";
48
- readonly maxLength: 120;
47
+ type: string;
48
+ maxLength: number;
49
49
  };
50
50
  };
51
51
  readonly insightBullets: {
52
52
  readonly type: "array";
53
53
  readonly maxItems: 4;
54
54
  readonly items: {
55
- readonly type: "string";
56
- readonly maxLength: 120;
55
+ type: string;
56
+ maxLength: number;
57
57
  };
58
58
  };
59
59
  readonly shopSearchSummary: {
60
- readonly type: "string";
61
- readonly maxLength: 120;
60
+ type: string;
61
+ maxLength: number;
62
62
  };
63
63
  readonly dyadInsight: {
64
+ type: string;
65
+ maxLength: number;
66
+ };
67
+ readonly roomArchetype: {
68
+ readonly type: "object";
69
+ readonly properties: {
70
+ readonly name: {
71
+ type: string;
72
+ maxLength: number;
73
+ };
74
+ readonly description: {
75
+ type: string;
76
+ maxLength: number;
77
+ };
78
+ readonly traits: {
79
+ readonly type: "array";
80
+ readonly maxItems: 4;
81
+ readonly items: {
82
+ readonly type: "string";
83
+ readonly maxLength: 32;
84
+ };
85
+ };
86
+ };
87
+ };
88
+ readonly moments: {
89
+ readonly type: "array";
90
+ readonly maxItems: 5;
91
+ readonly items: {
92
+ readonly type: "object";
93
+ readonly properties: {
94
+ readonly headline: {
95
+ type: string;
96
+ maxLength: number;
97
+ };
98
+ readonly statRef: {
99
+ readonly type: "string";
100
+ readonly maxLength: 80;
101
+ };
102
+ };
103
+ };
104
+ };
105
+ readonly relationshipBeats: {
106
+ readonly type: "array";
107
+ readonly maxItems: 4;
108
+ readonly items: {
109
+ readonly type: "object";
110
+ readonly properties: {
111
+ readonly pair: {
112
+ type: string;
113
+ maxLength: number;
114
+ };
115
+ readonly beat: {
116
+ type: string;
117
+ maxLength: number;
118
+ };
119
+ readonly role: {
120
+ readonly type: "string";
121
+ readonly maxLength: 24;
122
+ };
123
+ };
124
+ };
125
+ };
126
+ readonly episodeCards: {
127
+ readonly type: "array";
128
+ readonly maxItems: 6;
129
+ readonly items: {
130
+ readonly type: "object";
131
+ readonly properties: {
132
+ readonly period: {
133
+ type: string;
134
+ maxLength: number;
135
+ };
136
+ readonly title: {
137
+ type: string;
138
+ maxLength: number;
139
+ };
140
+ readonly tagline: {
141
+ type: string;
142
+ maxLength: number;
143
+ };
144
+ readonly emoji: {
145
+ readonly type: "string";
146
+ readonly maxLength: 4;
147
+ };
148
+ };
149
+ };
150
+ };
151
+ readonly eraLabels: {
152
+ readonly type: "array";
153
+ readonly maxItems: 3;
154
+ readonly items: {
155
+ readonly type: "object";
156
+ readonly properties: {
157
+ readonly label: {
158
+ type: string;
159
+ maxLength: number;
160
+ };
161
+ readonly detail: {
162
+ type: string;
163
+ maxLength: number;
164
+ };
165
+ };
166
+ };
167
+ };
168
+ readonly insideJokes: {
169
+ readonly type: "array";
170
+ readonly maxItems: 5;
171
+ readonly items: {
172
+ readonly type: "object";
173
+ readonly properties: {
174
+ readonly label: {
175
+ type: string;
176
+ maxLength: number;
177
+ };
178
+ readonly whyFunny: {
179
+ type: string;
180
+ maxLength: number;
181
+ };
182
+ readonly evidenceKeywords: {
183
+ readonly type: "array";
184
+ readonly maxItems: 4;
185
+ readonly items: {
186
+ readonly type: "string";
187
+ readonly maxLength: 32;
188
+ };
189
+ };
190
+ };
191
+ };
192
+ };
193
+ readonly characterCards: {
194
+ readonly type: "array";
195
+ readonly maxItems: 3;
196
+ readonly items: {
197
+ readonly type: "object";
198
+ readonly properties: {
199
+ readonly alias: {
200
+ type: string;
201
+ maxLength: number;
202
+ };
203
+ readonly tagline: {
204
+ type: string;
205
+ maxLength: number;
206
+ };
207
+ readonly statHook: {
208
+ readonly type: "string";
209
+ readonly maxLength: 60;
210
+ };
211
+ };
212
+ };
213
+ };
214
+ readonly dayMicroStories: {
215
+ readonly type: "array";
216
+ readonly maxItems: 5;
217
+ readonly items: {
218
+ readonly type: "object";
219
+ readonly properties: {
220
+ readonly date: {
221
+ readonly type: "string";
222
+ readonly maxLength: 10;
223
+ };
224
+ readonly line: {
225
+ type: string;
226
+ maxLength: number;
227
+ };
228
+ };
229
+ };
230
+ };
231
+ readonly shareLine: {
64
232
  readonly type: "string";
65
- readonly maxLength: 120;
233
+ readonly maxLength: 160;
234
+ };
235
+ readonly hashtags: {
236
+ readonly type: "array";
237
+ readonly maxItems: 3;
238
+ readonly items: {
239
+ readonly type: "string";
240
+ readonly maxLength: 24;
241
+ };
242
+ };
243
+ readonly counterfactuals: {
244
+ readonly type: "array";
245
+ readonly maxItems: 2;
246
+ readonly items: {
247
+ readonly type: "object";
248
+ readonly properties: {
249
+ readonly text: {
250
+ type: string;
251
+ maxLength: number;
252
+ };
253
+ };
254
+ };
66
255
  };
67
256
  };
68
257
  };