Senad Uka 646917c322 M3: chat widget, owner dashboard, super-admin panel
- Embeddable vanilla-JS chat widget (one script tag + tenant public key):
  WebSocket, resumable sessions (24h localStorage token), honeypot + per-IP
  and per-message rate limits, Bosnian UI (§7)
- Session auth (bcrypt + signed cookies), owner accounts + super-admins,
  admin impersonation ('otvori kao salon', §11)
- Owner dashboard (§10, Bosnian): requests with same actions as email,
  call/chat history with transcripts, usage bar; settings for profile,
  working hours (manual + LLM paste-to-parse), services CRUD + 'Zalijepi
  cjenovnik' LLM import with review step, scheduling (Google OAuth free/busy
  read-only + calendar mappings + buffers, partner status), telephony
  (forwarding MMI codes per operator, ring group, worker SIP creds + QR),
  agent voice/price-mode/notes + widget snippet, notifications/SMS templates
- Super-admin panel (§11): tenant CRUD incl. plan/minutes/paid-until,
  partner API config (encrypted secrets), number/SIM registry + assignment,
  connectivity test (live availability + dry-run push), versioned prompt
  template editor with publish/rollback, playground, usage overview, health
- Fixes: WAL + busy_timeout for sqlite tests, no awaits in WS disconnect
  path (deadlock), template publish autoflush bug
- 76 tests green (incl. widget WS e2e booking flow); dashboard, widget and
  admin verified live in a browser against Postgres

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 10:51:57 +02:00
2026-07-11 09:45:06 +02:00
2026-07-11 09:45:06 +02:00
2026-07-11 09:45:06 +02:00
2026-07-11 09:45:06 +02:00
2026-07-11 09:45:06 +02:00

Gogo Telefon

Voice-first AI receptionist for small service businesses in Bosnia and Herzegovina. The agent answers forwarded calls (and web chat), speaks Bosnian, checks real availability and sends booking proposals to the salon owner — it never books appointments itself. See docs/ and the product spec for details.

Architecture (short version)

caller → salon number (conditional forwarding) → GSM gateway → Asterisk
       → ring group (staff softphones) → no answer → voice agent (Pipecat)
       → tools HTTP → FastAPI backend → SchedulingProvider (Google Calendar | Partner API)
       → proposal email / partner push → owner action → (optional) SMS to client

Everything self-hosted except LLM + TTS APIs (swappable interfaces).

Development

uv venv && uv pip install -e '.[dev]'
docker compose up -d db        # Postgres 16 on localhost:5433 (or use your own)
export GOGO_DATABASE_URL=postgresql+psycopg://gogo:gogo@localhost:5432/gogo
.venv/bin/alembic upgrade head
.venv/bin/uvicorn gogo.main:app --reload

Run tests (SQLite, no services needed):

.venv/bin/python -m pytest

The fake partner booking API used in tests (tests/fake_partner.py) doubles as the reference implementation of Appendix B for partner IT teams:

.venv/bin/uvicorn tests.fake_partner:app --port 9100

Layout

Path What
gogo/scheduling/ SchedulingProvider interface + google_calendar, partner_api, mock
gogo/proposals/ proposal engine, action tokens, owner emails, .ics
gogo/sms/ SmsProvider (console now, GSM gateway in M5) + Bosnian templates
gogo/api/ action links, partner webhook, health
gogo/agent/ LLM agent: prompt composition, tools, conversation loop (M2)
gogo/voice/ Pipecat voice pipeline (M4)
gogo/telephony/ Asterisk/GSM/forwarding codes (M4/M5)
tests/fake_partner.py Appendix B reference implementation

All code/comments in English; all client- and owner-facing text in Bosnian (Latin).

Description
No description provided
Readme 223 KiB
Languages
Python 87.2%
HTML 11.3%
JavaScript 1.3%
Mako 0.1%