mirror of
https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools.git
synced 2026-06-18 07:19:35 +00:00
feat(core-os): implement Sprint 3-4 Control Plane (Memory Store, Provider Router, Verification Ledger)
This commit is contained in:
parent
954b2ff209
commit
379dcf941e
3
salesflow-saas/backend/app/services/core_os/__init__.py
Normal file
3
salesflow-saas/backend/app/services/core_os/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
"""
|
||||
Core OS Services - Dealix Sovereign Growth OS
|
||||
"""
|
||||
@ -0,0 +1,85 @@
|
||||
import os
|
||||
import json
|
||||
import uuid
|
||||
from typing import Dict, Any, List, Optional
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
class ProjectMemoryStore:
|
||||
"""
|
||||
Second Brain & Project Memory Store for Sovereign OS.
|
||||
File-based local memory with strict schemas to maintain institutional knowledge
|
||||
without turning into an unstructured dump.
|
||||
"""
|
||||
|
||||
MEMORY_DOMAINS = [
|
||||
"architecture", "adr", "runbooks", "releases", "postmortems",
|
||||
"growth", "partners", "ma", "seo", "security", "providers",
|
||||
"benchmarks", "patterns", "prompts", "experiments", "customers"
|
||||
]
|
||||
|
||||
def __init__(self, base_path: str = "memory"):
|
||||
self.base_path = Path(base_path)
|
||||
self._initialize_structure()
|
||||
|
||||
def _initialize_structure(self):
|
||||
"""Creates the internal memory domain folders if they don't exist."""
|
||||
for domain in self.MEMORY_DOMAINS:
|
||||
domain_path = self.base_path / domain
|
||||
domain_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
def store_item(self, domain: str, title: str, memory_type: str, owner: str,
|
||||
confidence: int, summary: str, links: List[str] = None,
|
||||
tags: List[str] = None, review_date: str = None) -> str:
|
||||
"""
|
||||
Ingests a decision memo, realization, or learning into the Memory OS.
|
||||
Returns the memory ID.
|
||||
"""
|
||||
if domain not in self.MEMORY_DOMAINS:
|
||||
raise ValueError(f"Invalid memory domain: {domain}. Must be one of {self.MEMORY_DOMAINS}")
|
||||
|
||||
if confidence < 0 or confidence > 100:
|
||||
raise ValueError("Confidence must be between 0 and 100.")
|
||||
|
||||
memory_id = f"mem_{uuid.uuid4().hex[:8]}"
|
||||
timestamp = datetime.utcnow().isoformat()
|
||||
|
||||
item = {
|
||||
"id": memory_id,
|
||||
"title": title,
|
||||
"type": memory_type,
|
||||
"owner": owner,
|
||||
"date": timestamp,
|
||||
"confidence": confidence,
|
||||
"summary": summary,
|
||||
"links": links or [],
|
||||
"tags": tags or [],
|
||||
"review_date": review_date,
|
||||
"status": "active"
|
||||
}
|
||||
|
||||
file_path = self.base_path / domain / f"{memory_id}.json"
|
||||
|
||||
with open(file_path, "w", encoding="utf-8") as f:
|
||||
json.dump(item, f, ensure_ascii=False, indent=2)
|
||||
|
||||
return memory_id
|
||||
|
||||
def retrieve_by_tags(self, domain: str, tags: List[str]) -> List[Dict[str, Any]]:
|
||||
"""Retrieve memory items matching specific tags within a domain."""
|
||||
domain_path = self.base_path / domain
|
||||
if not domain_path.exists():
|
||||
return []
|
||||
|
||||
results = []
|
||||
for file_path in domain_path.glob("*.json"):
|
||||
try:
|
||||
with open(file_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
if any(tag in data.get("tags", []) for tag in tags):
|
||||
results.append(data)
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
# Sort by confidence descending
|
||||
return sorted(results, key=lambda x: x.get("confidence", 0), reverse=True)
|
||||
@ -0,0 +1,67 @@
|
||||
from typing import Dict, Any, Optional
|
||||
|
||||
class ProviderRouter:
|
||||
"""
|
||||
Model & Provider Routing Layer for Sovereign OS.
|
||||
Determines the appropriate execution environment (Cloud vs Local) based on task parameters.
|
||||
"""
|
||||
|
||||
# Priority list of models based on environments
|
||||
# For Dealix Sovereign OS, maintaining PDPL (Saudi Data Privacy Law) is crucial.
|
||||
PROVIDERS = {
|
||||
"cloud_coding": ["claude-3-5-sonnet", "gpt-4o"],
|
||||
"cloud_reasoning": ["claude-3-opus"],
|
||||
"local_private": ["atomic-chat-local", "llama-3-8b"], # Example local inference
|
||||
"ops_agent": ["goose-cli"] # Specialized terminal manipulation
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def route_task(self, task_type: str, privacy_sensitivity: str,
|
||||
latency_budget_ms: int = 5000) -> Dict[str, Any]:
|
||||
"""
|
||||
Takes task requirements and outputs the selected provider, backup chain,
|
||||
and routing rationale.
|
||||
|
||||
Args:
|
||||
task_type: "code", "research", "summarization", "financial_diligence"
|
||||
privacy_sensitivity: "public", "internal", "highly_confidential"
|
||||
latency_budget_ms: maximum allowed time for first byte or completion.
|
||||
|
||||
Returns: Dict containing selected provider info.
|
||||
"""
|
||||
route_decision = {
|
||||
"selected_provider": "",
|
||||
"backup_chain": [],
|
||||
"reason": "",
|
||||
"retry_rules": {"max_retries": 3, "backoff": "exponential"}
|
||||
}
|
||||
|
||||
# Rule 1: Highly confidential tasks (M&A DD, financials) must be routed locally
|
||||
if privacy_sensitivity == "highly_confidential":
|
||||
route_decision["selected_provider"] = self.PROVIDERS["local_private"][0]
|
||||
route_decision["backup_chain"] = [self.PROVIDERS["local_private"][1]]
|
||||
route_decision["reason"] = "PDPL/High Confidentiality enforcement overrides cloud."
|
||||
return route_decision
|
||||
|
||||
# Rule 2: Operations and deployments route to specialized agent
|
||||
if task_type == "deployment_ops":
|
||||
route_decision["selected_provider"] = self.PROVIDERS["ops_agent"][0]
|
||||
route_decision["backup_chain"] = []
|
||||
route_decision["reason"] = "Task requires direct terminal/OS manipulation."
|
||||
return route_decision
|
||||
|
||||
# Rule 3: Complex reasoning routes to heaviest cloud models (if allowed)
|
||||
if task_type in ["financial_diligence", "alliance_structuring"]:
|
||||
route_decision["selected_provider"] = self.PROVIDERS["cloud_reasoning"][0]
|
||||
route_decision["backup_chain"] = self.PROVIDERS["cloud_coding"]
|
||||
route_decision["reason"] = "Task demands extreme reasoning fidelity and is not tightly bound by latency."
|
||||
return route_decision
|
||||
|
||||
# Default fallback: Standard Cloud execution with latency awareness
|
||||
route_decision["selected_provider"] = self.PROVIDERS["cloud_coding"][0]
|
||||
route_decision["backup_chain"] = [self.PROVIDERS["cloud_coding"][1]]
|
||||
route_decision["reason"] = "Default general purpose routing."
|
||||
|
||||
return route_decision
|
||||
@ -0,0 +1,82 @@
|
||||
import os
|
||||
import json
|
||||
import uuid
|
||||
import hashlib
|
||||
from typing import Dict, Any, List
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
class VerificationLedger:
|
||||
"""
|
||||
Tool Verification Layer for Dealix Sovereign OS.
|
||||
Prevents Agent Hallucinations and ensures all autonomous actions are verifiable.
|
||||
Implements the ToolProof pattern: logging Intent, Claim, Actual Execution, and side-effects.
|
||||
"""
|
||||
|
||||
def __init__(self, ledger_path: str = "memory/verification_ledger"):
|
||||
self.ledger_path = Path(ledger_path)
|
||||
self.ledger_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
def hash_parameters(self, params: Dict[str, Any]) -> str:
|
||||
"""Create a deterministic hash of tool parameters for audit matching."""
|
||||
serialized = json.dumps(params, sort_keys=True)
|
||||
return hashlib.sha256(serialized.encode("utf-8")).hexdigest()
|
||||
|
||||
def create_proof(self, agent_id: str, task_id: str, intended_action: str,
|
||||
claimed_action: str, current_tool_call: str,
|
||||
parameters: Dict[str, Any]) -> str:
|
||||
"""
|
||||
Creates an unverified tool proof record BEFORE the tool executes.
|
||||
"""
|
||||
run_id = f"tx_{uuid.uuid4().hex[:10]}"
|
||||
timestamp = datetime.utcnow().isoformat()
|
||||
|
||||
proof = {
|
||||
"run_id": run_id,
|
||||
"agent_id": agent_id,
|
||||
"task_id": task_id,
|
||||
"intended_action": intended_action,
|
||||
"claimed_action": claimed_action,
|
||||
"actual_tool_call": current_tool_call,
|
||||
"parameters_hash": self.hash_parameters(parameters),
|
||||
"timestamps": {"started": timestamp},
|
||||
"side_effects": [],
|
||||
"evidence_paths": [],
|
||||
"verification_status": "unverified"
|
||||
}
|
||||
|
||||
self._write_proof(run_id, proof)
|
||||
return run_id
|
||||
|
||||
def resolve_proof(self, run_id: str, side_effects: List[str],
|
||||
evidence_paths: List[str], status: str):
|
||||
"""
|
||||
Updates the proof AFTER execution with actual side effects and sets status to verified.
|
||||
Status must be 'verified', 'partially_verified', 'unverified', or 'contradicted'.
|
||||
"""
|
||||
valid_statuses = ["verified", "partially_verified", "unverified", "contradicted"]
|
||||
if status not in valid_statuses:
|
||||
raise ValueError(f"Status must be one of {valid_statuses}")
|
||||
|
||||
proof = self._read_proof(run_id)
|
||||
if not proof:
|
||||
raise KeyError(f"Run ID {run_id} not found in ledger.")
|
||||
|
||||
proof["side_effects"] = side_effects
|
||||
proof["evidence_paths"] = evidence_paths
|
||||
proof["verification_status"] = status
|
||||
proof["timestamps"]["resolved"] = datetime.utcnow().isoformat()
|
||||
|
||||
self._write_proof(run_id, proof)
|
||||
|
||||
def _write_proof(self, run_id: str, proof: Dict[str, Any]):
|
||||
file_path = self.ledger_path / f"{run_id}.json"
|
||||
with open(file_path, "w", encoding="utf-8") as f:
|
||||
json.dump(proof, f, ensure_ascii=False, indent=2)
|
||||
|
||||
def _read_proof(self, run_id: str) -> Dict[str, Any]:
|
||||
file_path = self.ledger_path / f"{run_id}.json"
|
||||
if not file_path.exists():
|
||||
return None
|
||||
with open(file_path, "r", encoding="utf-8") as f:
|
||||
return json.load(f)
|
||||
Loading…
Reference in New Issue
Block a user