Prd/components/backend/README.md
Lucy Doupalů be9f14ce34 Helpdesk - operator console + patched GrapheneOS Dialer for call handling
A small helpdesk system: an office Pixel running a patched GrapheneOS Dialer
answers technician calls, records both call legs as separate channels, and a
Ruby backend transcribes them through Whisper and files an AI summary against
the caller.

Squashed to a single commit for sharing. No credentials are included; secrets
live outside the repo in /etc/helpdesk/env on the server or a gitignored
.claude/env.local locally. See .claude/env.local.example for the shape.

Start at README.md, then docs/architecture.md.
2026-07-27 18:50:32 +02:00

50 lines
2.4 KiB
Markdown

# components/backend
The deployed Helpdesk service: one Ruby process serving the operator console, the operator API, and
the phone's device API. WEBrick and the standard library; the PostgreSQL store adds the `pg` and
`sequel` gems, the JSON-file store needs nothing.
## Run
```bash
ruby server.rb # JSON store, dev mode, http://127.0.0.1:4000
HELPDESK_DATABASE_URL=postgres://localhost/helpdesk_dev ruby server.rb # PostgreSQL store
```
`make serve` and `make sim` wrap the common combinations.
## Test
```bash
make test # the offline suite - no network, no database
ruby db/parity_check.rb # JSON vs PostgreSQL behave identically (needs HELPDESK_TEST_DATABASE_URL)
ruby sim/simulator.rb # drives a running server over HTTP with real device auth
```
The offline suite is fast and covers the domain (147 assertions), the reverse-command channel (37),
the resolutions ledger (28), the summariser (31), the pipeline (20), reporting (16), the context
maintainer (9), and the wiki RAG (18).
## What's here
```
server.rb HTTP layer: routes, device auth (authed?), operator auth (operator_authed?)
lib/helpdesk/domain.rb the Store seam + the Service: call state machine, people, reconcile
lib/helpdesk/pg_store.rb PostgreSQL backend (write-through cache over Sequel)
lib/helpdesk/ledger.rb deterministic per-caller resolutions ledger
lib/helpdesk/business_hours.rb Mon-Fri 08-16 Europe/Prague incl. CZ holidays
lib/helpdesk/reporting.rb KPI/billing rollups from the event stream
db/migrate/001_init.sql the schema - source of truth for the data model
db/parity_check.rb scripted JSON-vs-PG diff
db/import_json.rb one-shot JSON-snapshot -> PostgreSQL importer
pipeline.rb audio -> transcript -> summary sequencing
summariser.rb per-call Czech summary + action items (OpenRouter)
context_maintainer.rb the per-caller AI dossier (OpenRouter)
wiki/ wiki grounding: client, embedder, cosine index, build script
public/console.html the whole operator console, one file
sim/simulator.rb stands in for the phone; the fastest way to see a full call
seed.rb demo data for dev mode
```
Each file's header says what it is and how it fits; the architecture and the device wire contract are
in `docs/architecture.md` and `docs/device-api.md`.