fix(ui): no raw JSON on Training list, pain no longer [object Object], add Chat button on GroupEdit, drop facebook/line from persona

- list_groups returns lightweight summaries (id/title/status/persona_count + product) —
  never the full personas array, so Training no longer shows a long JSON blob.
- PersonaForm toLines extracts .description/.text from pain/objection objects (fixes
  '[object Object]'); save re-wraps pains as {description}.
- GroupEdit persona cards get a 'แชท' (MessageSquare) button so you can start chatting
  right where you land after creating (chat was only on Personas page before).
- channel: default neutral 'social', removed facebook/line validation + removed from
  revealable_view (scenario now sets the tone, not fb/line).
All 9 backend suites pass. Rebuilt dist.
This commit is contained in:
Macky
2026-08-09 11:15:13 +07:00
parent f8719d77e3
commit cb2642a659
29 changed files with 69 additions and 42 deletions

View File

@@ -163,7 +163,21 @@ def list_groups():
for g in visible
if not g.get("owner_user_id") or g.get("owner_user_id") == actor["id"]
]
return jsonify({"groups": visible})
# Lightweight summaries only — never send the full personas/sales_kit/report to a
# list view (huge, heavy, leaks the recipe). Training shows title + persona count.
summaries = []
for g in visible:
personas = g.get("personas") or []
summaries.append({
"id": g.get("id"),
"title": g.get("title", ""),
"status": g.get("status", "draft"),
"channel": g.get("channel"),
"org_id": g.get("org_id"),
"persona_count": len(personas),
"input": {"product": (g.get("input") or {}).get("product", "")},
})
return jsonify({"groups": summaries})
@groups_bp.post("/<gid>/analyze")