@zahidzorbaz/tudun 1.2.3 → 1.2.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zahidzorbaz/tudun",
3
- "version": "1.2.3",
3
+ "version": "1.2.4",
4
4
  "description": "Tudun — Personal assistant MCP server for Google Calendar, Tasks, Contacts, and Gmail",
5
5
  "type": "module",
6
6
  "main": "dist/interface/cli/index.js",
@@ -1,57 +0,0 @@
1
- export interface StyleProfile {
2
- contactName: string;
3
- contactNumber: string;
4
- analyzedMessageCount: number;
5
- confidence: number;
6
- length: {
7
- avgWordsPerMessage: number;
8
- medianWords: number;
9
- singleWordReplyRatio: number;
10
- distribution: {
11
- ultraShort: number;
12
- short: number;
13
- medium: number;
14
- long: number;
15
- paragraph: number;
16
- };
17
- };
18
- structure: {
19
- multiBubbleRatio: number;
20
- avgBurstSize: number;
21
- };
22
- language: {
23
- abbreviationRate: number;
24
- turkishCharRate: number;
25
- codeSwitchRate: number;
26
- commonBorrowings: string[];
27
- repeatedLetterRate: number;
28
- };
29
- formality: {
30
- compositeScore: number;
31
- capitalizationScore: number;
32
- punctuationScore: number;
33
- noPunctuationRate: number;
34
- };
35
- emoji: {
36
- emojiRate: number;
37
- emojiMessageRatio: number;
38
- topEmojis: string[];
39
- emojiOnlyMessageRatio: number;
40
- };
41
- timing: {
42
- medianResponseTimeSec: number;
43
- activeHours: number[];
44
- peakHour: number;
45
- };
46
- patterns: {
47
- greetingStyle: string;
48
- greetingExamples: string[];
49
- closingStyle: string;
50
- closingExamples: string[];
51
- ackStyle: string;
52
- ackExamples: string[];
53
- signatureWords: string[];
54
- };
55
- exampleMessages: string[];
56
- writingInstructions: string;
57
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=style-profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style-profile.js","sourceRoot":"","sources":["../../../src/domain/dto/style-profile.ts"],"names":[],"mappings":""}
@@ -1,5 +0,0 @@
1
- import type { WhatsAppMessage } from '../dto/whatsapp.js';
2
- import type { StyleProfile } from '../dto/style-profile.js';
3
- export interface IStyleAnalyzer {
4
- analyze(contactName: string, contactNumber: string, messages: WhatsAppMessage[]): StyleProfile;
5
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=style-analyzer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style-analyzer.js","sourceRoot":"","sources":["../../../src/domain/ports/style-analyzer.ts"],"names":[],"mappings":""}
@@ -1,6 +0,0 @@
1
- export declare const ABBREVIATIONS: Set<string>;
2
- export declare const GREETING_PATTERNS: RegExp[];
3
- export declare const CLOSING_PATTERNS: RegExp[];
4
- export declare const ACK_PATTERNS: RegExp[];
5
- export declare const ENGLISH_BORROWS: Set<string>;
6
- export declare const STOP_WORDS: Set<string>;
@@ -1,66 +0,0 @@
1
- // Türkçe WhatsApp kısaltmaları
2
- export const ABBREVIATIONS = new Set([
3
- 'slm', 'mrb', 'mrh', 'nbr', 'naber', 'nblr', 'tmm', 'tm', 'tşk', 'tsk',
4
- 'grskz', 'grsr', 'hg', 'hb', 'hgld', 'sa', 'as', 'aeo',
5
- 'ins', 'mslm', 'knk', 'krdş', 'krd', 'abi', 'ab', 'abla', 'abl',
6
- 'hll', 'eyv', 'eyw', 'sgn', 'bb', 'ii', 'kk', 'ok', 'okey', 'oki',
7
- 'dc', 'evt', 'hyr', 'blm', 'grm', 'glcm', 'gldm', 'gdrm',
8
- 'pki', 'pk', 'bi', 'bdk', 'yok', 'var', 'he', 'hee', 'heh',
9
- 'sjsj', 'asjd', 'kdkd', 'haha', 'hihi', 'lol',
10
- 'iig', 'ig', 'gnyd', 'gnydn', 'iyi', 'kib', 'hoşçkl',
11
- 'sne', 'bnce', 'bence', 'aslnda', 'ztn', 'btn', 'bskt',
12
- 'tabi', 'tabii', 'olr', 'olmz', 'bilm', 'bilmm', 'grcrz',
13
- 'ypcm', 'yprm', 'yaprm', 'gtrm', 'gtrcrm', 'alcm', 'alcrm',
14
- ]);
15
- // Selamlama kalıpları (mesaj başında kontrol edilir)
16
- export const GREETING_PATTERNS = [
17
- /^(merhaba|selam|mrb|slm|hey|heyy+)\b/i,
18
- /^(gunaydin|günaydın|gnyd|gnydn)\b/i,
19
- /^(iyi\s*(aksamlar|akşamlar))\b/i,
20
- /^(sa|selamun?\s*aleykum|selamünaleyküm)\b/i,
21
- /^(naber|nbr|nblr|ne\s*haber|nasilsin|nasılsın)\b/i,
22
- /^(hg|hosgeldin|hoşgeldin)\b/i,
23
- ];
24
- // Kapanış kalıpları (mesaj başında kontrol edilir)
25
- export const CLOSING_PATTERNS = [
26
- /^(gorusuruz|görüşürüz|grskz|grsr)\b/i,
27
- /^(bb|bye|byebye|bay\s*bay)\b/i,
28
- /^(hoscakal|hoşçakal|hoşçkl)\b/i,
29
- /^(iyi\s*geceler|iig|ig)\b/i,
30
- /^(kib|kendine\s*iyi\s*bak)\b/i,
31
- /^(hayirli\s*geceler|hayırlı\s*geceler)\b/i,
32
- /^(iyi\s*gunler|iyi\s*günler)\b/i,
33
- ];
34
- // Onay kalıpları
35
- export const ACK_PATTERNS = [
36
- /^(tamam|tmm|tm)\b/i,
37
- /^(ok|okey|oki|okay)\b/i,
38
- /^(anladim|anladım|anldm)\b/i,
39
- /^(evet|evt|he|hee|heh)\b/i,
40
- /^(olur|olr|tabii?|tabi)\b/i,
41
- /^(peki|pk|pki)\b/i,
42
- /^(dogru|doğru)\b/i,
43
- /^(aynen|ayn)\b/i,
44
- /^(harika|süper|super|muhteşem|muhtesem)\b/i,
45
- ];
46
- // Yaygın İngilizce ödünç kelimeler (code-switch tespiti için)
47
- export const ENGLISH_BORROWS = new Set([
48
- 'meeting', 'deadline', 'update', 'cancel', 'call', 'mail', 'email',
49
- 'sorry', 'thanks', 'thank', 'please', 'check', 'share', 'link',
50
- 'plan', 'team', 'group', 'chat', 'message', 'online', 'offline',
51
- 'ready', 'done', 'wait', 'send', 'forward', 'delete', 'edit',
52
- 'join', 'leave', 'start', 'stop', 'open', 'close', 'fix', 'bug',
53
- 'test', 'push', 'pull', 'merge', 'deploy', 'build', 'run',
54
- 'cool', 'nice', 'great', 'perfect', 'awesome', 'love', 'like',
55
- 'bro', 'dude', 'man', 'guys', 'btw', 'fyi', 'asap', 'lol',
56
- ]);
57
- // Türkçe stop words (signatureWords hesaplamasında filtrelenir)
58
- export const STOP_WORDS = new Set([
59
- 'bir', 'bu', 'şu', 'o', 've', 'ile', 'de', 'da', 'mi', 'mu', 'mı', 'mü',
60
- 'ben', 'sen', 'biz', 'siz', 'ne', 'nasıl', 'neden', 'nere', 'kim',
61
- 'ama', 'fakat', 'ancak', 'veya', 'ya', 'ki', 'için', 'gibi', 'kadar',
62
- 'daha', 'çok', 'en', 'her', 'hiç', 'var', 'yok', 'olan', 'olur',
63
- 'ise', 'diğer', 'öyle', 'böyle', 'şöyle', 'sonra', 'önce', 'şimdi',
64
- 'zaman', 'yani', 'hani', 'işte', 'evet', 'hayır', 'tamam', 'iyi',
65
- ]);
66
- //# sourceMappingURL=dictionaries.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dictionaries.js","sourceRoot":"","sources":["../../../src/infrastructure/analysis/dictionaries.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export { StyleAnalyzerService } from './style-analyzer.service.js';
@@ -1,2 +0,0 @@
1
- export { StyleAnalyzerService } from './style-analyzer.service.js';
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/analysis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -1,21 +0,0 @@
1
- import type { IStyleAnalyzer } from '../../domain/ports/style-analyzer.js';
2
- import type { WhatsAppMessage } from '../../domain/dto/whatsapp.js';
3
- import type { StyleProfile } from '../../domain/dto/style-profile.js';
4
- export declare class StyleAnalyzerService implements IStyleAnalyzer {
5
- analyze(contactName: string, contactNumber: string, messages: WhatsAppMessage[]): StyleProfile;
6
- private analyzeLength;
7
- private analyzeStructure;
8
- private analyzeLanguage;
9
- private analyzeFormality;
10
- private analyzeEmoji;
11
- private analyzeTiming;
12
- private analyzePatterns;
13
- private selectExamples;
14
- private calculateConfidence;
15
- private generateInstructions;
16
- private buildMinimalProfile;
17
- private getWords;
18
- private countWords;
19
- private mean;
20
- private median;
21
- }
@@ -1,456 +0,0 @@
1
- import { ABBREVIATIONS, GREETING_PATTERNS, CLOSING_PATTERNS, ACK_PATTERNS, ENGLISH_BORROWS, STOP_WORDS, } from './dictionaries.js';
2
- const EMOJI_REGEX = /\p{Emoji_Presentation}|\p{Extended_Pictographic}/gu;
3
- const TR_SPECIAL_CHARS = /[çğıöşüÇĞİÖŞÜ]/g;
4
- const TR_DROPPABLE_CHARS = /[cgiosuCGIOSU]/g;
5
- const REPEATED_LETTER_REGEX = /(.)\1{2,}/;
6
- const PUNCTUATION_END = /[.!?;:…]$/;
7
- const BURST_THRESHOLD_SEC = 60;
8
- export class StyleAnalyzerService {
9
- analyze(contactName, contactNumber, messages) {
10
- // Sadece kullanıcının (fromMe) mesajlarını analiz et
11
- const myMessages = messages
12
- .filter((m) => m.fromMe && m.body.trim().length > 0)
13
- .sort((a, b) => a.timestamp - b.timestamp);
14
- if (myMessages.length < 5) {
15
- return this.buildMinimalProfile(contactName, contactNumber, myMessages);
16
- }
17
- const length = this.analyzeLength(myMessages);
18
- const structure = this.analyzeStructure(myMessages);
19
- const language = this.analyzeLanguage(myMessages);
20
- const formality = this.analyzeFormality(myMessages);
21
- const emoji = this.analyzeEmoji(myMessages);
22
- const timing = this.analyzeTiming(messages);
23
- const patterns = this.analyzePatterns(myMessages, messages);
24
- const exampleMessages = this.selectExamples(myMessages);
25
- const confidence = this.calculateConfidence(myMessages.length);
26
- const writingInstructions = this.generateInstructions(contactName, length, structure, language, formality, emoji, patterns);
27
- return {
28
- contactName,
29
- contactNumber,
30
- analyzedMessageCount: myMessages.length,
31
- confidence,
32
- length,
33
- structure,
34
- language,
35
- formality,
36
- emoji,
37
- timing,
38
- patterns,
39
- exampleMessages,
40
- writingInstructions,
41
- };
42
- }
43
- // ── Length Metrics ──────────────────────────────────────
44
- analyzeLength(msgs) {
45
- const wordCounts = msgs.map((m) => this.countWords(m.body));
46
- const sorted = [...wordCounts].sort((a, b) => a - b);
47
- const total = msgs.length;
48
- return {
49
- avgWordsPerMessage: this.mean(wordCounts),
50
- medianWords: this.median(sorted),
51
- singleWordReplyRatio: wordCounts.filter((w) => w <= 1).length / total,
52
- distribution: {
53
- ultraShort: wordCounts.filter((w) => w >= 1 && w <= 3).length / total,
54
- short: wordCounts.filter((w) => w >= 4 && w <= 10).length / total,
55
- medium: wordCounts.filter((w) => w >= 11 && w <= 30).length / total,
56
- long: wordCounts.filter((w) => w >= 31 && w <= 80).length / total,
57
- paragraph: wordCounts.filter((w) => w > 80).length / total,
58
- },
59
- };
60
- }
61
- // ── Structure Metrics ──────────────────────────────────
62
- analyzeStructure(msgs) {
63
- let bursts = 0;
64
- let totalBurstMessages = 0;
65
- let currentBurstSize = 1;
66
- let inBurst = false;
67
- for (let i = 1; i < msgs.length; i++) {
68
- const gap = msgs[i].timestamp - msgs[i - 1].timestamp;
69
- if (gap < BURST_THRESHOLD_SEC) {
70
- currentBurstSize++;
71
- if (!inBurst) {
72
- inBurst = true;
73
- bursts++;
74
- }
75
- }
76
- else {
77
- if (inBurst) {
78
- totalBurstMessages += currentBurstSize;
79
- currentBurstSize = 1;
80
- inBurst = false;
81
- }
82
- }
83
- }
84
- if (inBurst)
85
- totalBurstMessages += currentBurstSize;
86
- const totalTurns = msgs.length;
87
- return {
88
- multiBubbleRatio: totalTurns > 0 ? bursts / totalTurns : 0,
89
- avgBurstSize: bursts > 0 ? totalBurstMessages / bursts : 1,
90
- };
91
- }
92
- // ── Language Metrics ───────────────────────────────────
93
- analyzeLanguage(msgs) {
94
- const allWords = msgs.flatMap((m) => this.getWords(m.body));
95
- const allText = msgs.map((m) => m.body).join(' ');
96
- const totalWords = allWords.length || 1;
97
- // Kısaltma oranı
98
- const abbrCount = allWords.filter((w) => ABBREVIATIONS.has(w.toLowerCase())).length;
99
- // Türkçe karakter kullanımı
100
- const trChars = (allText.match(TR_SPECIAL_CHARS) || []).length;
101
- const droppable = (allText.match(TR_DROPPABLE_CHARS) || []).length;
102
- const turkishCharRate = trChars + droppable > 0 ? trChars / (trChars + droppable) : 0.5;
103
- // Code-switching
104
- const enWords = allWords.filter((w) => ENGLISH_BORROWS.has(w.toLowerCase()));
105
- const borrowCounts = new Map();
106
- for (const w of enWords) {
107
- const lower = w.toLowerCase();
108
- borrowCounts.set(lower, (borrowCounts.get(lower) || 0) + 1);
109
- }
110
- const commonBorrowings = [...borrowCounts.entries()]
111
- .sort((a, b) => b[1] - a[1])
112
- .slice(0, 10)
113
- .map(([word]) => word);
114
- // Harf tekrarı
115
- const repeatedMsgs = msgs.filter((m) => REPEATED_LETTER_REGEX.test(m.body));
116
- return {
117
- abbreviationRate: abbrCount / totalWords,
118
- turkishCharRate: Math.round(turkishCharRate * 100) / 100,
119
- codeSwitchRate: enWords.length / totalWords,
120
- commonBorrowings,
121
- repeatedLetterRate: repeatedMsgs.length / msgs.length,
122
- };
123
- }
124
- // ── Formality Metrics ──────────────────────────────────
125
- analyzeFormality(msgs) {
126
- const total = msgs.length || 1;
127
- // Büyük harfle başlayan mesaj oranı
128
- const capsStart = msgs.filter((m) => /^[A-ZÇĞİÖŞÜ]/.test(m.body.trim())).length;
129
- // Noktalama ile biten mesaj oranı
130
- const punctEnd = msgs.filter((m) => PUNCTUATION_END.test(m.body.trim())).length;
131
- // Noktalama olmayan mesaj oranı
132
- const noPunct = msgs.filter((m) => !/[.!?,;:…]/.test(m.body)).length;
133
- const capitalizationScore = capsStart / total;
134
- const punctuationScore = punctEnd / total;
135
- const noPunctuationRate = noPunct / total;
136
- // Composite: yüksek caps + yüksek punct = formel
137
- const compositeScore = (capitalizationScore * 0.4 + punctuationScore * 0.6);
138
- return {
139
- compositeScore: Math.round(compositeScore * 100) / 100,
140
- capitalizationScore: Math.round(capitalizationScore * 100) / 100,
141
- punctuationScore: Math.round(punctuationScore * 100) / 100,
142
- noPunctuationRate: Math.round(noPunctuationRate * 100) / 100,
143
- };
144
- }
145
- // ── Emoji Metrics ──────────────────────────────────────
146
- analyzeEmoji(msgs) {
147
- const emojiMap = new Map();
148
- let totalEmojis = 0;
149
- let messagesWithEmoji = 0;
150
- let emojiOnlyMessages = 0;
151
- const total = msgs.length || 1;
152
- for (const msg of msgs) {
153
- const emojis = msg.body.match(EMOJI_REGEX) || [];
154
- if (emojis.length > 0)
155
- messagesWithEmoji++;
156
- if (msg.body.replace(EMOJI_REGEX, '').trim() === '')
157
- emojiOnlyMessages++;
158
- totalEmojis += emojis.length;
159
- for (const e of emojis) {
160
- emojiMap.set(e, (emojiMap.get(e) || 0) + 1);
161
- }
162
- }
163
- const topEmojis = [...emojiMap.entries()]
164
- .sort((a, b) => b[1] - a[1])
165
- .slice(0, 10)
166
- .map(([emoji]) => emoji);
167
- return {
168
- emojiRate: Math.round((totalEmojis / total) * 100) / 100,
169
- emojiMessageRatio: Math.round((messagesWithEmoji / total) * 100) / 100,
170
- topEmojis,
171
- emojiOnlyMessageRatio: Math.round((emojiOnlyMessages / total) * 100) / 100,
172
- };
173
- }
174
- // ── Timing Metrics ─────────────────────────────────────
175
- analyzeTiming(allMessages) {
176
- const sorted = [...allMessages].sort((a, b) => a.timestamp - b.timestamp);
177
- const responseTimes = [];
178
- const hourCounts = new Array(24).fill(0);
179
- for (let i = 1; i < sorted.length; i++) {
180
- const prev = sorted[i - 1];
181
- const curr = sorted[i];
182
- // Yanıt süresi: karşıdan mesaj → benim mesajım
183
- if (!prev.fromMe && curr.fromMe) {
184
- const gap = curr.timestamp - prev.timestamp;
185
- if (gap > 0 && gap < 86400) { // 24 saatten kısa
186
- responseTimes.push(gap);
187
- }
188
- }
189
- // Saat dağılımı (sadece kendi mesajlarım)
190
- if (curr.fromMe) {
191
- const hour = new Date(curr.timestamp * 1000).getHours();
192
- hourCounts[hour]++;
193
- }
194
- }
195
- const sortedTimes = [...responseTimes].sort((a, b) => a - b);
196
- const medianResponse = sortedTimes.length > 0 ? this.median(sortedTimes) : 0;
197
- // En aktif 5 saat
198
- const hourEntries = hourCounts
199
- .map((count, hour) => ({ hour, count }))
200
- .sort((a, b) => b.count - a.count);
201
- const activeHours = hourEntries.slice(0, 5).map((e) => e.hour);
202
- const peakHour = hourEntries[0]?.hour ?? 12;
203
- return {
204
- medianResponseTimeSec: Math.round(medianResponse),
205
- activeHours,
206
- peakHour,
207
- };
208
- }
209
- // ── Pattern Metrics ────────────────────────────────────
210
- analyzePatterns(myMsgs, allMsgs) {
211
- const greetingExamples = [];
212
- const closingExamples = [];
213
- const ackExamples = [];
214
- for (const msg of myMsgs) {
215
- const text = msg.body.trim();
216
- const lower = text.toLowerCase();
217
- for (const pattern of GREETING_PATTERNS) {
218
- if (pattern.test(lower) && !greetingExamples.includes(text)) {
219
- greetingExamples.push(text);
220
- break;
221
- }
222
- }
223
- for (const pattern of CLOSING_PATTERNS) {
224
- if (pattern.test(lower) && !closingExamples.includes(text)) {
225
- closingExamples.push(text);
226
- break;
227
- }
228
- }
229
- for (const pattern of ACK_PATTERNS) {
230
- if (pattern.test(lower) && !ackExamples.includes(text)) {
231
- ackExamples.push(text);
232
- break;
233
- }
234
- }
235
- }
236
- // Greeting style
237
- const greetingStyle = greetingExamples.length === 0
238
- ? 'none'
239
- : greetingExamples.some((g) => /merhaba|iyi\s*(günler|akşamlar)/i.test(g))
240
- ? 'formal'
241
- : greetingExamples.some((g) => /canım|aşkım|tatlım/i.test(g))
242
- ? 'affectionate'
243
- : 'casual';
244
- // Closing style
245
- const closingStyle = closingExamples.length === 0
246
- ? 'none'
247
- : closingExamples.some((g) => /iyi\s*günler|teşekkürler/i.test(g))
248
- ? 'formal'
249
- : closingExamples.some((g) => /öpüyorum|canım/i.test(g))
250
- ? 'affectionate'
251
- : 'casual';
252
- // Ack style
253
- const ackStyle = ackExamples.length === 0
254
- ? 'standard'
255
- : ackExamples.some((a) => /^(ok|tmm|tm|he|hee)$/i.test(a))
256
- ? 'minimal'
257
- : ackExamples.some((a) => /harika|süper|muhteşem/i.test(a))
258
- ? 'enthusiastic'
259
- : 'standard';
260
- // Signature words (sık kullanılan, stop word olmayan)
261
- const wordFreq = new Map();
262
- for (const msg of myMsgs) {
263
- for (const word of this.getWords(msg.body)) {
264
- const lower = word.toLowerCase();
265
- if (lower.length < 3)
266
- continue;
267
- if (STOP_WORDS.has(lower))
268
- continue;
269
- if (ABBREVIATIONS.has(lower))
270
- continue;
271
- wordFreq.set(lower, (wordFreq.get(lower) || 0) + 1);
272
- }
273
- }
274
- const signatureWords = [...wordFreq.entries()]
275
- .filter(([, count]) => count >= 3)
276
- .sort((a, b) => b[1] - a[1])
277
- .slice(0, 10)
278
- .map(([word]) => word);
279
- return {
280
- greetingStyle,
281
- greetingExamples: greetingExamples.slice(0, 5),
282
- closingStyle,
283
- closingExamples: closingExamples.slice(0, 5),
284
- ackStyle,
285
- ackExamples: ackExamples.slice(0, 5),
286
- signatureWords,
287
- };
288
- }
289
- // ── Example Messages ───────────────────────────────────
290
- selectExamples(msgs) {
291
- const examples = [];
292
- const categories = [
293
- { name: 'kisa', filter: (m) => this.countWords(m.body) <= 3 && this.countWords(m.body) >= 1 },
294
- { name: 'orta', filter: (m) => this.countWords(m.body) >= 5 && this.countWords(m.body) <= 15 },
295
- { name: 'uzun', filter: (m) => this.countWords(m.body) >= 16 },
296
- { name: 'emoji', filter: (m) => EMOJI_REGEX.test(m.body) },
297
- { name: 'soru', filter: (m) => m.body.includes('?') },
298
- ];
299
- for (const cat of categories) {
300
- const matching = msgs.filter(cat.filter);
301
- if (matching.length > 0) {
302
- // Rastgele bir örnek seç
303
- const idx = Math.floor(matching.length / 2);
304
- const text = matching[idx].body.trim();
305
- if (!examples.includes(text) && text.length <= 200) {
306
- examples.push(text);
307
- }
308
- }
309
- }
310
- // Genel örnekler ekle (toplam 10'a kadar)
311
- const step = Math.max(1, Math.floor(msgs.length / 5));
312
- for (let i = 0; i < msgs.length && examples.length < 10; i += step) {
313
- const text = msgs[i].body.trim();
314
- if (!examples.includes(text) && text.length > 0 && text.length <= 200) {
315
- examples.push(text);
316
- }
317
- }
318
- return examples;
319
- }
320
- // ── Confidence ─────────────────────────────────────────
321
- calculateConfidence(totalMessages) {
322
- // 50 mesaj = 0.3, 200 = 0.5, 500 = 0.7, 1000+ = 0.85+
323
- const conf = Math.min(totalMessages / 1000, 0.95);
324
- return Math.round(Math.max(conf, 0.1) * 100) / 100;
325
- }
326
- // ── Writing Instructions ───────────────────────────────
327
- generateInstructions(contactName, length, structure, language, formality, emoji, patterns) {
328
- const lines = [`${contactName} ile yazisirken su kurallara uy:`];
329
- // Uzunluk
330
- if (length.avgWordsPerMessage < 5) {
331
- lines.push(`- Cok kisa mesajlar yaz (ortalama ${Math.round(length.avgWordsPerMessage)} kelime)`);
332
- }
333
- else if (length.avgWordsPerMessage < 15) {
334
- lines.push(`- Orta uzunlukta mesajlar yaz (ortalama ${Math.round(length.avgWordsPerMessage)} kelime)`);
335
- }
336
- else {
337
- lines.push(`- Detayli mesajlar yaz (ortalama ${Math.round(length.avgWordsPerMessage)} kelime)`);
338
- }
339
- // Multi-bubble
340
- if (structure.multiBubbleRatio > 0.3) {
341
- lines.push(`- Art arda kisa balonlar halinde yaz (burst: ${Math.round(structure.avgBurstSize)} mesaj)`);
342
- }
343
- else {
344
- lines.push('- Tek mesajda toparla, art arda balon atma');
345
- }
346
- // Kısaltma
347
- if (language.abbreviationRate > 0.1) {
348
- lines.push('- Turkce kisaltmalar kullan: tmm, slm, nbr gibi');
349
- }
350
- else {
351
- lines.push('- Kelimeleri tam yaz, kisaltma kullanma');
352
- }
353
- // Türkçe karakter
354
- if (language.turkishCharRate < 0.3) {
355
- lines.push('- Turkce ozel karakterleri KULLANMA (c,g,i,o,s,u yaz)');
356
- }
357
- else if (language.turkishCharRate > 0.7) {
358
- lines.push('- Turkce ozel karakterleri kullan (ç,ğ,ı,ö,ş,ü)');
359
- }
360
- // Emoji
361
- if (emoji.emojiRate > 1) {
362
- lines.push(`- Bol emoji kullan (mesaj basina ~${Math.round(emoji.emojiRate)} emoji). Favoriler: ${emoji.topEmojis.slice(0, 5).join(' ')}`);
363
- }
364
- else if (emoji.emojiRate > 0.3) {
365
- lines.push(`- Ara sira emoji kullan. Favoriler: ${emoji.topEmojis.slice(0, 3).join(' ')}`);
366
- }
367
- else {
368
- lines.push('- Emoji kullanma veya cok az kullan');
369
- }
370
- // Formality
371
- if (formality.compositeScore < 0.2) {
372
- lines.push('- Cok informal yaz: buyuk harf ve noktalama kullanma');
373
- }
374
- else if (formality.compositeScore > 0.6) {
375
- lines.push('- Resmi yaz: cumle basinda buyuk harf, sonunda noktalama kullan');
376
- }
377
- // Code-switch
378
- if (language.codeSwitchRate > 0.05 && language.commonBorrowings.length > 0) {
379
- lines.push(`- Ingilizce kelimeler karistir: ${language.commonBorrowings.slice(0, 5).join(', ')}`);
380
- }
381
- // Selamlama
382
- if (patterns.greetingExamples.length > 0) {
383
- lines.push(`- Selamlama: "${patterns.greetingExamples[0]}" tarzinda`);
384
- }
385
- // Kapanış
386
- if (patterns.closingExamples.length > 0) {
387
- lines.push(`- Vedalasma: "${patterns.closingExamples[0]}" tarzinda`);
388
- }
389
- // Onay
390
- if (patterns.ackExamples.length > 0) {
391
- lines.push(`- Onay: "${patterns.ackExamples[0]}" tarzinda`);
392
- }
393
- // Signature words
394
- if (patterns.signatureWords.length > 0) {
395
- lines.push(`- Su kelimeleri sik kullan: ${patterns.signatureWords.slice(0, 5).join(', ')}`);
396
- }
397
- // Tekrarlı harf
398
- if (language.repeatedLetterRate > 0.05) {
399
- lines.push('- Vurgu icin harf tekrarla: "hayirrrr", "eveeet" gibi');
400
- }
401
- return lines.join('\n');
402
- }
403
- // ── Minimal Profile ────────────────────────────────────
404
- buildMinimalProfile(contactName, contactNumber, msgs) {
405
- return {
406
- contactName,
407
- contactNumber,
408
- analyzedMessageCount: msgs.length,
409
- confidence: 0.1,
410
- length: {
411
- avgWordsPerMessage: 0,
412
- medianWords: 0,
413
- singleWordReplyRatio: 0,
414
- distribution: { ultraShort: 0, short: 0, medium: 0, long: 0, paragraph: 0 },
415
- },
416
- structure: { multiBubbleRatio: 0, avgBurstSize: 1 },
417
- language: {
418
- abbreviationRate: 0, turkishCharRate: 0.5, codeSwitchRate: 0,
419
- commonBorrowings: [], repeatedLetterRate: 0,
420
- },
421
- formality: { compositeScore: 0.5, capitalizationScore: 0.5, punctuationScore: 0.5, noPunctuationRate: 0.5 },
422
- emoji: { emojiRate: 0, emojiMessageRatio: 0, topEmojis: [], emojiOnlyMessageRatio: 0 },
423
- timing: { medianResponseTimeSec: 0, activeHours: [], peakHour: 12 },
424
- patterns: {
425
- greetingStyle: 'none', greetingExamples: [],
426
- closingStyle: 'none', closingExamples: [],
427
- ackStyle: 'standard', ackExamples: [],
428
- signatureWords: [],
429
- },
430
- exampleMessages: msgs.slice(0, 3).map((m) => m.body),
431
- writingInstructions: `${contactName} ile konusma gecmisi yetersiz (${msgs.length} mesaj). Dogal ve samimi bir ton kullan.`,
432
- };
433
- }
434
- // ── Helpers ────────────────────────────────────────────
435
- getWords(text) {
436
- return text.split(/\s+/).filter((w) => w.length > 0);
437
- }
438
- countWords(text) {
439
- return this.getWords(text).length;
440
- }
441
- mean(arr) {
442
- if (arr.length === 0)
443
- return 0;
444
- const sum = arr.reduce((a, b) => a + b, 0);
445
- return Math.round((sum / arr.length) * 100) / 100;
446
- }
447
- median(sorted) {
448
- if (sorted.length === 0)
449
- return 0;
450
- const mid = Math.floor(sorted.length / 2);
451
- return sorted.length % 2 !== 0
452
- ? sorted[mid]
453
- : Math.round((sorted[mid - 1] + sorted[mid]) / 2);
454
- }
455
- }
456
- //# sourceMappingURL=style-analyzer.service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style-analyzer.service.js","sourceRoot":"","sources":["../../../src/infrastructure/analysis/style-analyzer.service.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { Dependencies } from '../types.js';
3
- export declare function registerAnalyzeConversationStyleTool(server: McpServer, deps: Dependencies): void;
@@ -1,57 +0,0 @@
1
- import { z } from 'zod/v4';
2
- export function registerAnalyzeConversationStyleTool(server, deps) {
3
- server.tool('analyze_conversation_style', 'Belirli bir kisinin WhatsApp yazisma stilini analiz eder. Diyalog baslatmadan once kullanilmali. Mesaj gecmisini ceker ve dil, uzunluk, emoji, selamlasma kaliplari gibi metrikleri cikarir. Sonuc olarak stil profili ve yazim talimatlari doner.', {
4
- chat_id: z.string().describe("Hedef kisinin sohbet ID'si (orn: 905551234567@c.us)"),
5
- message_limit: z.number().optional().describe('Analiz edilecek mesaj sayisi (varsayilan: 100, max: 500)'),
6
- }, async ({ chat_id, message_limit }) => {
7
- try {
8
- const limit = Math.min(message_limit ?? 100, 500);
9
- const messages = await deps.whatsappService.getMessages(chat_id, limit);
10
- if (messages.length < 5) {
11
- return {
12
- content: [{
13
- type: 'text',
14
- text: 'Yeterli mesaj bulunamadi (min 5 mesaj gerekli). Daha fazla mesaj gecmisi olan bir sohbet secin.',
15
- }],
16
- isError: true,
17
- };
18
- }
19
- const contactNumber = chat_id.replace(/@.*$/, '');
20
- // İlk gelen mesajdan isim çıkar
21
- const incomingMsg = messages.find((m) => !m.fromMe);
22
- const contactName = incomingMsg?.from ?? contactNumber;
23
- const profile = deps.styleAnalyzer.analyze(contactName, contactNumber, messages);
24
- const output = [
25
- `## Stil Profili: ${profile.contactName}`,
26
- `Analiz edilen mesaj: ${profile.analyzedMessageCount} | Guven: ${(profile.confidence * 100).toFixed(0)}%`,
27
- '',
28
- '### Yazim Talimatlari',
29
- profile.writingInstructions,
30
- '',
31
- '### Ornek Mesajlar (Few-shot)',
32
- ...profile.exampleMessages.map((m, i) => `${i + 1}. "${m}"`),
33
- '',
34
- '### Detayli Metrikler',
35
- `Uzunluk: ort ${profile.length.avgWordsPerMessage} kelime, medyan ${profile.length.medianWords}`,
36
- `Tek kelime orani: ${(profile.length.singleWordReplyRatio * 100).toFixed(0)}%`,
37
- `Multi-bubble: ${(profile.structure.multiBubbleRatio * 100).toFixed(0)}% (ort ${profile.structure.avgBurstSize.toFixed(1)} mesaj/burst)`,
38
- `Kisaltma orani: ${(profile.language.abbreviationRate * 100).toFixed(0)}%`,
39
- `Turkce karakter: ${(profile.language.turkishCharRate * 100).toFixed(0)}%`,
40
- `Code-switch: ${(profile.language.codeSwitchRate * 100).toFixed(0)}%`,
41
- `Emoji: mesaj basina ${profile.emoji.emojiRate} | ${profile.emoji.topEmojis.slice(0, 5).join(' ')}`,
42
- `Resmiyet: ${(profile.formality.compositeScore * 100).toFixed(0)}%`,
43
- `Yanit suresi (medyan): ${profile.timing.medianResponseTimeSec}sn`,
44
- `Aktif saatler: ${profile.timing.activeHours.join(', ')}`,
45
- `Imza kelimeleri: ${profile.patterns.signatureWords.join(', ') || 'yok'}`,
46
- ].join('\n');
47
- return { content: [{ type: 'text', text: output }] };
48
- }
49
- catch (error) {
50
- return {
51
- content: [{ type: 'text', text: `Stil analizi basarisiz: ${error.message}` }],
52
- isError: true,
53
- };
54
- }
55
- });
56
- }
57
- //# sourceMappingURL=analyze-conversation-style.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analyze-conversation-style.js","sourceRoot":"","sources":["../../../../src/interface/mcp/tools/analyze-conversation-style.ts"],"names":[],"mappings":"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"}