"""Prompt assembly for signal planner service.""" from __future__ import annotations from .shared import Any, PROMPT_SIGNAL_PLANNER, Signal, json, now_cn_naive class SignalPlannerPromptMixin: """Build planner prompt text from signal and project context.""" @classmethod def _build_prompt( cls, *, signal: Signal, project_title: str, charter_json: dict[str, Any], recent_signals: list[dict[str, Any]], members: list[dict[str, Any]], ) -> str: strategic = cls._as_dict(signal.strategic_analysis) ai_analysis = ( strategic.get("ai_analysis") if isinstance(strategic.get("ai_analysis"), dict) else {} ) return PROMPT_SIGNAL_PLANNER.format( signal_id=int(signal.id), signal_title=str(signal.title or ""), signal_summary=str(signal.summary or ai_analysis.get("summary") or ""), signal_content=str(signal.content or ""), project_id=( str(signal.matched_project_id) if signal.matched_project_id is not None else "" ), project_title=str(project_title or ""), project_scope=str(ai_analysis.get("requirement_project_scope") or ""), charter_json=json.dumps(charter_json or {}, ensure_ascii=False), recent_signals=json.dumps(recent_signals, ensure_ascii=False), member_profiles=json.dumps(members, ensure_ascii=False), now_cn=now_cn_naive().isoformat(), )