feat(assistant)!: no hand-off and no connector; the field searches the web (ADR 0022)

The developer decided on 23 Oct to drop the hand-off to an AI assistant
outside the app, and Claude's connector with it, in v0.19.0, the app and
the server together: build 22 raises minimumAppBuild anyway, so no app
calling the connector's endpoints uses the instance after it. An instance
is to have one way to an assistant, its operator's (ADR 0021, proposed).

The app: the field at the foot of Home, and the button in the Library, on
a studyset and while studying, search the web alone, through the engine
chosen in Settings or Android's own search, with the parts of a card the
person picks; a studyset's name and description are never offered. Gone:
the assistants a question opened in (AiAssistant, AssistantHandOff), the
switch between them and the web, Settings' choice of assistant, Connect
Claude with its route, cubit, repository and gateway, and their texts. A
settings file from before keeps the old keys until the next change of a
setting writes it anew; nothing reads them.

The server: lib/src/assistant/ (MCP, its OAuth, the five tools, connect
codes and tokens), AssistantEndpoint, the daily forgetting of the
connector's secrets (its scheduled call cancelled at start), its lines in
the deletion hook, instance.info().assistantConnectorUrl (nullable, so an
older app reads it as none), and Caddy's forwarding of /mcp, /oauth/* and
/.well-known/oauth-*. The migration drops the connector's five tables,
children first:

  DROP TABLE "assistant_token" CASCADE;       -- tokens of a connection
  DROP TABLE "assistant_grant" CASCADE;       -- OAuth codes of a connection
  DROP TABLE "assistant_connection" CASCADE;  -- a person's connected client
  DROP TABLE "assistant_connect_code" CASCADE;
  DROP TABLE "assistant_client" CASCADE;      -- OAuth clients registered

No other table references them, so CASCADE drops only their own foreign
keys. For the minute between the maintenance run and the switch, the old
server answers the connector with errors and fails to delete an account
(its hook still deletes from these tables); ADR 0022 says so.

