diff --git a/CHANGELOG.md b/CHANGELOG.md index c979892..8e2465c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,12 @@ Alle wesentlichen Projektänderungen werden hier in verständlicher Form dokumen - SQLite-Sitzungen mit geordneter Nachrichtenhistorie außerhalb des Repositories. - CLI-Befehle für neue, gelistete, geladene, geleerte und beendete Sitzungen. - Unit-Tests für Konfiguration, Speicher, Chatkern, Provider und CLI. +- Sicherer Gemini-Key-Speicher über Betriebssystem-Keyring. +- Offizieller Gemini-Provider mit lokalem Datenschutzrouter + (`allowed`/`ask`/`never`) und sichtbarem Ollama-Fallback. +- Strikter Nullkostenmodus, lokale Schutzlimits und inhaltsfreies Provider-Audit. +- Bereinigte CLI-Befehle `/provider`, `/privacy` und `/status`. +- Sicheres PowerShell-Startskript ohne Systemänderungen. ### Changed @@ -29,8 +35,16 @@ Alle wesentlichen Projektänderungen werden hier in verständlicher Form dokumen - Offizielle VS-Code-Erweiterungen für Python, Pylance und Python Environments eingerichtet. - `qwen3:8b` mit echten deutschen Antworten und GPU-/Zeitmessungen auf der RTX 3060 geprüft. - Projektstatus, Architektur und Datenmodell auf den funktionierenden Textchat aktualisiert. +- Chatlaufzeit auf austauschbares Hybridrouting umgestellt; alte Ollama-Sitzungen + bleiben ladbar. +- Nicht geheime Providerkonfiguration liegt lokal außerhalb von Git; ein Key wird + erst unmittelbar vor einem zulässigen Cloudaufruf geladen. ### Security - Lokale Secret-Dateien, Laufzeitdaten, Modelle, Datenbanken und Logs werden von Git ausgeschlossen. - Das Sprachmodell darf keine Secret-Werte erhalten. +- Gemini bleibt ohne lokale Aktivierung, Key, Nullkostenmodus und bestätigtes + Nicht-Billing deaktiviert; Javis aktiviert niemals Billing. +- Cloudkontext wird lokal klassifiziert und minimiert; 429, Netzwerk-, Timeout-, + Key- und Modellfehler fallen auf Ollama zurück. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index db8157b..7e25bd1 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -8,12 +8,12 @@ Javis beginnt als modularer Monolith. Module besitzen klare Zuständigkeiten und 1. Interface: implementierte CLI; später möglicherweise Sprache, Mobilzugriff und Living Mind. 2. Core: implementierter Gesprächsablauf und Sitzungslogik. -3. Providers: kleine Schnittstelle und implementierter lokaler Ollama-Adapter. -4. Memory: implementierte SQLite-Sitzungen; ein semantischer Index ist nur geplant. +3. Providers: kleine Schnittstelle, lokaler Ollama- und optionaler Gemini-Adapter. +4. Memory: SQLite-Sitzungen und separates inhaltsfreies Provider-Audit. 5. Obsidian: zunächst lesender Adapter, später eng begrenzte Entwürfe. 6. Tools und Status: feste Schemas, Allowlists, Timeouts und bereinigte Ausgaben. -7. Security: Freigaben, Secret-Provider und Berechtigungsprüfung. -8. Audit: nachvollziehbare Aktionen ohne geheime Inhalte. +7. Security: lokaler Datenschutzrouter, Freigaben und Betriebssystem-Keyring. +8. Audit: Provider-Metadaten ohne Prompts, Antworten oder geheime Inhalte. ## Plattformgrenzen @@ -24,10 +24,13 @@ Javis beginnt als modularer Monolith. Module besitzen klare Zuständigkeiten und ## Implementierter Chatfluss -`interface.cli` nimmt Text an, `core.chat_service` verbindet Sitzungsverlauf und -Provider, `providers.ollama` spricht nur die lokale Ollama-HTTP-API an und -`memory.sqlite_store` speichert erfolgreiche Benutzer-/Assistentenpaare atomar. -Scheitert das Modell, wird keine erfundene Antwort gespeichert. +`interface.cli` nimmt Text an und verbindet den `core.provider_router`. +Dieser klassifiziert die aktuelle Anfrage vollständig lokal, minimiert den +freigegebenen Kontext und wählt Gemini oder Ollama. `core.chat_service` speichert +erst eine erfolgreiche Antwort zusammen mit der Benutzernachricht atomar. -Es existiert kein Cloudadapter, Toolaufruf, Obsidian-Zugriff oder eigener -öffentlicher Netzwerkdienst. Der Ollama-Endpunkt muss eine Loopback-Adresse sein. +Gemini ist nur bei lokaler Aktivierung, vorhandenem Key, `free_only = true`, +bestätigtem Nicht-Billing und passender Datenschutzentscheidung erreichbar. +Ollama bleibt Loopback-, Datenschutz-, Offline-, Quota- und Fehlerfallback. +Es existiert weiterhin kein Toolaufruf, Obsidian-Zugriff oder eigener öffentlicher +Netzwerkdienst. diff --git a/docs/CHATGPT_HANDOFF.md b/docs/CHATGPT_HANDOFF.md index f6d915d..f9d4f90 100644 --- a/docs/CHATGPT_HANDOFF.md +++ b/docs/CHATGPT_HANDOFF.md @@ -58,11 +58,12 @@ Rootserver: - Modelle liegen außerhalb von Git unter `D:\Javis-Data\ollama-models`. - Der lokale Ollama-Dienst bindet nur an `127.0.0.1:11434`; PATH, Registry, Autostart und Windows-Dienste blieben unverändert. -- CLI-Befehle: `/new`, `/sessions`, `/load `, `/clear`, `/help`, `/exit`. +- CLI-Befehle: `/new`, `/sessions`, `/load `, `/clear`, `/provider`, + `/privacy`, `/status`, `/help`, `/exit`. - Sitzungsdaten liegen über `JAVIS_DATA_DIR` außerhalb von Git; der bestätigte Smoke-Test nutzte `D:\Javis-Data\runtime\core-chat-smoke`. - Kein Obsidian-, Laptop- oder Rootserverzugriff wurde implementiert. -- Keine Tool-, Sprach-, Mobil-, Status- oder Living-Mind-Funktion ist implementiert. +- Keine Tool-, Sprach-, Mobil- oder Living-Mind-Funktion ist implementiert. - Offizielle Gemini-Prüfung abgeschlossen: `gemini-3.6-flash` und `gemini-3.5-flash-lite` sind stabile GA-Modelle mit Free-Tier-Textnutzung; Standard dieses Pakets wird ausschließlich `gemini-3.6-flash`. @@ -107,8 +108,8 @@ Rootserver: - Ollama-Provider akzeptiert nur lokale HTTP-Loopback-Adressen - SQLite-Sitzungsspeicher mit atomaren Benutzer-/Assistentenpaaren - Laufzeitdaten außerhalb von Git über `JAVIS_DATA_DIR` oder sicheren Plattformstandard -- aktuell ausschließlich lokales Modell; als separates Folgepaket ist Gemini als - bevorzugter kostenloser Provider für ausdrücklich cloudgeeignete Inhalte geplant +- Hybridprovider bevorzugt Gemini für cloudgeeignete Inhalte und verwendet + Ollama bei Datenschutz, Ablehnung, Offline-, Quota- und Providerfehlern - strikter Nullkostenmodus ohne Billing-Aktivierung oder kostenpflichtigen Fallback; lokales Modell bleibt Offline-, Datenschutz-, Ausfall- und Quota-Fallback - Secret-Werte außerhalb von Code, Git, Prompts und Logs @@ -202,6 +203,9 @@ Abnahmestatus: - manuell durch Pascal getestet: am 30.07.2026 erfolgreich; CLI-Start, echte deutsche Antworten, Sitzungskontext, `/sessions`, `/exit`, Neustart, `/load `, vollständiger Verlauf und Fortsetzung +- Gemini/Datenschutz/Fallback automatisiert durch Codex getestet: ja, nur mit + Test-Doubles und lokalem nachrichtenfreiem CLI-Smoke +- Gemini/Datenschutz/Fallback manuell durch Pascal getestet: noch nicht - von Pascal für produktive Verwendung freigegeben: noch nicht ausdrücklich erklärt ## Git-Stand @@ -219,6 +223,13 @@ Abnahmestatus: - lokaler Merge nach `main`: `f3d6dfb` - geprüfter und gepushter Abschlussstand vor diesem Handoff-Update: `0a550e6` - Secret-Provider: `570e7fa` +- Datenschutz/Nullkosten: `286d96d` +- isolierter Gemini-Provider: `f3e1183` +- Hybridrouter: `e57186f` +- lokale Konfiguration: `ab6ea48` +- CLI-Verdrahtung: `af9426e` +- Startskript: `141ff2e` +- Resttests: `a0af15a` - `origin` verwendet HTTPS - kein Force-Push und keine umgeschriebene Historie @@ -231,11 +242,13 @@ Abnahmestatus: - aktuell: isolierte Python-Toolchain und reproduzierbare Entwicklungsumgebung - aktuell: portable Ollama-Laufzeit und `qwen3:8b` außerhalb von Git verifiziert - aktuell: lokaler CLI-Chat und persistente SQLite-Sitzungen vollständig abgenommen +- aktuell: Gemini-Free-Hybridrouting, Datenschutz und Nullkostenmodus + automatisiert vollständig geprüft; manueller Live-Test steht aus ## Offene Entscheidungen und Fehler - endgültiger Produkt-/Repositoryname bleibt offen -- Startmechanismus für Ollama ist noch bewusst manuell und nur pro Prozess konfiguriert +- Startskript startet Ollama bei Bedarf pro Prozess; kein Autostart oder Dienst - Antworten werden noch nicht gestreamt; Sitzungen besitzen noch keine Titel oder Suche - genauer späterer Obsidian-Schreibbereich ist nicht freigegeben - normaler Secret-Provider ist festgelegt: Betriebssystem-Keyring; eine @@ -260,12 +273,9 @@ Abnahmestatus: ## Nächster sinnvoller Auftrag -Auf dem bestehenden Feature-Branch als nächstes einzelnes Arbeitspaket: - -1. veraltete Architektur-, Sicherheits-, Changelog- und Nächste-Sitzung-Texte - auf den tatsächlich implementierten Stand bringen -2. Feature-Branch pushen und vor Pascals manuellem Live-Test stoppen -3. nicht nach `main` mergen +Pascal führt anhand `docs/NEXT_SESSION.md` den echten Gemini-, Ask- und +Never-Test mit ausschließlich künstlichen beziehungsweise unpersönlichen Daten +durch. Bis zu seiner Bestätigung nicht nach `main` mergen. Keinen API-Key in Chat, Git, Obsidian, Logs oder Dokumentation übernehmen. diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index d98f1e9..995754b 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -10,7 +10,8 @@ | ADR-0006 | Ollama und qwen3:8b für den ersten Windows-Chat verwenden | angenommen | | ADR-0007 | Gemini kostenlos bevorzugen, sensible Inhalte lokal halten und niemals Billing aktivieren | angenommen | -Offen bleiben insbesondere das endgültige Runtime-Secret-System, der genaue +Der normale Runtime-Secret-Speicher ist mit dem Betriebssystem-Keyring festgelegt; +keine XML-Secret-Datei. Offen bleiben insbesondere der genaue Obsidian-Schreibbereich, das spätere Laptop-Modell und der Produktname. Ausführliche Begründungen stehen unter [`docs/adr`](adr/README.md). diff --git a/docs/NEXT_SESSION.md b/docs/NEXT_SESSION.md index 2161268..9335a55 100644 --- a/docs/NEXT_SESSION.md +++ b/docs/NEXT_SESSION.md @@ -2,29 +2,44 @@ ## Ziel -Nächstes separates Featurepaket: kostenlose Gemini-Anbindung mit strikt lokalem -Datenschutzrouting und Ollama als Ausfall-, Quota-, Offline- und Sensitivitätsfallback. +Pascal nimmt den Gemini-Free-Provider und die lokalen Fallbacks manuell ab. +Bis dahin bleibt `feat/gemini-privacy-router` ungemergt. -## Vor Änderungen erneut prüfen +## Vorbereitung durch Pascal -1. `git status --short --branch` -2. `git log -1 --oneline` -3. `docs/PROJECT_STATUS.md` -4. offene Entscheidungen in `docs/DECISIONS.md` +1. In Google AI Studio einen neuen, nur für Javis verwendeten Gemini-Auth-Key + erstellen. +2. Für das zugehörige Google-Projekt kein Billing verbinden beziehungsweise den + externen Billingstatus selbst prüfen. +3. Den Key niemals in Chat, Codex, Git, Obsidian oder einen sichtbaren + Kommandozeilenparameter kopieren. +4. Im Repository ausführen: -## Vorgeschlagener Umfang +```powershell +& 'D:\Javis-Tools\uv\uv.exe' run javis configure gemini +& 'D:\Javis-Tools\uv\uv.exe' run javis secrets set gemini +powershell -ExecutionPolicy Bypass -File .\scripts\start-javis.ps1 +``` -- aktuelle kostenlose Gemini-Modelle, Kennungen und Kontingente ausschließlich in - offizieller Google-Dokumentation prüfen; Kandidaten nicht ungeprüft übernehmen -- Providerrouter mit `free_only = true` und ohne Billing-Konfiguration entwerfen -- lokale Datenschutzentscheidung `allowed`, `ask` oder `never` vor jedem Cloudaufruf -- Gemini-Key nur über lokalen Secret-Provider; Wert niemals an Modell, Git, - Obsidian, Logs, Dokumentation oder Chat geben -- Gemini-Erfolg, fehlenden/ungültigen Key, 429, Netzwerkausfall, lokalen Fallback, - `never`, `ask` und ausbleibende Billing-Aktivierung testen +Die erste Einrichtung verlangt zwei lokale Bestätigungen. Der zweite Befehl liest +den Key verdeckt ein und speichert ihn im Windows Credential Manager. -## Nicht beginnen +## Manueller Test -Keinen echten Schlüssel anfordern oder dokumentieren, kein Billingkonto verbinden, -keine kostenpflichtigen Fallbacks, keinen vollständigen Vault übertragen und -weiterhin kein Obsidian-Schreiben, SSH-/Serverzugriff, Sprache oder Living Mind. +1. `/status`: Key und Konfiguration `ja`, Nullkostenmodus `aktiv`. +2. Unpersönlich: `Erkläre in zwei Sätzen, was eine SQLite-Transaktion ist.` +3. `/privacy`: `allowed`, Provider `gemini`, kein Fallback. +4. Ask ohne private Details: `Ich habe eine private Alltagssituation. Nenne nur + allgemeine Möglichkeiten.` Bei der Freigabe Enter drücken; Antwort muss lokal + über Ollama kommen. +5. Never mit Kunstbeispiel: `Nur lokal: Der Beispiel-API-Key ist absichtlich + erfunden.` Es darf keine Cloudfreigabe angeboten werden; Antwort bleibt lokal. +6. `/status`: bereinigte Zähler prüfen, danach `/exit`. + +Erst wenn Pascal diese Punkte bestätigt, darf über den Merge nach `main` +entschieden werden. Google-Quoten sind projektabhängig und in AI Studio zu prüfen. + +## Weiterhin nicht beginnen + +Kein Obsidian-Zugriff, SSH-/Serverzugriff, Sprache, Mobile Client, Tools oder +Living Mind. Keine echten persönlichen Daten für Cloudtests verwenden. diff --git a/docs/PROJECT_STATUS.md b/docs/PROJECT_STATUS.md index a022029..3294d0e 100644 --- a/docs/PROJECT_STATUS.md +++ b/docs/PROJECT_STATUS.md @@ -1,6 +1,6 @@ # Projektstatus -Stand: lokaler Textchat auf `main`, 30.07.2026. +Stand: Gemini-Free-Feature automatisiert geprüft, 30.07.2026. ## Erreicht @@ -30,8 +30,10 @@ Stand: lokaler Textchat auf `main`, 30.07.2026. ## Abnahmestatus -- automatisiert durch Codex getestet: ja -- manuell durch Pascal getestet: ja, am 30.07.2026 +- Core-Chat automatisiert durch Codex getestet: ja +- Core-Chat manuell durch Pascal getestet: ja, am 30.07.2026 +- Gemini/Datenschutz/Fallback automatisiert durch Codex getestet: ja +- Gemini/Datenschutz/Fallback manuell durch Pascal getestet: noch nicht - von Pascal für produktive Verwendung freigegeben: noch nicht ausdrücklich erklärt ## Aktuelles Featurepaket @@ -66,7 +68,7 @@ Stand: lokaler Textchat auf `main`, 30.07.2026. ## Nicht implementiert Obsidian-Adapter, Tools, Serverzugriff, Sprache, Mobile Client, -Living-Mind-Frontend und automatische Ollama-Prozessverwaltung. +Living-Mind-Frontend. ## Git @@ -86,5 +88,6 @@ Living-Mind-Frontend und automatische Ollama-Prozessverwaltung. Ollama wird bewusst manuell in einem eigenen Terminal gestartet. Antworten werden noch nicht gestreamt; Sitzungen haben noch keine Titel, Suche oder Löschfunktion. `qwen3:8b` ist nicht automatisch für die GTX 1050 des späteren Zielhosts geeignet. -Nur Abschlussdokumentation und Feature-Branch-Push fehlen. Es wurde kein echter -API-Key angefordert, angezeigt oder konfiguriert und keine Cloudanfrage ausgeführt. +Der echte Gemini-/Fallback-Test durch Pascal und danach die Mergeentscheidung +fehlen. Es wurde kein echter API-Key angefordert, angezeigt oder konfiguriert und +keine Cloudanfrage ausgeführt. diff --git a/docs/SECURITY.md b/docs/SECURITY.md index 068576f..31019f7 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -14,10 +14,23 @@ Secrets dürfen nie in Code, Git, Prompts, Chatverläufe oder Logs gelangen. Das Modell erfährt nur den Namen, die Verfügbarkeit und ein bereinigtes Aktionsergebnis. -Bevorzugt wird eine Secret-Provider-Abstraktion. Eine optionale lokale XML-Datei wie `key-pw.xml` oder `secrets.local.xml` ist nur als restriktiv geschützte, Git-ignorierte Klartextdatei zulässig. Ins Repository darf höchstens eine leere Beispielstruktur. +Die Secret-Provider-Abstraktion verwendet im normalen Betrieb das +Betriebssystem-Keyring, unter Windows den Credential Manager. Der Gemini-Key wird +verdeckt eingegeben, nie ausgegeben und erst unmittelbar vor einem zulässigen +Cloudaufruf gelesen. Für API-Keys wird keine XML-Secret-Datei verwendet. Eine vorhandene SSH-Schlüsseldatei aus früherer LS25-/Gitea-Arbeit bleibt lokal. Pfad, privater Inhalt und Gerätekennung werden nicht dokumentiert. +## Cloud und Nullkostenmodus + +- Datenschutzklassifizierung `allowed`, `ask` oder `never` erfolgt lokal. +- `ask` ist ohne ausdrückliches Ja abgelehnt; `never` ist nicht übersteuerbar. +- Prompts werden auf den minimal freigegebenen Kontext begrenzt. +- Gemini bleibt ohne Aktivierung, Key und lokale Nicht-Billing-Bestätigung aus. +- Javis aktiviert kein Billing und nutzt keine kostenpflichtigen Zusatzfunktionen. +- Die externe Billingfreiheit kann Javis nicht technisch garantieren; Pascal muss + sie in Google AI Studio beziehungsweise dem Google-Projekt selbst prüfen. + ## Obsidian - gesamter Vault zunächst nur lesend