"""Decision recording and retrieval.
This module provides internal functions for recording and retrieving decisions.
MCP resource and tool registration is handled by resources.py and tools.py.
"""
import json
from datetime import datetime
from typing import Any
from .database import get_db_connection
def record_decision(
decision_type: str,
description: str,
rationale: str,
alternatives_considered: list[str] | None = None,
outcome: str | None = None,
related_entities: dict[str, Any] | None = None,
) -> int:
"""Record a decision made about the Google Ads account.
Args:
decision_type: Type of decision (strategy, budget, targeting, creative, etc.)
description: What was decided.
rationale: Why this decision was made.
alternatives_considered: Other options that were considered.
outcome: Result of the decision (can be updated later).
related_entities: IDs of related campaigns, ad groups, etc.
Returns:
The ID of the recorded decision.
"""
with get_db_connection() as conn:
cursor = conn.cursor()
cursor.execute(
"""
INSERT INTO decisions
(decision_type, description, rationale, alternatives_considered, outcome, related_entities)
VALUES (?, ?, ?, ?, ?, ?)
""",
(
decision_type,
description,
rationale,
json.dumps(alternatives_considered) if alternatives_considered else None,
outcome,
json.dumps(related_entities) if related_entities else None,
),
)
conn.commit()
return cursor.lastrowid
def get_decisions(
decision_type: str | None = None,
limit: int = 20,
since: datetime | None = None,
) -> list[dict[str, Any]]:
"""Retrieve recorded decisions.
Args:
decision_type: Optional filter by decision type.
limit: Maximum number of decisions to return.
since: Optional filter for decisions after this timestamp.
Returns:
List of decision entries.
"""
with get_db_connection() as conn:
cursor = conn.cursor()
query = "SELECT * FROM decisions WHERE 1=1"
params = []
if decision_type:
query += " AND decision_type = ?"
params.append(decision_type)
if since:
query += " AND timestamp > ?"
params.append(since.isoformat())
query += " ORDER BY timestamp DESC LIMIT ?"
params.append(limit)
cursor.execute(query, params)
rows = cursor.fetchall()
return [
{
"id": row["id"],
"timestamp": row["timestamp"],
"decision_type": row["decision_type"],
"description": row["description"],
"rationale": row["rationale"],
"alternatives_considered": (
json.loads(row["alternatives_considered"])
if row["alternatives_considered"]
else None
),
"outcome": row["outcome"],
"related_entities": (
json.loads(row["related_entities"])
if row["related_entities"]
else None
),
}
for row in rows
]