BREAKING CHANGE: a connected Claude gets no answer from the deploy on, and
the app no longer opens a question in an AI assistant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-23 15:33:53 +02:00
commit ca24eb9cf9
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1817,55 +1817,23 @@
"feedbackNeedsIdentity": "Melde dich an, um im Original zu melden und vorzuschlagen.",
"kanjiExampleWords": "Wörter damit",
"settingsAssistant": "Assistent",
"settingsAskAssistant": "Einen KI-Assistenten fragen oder im Web suchen",
"settingsAskAssistantSubtitle": "Aus, bis du es einschaltest. Fügt ein Feld auf der Startseite und einen Knopf in der Bibliothek, bei einem Lernset und beim Lernen hinzu. Eine Frage öffnet sich in dem KI-Assistenten, den du wählst, oder als Websuche, nur mit dem Zusammenhang, den du wählst; von hier aus wird nichts gesendet.",
"assistantHint": "Frag {assistant}…",
"assistantHintStudyset": "Frag {assistant} zu {title}…",
"assistantHintCard": "Frag {assistant} zu dieser Karte…",
"assistantSend": "In {assistant} fragen",
"assistantOpen": "Fragen oder suchen",
"settingsAssistant": "Websuche",
"settingsAskAssistant": "Aus der App im Web suchen",
"settingsAskAssistantSubtitle": "Aus, bis du es einschaltest. Fügt ein Feld auf der Startseite und einen Knopf in der Bibliothek, bei einem Lernset und beim Lernen hinzu. Eine Frage öffnet sich als Websuche, nur mit den Teilen einer Karteikarte, die du wählst; von hier aus wird nichts gesendet.",
"assistantOpen": "Im Web suchen",
"assistantClose": "Schließen",
"assistantOpenFailed": "{assistant} ließ sich nicht öffnen.",
"assistantConnectTitle": "Claude verbinden",
"assistantConnectSubtitle": "Claude deine Lernsets lesen lassen",
"assistantConnectIntro": "Claude kann über den Konnektor von Halkyon Learn deine Lernsets, Karten, Notizen und deinen Lernstand auf {instance} lesen und dazu antworten. Ändern kann es nichts. Was es liest, geht an Anthropic, unter deren Datenschutzerklärung.",
"assistantStepAdd": "Öffne in Claude Einstellungen › Konnektoren und füge einen eigenen Konnektor namens Halkyon Learn mit dieser Adresse hinzu. Einmal hinzugefügt, gilt er auch in den Apps von Claude.",
"assistantStepCode": "Claude öffnet dann eine Seite, die nach einem Code fragt. Hol ihn dir hier: Er gilt einmal, zehn Minuten lang.",
"assistantShowCode": "Code anzeigen",
"assistantNewCode": "Neuer Code",
"assistantCodeValid": "Gültig bis {time}",
"assistantCopy": "Kopieren",
"assistantCopied": "Kopiert",
"assistantConnected": "Verbunden",
"assistantNoneConnected": "Noch nichts verbunden.",
"assistantConnectedOn": "verbunden am {date}",
"assistantLastRead": "zuletzt gelesen am {date}",
"assistantDisconnect": "Trennen",
"assistantDisconnectTitle": "{name} trennen?",
"assistantDisconnectMessage": "Es kann deine Lernsets nicht mehr lesen. Mit einem neuen Code kannst du es wieder verbinden.",
"assistantNotOffered": "Diese Instanz bietet noch keinen Konnektor an. Fragen öffnen sich trotzdem in dem KI-Assistenten, den du gewählt hast, mit dem, worum es geht.",
"assistantUnreachable": "Die Instanz ist nicht erreichbar. Versuch es noch einmal, sobald du online bist.",
"assistantRetry": "Erneut versuchen",
"assistantLineFront": "Vorderseite: {text}",
"assistantLineBack": "Rückseite: {text}",
"assistantLineHint": "Hinweis {number}: {text}",
"assistantLineExplanation": "Erklärung: {text}",
"assistantLineStudyset": "Lernset: „{title}“ in Halkyon Learn auf {instance}",
"assistantLineDescription": "Beschreibung: {text}",
"assistantChipStudyset": "Lernset: {title}",
"assistantContextLabel": "Mitsenden",
"assistantTargetWeb": "Web",
"assistantSwitchToWeb": "Stattdessen im Web suchen",
"assistantSwitchToAssistant": "Stattdessen {assistant} fragen",
"assistantHintWeb": "Im Web suchen…",
"assistantSendWeb": "Suchen",
"assistantSearchFailed": "Die Suche ließ sich nicht öffnen.",
"settingsSearchEngine": "Suchmaschine",
"settingsAiAssistant": "KI-Assistent",
"aiAssistantCustomHint": "https://example.org/chat?q=%s",
"searchEngineDevice": "Suche des Geräts",
"searchEngineCustom": "Eigene Adresse",
"searchEngineCustomHint": "https://example.org/search?q=%s",
@ -2071,7 +2039,7 @@
"studysetPrivateTitle": "„{title}“ privat machen?",
"studysetPrivateBody": "Alles darin wird auf deinen Geräten Ende-zu-Ende-verschlüsselt: Die Instanz kann es weder lesen noch veröffentlichen noch Claude zeigen. Kopien in den Sicherungen der Instanz bleiben lesbar, bis diese ablaufen.",
"studysetReadableTitle": "„{title}“ nicht mehr privat?",
"studysetReadableBody": "Alles darin wird entschlüsselt und neu synchronisiert, sodass die Instanz es lesen kann: Du kannst es veröffentlichen, und Claude kann es über den Connector lesen.",
"studysetReadableBody": "Alles darin wird entschlüsselt und neu synchronisiert, sodass die Instanz es lesen kann: Du kannst es veröffentlichen.",
"studysetPrivateNoKeys": "Melde dich auf diesem Gerät mit deinem Passwort an, um Lernsets privat zu machen.",
"studysetPrivateSomeLocked": "Manches darin ließ sich auf diesem Gerät nicht öffnen und blieb, wie es war.",
"publishTagsSent": "Die Namen der Tags, die mitgehen und die die Instanz erfährt: {names}",
@ -2111,7 +2079,7 @@
"studysetPrivacyPrivateTitle": "„{title}“ ist privat",
"studysetPrivacyPrivateBody": "Alles darin ist Ende-zu-Ende-verschlüsselt: Nur deine Geräte können es lesen. Die Instanz kann es weder veröffentlichen noch Claude zeigen. Nicht mehr privat, wird es entschlüsselt und neu synchronisiert, sodass die Instanz es lesen kann.",
"studysetPrivacyReadableTitle": "„{title}“ ist nicht privat",
"studysetPrivacyReadableBody": "Die Instanz kann es lesen: Du kannst es veröffentlichen, und Claude kann es über den Connector lesen. Privat wird es auf deinen Geräten Ende-zu-Ende-verschlüsselt; Kopien in den Sicherungen der Instanz bleiben lesbar, bis diese ablaufen.",
"studysetPrivacyReadableBody": "Die Instanz kann es lesen: Du kannst es veröffentlichen. Privat wird es auf deinen Geräten Ende-zu-Ende-verschlüsselt; Kopien in den Sicherungen der Instanz bleiben lesbar, bis diese ablaufen.",
"studysetPrivacyTopic": "Seine Privatsphäre ist die des Lernsets, in dem es liegt.",
"studysetPrivacyPublish": "Veröffentlichen …"
}