All files / lib/integration cfp_protocol.ts

0% Statements 0/64
0% Branches 0/1
0% Functions 0/1
0% Lines 0/64

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                                                                                                                                                                                                                             
/**
 * Phase 7 — Collective Feedback Protocol (CFP)
 * --------------------------------------------
 * تعريف شكل الرسائل بين العقد (Nodes) + أدوات بناء/تحقق الرسائل + أنماط intents.
 * خفيف، بدون تبعيات خارجية.
 */
 
export type CFPIntent =
  | 'SYNC_SNAPSHOT' // مزامنة التقارير/الحالة
  | 'SHARE_POLICY' // مشاركة سياسة/أوزان
  | 'REQUEST_ADVICE' // طلب نصيحة/اقتراح
  | 'BROADCAST_REPORT'; // بث تقرير (Evolution/Integration)
 
export interface CFPPayload {
  // أي محتوى منظّم؛ يُفضل أن يكون JSON قابل للتسلسل
  [key: string]: unknown;
}
 
export interface CFPMessage {
  id: string; // UUID/ULID (أو أي مولد معرفات) — هنا بنقبل أي ستـرنج
  ts: string; // ISO-8601 timestamp
  sourceId: string; // هوية العقدة المرسلة
  targetId?: string; // اختياري: العقدة المستهدفة (للـ direct)
  intent: CFPIntent;
  trust: number; // 0..1 تقدير الثقة في المرسل
  payload: CFPPayload; // الحمولة
  signature?: string; // اختياري: توقيع/هش للتوثيق (مستقبلاً)
  meta?: {
    replyTo?: string; // لو ده رد على رسالة
    correlationId?: string; // ربط سلاسل الرسائل
    tags?: string[]; // تصنيفات حرة
  };
}
 
export interface ValidationResult {
  valid: boolean;
  reason?: string;
}
 
export function nowISO(): string {
  return new Date().toISOString();
}
 
export function clamp01(x: number): number {
  if (!Number.isFinite(x)) return 0;
  return Math.max(0, Math.min(1, x));
}
 
/**
 * يبني رسالة CFP جاهزة للإرسال.
 */
export function buildMessage(
  intent: CFPIntent,
  payload: CFPPayload,
  opts: {
    id?: string;
    sourceId: string;
    targetId?: string;
    trust?: number; // default 0.7
    signature?: string;
    meta?: CFPMessage['meta'];
  }
): CFPMessage {
  return {
    id: opts.id ?? `cfp_${Math.random().toString(36).slice(2)}`,
    ts: nowISO(),
    sourceId: opts.sourceId,
    targetId: opts.targetId,
    intent,
    trust: clamp01(opts.trust ?? 0.7),
    payload,
    signature: opts.signature,
    meta: opts.meta,
  };
}
 
/**
 * تحقق بسيط من الرسالة (حقول رئيسية + مجال الثقة).
 * رجّع false مع سبب واضح لو ناقص حاجة مهمة.
 */
export function validateMessage(msg: CFPMessage): ValidationResult {
  if (!msg) return { valid: false, reason: 'Message is empty' };
  if (!msg.id) return { valid: false, reason: 'Missing id' };
  if (!msg.ts) return { valid: false, reason: 'Missing timestamp' };
  if (!msg.sourceId) return { valid: false, reason: 'Missing sourceId' };
  if (!msg.intent) return { valid: false, reason: 'Missing intent' };
  if (typeof msg.trust !== 'number') return { valid: false, reason: 'Missing trust' };
  const t = clamp01(msg.trust);
  if (t !== msg.trust) return { valid: false, reason: 'Invalid trust range' };
  if (typeof msg.payload !== 'object' || msg.payload == null) {
    return { valid: false, reason: 'Payload must be an object' };
  }
  return { valid: true };
}
 
/**
 * ميسرات سريعة بحسب الـ intent.
 */
export function isSync(msg: CFPMessage) {
  return msg.intent === 'SYNC_SNAPSHOT';
}
export function isPolicyShare(msg: CFPMessage) {
  return msg.intent === 'SHARE_POLICY';
}
export function isAdviceRequest(msg: CFPMessage) {
  return msg.intent === 'REQUEST_ADVICE';
}
export function isReportBroadcast(msg: CFPMessage) {
  return msg.intent === 'BROADCAST_REPORT';
}
 
/**
 * صحة بدائية للتوقيع — Placeholder (توسّع لاحقاً).
 */
export function verifySignature(_msg: CFPMessage): boolean {
  // لاحقاً: تحقق من signature باستخدام مفاتيح عامة
  return true;
}