diff --git a/messages/de.json b/messages/de.json index 86d3f10c9..4e2c2468d 100644 --- a/messages/de.json +++ b/messages/de.json @@ -6335,7 +6335,7 @@ "endpointLabel": "Connector-URL", "connectDescription": "Füge diese URL in die Einrichtung des eigenen Connectors deines Assistenten ein und autorisiere dich mit dem Token unten oder melde dich bei Aufforderung an.", "tokensTitle": "Connector-Tokens", - "tokensDescription": "Erzeuge ein Token, um einen Assistenten zu verbinden. Ob es nur lesen oder auch eintragen darf, legst du beim Erzeugen fest.", + "tokensDescription": "Erzeuge ein Token für einen Assistenten — nur Lesezugriff, außer du erlaubst unten das Eintragen.", "scopeNote": "Neue Tokens können nur deine eigenen Daten lesen. Schreibzugriff (health:write) vergibst du pro Token über den Schalter unten. Admin-Funktionen erreicht ein Token nie.", "writeScopeToggleLabel": "Eintragen erlauben (health:write)", "writeScopeNote": "Fügt den Scope health:write hinzu, damit der Assistent neue Messwerte und Stimmungseinträge in dein Konto eintragen kann. Jeder Schreibvorgang wird zuvor bestätigt. Das Token kann weiterhin keine vorhandenen Einträge löschen oder ändern, keine Medikamente bearbeiten und keine REST- oder Admin-Funktionen erreichen. Für reinen Lesezugriff ausgeschaltet lassen.", diff --git a/messages/en.json b/messages/en.json index 2c23472a0..9ac68943d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -6335,7 +6335,7 @@ "endpointLabel": "Connector URL", "connectDescription": "Paste this URL into your assistant's custom-connector setup, then authorize with the token below or sign in when prompted.", "tokensTitle": "Connector tokens", - "tokensDescription": "Mint a token to connect an assistant. Whether it can only read or also log entries is set when you mint it.", + "tokensDescription": "Mint a token to connect an assistant — read-only unless you allow logging below.", "scopeNote": "New tokens can only read your own records. Write access (health:write) is granted per token with the toggle below. A token can never reach admin functions.", "writeScopeToggleLabel": "Allow logging (health:write)", "writeScopeNote": "Adds the health:write scope so the assistant can log new measurements and mood entries to your account. Every write is confirmed first. The token still can't delete or edit existing entries, change medications, or reach REST or admin functions. Leave off for read-only access.", diff --git a/messages/es.json b/messages/es.json index 43ad3e707..b46e7ab59 100644 --- a/messages/es.json +++ b/messages/es.json @@ -6335,7 +6335,7 @@ "endpointLabel": "URL del conector", "connectDescription": "Pega esta URL en la configuración del conector personalizado de tu asistente y autoriza con el token de abajo o inicia sesión cuando se te solicite.", "tokensTitle": "Tokens del conector", - "tokensDescription": "Genera un token para conectar un asistente. Al generarlo decides si solo puede leer o también registrar datos.", + "tokensDescription": "Genera un token para conectar un asistente: solo lectura, salvo que permitas el registro abajo.", "scopeNote": "Los tokens nuevos solo pueden leer tus propios registros. El acceso de escritura (health:write) se concede por token con el interruptor de abajo. Un token nunca puede acceder a funciones de administración.", "writeScopeToggleLabel": "Permitir registro (health:write)", "writeScopeNote": "Añade el ámbito health:write para que el asistente pueda registrar nuevas mediciones y entradas de estado de ánimo en tu cuenta. Cada escritura se confirma antes. El token sigue sin poder eliminar ni editar entradas existentes, cambiar medicamentos ni acceder a funciones REST o de administración. Déjalo desactivado para acceso de solo lectura.", diff --git a/messages/fr.json b/messages/fr.json index 1b5f8edcb..821569cf0 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -6335,7 +6335,7 @@ "endpointLabel": "URL du connecteur", "connectDescription": "Collez cette URL dans la configuration du connecteur personnalisé de votre assistant, puis autorisez avec le jeton ci-dessous ou connectez-vous lorsque vous y êtes invité.", "tokensTitle": "Jetons du connecteur", - "tokensDescription": "Générez un jeton pour connecter un assistant. Au moment de le créer, vous décidez s'il peut seulement lire ou aussi enregistrer des données.", + "tokensDescription": "Générez un jeton pour connecter un assistant — lecture seule, sauf si vous autorisez l'écriture ci-dessous.", "scopeNote": "Les nouveaux jetons ne peuvent que lire vos propres données. L'accès en écriture (health:write) s'accorde par jeton avec le commutateur ci-dessous. Un jeton ne peut jamais atteindre les fonctions d'administration.", "writeScopeToggleLabel": "Autoriser l'enregistrement (health:write)", "writeScopeNote": "Ajoute la portée health:write pour que l'assistant puisse enregistrer de nouvelles mesures et entrées d'humeur dans votre compte. Chaque écriture est d'abord confirmée. Le jeton ne peut toujours pas supprimer ni modifier des entrées existantes, changer les médicaments, ni atteindre les fonctions REST ou d'administration. Laissez désactivé pour un accès en lecture seule.", diff --git a/messages/it.json b/messages/it.json index ea4102092..b60ec764f 100644 --- a/messages/it.json +++ b/messages/it.json @@ -6335,7 +6335,7 @@ "endpointLabel": "URL del connettore", "connectDescription": "Incolla questo URL nella configurazione del connettore personalizzato del tuo assistente e autorizza con il token qui sotto o accedi quando richiesto.", "tokensTitle": "Token del connettore", - "tokensDescription": "Genera un token per collegare un assistente. Al momento della creazione decidi se può solo leggere o anche registrare dati.", + "tokensDescription": "Genera un token per collegare un assistente: sola lettura, a meno che tu non consenta la scrittura qui sotto.", "scopeNote": "I nuovi token possono solo leggere i tuoi dati. L'accesso in scrittura (health:write) si concede per singolo token con l'interruttore qui sotto. Un token non può mai raggiungere le funzioni di amministrazione.", "writeScopeToggleLabel": "Consenti la registrazione (health:write)", "writeScopeNote": "Aggiunge l'ambito health:write così l'assistente può registrare nuove misurazioni e voci dell'umore nel tuo account. Ogni scrittura viene prima confermata. Il token non può comunque eliminare o modificare voci esistenti, cambiare i farmaci o raggiungere funzioni REST o di amministrazione. Lascia disattivato per l'accesso in sola lettura.", diff --git a/messages/pl.json b/messages/pl.json index 8ac4c118b..8a8535afd 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -6335,7 +6335,7 @@ "endpointLabel": "Adres URL łącznika", "connectDescription": "Wklej ten adres URL w konfiguracji własnego łącznika asystenta, a następnie autoryzuj za pomocą poniższego tokenu lub zaloguj się po wyświetleniu monitu.", "tokensTitle": "Tokeny łącznika", - "tokensDescription": "Wygeneruj token, aby połączyć asystenta. Przy tworzeniu decydujesz, czy może tylko odczytywać, czy także zapisywać dane.", + "tokensDescription": "Wygeneruj token dla asystenta — tylko odczyt, chyba że pozwolisz poniżej na zapis.", "scopeNote": "Nowe tokeny mogą tylko odczytywać Twoje dane. Dostęp do zapisu (health:write) przyznajesz dla każdego tokena przełącznikiem poniżej. Token nigdy nie może uzyskać dostępu do funkcji administracyjnych.", "writeScopeToggleLabel": "Zezwól na zapis (health:write)", "writeScopeNote": "Dodaje zakres health:write, aby asystent mógł zapisywać nowe pomiary i wpisy nastroju na Twoim koncie. Każdy zapis jest najpierw potwierdzany. Token nadal nie może usuwać ani edytować istniejących wpisów, zmieniać leków ani uzyskiwać dostępu do funkcji REST lub administracyjnych. Pozostaw wyłączone, aby uzyskać dostęp tylko do odczytu.", diff --git a/src/app/api/whoop/webhook/[token]/__tests__/route.test.ts b/src/app/api/whoop/webhook/[token]/__tests__/route.test.ts index d9cd60e9c..ddf3950fe 100644 --- a/src/app/api/whoop/webhook/[token]/__tests__/route.test.ts +++ b/src/app/api/whoop/webhook/[token]/__tests__/route.test.ts @@ -11,7 +11,10 @@ vi.mock("@/lib/api-handler", () => ({ vi.mock("@/lib/db", () => ({ prisma: { whoopConnection: { findUnique: vi.fn() }, - measurement: { updateMany: vi.fn() }, + measurement: { + updateMany: vi.fn(), + findMany: vi.fn(async () => []), + }, workout: { deleteMany: vi.fn() }, }, })); diff --git a/src/lib/jobs/__tests__/coach-reminder-sweep.test.ts b/src/lib/jobs/__tests__/coach-reminder-sweep.test.ts index d9b45d0d2..30e089b45 100644 --- a/src/lib/jobs/__tests__/coach-reminder-sweep.test.ts +++ b/src/lib/jobs/__tests__/coach-reminder-sweep.test.ts @@ -21,9 +21,11 @@ vi.mock("@/lib/ai/coach/bytes-codec", () => ({ // The context-cue backstop delegates to the shared evaluator; its own // behaviour is pinned in `ai/coach/__tests__/context-reminders.test.ts`. -const contextEvaluateMock = vi.fn(async (..._args: unknown[]) => ({ - surfaced: 0, - errored: 0, +const { contextEvaluateMock } = vi.hoisted(() => ({ + contextEvaluateMock: vi.fn(async (..._args: unknown[]) => ({ + surfaced: 0, + errored: 0, + })), })); vi.mock("@/lib/ai/coach/context-reminders", () => ({ evaluateCoachContextReminders: contextEvaluateMock, diff --git a/src/lib/jobs/__tests__/reminder-satisfy.test.ts b/src/lib/jobs/__tests__/reminder-satisfy.test.ts index 77a9e35b7..b67ac2e74 100644 --- a/src/lib/jobs/__tests__/reminder-satisfy.test.ts +++ b/src/lib/jobs/__tests__/reminder-satisfy.test.ts @@ -21,9 +21,11 @@ vi.mock("@/lib/jobs/boss-instance", () => ({ // the Vorsorge assertions stay isolated; one test below pins that the hook // actually fires (watched red: removing the call site in // `runReminderSatisfyForUser` fails it). -const evaluateContextMock = vi.fn(async (..._args: unknown[]) => ({ - surfaced: 0, - errored: 0, +const { evaluateContextMock } = vi.hoisted(() => ({ + evaluateContextMock: vi.fn(async (..._args: unknown[]) => ({ + surfaced: 0, + errored: 0, + })), })); vi.mock("@/lib/ai/coach/context-reminders", () => ({ evaluateCoachContextReminders: evaluateContextMock,