25 Commits
Author SHA1 Message Date
truetype 53fbb78905 fix: scrollbar su camp-list, pulite 155 campagne test
test / test (push) Has been cancelled
- camp-list con max-height:60vh + overflow-y:auto
- Rimosse 155 campagne test dal DB
- Rimossi 167 PG di test, 558 stati area
2026-07-01 11:49:08 +02:00
truetype 9b2fd0ee92 feat: rate limiting WS + cache risposte LLM
test / test (push) Has been cancelled
- Rate limiting: 1.5s tra azioni dello stesso client WS
- Cache LLM: SHA256 key, TTL 5 min, max 100 entry
- Cache riduce token spesi su azioni identiche ripetute
2026-07-01 11:29:05 +02:00
truetype 893823fa1d feat(ui): cronaca azioni nella sidebar
test / test (push) Has been cancelled
- Turn log mostra ultime 10 azioni con turno, azione e risultato
- Dati inclusi nello stato WS via ctx.log
- Ordinati dal piu recente
2026-07-01 11:25:51 +02:00
truetype e15951f362 feat(ui): anteprima area nella sidebar
test / test (push) Has been cancelled
- Aggiunta descrizione area corrente tra Missioni e Aree
- Mostra nome, descrizione e atmosfera dell'area
- Sezione visibile solo quando si e' in una area
- Dati arricchiti con description/atmosphere/features
2026-07-01 11:23:19 +02:00
truetype ea945a37f8 feat(ui): selettore PG nella chat
test / test (push) Has been cancelled
- Selettore personaggio sopra la barra input
- Solo PG vivi, nome abbreviato
- Click seleziona/deseleziona
- Nome preposto all azione: 'Druso: esploro...'
- Label azione mostra il nome del PG
2026-07-01 11:19:52 +02:00
truetype 90ba835868 feat: DeepSeek V4 Flash primario, Big Pickle fallback
test / test (push) Has been cancelled
- deepseek-v4-flash su opencode/go come modello primario
- big-pickle su opencode/zen come fallback (gratuito)
- Fallback automatico su censura "User Safety" o errore HTTP
- Aggiornati .env, config.py, start.sh, docker-compose.yml
2026-07-01 11:13:29 +02:00
truetype ffeb199ef5 fix: switch Big Pickle -> DeepSeek V4 Flash (censorship)
test / test (push) Has been cancelled
- Big Pickle (opencode/zen free) censura contenuti fantasy
  con "User Safety: safe" - blocca la narrazione del DM
- DeepSeek V4 Flash su opencode/go: $0.14/M token,
  nessuna censura, descrizioni fantasy corrette
- Aggiornati .env, start.sh, config.py
2026-07-01 10:13:41 +02:00
truetype 950b7c4672 fix: race condition su accessi concorrenti al DB
test / test (push) Has been cancelled
- Lock per-campagna in dm_cycle: serializza le richieste
  per la stessa campagna, evitando che due DM cycle
  leggano stato stale e si sovrascrivano
- begin_write()/end_write() in db.py per lock scritture
- _conn_lock finalmente usato (era definito ma mai acquisito)
- 72 test, tutti passano
2026-07-01 09:58:08 +02:00
truetype 08edeed8bb test: parser LLM + fix repair JSON
test / test (push) Has been cancelled
- test_llm_parser.py: 18 test per parse_tool_call, repair, strip
- Fix: repair raddoppiava i due punti nelle chiavi
- Fix: aggiunto passaggio per valori con apici singoli
- Copertura: JSON valido, apici singoli, misti, codeblock,
  virgole trailing, = invece di :, testo senza JSON
- 72 test totali, tutti passano
2026-07-01 09:44:49 +02:00
truetype f4cf649318 ✅ test: aggiunti test update_quest + integrità avventura
test / test (push) Has been cancelled
- test_tools.py: 4 test per update_quest (normale, status invalido,
  quest non trovata, rinomina)
