feat: P2 — التسوية بالرسائل + إزالة مارتن + مستند البنية (docs/25)

P2 (كليك/شام كاش بلا API):
- الرسالة تُحفظ خاماً **قبل** أي تحليل: التحليل قد يفشل فنحتاج الأصل لإعادة
  المعالجة، وعند النزاع يكون النصّ الأصلي هو الحجّة لا تفسيرُنا له.
- النقطة تصنع المال، فرسالة مزوّرة = رصيد من عدم. الحماية: سرّ لكل مستأجر
  بمقارنة ثابتة الزمن (المقارنة النصّية تسرّب السرّ حرفاً حرفاً زمنياً)،
  وبصمة محتوى فريدة تمنع احتساب إعادة الإرسال مرتين.
- Gemini بحرارة صفر ومطالَب بإرجاع null عند عدم اليقين: نموذج يخمّن مبلغاً
  يسوّي فاتورة بمال لم يصل. بلا مبلغ صريح → مراجعة بشرية لا تسوية.
- المطابقة بالمرجع أولاً، ثم بالمبلغ خلال 24 ساعة وبشرط فاتورة وحيدة —
  فاتورتان بنفس المبلغ التباسٌ يُراجَع، لا تسويةٌ عشوائية لإحداهما.
- التسوية تمرّ بـmarkSuccess نفسه فلا يتفرّع مسار مالي ثانٍ.

إزالة حاوية martin: انطلق منصّة قائمة بذاتها لها خوادمها؛ دورنا طلب وردّ لا
استضافة خرائط (قرار المالك).

docs/25: جرد الحاويات · لماذا الدفع ليس خدمة منفصلة · سيرفر السوبر-أدمن
المنفصل ونطاقه الفرعي · WebSocket مقابل الاستطلاع بالأرقام · أحجام السيرفرات
على أساس الذروة لا المعدّل · نقل مستأجر · ترتيب التوسّع.

13 اختباراً جديداً (201 إجمالاً، كلها خضراء).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-18 15:19:17 +03:00
co-authored by Claude Fable 5
parent b1a060c5ed
commit da035e46a4
12 changed files with 789 additions and 15 deletions
@@ -56,6 +56,33 @@ export class GeminiService {
}
}
/**
* يستخرج حقول تحويل مالي من نصّ رسالة المزوّد (docs/24 §5 — P2).
*
* `temperature: 0` وتعليماتٌ صريحة بإرجاع `null` عند عدم اليقين: النموذج
* الذي «يخمّن» مبلغاً غير مذكور يسوّي فاتورة بمال لم يصل. عدم المطابقة
* ومراجعةٌ بشرية أهون بكثير من تسويةٍ خاطئة.
*/
async extractTransferSms(body: string, provider: string): Promise<any> {
const prompt = [
`أنت محلّل رسائل تحويل مالي من مزوّد الدفع "${provider}".`,
'استخرج من النصّ التالي JSON بالحقول:',
'{ "amount": number|null, "currency": string|null, "reference": string|null,',
' "sender_name": string|null, "sender_phone": string|null, "is_incoming": boolean }',
'',
'قواعد صارمة:',
'- `amount` المبلغ المُستلَم فقط. إن لم يُذكر صراحةً فأعد null — لا تحسبه ولا تخمّنه.',
'- `reference` رقم العملية/الحوالة كما ورد حرفياً.',
'- `is_incoming` = true فقط إن كانت الرسالة تؤكّد **استلام** مبلغ.',
'- أي حقل غير مذكور صراحةً = null. لا تخترع قيمة أبداً.',
'',
'النصّ:',
body,
].join('\n');
return this.generateJson(prompt, []);
}
/** يستخرج حقول وثيقة من صورتها. */
async extractDocument(image: GeminiImage, docType: string): Promise<any> {
if (!this.enabled) return { enabled: false };