mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-17 23:09:35 +00:00
Platform Services Layer (10 modules) — برج التحكم بالنمو - event_bus: 27 typed events (whatsapp/email/calendar/lead/payment/review/social/partner/sheet/crm/action) - identity_resolution: cross-channel merge (phone+email+CRM+social) with confidence scoring - channel_registry: 11 channels (WA, Gmail, Calendar, Moyasar, LinkedIn, X, IG, GBP, Sheets, CRM, Forms) with capabilities/risk/PDPL notes - action_policy: 9 rules (block_cold_whatsapp, block_payment_no_confirm, block_secrets, external_send_needs_approval, calendar_insert_needs_approval, social_dm_needs_explicit, unknown_source_review, high_value_deal_review, draft_only_safe) - tool_gateway: single execution chokepoint, env-flag-gated live actions (default OFF) - unified_inbox: 8 card types, ≤3 buttons enforced, Arabic - action_ledger: requested→approved→executed audit trail - proof_ledger: leads/meetings/drafts/sends/payments/revenue/risks_blocked/time_saved per channel - service_catalog: 12 sellable services - router api/routers/platform_services.py — 13 endpoints under /api/v1/platform/ Intelligence Layer (10 modules) — الشبكة العصبية للنمو - growth_brain: per-customer Brain + is_ready_for_autopilot() (≥30 signals + ≥40% accept) - command_feed: 9 daily card types (opportunity/revenue_leak/partner_suggestion/meeting_prep/review_response/competitive_move/customer_reactivation/ai_visibility_alert/action_required) - action_graph: 10 typed edges (signal→action→outcome) with what_works_summary - mission_engine: 7 missions, KILL FEATURE first_10_opportunities (10 فرص في 10 دقائق) - decision_memory: learns from accept/skip/edit/block, returns preferences (channels, tones, sectors, rejected actions, accept_rate) - trust_score: composite 0-100 (source+opt_in+channel+content+freq+approval) → safe/needs_review/blocked - revenue_dna: best_channel/segment/angle + common_objection + avg_cycle_days - opportunity_simulator: 9 Saudi sectors, expected_replies/meetings/deals/pipeline_sar + risk_score - competitive_moves: 8 move types with Arabic recommended_action_ar - board_brief: weekly Founder Shadow Board (3 decisions + 3 opportunities + 3 risks + relationship + experiment + metric) - router api/routers/intelligence_layer.py — 12 endpoints under /api/v1/intelligence/ Tests - tests/unit/test_platform_services.py — 31 tests covering catalog/channels/events/policy/gateway/identity/inbox/ledger/proof - tests/unit/test_intelligence_layer.py — 29 tests covering brain/feed/graph/missions/memory/trust/dna/simulator/competitive/brief - 60/60 new tests pass; full suite 587 passed, 2 skipped Docs - docs/PLATFORM_SERVICES_STRATEGY.md (Arabic) - docs/INTELLIGENCE_LAYER_STRATEGY.md (Arabic) - docs/DEALIX_100_PERCENT_LAUNCH_PLAN.md — added §32 Platform Services + §33 Intelligence Layer Safety - No live send by default (all WA/Gmail/Calendar/Moyasar guarded by env flags, all OFF) - All external actions go through Tool Gateway → Action Policy → draft/approval_required - No secrets allowed in payloads (block_secrets policy) - PDPL-aware: cold WhatsApp without consent is hard-blocked - Existing 477+ tests untouched (no breaking changes) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
92 lines
3.0 KiB
Python
92 lines
3.0 KiB
Python
"""
|
|
Identity Resolution — reconcile signals from many channels into one Identity.
|
|
|
|
Inputs: phone, email, company, social handles, CRM ids.
|
|
Output: a single Identity record with confidence per matched signal.
|
|
|
|
Pure deterministic — production version would hit a graph DB.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class Identity:
|
|
"""A reconciled identity across channels."""
|
|
|
|
identity_id: str
|
|
primary_phone: str | None = None
|
|
primary_email: str | None = None
|
|
company: str | None = None
|
|
crm_id: str | None = None
|
|
social_handles: dict[str, str] = field(default_factory=dict)
|
|
confidence: float = 0.0 # 0..1
|
|
sources: list[str] = field(default_factory=list)
|
|
|
|
|
|
def _hash_id(*parts: str) -> str:
|
|
"""Deterministic ID from any combination of stable identifiers."""
|
|
seed = "|".join(p.lower().strip() for p in parts if p)
|
|
if not seed:
|
|
return ""
|
|
h = hashlib.sha256(seed.encode("utf-8")).hexdigest()[:16]
|
|
return f"id_{h}"
|
|
|
|
|
|
def resolve_identity(*, signals: list[dict[str, Any]]) -> Identity:
|
|
"""
|
|
Merge a list of signals (from different channels) into one Identity.
|
|
|
|
Each signal can be: {phone, email, company, crm_id, social_handles, source}.
|
|
"""
|
|
phones: dict[str, int] = {}
|
|
emails: dict[str, int] = {}
|
|
companies: dict[str, int] = {}
|
|
crm_ids: list[str] = []
|
|
socials: dict[str, str] = {}
|
|
sources: list[str] = []
|
|
|
|
for s in signals:
|
|
ph = (s.get("phone") or "").strip()
|
|
em = (s.get("email") or "").strip().lower()
|
|
co = (s.get("company") or "").strip()
|
|
crm = (s.get("crm_id") or "").strip()
|
|
if ph:
|
|
phones[ph] = phones.get(ph, 0) + 1
|
|
if em:
|
|
emails[em] = emails.get(em, 0) + 1
|
|
if co:
|
|
companies[co] = companies.get(co, 0) + 1
|
|
if crm:
|
|
crm_ids.append(crm)
|
|
for k, v in (s.get("social_handles") or {}).items():
|
|
if k not in socials and v:
|
|
socials[k] = v
|
|
if s.get("source"):
|
|
sources.append(str(s["source"]))
|
|
|
|
# Pick most-frequent canonical values
|
|
primary_phone = max(phones, key=phones.get) if phones else None
|
|
primary_email = max(emails, key=emails.get) if emails else None
|
|
company = max(companies, key=companies.get) if companies else None
|
|
crm_id = crm_ids[0] if crm_ids else None
|
|
|
|
# Confidence: proportional to number of independent strong signals
|
|
strong_signals = sum(1 for x in (primary_phone, primary_email, crm_id) if x)
|
|
confidence = min(1.0, 0.30 * strong_signals + 0.10 * (1 if socials else 0))
|
|
|
|
return Identity(
|
|
identity_id=_hash_id(primary_phone or "", primary_email or "", crm_id or ""),
|
|
primary_phone=primary_phone,
|
|
primary_email=primary_email,
|
|
company=company,
|
|
crm_id=crm_id,
|
|
social_handles=dict(socials),
|
|
confidence=round(confidence, 3),
|
|
sources=list(dict.fromkeys(sources)), # dedupe preserve order
|
|
)
|