---
name: partner-draft-replace
description: |
  Save Volodya's edited draft (text reply after ✏️ Edit tap) into draft_cache and re-emit a fresh
  FULL CARD with all buttons (Send, Edit, Gold, Skip, etc.) showing the updated text. Triggers ONLY
  when previous bot message was an edit-prompt («Жду твою правку», «Edit mode для», «📋 Текущий draft»)
  AND Volodya's next text is multi-line draft-like content (≥30 chars, starts with «Hola/Benvolguts/Estimados/...»).
  In any other case — это обычная НЛ команда, не edit, и этот skill НЕ должен активироваться.
version: 0.2
category: personal
tags: [hermes, realty, edit, draft, replace]
---

# Partner Draft Replace

## Призначення

Володя тапнув `✏️ Edit WA` / `✏️ Edit email` → bot прислал draft as plain text → Володя отредактировал у себя → прислал обратно. Этот skill ловит этот текст и:
1. **Сохраняет** в `~/.hermes/draft_cache.db` с свежим `draft_hash`
2. **Re-emit'ит ПОЛНУЮ карточку** с обновлённым текстом + ВСЕМИ кнопками (Send / Edit / Gold / Skip / Reject / Cancel) — Володя теперь видит свой edited draft в превью и может Send, ещё раз Edit, отметить Gold, etc.

## Триггер (КРИТИЧНО — bot LLM должен это распознать)

**Активируйся только когда:**
1. Recent bot message в conversation history содержит фразу-маркер edit-mode:
   - «Жду твою правку»
   - «Жду исправленный текст»  
   - «Скопируй ниже, отредактируй»
   - «Edit mode для <p_NNNN>»
   - «📋 Текущий ... draft для»
2. AND Volodya's next message — это **многострочный текст ≥30 chars** что выглядит как draft (начинается с «Hola»/«Benvolguts»/«Estimados»/похожий opener)

**Если оба условия — это edit-reply. Иначе — обычная НЛ команда, ИДИ К ДРУГОМУ skill.**

## Действия (через `execute_code`)

```python
import sys, hashlib, sqlite3, subprocess
sys.path.insert(0, "/home/hermes/hermes_vova")

# 1. Извлеки из recent context:
partner_id = "p_NNNN"  # из edit-prompt: «Edit mode для p_0066» → p_0066
channel = "wa"  # или "email" — из текста edit-prompt («WhatsApp» → wa, «Email» → email)
new_body = """<полный текст от Володи>"""  # сообщение Володи как есть

# 2. Parse subject (только для email)
subject = ""
body = new_body
if channel == "email":
    lines = new_body.split("\n", 1)
    if lines and lines[0].lower().startswith(("tema:", "subject:")):
        subject = lines[0].split(":", 1)[1].strip()
        body = lines[1].strip() if len(lines) > 1 else ""

# 3. Cache new draft
h = hashlib.sha256(f"{partner_id}|{channel}|{body}".encode()).hexdigest()[:16]

# Determine language from existing partner row
con = sqlite3.connect("/home/hermes/.hermes/hermes_vova.db")
con.row_factory = sqlite3.Row
partner_row = con.execute("SELECT language_pref FROM partners WHERE partner_id=?", (partner_id,)).fetchone()
lang = (partner_row["language_pref"] if partner_row and partner_row["language_pref"] else "cat")
con.close()

con = sqlite3.connect("/home/hermes/.hermes/draft_cache.db")
con.execute(
    "INSERT OR REPLACE INTO drafts (draft_hash, partner_id, language, channel, subject, body) "
    "VALUES (?, ?, ?, ?, ?, ?)",
    (h, partner_id, lang, channel, subject, body),
)
con.commit(); con.close()

# 4. Re-emit FULL CARD via hv_callback.py hv:emit_card action
# Это пришлёт полную карточку с обновлённым текстом и всеми кнопками — Send, Edit, Gold, Skip, Reject, Cancel.
result = subprocess.run(
    ["/usr/bin/python3", "/home/hermes/hermes_vova/scripts/hv_callback.py", f"hv:emit_card:{partner_id}"],
    capture_output=True, text=True, timeout=30,
)
print(result.stdout if result.returncode == 0 else f"ERROR: {result.stderr}")
```

## Acceptance criteria

- [ ] Активируется ТОЛЬКО когда context = edit mode (recent bot prompt) AND user reply looks like draft
- [ ] Сохраняет draft в cache с новым hash
- [ ] Re-emit'ит FULL card (subprocess `hv:emit_card`) — не просто «готово» в чате
- [ ] Володя видит карточку с обновлённым текстом + кнопкой Send (new hash) + возможностью Edit / Gold снова
- [ ] НЕ отвечает конверсационно («Можно отправлять») — отвечает только новой картой

## Anti-patterns (DO NOT)

- ❌ Конверсационное «Можно отправлять» / «Ок, готово» в TG response — Володя думает что отправлено, а на самом деле нет
- ❌ Просто повторить текст обратно в TG — bot должен ВЫПОЛНИТЬ save + emit
- ❌ Активироваться без context (если recent bot message НЕ edit-prompt — это обычная НЛ команда)
- ❌ Вызывать `partner-outreach` (это для генерации нового draft с нуля, не для editа)
- ❌ Передавать channel вместо partner_id в subprocess
