mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-07 18:04:59 +03:00
Web Chat is a WEB connection of a processing channel (SPEC-0003/ADR-0012), reusing the whole contour: a public widget loads from the hub domain via one async tag (<script src=hub.edevs.tech/chat-widget.js data-channel=...>), opens an isolated iframe panel. Backend webchat app: public config/session/messages endpoints (anonymous session, hash-at-rest token); inbound goes through the same ingest (AI release + retrieval + handoff + notifications); WEB transport send is a no-op (browser polls). Panel rebuilt 1:1 from the baseline (welcome+consent / ai / operator / unavailable, quick replies, typing). nginx serves /chat-widget.js and /chat/ from the hub domain; demo host page at /chat/demo.html. Verified end-to-end: config→session→message→AI reply→poll. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
16 lines
813 B
Python
16 lines
813 B
Python
from django.db import models
|
|
|
|
# Анонимная браузерная сессия Web Chat (SPEC-HUB-0003 §7). Храним только hash
|
|
# токена; токен живёт в браузере и идентифицирует ConnectionIdentity канала.
|
|
|
|
|
|
class WebSession(models.Model):
|
|
token_hash = models.CharField(max_length=64, unique=True, db_index=True)
|
|
connection = models.ForeignKey("integrations.Integration", on_delete=models.CASCADE, related_name="web_sessions")
|
|
identity = models.ForeignKey("conversations.ConnectionIdentity", on_delete=models.CASCADE, related_name="web_sessions")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
last_seen_at = models.DateTimeField(auto_now=True)
|
|
|
|
def __str__(self) -> str:
|
|
return f"websession:{self.identity_id}"
|