Commit Graph

30 Commits

Author SHA1 Message Date
idriz
a2d7adc8c7 Nova aplikacija "Raspored časova" (raspored)
Više djece, smjene se računaju iz "sidra" (jedan datum + smjena tad; mijenja se
sedmično 1,2,1,2...). Odgovara: koje časove ima, kad počinje/završava, koja smjena
— za danas/sutra/prekosutra/juče/naziv dana/konkretan datum.
- store.py: djeca, sidro->smjena za bilo koji datum, raspored po smjeni/danu,
  uparivanje imena (padeži), CSV import (kolone dijete..predmet), grid uređivanje.
- manifest.py: alat raspored_upit(dijete, kada, sta=casovi|pocetak|kraj|smjena);
  bosanska gramatika (N časa/časova, akuzativ dana). Sve lokalno (inline).
- admin.py + templates: pregled djece (+smjena danas), dodaj/obriši dijete,
  postavi razred+sidro, grid rasporeda (uredi/dodaj/obriši po času), CSV upload.
- Registrovano u load_apps() i ADMIN_APPS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-13 08:20:25 +02:00
idriz
47cb617e9e Vaktija: dnevni pre-warming keša u 01:00 (systemd timer)
- idriz/apps/vaktija/warm.py: zagrijava keš (danas + sutra) za konfigurisanu
  lokaciju (default Sarajevo).
- systemd/idriz-vaktija-warm.{service,timer}: oneshot + dnevni timer 01:00
  (Persistent=true da odradi i ako je mašina bila ugašena). Enabled kao user timer.

Odgovori o namazu su tako trenutni (bez čekanja na API pri prvom pitanju).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 18:55:10 +02:00
idriz
f2218e3237 Vaktija: dodaj izlazak sunca (granica sabaha)
- namaz_vrijeme prima i koji="izlazak" (izlazak sunca, vakat[1]).
- Uz sabah odgovor se doda "Sabah se klanja do izlaska sunca, u HH:MM"
  (za današnji ili sutrašnji sabah, sa odgovarajućim danom).
- "Sljedeći namaz" i dalje preskače izlazak sunca (nije namaz).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 18:52:15 +02:00
idriz
f17a16a34d Nova aplikacija "Namaz" (vaktija)
Vremena dnevnih namaza (sabah, podne, ikindija, akšam, jacija) sa api.vaktija.ba.
- idriz/apps/vaktija/store.py: izbor lokacije + bundlana lista (lokacije.json, 118
  lokacija; id=indeks). Sarajevo default. Bez openai/requests (uvozi ga admin).
- client.py: dohvat vakat[] po (lokacija, datum) sa keširanjem; API vraća lokalna
  vremena (sam vodi DST). vakat[1] je izlazak sunca (nije namaz), preskočen.
- manifest.py: alat namaz_vrijeme(koji): 'sljedeci' = prvi nadolazeći (ili sutra
  sabah ako su svi prošli); ili konkretan namaz (danas ako nadolazi, inače sutra).
  Bosanska gramatika za "za X sati/minuta" i rod (prošao/prošlo/prošla).
- admin.py + templates/vaktija.html: dropdown svih lokacija, Sarajevo default.
- Registrovano u load_apps() i ADMIN_APPS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 18:48:59 +02:00
idriz
fd30ff2b8a Nova aplikacija "Šta za ručak?" (obroci)
Glasovni prijedlozi doručka/ručka iz porodičnih lista (ne izmišlja, ne pretražuje web).
- idriz/apps/obroci/store.py: liste jela po obroku + istorija pojedenog (bez openai).
- manifest.py: alati obroci_prijedlog (nasumično sa liste; ponovni poziv za isti
  obrok daje drugo jelo jer se prethodno tretira kao odbijeno; izbjegava jela
  pojedena zadnja 3 dana) i obroci_dodaj (dodavanje jela glasom).
- Pamćenje pojedenog: zadnji NE-odbijeni prijedlog za dan/obrok se bilježi kao
  pojedeno (svaki prijedlog prepiše današnji zapis).
