fix(ralph): "Planifică" deschide modal/ForceReply când descrierea lipsește

Înainte: click pe 🧠 Planifică (Discord/Telegram) sau /plan <slug> fără descriere
pe un proiect din workspace fără entry în approved-tasks.json → mesaj eroare
"Adaugă mai întâi cu /p <slug> <descriere>" și user-ul trebuia să facă două
operații.

Acum:
- Discord button "Planifică" cu descriere goală → deschide RalphPlanModal cu
  TextInput pentru descriere; on_submit pornește direct start_planning_session
- Discord /plan <slug> fără description param și fără entry → același modal
  (response.send_modal ÎNAINTE de defer — Discord constraint)
- Telegram callback "Planifică" cu descriere goală → set state
  STEP_INPUT_DESCRIPTION_THEN_PLAN + ForceReply; handle_message detectează
  step și pornește planning cu textul user-ului
- ralph_flow.py: nou STEP_INPUT_DESCRIPTION_THEN_PLAN (alături de cel existent
  pentru propose-only)

start_planning_session deja auto-creează entry în approved-tasks.json dacă
proiectul lipsește, deci flow-ul e end-to-end: workspace → click → descriere
→ planning agent activ.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-26 18:51:09 +00:00
parent bf9380f2ad
commit dedeedf024
4 changed files with 87 additions and 21 deletions

View File

@@ -22,7 +22,8 @@ DEFAULT_TTL_SECONDS = 600 # 10 minutes
# Step values used across adapters
STEP_INPUT_DESCRIPTION = "input_description"
STEP_IN_PLANNING = "in_planning" # reserved for W2 (planning agent)
STEP_INPUT_DESCRIPTION_THEN_PLAN = "input_description_then_plan"
STEP_IN_PLANNING = "in_planning" # planning agent active in this channel
def _key(adapter: str, chat_id: str, user_id: str) -> str: