diff --git a/Flowlight.xcodeproj/project.pbxproj b/Flowlight.xcodeproj/project.pbxproj index 84890792..d918aeec 100644 --- a/Flowlight.xcodeproj/project.pbxproj +++ b/Flowlight.xcodeproj/project.pbxproj @@ -2252,7 +2252,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 74; + CURRENT_PROJECT_VERSION = 75; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -2267,7 +2267,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.17.0; + MARKETING_VERSION = 0.17.1; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2313,7 +2313,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 74; + CURRENT_PROJECT_VERSION = 75; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 38RJUJHKZS; ENABLE_HARDENED_RUNTIME = YES; @@ -2328,7 +2328,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.17.0; + MARKETING_VERSION = 0.17.1; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2393,7 +2393,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 74; + CURRENT_PROJECT_VERSION = 75; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = ""; ENABLE_HARDENED_RUNTIME = YES; @@ -2414,7 +2414,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 15.0; - MARKETING_VERSION = 0.17.0; + MARKETING_VERSION = 0.17.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; diff --git a/Flowlight/Export/ExportSettingsView.swift b/Flowlight/Export/ExportSettingsView.swift index c4e90428..940e49c1 100644 --- a/Flowlight/Export/ExportSettingsView.swift +++ b/Flowlight/Export/ExportSettingsView.swift @@ -171,7 +171,7 @@ struct ExportSettingsTab: View { } header: { Text(L("What Flowlight sends")) } footer: { - Text(L("A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down.")) + Text(L("A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down.")) .font(.caption).foregroundStyle(.secondary) } } @@ -239,7 +239,7 @@ struct ExportSettingsTab: View { } header: { Text(L("Status")) } footer: { - Text(L("Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight.")) + Text(L("Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight.")) .font(.caption).foregroundStyle(.secondary) } } diff --git a/Flowlight/Localization/de.lproj/Localizable.strings b/Flowlight/Localization/de.lproj/Localizable.strings index b404b584..fdce169e 100644 --- a/Flowlight/Localization/de.lproj/Localizable.strings +++ b/Flowlight/Localization/de.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "Live"; "AI Agents" = "KI-Agenten"; -"Reports" = "Berichte"; "Alerts" = "Warnungen"; "Rules" = "Regeln"; "Ask" = "Fragen"; @@ -321,7 +320,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Hostnamen dieses Mac mitsenden"; "What Flowlight sends" = "Was Flowlight sendet"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Eine Zusammenfassung ist eine App, ein Hostname und eine IP-Adresse, über den Zeitraum addiert, in derselben Minutenauflösung, die Berichte nutzen – nie pro Verbindung und nie pro Paket. Zusammenfassungen gehen etwa zwei Minuten verzögert, sobald die zugehörige Minute vollständig ist; Warnungen gehen, sobald sie ausgelöst werden. Ein nicht erreichbarer Collector wird mit wachsender Verzögerung erneut versucht, und während er ausfällt, werden höchstens 10.000 Datensätze vorgehalten."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Eine Zusammenfassung ist eine App, ein Hostname und eine IP-Adresse, über den Zeitraum addiert, in derselben Minutenauflösung, die der Verlauf nutzt – nie pro Verbindung und nie pro Paket. Zusammenfassungen gehen etwa zwei Minuten verzögert, sobald die zugehörige Minute vollständig ist; Warnungen gehen, sobald sie ausgelöst werden. Ein nicht erreichbarer Collector wird mit wachsender Verzögerung erneut versucht, und während er ausfällt, werden höchstens 10.000 Datensätze vorgehalten."; "Every field that can leave this Mac (%lld)" = "Jedes Feld, das diesen Mac verlassen kann (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Diese Liste ist alles – sie wird aus derselben Deklaration erzeugt, aus der die Nutzlast gebaut wird, und kann dem Code daher nicht nachhinken. Nie gesendet, in keinem Format und was auch sonst eingeschaltet ist: alles, was die HTTPS-Inspektion aufzeichnet. Header von Anfragen und Antworten, Bodys, Tool-Aufrufe und die Inhalte eines entschlüsselten Austauschs haben keinen Weg in einen Export."; "Show What Would Be Sent…" = "Anzeigen, was gesendet würde…"; @@ -338,7 +337,7 @@ "Dropped" = "Verworfen"; "Retrying" = "Neuer Versuch"; "Status" = "Status"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exporte gehen als eigener Datenverkehr von Flowlight hinaus, Sie sehen sie also in Live und Berichten wie den jeder anderen App, und beim ersten Mal an ein neues Ziel erhalten Sie eine Erstkontakt-Warnung zu Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exporte gehen als eigener Datenverkehr von Flowlight hinaus, Sie sehen sie also in Live und Verlauf wie den jeder anderen App, und beim ersten Mal an ein neues Ziel erhalten Sie eine Erstkontakt-Warnung zu Flowlight."; "What would be sent" = "Was gesendet würde"; "Copy" = "Kopieren"; "Done" = "Fertig"; @@ -442,7 +441,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ der Uploads dieses Agenten gingen an Nicht-KI-Hosts"; "Allowlist" = "Erlaubnisliste"; "Risk" = "Risiko"; -"Show Traffic in Reports" = "Datenverkehr in Berichten zeigen"; +"Show Traffic in History" = "Datenverkehr im Verlauf zeigen"; "None seen" = "Keine gesehen"; "Large upload" = "Großer Upload"; "%@ sent to hosts that aren't AI providers" = "%@ an Hosts gesendet, die keine KI-Anbieter sind"; @@ -481,7 +480,7 @@ "MCP servers (%lld)" = "MCP-Server (%lld)"; "MCP servers" = "MCP-Server"; "Guardrails" = "Schutzregeln"; -"Open in Reports" = "In Berichten öffnen"; +"Open in History" = "Im Verlauf öffnen"; "Only AI providers. Nothing else was contacted." = "Nur KI-Anbieter. Sonst wurde nichts kontaktiert."; "the tool calls its model asks for" = "die Tool-Aufrufe, die sein Modell anfordert"; "tool calls" = "Tool-Aufrufe"; @@ -616,7 +615,7 @@ "Documentation" = "Dokumentation"; "1 query · %@" = "1 Abfrage · %@"; "%lld queries · %@" = "%lld Abfragen · %@"; -"Open these rows in Reports" = "Diese Zeilen in Berichten öffnen"; +"Open these rows in History" = "Diese Zeilen im Verlauf öffnen"; "Answered on this Mac · %@" = "Auf diesem Mac beantwortet · %@"; "1 request left this Mac · %@" = "1 Anfrage hat diesen Mac verlassen · %@"; "%lld requests left this Mac · %@" = "%lld Anfragen haben diesen Mac verlassen · %@"; @@ -1022,13 +1021,13 @@ "Zero" = "Null"; "Last 2 minutes" = "Letzte 2 Minuten"; "Application" = "App"; -"%@\nDouble-click to open in Reports" = "%@\nDoppelklick öffnet in Berichten"; +"%@\nDouble-click to open in History" = "%@\nDoppelklick öffnet im Verlauf"; "↓ In" = "↓ Empfangen"; "↑ Out" = "↑ Gesendet"; "Session ↓" = "Sitzung ↓"; "Session ↑" = "Sitzung ↑"; "Busiest destination" = "Aktivstes Ziel"; -"Show in Reports" = "In Berichten zeigen"; +"Show in History" = "Im Verlauf zeigen"; "Copy Bundle ID" = "Bundle-ID kopieren"; "Top talkers · average of the last 5 seconds" = "Aktivste Apps · Mittel der letzten 5 Sekunden"; "The network is quiet" = "Das Netzwerk ist ruhig"; @@ -1265,7 +1264,7 @@ "Nothing is being refused until %@." = "Bis %@ wird nichts verweigert."; "Resume now" = "Jetzt fortsetzen"; "No rules yet" = "Noch keine Regeln"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Eine Regel benennt etwas – eine App, einen Agenten, ein Ziel oder eine URL – und sagt blockieren oder erlauben. Klicken Sie in Live, Berichten, KI-Agenten oder Inspizieren mit der rechten Maustaste auf eine Zeile, um eine Regel zu dem zu schreiben, was Sie gerade ansehen, oder beginnen Sie mit den Vorlagen: Dort stehen schon die Hosts, die eine Paketinstallation erreicht, und die, über die eine Datei den Mac verlässt."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Eine Regel benennt etwas – eine App, einen Agenten, ein Ziel oder eine URL – und sagt blockieren oder erlauben. Klicken Sie in Live, Verlauf, KI-Agenten oder Inspizieren mit der rechten Maustaste auf eine Zeile, um eine Regel zu dem zu schreiben, was Sie gerade ansehen, oder beginnen Sie mit den Vorlagen: Dort stehen schon die Hosts, die eine Paketinstallation erreicht, und die, über die eine Datei den Mac verlässt."; "Browse Templates…" = "Vorlagen durchsuchen…"; "Write One…" = "Eine schreiben…"; "Nothing yet" = "Noch nichts"; @@ -1341,7 +1340,7 @@ "First contact with a new domain" = "Erster Kontakt mit einer neuen Domain"; "Connections to non-standard ports" = "Verbindungen zu Nicht-Standard-Ports"; "Ignore Apple's own apps" = "Apples eigene Apps ignorieren"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS spricht ständig mit Apple – Updates, iCloud, Push, Zeit – und all das zu melden verschüttet die eine Zeile, die zählt. Dieser Datenverkehr wird weiter aufgezeichnet, weiter in Live und Berichten gezeigt und unterliegt weiter jeder Regel und Schutzregel."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS spricht ständig mit Apple – Updates, iCloud, Push, Zeit – und all das zu melden verschüttet die eine Zeile, die zählt. Dieser Datenverkehr wird weiter aufgezeichnet, weiter in Live und Verlauf gezeigt und unterliegt weiter jeder Regel und Schutzregel."; "Agent uses email, file transfer, SSH, tunnels or databases" = "Agent nutzt E-Mail, Dateiübertragung, SSH, Tunnel oder Datenbanken"; "Agent connects to a raw IP on an unusual port" = "Agent verbindet sich über einen ungewöhnlichen Port mit einer reinen IP"; "Uploads to non-AI hosts above" = "Uploads an Nicht-KI-Hosts über"; @@ -1618,7 +1617,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1820,7 +1819,7 @@ "Showing %lld of %lld relationships" = "%lld von %lld Beziehungen werden angezeigt"; "Show %lld more relationships" = "%lld weitere Beziehungen anzeigen"; "Loads the next page without changing the Map" = "Lädt die nächste Seite, ohne die Karte zu ändern"; -"Select a relationship for an exact Reports scope." = "Wähle eine Beziehung für einen exakten Berichtsbereich aus."; +"Select a relationship for an exact History scope." = "Wähle eine Beziehung für einen exakten Verlaufsbereich aus."; "Period" = "Zeitraum"; "No traffic to visualize" = "Kein Datenverkehr zum Visualisieren"; "Flowlight has not observed any connections in this period." = "Flowlight hat in diesem Zeitraum keine Verbindungen beobachtet."; @@ -1866,7 +1865,7 @@ "Select to inspect this connection" = "Auswählen, um diese Verbindung zu untersuchen"; "%lld exact destinations" = "%lld exakte Ziele"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ zu %@, %@ empfangen, %@ gesendet, %lld Verbindungen"; -"Show domain family in Reports" = "Domainfamilie in Berichte anzeigen"; +"Show domain family in History" = "Domainfamilie in Verlauf anzeigen"; /* 0.17.0 History and Connections */ "1 mo" = "1 Mon."; diff --git a/Flowlight/Localization/en.lproj/Localizable.strings b/Flowlight/Localization/en.lproj/Localizable.strings index ee9b98c7..95234425 100644 --- a/Flowlight/Localization/en.lproj/Localizable.strings +++ b/Flowlight/Localization/en.lproj/Localizable.strings @@ -67,7 +67,6 @@ /* App/AppNavigation.swift */ "Live" = "Live"; "AI Agents" = "AI Agents"; -"Reports" = "Reports"; "Alerts" = "Alerts"; "Rules" = "Rules"; "Ask" = "Ask"; @@ -323,7 +322,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Include this Mac's host name"; "What Flowlight sends" = "What Flowlight sends"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down."; "Every field that can leave this Mac (%lld)" = "Every field that can leave this Mac (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export."; "Show What Would Be Sent…" = "Show What Would Be Sent…"; @@ -340,7 +339,7 @@ "Dropped" = "Dropped"; "Retrying" = "Retrying"; "Status" = "Status"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight."; "What would be sent" = "What would be sent"; "Copy" = "Copy"; "Done" = "Done"; @@ -414,7 +413,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ of this agent's uploads went to non-AI hosts"; "Allowlist" = "Allowlist"; "Risk" = "Risk"; -"Show Traffic in Reports" = "Show Traffic in Reports"; +"Show Traffic in History" = "Show Traffic in History"; "None seen" = "None seen"; "Large upload" = "Large upload"; "%@ sent to hosts that aren't AI providers" = "%@ sent to hosts that aren't AI providers"; @@ -453,7 +452,7 @@ "MCP servers (%lld)" = "MCP servers (%lld)"; "MCP servers" = "MCP servers"; "Guardrails" = "Guardrails"; -"Open in Reports" = "Open in Reports"; +"Open in History" = "Open in History"; "Only AI providers. Nothing else was contacted." = "Only AI providers. Nothing else was contacted."; "the tool calls its model asks for" = "the tool calls its model asks for"; "tool calls" = "tool calls"; @@ -588,7 +587,7 @@ "Documentation" = "Documentation"; "1 query · %@" = "1 query · %@"; "%lld queries · %@" = "%lld queries · %@"; -"Open these rows in Reports" = "Open these rows in Reports"; +"Open these rows in History" = "Open these rows in History"; "Answered on this Mac · %@" = "Answered on this Mac · %@"; "1 request left this Mac · %@" = "1 request left this Mac · %@"; "%lld requests left this Mac · %@" = "%lld requests left this Mac · %@"; @@ -971,13 +970,13 @@ "Zero" = "Zero"; "Last 2 minutes" = "Last 2 minutes"; "Application" = "Application"; -"%@\nDouble-click to open in Reports" = "%@\nDouble-click to open in Reports"; +"%@\nDouble-click to open in History" = "%@\nDouble-click to open in History"; "↓ In" = "↓ In"; "↑ Out" = "↑ Out"; "Session ↓" = "Session ↓"; "Session ↑" = "Session ↑"; "Busiest destination" = "Busiest destination"; -"Show in Reports" = "Show in Reports"; +"Show in History" = "Show in History"; "Copy Bundle ID" = "Copy Bundle ID"; "Top talkers · average of the last 5 seconds" = "Top talkers · average of the last 5 seconds"; "The network is quiet" = "The network is quiet"; @@ -1197,7 +1196,7 @@ "Nothing is being refused until %@." = "Nothing is being refused until %@."; "Resume now" = "Resume now"; "No rules yet" = "No rules yet"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by."; "Browse Templates…" = "Browse Templates…"; "Write One…" = "Write One…"; "Nothing yet" = "Nothing yet"; @@ -1273,7 +1272,7 @@ "First contact with a new domain" = "First contact with a new domain"; "Connections to non-standard ports" = "Connections to non-standard ports"; "Ignore Apple's own apps" = "Ignore Apple's own apps"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail."; "Agent uses email, file transfer, SSH, tunnels or databases" = "Agent uses email, file transfer, SSH, tunnels or databases"; "Agent connects to a raw IP on an unusual port" = "Agent connects to a raw IP on an unusual port"; "Uploads to non-AI hosts above" = "Uploads to non-AI hosts above"; @@ -1617,7 +1616,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1819,7 +1818,7 @@ "Showing %lld of %lld relationships" = "Showing %lld of %lld relationships"; "Show %lld more relationships" = "Show %lld more relationships"; "Loads the next page without changing the Map" = "Loads the next page without changing the Map"; -"Select a relationship for an exact Reports scope." = "Select a relationship for an exact Reports scope."; +"Select a relationship for an exact History scope." = "Select a relationship for an exact History scope."; "Period" = "Period"; "No traffic to visualize" = "No traffic to visualize"; "Flowlight has not observed any connections in this period." = "Flowlight has not observed any connections in this period."; @@ -1865,7 +1864,7 @@ "Select to inspect this connection" = "Select to inspect this connection"; "%lld exact destinations" = "%lld exact destinations"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ to %@, received %@, sent %@, %lld connections"; -"Show domain family in Reports" = "Show domain family in Reports"; +"Show domain family in History" = "Show domain family in History"; /* 0.17.0 History and Connections */ "1 mo" = "1 mo"; diff --git a/Flowlight/Localization/es.lproj/Localizable.strings b/Flowlight/Localization/es.lproj/Localizable.strings index 56d26af1..c0407caa 100644 --- a/Flowlight/Localization/es.lproj/Localizable.strings +++ b/Flowlight/Localization/es.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "En vivo"; "AI Agents" = "Agentes de IA"; -"Reports" = "Informes"; "Alerts" = "Alertas"; "Rules" = "Reglas"; "Ask" = "Preguntar"; @@ -321,7 +320,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Incluir el nombre de host de este Mac"; "What Flowlight sends" = "Qué envía Flowlight"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agregado es una app, un nombre de host y una dirección IP sumados a lo largo del periodo, con la misma granularidad de minuto que usa Informes: nunca por conexión ni por paquete. Los agregados van unos dos minutos por detrás, cuando el minuto al que pertenecen está completo; las alertas se envían en cuanto se generan. Si no se puede contactar con un colector, se reintenta con un retardo creciente y se guardan como máximo 10.000 registros mientras está caído."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agregado es una app, un nombre de host y una dirección IP sumados a lo largo del periodo, con la misma granularidad de minuto que usa Historial: nunca por conexión ni por paquete. Los agregados van unos dos minutos por detrás, cuando el minuto al que pertenecen está completo; las alertas se envían en cuanto se generan. Si no se puede contactar con un colector, se reintenta con un retardo creciente y se guardan como máximo 10.000 registros mientras está caído."; "Every field that can leave this Mac (%lld)" = "Todos los campos que pueden salir de este Mac (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Esa lista es todo: se genera a partir de la misma declaración con la que se construye el contenido, así que no puede quedarse atrás respecto al código. Nunca se envía, en ningún formato y por mucho que esté activado, nada de lo que registra la inspección HTTPS. Las cabeceras de peticiones y respuestas, los cuerpos, las llamadas a herramientas y el contenido de cualquier intercambio descifrado no tienen ninguna vía hacia una exportación."; "Show What Would Be Sent…" = "Ver qué se enviaría…"; @@ -338,7 +337,7 @@ "Dropped" = "Descartados"; "Retrying" = "Reintentando"; "Status" = "Estado"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Las exportaciones salen como tráfico propio de Flowlight, así que aparecen en En vivo y en Informes como las de cualquier otra app, y la primera vez que vayan a un sitio nuevo recibirás una alerta de primer contacto sobre Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Las exportaciones salen como tráfico propio de Flowlight, así que aparecen en En vivo y en Historial como las de cualquier otra app, y la primera vez que vayan a un sitio nuevo recibirás una alerta de primer contacto sobre Flowlight."; "What would be sent" = "Qué se enviaría"; "Copy" = "Copiar"; "Done" = "Hecho"; @@ -442,7 +441,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ de las subidas de este agente fueron a hosts no IA"; "Allowlist" = "Lista de permitidos"; "Risk" = "Riesgo"; -"Show Traffic in Reports" = "Ver el tráfico en Informes"; +"Show Traffic in History" = "Ver el tráfico en Historial"; "None seen" = "No se ha visto ninguno"; "Large upload" = "Subida grande"; "%@ sent to hosts that aren't AI providers" = "%@ enviados a hosts que no son proveedores de IA"; @@ -481,7 +480,7 @@ "MCP servers (%lld)" = "Servidores MCP (%lld)"; "MCP servers" = "Servidores MCP"; "Guardrails" = "Salvaguardas"; -"Open in Reports" = "Abrir en Informes"; +"Open in History" = "Abrir en Historial"; "Only AI providers. Nothing else was contacted." = "Solo proveedores de IA. No contactó con nada más."; "the tool calls its model asks for" = "las llamadas a herramientas que pide su modelo"; "tool calls" = "llamadas a herramientas"; @@ -616,7 +615,7 @@ "Documentation" = "Documentación"; "1 query · %@" = "1 consulta · %@"; "%lld queries · %@" = "%lld consultas · %@"; -"Open these rows in Reports" = "Abrir estas filas en Informes"; +"Open these rows in History" = "Abrir estas filas en Historial"; "Answered on this Mac · %@" = "Respondido en este Mac · %@"; "1 request left this Mac · %@" = "1 petición ha salido de este Mac · %@"; "%lld requests left this Mac · %@" = "%lld peticiones han salido de este Mac · %@"; @@ -1022,13 +1021,13 @@ "Zero" = "Cero"; "Last 2 minutes" = "Últimos 2 minutos"; "Application" = "Aplicación"; -"%@\nDouble-click to open in Reports" = "%@\nDoble clic para abrir en Informes"; +"%@\nDouble-click to open in History" = "%@\nDoble clic para abrir en Historial"; "↓ In" = "↓ Entrada"; "↑ Out" = "↑ Salida"; "Session ↓" = "Sesión ↓"; "Session ↑" = "Sesión ↑"; "Busiest destination" = "Destino más activo"; -"Show in Reports" = "Ver en Informes"; +"Show in History" = "Ver en Historial"; "Copy Bundle ID" = "Copiar el ID del paquete"; "Top talkers · average of the last 5 seconds" = "Más activas · media de los últimos 5 segundos"; "The network is quiet" = "La red está tranquila"; @@ -1265,7 +1264,7 @@ "Nothing is being refused until %@." = "No se rechazará nada hasta %@."; "Resume now" = "Reanudar ahora"; "No rules yet" = "Todavía no hay reglas"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regla nombra algo —una app, un agente, un destino o una URL— y dice si se bloquea o se permite. Con el clic derecho en cualquier fila de En vivo, Informes, Agentes de IA o Inspeccionar se escribe una regla sobre lo que estás viendo; también se puede partir de la biblioteca, que ya sabe a qué hosts llega la instalación de un paquete y por cuáles sale un archivo."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regla nombra algo —una app, un agente, un destino o una URL— y dice si se bloquea o se permite. Con el clic derecho en cualquier fila de En vivo, Historial, Agentes de IA o Inspeccionar se escribe una regla sobre lo que estás viendo; también se puede partir de la biblioteca, que ya sabe a qué hosts llega la instalación de un paquete y por cuáles sale un archivo."; "Browse Templates…" = "Ver las plantillas…"; "Write One…" = "Escribir una…"; "Nothing yet" = "Todavía nada"; @@ -1341,7 +1340,7 @@ "First contact with a new domain" = "Primer contacto con un dominio nuevo"; "Connections to non-standard ports" = "Conexiones a puertos no estándar"; "Ignore Apple's own apps" = "Ignorar las apps de Apple"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS habla con Apple constantemente —actualizaciones, iCloud, notificaciones push, hora— e informar de todo ello sepulta la única línea que importa. Su tráfico se sigue registrando, se sigue mostrando en En vivo e Informes y sigue sujeto a todas las reglas y salvaguardas."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS habla con Apple constantemente —actualizaciones, iCloud, notificaciones push, hora— e informar de todo ello sepulta la única línea que importa. Su tráfico se sigue registrando, se sigue mostrando en En vivo e Historial y sigue sujeto a todas las reglas y salvaguardas."; "Agent uses email, file transfer, SSH, tunnels or databases" = "El agente usa correo, transferencia de archivos, SSH, túneles o bases de datos"; "Agent connects to a raw IP on an unusual port" = "El agente conecta a una IP directa en un puerto inusual"; "Uploads to non-AI hosts above" = "Subidas a hosts no IA por encima de"; @@ -1618,7 +1617,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1820,7 +1819,7 @@ "Showing %lld of %lld relationships" = "Mostrando %lld de %lld relaciones"; "Show %lld more relationships" = "Mostrar %lld relaciones más"; "Loads the next page without changing the Map" = "Carga la página siguiente sin cambiar el mapa"; -"Select a relationship for an exact Reports scope." = "Selecciona una relación para obtener un ámbito exacto en Informes."; +"Select a relationship for an exact History scope." = "Selecciona una relación para obtener un ámbito exacto en Historial."; "Period" = "Periodo"; "No traffic to visualize" = "No hay tráfico que visualizar"; "Flowlight has not observed any connections in this period." = "Flowlight no ha observado conexiones en este periodo."; @@ -1866,7 +1865,7 @@ "Select to inspect this connection" = "Selecciona para examinar esta conexión"; "%lld exact destinations" = "%lld destinos exactos"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ a %@, recibió %@, envió %@, %lld conexiones"; -"Show domain family in Reports" = "Mostrar la familia de dominios en Informes"; +"Show domain family in History" = "Mostrar la familia de dominios en Historial"; /* 0.17.0 History and Connections */ "1 mo" = "1 mes"; diff --git a/Flowlight/Localization/fr.lproj/Localizable.strings b/Flowlight/Localization/fr.lproj/Localizable.strings index 66bd8a32..dd4f08c2 100644 --- a/Flowlight/Localization/fr.lproj/Localizable.strings +++ b/Flowlight/Localization/fr.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "En direct"; "AI Agents" = "Agents IA"; -"Reports" = "Rapports"; "Alerts" = "Alertes"; "Rules" = "Règles"; "Ask" = "Demander"; @@ -321,7 +320,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Inclure le nom d'hôte de ce Mac"; "What Flowlight sends" = "Ce que Flowlight envoie"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agrégat, c'est une app, un nom d'hôte et une adresse IP additionnés sur la période, à la même granularité à la minute que celle de Rapports — jamais par connexion et jamais par paquet. Les agrégats partent avec environ deux minutes de retard, une fois terminée la minute à laquelle ils appartiennent ; les alertes partent dès qu'elles sont levées. Un collecteur injoignable est réessayé avec un délai croissant, et 10 000 enregistrements au maximum sont conservés pendant son indisponibilité."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un agrégat, c'est une app, un nom d'hôte et une adresse IP additionnés sur la période, à la même granularité à la minute que celle de l’historique — jamais par connexion et jamais par paquet. Les agrégats partent avec environ deux minutes de retard, une fois terminée la minute à laquelle ils appartiennent ; les alertes partent dès qu'elles sont levées. Un collecteur injoignable est réessayé avec un délai croissant, et 10 000 enregistrements au maximum sont conservés pendant son indisponibilité."; "Every field that can leave this Mac (%lld)" = "Tous les champs qui peuvent quitter ce Mac (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Cette liste est exhaustive : elle est générée à partir de la même déclaration que celle qui sert à construire la charge utile, elle ne peut donc pas prendre du retard sur le code. Jamais envoyé, quel que soit le format et quoi qu'il soit activé par ailleurs : tout ce qu'enregistre l'inspection HTTPS. Les en-têtes de requête et de réponse, les corps, les appels d'outils et le contenu de tout échange déchiffré n'ont aucun chemin vers une exportation."; "Show What Would Be Sent…" = "Afficher ce qui serait envoyé…"; @@ -338,7 +337,7 @@ "Dropped" = "Abandonnés"; "Retrying" = "Nouvelle tentative"; "Status" = "État"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Les exportations partent comme le trafic propre de Flowlight : vous les verrez dans En direct et Rapports comme celui de n'importe quelle autre app, et la première fois qu'elles iront vers une nouvelle destination, vous recevrez une alerte de premier contact au sujet de Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Les exportations partent comme le trafic propre de Flowlight : vous les verrez dans En direct et Historique comme celui de n'importe quelle autre app, et la première fois qu'elles iront vers une nouvelle destination, vous recevrez une alerte de premier contact au sujet de Flowlight."; "What would be sent" = "Ce qui serait envoyé"; "Copy" = "Copier"; "Done" = "Terminé"; @@ -442,7 +441,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ des envois de cet agent sont allés vers des hôtes non IA"; "Allowlist" = "Liste d'autorisation"; "Risk" = "Risque"; -"Show Traffic in Reports" = "Voir le trafic dans Rapports"; +"Show Traffic in History" = "Voir le trafic dans l’historique"; "None seen" = "Aucun observé"; "Large upload" = "Envoi volumineux"; "%@ sent to hosts that aren't AI providers" = "%@ envoyés vers des hôtes qui ne sont pas des fournisseurs IA"; @@ -481,7 +480,7 @@ "MCP servers (%lld)" = "Serveurs MCP (%lld)"; "MCP servers" = "Serveurs MCP"; "Guardrails" = "Garde-fous"; -"Open in Reports" = "Ouvrir dans Rapports"; +"Open in History" = "Ouvrir dans l’historique"; "Only AI providers. Nothing else was contacted." = "Uniquement des fournisseurs IA. Rien d'autre n'a été contacté."; "the tool calls its model asks for" = "les appels d'outils demandés par son modèle"; "tool calls" = "appels d'outils"; @@ -616,7 +615,7 @@ "Documentation" = "Documentation"; "1 query · %@" = "1 requête · %@"; "%lld queries · %@" = "%lld requêtes · %@"; -"Open these rows in Reports" = "Ouvrir ces lignes dans Rapports"; +"Open these rows in History" = "Ouvrir ces lignes dans l’historique"; "Answered on this Mac · %@" = "Réponse produite sur ce Mac · %@"; "1 request left this Mac · %@" = "1 requête a quitté ce Mac · %@"; "%lld requests left this Mac · %@" = "%lld requêtes ont quitté ce Mac · %@"; @@ -1022,13 +1021,13 @@ "Zero" = "Zéro"; "Last 2 minutes" = "2 dernières minutes"; "Application" = "Application"; -"%@\nDouble-click to open in Reports" = "%@\nDouble-cliquer pour ouvrir dans Rapports"; +"%@\nDouble-click to open in History" = "%@\nDouble-cliquer pour ouvrir dans l’historique"; "↓ In" = "↓ Reçu"; "↑ Out" = "↑ Envoyé"; "Session ↓" = "Session ↓"; "Session ↑" = "Session ↑"; "Busiest destination" = "Destination la plus active"; -"Show in Reports" = "Voir dans Rapports"; +"Show in History" = "Voir dans l’historique"; "Copy Bundle ID" = "Copier l'identifiant de bundle"; "Top talkers · average of the last 5 seconds" = "Les plus actifs · moyenne des 5 dernières secondes"; "The network is quiet" = "Le réseau est calme"; @@ -1265,7 +1264,7 @@ "Nothing is being refused until %@." = "Rien n'est refusé jusqu'à %@."; "Resume now" = "Reprendre maintenant"; "No rules yet" = "Aucune règle pour l'instant"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Une règle nomme quelque chose — une app, un agent, une destination ou une URL — et dit de bloquer ou d'autoriser. Un clic droit sur n'importe quelle ligne dans En direct, Rapports, Agents IA ou Inspecter permet d'en écrire une à propos de ce qui est affiché ; l'autre point de départ est la bibliothèque de modèles : elle sait déjà quels hôtes une installation de paquet contacte, et par lesquels un fichier s'en va."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Une règle nomme quelque chose — une app, un agent, une destination ou une URL — et dit de bloquer ou d'autoriser. Un clic droit sur n'importe quelle ligne dans En direct, Historique, Agents IA ou Inspecter permet d'en écrire une à propos de ce qui est affiché ; l'autre point de départ est la bibliothèque de modèles : elle sait déjà quels hôtes une installation de paquet contacte, et par lesquels un fichier s'en va."; "Browse Templates…" = "Parcourir les modèles…"; "Write One…" = "En écrire une…"; "Nothing yet" = "Rien pour l'instant"; @@ -1341,7 +1340,7 @@ "First contact with a new domain" = "Premier contact avec un nouveau domaine"; "Connections to non-standard ports" = "Connexions à des ports non standard"; "Ignore Apple's own apps" = "Ignorer les apps d'Apple"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS communique en permanence avec Apple — mises à jour, iCloud, notifications push, heure — et tout signaler enfouirait la seule ligne qui compte. Leur trafic est toujours enregistré, toujours affiché dans En direct et Rapports, et toujours soumis à chaque règle et à chaque garde-fou."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS communique en permanence avec Apple — mises à jour, iCloud, notifications push, heure — et tout signaler enfouirait la seule ligne qui compte. Leur trafic est toujours enregistré, toujours affiché dans En direct et Historique, et toujours soumis à chaque règle et à chaque garde-fou."; "Agent uses email, file transfer, SSH, tunnels or databases" = "L'agent utilise e-mail, transfert de fichiers, SSH, tunnels ou bases de données"; "Agent connects to a raw IP on an unusual port" = "L'agent se connecte à une IP brute sur un port inhabituel"; "Uploads to non-AI hosts above" = "Envois vers des hôtes non IA au-delà de"; @@ -1618,7 +1617,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1820,7 +1819,7 @@ "Showing %lld of %lld relationships" = "Affichage de %lld relations sur %lld"; "Show %lld more relationships" = "Afficher %lld relations de plus"; "Loads the next page without changing the Map" = "Charge la page suivante sans modifier la carte"; -"Select a relationship for an exact Reports scope." = "Sélectionnez une relation pour obtenir une portée exacte dans Rapports."; +"Select a relationship for an exact History scope." = "Sélectionnez une relation pour obtenir une portée exacte dans l’historique."; "Period" = "Période"; "No traffic to visualize" = "Aucun trafic à visualiser"; "Flowlight has not observed any connections in this period." = "Flowlight n’a observé aucune connexion pendant cette période."; @@ -1866,7 +1865,7 @@ "Select to inspect this connection" = "Sélectionnez pour examiner cette connexion"; "%lld exact destinations" = "%lld destinations exactes"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ vers %@, %@ reçus, %@ envoyés, %lld connexions"; -"Show domain family in Reports" = "Afficher la famille de domaines dans Rapports"; +"Show domain family in History" = "Afficher la famille de domaines dans l’historique"; /* 0.17.0 History and Connections */ "1 mo" = "1 mois"; diff --git a/Flowlight/Localization/it.lproj/Localizable.strings b/Flowlight/Localization/it.lproj/Localizable.strings index 8e1c5ad1..c8d05cdf 100644 --- a/Flowlight/Localization/it.lproj/Localizable.strings +++ b/Flowlight/Localization/it.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "In diretta"; "AI Agents" = "Agenti IA"; -"Reports" = "Rapporti"; "Alerts" = "Avvisi"; "Rules" = "Regole"; "Ask" = "Chiedi"; @@ -321,7 +320,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Includi il nome host di questo Mac"; "What Flowlight sends" = "Cosa invia Flowlight"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un'aggregazione è una sola app, un solo nome host e un solo indirizzo IP sommati sull'intervallo, con la stessa granularità al minuto usata da Rapporti: mai per connessione e mai per pacchetto. Le aggregazioni partono con circa due minuti di ritardo, una volta completato il minuto a cui appartengono; gli avvisi partono appena vengono generati. Se un collector non è raggiungibile, i tentativi si ripetono con un ritardo crescente e durante l'interruzione vengono conservati al massimo 10.000 record."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Un'aggregazione è una sola app, un solo nome host e un solo indirizzo IP sommati sull'intervallo, con la stessa granularità al minuto usata da Cronologia: mai per connessione e mai per pacchetto. Le aggregazioni partono con circa due minuti di ritardo, una volta completato il minuto a cui appartengono; gli avvisi partono appena vengono generati. Se un collector non è raggiungibile, i tentativi si ripetono con un ritardo crescente e durante l'interruzione vengono conservati al massimo 10.000 record."; "Every field that can leave this Mac (%lld)" = "Tutti i campi che possono lasciare questo Mac (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Quell'elenco è completo: è generato dalla stessa dichiarazione da cui si costruisce il payload, quindi non può restare indietro rispetto al codice. Mai inviato, in nessun formato e qualunque altra opzione sia attiva: tutto ciò che registra l'ispezione HTTPS. Intestazioni di richiesta e risposta, corpi, chiamate agli strumenti e contenuti di qualsiasi scambio decifrato non hanno alcuna via d'accesso a un'esportazione."; "Show What Would Be Sent…" = "Mostra cosa verrebbe inviato…"; @@ -338,7 +337,7 @@ "Dropped" = "Scartati"; "Retrying" = "Nuovo tentativo"; "Status" = "Stato"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Le esportazioni escono come traffico di Flowlight, quindi le vedrai in In diretta e in Rapporti come quelle di qualsiasi altra app, e la prima volta che raggiungono una nuova destinazione riceverai un avviso di primo contatto su Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "Le esportazioni escono come traffico di Flowlight, quindi le vedrai in In diretta e in Cronologia come quelle di qualsiasi altra app, e la prima volta che raggiungono una nuova destinazione riceverai un avviso di primo contatto su Flowlight."; "What would be sent" = "Cosa verrebbe inviato"; "Copy" = "Copia"; "Done" = "Fine"; @@ -442,7 +441,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ dei caricamenti di questo agente è andato verso host non IA"; "Allowlist" = "Elenco consentiti"; "Risk" = "Rischio"; -"Show Traffic in Reports" = "Mostra il traffico in Rapporti"; +"Show Traffic in History" = "Mostra il traffico in Cronologia"; "None seen" = "Nessuno rilevato"; "Large upload" = "Caricamento ingente"; "%@ sent to hosts that aren't AI providers" = "%@ inviati a host che non sono provider IA"; @@ -481,7 +480,7 @@ "MCP servers (%lld)" = "Server MCP (%lld)"; "MCP servers" = "Server MCP"; "Guardrails" = "Protezioni"; -"Open in Reports" = "Apri in Rapporti"; +"Open in History" = "Apri in Cronologia"; "Only AI providers. Nothing else was contacted." = "Solo provider IA. Nient'altro è stato contattato."; "the tool calls its model asks for" = "le chiamate agli strumenti richieste dal suo modello"; "tool calls" = "chiamate agli strumenti"; @@ -616,7 +615,7 @@ "Documentation" = "Documentazione"; "1 query · %@" = "1 interrogazione · %@"; "%lld queries · %@" = "%lld interrogazioni · %@"; -"Open these rows in Reports" = "Apri queste righe in Rapporti"; +"Open these rows in History" = "Apri queste righe in Cronologia"; "Answered on this Mac · %@" = "Risposta generata su questo Mac · %@"; "1 request left this Mac · %@" = "1 richiesta ha lasciato questo Mac · %@"; "%lld requests left this Mac · %@" = "%lld richieste hanno lasciato questo Mac · %@"; @@ -1022,13 +1021,13 @@ "Zero" = "Zero"; "Last 2 minutes" = "Ultimi 2 minuti"; "Application" = "Applicazione"; -"%@\nDouble-click to open in Reports" = "%@\nFai doppio clic per aprire in Rapporti"; +"%@\nDouble-click to open in History" = "%@\nFai doppio clic per aprire in Cronologia"; "↓ In" = "↓ Entrata"; "↑ Out" = "↑ Uscita"; "Session ↓" = "Sessione ↓"; "Session ↑" = "Sessione ↑"; "Busiest destination" = "Destinazione più attiva"; -"Show in Reports" = "Mostra in Rapporti"; +"Show in History" = "Mostra in Cronologia"; "Copy Bundle ID" = "Copia l'ID bundle"; "Top talkers · average of the last 5 seconds" = "App più attive · media degli ultimi 5 secondi"; "The network is quiet" = "La rete è tranquilla"; @@ -1265,7 +1264,7 @@ "Nothing is being refused until %@." = "Nulla viene rifiutato fino a %@."; "Resume now" = "Riprendi adesso"; "No rules yet" = "Ancora nessuna regola"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regola indica qualcosa — un'app, un agente, una destinazione o un URL — e dice se bloccare o consentire. Fai clic con il tasto destro su una riga in In diretta, Rapporti, Agenti IA o Ispeziona per scriverne una su ciò che stai guardando, oppure parti dalla libreria: sa già quali host raggiunge l'installazione di un pacchetto e da quali esce un file."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Una regola indica qualcosa — un'app, un agente, una destinazione o un URL — e dice se bloccare o consentire. Fai clic con il tasto destro su una riga in In diretta, Cronologia, Agenti IA o Ispeziona per scriverne una su ciò che stai guardando, oppure parti dalla libreria: sa già quali host raggiunge l'installazione di un pacchetto e da quali esce un file."; "Browse Templates…" = "Sfoglia i modelli…"; "Write One…" = "Scrivine una…"; "Nothing yet" = "Ancora nulla"; @@ -1341,7 +1340,7 @@ "First contact with a new domain" = "Primo contatto con un nuovo dominio"; "Connections to non-standard ports" = "Connessioni a porte non standard"; "Ignore Apple's own apps" = "Ignora le app di Apple"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS comunica costantemente con Apple — aggiornamenti, iCloud, notifiche push, ora — e segnalare tutto questo seppellisce l'unica riga che conta. Il loro traffico viene comunque registrato, compare nella schermata In diretta e in Rapporti e resta soggetto a tutte le regole e le protezioni."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS comunica costantemente con Apple — aggiornamenti, iCloud, notifiche push, ora — e segnalare tutto questo seppellisce l'unica riga che conta. Il loro traffico viene comunque registrato, compare nella schermata In diretta e in Cronologia e resta soggetto a tutte le regole e le protezioni."; "Agent uses email, file transfer, SSH, tunnels or databases" = "L'agente usa e-mail, trasferimento file, SSH, tunnel o database"; "Agent connects to a raw IP on an unusual port" = "L'agente si connette a un IP grezzo su una porta insolita"; "Uploads to non-AI hosts above" = "Caricamenti verso host non IA oltre"; @@ -1618,7 +1617,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1820,7 +1819,7 @@ "Showing %lld of %lld relationships" = "Visualizzazione di %lld relazioni su %lld"; "Show %lld more relationships" = "Mostra altre %lld relazioni"; "Loads the next page without changing the Map" = "Carica la pagina successiva senza modificare la mappa"; -"Select a relationship for an exact Reports scope." = "Seleziona una relazione per un ambito esatto nei Resoconti."; +"Select a relationship for an exact History scope." = "Seleziona una relazione per un ambito esatto nei Resoconti."; "Period" = "Periodo"; "No traffic to visualize" = "Nessun traffico da visualizzare"; "Flowlight has not observed any connections in this period." = "Flowlight non ha osservato connessioni in questo periodo."; @@ -1866,7 +1865,7 @@ "Select to inspect this connection" = "Seleziona per esaminare questa connessione"; "%lld exact destinations" = "%lld destinazioni esatte"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ verso %@, %@ ricevuti, %@ inviati, %lld connessioni"; -"Show domain family in Reports" = "Mostra la famiglia di domini in Rapporti"; +"Show domain family in History" = "Mostra la famiglia di domini in Cronologia"; /* 0.17.0 History and Connections */ "1 mo" = "1 mese"; diff --git a/Flowlight/Localization/ja.lproj/Localizable.strings b/Flowlight/Localization/ja.lproj/Localizable.strings index f8f12b9d..56f7fb77 100644 --- a/Flowlight/Localization/ja.lproj/Localizable.strings +++ b/Flowlight/Localization/ja.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "ライブ"; "AI Agents" = "AI エージェント"; -"Reports" = "レポート"; "Alerts" = "アラート"; "Rules" = "ルール"; "Ask" = "質問"; @@ -321,7 +320,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "この Mac のホスト名を含める"; "What Flowlight sends" = "Flowlight が送信する内容"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "集計は、1 つのアプリ・1 つのホスト名・1 つの IP アドレスを、レポートと同じ分単位の粒度で期間ごとに合計したものです。接続ごとでもパケットごとでもありません。集計は、対象の分が終わってから 2 分ほど遅れて送られます。アラートは発生した時点で送られます。接続できないコレクターへは間隔を広げながら再試行し、停止している間は最大 10,000 件を保持します。"; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "集計は、1 つのアプリ・1 つのホスト名・1 つの IP アドレスを、履歴と同じ分単位の粒度で期間ごとに合計したものです。接続ごとでもパケットごとでもありません。集計は、対象の分が終わってから 2 分ほど遅れて送られます。アラートは発生した時点で送られます。接続できないコレクターへは間隔を広げながら再試行し、停止している間は最大 10,000 件を保持します。"; "Every field that can leave this Mac (%lld)" = "この Mac から出る可能性のあるフィールドのすべて(%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "このリストがすべてです。ペイロードを組み立てるのと同じ宣言から生成しているため、コードから遅れることはありません。どの形式でも、ほかに何をオンにしていても送信されないもの: HTTPS インスペクションが記録した内容です。リクエストとレスポンスのヘッダ、本文、ツール呼び出し、復号したやり取りの中身が書き出しに入る経路はありません。"; "Show What Would Be Sent…" = "送信される内容を表示…"; @@ -338,7 +337,7 @@ "Dropped" = "破棄"; "Retrying" = "再試行中"; "Status" = "状況"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "書き出しは Flowlight 自身のトラフィックとして出ていきます。そのためライブとレポートには、ほかのアプリと同じように表示され、初めて新しい宛先へ送るときには Flowlight についての初回接続アラートが出ます。"; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "書き出しは Flowlight 自身のトラフィックとして出ていきます。そのためライブと履歴には、ほかのアプリと同じように表示され、初めて新しい宛先へ送るときには Flowlight についての初回接続アラートが出ます。"; "What would be sent" = "送信される内容"; "Copy" = "コピー"; "Done" = "完了"; @@ -442,7 +441,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "このエージェントの送信のうち %@ が AI 以外のホストへ送られました"; "Allowlist" = "許可リスト"; "Risk" = "リスク"; -"Show Traffic in Reports" = "トラフィックをレポートで表示"; +"Show Traffic in History" = "トラフィックを履歴で表示"; "None seen" = "検出なし"; "Large upload" = "大量の送信"; "%@ sent to hosts that aren't AI providers" = "AI プロバイダ以外のホストへ %@ を送信しました"; @@ -481,7 +480,7 @@ "MCP servers (%lld)" = "MCP サーバ(%lld)"; "MCP servers" = "MCP サーバ"; "Guardrails" = "ガードレール"; -"Open in Reports" = "レポートで開く"; +"Open in History" = "履歴で開く"; "Only AI providers. Nothing else was contacted." = "AI プロバイダのみです。ほかへの接続はありません。"; "the tool calls its model asks for" = "モデルが要求するツール呼び出し"; "tool calls" = "ツール呼び出し"; @@ -616,7 +615,7 @@ "Documentation" = "ドキュメント"; "1 query · %@" = "問い合わせ 1 件 · %@"; "%lld queries · %@" = "問い合わせ %lld 件 · %@"; -"Open these rows in Reports" = "これらの行をレポートで開きます"; +"Open these rows in History" = "これらの行を履歴で開きます"; "Answered on this Mac · %@" = "この Mac で回答 · %@"; "1 request left this Mac · %@" = "リクエスト 1 件がこの Mac から出ました · %@"; "%lld requests left this Mac · %@" = "リクエスト %lld 件がこの Mac から出ました · %@"; @@ -1022,13 +1021,13 @@ "Zero" = "ゼロ"; "Last 2 minutes" = "過去 2 分"; "Application" = "アプリケーション"; -"%@\nDouble-click to open in Reports" = "%@\nダブルクリックするとレポートで開きます"; +"%@\nDouble-click to open in History" = "%@\nダブルクリックすると履歴で開きます"; "↓ In" = "↓ 受信"; "↑ Out" = "↑ 送信"; "Session ↓" = "セッション ↓"; "Session ↑" = "セッション ↑"; "Busiest destination" = "通信量の多い接続先"; -"Show in Reports" = "レポートで表示"; +"Show in History" = "履歴で表示"; "Copy Bundle ID" = "バンドル ID をコピー"; "Top talkers · average of the last 5 seconds" = "通信量の多いアプリ · 過去 5 秒の平均"; "The network is quiet" = "ネットワークは静かです"; @@ -1265,7 +1264,7 @@ "Nothing is being refused until %@." = "%@ まで、何も拒否しません。"; "Resume now" = "今すぐ再開"; "No rules yet" = "ルールがありません"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "ルールは対象(アプリ、エージェント、接続先、URL)を指定し、ブロックか許可を決めます。ライブ、レポート、AI エージェント、インスペクトの行を右クリックすれば、いま見ているものについてルールを作れます。テンプレートから始めることもできます。パッケージのインストールがどのホストに接続するか、ファイルがどのホストから出ていくかは、すでに書かれています。"; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "ルールは対象(アプリ、エージェント、接続先、URL)を指定し、ブロックか許可を決めます。ライブ、履歴、AI エージェント、インスペクトの行を右クリックすれば、いま見ているものについてルールを作れます。テンプレートから始めることもできます。パッケージのインストールがどのホストに接続するか、ファイルがどのホストから出ていくかは、すでに書かれています。"; "Browse Templates…" = "テンプレートを見る…"; "Write One…" = "作成する…"; "Nothing yet" = "まだ何もありません"; @@ -1341,7 +1340,7 @@ "First contact with a new domain" = "新しいドメインへの初回接続"; "Connections to non-standard ports" = "非標準ポートへの接続"; "Ignore Apple's own apps" = "Apple 純正アプリを除外"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS は Apple と絶えず通信しています(アップデート、iCloud、プッシュ、時刻)。そのすべてを報告すると、本当に重要な 1 行が埋もれてしまいます。Apple のアプリのトラフィックも記録は続き、ライブとレポートには表示され、すべてのルールとガードレールの対象になります。"; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS は Apple と絶えず通信しています(アップデート、iCloud、プッシュ、時刻)。そのすべてを報告すると、本当に重要な 1 行が埋もれてしまいます。Apple のアプリのトラフィックも記録は続き、ライブと履歴には表示され、すべてのルールとガードレールの対象になります。"; "Agent uses email, file transfer, SSH, tunnels or databases" = "エージェントがメール・ファイル転送・SSH・トンネル・データベースを使用"; "Agent connects to a raw IP on an unusual port" = "エージェントが異常なポートで生 IP に接続"; "Uploads to non-AI hosts above" = "AI 以外のホストへの送信が"; @@ -1618,7 +1617,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1820,7 +1819,7 @@ "Showing %lld of %lld relationships" = "%2$lld件中%1$lld件の関係を表示"; "Show %lld more relationships" = "さらに%lld件の関係を表示"; "Loads the next page without changing the Map" = "マップを変更せずに次のページを読み込みます"; -"Select a relationship for an exact Reports scope." = "正確なレポート範囲を表示するには関係を選択してください。"; +"Select a relationship for an exact History scope." = "正確な履歴範囲を表示するには関係を選択してください。"; "Period" = "期間"; "No traffic to visualize" = "可視化するトラフィックがありません"; "Flowlight has not observed any connections in this period." = "この期間にFlowlightが観測した接続はありません。"; @@ -1866,7 +1865,7 @@ "Select to inspect this connection" = "選択してこの接続を調べる"; "%lld exact destinations" = "%lld件の正確な宛先"; "%@ to %@, received %@, sent %@, %lld connections" = "%@から%@、受信%@、送信%@、%lld件の接続"; -"Show domain family in Reports" = "ドメインファミリーをレポートに表示"; +"Show domain family in History" = "ドメインファミリーを履歴に表示"; /* 0.17.0 History and Connections */ "1 mo" = "1か月"; diff --git a/Flowlight/Localization/ko.lproj/Localizable.strings b/Flowlight/Localization/ko.lproj/Localizable.strings index f7f347c4..58059090 100644 --- a/Flowlight/Localization/ko.lproj/Localizable.strings +++ b/Flowlight/Localization/ko.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "실시간"; "AI Agents" = "AI 에이전트"; -"Reports" = "보고서"; "Alerts" = "알림"; "Rules" = "규칙"; "Ask" = "질문"; @@ -344,7 +343,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "이 Mac의 호스트 이름 포함"; "What Flowlight sends" = "Flowlight가 보내는 내용"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "집계는 앱 하나, 호스트 이름 하나, IP 주소 하나를 해당 기간 동안 합한 것이며, 보고서와 같은 분 단위를 씁니다. 연결별이나 패킷별로는 절대 보내지 않습니다. 집계는 해당 분이 끝난 뒤 약 2분 늦게 전송되고, 알림은 발생하는 즉시 전송됩니다. 연결할 수 없는 컬렉터에는 간격을 늘려가며 재시도하며, 그동안 최대 10,000개의 레코드를 보관합니다."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "집계는 앱 하나, 호스트 이름 하나, IP 주소 하나를 해당 기간 동안 합한 것이며, 기록와 같은 분 단위를 씁니다. 연결별이나 패킷별로는 절대 보내지 않습니다. 집계는 해당 분이 끝난 뒤 약 2분 늦게 전송되고, 알림은 발생하는 즉시 전송됩니다. 연결할 수 없는 컬렉터에는 간격을 늘려가며 재시도하며, 그동안 최대 10,000개의 레코드를 보관합니다."; "Every field that can leave this Mac (%lld)" = "이 Mac을 떠날 수 있는 모든 필드 (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "이 목록이 전부입니다. 페이로드를 만드는 것과 같은 선언에서 생성되므로 코드와 어긋날 수 없습니다. 어떤 형식에서든, 다른 무엇을 켜 두었든 절대 전송되지 않는 것은 HTTPS 검사가 기록한 내용입니다. 요청과 응답의 헤더, 본문, 도구 호출, 복호화된 교환의 내용은 내보내기로 나갈 경로가 없습니다."; "Show What Would Be Sent…" = "보낼 내용 보기…"; @@ -361,7 +360,7 @@ "Dropped" = "버려짐"; "Retrying" = "재시도 중"; "Status" = "상태"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "내보내기는 Flowlight 자신의 트래픽으로 나가므로 다른 앱과 마찬가지로 실시간과 보고서에 표시되며, 처음 새로운 곳으로 전송될 때는 Flowlight에 대한 첫 연결 알림이 발생합니다."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "내보내기는 Flowlight 자신의 트래픽으로 나가므로 다른 앱과 마찬가지로 실시간과 기록에 표시되며, 처음 새로운 곳으로 전송될 때는 Flowlight에 대한 첫 연결 알림이 발생합니다."; "What would be sent" = "보낼 내용"; "Copy" = "복사"; "Done" = "완료"; @@ -465,7 +464,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "이 에이전트의 업로드 중 AI 외 호스트로 간 양: %@"; "Allowlist" = "허용 목록"; "Risk" = "위험도"; -"Show Traffic in Reports" = "보고서에서 트래픽 보기"; +"Show Traffic in History" = "기록에서 트래픽 보기"; "None seen" = "확인된 항목 없음"; "Large upload" = "대용량 업로드"; "%@ sent to hosts that aren't AI providers" = "AI 제공업체가 아닌 호스트로 %@ 전송"; @@ -504,7 +503,7 @@ "MCP servers (%lld)" = "MCP 서버 (%lld)"; "MCP servers" = "MCP 서버"; "Guardrails" = "가드레일"; -"Open in Reports" = "보고서에서 열기"; +"Open in History" = "기록에서 열기"; "Only AI providers. Nothing else was contacted." = "AI 제공업체뿐입니다. 그 외에는 연결하지 않았습니다."; "the tool calls its model asks for" = "모델이 요청하는 도구 호출"; "tool calls" = "도구 호출"; @@ -639,7 +638,7 @@ "Documentation" = "문서"; "1 query · %@" = "질의 1개 · %@"; "%lld queries · %@" = "질의 %lld개 · %@"; -"Open these rows in Reports" = "이 행을 보고서에서 열기"; +"Open these rows in History" = "이 행을 기록에서 열기"; "Answered on this Mac · %@" = "이 Mac에서 답변함 · %@"; "1 request left this Mac · %@" = "요청 1건이 이 Mac을 떠났습니다 · %@"; "%lld requests left this Mac · %@" = "요청 %lld건이 이 Mac을 떠났습니다 · %@"; @@ -1045,13 +1044,13 @@ "Zero" = "0"; "Last 2 minutes" = "최근 2분"; "Application" = "응용 프로그램"; -"%@\nDouble-click to open in Reports" = "%@\n두 번 클릭하면 보고서에서 열립니다"; +"%@\nDouble-click to open in History" = "%@\n두 번 클릭하면 기록에서 열립니다"; "↓ In" = "↓ 수신"; "↑ Out" = "↑ 송신"; "Session ↓" = "세션 ↓"; "Session ↑" = "세션 ↑"; "Busiest destination" = "가장 바쁜 목적지"; -"Show in Reports" = "보고서에서 보기"; +"Show in History" = "기록에서 보기"; "Copy Bundle ID" = "번들 ID 복사"; "Top talkers · average of the last 5 seconds" = "통신량 상위 · 최근 5초 평균"; "The network is quiet" = "네트워크가 조용합니다"; @@ -1288,7 +1287,7 @@ "Nothing is being refused until %@." = "%@까지는 아무것도 거부하지 않습니다."; "Resume now" = "지금 다시 시작"; "No rules yet" = "아직 규칙이 없습니다"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "규칙은 앱, 에이전트, 목적지 또는 URL을 지정하고 차단할지 허용할지 정합니다. 실시간, 보고서, AI 에이전트, 검사 화면에서 아무 행이나 오른쪽 클릭하면 지금 보고 있는 대상에 대한 규칙을 바로 작성할 수 있고, 라이브러리에서 시작할 수도 있습니다. 라이브러리는 패키지 설치가 어떤 호스트에 연결하는지, 파일이 어떤 호스트로 빠져나가는지 이미 알고 있습니다."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "규칙은 앱, 에이전트, 목적지 또는 URL을 지정하고 차단할지 허용할지 정합니다. 실시간, 기록, AI 에이전트, 검사 화면에서 아무 행이나 오른쪽 클릭하면 지금 보고 있는 대상에 대한 규칙을 바로 작성할 수 있고, 라이브러리에서 시작할 수도 있습니다. 라이브러리는 패키지 설치가 어떤 호스트에 연결하는지, 파일이 어떤 호스트로 빠져나가는지 이미 알고 있습니다."; "Browse Templates…" = "템플릿 둘러보기…"; "Write One…" = "직접 작성…"; "Nothing yet" = "아직 없음"; @@ -1364,7 +1363,7 @@ "First contact with a new domain" = "새 도메인에 대한 첫 연결"; "Connections to non-standard ports" = "비표준 포트 연결"; "Ignore Apple's own apps" = "Apple 기본 앱 무시"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS는 업데이트, iCloud, 푸시, 시간 동기화 때문에 Apple과 끊임없이 통신하며, 그것을 모두 보고하면 정작 중요한 한 줄이 묻힙니다. Apple의 트래픽도 그대로 기록되고, 실시간과 보고서에 표시되며, 모든 규칙과 가드레일이 적용됩니다."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS는 업데이트, iCloud, 푸시, 시간 동기화 때문에 Apple과 끊임없이 통신하며, 그것을 모두 보고하면 정작 중요한 한 줄이 묻힙니다. Apple의 트래픽도 그대로 기록되고, 실시간과 기록에 표시되며, 모든 규칙과 가드레일이 적용됩니다."; "Agent uses email, file transfer, SSH, tunnels or databases" = "에이전트가 이메일, 파일 전송, SSH, 터널 또는 데이터베이스 사용"; "Agent connects to a raw IP on an unusual port" = "에이전트가 비정상 포트로 원시 IP에 연결"; "Uploads to non-AI hosts above" = "AI 외 호스트로 업로드가"; @@ -1617,7 +1616,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1819,7 +1818,7 @@ "Showing %lld of %lld relationships" = "관계 %2$lld개 중 %1$lld개 표시"; "Show %lld more relationships" = "관계 %lld개 더 표시"; "Loads the next page without changing the Map" = "지도를 변경하지 않고 다음 페이지를 불러옵니다"; -"Select a relationship for an exact Reports scope." = "정확한 보고서 범위를 보려면 관계를 선택하십시오."; +"Select a relationship for an exact History scope." = "정확한 기록 범위를 보려면 관계를 선택하십시오."; "Period" = "기간"; "No traffic to visualize" = "시각화할 트래픽 없음"; "Flowlight has not observed any connections in this period." = "이 기간에 Flowlight가 관찰한 연결이 없습니다."; @@ -1865,7 +1864,7 @@ "Select to inspect this connection" = "선택하여 이 연결 조사"; "%lld exact destinations" = "정확한 대상 %lld개"; "%@ to %@, received %@, sent %@, %lld connections" = "%@에서 %@, 수신 %@, 송신 %@, 연결 %lld개"; -"Show domain family in Reports" = "보고서에서 도메인 계열 보기"; +"Show domain family in History" = "기록에서 도메인 계열 보기"; /* 0.17.0 History and Connections */ "1 mo" = "1개월"; diff --git a/Flowlight/Localization/pt-PT.lproj/Localizable.strings b/Flowlight/Localization/pt-PT.lproj/Localizable.strings index 0f96f82d..b632420c 100644 --- a/Flowlight/Localization/pt-PT.lproj/Localizable.strings +++ b/Flowlight/Localization/pt-PT.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "Em direto"; "AI Agents" = "Agentes de IA"; -"Reports" = "Relatórios"; "Alerts" = "Alertas"; "Rules" = "Regras"; "Ask" = "Perguntar"; @@ -344,7 +343,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "Incluir o nome de anfitrião deste Mac"; "What Flowlight sends" = "O que o Flowlight envia"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Uma agregação é uma app, um nome de anfitrião e um endereço IP somados ao longo do período, com a mesma granularidade de minuto que os Relatórios usam — nunca por ligação nem por pacote. As agregações seguem com cerca de dois minutos de atraso, quando o minuto a que pertencem está completo; os alertas seguem à medida que são levantados. Um coletor inacessível é tentado de novo com um atraso crescente, e são guardados no máximo 10 000 registos enquanto estiver em baixo."; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "Uma agregação é uma app, um nome de anfitrião e um endereço IP somados ao longo do período, com a mesma granularidade de minuto que o Histórico usa — nunca por ligação nem por pacote. As agregações seguem com cerca de dois minutos de atraso, quando o minuto a que pertencem está completo; os alertas seguem à medida que são levantados. Um coletor inacessível é tentado de novo com um atraso crescente, e são guardados no máximo 10 000 registos enquanto estiver em baixo."; "Every field that can leave this Mac (%lld)" = "Todos os campos que podem sair deste Mac (%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "Essa lista é tudo — é gerada a partir da mesma declaração com que o payload é construído, por isso não pode ficar atrás do código. Nunca é enviado, em qualquer formato e com o que mais esteja ativado: tudo o que a inspeção HTTPS registe. Os cabeçalhos de pedido e de resposta, os corpos, as chamadas de ferramentas e o conteúdo de qualquer troca desencriptada não têm caminho para uma exportação."; "Show What Would Be Sent…" = "Mostrar o que seria enviado…"; @@ -361,7 +360,7 @@ "Dropped" = "Descartados"; "Retrying" = "A tentar de novo"; "Status" = "Estado"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "As exportações saem como tráfego do próprio Flowlight, por isso vê-las-á em Em direto e Relatórios como as de qualquer outra app, e a primeira vez que forem para um sítio novo receberá um alerta de primeiro contacto sobre o Flowlight."; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "As exportações saem como tráfego do próprio Flowlight, por isso vê-las-á em Em direto e Histórico como as de qualquer outra app, e a primeira vez que forem para um sítio novo receberá um alerta de primeiro contacto sobre o Flowlight."; "What would be sent" = "O que seria enviado"; "Copy" = "Copiar"; "Done" = "Concluído"; @@ -465,7 +464,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "%@ dos envios deste agente foram para anfitriões não-IA"; "Allowlist" = "Lista de permissões"; "Risk" = "Risco"; -"Show Traffic in Reports" = "Ver o tráfego em Relatórios"; +"Show Traffic in History" = "Ver o tráfego no Histórico"; "None seen" = "Nada visto"; "Large upload" = "Envio grande"; "%@ sent to hosts that aren't AI providers" = "%@ enviados para anfitriões que não são fornecedores de IA"; @@ -504,7 +503,7 @@ "MCP servers (%lld)" = "Servidores MCP (%lld)"; "MCP servers" = "Servidores MCP"; "Guardrails" = "Proteções"; -"Open in Reports" = "Abrir em Relatórios"; +"Open in History" = "Abrir no Histórico"; "Only AI providers. Nothing else was contacted." = "Apenas fornecedores de IA. Não foi contactado mais nada."; "the tool calls its model asks for" = "as chamadas de ferramentas que o seu modelo pede"; "tool calls" = "chamadas de ferramentas"; @@ -639,7 +638,7 @@ "Documentation" = "Documentação"; "1 query · %@" = "1 consulta · %@"; "%lld queries · %@" = "%lld consultas · %@"; -"Open these rows in Reports" = "Abrir estas linhas em Relatórios"; +"Open these rows in History" = "Abrir estas linhas no Histórico"; "Answered on this Mac · %@" = "Respondido neste Mac · %@"; "1 request left this Mac · %@" = "1 pedido saiu deste Mac · %@"; "%lld requests left this Mac · %@" = "%lld pedidos saíram deste Mac · %@"; @@ -1045,13 +1044,13 @@ "Zero" = "Zero"; "Last 2 minutes" = "Últimos 2 minutos"; "Application" = "Aplicação"; -"%@\nDouble-click to open in Reports" = "%@\nClique duas vezes para abrir em Relatórios"; +"%@\nDouble-click to open in History" = "%@\nClique duas vezes para abrir no Histórico"; "↓ In" = "↓ Entrada"; "↑ Out" = "↑ Saída"; "Session ↓" = "Sessão ↓"; "Session ↑" = "Sessão ↑"; "Busiest destination" = "Destino mais ativo"; -"Show in Reports" = "Ver em Relatórios"; +"Show in History" = "Ver no Histórico"; "Copy Bundle ID" = "Copiar identificador de pacote"; "Top talkers · average of the last 5 seconds" = "Apps mais ativas · média dos últimos 5 segundos"; "The network is quiet" = "A rede está calma"; @@ -1288,7 +1287,7 @@ "Nothing is being refused until %@." = "Nada está a ser recusado até %@."; "Resume now" = "Retomar agora"; "No rules yet" = "Ainda sem regras"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Uma regra nomeia algo — uma app, um agente, um destino ou um URL — e diz bloquear ou permitir. Clique com o botão direito em qualquer linha de Em direto, Relatórios, Agentes de IA ou Inspecionar para escrever uma sobre o que está a ver, ou comece pela biblioteca — já sabe que anfitriões uma instalação de pacote contacta e por quais sai um ficheiro."; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "Uma regra nomeia algo — uma app, um agente, um destino ou um URL — e diz bloquear ou permitir. Clique com o botão direito em qualquer linha de Em direto, Histórico, Agentes de IA ou Inspecionar para escrever uma sobre o que está a ver, ou comece pela biblioteca — já sabe que anfitriões uma instalação de pacote contacta e por quais sai um ficheiro."; "Browse Templates…" = "Ver os modelos…"; "Write One…" = "Escrever uma…"; "Nothing yet" = "Ainda nada"; @@ -1364,7 +1363,7 @@ "First contact with a new domain" = "Primeiro contacto com um novo domínio"; "Connections to non-standard ports" = "Ligações a portas não padrão"; "Ignore Apple's own apps" = "Ignorar as apps da Apple"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "O macOS fala com a Apple constantemente — atualizações, iCloud, notificações, hora — e comunicar tudo isso enterra a única linha que importa. O tráfego dessas apps continua a ser registado, continua visível em Em direto e Relatórios, e continua sujeito a todas as regras e proteções."; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "O macOS fala com a Apple constantemente — atualizações, iCloud, notificações, hora — e comunicar tudo isso enterra a única linha que importa. O tráfego dessas apps continua a ser registado, continua visível em Em direto e Histórico, e continua sujeito a todas as regras e proteções."; "Agent uses email, file transfer, SSH, tunnels or databases" = "O agente usa e-mail, transferência de ficheiros, SSH, túneis ou bases de dados"; "Agent connects to a raw IP on an unusual port" = "O agente liga-se a um IP direto numa porta invulgar"; "Uploads to non-AI hosts above" = "Envios para anfitriões não-IA acima de"; @@ -1617,7 +1616,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1819,7 +1818,7 @@ "Showing %lld of %lld relationships" = "A mostrar %lld de %lld relações"; "Show %lld more relationships" = "Mostrar mais %lld relações"; "Loads the next page without changing the Map" = "Carrega a página seguinte sem alterar o mapa"; -"Select a relationship for an exact Reports scope." = "Selecione uma relação para obter um âmbito exato nos Relatórios."; +"Select a relationship for an exact History scope." = "Selecione uma relação para obter um âmbito exato no Histórico."; "Period" = "Período"; "No traffic to visualize" = "Sem tráfego para visualizar"; "Flowlight has not observed any connections in this period." = "O Flowlight não observou ligações neste período."; @@ -1865,7 +1864,7 @@ "Select to inspect this connection" = "Selecione para inspecionar esta ligação"; "%lld exact destinations" = "%lld destinos exatos"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ para %@, recebeu %@, enviou %@, %lld ligações"; -"Show domain family in Reports" = "Mostrar família de domínios em Relatórios"; +"Show domain family in History" = "Mostrar família de domínios no Histórico"; /* 0.17.0 History and Connections */ "1 mo" = "1 mês"; diff --git a/Flowlight/Localization/zh-Hans.lproj/Localizable.strings b/Flowlight/Localization/zh-Hans.lproj/Localizable.strings index 9c9a9a5e..74ba9658 100644 --- a/Flowlight/Localization/zh-Hans.lproj/Localizable.strings +++ b/Flowlight/Localization/zh-Hans.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "实时"; "AI Agents" = "AI 代理"; -"Reports" = "报告"; "Alerts" = "警报"; "Rules" = "规则"; "Ask" = "提问"; @@ -344,7 +343,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "包含这台 Mac 的主机名"; "What Flowlight sends" = "Flowlight 发送的内容"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一条汇总是一个应用、一个主机名和一个 IP 地址在该时间窗口内的累加,粒度与“报告”所用的分钟相同 —— 从不按连接,也从不按数据包。汇总大约延迟两分钟发出,即在其所属的那一分钟结束之后;警报则在触发时立即发出。无法连接的收集器会以递增的延迟重试,在它不可用期间最多保留 10,000 条记录。"; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一条汇总是一个应用、一个主机名和一个 IP 地址在该时间窗口内的累加,粒度与“历史记录”所用的分钟相同 —— 从不按连接,也从不按数据包。汇总大约延迟两分钟发出,即在其所属的那一分钟结束之后;警报则在触发时立即发出。无法连接的收集器会以递增的延迟重试,在它不可用期间最多保留 10,000 条记录。"; "Every field that can leave this Mac (%lld)" = "可能离开这台 Mac 的全部字段(%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "那份列表就是全部 —— 它由构建请求内容所依据的同一份声明生成,因此不会落后于代码。无论采用哪种格式、无论还开启了什么,以下内容从不发送:HTTPS 检查记录的一切。请求与响应的标头、正文、工具调用,以及任何已解密交互的内容,都没有通往导出的路径。"; "Show What Would Be Sent…" = "查看将要发送的内容…"; @@ -361,7 +360,7 @@ "Dropped" = "已丢弃"; "Retrying" = "正在重试"; "Status" = "状态"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "导出会作为 Flowlight 自己的流量发出,因此你会像看到其他应用那样在“实时”和“报告”中看到它们;而当它们首次发往新的目标时,你会收到一条关于 Flowlight 的首次连接警报。"; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "导出会作为 Flowlight 自己的流量发出,因此你会像看到其他应用那样在“实时”和“历史记录”中看到它们;而当它们首次发往新的目标时,你会收到一条关于 Flowlight 的首次连接警报。"; "What would be sent" = "将要发送的内容"; "Copy" = "拷贝"; "Done" = "完成"; @@ -465,7 +464,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "该代理上传量的 %@ 发往了非 AI 主机"; "Allowlist" = "允许列表"; "Risk" = "风险"; -"Show Traffic in Reports" = "在报告中查看流量"; +"Show Traffic in History" = "在历史记录中查看流量"; "None seen" = "未发现"; "Large upload" = "大量上传"; "%@ sent to hosts that aren't AI providers" = "已向非 AI 提供方的主机发送 %@"; @@ -504,7 +503,7 @@ "MCP servers (%lld)" = "MCP 服务器(%lld)"; "MCP servers" = "MCP 服务器"; "Guardrails" = "护栏"; -"Open in Reports" = "在报告中打开"; +"Open in History" = "在历史记录中打开"; "Only AI providers. Nothing else was contacted." = "只有 AI 提供方,没有连接其他目标。"; "the tool calls its model asks for" = "它的模型所请求的工具调用"; "tool calls" = "工具调用"; @@ -639,7 +638,7 @@ "Documentation" = "文档"; "1 query · %@" = "1 条查询 · %@"; "%lld queries · %@" = "%lld 条查询 · %@"; -"Open these rows in Reports" = "在“报告”中打开这些行"; +"Open these rows in History" = "在“历史记录”中打开这些行"; "Answered on this Mac · %@" = "在这台 Mac 上作答 · %@"; "1 request left this Mac · %@" = "1 个请求离开了这台 Mac · %@"; "%lld requests left this Mac · %@" = "%lld 个请求离开了这台 Mac · %@"; @@ -1045,13 +1044,13 @@ "Zero" = "零"; "Last 2 minutes" = "最近 2 分钟"; "Application" = "应用程序"; -"%@\nDouble-click to open in Reports" = "%@\n双击可在“报告”中打开"; +"%@\nDouble-click to open in History" = "%@\n双击可在“历史记录”中打开"; "↓ In" = "↓ 接收"; "↑ Out" = "↑ 发送"; "Session ↓" = "本次会话 ↓"; "Session ↑" = "本次会话 ↑"; "Busiest destination" = "流量最高的目标"; -"Show in Reports" = "在报告中查看"; +"Show in History" = "在历史记录中查看"; "Copy Bundle ID" = "拷贝 Bundle ID"; "Top talkers · average of the last 5 seconds" = "流量最高的应用 · 最近 5 秒的平均值"; "The network is quiet" = "网络很安静"; @@ -1288,7 +1287,7 @@ "Nothing is being refused until %@." = "在 %@ 之前不会拒绝任何连接。"; "Resume now" = "立即恢复"; "No rules yet" = "还没有规则"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一条规则指明一个对象 —— 应用、代理、目标或 URL —— 并决定阻止还是允许。在“实时”、“报告”、“AI 代理”或“检查”中右键点按任意一行,就能针对你正在看的内容写一条;也可以从模板库开始 —— 它已经知道安装软件包会连接哪些主机,以及文件会经由哪些主机外传。"; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一条规则指明一个对象 —— 应用、代理、目标或 URL —— 并决定阻止还是允许。在“实时”、“历史记录”、“AI 代理”或“检查”中右键点按任意一行,就能针对你正在看的内容写一条;也可以从模板库开始 —— 它已经知道安装软件包会连接哪些主机,以及文件会经由哪些主机外传。"; "Browse Templates…" = "浏览模板…"; "Write One…" = "写一条…"; "Nothing yet" = "暂无内容"; @@ -1364,7 +1363,7 @@ "First contact with a new domain" = "首次连接新域名"; "Connections to non-standard ports" = "连接到非标准端口"; "Ignore Apple's own apps" = "忽略 Apple 自带应用"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS 会不断与 Apple 通信 —— 更新、iCloud、推送、时间 —— 把这些全部上报,只会淹没真正重要的那一条。这些流量仍会被记录,仍会显示在“实时”和“报告”中,也仍然受每一条规则和护栏的约束。"; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS 会不断与 Apple 通信 —— 更新、iCloud、推送、时间 —— 把这些全部上报,只会淹没真正重要的那一条。这些流量仍会被记录,仍会显示在“实时”和“历史记录”中,也仍然受每一条规则和护栏的约束。"; "Agent uses email, file transfer, SSH, tunnels or databases" = "代理使用邮件、文件传输、SSH、隧道或数据库"; "Agent connects to a raw IP on an unusual port" = "代理通过异常端口连接裸 IP"; "Uploads to non-AI hosts above" = "上传至非 AI 主机超过"; @@ -1617,7 +1616,7 @@ "Reinstall Filter" = "待翻译:Reinstall Filter"; "Potential harm" = "待翻译:Potential harm"; "Show only medium and high local risk assessments" = "待翻译:Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "待翻译:Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "待翻译:Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "待翻译:Showing only requests with medium or high potential harm"; "Response modified" = "待翻译:Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "待翻译:%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1819,7 +1818,7 @@ "Showing %lld of %lld relationships" = "正在显示 %2$lld 个关系中的 %1$lld 个"; "Show %lld more relationships" = "再显示 %lld 个关系"; "Loads the next page without changing the Map" = "加载下一页而不更改地图"; -"Select a relationship for an exact Reports scope." = "请选择一个关系以获得精确的报告范围。"; +"Select a relationship for an exact History scope." = "请选择一个关系以获得精确的历史记录范围。"; "Period" = "时间段"; "No traffic to visualize" = "没有可视化的流量"; "Flowlight has not observed any connections in this period." = "Flowlight 在此时间段内未观察到任何连接。"; @@ -1865,7 +1864,7 @@ "Select to inspect this connection" = "选择以检查此连接"; "%lld exact destinations" = "%lld 个精确目标"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ 到 %@,接收 %@,发送 %@,%lld 个连接"; -"Show domain family in Reports" = "在报告中显示域名族"; +"Show domain family in History" = "在历史记录中显示域名族"; /* 0.17.0 History and Connections */ "1 mo" = "1个月"; diff --git a/Flowlight/Localization/zh-Hant.lproj/Localizable.strings b/Flowlight/Localization/zh-Hant.lproj/Localizable.strings index a5b6c3a8..b6ab15ab 100644 --- a/Flowlight/Localization/zh-Hant.lproj/Localizable.strings +++ b/Flowlight/Localization/zh-Hant.lproj/Localizable.strings @@ -65,7 +65,6 @@ /* App/AppNavigation.swift */ "Live" = "即時"; "AI Agents" = "AI 代理"; -"Reports" = "報告"; "Alerts" = "警示"; "Rules" = "規則"; "Ask" = "提問"; @@ -344,7 +343,7 @@ "flowlight" = "flowlight"; "Include this Mac's host name" = "包含這台 Mac 的主機名稱"; "What Flowlight sends" = "Flowlight 傳送的內容"; -"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity Reports uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一筆彙總資料是一個 App、一個主機名稱和一個 IP 位址在該時間範圍內的累加,精細度與「報告」相同,以分鐘為單位 — 絕不是逐條連線,也絕不是逐個封包。彙總資料大約延後兩分鐘送出,等它所屬的那一分鐘結束之後;警示則在發出時立即送出。連不上的收集器會以逐漸拉長的間隔重試,在它無法連線期間,最多保留 10,000 筆記錄。"; +"A rollup is one app, one hostname and one IP address added up over the window, at the same minute granularity History uses — never per connection and never per packet. Rollups go about two minutes behind, once the minute they belong to is complete; alerts go as they are raised. A collector that can't be reached is retried with a growing delay, and at most 10,000 records are held while it's down." = "一筆彙總資料是一個 App、一個主機名稱和一個 IP 位址在該時間範圍內的累加,精細度與「歷史記錄」相同,以分鐘為單位 — 絕不是逐條連線,也絕不是逐個封包。彙總資料大約延後兩分鐘送出,等它所屬的那一分鐘結束之後;警示則在發出時立即送出。連不上的收集器會以逐漸拉長的間隔重試,在它無法連線期間,最多保留 10,000 筆記錄。"; "Every field that can leave this Mac (%lld)" = "所有可能離開這台 Mac 的欄位(%lld)"; "That list is the whole of it — it is generated from the same declaration the payload is built from, so it can't fall behind the code. Never sent, in any format and whatever else is switched on: anything HTTPS inspection records. Request and response headers, bodies, tool calls and the contents of any decrypted exchange have no path into an export." = "這份清單就是全部 — 它是由建立傳送內容所用的同一份宣告產生的,所以不會落後於程式碼。無論格式為何、無論還開啟了什麼,以下內容一律不會送出:HTTPS 檢查記錄的任何東西。請求與回應的標頭、內文、工具呼叫,以及任何解密後交換的內容,都沒有任何管道進入匯出資料。"; "Show What Would Be Sent…" = "顯示將傳送的內容…"; @@ -361,7 +360,7 @@ "Dropped" = "已丟棄"; "Retrying" = "重試中"; "Status" = "狀態"; -"Exports leave as Flowlight's own traffic, so you'll see them in Live and Reports like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "匯出是以 Flowlight 自己的流量送出的,所以你會像看其他 App 一樣,在「即時」和「報告」中看到它們;而第一次送到新的地方時,你會收到一則關於 Flowlight 的首次連線警示。"; +"Exports leave as Flowlight's own traffic, so you'll see them in Live and History like any other app's, and the first time they go somewhere new you'll get a first-contact alert about Flowlight." = "匯出是以 Flowlight 自己的流量送出的,所以你會像看其他 App 一樣,在「即時」和「歷史記錄」中看到它們;而第一次送到新的地方時,你會收到一則關於 Flowlight 的首次連線警示。"; "What would be sent" = "將傳送的內容"; "Copy" = "拷貝"; "Done" = "完成"; @@ -465,7 +464,7 @@ "%@ of this agent's uploads went to non-AI hosts" = "這個代理有 %@ 的上傳量送到了非 AI 主機"; "Allowlist" = "允許清單"; "Risk" = "風險"; -"Show Traffic in Reports" = "在「報告」中顯示流量"; +"Show Traffic in History" = "在「歷史記錄」中顯示流量"; "None seen" = "未看到任何項目"; "Large upload" = "大量上傳"; "%@ sent to hosts that aren't AI providers" = "已傳送 %@ 到非 AI 供應商的主機"; @@ -504,7 +503,7 @@ "MCP servers (%lld)" = "MCP 伺服器(%lld)"; "MCP servers" = "MCP 伺服器"; "Guardrails" = "防護機制"; -"Open in Reports" = "在「報告」中開啟"; +"Open in History" = "在「歷史記錄」中開啟"; "Only AI providers. Nothing else was contacted." = "只有 AI 供應商,沒有連線其他目標。"; "the tool calls its model asks for" = "它的模型要求的工具呼叫"; "tool calls" = "工具呼叫"; @@ -639,7 +638,7 @@ "Documentation" = "說明文件"; "1 query · %@" = "1 個查詢 · %@"; "%lld queries · %@" = "%lld 個查詢 · %@"; -"Open these rows in Reports" = "在「報告」中開啟這些列"; +"Open these rows in History" = "在「歷史記錄」中開啟這些列"; "Answered on this Mac · %@" = "在這台 Mac 上作答 · %@"; "1 request left this Mac · %@" = "1 個請求離開了這台 Mac · %@"; "%lld requests left this Mac · %@" = "%lld 個請求離開了這台 Mac · %@"; @@ -1045,13 +1044,13 @@ "Zero" = "零"; "Last 2 minutes" = "最近 2 分鐘"; "Application" = "應用程式"; -"%@\nDouble-click to open in Reports" = "%@\n按兩下可在「報告」中開啟"; +"%@\nDouble-click to open in History" = "%@\n按兩下可在「歷史記錄」中開啟"; "↓ In" = "↓ 接收"; "↑ Out" = "↑ 傳送"; "Session ↓" = "工作階段 ↓"; "Session ↑" = "工作階段 ↑"; "Busiest destination" = "最忙碌的目標"; -"Show in Reports" = "在「報告」中顯示"; +"Show in History" = "在「歷史記錄」中顯示"; "Copy Bundle ID" = "拷貝 Bundle ID"; "Top talkers · average of the last 5 seconds" = "流量最高的項目 · 最近 5 秒的平均值"; "The network is quiet" = "網路很安靜"; @@ -1288,7 +1287,7 @@ "Nothing is being refused until %@." = "在 %@ 之前不會拒絕任何連線。"; "Resume now" = "立即恢復"; "No rules yet" = "還沒有任何規則"; -"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一條規則會指名某個對象 — App、代理、目標或 URL — 並決定封鎖或允許。在「即時」、「報告」、「AI 代理」或「檢查」中對任一列按右鍵,就能針對你正在看的東西寫一條規則;也可以從範本庫開始 — 它已經知道安裝套件會連到哪些主機,以及檔案通常是從哪些主機離開的。"; +"A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by." = "一條規則會指名某個對象 — App、代理、目標或 URL — 並決定封鎖或允許。在「即時」、「歷史記錄」、「AI 代理」或「檢查」中對任一列按右鍵,就能針對你正在看的東西寫一條規則;也可以從範本庫開始 — 它已經知道安裝套件會連到哪些主機,以及檔案通常是從哪些主機離開的。"; "Browse Templates…" = "瀏覽範本…"; "Write One…" = "自己寫一條…"; "Nothing yet" = "還沒有任何項目"; @@ -1364,7 +1363,7 @@ "First contact with a new domain" = "首次連線新網域"; "Connections to non-standard ports" = "連線到非標準連接埠"; "Ignore Apple's own apps" = "忽略 Apple 內建 App"; -"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail." = "macOS 會不斷與 Apple 通訊 — 更新、iCloud、推播、時間 — 把這些全部報告出來,只會埋掉真正重要的那一行。這些流量仍然會被記錄,仍然會顯示在「即時」和「報告」中,也仍然受所有規則和防護機制約束。"; +"macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail." = "macOS 會不斷與 Apple 通訊 — 更新、iCloud、推播、時間 — 把這些全部歷史記錄出來,只會埋掉真正重要的那一行。這些流量仍然會被記錄,仍然會顯示在「即時」和「歷史記錄」中,也仍然受所有規則和防護機制約束。"; "Agent uses email, file transfer, SSH, tunnels or databases" = "代理使用郵件、檔案傳輸、SSH、通道或資料庫"; "Agent connects to a raw IP on an unusual port" = "代理透過異常連接埠連線裸 IP"; "Uploads to non-AI hosts above" = "上傳至非 AI 主機超過"; @@ -1617,7 +1616,7 @@ "Reinstall Filter" = "Reinstall Filter"; "Potential harm" = "Potential harm"; "Show only medium and high local risk assessments" = "Show only medium and high local risk assessments"; -"Turn on Local risk analysis in Reports or Settings to use this filter" = "Turn on Local risk analysis in Reports or Settings to use this filter"; +"Turn on Local risk analysis in History or Settings to use this filter" = "Turn on Local risk analysis in History or Settings to use this filter"; "Showing only requests with medium or high potential harm" = "Showing only requests with medium or high potential harm"; "Response modified" = "Response modified"; "%@ answered, then Flowlight changed the response using %@ before the app received it" = "%@ answered, then Flowlight changed the response using %@ before the app received it"; @@ -1819,7 +1818,7 @@ "Showing %lld of %lld relationships" = "正在顯示 %2$lld 個關係中的 %1$lld 個"; "Show %lld more relationships" = "再顯示 %lld 個關係"; "Loads the next page without changing the Map" = "載入下一頁而不變更地圖"; -"Select a relationship for an exact Reports scope." = "請選取一個關係以取得精確的報告範圍。"; +"Select a relationship for an exact History scope." = "請選取一個關係以取得精確的歷史記錄範圍。"; "Period" = "期間"; "No traffic to visualize" = "沒有可視覺化的流量"; "Flowlight has not observed any connections in this period." = "Flowlight 在此期間未觀察到任何連線。"; @@ -1865,7 +1864,7 @@ "Select to inspect this connection" = "選取以檢查此連線"; "%lld exact destinations" = "%lld 個精確目的地"; "%@ to %@, received %@, sent %@, %lld connections" = "%@ 到 %@,接收 %@,傳送 %@,%lld 個連線"; -"Show domain family in Reports" = "在報告中顯示網域族"; +"Show domain family in History" = "在歷史記錄中顯示網域族"; /* 0.17.0 History and Connections */ "1 mo" = "1 個月"; diff --git a/Flowlight/UI/AgentsView.swift b/Flowlight/UI/AgentsView.swift index 66868225..c0fa3da4 100644 --- a/Flowlight/UI/AgentsView.swift +++ b/Flowlight/UI/AgentsView.swift @@ -169,7 +169,7 @@ struct AgentsView: View { } .contextMenu(forSelectionType: AgentSummary.ID.self) { ids in if let id = ids.first { - Button(L("Show Traffic in Reports")) { nav.showReport(filter: TrafficFilter(bundleID: id), granularity: window.granularity) } + Button(L("Show Traffic in History")) { nav.showReport(filter: TrafficFilter(bundleID: id), granularity: window.granularity) } InspectMenuItems(app: (id, agents.first { $0.bundleID == id }?.name ?? id)) FocusMenuItems(app: (id, agents.first { $0.bundleID == id }?.name ?? id)) Divider() @@ -622,7 +622,7 @@ struct AgentDetail: View { .pickerStyle(.segmented).labelsHidden().fixedSize().controlSize(.small) } Spacer() - Button(L("Open in Reports")) { + Button(L("Open in History")) { nav.showReport(filter: TrafficFilter(bundleID: agent.bundleID), granularity: window.granularity) } .controlSize(.small) diff --git a/Flowlight/UI/AlertsView.swift b/Flowlight/UI/AlertsView.swift index 932d7191..075d609f 100644 --- a/Flowlight/UI/AlertsView.swift +++ b/Flowlight/UI/AlertsView.swift @@ -97,7 +97,7 @@ struct AlertsView: View { } Divider() } - Button(L("Show Traffic in Reports")) { if let a = alert(ids.first) { openReport(a) } }.disabled(ids.count != 1) + Button(L("Show Traffic in History")) { if let a = alert(ids.first) { openReport(a) } }.disabled(ids.count != 1) Button(L("Acknowledge")) { monitor.acknowledgeAlerts(ids: Array(ids)) } Button(L("Copy Detail")) { NSPasteboard.general.clearContents() diff --git a/Flowlight/UI/AskView.swift b/Flowlight/UI/AskView.swift index 608aa497..3bd7f19f 100644 --- a/Flowlight/UI/AskView.swift +++ b/Flowlight/UI/AskView.swift @@ -295,7 +295,7 @@ private struct AskTurnView: View { } .buttonStyle(.plain) .disabled(call.filter == nil && call.screen == nil) - .help(call.filter != nil ? L("Open these rows in Reports") + .help(call.filter != nil ? L("Open these rows in History") : call.screen != nil ? L("Open %@", call.screen!.title) : call.summary) if index < turn.calls.count - 1 { Divider() } } diff --git a/Flowlight/UI/InspectView.swift b/Flowlight/UI/InspectView.swift index 631f37f7..4bc3ee03 100644 --- a/Flowlight/UI/InspectView.swift +++ b/Flowlight/UI/InspectView.swift @@ -343,7 +343,7 @@ private struct InspectContent: View { .toggleStyle(.button) .disabled(!LocalRiskSettings.isActive) .help(LocalRiskSettings.isActive ? L("Show only medium and high local risk assessments") - : L("Turn on Local risk analysis in Reports or Settings to use this filter")) + : L("Turn on Local risk analysis in History or Settings to use this filter")) Picker(L("Window"), selection: $window) { ForEach(AgentWindow.allCases) { Text($0.title).tag($0) } } diff --git a/Flowlight/UI/LiveView.swift b/Flowlight/UI/LiveView.swift index 34e20680..88fd21d1 100644 --- a/Flowlight/UI/LiveView.swift +++ b/Flowlight/UI/LiveView.swift @@ -49,7 +49,7 @@ struct LiveView: View { GroupBox { Table(monitor.talkers.sorted(using: sortOrder), selection: $selection, sortOrder: $sortOrder) { TableColumn(L("Application"), value: \.name) { t in - HStack { AppIconView(path: t.path); Text(t.name) }.help(L("%@\nDouble-click to open in Reports", t.bundleID)) + HStack { AppIconView(path: t.path); Text(t.name) }.help(L("%@\nDouble-click to open in History", t.bundleID)) } .width(min: 130) TableColumn(L("↓ In"), value: \.rateIn) { Text("\(ByteFormat.compact($0.rateIn))/s").monospacedDigit().help(ByteFormat.rate($0.rateIn)) } @@ -67,7 +67,7 @@ struct LiveView: View { } .contextMenu(forSelectionType: LiveTalker.ID.self) { ids in if let id = ids.first { - Button(L("Show in Reports")) { openReport(id) } + Button(L("Show in History")) { openReport(id) } InspectMenuItems(app: (id, monitor.talkers.first { $0.bundleID == id }?.name ?? id), host: monitor.talkers.first { $0.bundleID == id }?.topDestination) FocusMenuItems(app: (id, monitor.talkers.first { $0.bundleID == id }?.name ?? id)) diff --git a/Flowlight/UI/RulesView.swift b/Flowlight/UI/RulesView.swift index 880705a7..59a37747 100644 --- a/Flowlight/UI/RulesView.swift +++ b/Flowlight/UI/RulesView.swift @@ -247,7 +247,7 @@ struct RulesView: View { ContentUnavailableView { Label(L("No rules yet"), systemImage: "hand.raised") } description: { - Text(L("A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, Reports, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by.")) + Text(L("A rule names something — an app, an agent, a destination, or a URL — and says block or allow. Right-click any row in Live, History, AI Agents or Inspect to write one about what you're looking at, or start from the library — it already knows which hosts a package install reaches, and which ones a file leaves by.")) } actions: { Button(L("Browse Templates…")) { sheet = .library(nil, RuleTemplate.Subject()) } Button(L("Write One…")) { sheet = .editor(Rule(), isNew: true) } diff --git a/Flowlight/UI/SettingsView.swift b/Flowlight/UI/SettingsView.swift index 816ce4c2..c7c0df31 100644 --- a/Flowlight/UI/SettingsView.swift +++ b/Flowlight/UI/SettingsView.swift @@ -68,7 +68,7 @@ struct SettingsView: View { Toggle(L("First contact with a new domain"), isOn: $firstContact) Toggle(L("Connections to non-standard ports"), isOn: $nonStandardPorts) Toggle(L("Ignore Apple's own apps"), isOn: $ignoreAppleApps) - Text(L("macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and Reports, and still subject to every rule and guardrail.")) + Text(L("macOS talks to Apple constantly — updates, iCloud, push, time — and reporting all of it buries the one line that matters. Their traffic is still recorded, still shown in Live and History, and still subject to every rule and guardrail.")) .font(.caption).foregroundStyle(.secondary) } Section { diff --git a/Flowlight/UI/VisualizeView.swift b/Flowlight/UI/VisualizeView.swift index 19a19e6d..a8b74cde 100644 --- a/Flowlight/UI/VisualizeView.swift +++ b/Flowlight/UI/VisualizeView.swift @@ -1534,14 +1534,14 @@ private struct TrafficGraphInspector: View { } Divider() if !node.isFilterExact { - Text(L("Select a relationship for an exact Reports scope.")) + Text(L("Select a relationship for an exact History scope.")) .font(.callout) .foregroundStyle(FL.muted) } else if node.kind == .launcher || node.kind == .proxy || node.counters.isEmpty { EmptyView() } else if !node.members.isEmpty && (node.filter.domainSuffix != nil || node.members.count > 1) { if node.filter.domainSuffix != nil { - Button(L("Show domain family in Reports")) { + Button(L("Show domain family in History")) { nav.showReport(filter: node.filter, granularity: granularity) } } @@ -1552,7 +1552,7 @@ private struct TrafficGraphInspector: View { } } } else { - Button(L("Show in Reports")) { nav.showReport(filter: node.filter, granularity: granularity) } + Button(L("Show in History")) { nav.showReport(filter: node.filter, granularity: granularity) } #if !APP_STORE if node.kind == .destination || node.kind == .service { if VisualizeActionScope.canInspect(node.filter) { @@ -1724,7 +1724,7 @@ private struct TrafficGraphInspector: View { private func exactActions(_ filter: TrafficFilter, source: TrafficGraphNode?) -> some View { HStack(spacing: Spacing.s) { - Button(L("Reports")) { nav.showReport(filter: filter, granularity: granularity) } + Button(L("History")) { nav.showReport(filter: filter, granularity: granularity) } #if !APP_STORE if VisualizeActionScope.canInspect(filter) { Button(L("Inspect")) { diff --git a/docs/404.html b/docs/404.html index 2c26aa64..3a9ce39e 100644 --- a/docs/404.html +++ b/docs/404.html @@ -86,7 +86,7 @@

That page isn't here

Try the home page,

diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 4a4abb20..dcabb7e4 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -268,6 +268,14 @@ endpoint to fall back to — the user names one or nothing is sent. traffic and a live synthetic feed. Suspicious destinations use reserved documentation addresses (`203.0.113.0/24`, `*.example`). The README and website screenshots come from this mode. +`scripts/screenshots.sh` captures all website images from an exact current-version Release product and updates the +per-image version, checksum and dimension manifest that `check_site.py` enforces. A selective capture advances only +those images, so CI rejects a release that leaves older screenshots behind. For the Store listing, build the +`Flowlight App Store` scheme and run `FL_APP=/absolute/path/to/Flowlight.app scripts/app-store-screenshots.sh`; it +requires the embedded Store extension, rejects the Developer ID system-extension product, and produces the complete +numbered 2880×1800 set under `packaging/app-store/screenshots/macos/`. Both capture paths refuse a candidate that +opens anything other than `demo.sqlite*`, and CI validates the complete Store set against its own manifest. + ## Known limitations - Thread-level attribution isn't possible (see `product.md`). Attribution is per process or app. @@ -301,6 +309,8 @@ that has gone wrong, most of them in production: | Translated roadmaps list as much as English | Nine home pages promised "the rest, in this order" and then one item | | Every screen's `helpAnchor` has a docs section | Coverage shipped with a Help button and nothing on the page to land on | | Screenshots exist, and none is unused | `live.png` was served to nobody for two releases | +| Every website and Store screenshot manifest entry matches the current version, bytes and dimensions | Two renamed menu items shipped beside eight screenshots that still showed the old sidebar | +| The Store set contains all nine upload-ready 2880×1800 images | App Store Connect could otherwise retain screenshots from different builds | | The views table matches the sidebar | It gave Inspect ⌘5 long after it became ⌘7, and never listed Rules, Ask, Devices or Coverage | | One `

` per page | A translation duplicating a heading while editing | diff --git a/docs/about/index.html b/docs/about/index.html index 1f04e14f..86d88535 100644 --- a/docs/about/index.html +++ b/docs/about/index.html @@ -153,7 +153,7 @@

Thanks

diff --git a/docs/assets/screenshots/agent-detail.png b/docs/assets/screenshots/agent-detail.png index 451fc70b..9d5a799a 100644 Binary files a/docs/assets/screenshots/agent-detail.png and b/docs/assets/screenshots/agent-detail.png differ diff --git a/docs/assets/screenshots/agent-tools.png b/docs/assets/screenshots/agent-tools.png index 6d76cd60..0ff245f6 100644 Binary files a/docs/assets/screenshots/agent-tools.png and b/docs/assets/screenshots/agent-tools.png differ diff --git a/docs/assets/screenshots/agents.png b/docs/assets/screenshots/agents.png index c3a3e04e..4dfdcb22 100644 Binary files a/docs/assets/screenshots/agents.png and b/docs/assets/screenshots/agents.png differ diff --git a/docs/assets/screenshots/alerts.png b/docs/assets/screenshots/alerts.png index 76e93d29..ac4bf80b 100644 Binary files a/docs/assets/screenshots/alerts.png and b/docs/assets/screenshots/alerts.png differ diff --git a/docs/assets/screenshots/always-monitor.png b/docs/assets/screenshots/always-monitor.png index 93600ea5..8d314470 100644 Binary files a/docs/assets/screenshots/always-monitor.png and b/docs/assets/screenshots/always-monitor.png differ diff --git a/docs/assets/screenshots/inspect.png b/docs/assets/screenshots/inspect.png index 67dd414a..f2618a1b 100644 Binary files a/docs/assets/screenshots/inspect.png and b/docs/assets/screenshots/inspect.png differ diff --git a/docs/assets/screenshots/live.png b/docs/assets/screenshots/live.png index 298f5bc6..b1e81738 100644 Binary files a/docs/assets/screenshots/live.png and b/docs/assets/screenshots/live.png differ diff --git a/docs/assets/screenshots/manifest.json b/docs/assets/screenshots/manifest.json new file mode 100644 index 00000000..ac2049b9 --- /dev/null +++ b/docs/assets/screenshots/manifest.json @@ -0,0 +1,65 @@ +{ + "schema": 1, + "screenshots": { + "agent-detail.png": { + "height": 1988, + "sha256": "ac80daa5d6e4873c09ff587e5777b25d1f5ef518d40f16cead97fa16fa92519b", + "version": "0.17.1", + "width": 3200 + }, + "agent-tools.png": { + "height": 1424, + "sha256": "28ded766cff3de5e0b16150f9ca71aa03c1a71e7e4289a3c60c73105cd55f2c6", + "version": "0.17.1", + "width": 3200 + }, + "agents.png": { + "height": 1988, + "sha256": "474c014faa6ea955c31c2a2be33d79a107545439e48524c7e0721fdfb2c4beb6", + "version": "0.17.1", + "width": 3200 + }, + "alerts.png": { + "height": 1988, + "sha256": "f85e2dbd213ce5e683e49da76b44c0632342374f3e91d70ed9d7dabbd74ac9e7", + "version": "0.17.1", + "width": 3200 + }, + "always-monitor.png": { + "height": 1988, + "sha256": "35705e00b12c44d8ff2f8b9303beb5315e57235c09f96bb9628a43c442b390ea", + "version": "0.17.1", + "width": 3200 + }, + "inspect.png": { + "height": 1988, + "sha256": "8e38acb6cdbc200c50f31aa4fc221db998d4fb9b2e429dc4b6140fd3eb8f3fd4", + "version": "0.17.1", + "width": 3200 + }, + "live.png": { + "height": 1988, + "sha256": "264e60b78c786ad60d83271ab1d7ed0aae61091e6fa9c17ba2af5ca0c38ad269", + "version": "0.17.1", + "width": 3200 + }, + "mcp-servers.png": { + "height": 1424, + "sha256": "d48c5dcedb58d1bafc3c4bbb5bdc2024a2379550737ce019de62d642cd7f1e39", + "version": "0.17.1", + "width": 3200 + }, + "reports.png": { + "height": 1988, + "sha256": "dfa6af58c9d504ca3a2959dda551fbec3880190e44153036917bd726c09f75db", + "version": "0.17.1", + "width": 3200 + }, + "visualize.png": { + "height": 1988, + "sha256": "fb66b26178b8e0f3928848a8073660615dbc9dbb377f65a43d49eb62352284fc", + "version": "0.17.1", + "width": 3200 + } + } +} diff --git a/docs/assets/screenshots/mcp-servers.png b/docs/assets/screenshots/mcp-servers.png index 095d2810..f6303813 100644 Binary files a/docs/assets/screenshots/mcp-servers.png and b/docs/assets/screenshots/mcp-servers.png differ diff --git a/docs/assets/screenshots/reports.png b/docs/assets/screenshots/reports.png index d388ebbd..43b9e069 100644 Binary files a/docs/assets/screenshots/reports.png and b/docs/assets/screenshots/reports.png differ diff --git a/docs/assets/screenshots/visualize.png b/docs/assets/screenshots/visualize.png index 1ca81424..66daff30 100644 Binary files a/docs/assets/screenshots/visualize.png and b/docs/assets/screenshots/visualize.png differ diff --git a/docs/de/about/index.html b/docs/de/about/index.html index 7cf311bb..c6bdb42b 100644 --- a/docs/de/about/index.html +++ b/docs/de/about/index.html @@ -152,7 +152,7 @@

Dank

diff --git a/docs/de/docs/index.html b/docs/de/docs/index.html index 49426d38..a9bbbcd1 100644 --- a/docs/de/docs/index.html +++ b/docs/de/docs/index.html @@ -76,7 +76,7 @@

Dokumentation

Flowlight benutzen

-

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.17.0, macOS 15 oder neuer.

+

Alles vom ersten Start bis zum Feinschliff an den Agentenregeln. Flowlight 0.17.1, macOS 15 oder neuer.

diff --git a/docs/de/index.html b/docs/de/index.html index 89f23531..707c55ed 100644 --- a/docs/de/index.html +++ b/docs/de/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

Sieh, was deine Apps im Netz tun.
brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniversalGPL-3.0Keine Telemetrie

+

v0.17.1macOS 15+UniversalGPL-3.0Keine Telemetrie

@@ -127,7 +127,7 @@

Sieh, was deine Apps im Netz tun.
-
Flowlights Karte der KI-Aktivität. Agentenkarten führen über zugeordnete Werkzeuge und konfigurierte Gateways; die beobachtete Route von magpie über Flowlight verzweigt sich anschließend zu LLM-Diensten und Domains. Die Bandbreite zeigt das Verkehrsvolumen des Zeitraums.

Sieh die tatsächliche KI-Route: Agenten, zugeordnete Werkzeuge, konfigurierte Gateways, Flowlights beobachtete Proxy-Stufe und exakte Ziele. Die Bandbreite zeigt empfangene plus gesendete Daten im gewählten Zeitraum. Mit Demodaten.

@@ -135,7 +135,7 @@

Sieh, was deine Apps im Netz tun.
-
Flowlights Ansicht KI-Agenten. Claude Code, Cursor, Codex und ein Python-Skript mit ihren KI-Anbietern, dem woanders hin gesendeten Datenverkehr und Risikomarkierungen für SMTP, SSH, FTP, einen großen Upload und eine reine IP.

Die Ansicht KI-Agenten: der Modellanbieter jedes Agenten – und alles andere, mit dem er gesprochen hat. Mit Demodaten gezeigt.

@@ -405,16 +405,16 @@

Unterstützte Tool-Aufrufe mit Netzwerkanfragen verknüpfen

Mac. Starte einen Agenten aus einem inspizierten Terminal, und der unterstützte HTTP-Verkehr des Agenten und seiner Tools wird entschlüsselt – mit den Tool-Aufrufen, die das Modell angefordert hat, und den Ergebnissen, die zurückgingen.

-
Flowlights Ansicht Inspizieren: eine Liste entschlüsselter Anfragen von Claude Code mit ihren Tool-Aufrufen und das Detail des curl-Uploads zu paste.example, ausgelöst vom Bash-Tool-Aufruf, mit den hochgeladenen Notizen im Anfrage-Body
Wo sind meine Notizen gelandet? Der curl-Upload zu paste.example, zurückverfolgt bis zum Bash-Befehl, den das Modell angefordert hat, mit dem gesendeten Body.
-
Der Tab Tools für Claude Code: Bash, Read und zwei MCP-Tools mit Beschreibungen und der Häufigkeit, mit der das Modell sie aufgerufen hat
Jedes Tool, das ein Agent dem Modell anbietet. Agenten deklarieren ihre Tools bei jedem Zug, also listet Flowlight alle auf – mit denen, die das Modell tatsächlich genutzt hat, und denen, die es nie angefasst hat.
-
Der Tab MCP-Server für Codex: ein sentry-Server, markiert als über den Anbieter, seine URL, Freigabe auf nie gesetzt, erlaubte Tools und die Tools, die er anbietet
Auch die, die du auf der Leitung nicht siehst. Bittet ein Agent den Anbieter, sich mit einem MCP-Server zu verbinden, erreicht dieser Datenverkehr deinen Mac nie. Seine Anfrage schon – also tauchen der Server, seine URL, seine Freigabeeinstellung und seine Tools trotzdem auf.
@@ -460,7 +460,7 @@

Ein Wächter, den du nicht bewachen musst

-
Das Detail von Claude Code in Flowlight: Tools und MCP-Server mit Aufrufzahlen und einem Fehlschlag, eine Erlaubnisliste und der Tab Tool-Aufrufe mit einem fehlgeschlagenen git push, einem curl-Upload zu paste.example samt Antwort und Anfrage, npm install, einem GitHub-Issue, einer Doku-Suche und einem Datei-Lesevorgang, jeweils mit Ergebnis
Ein Agent, jeder Tool-Aufruf. Der Datenverkehr der git-, curl- und MCP-Server, die Claude Code gestartet hat, zählt als Datenverkehr von Claude Code. Mit eingeschalteter HTTPS-Inspektion zeigt der Tab Tool-Aufrufe, was das Modell angefordert hat, was zurückkam und welche Anfragen jedes Tool gestellt hat: @@ -470,10 +470,10 @@

Ein Wächter, den du nicht bewachen musst

-
Die Ansicht Verlauf mit stündlichen Balken für empfangene und gesendete Daten und Ringdiagrammen für Apps, Ziele und Protokolle
Verlauf. Zoom von der Sekunde bis zum Jahr, drei Gruppierungen, Diagramme, die auch bei hunderten Apps lesbar bleiben.
-
Die Ansicht Warnungen mit Warnungen zu Agenten-Exfiltration, E-Mail, FTP, Aktivität bei Abwesenheit und einer Verkehrsspitze
Warnungen. Jede nennt die App, das Ziel und den Wert, der sie ausgelöst hat.
@@ -589,7 +589,7 @@

Wisse, was deinen Mac verlässt.

diff --git a/docs/de/privacy/index.html b/docs/de/privacy/index.html index bad375b9..54efa498 100644 --- a/docs/de/privacy/index.html +++ b/docs/de/privacy/index.html @@ -189,7 +189,7 @@

Kontakt

diff --git a/docs/de/threat-model/index.html b/docs/de/threat-model/index.html index a22647a5..ebf3b396 100644 --- a/docs/de/threat-model/index.html +++ b/docs/de/threat-model/index.html @@ -225,7 +225,7 @@

Eine Schwachstelle melden

diff --git a/docs/docs/index.html b/docs/docs/index.html index 02403f21..ea142d4f 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -76,7 +76,7 @@

Documentation

Using Flowlight

-

Everything from the first launch to tuning the agent rules. Flowlight 0.17.0, macOS 15 or later.

+

Everything from the first launch to tuning the agent rules. Flowlight 0.17.1, macOS 15 or later.

diff --git a/docs/es/about/index.html b/docs/es/about/index.html index 2f102a68..1599870a 100644 --- a/docs/es/about/index.html +++ b/docs/es/about/index.html @@ -152,7 +152,7 @@

Agradecimientos

diff --git a/docs/es/docs/index.html b/docs/es/docs/index.html index f20093f3..399c321e 100644 --- a/docs/es/docs/index.html +++ b/docs/es/docs/index.html @@ -76,7 +76,7 @@

Documentación

Usar Flowlight

-

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.17.0, macOS 15 o posterior.

+

Todo, desde el primer arranque hasta el ajuste de las reglas de agentes. Flowlight 0.17.1, macOS 15 o posterior.

diff --git a/docs/es/index.html b/docs/es/index.html index 0119022d..3699d75f 100644 --- a/docs/es/index.html +++ b/docs/es/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

Observa la actividad de red de tus apps.

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniversalGPL-3.0Sin telemetría

+

v0.17.1macOS 15+UniversalGPL-3.0Sin telemetría

@@ -127,7 +127,7 @@

Observa la actividad de red de tus apps.
-
El mapa de actividad de IA de Flowlight. Las tarjetas de agentes se conectan mediante herramientas atribuidas y puertas de enlace configuradas; la ruta observada de magpie a Flowlight se ramifica después hacia servicios LLM y dominios. El ancho de las cintas muestra el tráfico del período.

Ve la ruta real de IA: agentes, herramientas atribuidas, puertas de enlace configuradas, la etapa de proxy observada por Flowlight y destinos exactos. El ancho muestra el total recibido y enviado en el período seleccionado. Con datos de demostración.

@@ -135,7 +135,7 @@

Observa la actividad de red de tus apps.
-
La vista Agentes de IA de Flowlight. Claude Code, Cursor, Codex y un script de Python aparecen con sus proveedores de IA, el tráfico enviado a otros sitios y distintivos de riesgo por SMTP, SSH, FTP, una subida grande y una IP directa.

La vista Agentes de IA: el proveedor de modelo de cada agente y todo lo demás con lo que habló. Con datos de demostración.

@@ -405,16 +405,16 @@

Correlaciona las llamadas de herramientas compatibles con las peticiones de Mac. Arranca un agente desde un Terminal inspeccionado y el tráfico HTTP compatible del agente y de sus herramientas se descifra, con las llamadas de herramientas que pidió el modelo y los resultados que volvieron.

-
La vista Inspeccionar de Flowlight: una lista de peticiones descifradas de Claude Code con sus llamadas de herramientas, y el detalle de la subida de curl a paste.example, hecha por la llamada de herramienta Bash que la ejecutó, con las notas subidas en el cuerpo de la petición
¿Adónde han ido mis notas? La subida de curl a paste.example, rastreada hasta el comando Bash que pidió el modelo, con el cuerpo que envió.
-
La pestaña Herramientas de Claude Code: Bash, Read y dos herramientas MCP con sus descripciones y cuántas veces las llamó el modelo
Todas las herramientas que un agente ofrece al modelo. Los agentes declaran sus herramientas en cada turno, así que Flowlight las lista todas, señalando las que el modelo usó de verdad y las que no tocó nunca.
-
La pestaña Servidores MCP de Codex: un servidor sentry marcado como vía proveedor, su URL, la aprobación fijada en nunca, las herramientas permitidas y las que ofrece
Incluidos los que no se ven en el cable. Cuando un agente pide al proveedor que conecte con un servidor MCP, ese tráfico nunca llega a tu Mac. Su petición sí, así que el servidor, su URL, su ajuste de aprobación y sus herramientas siguen apareciendo.
@@ -460,7 +460,7 @@

Un monitor que no tienes que vigilar

-
El detalle de Claude Code en Flowlight: herramientas y servidores MCP con su número de llamadas y un fallo, una lista de permitidos y la pestaña Llamadas de herramientas con un git push fallido, una subida de curl a paste.example con su respuesta y su petición, un npm install, una incidencia de GitHub, una búsqueda en la documentación y una lectura de archivo, cada una con su resultado
Un agente, todas sus llamadas de herramientas. El tráfico del git, del curl y de los servidores MCP que arrancó Claude Code cuenta como de Claude Code. Con la inspección HTTPS activada, la pestaña Llamadas de herramientas muestra qué pidió el modelo, qué volvió y las peticiones que hizo cada herramienta: @@ -470,10 +470,10 @@

Un monitor que no tienes que vigilar

-
La vista Historial con barras por hora de datos recibidos y enviados y gráficos de anillo de apps, destinos y protocolos
Historial. Zoom del segundo al año, tres agrupaciones y gráficos que siguen legibles con cientos de apps.
-
La vista Alertas con alertas de exfiltración por un agente, de correo, de FTP, de actividad mientras no estás y de picos de tráfico
Alertas. Cada una nombra la app, el destino y la cifra que la activó.
@@ -589,7 +589,7 @@

Ten claro qué sale de tu Mac.

diff --git a/docs/es/privacy/index.html b/docs/es/privacy/index.html index 23184479..2e5539ae 100644 --- a/docs/es/privacy/index.html +++ b/docs/es/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/es/threat-model/index.html b/docs/es/threat-model/index.html index 91a62f85..f0036de9 100644 --- a/docs/es/threat-model/index.html +++ b/docs/es/threat-model/index.html @@ -221,7 +221,7 @@

Informar de una vulnerabilidad

diff --git a/docs/fr/about/index.html b/docs/fr/about/index.html index c5f894c9..75e2fb3b 100644 --- a/docs/fr/about/index.html +++ b/docs/fr/about/index.html @@ -152,7 +152,7 @@

Remerciements

diff --git a/docs/fr/docs/index.html b/docs/fr/docs/index.html index 9d484e7c..7cf8246b 100644 --- a/docs/fr/docs/index.html +++ b/docs/fr/docs/index.html @@ -76,7 +76,7 @@

Documentation

Utiliser Flowlight

-

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.17.0, macOS 15 ou version ultérieure.

+

Tout, du premier lancement au réglage des règles des agents. Flowlight 0.17.1, macOS 15 ou version ultérieure.

diff --git a/docs/fr/index.html b/docs/fr/index.html index 264c9396..2f52c8c9 100644 --- a/docs/fr/index.html +++ b/docs/fr/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

Voyez l’activité réseau de vos apps.

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniverselGPL-3.0Sans télémétrie

+

v0.17.1macOS 15+UniverselGPL-3.0Sans télémétrie

@@ -127,7 +127,7 @@

Voyez l’activité réseau de vos apps.
-
La carte d’activité IA de Flowlight. Les cartes des agents passent par des outils attribués et des passerelles configurées ; la route observée de magpie vers Flowlight se ramifie ensuite vers les services LLM et les domaines. La largeur des rubans indique le trafic de la période.

Voyez la route IA réelle : agents, outils attribués, passerelles configurées, étape proxy observée par Flowlight et destinations exactes. La largeur indique le total reçu et envoyé pendant la période sélectionnée. Avec des données de démonstration.

@@ -135,7 +135,7 @@

Voyez l’activité réseau de vos apps.
-
La vue Agents IA de Flowlight. Claude Code, Cursor, Codex et un script Python y figurent avec leurs fournisseurs d’IA, le trafic envoyé ailleurs et des badges de risque pour SMTP, SSH, FTP, un envoi volumineux et une IP brute.

La vue Agents IA : le fournisseur de modèle de chaque agent, et tout le reste de ce qu’il a contacté. Avec des données de démonstration.

@@ -405,16 +405,16 @@

Reliez les appels d’outils pris en charge aux requêtes réseau

Mac. Lancez un agent depuis un Terminal inspecté et le trafic HTTP pris en charge de l’agent et de ses outils est déchiffré, avec les appels d’outils que le modèle a demandés et les résultats qui lui sont revenus.

-
La vue Inspecter de Flowlight : une liste de requêtes Claude Code déchiffrées avec leurs appels d’outils, et le détail de l’envoi de curl vers paste.example, effectué par l’appel d’outil Bash qui l’a lancé, avec les notes envoyées dans le corps de la requête
Où sont parties mes notes ? L’envoi de curl vers paste.example, remonté jusqu’à la commande Bash demandée par le modèle, avec le corps transmis.
-
L’onglet Outils de Claude Code : Bash, Read et deux outils MCP avec leurs descriptions et le nombre d’appels du modèle pour chacun
Tous les outils qu’un agent propose au modèle. Les agents déclarent leurs outils à chaque tour, donc Flowlight les liste tous, en distinguant ceux que le modèle a vraiment utilisés de ceux qu’il n’a jamais touchés.
-
L’onglet Serveurs MCP de Codex : un serveur sentry marqué via le fournisseur, son URL, l’approbation réglée sur jamais, les outils autorisés et les outils qu’il propose
Y compris ceux qu’on ne voit pas passer sur le réseau. Quand un agent demande au fournisseur de se connecter à un serveur MCP, ce trafic ne passe jamais par votre Mac. Sa requête, si : le serveur, son URL, son réglage d’approbation et ses outils apparaissent quand même.
@@ -460,7 +460,7 @@

Un moniteur que vous n’avez pas à surveiller

-
Le détail de Claude Code dans Flowlight : Outils et serveurs MCP avec le nombre d’appels et un échec, une liste d’autorisation, et l’onglet Appels d’outils listant un git push en échec, un envoi curl vers paste.example avec sa réponse et sa requête, un npm install, un ticket GitHub, une recherche dans la documentation et une lecture de fichier, chacun avec son résultat
Un agent, tous ses appels d’outils. Le trafic des git, curl et serveurs MCP lancés par Claude Code compte comme celui de Claude Code. Avec l’inspection HTTPS activée, l’onglet Appels d’outils montre ce que le modèle a demandé, ce qui est revenu et les requêtes émises par chaque outil : @@ -470,10 +470,10 @@

Un moniteur que vous n’avez pas à surveiller

-
La vue Historique avec les barres horaires des données reçues et envoyées et des anneaux pour les apps, les destinations et les protocoles
Historique. Zoom de la seconde à l’année, trois regroupements, des graphiques qui restent lisibles avec des centaines d’apps.
-
La vue Alertes listant des alertes d’exfiltration par un agent, d’e-mail, de FTP, d’activité pendant une absence et de pic de trafic
Alertes. Chacune nomme l’app, la destination et le chiffre qui l’a déclenchée.
@@ -589,7 +589,7 @@

Sachez ce qui quitte votre Mac.

diff --git a/docs/fr/privacy/index.html b/docs/fr/privacy/index.html index 397ca450..d58dadb0 100644 --- a/docs/fr/privacy/index.html +++ b/docs/fr/privacy/index.html @@ -189,7 +189,7 @@

Contact

diff --git a/docs/fr/threat-model/index.html b/docs/fr/threat-model/index.html index c7edb0d3..8bd9ca95 100644 --- a/docs/fr/threat-model/index.html +++ b/docs/fr/threat-model/index.html @@ -224,7 +224,7 @@

Signaler une vulnérabilité

diff --git a/docs/index.html b/docs/index.html index 30b2d21a..e14554a8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

See your apps' network activity.
brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniversalGPL-3.0No telemetry

+

v0.17.1macOS 15+UniversalGPL-3.0No telemetry

@@ -127,7 +127,7 @@

See your apps' network activity.
-
Flowlight's AI activity map. Agent cards connect through attributed tools and configured gateways; the observed magpie to Flowlight route then branches to LLM services and domains, with ribbon width showing period traffic volume.

See the real AI route: agents, attributed tools, configured gateways, Flowlight's observed proxy stage, and exact destinations. Ribbon width shows total received plus sent traffic for the selected period. Shown with demo data.

@@ -135,7 +135,7 @@

See your apps' network activity.
-
Flowlight's AI Agents view. Claude Code, Cursor, Codex and a Python script are listed with their AI providers, traffic sent elsewhere and risk badges for SMTP, SSH, FTP, a large upload and a raw IP.

The AI Agents view: each agent's model provider, and everything else it talked to. Shown with demo data.

@@ -143,7 +143,7 @@

See your apps' network activity.
-
The AI Agents view offering to always monitor Windsurf, and confirming Flowlight is keeping Claude Code and Cursor routed through it on every launch, each with a one-click Stop Monitoring.

Always monitor an agent: Flowlight writes the proxy into the agent's own settings so it routes through on every launch, and says what it's keeping — stop any of it in a click. Shown with demo data.

@@ -427,16 +427,16 @@

Correlate supported tool calls with network requests

Mac. Start an agent from an inspected Terminal and supported HTTP traffic from the agent and its tools is decrypted, with tool calls the model asked for and the results that went back.

-
Flowlight's Inspect view: a list of decrypted Claude Code requests with their tool calls, and the detail of curl's upload to paste.example, made by the Bash tool call that ran it, with the uploaded notes in the request body
Where did my notes go? curl's upload to paste.example, traced to the Bash command the model asked for, with the body it sent.
-
The Tools tab for Claude Code: Bash, Read and two MCP tools with descriptions and how often the model called each
Every tool an agent offers the model. Agents declare their tools on each turn, so Flowlight lists them all, with the ones the model actually used and the ones it never touched.
-
The MCP servers tab for Codex: a sentry server marked via provider, its URL, approval set to never, allowed tools and the tools it offers
Including the ones you can't see on the wire. When an agent asks the provider to connect to an MCP server, that traffic never reaches your Mac. Its request does, so the server, its URL, its approval setting and its tools still show up.
@@ -482,7 +482,7 @@

A monitor you don't have to monitor

-
Claude Code's detail in Flowlight: Tools and MCP servers with call counts and one failure, an allowlist, and the Tool calls tab listing a failed git push, a curl upload to paste.example with its response and request, npm install, a GitHub issue, a docs search and a file read, each with its result
One agent, every tool call. Traffic from the git, curl and MCP servers Claude Code started counts as Claude Code's. With HTTPS inspection on, the Tool calls tab shows what the model asked for, what came back, and the requests each tool made: @@ -492,10 +492,10 @@

A monitor you don't have to monitor

-
History view with hourly received and sent bars and donut charts of apps, destinations and protocols
History. Preset ranges, a draggable navigator, three groupings, and charts that stay readable with hundreds of apps.
-
Alerts view listing agent exfiltration, email, FTP, while-away and traffic spike alerts
Alerts. Each one names the app, the destination and the number that tripped it.
@@ -612,7 +612,7 @@

Know what leaves your Mac.

diff --git a/docs/it/about/index.html b/docs/it/about/index.html index 8ff224e8..9c95eb6b 100644 --- a/docs/it/about/index.html +++ b/docs/it/about/index.html @@ -152,7 +152,7 @@

Ringraziamenti

diff --git a/docs/it/docs/index.html b/docs/it/docs/index.html index 90a8478e..62c23a43 100644 --- a/docs/it/docs/index.html +++ b/docs/it/docs/index.html @@ -76,7 +76,7 @@

Documentazione

Usare Flowlight

-

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.17.0, macOS 15 o successivo.

+

Tutto, dal primo avvio alla messa a punto delle regole per gli agenti. Flowlight 0.17.1, macOS 15 o successivo.

diff --git a/docs/it/index.html b/docs/it/index.html index 6e3bf6c7..23d137d8 100644 --- a/docs/it/index.html +++ b/docs/it/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

Vedi la rete delle tue app.
Ca

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniversaleGPL-3.0Nessuna telemetria

+

v0.17.1macOS 15+UniversaleGPL-3.0Nessuna telemetria

@@ -127,7 +127,7 @@

Vedi la rete delle tue app.
Ca
-
La mappa dell’attività IA di Flowlight. Le schede degli agenti passano attraverso strumenti attribuiti e gateway configurati; il percorso osservato da magpie a Flowlight si dirama poi verso servizi LLM e domini. La larghezza dei nastri mostra il traffico del periodo.

Vedi il percorso IA reale: agenti, strumenti attribuiti, gateway configurati, lo stadio proxy osservato da Flowlight e le destinazioni esatte. La larghezza mostra il totale ricevuto e inviato nel periodo selezionato. Con dati dimostrativi.

@@ -135,7 +135,7 @@

Vedi la rete delle tue app.
Ca
-
La vista Agenti IA di Flowlight. Claude Code, Cursor, Codex e uno script Python sono elencati con i loro provider IA, il traffico inviato altrove e i contrassegni di rischio per SMTP, SSH, FTP, un caricamento di grandi dimensioni e un IP grezzo.

La vista Agenti IA: il provider del modello di ogni agente e tutto il resto con cui ha parlato. Mostrata con dati dimostrativi.

@@ -405,16 +405,16 @@

Collega le chiamate agli strumenti supportate alle richieste di rete

sul tuo Mac. Avvia un agente da un Terminale ispezionato e il traffico HTTP supportato dell'agente e dei suoi strumenti viene decifrato, con le chiamate agli strumenti richieste dal modello e i risultati tornati indietro.

-
La vista Ispeziona di Flowlight: un elenco di richieste decifrate di Claude Code con le loro chiamate agli strumenti e il dettaglio del caricamento di curl verso paste.example, prodotto dalla chiamata allo strumento Bash che lo ha eseguito, con le note caricate nel corpo della richiesta
Dove sono finite le mie note? Il caricamento di curl verso paste.example, risalendo al comando Bash richiesto dal modello, con il corpo che ha inviato.
-
Il pannello Strumenti per Claude Code: Bash, Read e due strumenti MCP con le descrizioni e quante volte il modello ha chiamato ciascuno
Ogni strumento che un agente offre al modello. Gli agenti dichiarano i loro strumenti a ogni turno, così Flowlight li elenca tutti, indicando quelli che il modello ha davvero usato e quelli che non ha mai toccato.
-
Il pannello Server MCP per Codex: un server sentry contrassegnato come «tramite provider», il suo URL, approvazione impostata su «mai», gli strumenti consentiti e quelli che offre
Compresi quelli che non vedi passare in rete. Quando un agente chiede al provider di collegarsi a un server MCP, quel traffico non arriva mai al tuo Mac. La sua richiesta sì, così il server, il suo URL, la sua impostazione di approvazione e i suoi strumenti compaiono comunque.
@@ -460,7 +460,7 @@

Un monitoraggio che non devi monitorare

-
Il dettaglio di Claude Code in Flowlight: strumenti e server MCP con il numero di chiamate e un errore, un elenco consentiti e il pannello Chiamate agli strumenti con un git push fallito, un caricamento curl verso paste.example con la sua risposta e la sua richiesta, npm install, un issue su GitHub, una ricerca nella documentazione e la lettura di un file, ciascuno con il proprio risultato
Un agente, tutte le chiamate agli strumenti. Il traffico di git, curl e dei server MCP avviati da Claude Code conta come traffico di Claude Code. Con l'ispezione HTTPS attiva, il pannello Chiamate agli strumenti mostra che cosa ha chiesto il modello, che cosa è tornato indietro e le richieste fatte da ogni strumento: @@ -470,10 +470,10 @@

Un monitoraggio che non devi monitorare

-
La vista Cronologia con le barre orarie dei dati ricevuti e inviati e i grafici ad anello di app, destinazioni e protocolli
Cronologia. Zoom dal secondo all'anno, tre raggruppamenti, grafici che restano leggibili con centinaia di app.
-
La vista Avvisi con avvisi di esfiltrazione da parte di un agente, e-mail, FTP, attività mentre sei via e picco di traffico
Avvisi. Ognuno indica l'app, la destinazione e il numero che lo ha fatto scattare.
@@ -589,7 +589,7 @@

Sappi che cosa esce dal tuo Mac.

diff --git a/docs/it/privacy/index.html b/docs/it/privacy/index.html index 650f8c15..901cfe67 100644 --- a/docs/it/privacy/index.html +++ b/docs/it/privacy/index.html @@ -189,7 +189,7 @@

Contatti

diff --git a/docs/it/threat-model/index.html b/docs/it/threat-model/index.html index 5d1feab9..a78636b9 100644 --- a/docs/it/threat-model/index.html +++ b/docs/it/threat-model/index.html @@ -223,7 +223,7 @@

Segnalare una vulnerabilità

diff --git a/docs/ja/about/index.html b/docs/ja/about/index.html index 5f248678..b3993bc6 100644 --- a/docs/ja/about/index.html +++ b/docs/ja/about/index.html @@ -153,7 +153,7 @@

謝辞

diff --git a/docs/ja/docs/index.html b/docs/ja/docs/index.html index 06c4241b..57169882 100644 --- a/docs/ja/docs/index.html +++ b/docs/ja/docs/index.html @@ -76,7 +76,7 @@

ドキュメント

Flowlight の使い方

-

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.17.0、macOS 15 以降。

+

初回起動からエージェントのルールの調整まで、すべてここに。Flowlight 0.17.1、macOS 15 以降。

diff --git a/docs/ja/index.html b/docs/ja/index.html index 94eb843f..de4ca342 100644 --- a/docs/ja/index.html +++ b/docs/ja/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

アプリの通信が見える。
brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+ユニバーサルGPL-3.0テレメトリなし

+

v0.17.1macOS 15+ユニバーサルGPL-3.0テレメトリなし

@@ -127,7 +127,7 @@

アプリの通信が見える。
-
Flowlight の AI アクティビティマップ。エージェントカードは関連付けられたツールと設定済みゲートウェイを経由し、観測された magpie から Flowlight への経路が LLM サービスとドメインへ分岐します。帯の幅は期間内の通信量を示します。

実際の AI 経路を確認できます。エージェント、関連付けられたツール、設定済みゲートウェイ、Flowlight が観測したプロキシ段階、正確な接続先を表示。帯の幅は選択期間の受信量と送信量の合計です。デモデータで表示しています。

@@ -135,7 +135,7 @@

アプリの通信が見える。
-
Flowlight の AI エージェントビュー。Claude Code、Cursor、Codex、Python スクリプトが、利用している AI プロバイダ、ほかへ送ったトラフィック、SMTP・SSH・FTP・大量送信・生 IP のリスクバッジとともに並んでいます。

AI エージェントビュー。各エージェントのモデルプロバイダと、それ以外に通信した相手のすべて。デモデータで表示しています。

@@ -404,16 +404,16 @@

対応するツール呼び出しとネットワークリクエストを結 インスペクト対象のターミナルからエージェントを起動すれば、エージェントとそのツールの対応 HTTP 通信が復号され、モデルが要求した ツール呼び出しと、返っていった結果まで見えます。

-
Flowlight のインスペクトビュー。復号された Claude Code のリクエストとそのツール呼び出しの一覧、そして paste.example への curl の送信の詳細。実行元となった Bash のツール呼び出しと、リクエスト本文に入った送信済みのメモが表示されています
あのメモはどこへ行った?paste.example への curl の送信を、モデルが要求した Bash コマンドまでたどり、 送られた本文まで示します。
-
Claude Code のツールタブ。Bash、Read と 2 つの MCP ツールが、説明とモデルが呼び出した回数とともに並んでいます
エージェントがモデルに渡すツールのすべて。エージェントはターンごとにツールを宣言するので、Flowlight はそれを全部並べ、 モデルが実際に使ったものと、一度も触らなかったものを示します。
-
Codex の MCP サーバタブ。プロバイダ経由と記された sentry サーバ、その URL、承認は「しない」に設定、許可されたツールと提供するツールが表示されています
回線上では見えないものまで。エージェントがプロバイダ側に MCP サーバへの接続を任せると、その通信は Mac を通りません。 でも依頼そのものは通るので、サーバ、その URL、承認の設定、提供するツールはやはり表示されます。
@@ -459,7 +459,7 @@

監視しなくていい監視ツール

-
Flowlight での Claude Code の詳細。呼び出し回数と 1 件の失敗が付いたツールと MCP サーバ、許可リスト、そしてツール呼び出しタブに、失敗した git push、応答とリクエストを伴う paste.example への curl 送信、npm install、GitHub の issue、ドキュメント検索、ファイル読み取りが、それぞれの結果とともに並んでいます
1 つのエージェント、すべてのツール呼び出し。Claude Code が起動した git や curl、MCP サーバの通信は、Claude Code のものとして数えます。 HTTPS インスペクションをオンにすると、ツール呼び出しタブに、モデルが何を要求し、何が返り、各ツールがどんなリクエストを出したかが並びます。 @@ -469,10 +469,10 @@

監視しなくていい監視ツール

-
履歴ビュー。1 時間ごとの受信と送信の棒グラフ、アプリ・接続先・プロトコルのドーナツグラフが表示されています
履歴。秒から年までのズーム、3 つのグループ化、アプリが数百あっても読めるグラフ。
-
アラートビュー。エージェントの情報流出、メール、FTP、離席中、トラフィック急増のアラートが並んでいます
アラート。どれもアプリ、接続先、きっかけになった数値を示します。
@@ -588,7 +588,7 @@

Mac から何が出ていくのかを知る。

diff --git a/docs/ja/privacy/index.html b/docs/ja/privacy/index.html index 093c3520..64d0cf72 100644 --- a/docs/ja/privacy/index.html +++ b/docs/ja/privacy/index.html @@ -187,7 +187,7 @@

連絡先

diff --git a/docs/ja/threat-model/index.html b/docs/ja/threat-model/index.html index c90a9624..4ecc5abd 100644 --- a/docs/ja/threat-model/index.html +++ b/docs/ja/threat-model/index.html @@ -222,7 +222,7 @@

脆弱性を報告する

diff --git a/docs/ko/about/index.html b/docs/ko/about/index.html index 165970c0..c9a443f2 100644 --- a/docs/ko/about/index.html +++ b/docs/ko/about/index.html @@ -153,7 +153,7 @@

감사

diff --git a/docs/ko/docs/index.html b/docs/ko/docs/index.html index 5bc7a046..97e27060 100644 --- a/docs/ko/docs/index.html +++ b/docs/ko/docs/index.html @@ -76,7 +76,7 @@

문서

Flowlight 사용하기

-

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.17.0, macOS 15 이상.

+

첫 실행부터 에이전트 규칙 조정까지 전부. Flowlight 0.17.1, macOS 15 이상.

diff --git a/docs/ko/index.html b/docs/ko/index.html index 2b4029df..ce89f79d 100644 --- a/docs/ko/index.html +++ b/docs/ko/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

앱이 무엇을 하는지 봅니다.

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+유니버설GPL-3.0텔레메트리 없음

+

v0.17.1macOS 15+유니버설GPL-3.0텔레메트리 없음

@@ -127,7 +127,7 @@

앱이 무엇을 하는지 봅니다.
-
Flowlight의 AI 활동 지도. 에이전트 카드는 귀속된 도구와 구성된 게이트웨이를 거치며, 관측된 magpie에서 Flowlight로의 경로가 LLM 서비스와 도메인으로 분기됩니다. 리본 너비는 기간 내 트래픽 양을 나타냅니다.

실제 AI 경로를 확인하세요. 에이전트, 귀속된 도구, 구성된 게이트웨이, Flowlight가 관측한 프록시 단계와 정확한 목적지를 표시합니다. 리본 너비는 선택한 기간의 수신량과 송신량 합계입니다. 데모 데이터로 표시했습니다.

@@ -135,7 +135,7 @@

앱이 무엇을 하는지 봅니다.
-
Flowlight의 AI 에이전트 뷰. Claude Code, Cursor, Codex, Python 스크립트가 각자의 AI 제공업체, 다른 곳으로 보낸 트래픽, 그리고 SMTP, SSH, FTP, 대용량 업로드, 원시 IP에 대한 위험 배지와 함께 나열되어 있습니다.

AI 에이전트 뷰: 각 에이전트의 모델 제공업체, 그리고 그 밖에 통신한 모든 곳. 데모 데이터로 표시했습니다.

@@ -405,16 +405,16 @@

도구 호출과 네트워크 요청을 잇습니다

검사 대상인 터미널에서 에이전트를 실행하면 에이전트와 그 도구의 지원되는 HTTP 트래픽이 복호화되고, 모델이 요청한 도구 호출과 되돌아간 결과가 함께 보입니다.

-
Flowlight의 검사 뷰: 복호화된 Claude Code 요청과 각 요청의 도구 호출 목록, 그리고 curl이 paste.example로 올린 업로드의 상세 내용. 그 업로드를 실행한 Bash 도구 호출과 요청 본문에 담긴 메모가 함께 보입니다
내 메모는 어디로 갔나? curl이 paste.example로 올린 업로드를, 모델이 요청한 Bash 명령까지 거슬러 올라가 보낸 본문과 함께.
-
Claude Code의 도구 탭: Bash, Read와 MCP 도구 두 개가 설명, 그리고 모델이 각각을 몇 번 호출했는지와 함께 나열되어 있습니다
에이전트가 모델에게 내주는 모든 도구. 에이전트는 매 턴마다 도구를 선언하므로 Flowlight는 그것을 전부 나열하고, 모델이 실제로 쓴 것과 한 번도 건드리지 않은 것을 구분해 보여줍니다.
-
Codex의 MCP 서버 탭: 제공업체 경유로 표시된 sentry 서버, 그 URL, 승인은 사용 안 함, 허용된 도구, 그리고 서버가 제공하는 도구들
회선에서는 보이지 않는 것까지. 에이전트가 제공업체에게 MCP 서버로 연결해 달라고 하면 그 트래픽은 내 Mac을 거치지 않습니다. 하지만 요청은 거치므로 서버와 URL, 승인 설정, 제공하는 도구는 그대로 드러납니다.
@@ -460,7 +460,7 @@

감시하지 않아도 되는 감시 도구

-
Flowlight에 표시된 Claude Code 상세: 호출 횟수와 실패 하나가 붙은 도구와 MCP 서버, 허용 목록, 그리고 실패한 git push, 응답과 요청이 함께 있는 paste.example로의 curl 업로드, npm install, GitHub 이슈, 문서 검색, 파일 읽기가 각각 결과와 함께 나열된 도구 호출 탭
에이전트 하나, 도구 호출 전부. Claude Code가 띄운 git과 curl, MCP 서버의 트래픽은 Claude Code의 것으로 집계됩니다. HTTPS 검사를 켜면 도구 호출 탭에서 모델이 무엇을 요청했고 무엇이 돌아왔으며 각 도구가 어떤 요청을 @@ -470,10 +470,10 @@

감시하지 않아도 되는 감시 도구

-
시간별 수신·송신 막대와 앱, 목적지, 프로토콜 도넛 차트가 있는 기록 뷰
기록. 초에서 연까지의 확대·축소, 세 가지 묶음, 앱이 수백 개여도 읽히는 차트.
-
에이전트 유출, 이메일, FTP, 자리 비움, 트래픽 급증 알림이 나열된 알림 뷰
알림. 하나하나가 앱과 목적지, 그리고 기준을 넘긴 수치를 밝힙니다.
@@ -589,7 +589,7 @@

내 Mac에서 무엇이 나가는지 아세요.

diff --git a/docs/ko/privacy/index.html b/docs/ko/privacy/index.html index 323a8f01..dd2da822 100644 --- a/docs/ko/privacy/index.html +++ b/docs/ko/privacy/index.html @@ -190,7 +190,7 @@

문의

diff --git a/docs/ko/threat-model/index.html b/docs/ko/threat-model/index.html index 959f3cfb..65e301f3 100644 --- a/docs/ko/threat-model/index.html +++ b/docs/ko/threat-model/index.html @@ -221,7 +221,7 @@

취약점 신고하기

diff --git a/docs/llms-full.txt b/docs/llms-full.txt index 2049c74b..6e553fe8 100644 --- a/docs/llms-full.txt +++ b/docs/llms-full.txt @@ -62,7 +62,7 @@ Documentation Using Flowlight - Everything from the first launch to tuning the agent rules. Flowlight 0.17.0, macOS 15 or later. + Everything from the first launch to tuning the agent rules. Flowlight 0.17.1, macOS 15 or later. On this page @@ -920,7 +920,7 @@ Understand your AI agents. brew install --cask xinbetween/tap/flowlightCopy - v0.17.0macOS 15+UniversalGPL-3.0No telemetry + v0.17.1macOS 15+UniversalGPL-3.0No telemetry connectionslive @@ -1663,9 +1663,18 @@ Releases Downloads, checksums and full notes for each version are on GitHub Releases. - 0.17.0 + 0.17.1 November 4, 2026Latest + Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance. + + Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect. + + Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output. + + 0.17.0 +November 4, 2026 + Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned. Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates. diff --git a/docs/llms.txt b/docs/llms.txt index 9f1e1d07..86251b79 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -1,6 +1,6 @@ # Flowlight -> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.17.0. +> Free, open-source (GPL-3.0) application-aware network monitor for macOS, with focused visibility into AI agents. It attributes observed TCP and UDP activity to the application that made it and records the destination, protocol and byte counts, keeping local history from second to year. Recognized AI agents are listed by name along with the tools and MCP servers they start, under per-agent allowlists. It can also refuse, once asked: a rule blocks an application, a destination or a URL for as long as you specify, and a guardrail withholds a tool from an agent before its model is offered it. Runs on macOS 15 or later; capture is by a sampler or a Network Extension. Current version: 0.17.1. - [Download Flowlight.dmg](https://github.com/xinbetween/flowlight/releases/latest/download/Flowlight.dmg) - [Source code](https://github.com/xinbetween/flowlight) diff --git a/docs/plugins/index.html b/docs/plugins/index.html index c00ebdbf..6f00fda9 100644 --- a/docs/plugins/index.html +++ b/docs/plugins/index.html @@ -212,7 +212,7 @@

Review checklist

diff --git a/docs/privacy/index.html b/docs/privacy/index.html index dc37d387..95b5aa02 100644 --- a/docs/privacy/index.html +++ b/docs/privacy/index.html @@ -196,7 +196,7 @@

Contact

diff --git a/docs/pt-PT/about/index.html b/docs/pt-PT/about/index.html index 4714b9a2..fb93fc5a 100644 --- a/docs/pt-PT/about/index.html +++ b/docs/pt-PT/about/index.html @@ -152,7 +152,7 @@

Agradecimentos

diff --git a/docs/pt-PT/docs/index.html b/docs/pt-PT/docs/index.html index 2b99888f..7e8e0b4d 100644 --- a/docs/pt-PT/docs/index.html +++ b/docs/pt-PT/docs/index.html @@ -76,7 +76,7 @@

Documentação

Usar o Flowlight

-

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.17.0, macOS 15 ou posterior.

+

Tudo, da primeira abertura ao ajuste das regras dos agentes. Flowlight 0.17.1, macOS 15 ou posterior.

diff --git a/docs/pt-PT/index.html b/docs/pt-PT/index.html index 20041564..4a893d57 100644 --- a/docs/pt-PT/index.html +++ b/docs/pt-PT/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

Veja a atividade de rede das suas apps.

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+UniversalGPL-3.0Sem telemetria

+

v0.17.1macOS 15+UniversalGPL-3.0Sem telemetria

@@ -127,7 +127,7 @@

Veja a atividade de rede das suas apps.
-
O mapa de atividade de IA do Flowlight. Os cartões de agentes passam por ferramentas atribuídas e gateways configurados; a rota observada do magpie para o Flowlight ramifica-se depois para serviços LLM e domínios. A largura das faixas mostra o tráfego do período.

Veja a rota de IA real: agentes, ferramentas atribuídas, gateways configurados, a etapa de proxy observada pelo Flowlight e destinos exatos. A largura mostra o total recebido e enviado no período selecionado. Com dados de demonstração.

@@ -135,7 +135,7 @@

Veja a atividade de rede das suas apps.
-
A vista Agentes de IA do Flowlight. O Claude Code, o Cursor, o Codex e um script de Python aparecem com os respetivos fornecedores de IA, o tráfego enviado para outros sítios e indicadores de risco para SMTP, SSH, FTP, um envio grande e um IP direto.

A vista Agentes de IA: o fornecedor do modelo de cada agente e tudo o mais com que falou. Mostrada com dados de demonstração.

@@ -405,16 +405,16 @@

Relacione as chamadas de ferramentas suportadas com os pedidos de rede

seu Mac. Inicie um agente a partir de um Terminal inspecionado e o tráfego HTTP suportado do agente e das suas ferramentas é desencriptado, com as chamadas de ferramentas que o modelo pediu e os resultados que voltaram.

-
A vista Inspecionar do Flowlight: uma lista de pedidos desencriptados do Claude Code com as respetivas chamadas de ferramentas e o detalhe do envio do curl para paste.example, feito pela chamada da ferramenta Bash que o executou, com as notas enviadas no corpo do pedido
Para onde foram as minhas notas? O envio do curl para paste.example, seguido até ao comando Bash que o modelo pediu, com o corpo que enviou.
-
O separador Ferramentas do Claude Code: Bash, Read e duas ferramentas MCP com descrições e a frequência com que o modelo chamou cada uma
Todas as ferramentas que um agente oferece ao modelo. Os agentes declaram as suas ferramentas em cada turno, por isso o Flowlight lista-as todas, com as que o modelo usou de facto e as que nunca tocou.
-
O separador Servidores MCP do Codex: um servidor sentry marcado como via fornecedor, o seu URL, a aprovação definida como nunca, as ferramentas permitidas e as ferramentas que oferece
Incluindo as que não se veem na rede. Quando um agente pede ao fornecedor que se ligue a um servidor MCP, esse tráfego nunca passa pelo seu Mac. O pedido passa, por isso o servidor, o seu URL, a sua definição de aprovação e as suas ferramentas aparecem mesmo assim.
@@ -460,7 +460,7 @@

Um monitor que não tem de monitorizar

-
O detalhe do Claude Code no Flowlight: ferramentas e servidores MCP com contagens de chamadas e uma falha, uma lista de permissões e o separador Chamadas de ferramentas com um git push falhado, um envio do curl para paste.example com a resposta e o pedido, um npm install, um problema no GitHub, uma pesquisa na documentação e uma leitura de ficheiro, cada um com o seu resultado
Um agente, todas as chamadas de ferramentas. O tráfego do git, do curl e dos servidores MCP que o Claude Code iniciou conta como tráfego do Claude Code. Com a inspeção HTTPS ativada, o separador Chamadas de ferramentas mostra o que o modelo pediu, o que voltou e os pedidos que cada ferramenta fez: @@ -470,10 +470,10 @@

Um monitor que não tem de monitorizar

-
A vista Histórico com barras horárias de dados recebidos e enviados e gráficos circulares de apps, destinos e protocolos
Histórico. Zoom do segundo ao ano, três agrupamentos, gráficos que continuam legíveis com centenas de apps.
-
A vista Alertas a listar alertas de exfiltração por um agente, de e-mail, de FTP, de atividade durante a ausência e de picos de tráfego
Alertas. Cada um nomeia a app, o destino e o número que o disparou.
@@ -589,7 +589,7 @@

Saiba o que sai do seu Mac.

diff --git a/docs/pt-PT/privacy/index.html b/docs/pt-PT/privacy/index.html index 6e966963..35de0946 100644 --- a/docs/pt-PT/privacy/index.html +++ b/docs/pt-PT/privacy/index.html @@ -189,7 +189,7 @@

Contacto

diff --git a/docs/pt-PT/threat-model/index.html b/docs/pt-PT/threat-model/index.html index 494fdc2f..2833bbb9 100644 --- a/docs/pt-PT/threat-model/index.html +++ b/docs/pt-PT/threat-model/index.html @@ -222,7 +222,7 @@

Comunicar uma vulnerabilidade

diff --git a/docs/releases/index.html b/docs/releases/index.html index f1070bec..78a6061b 100644 --- a/docs/releases/index.html +++ b/docs/releases/index.html @@ -61,7 +61,16 @@

What's new

-

0.17.0

Latest
+

0.17.1

Latest
+
    +
  • Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance.
  • +
  • Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect.
  • +
  • Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output.
  • +
+
+ +
+

0.17.0

  • Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned.
  • Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates.
  • @@ -1562,7 +1571,7 @@

    What's new

diff --git a/docs/threat-model/index.html b/docs/threat-model/index.html index 35cd3598..36805d5e 100644 --- a/docs/threat-model/index.html +++ b/docs/threat-model/index.html @@ -231,7 +231,7 @@

Reporting a vulnerability

diff --git a/docs/zh-Hans/about/index.html b/docs/zh-Hans/about/index.html index 605c9e26..374b11d0 100644 --- a/docs/zh-Hans/about/index.html +++ b/docs/zh-Hans/about/index.html @@ -152,7 +152,7 @@

致谢

diff --git a/docs/zh-Hans/docs/index.html b/docs/zh-Hans/docs/index.html index 579595b0..88311d67 100644 --- a/docs/zh-Hans/docs/index.html +++ b/docs/zh-Hans/docs/index.html @@ -76,7 +76,7 @@

文档

使用 Flowlight

-

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.17.0,macOS 15 或更高版本。

+

从第一次启动到调整代理规则,需要的都在这里。Flowlight 0.17.1,macOS 15 或更高版本。

diff --git a/docs/zh-Hans/index.html b/docs/zh-Hans/index.html index b3febe60..7cf2009b 100644 --- a/docs/zh-Hans/index.html +++ b/docs/zh-Hans/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

看清应用的网络活动。

brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+通用架构GPL-3.0无遥测

+

v0.17.1macOS 15+通用架构GPL-3.0无遥测

@@ -127,7 +127,7 @@

看清应用的网络活动。
-
Flowlight 的 AI 活动图。代理卡片经过已归属工具和已配置网关;观测到的 magpie 到 Flowlight 路由随后分支至 LLM 服务和域名。带状线宽度表示所选时段的流量。

查看真实 AI 路由:代理、已归属工具、已配置网关、Flowlight 观测到的代理阶段和精确目标。带状线宽度表示所选时段接收与发送流量的总和。图中为演示数据。

@@ -135,7 +135,7 @@

看清应用的网络活动。
-
Flowlight 的 AI 代理视图。Claude Code、Cursor、Codex 和一个 Python 脚本逐行列出,显示各自的 AI 提供方、发往别处的流量,以及 SMTP、SSH、FTP、大量上传和裸 IP 的风险标记。

AI 代理视图:每个代理的模型提供方,以及它联系过的其他一切。图中为演示数据。

@@ -402,16 +402,16 @@

把受支持的工具调用与网络请求对上

默认关闭。打开后,Flowlight 会成为一个本地代理,使用在你 Mac 上生成的专属证书颁发机构。 从受检查的终端启动代理,代理及其工具的受支持 HTTP 流量就会被解密,并附上模型请求的工具调用和返回的结果。

-
Flowlight 的检查视图:一列已解密的 Claude Code 请求及其工具调用,以及 curl 向 paste.example 上传的详情——由运行它的那次 Bash 工具调用发起,请求体里正是上传的笔记
我的笔记去哪了?curl 向 paste.example 的上传,一路追到模型要求执行的那条 Bash 命令, 连它发出的请求体一起。
-
Claude Code 的工具标签页:Bash、Read 和两个 MCP 工具,附带说明以及模型各自调用了多少次
代理提供给模型的每一个工具。代理每一轮都会声明自己的工具,所以 Flowlight 把它们全部列出, 并区分模型真正用过的和从未碰过的。
-
Codex 的 MCP 服务器标签页:一个标为“经由提供方”的 sentry 服务器,以及它的 URL、设为“从不”的审批、允许的工具和它提供的工具
连线路上看不到的那些也算。当代理请求提供方去连接某个 MCP 服务器时,那段流量根本不会经过你的 Mac。 但它的请求会,所以这个服务器、它的 URL、它的审批设置和它的工具依然会出现。
@@ -457,7 +457,7 @@

一个不用你盯着的监控工具

-
Flowlight 里 Claude Code 的详情:带调用次数和一次失败的工具与 MCP 服务器、一个允许列表,以及工具调用标签页,里面列出一次失败的 git push、一次 curl 向 paste.example 的上传及其响应和请求、npm install、一个 GitHub issue、一次文档搜索和一次文件读取,每项都带结果
一个代理,每一次工具调用。Claude Code 启动的 git、curl 和 MCP 服务器产生的流量都算作 Claude Code 的。 打开 HTTPS 检查后,工具调用标签页会显示模型要求了什么、返回了什么,以及每个工具发出的请求: @@ -467,10 +467,10 @@

一个不用你盯着的监控工具

-
历史视图,含每小时接收与发送的柱状图,以及应用、目标和协议的环形图
历史。从秒到年的缩放、三种分组方式,几百个应用也读得清的图表。
-
警报视图,列出代理外泄、邮件、FTP、你离开时活动和流量突增等警报
警报。每一条都点明应用、目标和触发它的那个数字。
@@ -586,7 +586,7 @@

知道什么离开了你的 Mac。

diff --git a/docs/zh-Hans/privacy/index.html b/docs/zh-Hans/privacy/index.html index 0dea651d..4b56be4f 100644 --- a/docs/zh-Hans/privacy/index.html +++ b/docs/zh-Hans/privacy/index.html @@ -187,7 +187,7 @@

联系方式

diff --git a/docs/zh-Hans/threat-model/index.html b/docs/zh-Hans/threat-model/index.html index 1c112674..3f0a5e1c 100644 --- a/docs/zh-Hans/threat-model/index.html +++ b/docs/zh-Hans/threat-model/index.html @@ -210,7 +210,7 @@

报告漏洞

diff --git a/docs/zh-Hant/about/index.html b/docs/zh-Hant/about/index.html index d5ddcdd3..73bbfd0c 100644 --- a/docs/zh-Hant/about/index.html +++ b/docs/zh-Hant/about/index.html @@ -152,7 +152,7 @@

致謝

diff --git a/docs/zh-Hant/docs/index.html b/docs/zh-Hant/docs/index.html index b0a98257..389ff316 100644 --- a/docs/zh-Hant/docs/index.html +++ b/docs/zh-Hant/docs/index.html @@ -76,7 +76,7 @@

說明文件

使用 Flowlight

-

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.17.0,macOS 15 或以上版本。

+

從第一次啟動到調整代理規則,全都在這裡。Flowlight 0.17.1,macOS 15 或以上版本。

diff --git a/docs/zh-Hant/index.html b/docs/zh-Hant/index.html index 510becf8..61c6746c 100644 --- a/docs/zh-Hant/index.html +++ b/docs/zh-Hant/index.html @@ -48,7 +48,7 @@ - + @@ -97,7 +97,7 @@

看見每個 App 的網路活動。
brew install --cask xinbetween/tap/flowlight

-

v0.17.0macOS 15+通用架構GPL-3.0無遙測

+

v0.17.1macOS 15+通用架構GPL-3.0無遙測

@@ -127,7 +127,7 @@

看見每個 App 的網路活動。
-
Flowlight 的 AI 活動圖。代理卡片經過已歸屬工具和已設定閘道;觀測到的 magpie 至 Flowlight 路由隨後分支至 LLM 服務和網域。帶狀線寬度表示所選時段的流量。

查看真實 AI 路由:代理、已歸屬工具、已設定閘道、Flowlight 觀測到的代理階段和精確目的地。帶狀線寬度表示所選時段接收與傳送流量的總和。圖中為示範資料。

@@ -135,7 +135,7 @@

看見每個 App 的網路活動。
-
Flowlight 的「AI 代理」畫面。Claude Code、Cursor、Codex 和一個 Python 指令碼列在其中,顯示各自的 AI 供應商、傳往其他地方的流量,以及 SMTP、SSH、FTP、大量上傳和裸 IP 的風險標記。

「AI 代理」畫面:每個代理的模型供應商,以及它連線過的其他所有目標。圖中為示範資料。

@@ -403,16 +403,16 @@

把支援的工具呼叫和網路請求對起來

單位。從受檢查的「終端機」啟動代理,它和它的工具所產生的支援 HTTP 流量就會被解密,連同模型要求的 工具呼叫和回傳的結果。

-
Flowlight 的「檢查」畫面:一份解密後的 Claude Code 請求列表及其工具呼叫,以及 curl 上傳到 paste.example 的詳細內容 — 那次上傳由執行它的 Bash 工具呼叫發出,請求內文中還有上傳的筆記
我的筆記去哪了? curl 上傳到 paste.example,追溯到模型要求執行的 Bash 指令,連同它 送出的內文。
-
Claude Code 的「工具」標籤頁:Bash、Read 和兩個 MCP 工具,附上說明以及模型各呼叫了幾次
代理提供給模型的每一個工具。 代理每一輪都會宣告自己的工具,所以 Flowlight 會全部列出來,包含模型 真正用過的,以及完全沒碰過的。
-
Codex 的「MCP 伺服器」標籤頁:一個標示為「透過供應商」的 sentry 伺服器,包含它的 URL、設為永不核准的核准設定、允許的工具,以及它提供的工具
連你在線路上看不到的也算。 當代理請供應商去連接某個 MCP 伺服器,那段流量 根本不會經過你的 Mac。但代理的請求會,所以那個伺服器、它的 URL、它的核准設定和它的工具仍然會出現。
@@ -458,7 +458,7 @@

一個不用你盯著的監控工具

-
Flowlight 中 Claude Code 的詳細資料:工具與 MCP 伺服器及其呼叫次數和一次失敗、一份允許清單,以及「工具呼叫」標籤頁 — 其中列出一次失敗的 git push、一次 curl 上傳到 paste.example 及其回應與請求、npm install、一個 GitHub issue、一次說明文件搜尋和一次檔案讀取,每一項都附上結果
一個代理,每一次工具呼叫。 Claude Code 啟動的 git、curl 和 MCP 伺服器所產生的流量,都算成 Claude Code 的。 開啟 HTTPS 檢查後,工具呼叫標籤頁會顯示模型要求了什麼、回來了什麼,以及各個工具發出的請求: @@ -468,10 +468,10 @@

一個不用你盯著的監控工具

-
「歷史」畫面:每小時接收與傳送的長條圖,以及 App、目標和協定的環圈圖
歷史。 從秒到年的縮放、三種分組方式,即使有上百個 App,圖表依然看得清楚。
-
「警示」畫面:列出代理資料外洩、郵件、FTP、離開期間活動和流量尖峰等警示
警示。 每一則都指出 App、目標,以及觸發它的那個數字。
@@ -587,7 +587,7 @@

知道有什麼離開了你的 Mac。

diff --git a/docs/zh-Hant/privacy/index.html b/docs/zh-Hant/privacy/index.html index 3b481a49..b2a0280b 100644 --- a/docs/zh-Hant/privacy/index.html +++ b/docs/zh-Hant/privacy/index.html @@ -187,7 +187,7 @@

聯絡

diff --git a/docs/zh-Hant/threat-model/index.html b/docs/zh-Hant/threat-model/index.html index 94e79768..76bfdadb 100644 --- a/docs/zh-Hant/threat-model/index.html +++ b/docs/zh-Hant/threat-model/index.html @@ -211,7 +211,7 @@

回報漏洞

diff --git a/packaging/app-store/screenshots/README.md b/packaging/app-store/screenshots/README.md new file mode 100644 index 00000000..35453cb8 --- /dev/null +++ b/packaging/app-store/screenshots/README.md @@ -0,0 +1,20 @@ +# Mac App Store screenshots + +These images are the reviewable source of truth for the Flowlight Mac App Store listing. They are captured from the exact App Store product—not the Developer ID product—using synthetic demo data only. + +Build the Store product, then run: + +```sh +FL_APP=/absolute/path/to/Flowlight.app scripts/app-store-screenshots.sh +``` + +The capture gate requires: + +- the bundle to contain the embedded Store extension and no Developer ID system extension; +- the app version and build number to match `project.yml`; +- the requested screen title to match before capture; +- `demo.sqlite*` to be the only traffic database opened by the candidate; +- every retained image to be exactly 2880×1800 pixels; +- English and light appearance for a consistent US storefront set. + +Upload the numbered files in `macos/` in filename order. The Store set uses Rules in place of Inspect because the Store product deliberately omits HTTPS inspection. Replace the complete existing App Store Connect screenshot set together; do not mix images from different builds or menu vocabularies. diff --git a/packaging/app-store/screenshots/macos/01-connections.png b/packaging/app-store/screenshots/macos/01-connections.png new file mode 100644 index 00000000..e63fbf7b Binary files /dev/null and b/packaging/app-store/screenshots/macos/01-connections.png differ diff --git a/packaging/app-store/screenshots/macos/02-ai-agents.png b/packaging/app-store/screenshots/macos/02-ai-agents.png new file mode 100644 index 00000000..d66b43f6 Binary files /dev/null and b/packaging/app-store/screenshots/macos/02-ai-agents.png differ diff --git a/packaging/app-store/screenshots/macos/03-history.png b/packaging/app-store/screenshots/macos/03-history.png new file mode 100644 index 00000000..5f327a70 Binary files /dev/null and b/packaging/app-store/screenshots/macos/03-history.png differ diff --git a/packaging/app-store/screenshots/macos/04-rules.png b/packaging/app-store/screenshots/macos/04-rules.png new file mode 100644 index 00000000..76a88ea3 Binary files /dev/null and b/packaging/app-store/screenshots/macos/04-rules.png differ diff --git a/packaging/app-store/screenshots/macos/05-live.png b/packaging/app-store/screenshots/macos/05-live.png new file mode 100644 index 00000000..150c58e1 Binary files /dev/null and b/packaging/app-store/screenshots/macos/05-live.png differ diff --git a/packaging/app-store/screenshots/macos/06-alerts.png b/packaging/app-store/screenshots/macos/06-alerts.png new file mode 100644 index 00000000..fb729e4c Binary files /dev/null and b/packaging/app-store/screenshots/macos/06-alerts.png differ diff --git a/packaging/app-store/screenshots/macos/07-agent-detail.png b/packaging/app-store/screenshots/macos/07-agent-detail.png new file mode 100644 index 00000000..1abc4226 Binary files /dev/null and b/packaging/app-store/screenshots/macos/07-agent-detail.png differ diff --git a/packaging/app-store/screenshots/macos/08-agent-tools.png b/packaging/app-store/screenshots/macos/08-agent-tools.png new file mode 100644 index 00000000..c034c414 Binary files /dev/null and b/packaging/app-store/screenshots/macos/08-agent-tools.png differ diff --git a/packaging/app-store/screenshots/macos/09-mcp-servers.png b/packaging/app-store/screenshots/macos/09-mcp-servers.png new file mode 100644 index 00000000..6f10360f Binary files /dev/null and b/packaging/app-store/screenshots/macos/09-mcp-servers.png differ diff --git a/packaging/app-store/screenshots/macos/manifest.json b/packaging/app-store/screenshots/macos/manifest.json new file mode 100644 index 00000000..34ee9c67 --- /dev/null +++ b/packaging/app-store/screenshots/macos/manifest.json @@ -0,0 +1,59 @@ +{ + "schema": 1, + "screenshots": { + "01-connections.png": { + "height": 1800, + "sha256": "b8c2265f4935d8b7cbf4d1cded01920b46cddd1b49bca7cab3b63a3900cf8b00", + "version": "0.17.1", + "width": 2880 + }, + "02-ai-agents.png": { + "height": 1800, + "sha256": "c4bef89303043f2711071a3d23f6de6a4777ed0ee67dbfbcdf473bcbdea5db8f", + "version": "0.17.1", + "width": 2880 + }, + "03-history.png": { + "height": 1800, + "sha256": "91358f6f4dbb919e939ef47feaf24bdd6eb055dddf044873a15fab780099c98c", + "version": "0.17.1", + "width": 2880 + }, + "04-rules.png": { + "height": 1800, + "sha256": "1b7968afe707fd16ce6109a089e7630a1a744c43e4976bc2d15622964c26d669", + "version": "0.17.1", + "width": 2880 + }, + "05-live.png": { + "height": 1800, + "sha256": "a22fb51ab087f96d15e71c07af1cbe931e26b17b168e16071144b138d63438ea", + "version": "0.17.1", + "width": 2880 + }, + "06-alerts.png": { + "height": 1800, + "sha256": "0e606b9df9be6bc761b3690954400c17165b3e71d3c0e7d725e1602ba8c2eca6", + "version": "0.17.1", + "width": 2880 + }, + "07-agent-detail.png": { + "height": 1800, + "sha256": "51a083b23cfed1770f8c5d0f217d115a3fe2a226002f8562ce78d099c1998824", + "version": "0.17.1", + "width": 2880 + }, + "08-agent-tools.png": { + "height": 1800, + "sha256": "7c1829d409a867eb36f272ef8bf09402bc09bc537b2ddf865970dfd81304354f", + "version": "0.17.1", + "width": 2880 + }, + "09-mcp-servers.png": { + "height": 1800, + "sha256": "e2bbb4fdf6a2d4f782c4b2d3c70c55ed810f56f94539d89ff9e6c31559e6917d", + "version": "0.17.1", + "width": 2880 + } + } +} diff --git a/project.yml b/project.yml index 53a35adf..aaa1644c 100644 --- a/project.yml +++ b/project.yml @@ -15,8 +15,8 @@ settings: DEVELOPMENT_TEAM: "" CODE_SIGN_STYLE: Automatic ENABLE_HARDENED_RUNTIME: YES - MARKETING_VERSION: "0.17.0" - CURRENT_PROJECT_VERSION: "74" + MARKETING_VERSION: "0.17.1" + CURRENT_PROJECT_VERSION: "75" configs: AppStore: DEVELOPMENT_TEAM: 38RJUJHKZS diff --git a/scripts/app-store-screenshots.sh b/scripts/app-store-screenshots.sh new file mode 100755 index 00000000..b41bca68 --- /dev/null +++ b/scripts/app-store-screenshots.sh @@ -0,0 +1,51 @@ +#!/bin/zsh +# Captures the complete Mac App Store screenshot set from an exact Flowlight Store build. +# FL_APP must point to the reviewed Store product. The shared capture script verifies version, +# screen title, demo-only database use, and exact 2880x1800 output before anything is retained. +set -euo pipefail +cd "$(dirname "$0")/.." + +: "${FL_APP:?Set FL_APP to the exact Flowlight App Store build.}" +STORE_EXTENSION="$FL_APP/Contents/PlugIns/com.flowlight.app.filter.appex" +[ -d "$STORE_EXTENSION" ] || { + echo "$FL_APP is not the App Store product: embedded Store extension is missing." + exit 1 +} +[ ! -e "$FL_APP/Contents/Library/SystemExtensions/com.flowlight.app.filter.systemextension" ] || { + echo "$FL_APP is the Developer ID product, not the App Store product." + exit 1 +} + +OUT="packaging/app-store/screenshots/macos" +TEMP=$(mktemp -d /private/tmp/flowlight-app-store-screenshots.XXXXXX) +cleanup() { + for image in "$TEMP"/*.png(N); do rm "$image"; done + rmdir "$TEMP" 2>/dev/null || true +} +trap cleanup EXIT + +FL_OUT="$TEMP" \ +FL_ONLY="visualize,agents,reports,rules,live,alerts,agent-detail,agent-tools,mcp-servers" \ +FL_FORCE_SIZE="1440x900" \ +FL_EXPECT_PIXELS="2880x1800" \ +FL_WAIT="${FL_STORE_WAIT:-20}" \ +FL_SKIP_MANIFEST="YES" \ +scripts/screenshots.sh + +mkdir -p "$OUT" +cp "$TEMP/visualize.png" "$OUT/01-connections.png" +cp "$TEMP/agents.png" "$OUT/02-ai-agents.png" +cp "$TEMP/reports.png" "$OUT/03-history.png" +cp "$TEMP/rules.png" "$OUT/04-rules.png" +cp "$TEMP/live.png" "$OUT/05-live.png" +cp "$TEMP/alerts.png" "$OUT/06-alerts.png" +cp "$TEMP/agent-detail.png" "$OUT/07-agent-detail.png" +cp "$TEMP/agent-tools.png" "$OUT/08-agent-tools.png" +cp "$TEMP/mcp-servers.png" "$OUT/09-mcp-servers.png" + +VERSION=$(defaults read "$FL_APP/Contents/Info.plist" CFBundleShortVersionString) +python3 scripts/screenshot_manifest.py --directory "$OUT" --version "$VERSION" --replace \ + 01-connections.png 02-ai-agents.png 03-history.png 04-rules.png 05-live.png \ + 06-alerts.png 07-agent-detail.png 08-agent-tools.png 09-mcp-servers.png + +echo "Wrote 9 Mac App Store screenshots to $OUT" diff --git a/scripts/check_site.py b/scripts/check_site.py index db83aa56..b4012f85 100644 --- a/scripts/check_site.py +++ b/scripts/check_site.py @@ -8,7 +8,7 @@ python3 scripts/check_site.py # after scripts/build_site.py """ -import re, sys, pathlib, collections, json, subprocess, time +import re, sys, pathlib, collections, hashlib, json, subprocess, time ROOT = pathlib.Path(__file__).resolve().parent.parent OUT = ROOT / "docs" @@ -312,11 +312,82 @@ def entries(text): referenced.add(name) if not (shots / name).exists(): found.append(f"{page.relative_to(ROOT)}: screenshot {name} does not exist") - for shot in sorted(shots.glob("*.png")): + screenshot_files = sorted(shots.glob("*.png")) + for shot in screenshot_files: if shot.name not in referenced: found.append(f"{shot.relative_to(ROOT)}: no page shows this screenshot") - # 11. A declared size that isn't the image's size. The width and height are there to reserve the space + # 11. Every screenshot records the app version, exact bytes and dimensions from its own capture. A selective + # refresh must not bless untouched images: each entry advances only when that image is actually recaptured. + manifest_path = shots / "manifest.json" + try: + manifest = json.loads(manifest_path.read_text()) + entries = manifest["screenshots"] if manifest.get("schema") == 1 else None + if not isinstance(entries, dict): + raise ValueError("unsupported shape") + except (OSError, ValueError, KeyError, json.JSONDecodeError) as error: + found.append(f"{manifest_path.relative_to(ROOT)}: unreadable screenshot manifest ({error})") + entries = {} + names = {shot.name for shot in screenshot_files} + if set(entries) != names: + missing = sorted(names - set(entries)) + extra = sorted(set(entries) - names) + found.append(f"{manifest_path.relative_to(ROOT)}: screenshot entries differ; missing={missing}, extra={extra}") + for shot in screenshot_files: + entry = entries.get(shot.name) + if not isinstance(entry, dict): + continue + raw = shot.read_bytes() + real = (int.from_bytes(raw[16:20], "big"), int.from_bytes(raw[20:24], "big")) + if entry.get("version") != APP_VERSION: + found.append(f"{shot.relative_to(ROOT)}: captured for {entry.get('version')}, app is {APP_VERSION}") + if entry.get("sha256") != hashlib.sha256(raw).hexdigest(): + found.append(f"{shot.relative_to(ROOT)}: bytes differ from the screenshot manifest") + if (entry.get("width"), entry.get("height")) != real: + found.append(f"{shot.relative_to(ROOT)}: dimensions differ from the screenshot manifest") + + # The Store set is a release artifact too. Keep its complete upload order, source build, bytes, and required + # 2880x1800 dimensions reviewable so App Store Connect cannot silently retain a mixed-version screenshot. + store_shots = ROOT / "packaging/app-store/screenshots/macos" + expected_store_names = { + "01-connections.png", "02-ai-agents.png", "03-history.png", "04-rules.png", "05-live.png", + "06-alerts.png", "07-agent-detail.png", "08-agent-tools.png", "09-mcp-servers.png", + } + store_files = sorted(store_shots.glob("*.png")) + store_names = {shot.name for shot in store_files} + if store_names != expected_store_names: + found.append(f"{store_shots.relative_to(ROOT)}: Store screenshots differ; " + f"missing={sorted(expected_store_names - store_names)}, " + f"extra={sorted(store_names - expected_store_names)}") + store_manifest_path = store_shots / "manifest.json" + try: + store_manifest = json.loads(store_manifest_path.read_text()) + store_entries = store_manifest["screenshots"] if store_manifest.get("schema") == 1 else None + if not isinstance(store_entries, dict): + raise ValueError("unsupported shape") + except (OSError, ValueError, KeyError, json.JSONDecodeError) as error: + found.append(f"{store_manifest_path.relative_to(ROOT)}: unreadable screenshot manifest ({error})") + store_entries = {} + if set(store_entries) != expected_store_names: + found.append(f"{store_manifest_path.relative_to(ROOT)}: Store manifest entries differ; " + f"missing={sorted(expected_store_names - set(store_entries))}, " + f"extra={sorted(set(store_entries) - expected_store_names)}") + for shot in store_files: + entry = store_entries.get(shot.name) + if not isinstance(entry, dict): + continue + raw = shot.read_bytes() + real = (int.from_bytes(raw[16:20], "big"), int.from_bytes(raw[20:24], "big")) + if entry.get("version") != APP_VERSION: + found.append(f"{shot.relative_to(ROOT)}: captured for {entry.get('version')}, app is {APP_VERSION}") + if entry.get("sha256") != hashlib.sha256(raw).hexdigest(): + found.append(f"{shot.relative_to(ROOT)}: bytes differ from the screenshot manifest") + if (entry.get("width"), entry.get("height")) != real: + found.append(f"{shot.relative_to(ROOT)}: dimensions differ from the screenshot manifest") + if real != (2880, 1800): + found.append(f"{shot.relative_to(ROOT)}: Store screenshot is {real[0]}x{real[1]}, expected 2880x1800") + + # 12. A declared size that isn't the image's size. The width and height are there to reserve the space # before the image loads; a re-capture at a different aspect ratio makes them a lie and the page jumps. for page in PAGES: for src, attrs in IMG.findall(page.read_text()): diff --git a/scripts/screenshot_manifest.py b/scripts/screenshot_manifest.py new file mode 100644 index 00000000..8ea0e92d --- /dev/null +++ b/scripts/screenshot_manifest.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Record deterministic screenshot provenance for website and App Store assets.""" + +import argparse +import hashlib +import json +import pathlib +import struct + + +def png_size(path: pathlib.Path) -> tuple[int, int]: + header = path.read_bytes()[:24] + if len(header) != 24 or header[:8] != b"\x89PNG\r\n\x1a\n" or header[12:16] != b"IHDR": + raise ValueError(f"{path} is not a PNG with an IHDR header") + return struct.unpack(">II", header[16:24]) + + +def load_entries(path: pathlib.Path) -> dict[str, dict]: + if not path.exists(): + return {} + document = json.loads(path.read_text()) + if document.get("schema") != 1 or not isinstance(document.get("screenshots"), dict): + raise ValueError(f"{path} has an unsupported screenshot manifest shape") + return document["screenshots"] + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--directory", type=pathlib.Path, required=True) + parser.add_argument("--version", required=True) + parser.add_argument("--replace", action="store_true") + parser.add_argument("files", nargs="+") + args = parser.parse_args() + + manifest = args.directory / "manifest.json" + entries = {} if args.replace else load_entries(manifest) + for name in args.files: + if pathlib.Path(name).name != name or not name.endswith(".png"): + raise ValueError(f"unsafe screenshot name: {name}") + image = args.directory / name + data = image.read_bytes() + width, height = png_size(image) + entries[name] = { + "version": args.version, + "sha256": hashlib.sha256(data).hexdigest(), + "width": width, + "height": height, + } + + document = {"schema": 1, "screenshots": dict(sorted(entries.items()))} + temporary = manifest.with_suffix(".json.tmp") + temporary.write_text(json.dumps(document, indent=2, sort_keys=True) + "\n") + temporary.replace(manifest) + print(f"Recorded {len(args.files)} screenshot(s) for Flowlight {args.version} in {manifest}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/screenshots.sh b/scripts/screenshots.sh index 89fe5568..49a70c7b 100755 --- a/scripts/screenshots.sh +++ b/scripts/screenshots.sh @@ -1,15 +1,17 @@ #!/bin/zsh -# Regenerates the marketing screenshots in docs/assets/screenshots/. +# Regenerates the marketing screenshots in docs/assets/screenshots/, or another FL_OUT directory. # # Every shot is taken from demo data (-FLDemo YES), which lives in its own database, so nothing real is ever # published. The screen and the window size come from launch arguments rather than synthetic keystrokes: a # keystroke goes to whichever window is frontmost, which is somebody else's window often enough to matter. +# Set FL_FORCE_SIZE and FL_EXPECT_PIXELS together for a uniform App Store-ready set. set -euo pipefail cd "$(dirname "$0")/.." -OUT="docs/assets/screenshots" +OUT="${FL_OUT:-docs/assets/screenshots}" SIZE="${FL_SIZE:-1600x1075}" WANT=$(sed -n 's/.*MARKETING_VERSION: "\(.*\)"/\1/p' project.yml) +WANT_BUILD=$(sed -n 's/.*CURRENT_PROJECT_VERSION: "\(.*\)"/\1/p' project.yml) # Ask xcodebuild where it actually put the app. A hard-coded build/ path is how these screenshots were once # taken from a months-old bundle: it existed, it launched, and nothing said it was the wrong version. @@ -22,8 +24,13 @@ fi [ -d "$APP" ] || { echo "No app at $APP — build Release first."; exit 1; } GOT=$(defaults read "$APP/Contents/Info.plist" CFBundleShortVersionString) +GOT_BUILD=$(defaults read "$APP/Contents/Info.plist" CFBundleVersion) [ "$GOT" = "$WANT" ] || { echo "$APP is $GOT, project.yml says $WANT — build Release first."; exit 1; } -echo "Shooting Flowlight $GOT from $APP" +[ "$GOT_BUILD" = "$WANT_BUILD" ] || { + echo "$APP is build $GOT_BUILD, project.yml says $WANT_BUILD — build Release first." + exit 1 +} +echo "Shooting Flowlight $GOT ($GOT_BUILD) from $APP" mkdir -p "$OUT" # name:screen:agent-tab:height — a couple of shots are taller or shorter than the default. @@ -39,6 +46,11 @@ SHOTS=( "inspect:inspect::" "visualize:visualize::1600x994" ) +# Rules is Store-capable but not one of the website's ten published assets. Add it only when an explicit capture set +# asks for it, keeping the default website inventory and its all-images manifest stable. +if [ -n "${FL_ONLY:-}" ] && [[ ",${FL_ONLY}," == *",rules,"* ]]; then + SHOTS+=("rules:rules::") +fi exact_app_pids() { local expected="$1" pid command @@ -65,12 +77,24 @@ expected_window_title() { agents) print -r -- "AI Agents" ;; reports) print -r -- "History" ;; alerts) print -r -- "Alerts" ;; + rules) print -r -- "Rules" ;; inspect) print -r -- "Inspect" ;; visualize) print -r -- "Connections" ;; *) echo " no expected window title for screen $1" >&2; return 1 ;; esac } +title_matches_screen() { + local screen="$1" actual="$2" expected + expected=$(expected_window_title "$screen") || return 1 + case "$screen" in + alerts) [[ "$actual" == "$expected" || "$actual" == "$expected – "* ]] ;; + rules) [[ "$actual" == "$expected" || "$actual" == "$expected – "*" in force" ]] ;; + inspect) [[ "$actual" == "$expected" || "$actual" == "$expected – Off" ]] ;; + *) [[ "$actual" == "$expected" ]] ;; + esac +} + window_title() { osascript - "$1" <<'OSA' on run argv @@ -85,7 +109,8 @@ OSA } capture() { - local name="$1" screen="$2" tab="$3" size="${4:-$SIZE}" + local name="$1" screen="$2" tab="$3" requested_size="$4" + local size="${FL_FORCE_SIZE:-${requested_size:-$SIZE}}" echo " $name ($screen${tab:+ · $tab})" local w="${size%x*}" h="${size#*x}" local executable @@ -100,7 +125,8 @@ capture() { # arrive after demo seeding and replace the requested screen. Pin English too, so the title check below is stable. open -n "$APP" --args -ApplePersistenceIgnoreState YES -AppleLanguages "(en)" -AppleLocale en_US \ -FLDemo YES -FLScreen "$screen" -FLAgentTab "${tab:-destinations}" \ - -FLWindow "${w}x${h}" -FLInspectSelect paste.example -AppleInterfaceStyle Light \ + -FLWindow "${w}x${h}" -FLInspectSelect paste.example -inspection.enabled NO \ + -AppleInterfaceStyle Light \ "${banner[@]}" "${visualization[@]}" local pid="" for _ in {1..40}; do @@ -121,11 +147,18 @@ OSA local expected actual expected=$(expected_window_title "$screen") actual=$(window_title "$pid" 2>/dev/null || true) - if [ "$actual" != "$expected" ]; then + if ! title_matches_screen "$screen" "$actual"; then echo " refusing to capture $name: expected $expected, found ${actual:-no window}" stop_exact_app "$pid" "$executable" return 1 fi + local open_files + open_files=$(lsof -p "$pid" -Fn 2>/dev/null || true) + if [[ "$open_files" == *traffic.sqlite* || "$open_files" != *demo.sqlite* ]]; then + echo " refusing to capture $name: demo.sqlite is not the only traffic database" + stop_exact_app "$pid" "$executable" + return 1 + fi local id id=$(scripts/window-id.swift "$pid" 2>/dev/null || true) if [ -z "$id" ]; then @@ -137,6 +170,20 @@ OSA stop_exact_app "$pid" "$executable" return 1 fi + if [ -n "${FL_EXPECT_PIXELS:-}" ]; then + local expected_width="${FL_EXPECT_PIXELS%x*}" expected_height="${FL_EXPECT_PIXELS#*x}" + local actual_width actual_height + actual_width=$(sips -g pixelWidth "$OUT/$name.png" | sed -n 's/.*pixelWidth: //p') + actual_height=$(sips -g pixelHeight "$OUT/$name.png" | sed -n 's/.*pixelHeight: //p') + if [ "$actual_width" != "$expected_width" ] || [ "$actual_height" != "$expected_height" ]; then + echo " refusing $name: expected ${expected_width}x${expected_height}, captured ${actual_width}x${actual_height}" + stop_exact_app "$pid" "$executable" + return 1 + fi + fi + if [ "${FL_SKIP_MANIFEST:-NO}" != "YES" ]; then + python3 scripts/screenshot_manifest.py --directory "$OUT" --version "$GOT" "$name.png" + fi stop_exact_app "$pid" "$executable" sleep 2 } diff --git a/site/pages/releases.html b/site/pages/releases.html index bc36f978..8708db7f 100644 --- a/site/pages/releases.html +++ b/site/pages/releases.html @@ -13,7 +13,16 @@

What's new

-

0.17.0

Latest
+

0.17.1

Latest
+
    +
  • Keep every public screenshot current. All ten website images now come from the same 0.17.1 demo build, consistently show History and Connections in the sidebar, and use History throughout linked actions and guidance.
  • +
  • Review the Store with the same product users receive. A complete 2880×1800 Mac App Store screenshot set is captured from that exact build, title-checked screen by screen, and retained with the release for App Store Connect.
  • +
  • Keep synthetic evidence isolated. Screenshot capture now refuses any process that opens the real traffic database and can enforce one uniform window and pixel size for Store-ready output.
  • +
+
+ +
+

0.17.0

  • Find past traffic in History. Reports is now History, with concise presets from 15 minutes to all retained evidence, an explicit date range, adaptive resolution, and a native overview navigator whose selection can be dragged, resized, or panned.
  • Keep short windows controllable. The navigator magnifies a nearby context when the full retained timeline would collapse the brush, preserves a minimum handle width, and can switch back to All history without changing the selected dates.