- admin.py + templates/obroci.html: dvije textarea (doručak/ručak) + istorija zadnjih dana.
- Registrovano u load_apps() i ADMIN_APPS.

Prvi app napravljen po CLAUDE.md obrascu.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 14:35:51 +02:00
idriz
00b4525588 Dodaj CLAUDE.md: vodič za pravljenje novih mini-app-ova
Detaljan vodič (orijentacija, dva procesa, arhitektura plugina, AppSpec/AppTool/
AppContext, inline vs background, korak-po-korak skelet novog app-a sa admin
Blueprint-om, i zlatna pravila: jezgro app-agnostično, admin bez openai, tanak
AppContext, smoke test poslije svakog commita).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 14:20:13 +02:00
idriz
e74c617228 Refaktor 4/4: admin kao Blueprint-ovi + auto-meni
Admin stranica app-a živi u folderu app-a:
- idriz/apps/superheroji/admin.py (Flask Blueprint BP + NAV), template preseljen u
  idriz/apps/superheroji/templates/superheroji.html.
- admin/app.py: registruje sve iz ADMIN_APPS, lijevi meni se puni iz njihovih NAV
  (context processor), globalni before_request štiti i Blueprint rute.
- Uklonjena inline /superheroji ruta i hardkodiran link u base.html.

Dodavanje admin stranice novom app-u = admin.py (BP+NAV) u folderu app-a + upis u
ADMIN_APPS. Time je mini-app potpuno samostalan: prompt, tools, config i admin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 12:31:39 +02:00
idriz
e21b08c1b7 Refaktor 3/4: sažetak i bojanka u plugine; jezgro app-agnostično
Assistant više NEMA nijednu app-metodu ni app-specifičan prompt:
- idriz/apps/sazetak/ i idriz/apps/bojanka/ (shema + handler + vlastiti prompt/greeting).
- idriz/util.py: slug() (dijeljeno).
- Jezgro INSTRUCTIONS sada opisuje samo razgovor + generička pravila za alate
  (potvrda prije fizičkog rezultata, dugi poslovi), bez imena app-ova. Finalni
  prompt i pozdrav se sklapaju iz jezgra + fragmenata svih app-ova.
- Svi alati dolaze iz registra plugina; uklonjeni TOOLS i _slug iz assistant.py.

Dodavanje novog malog app-a = samo novi folder u idriz/apps/ + upis u load_apps().

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 12:29:13 +02:00
idriz
f4a99beaeb Refaktor 2/4: superheroji izdvojen u plugin (apps/superheroji) + AppContext
Prvi pravi mini-app kao samostalan folder:
- idriz/apps/base.py: AppSpec, AppTool, AppContext (uski most ka runtime-u).
- idriz/apps/__init__.py: load_apps() (lijeni uvoz manifesta).
- idriz/apps/superheroji/: logic.py (bivši game.py), store.py (bivši gamestore.py),
  manifest.py (prompt fragment + sheme + handleri preko ctx).

Assistant više NEMA game_* metode ni self.match: prompt/tools/pozdrav/dispatch se
grade iz registra app-ova + jezgra. Admin uvozi apps.superheroji.store (bez openai).
Ponašanje isto (testirano: mehanika, handleri kroz AppContext, admin bez openai).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 12:20:52 +02:00
idriz
0e6d8947ce Refaktor 1/4: data-driven registar alata umjesto elif lanaca
Uvodi Tool (idriz/tooling.py: shema + handler + mode inline/background).
Assistant gradi self.tools/self.dispatch iz TOOLS, a handle_function_call
generički pokreće alat po modu. Uklonjeni GAME_TOOLS set i dva elif lanca
(run_game_tool, run_tool) -> _run_inline / _run_background. Ponašanje isto.

