kakaotalk-chat-analyzer 0.2.19 → 0.2.21
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.
- package/dist/src/aggregator.d.ts +17 -0
- package/dist/src/aggregator.js +290 -87
- package/dist/src/aggregator.js.map +1 -1
- package/dist/src/bubble-layout.d.ts +11 -0
- package/dist/src/bubble-layout.js +40 -0
- package/dist/src/bubble-layout.js.map +1 -0
- package/dist/src/keyword-counter.d.ts +2 -0
- package/dist/src/keyword-counter.js +6 -0
- package/dist/src/keyword-counter.js.map +1 -1
- package/dist/src/repeat-phrase-counter.d.ts +8 -0
- package/dist/src/repeat-phrase-counter.js +33 -0
- package/dist/src/repeat-phrase-counter.js.map +1 -0
- package/dist/src/report-enrichment.d.ts +5 -0
- package/dist/src/report-enrichment.js +105 -0
- package/dist/src/report-enrichment.js.map +1 -0
- package/dist/src/report-story.d.ts +1 -1
- package/dist/src/report-story.js +6 -5
- package/dist/src/report-story.js.map +1 -1
- package/dist/src/report.js +119 -23
- package/dist/src/report.js.map +1 -1
- package/dist/src/room-events.d.ts +2 -10
- package/dist/src/room-events.js +2 -34
- package/dist/src/room-events.js.map +1 -1
- package/dist/src/story.d.ts +5 -1
- package/dist/src/story.js +63 -16
- package/dist/src/story.js.map +1 -1
- package/dist/src/system-notices.d.ts +26 -0
- package/dist/src/system-notices.js +166 -0
- package/dist/src/system-notices.js.map +1 -0
- package/dist/src/types.d.ts +54 -3
- package/dist/src/version.d.ts +2 -2
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 카카오톡 CSV 시스템·운영 알림 (본문 키워드와 분리 집계) */
|
|
2
|
+
export type SystemNoticeKind = "join" | "leave" | "deleted" | "hidden" | "kick" | "slowModeOn" | "slowModeOff" | "subManager" | "manager" | "shopSearch" | "photoBundle";
|
|
3
|
+
/** @deprecated */
|
|
4
|
+
export type RoomEventKind = "join" | "leave";
|
|
5
|
+
export declare const SYSTEM_NOTICE_KEYWORD_STOP: Set<string>;
|
|
6
|
+
/** 오픈채팅 환영·규칙 카피페asta — 키워드·반복 문구에서 제외 */
|
|
7
|
+
export declare function isOpenChatBoilerplate(text: string): boolean;
|
|
8
|
+
/** @deprecated */
|
|
9
|
+
export declare const ROOM_EVENT_KEYWORD_STOP: Set<string>;
|
|
10
|
+
export declare function normalizeNoticeLine(line: string): string;
|
|
11
|
+
export declare function detectSystemNoticeLine(line: string): SystemNoticeKind | null;
|
|
12
|
+
/** @deprecated */
|
|
13
|
+
export declare function detectSystemNotice(message: string): SystemNoticeKind | null;
|
|
14
|
+
export declare function detectRoomEvent(message: string): RoomEventKind | null;
|
|
15
|
+
export declare function isSystemNoticeMessage(message: string): boolean;
|
|
16
|
+
export declare function isRoomEventMessage(message: string): boolean;
|
|
17
|
+
export interface MessageAnalysisSplit {
|
|
18
|
+
/** 키워드·본문 통계에 쓸 사용자 텍스트 */
|
|
19
|
+
userText: string;
|
|
20
|
+
notices: SystemNoticeKind[];
|
|
21
|
+
shopSearchTags: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function extractShopSearchTag(line: string): string | null;
|
|
24
|
+
/** 멀티라인·CSV 꼬리에서 시스템 알림 분리 */
|
|
25
|
+
export declare function splitMessageForAnalysis(message: string): MessageAnalysisSplit;
|
|
26
|
+
export declare const SYSTEM_NOTICE_LABELS: Record<SystemNoticeKind, string>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
const JOIN_LINE = /^(?:.+님이\s*)?들어왔습니다\.?$|^.+님이\s+들어왔습니다\.?$/u;
|
|
2
|
+
const LEAVE_LINE = /^(?:.+님이\s*)?나갔습니다\.?$|^.+님이\s+나갔습니다\.?$/u;
|
|
3
|
+
const DELETED_LINE = /^메시지가\s+삭제되었습니다\.?$/u;
|
|
4
|
+
const HIDDEN_LINE = /^관리자가\s+메시지를\s+가렸습니다\.?$/u;
|
|
5
|
+
const KICK_LINE = /^.{0,48}님을\s*(?:내)?보냈습니다\.?$/u;
|
|
6
|
+
const SLOW_ON_LINE = /^관리자만\s+말하기\s+기능이\s+활성화되었습니다\.?$/u;
|
|
7
|
+
const SLOW_OFF_LINE = /^관리자만\s+말하기\s+기능이\s+해제되었습니다\.?$/u;
|
|
8
|
+
const SUB_MANAGER_LINE = /^.+님이\s+부방장이\s+되었습니다\.?$/u;
|
|
9
|
+
const MANAGER_LINE = /^.+님이\s+방장이\s+되었습니다\.?$/u;
|
|
10
|
+
const SHOP_SEARCH_LINE = /^샵검색:\s*(.+)$/u;
|
|
11
|
+
const PHOTO_BUNDLE_LINE = /^사진\s+\d+\s*장$/u;
|
|
12
|
+
/** CSV 연속 줄에 붙는 시스템 꼬리 (`,"","…"`) */
|
|
13
|
+
const EMBEDDED_SYS_RE = /,\s*"",\s*"([^"]+)"/g;
|
|
14
|
+
export const SYSTEM_NOTICE_KEYWORD_STOP = new Set([
|
|
15
|
+
"들어왔습니다",
|
|
16
|
+
"나갔습니다",
|
|
17
|
+
"삭제되었습니다",
|
|
18
|
+
"가렸습니다",
|
|
19
|
+
"메시지가",
|
|
20
|
+
"보냈습니다",
|
|
21
|
+
"활성화되었습니다",
|
|
22
|
+
"해제되었습니다",
|
|
23
|
+
"부방장이",
|
|
24
|
+
"방장이",
|
|
25
|
+
"샵검색",
|
|
26
|
+
]);
|
|
27
|
+
const OPEN_CHAT_WELCOME_RE = /반가워[!]?\s*닉\s*옆에\s*정치성향/u;
|
|
28
|
+
const OPEN_CHAT_RULE_RE = /(초중반\s*가리|강퇴\s*기준|비속어|정치성향\s*라벨|초중반가려)/u;
|
|
29
|
+
/** 오픈채팅 환영·규칙 카피페asta — 키워드·반복 문구에서 제외 */
|
|
30
|
+
export function isOpenChatBoilerplate(text) {
|
|
31
|
+
const t = text.trim().replace(/\s+/g, " ");
|
|
32
|
+
if (t.length < 24)
|
|
33
|
+
return false;
|
|
34
|
+
if (OPEN_CHAT_WELCOME_RE.test(t))
|
|
35
|
+
return true;
|
|
36
|
+
return OPEN_CHAT_RULE_RE.test(t) && t.length >= 48;
|
|
37
|
+
}
|
|
38
|
+
/** @deprecated */
|
|
39
|
+
export const ROOM_EVENT_KEYWORD_STOP = SYSTEM_NOTICE_KEYWORD_STOP;
|
|
40
|
+
export function normalizeNoticeLine(line) {
|
|
41
|
+
return line
|
|
42
|
+
.trim()
|
|
43
|
+
.replace(/^"+|"+$/g, "")
|
|
44
|
+
.replace(/\s+/g, " ");
|
|
45
|
+
}
|
|
46
|
+
export function detectSystemNoticeLine(line) {
|
|
47
|
+
const t = normalizeNoticeLine(line);
|
|
48
|
+
if (!t)
|
|
49
|
+
return null;
|
|
50
|
+
if (DELETED_LINE.test(t))
|
|
51
|
+
return "deleted";
|
|
52
|
+
if (HIDDEN_LINE.test(t))
|
|
53
|
+
return "hidden";
|
|
54
|
+
if (SLOW_ON_LINE.test(t))
|
|
55
|
+
return "slowModeOn";
|
|
56
|
+
if (SLOW_OFF_LINE.test(t))
|
|
57
|
+
return "slowModeOff";
|
|
58
|
+
if (SUB_MANAGER_LINE.test(t))
|
|
59
|
+
return "subManager";
|
|
60
|
+
if (MANAGER_LINE.test(t))
|
|
61
|
+
return "manager";
|
|
62
|
+
if (SHOP_SEARCH_LINE.test(t))
|
|
63
|
+
return "shopSearch";
|
|
64
|
+
if (PHOTO_BUNDLE_LINE.test(t))
|
|
65
|
+
return "photoBundle";
|
|
66
|
+
if (KICK_LINE.test(t) && !/선물과\s+메시지를\s+보냈습니다/.test(t))
|
|
67
|
+
return "kick";
|
|
68
|
+
if (LEAVE_LINE.test(t))
|
|
69
|
+
return "leave";
|
|
70
|
+
if (JOIN_LINE.test(t))
|
|
71
|
+
return "join";
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/** @deprecated */
|
|
75
|
+
export function detectSystemNotice(message) {
|
|
76
|
+
return detectSystemNoticeLine(message);
|
|
77
|
+
}
|
|
78
|
+
export function detectRoomEvent(message) {
|
|
79
|
+
const kind = detectSystemNoticeLine(message);
|
|
80
|
+
if (kind === "join" || kind === "leave")
|
|
81
|
+
return kind;
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
export function isSystemNoticeMessage(message) {
|
|
85
|
+
return splitMessageForAnalysis(message).notices.length > 0;
|
|
86
|
+
}
|
|
87
|
+
export function isRoomEventMessage(message) {
|
|
88
|
+
return isSystemNoticeMessage(message);
|
|
89
|
+
}
|
|
90
|
+
function extractEmbeddedSystemLines(raw) {
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const m of raw.matchAll(EMBEDDED_SYS_RE)) {
|
|
93
|
+
const body = m[1];
|
|
94
|
+
if (body)
|
|
95
|
+
out.push(body);
|
|
96
|
+
}
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
export function extractShopSearchTag(line) {
|
|
100
|
+
const t = normalizeNoticeLine(line);
|
|
101
|
+
const m = t.match(SHOP_SEARCH_LINE);
|
|
102
|
+
if (!m?.[1])
|
|
103
|
+
return null;
|
|
104
|
+
return m[1].trim().slice(0, 80);
|
|
105
|
+
}
|
|
106
|
+
/** 멀티라인·CSV 꼬리에서 시스템 알림 분리 */
|
|
107
|
+
export function splitMessageForAnalysis(message) {
|
|
108
|
+
const notices = [];
|
|
109
|
+
const shopSearchTags = [];
|
|
110
|
+
const userParts = [];
|
|
111
|
+
for (const rawLine of message.split("\n")) {
|
|
112
|
+
const line = normalizeNoticeLine(rawLine.replace(/,\s*"",\s*"/g, "").replace(/"$/g, ""));
|
|
113
|
+
if (!line)
|
|
114
|
+
continue;
|
|
115
|
+
if (pushDetectedLine(line, notices, shopSearchTags))
|
|
116
|
+
continue;
|
|
117
|
+
userParts.push(rawLine);
|
|
118
|
+
}
|
|
119
|
+
const userText = userParts.join("\n").trim();
|
|
120
|
+
const collapsed = collapseModerationTails(notices, userText.length > 0);
|
|
121
|
+
return { userText, notices: collapsed, shopSearchTags };
|
|
122
|
+
}
|
|
123
|
+
/** 본문 뒤 CSV 꼬리(가림·삭제)는 한 번만 hidden 으로 집계 */
|
|
124
|
+
function collapseModerationTails(notices, hasUserText) {
|
|
125
|
+
if (!hasUserText)
|
|
126
|
+
return notices;
|
|
127
|
+
const out = [];
|
|
128
|
+
let moderation = false;
|
|
129
|
+
for (const kind of notices) {
|
|
130
|
+
if (kind === "hidden" || kind === "deleted") {
|
|
131
|
+
if (!moderation) {
|
|
132
|
+
out.push("hidden");
|
|
133
|
+
moderation = true;
|
|
134
|
+
}
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
out.push(kind);
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
}
|
|
141
|
+
function pushDetectedLine(line, notices, shopSearchTags) {
|
|
142
|
+
const kind = detectSystemNoticeLine(line);
|
|
143
|
+
if (!kind)
|
|
144
|
+
return false;
|
|
145
|
+
notices.push(kind);
|
|
146
|
+
if (kind === "shopSearch") {
|
|
147
|
+
const tag = extractShopSearchTag(line);
|
|
148
|
+
if (tag)
|
|
149
|
+
shopSearchTags.push(tag);
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
export const SYSTEM_NOTICE_LABELS = {
|
|
154
|
+
join: "들어왔습니다 (입장)",
|
|
155
|
+
leave: "나갔습니다 (퇴장)",
|
|
156
|
+
deleted: "메시지가 삭제되었습니다",
|
|
157
|
+
hidden: "관리자가 메시지를 가렸습니다",
|
|
158
|
+
kick: "님을보냈습니다 (강퇴)",
|
|
159
|
+
slowModeOn: "관리자만 말하기 (켜짐)",
|
|
160
|
+
slowModeOff: "관리자만 말하기 (꺼짐)",
|
|
161
|
+
subManager: "부방장 임명",
|
|
162
|
+
manager: "방장 임명",
|
|
163
|
+
shopSearch: "샵검색",
|
|
164
|
+
photoBundle: "사진 묶음",
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=system-notices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-notices.js","sourceRoot":"","sources":["../../src/system-notices.ts"],"names":[],"mappings":"AAiBA,MAAM,SAAS,GACb,6CAA6C,CAAC;AAChD,MAAM,UAAU,GACd,2CAA2C,CAAC;AAC9C,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAC5C,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,SAAS,GAAG,+BAA+B,CAAC;AAClD,MAAM,YAAY,GAAG,mCAAmC,CAAC;AACzD,MAAM,aAAa,GAAG,kCAAkC,CAAC;AACzD,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AACrD,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAChD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAC1C,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAE5C,sCAAsC;AACtC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AAE/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IAChD,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,UAAU;IACV,SAAS;IACT,MAAM;IACN,KAAK;IACL,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AACxD,MAAM,iBAAiB,GAAG,yCAAyC,CAAC;AAEpE,0CAA0C;AAC1C,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,uBAAuB,GAAG,0BAA0B,CAAC;AAElE,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI;SACR,IAAI,EAAE;SACN,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC;IAChD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAClD,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC;IACpD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACtE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kBAAkB;AAClB,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC;AASD,SAAS,0BAA0B,CAAC,GAAW;IAC7C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC;YAAE,SAAS;QAC9D,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAC1D,CAAC;AAED,4CAA4C;AAC5C,SAAS,uBAAuB,CAAC,OAA2B,EAAE,WAAoB;IAChF,IAAI,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC;IACjC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnB,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YACD,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,OAA2B,EAC3B,cAAwB;IAExB,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG;YAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAqC;IACpE,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,YAAY;IACnB,OAAO,EAAE,cAAc;IACvB,MAAM,EAAE,iBAAiB;IACzB,IAAI,EAAE,cAAc;IACpB,UAAU,EAAE,eAAe;IAC3B,WAAW,EAAE,eAAe;IAC5B,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,OAAO;CACrB,CAAC"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -46,17 +46,30 @@ export interface CountItem {
|
|
|
46
46
|
label: string;
|
|
47
47
|
count: number;
|
|
48
48
|
}
|
|
49
|
-
/** 카카오톡
|
|
49
|
+
/** 카카오톡 시스템·운영 알림 집계 */
|
|
50
50
|
export interface RoomEventStats {
|
|
51
51
|
joinCount: number;
|
|
52
52
|
leaveCount: number;
|
|
53
53
|
deletedCount: number;
|
|
54
|
-
|
|
54
|
+
hiddenCount: number;
|
|
55
|
+
kickCount: number;
|
|
56
|
+
slowModeOnCount: number;
|
|
57
|
+
slowModeOffCount: number;
|
|
58
|
+
subManagerCount: number;
|
|
59
|
+
managerCount: number;
|
|
60
|
+
shopSearchCount: number;
|
|
61
|
+
photoBundleCount: number;
|
|
55
62
|
total: number;
|
|
56
|
-
/** 전체 메시지 대비 비율(%) */
|
|
57
63
|
joinSharePercent: number;
|
|
58
64
|
leaveSharePercent: number;
|
|
59
65
|
deletedSharePercent: number;
|
|
66
|
+
hiddenSharePercent: number;
|
|
67
|
+
kickSharePercent: number;
|
|
68
|
+
}
|
|
69
|
+
/** 동일 문구 반복(카피페asta·환영문 등) */
|
|
70
|
+
export interface RepeatedPhraseStat {
|
|
71
|
+
label: string;
|
|
72
|
+
count: number;
|
|
60
73
|
}
|
|
61
74
|
export interface DailyCount {
|
|
62
75
|
date: string;
|
|
@@ -169,6 +182,30 @@ export interface ReportInsights {
|
|
|
169
182
|
uniqueDomainCount: number;
|
|
170
183
|
/** 응답 간격 변동계수(σ/μ, 무차원). 클수록 템포 들쭉날쭉 */
|
|
171
184
|
replyGapCoeffVariation: number | null;
|
|
185
|
+
/** 키워드 토큰 다양성(유형÷히트, %) — 높을수록 단어가 고르게 퍼짐 */
|
|
186
|
+
lexicalTypeRichnessPercent: number | null;
|
|
187
|
+
}
|
|
188
|
+
/** 대화 템포 한 줄 라벨(리포트 배지용) */
|
|
189
|
+
export interface ConversationPace {
|
|
190
|
+
label: string;
|
|
191
|
+
emoji: string;
|
|
192
|
+
detail: string;
|
|
193
|
+
}
|
|
194
|
+
/** 기간 구간별 메시지·활동일(처음/마지막 7일 vs 전체) */
|
|
195
|
+
export interface ActivityArcSegment {
|
|
196
|
+
id: "head" | "tail" | "whole";
|
|
197
|
+
label: string;
|
|
198
|
+
messages: number;
|
|
199
|
+
activeDays: number;
|
|
200
|
+
}
|
|
201
|
+
/** 일별 입퇴장·가림·신규 참여(운영·유입 펄스) */
|
|
202
|
+
export interface DailyRoomPulse {
|
|
203
|
+
date: string;
|
|
204
|
+
join: number;
|
|
205
|
+
leave: number;
|
|
206
|
+
hidden: number;
|
|
207
|
+
kick: number;
|
|
208
|
+
newSenders: number;
|
|
172
209
|
}
|
|
173
210
|
export interface ReportData {
|
|
174
211
|
generatedAt: string;
|
|
@@ -216,6 +253,20 @@ export interface ReportData {
|
|
|
216
253
|
domains: CountItem[];
|
|
217
254
|
keywords: CountItem[];
|
|
218
255
|
roomEvents: RoomEventStats;
|
|
256
|
+
/** 3회 이상 동일 본문 */
|
|
257
|
+
repeatedPhrases: RepeatedPhraseStat[];
|
|
258
|
+
/** 샵검색 #주제 상위 */
|
|
259
|
+
shopSearchTopics: CountItem[];
|
|
260
|
+
/** ㅋㅎ만 있는 짧은 리액션 */
|
|
261
|
+
pureLaughMessages: number;
|
|
262
|
+
/** 템포·패턴 한 줄 요약 */
|
|
263
|
+
conversationPace: ConversationPace;
|
|
264
|
+
/** 평소 대비 메시지 급증일 */
|
|
265
|
+
burstDays: DailyCount[];
|
|
266
|
+
/** 처음·마지막 7일 vs 전체 비교 */
|
|
267
|
+
activityArc: ActivityArcSegment[];
|
|
268
|
+
/** 일별 운영·유입 펄스 */
|
|
269
|
+
roomPulse: DailyRoomPulse[];
|
|
219
270
|
/** 리포트 상단에 보여줄 한 줄 인사이트(한국어) */
|
|
220
271
|
highlights: string[];
|
|
221
272
|
/** Wrapped·챕터·페르소나 등 스토리 레이어 */
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.2.
|
|
2
|
-
export declare const USER_AGENT = "kakaotalk-chat-analyzer/0.2.
|
|
1
|
+
export declare const VERSION = "0.2.21";
|
|
2
|
+
export declare const USER_AGENT = "kakaotalk-chat-analyzer/0.2.21";
|
package/dist/src/version.js
CHANGED
package/package.json
CHANGED