- test_adventure.py: integrità dati (9 aree, connessioni bidirezionali,
  mostri con statblock, quest, items, features)
- Tutti 54 test passano in 0.69s
2026-07-01 09:41:35 +02:00
truetype ee0d5f8f7c 🐛 fix: CSS mobile rotto - rimosso CSS orfano fuori media query
test / test (push) Has been cancelled
- Rimosse 50 righe di CSS duplicate senza @media wrapper
- css rompeva layout desktop applicandosi a tutti gli schermi
- Chat msg piu larghe su mobile (95%)
- Touch target piu grandi (camp-btn 14px padding, input 44px)
- Stat grid piu compatto (font 11px)
- Welcome screen input/bottoni touch-friendly
2026-07-01 09:35:11 +02:00
truetype 634625dbfb feat(ui): supporto funnel - morte PG e rimpiazzo
test / test (push) Has been cancelled
- Card personaggi morti: grigia, teschio, 0 PF, filtro grayscale
- Bottone Nuovo PG quando ci sono caduti
- replaceFunnelDead() chiama POST /api/campaign/{id}/character
- Stato aggiornato dopo rimpiazzo
2026-06-30 17:25:43 +02:00
truetype e3edb87fac feat: backup DB automatico e logging strutturato
- backup_db() in db.py: copia in data/backups/*.db
- Backup a ogni avvio + ogni 5 turni
- Mantiene max 20 backup, rimuove i piu vecchi
- Logging strutturato: [LLM] latenza, raw_len
- Logging strutturato: [CYCLE] turn, tool, latenza, success
- Fix: import mancante threading in db.py
2026-06-29 19:07:33 +02:00
truetype 8b6620cd3d fix(mobile): input bar non visibile - usare 100dvh
- #app usa 100dvh su mobile (viewport dinamico)
- Input piu visibile anche se disabilitato (opacity 0.7)
- Touch target 44px per input e bottone
- flex-shrink:0 su btn-send
- safe-area padding aumentato
2026-06-29 18:47:37 +02:00
truetype 54c9acb0d6 fix(mobile): layout input visibile, hamburger menu
- Rimosso height:100dvh da #main (causava layout rotto)
- #main si affida a flex:1 per l'altezza
- hamburger ☰ sempre visibile nell'header su mobile
- Safe-area per notch iOS
2026-06-29 17:29:46 +02:00
truetype 33ba2a78b2 feat(ui): adattamento mobile responsive
- Hamburger button (☰) nell'header per aprire sidebar
- Sidebar come drawer overlay su mobile (<768px)
- Sidebar backdrop con chiusura al tap
- Swipe a sinistra per chiudere sidebar
- Safe-area per iPhone notch
- Font-size 16px su input (previene zoom iOS)
- dvh per altezza viewport mobile
- Auto-focus input solo su desktop
2026-06-29 16:38:52 +02:00
truetype 886df7429f feat(ui): pannello DM-Override nella sidebar
- Handler WS type:dm — esegue dm_override bypassando il LLM
- Pannello collassabile con selettore comandi e campi dinamici
- Comandi: narrate, set_hp, add_item, force_roll, skip_combat
- Stato aggiornato dopo DM override
- Implementato narrate con testo personalizzato
2026-06-29 16:28:34 +02:00
truetype e9c559c001 feat(ui): mappa aree nella sidebar
- Aggiunto current_area_id allo stato WS
- Mappa ordinata per ID area (1.1-1.9)
- Area corrente evidenziata con ✧ e bordo dorato
- Aree visitate con pallino pieno, non visitate vuoto
- Connessioni mostrate con nomi (non ID)
- CSS rinnovato per area-item
2026-06-28 23:35:36 +02:00
truetype 7fcc2927c4 fix(prompt): istruzioni esplicite per update_quest
test / test (push) Has been cancelled
- Aggiunta istruzione: usa update_quest quando missione completata/fallita
- Esempio update_quest spostato in cima negli esempi
- Quest ID nel contesto per permettere al LLM di referenziarle
2026-06-28 10:06:14 +02:00
truetype b985df0017 feat(tools): add update-quest tool, switch to Big Pickle (opencode/zen)
- update_quest: aggiorna stato/nome/descrizione missioni
- db: get_quest(), update_quest con nome+desc
- prompt: quest_id nel contesto, esempio nei tool examples
- Switch da deepseek-v4-flash (go) a big-pickle (zen) — gratuito
2026-06-28 10:01:33 +02:00
truetype eacc946868 fix: JSON repair, WS thread pool, switch to DeepSeek V4 Flash, funnel Lv0
LLM fixes:
- _try_repair_json() — ripara JSON malformato (apici, virgole trailing)
- _strip_json_from_text() — rimuove residui JSON dalla narration
- parse_tool_call() — rimuove troncamento 200 caratteri dal fallback

DM fixes:
- Fallback euristico quando params vuoti (dm.py)
- Estrazione narrazione da dm_override/narrate params.params.text

Prompt (prompts.py):
- Vietati termini tecnici/scientifici/anacronistici (HPLC, laser, ...)
- Aggiunto vocabolario fantasy obbligatorio

Server (server.py):
- dm_cycle in ThreadPoolExecutor per non bloccare WS ping
- WebSocketDisconnect gestiti
- Rimosso import inesistente db_schema

Frontend (index.html):
- Nascosti tool name dalla chat
- Personaggio -> PG, connessioni aree con nomi

Infrastruttura:
- Switch da openrouter/free a DeepSeek V4 Flash via OpenCode Go
- pyproject.toml, Dockerfile, docker-compose.yml, start.sh
- .env auto-load (start.sh)
- Funnel Lv0 (funnel.py) — creazione PG livello 0

Docs: architecture, database, setup, game mechanics, codebase ref
2026-06-28 08:18:24 +02:00
truetype 6b048dc0cc feat(engine): persistenza enigmi, inventario strutturato, HP mostri
test / test (push) Has been cancelled
Fase 2 del remediation plan:
- set_puzzle_state / is_puzzle_solved per enigmi area
- update_inventory su character_items con add/remove/equip/list
- combat() legge HP da combat_state e persiste danno
- dm_cycle inietta campaign_id nei tool che ne hanno bisogno
- helpers db: dedup inventario, remove/equip per nome

Fase 4 del remediation plan:
- test integrazione dm_cycle con LLM mockato (5 test)
- test WebSocket handler con mock (4 test)
- CI minimo .gitea/workflows/test.yml
2026-06-27 18:29:32 +02:00
truetype cb45172717 refactor: remediation plan Fase 0-4 completata
- Fase 0: env var allineate, SYSTEM_PROMPT deduplicato, .gitignore pulito
- Fase 1: GameContext isolato, ciclo DM unificato, provider thread-safe (contextvars)
- Fase 2: DB schema esteso (current_area_id, combat_state, character_items)
- Fase 3: thread-local connection pool + WAL + busy_timeout
- Fase 4: test suite (32 test, 100% pass)
- heuristic_fallback come parser di riserva (non secondo pilota)
2026-06-27 18:00:03 +02:00
truetype 90f823fdb9 feat: AI Dungeon Master engine + web frontend
- Engine: stato SQLite, state machine, 10 approved tools, parser azioni
- LLM: multi-provider (Ollama/OpenRouter/Local), system prompt DCC
- DM cycle: LLM decide tool → engine esegue → narrazione + meccanica
- Dati avventura: JSON machine-readable con 9 aree, mostri, enigmi, quest
- Web: FastAPI + WebSocket backend, SPA frontend dark fantasy
- Ref: architecture-patterns/neon-scratch-lounge (separazione reasoning/execution)
2026-06-26 20:31:34 +02:00
truetype ae73fe43d3 feat: initial DCC RPG knowledge base + AI DM design 2026-06-25 20:32:05 +02:00