Prvi korak ka plugin arhitekturi (mali app = jedan folder).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-11 12:13:03 +02:00
idriz
6839464161 Igra: brzi mini model (gpt-4.1-mini) umjesto gpt-5.5
Presuda je predugo trajala sa gpt-5.5. game_model default je sada gpt-4.1-mini
(brz ~1-2s, bez reasoning overheada), kvalitet prepoznavanja i presude i dalje
dobar (testirano: Kuromi, La Linea, Goku). Promjenjivo preko IDRIZ_GAME_MODEL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 20:37:31 +02:00
idriz
c92de5e729 Igra: vrati web search (uz Wikipediju kao rezervu)
Samo Wikipedia nije prepoznavala neke likove. Vraćen web search (Responses API
web_search) kao primarni fallback kad LLM ne zna lika, sa Wikipedijom kao
rezervom. Kako se prepoznavanje sada radi u pozadini pri presudi (uz filler),
spor web search više ne blokira potvrdu izbora. Timeout 25s (pa 8s wiki).
Izvor "wiki" -> "web".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 20:19:58 +02:00
idriz
2d8b884da8 Igra: fallback samo Wikipedia (bez OpenAI web searcha)
Web search (Responses API) je znao trajati i do 100s. Pošto LLM ionako zna
većinu likova, a Wikipedia je brza (~1s) i dobra za izmišljene likove, fallback
kad LLM ne zna lika sada koristi SAMO englesku Wikipediju (wiki.py), uz 8s
timeout. Uklonjen poziv responses.create/web_search. Izvor "web" -> "wiki"
(kod, admin prikaz).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 20:06:21 +02:00
idriz
59194d9126 Igra: trenutna potvrda izbora (prepoznavanje odgođeno) + timeout web searcha
Uzrok sporosti (iz loga): prepoznavanje lika, uključujući web search, radilo
se UNUTAR superheroji_izbor prije potvrde. Za nepoznato ime web search je
jednom trajao ~100s i blokirao potvrdu.

- record_pick je sada BRZ (bez LLM-a): odmah bilježi izbor i vraća potvrdu;
  brza provjera zabrane/duplikata preko keša alias-a i izgovorenog imena.
- Pravo prepoznavanje (LLM + web search) radi se pri presudi (_resolve_pending),
  paralelno, gdje ionako ima filler poruka.
- Web search ograničen na 20s (+8s wiki fallback), da presuda ne visi.
- Filler je sada periodičan (svakih ~9s dok traje presuda), ne samo jednom.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 19:55:36 +02:00
idriz
8a4b3446b4 Igra: minimum 2 igrača (2-5, ne 1-5)
Igra u jednu osobu nema smisla. game_nova sada odbije partiju sa manje od
dvoje igrača i traži od modela da ponovo pita (2-5). Ažurirane upute i opis
alata. Uklonjen i zaostali spomen alata superheroji_presudi iz uputa.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 19:24:13 +02:00
idriz
c3706e67e5 Igra v2: auto-presuda + filler, pamćenje dvoboja sa razlogom (reuse bez LLM)
Problem: potvrda zadnjeg heroja se čula tek nakon "sad ću odlučiti" jer je
model grupisao potvrdu i poziv presudi. Rješenje: presuda runde je sada
AUTOMATSKA (uklonjen alat superheroji_presudi). Kad zadnji igrač izabere,
Python pokrene resolve_round u pozadini; model prvo brzo potvrdi ime i kaže
da razmišlja, rezultat stigne preko notify_model. Ako traje >8s -> filler.

Pamćenje dvoboja: pored Ela sada se u heroes.json (matchups) bilježe konkretni
ishodi sa razlogom, po cijelom skupu likova i po parovima. Kad se isti dvoboj
ponovi -> čita se iz baze BEZ poziva LLM-u (dosljedno + brzo). Admin tab
prikazuje "Zabilježene dvoboje"; reset briše i njih.

Sekvenciranje odgovora (_wait_idle) da se izbjegne
conversation_already_has_active_response.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 14:29:04 +02:00
idriz
d0fddcf985 Igra: potvrdi ime SVAKOG heroja + smanji pogrešno prepoznavanje imena
Problem 1 (kuromi -> Hulk): model je nejasan zvuk mapirao na poznatog
superheroja. Upute pojačane: likovi su iz SVIH medija (Kuromi, Pikaču...),
ne zamjenjuj čuveno ime sličnim superherojem, pitaj da se ponovi ako nisi
siguran, i ponovo pozovi izbor ako dijete ispravi ime.

