diff --git a/app/api/chat/route.js b/app/api/chat/route.js index df9f31b..412a940 100644 --- a/app/api/chat/route.js +++ b/app/api/chat/route.js @@ -33,7 +33,7 @@ import { stripSupersededFigures } from '../../../lib/countProvenance.mjs' import { isAggregateClassPartner } from '../../../lib/classPartners.mjs' import { planNextAttempt } from '../../../lib/callBudget.mjs' import { detectJailbreakRule } from '../../../lib/jailbreak.mjs' -import { safeToolArgs } from '../../../lib/safeToolArgs.mjs' +import { safeToolArgs, safeText } from '../../../lib/safeToolArgs.mjs' import { createRunSignal, throwIfAborted, isRunAbortedWith, NOBODY_WAITING } from '../../../lib/runSignal.mjs' import { parseScrnaseqClusters, parseClusterExpression, extractRequestedGenes, buildExpressionMatrix, renderExpressionMarkdown } from '../../../lib/scrnaseq.mjs' import { pickSeedIndividuals, parseSimilarityHits, groupSimilarByClass } from '../../../lib/similarNeurons.mjs' @@ -1203,7 +1203,7 @@ async function callMcpToolWithRetry(client, name, args, { retries = VFB_MCP_MAX_ // `spent` and `next` are the two facts that were missing when this was // diagnosed from logs alone: a stall looks exactly like a server refusing // three times unless the line says which budget ran out. - console.error(`[VFBchat] MCP CALL FAILED | tool=${name} | attempt=${attempt + 1}/${retries + 1} | transient=${transient} | spent=${elapsedMs}ms/${budgetMs}ms | next=${next.reason} | args=${safeToolArgs(args)} | error=${error?.message || error}`) + console.error(`[VFBchat] MCP CALL FAILED | tool=${name} | attempt=${attempt + 1}/${retries + 1} | transient=${transient} | spent=${elapsedMs}ms/${budgetMs}ms | next=${next.reason} | args=${safeToolArgs(args)} | error=${safeText(error?.message || error)}`) if (!next.retry) throw error attemptTimeoutMs = next.timeoutMs if (next.waitMs > 0) await new Promise(resolve => setTimeout(resolve, next.waitMs)) @@ -1277,7 +1277,7 @@ async function callMcpToolTextWithForceRefresh(client, name, args, { budget } = if (!isFailedRunQueryPayload(retryText)) return retryText return annotateFailedRunQuery(retryText) } catch (error) { - console.error(`[VFBchat] force_refresh retry for ${name} failed: ${error?.message || error}`) + console.error(`[VFBchat] force_refresh retry for ${name} failed: ${safeText(error?.message || error)}`) return annotateFailedRunQuery(text) } } diff --git a/app/page.js b/app/page.js index 8a3d0e3..92b2ff8 100644 --- a/app/page.js +++ b/app/page.js @@ -1031,7 +1031,7 @@ export default function Home() { - Raw security logs are retained for up to 30 days - We do not store full chat content for routine analytics - If you report a problem, you can optionally attach the visible chat for investigation for up to 30 days -- Do not share confidential or sensitive information +- Do not share personal, confidential or sensitive information - Use this tool to enhance your understanding of neuroscience concepts - See the [Privacy Notice](/privacy) for more information diff --git a/app/privacy/page.js b/app/privacy/page.js index e2aa589..3a10d1e 100644 --- a/app/privacy/page.js +++ b/app/privacy/page.js @@ -19,6 +19,36 @@ export default function PrivacyPage() { VFB Chat is a public-facing AI-assisted interface to Virtual Fly Brain data.

+
+

Who is responsible for your data

+

+ The University of Edinburgh is the data controller for the personal data + described in this notice. The University is registered with the Information + Commissioner’s Office under registration number Z6426984. VFB Chat is operated by the + Virtual Fly Brain project in the School of Informatics. +

+
+ +
+

Our lawful basis

+

+ We process this data in the performance of a task carried out in the public + interest (UK GDPR Article 6(1)(e)). The University’s constitution is + statutory — the Universities (Scotland) Acts 1858 to 1966 — and the Further and + Higher Education (Scotland) Act 2005 provides for the undertaking of research among + fundable bodies, of which the University is one. Operating Virtual Fly Brain as an open + research resource, and making its data reachable, falls within those functions. We process + only the minimum technical data needed to run the service securely and to show how much it + is used; the IP address held for abuse prevention is processed on the same basis, because + it exists solely to keep that service available. +

+

+ Where you choose to attach a conversation to a problem report, we rely on your{' '} + consent for that transcript. You do not have to attach one, and you can + ask us to delete it at any time. +

+
+

What We Collect