Senkron gate penceresine (≤10 sn) sığmayan kararlar için: eklenti allow/deny yerine { decision:'pending' } döner → statü geçişi askıya alınır → eklenti hazır olunca gate-resolve ucunu çağırır → geçiş uygulanır/iptal edilir. Sektör deseni: Shopify fulfillment request (request → accept/reject, async).
Yalnız packet.status.update. packet.close (tenant-genel, inline) ve table.close (senkron panel gate'i) askıya alınacak durum taşımaz → orada pending yok sayılır, failMode uygulanır.
packet.status.update gate'i senkrondur: eklenti timeoutMs (≤10 sn) içinde karar vermeli. İnsan onayı, harici mutabakat, kurye atama bekleme gibi kararlar bu pencereye sığmaz. pending, işlemi senkron bloklamadan "kararı sonra vereceğim" demenin standart yoludur.
İstek (gate, bugünküyle aynı) → cevap üç seçenekli:
{ "decision": "allow" }
{ "decision": "deny", "message": "…" }
{ "decision": "pending", "message": "Kurye atanıyor, onay birazdan." } // ← yeni 3. seçenekpending sonrası eklenti, hazır olunca held geçişi çözer:
# Eklenti hazır olunca held geçişi çözer (allow → uygula, deny → iptal):
curl -X POST https://plugins.restomenum.app/plugin-api/packets/<sid>/<pid>/<packetId>/gate-resolve \
-H "Authorization: Bearer <sid>.<pid>.<secret>" \
-d '{ "decision": "allow", "to": "OnDelivery" }'POST /plugin-api/packets/:serverId/:pluginId/:packetId/gate-resolve — auth: install API key + scope hooks:packet.status.{ decision: "allow"|"deny", to: "<hedef statü>", message? }.PENDING_TTL içinde resolve etmezsen deadline'da manifest'teki failMode uygulanır.{ ok:true, already:true }).[statü: Approved]
panel "Yola Çıkar" → packetGate(packet.status.update, to:OnDelivery)
eklenti: { decision:"pending", message:"Kurye atanıyor…" }
→ handler statüyü YAZMAZ; pakete pendingGate marker yazar (deadline = now + PENDING_TTL)
statü Approved KALIR (panelde "🟣 Eklenti onayı bekleniyor")
── async ──
eklenti hazır → POST …/gate-resolve { decision:"allow"|"deny", to:"OnDelivery" }
allow → held geçiş UYGULANIR (statü OnDelivery) + marker temizlenir
deny → marker temizlenir, statü Approved kalır, message panele düşer
── deadline ──
now > deadline ve hâlâ pending → failMode uygulanır (open→uygula / closed→iptal) + temizle| Durum | Anlam |
|---|---|
| 409 expired | Deadline geçmiş — held geçiş artık çözülemez (failMode uygulandı). |
| no-op (already) | Pakette pendingGate yok (zaten çözülmüş/temizlenmiş) → ikinci resolve sessiz geçer. |
| sahiplik / scope | pendingGate.pluginId sizinki değilse veya hooks:packet.status yoksa reddedilir. |
pendingGate olur — yarış/çift-resolve karışıklığı önlenir.