Problem 2 (ne potvrdi drugog heroja): superheroji_izbor sada zna (preko
round_complete/next_picker) da li runda ima još igrača; UVIJEK traži da model
prvo naglas potvrdi ime, pa tek onda pita sljedećeg ili pozove presudi.

Uz to: benigna greška response_cancel_not_active spuštena na debug.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 13:58:03 +02:00
idriz
db0a9b88fd Dodaj igru Superheroji (glasovna) + admin tab
Igra: 1-5 igrača, nekoliko rundi (konfigurabilno). Svaku rundu svaki igrač
kaže izmišljenog lika (širok pojam — bilo koji medij), Idriz presudi ko bi
pobijedio i zašto. Pobjednik runde se banuje do kraja partije. Redoslijed se
rotira svaku rundu (zadnji ima prednost). Najviše pobjeda runda = pobjednik partije.

- idriz/gamestore.py: trajno skladište (heroji, Elo rejting, broj rundi), bez
  vanjskih zavisnosti (i admin ga uvozi). clear_favorite() drži borbe dosljedne
  kroz partije (jači heroj ne gubi od znatno slabijeg).
- idriz/game.py: resolve_hero (najjači LLM gpt-5.5 + web search fallback samo kad
  ne zna lika), adjudicate (presuda + obrazloženje na bosanskom), Match (tok partije).
- assistant.py: 4 realtime alata (nova_partija, izbor, presudi, kraj) + upute;
  igra ide odmah nazad modelu, ne kroz pozadinski posao.
- config.py: game_model (default = text_model).
- admin: tab "Superheroji" (broj rundi + rang-lista + reset pamćenja).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 11:57:43 +02:00
idriz
24cbe280d6 Dodaj admin web panel u repo (admin/), sinhronizuj systemd unite
- admin/: LAN web panel (Flask + waitress + python-pam), status servisa,
  PAM login sa idriz korisnikom, vertikalni meni. Port 8080, samo LAN.
- systemd/idriz-admin.service: korisnički servis, enabled + Restart=always
  + StartLimitIntervalSec=0.
- systemd/idriz.service: dodan StartLimitIntervalSec=0 (repo je bio zastario).

Od sada sav aplikacioni source code ide u ovaj repo.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-04 11:26:45 +02:00
idriz
dbe6ee6f28 Fix garbled replies: clear input buffer on mic on/off, guarded cancel, ask to repeat instead of guessing
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 20:13:36 +02:00
idriz
ab638aa690 Switching the mic off interrupts speech (distinct tone); background jobs keep running
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 20:07:01 +02:00
idriz
69b6c838b0 Conversation mode: answer questions by voice, adjust level on request (naprednije / pojednostavi)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 19:30:58 +02:00
idriz
c7add89c6e Summaries on gpt-5.5 with strict Bosnian-only rules and a proofreading pass
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 19:27:29 +02:00
idriz
92e6254888 USB mic switch acts as on/off: listen only while the USB source exists, chime when it appears
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 19:14:00 +02:00
idriz
7e69c3af24 Wait quietly for the microphone to reappear when unplugged
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 19:05:22 +02:00
idriz
c37041ae76 Mic software gain, VAD threshold 0.5, speech event logging, greeting on connect
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 19:00:51 +02:00
idriz
e594971fbf Strip bullet chars from facts, neutral image captions
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 18:57:49 +02:00
idriz
881ad46c11 Summary layout for kids: Wikipedia lead image, airy text, facts box, generated illustration fallback
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 18:47:23 +02:00
idriz
78967e15f9 Idriz v0.1: Realtime voice assistant with Wikipedia summaries and coloring pages
- OpenAI Realtime session (server VAD, half-duplex audio via pacat/PipeWire)
- Tools: wikipedia_sazetak (en.wikipedia -> Bosnian summary, max 2 A4 pages via WeasyPrint)
  and bojanka (image generation -> pure line art on A4)
- CUPS printing, systemd user service, install script, offline test script

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 18:37:39 +02:00
idriz
cc1babe26d Initial commit
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LzKpYaEsuWDevuNnvSjcFW
2026-09-02 16:53:26 +02:00