Spaces:
Sleeping
Sleeping
File size: 8,755 Bytes
ccb6b75 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | import logger from '../utils/logger.js';
class ConversationSimulator {
constructor(aiProvider, memory, developer) {
this.ai = aiProvider;
this.memory = memory;
this.developer = developer;
}
async generateIssueComment(issue, existingComments = []) {
try {
const roleContext = this.developer.getRoleContext();
const previousComments = existingComments.map(c =>
`@${c.user?.login || 'user'}: ${c.body?.slice(0, 200)}...`
).join('\n');
const prompt = `أنت مطور محترف (${roleContext.role}) تتفاعل مع GitHub Issue.
Issue #${issue.number}: ${issue.title}
${issue.body?.slice(0, 500) || ''}
${previousComments ? `المحادثات السابقة:\n${previousComments}\n` : ''}
الدور: ${roleContext.personality}
التركيز: ${roleContext.focus.join(', ')}
اكتب تعليق طبيعي على هذا Issue. يجب أن يكون:
- مفيد ومحدد
- يعكس خبرة المطور
- يستخدم مصطلحات تقنية مناسبة
- ليس طويلاً جداً (2-4 جمل)
- يبدو بشري وليس AI
- يمكن أن يسأل أسئلة أو يقدم اقتراحات
اكتب التعليق بالعربية أو الإنجليزية حسب سياق النقاش.`;
const comment = await this.ai.generate(prompt, {
maxTokens: 300,
temperature: 0.8,
});
this.memory.addConversation({
type: 'issue-comment',
issueNumber: issue.number,
content: comment,
context: {
issueTitle: issue.title,
role: roleContext.role,
},
});
return comment.trim();
} catch (error) {
logger.error(`Failed to generate issue comment: ${error.message}`);
return this._fallbackComment('issue');
}
}
async generatePRComment(pr, existingComments = [], files = []) {
try {
const roleContext = this.developer.getRoleContext();
const fileNames = files.map(f => f.filename || f.path).join(', ');
const previousComments = existingComments.map(c =>
`@${c.user?.login || 'user'}: ${c.body?.slice(0, 200)}...`
).join('\n');
const prompt = `أنت مطور محترف (${roleContext.role}) تراجع Pull Request على GitHub.
PR #${pr.number}: ${pr.title}
الملفات المتغيرة: ${fileNames || 'غير محدد'}
${previousComments ? `المحادثات السابقة:\n${previousComments}\n` : ''}
الدور: ${roleContext.personality}
التركيز: ${roleContext.focus.join(', ')}
اكتب مراجعة PR طبيعية. يجب أن:
- تكون محددة عن الكود
- تعكس خبرة المطور
- تستخدم مصطلحات تقنية
- تبدو بشرية
- يمكن أن تمدح أو تنتقد بشكل بناء
- 2-4 جمل
يمكنك:
- طلب توضيح
- اقتراح تحسين
- الإشارة لمشكلة محتملة
- المدح على شيء جيد
- طلب إضافة tests
اكتب المراجعة بالعربية أو الإنجليزية حسب السياق.`;
const comment = await this.ai.generate(prompt, {
maxTokens: 300,
temperature: 0.85,
});
this.memory.addConversation({
type: 'pr-comment',
prNumber: pr.number,
content: comment,
context: {
prTitle: pr.title,
role: roleContext.role,
files: fileNames,
},
});
return comment.trim();
} catch (error) {
logger.error(`Failed to generate PR comment: ${error.message}`);
return this._fallbackComment('pr');
}
}
async generatePRReviewDecision(pr, comment) {
try {
const lowerComment = comment.toLowerCase();
if (lowerComment.includes('lgtm') || lowerComment.includes('looks good') || lowerComment.includes('approved') || lowerComment.includes('ممتاز') || lowerComment.includes('رائع')) {
return 'approve';
}
if (lowerComment.includes('request changes') || lowerComment.includes('needs work') || lowerComment.includes('يجب اصلاح') || lowerComment.includes('خطأ')) {
return 'request_changes';
}
return Math.random() < 0.7 ? 'approve' : 'comment';
} catch (error) {
logger.error(`Failed to generate PR review decision: ${error.message}`);
return 'comment';
}
}
async generateIssueDiscussion(issue, numReplies = 3) {
const discussions = [];
let currentContext = issue.body || '';
for (let i = 0; i < numReplies; i++) {
try {
const roleContext = this.developer.getRoleContext();
const prompt = `أنت في مناقشة GitHub Issue.
Issue: ${issue.title}
${currentContext}
اكتب رد طبيعي في المناقشة (2-3 جمل).
يجب أن يكون الرد:
- متصلاً بما قيل قبله
- يضيف قيمة جديدة
- يبدو بشري
- يستخدم مصطلحات تقنية
اكتب بالعربية أو الإنجليزية.`;
const reply = await this.ai.generate(prompt, {
maxTokens: 250,
temperature: 0.8,
});
discussions.push({
type: 'discussion-reply',
content: reply.trim(),
timestamp: Date.now() + i * 3600000 * (Math.random() * 4 + 1),
});
currentContext += `\n\nرد: ${reply.trim()}`;
} catch (error) {
logger.error(`Failed to generate discussion reply ${i + 1}: ${error.message}`);
discussions.push({
type: 'discussion-reply',
content: this._fallbackComment('discussion'),
timestamp: Date.now(),
});
}
}
return discussions;
}
async generateFollowUpComment(pr, originalComment, changes = []) {
try {
const changeList = changes.map(c => `- ${c}`).join('\n');
const prompt = `أنت ترد على مراجعة PR.
المراجعة الأصلية: ${originalComment}
التغييرات التي تمت:
${changeList}
اكتب رد قصير (1-2 جملة) يشكر على المراجعة ويوضح ما تم فعله.
يجب أن يكون طبيعي ومهذب.`;
const reply = await this.ai.generate(prompt, {
maxTokens: 200,
temperature: 0.7,
});
return reply.trim();
} catch (error) {
logger.error(`Failed to generate follow-up comment: ${error.message}`);
return 'Thanks for the review! I\'ve addressed the feedback.';
}
}
async generateIssueClarification(issue) {
try {
const prompt = `أنت تحتاج توضيح من صاحب هذا Issue.
Issue: ${issue.title}
${issue.body?.slice(0, 500) || ''}
اكتب سؤال توضيحي طبيعي (1-2 جملة).
يجب أن يكون:
- محدد ومفيد
- يساعد في فهم المشكلة
- يبدو بشري
- مهذب
مثال: "Can you share the error logs?" أو "What browser are you seeing this on?"`;
const question = await this.ai.generate(prompt, {
maxTokens: 150,
temperature: 0.8,
});
return question.trim();
} catch (error) {
logger.error(`Failed to generate clarification: ${error.message}`);
return 'Can you provide more details about this issue?';
}
}
async generateThankYouComment() {
const phrases = [
'Thanks for the quick review!',
'Appreciate the feedback, fixed now.',
'Good catch! Thanks for pointing that out.',
'Thanks, updated the PR with the changes.',
'Appreciate it! Merging now.',
'Thanks everyone for the reviews.',
];
return phrases[Math.floor(Math.random() * phrases.length)];
}
async generateStatusUpdate(issue, status) {
const statusMessages = {
'in-progress': [
'Working on this now',
'Started implementing',
'On it',
'Taking a look',
],
'blocked': [
'Blocked on this, need more info',
'Waiting for clarification',
'Can\'t proceed until X is resolved',
],
'done': [
'Done! Ready for review',
'Finished implementation',
'All tests pass, ready to merge',
],
'review': [
'Ready for review',
'PR is up for review',
'Would love some eyes on this',
],
};
const messages = statusMessages[status] || statusMessages['in-progress'];
return messages[Math.floor(Math.random() * messages.length)];
}
_fallbackComment(type) {
const fallbacks = {
issue: 'Looking into this. Will update once I have more information.',
pr: 'Thanks for the PR. I\'ll review it shortly.',
discussion: 'Good point. Let me think about this and get back to you.',
};
return fallbacks[type] || fallbacks.issue;
}
}
export default ConversationSimulator;
|