diff --git a/cmd/core-runtime/main.go b/cmd/core-runtime/main.go index 235eee1..7846dfa 100644 --- a/cmd/core-runtime/main.go +++ b/cmd/core-runtime/main.go @@ -1744,6 +1744,9 @@ func renderResearchReply(query string, result epistemics.ResearchResult, researc if len(lines) == 0 { return "Проверяемых данных пока не найдено. Могу повторить поиск или уточнить, что именно проверить.", false } + if isInternetStatusQuery(query) { + return "Интернет работает: Домовой получил ответ от внешних источников.\n\n" + strings.Join(lines, "\n\n"), true + } if nearestFlightQuery(query) && !containsFlightTimeEvidence(strings.Join(lines, " ")) { return "Нашёл расписание по маршруту, но точное время ближайшего вылета в доступных фрагментах не указано. Откройте источник и выберите ближайший рейс:\n\n" + strings.Join(lines, "\n\n"), true } @@ -1755,6 +1758,12 @@ func renderResearchReply(query string, result epistemics.ResearchResult, researc return reply, true } +func isInternetStatusQuery(query string) bool { + lower := strings.ToLower(query) + return (strings.Contains(lower, "интернет") || strings.Contains(lower, "сет")) && + (strings.Contains(lower, "работает") || strings.Contains(lower, "доступ") || strings.Contains(lower, "проверь") || strings.Contains(lower, "связ")) +} + func nearestFlightQuery(query string) bool { lower := strings.ToLower(query) return strings.Contains(lower, "ближ") && (strings.Contains(lower, "рейс") || strings.Contains(lower, "самолет") || strings.Contains(lower, "самолёт") || strings.Contains(lower, "вылет")) diff --git a/cmd/core-runtime/main_test.go b/cmd/core-runtime/main_test.go index 5e44ef1..bc50d4c 100644 --- a/cmd/core-runtime/main_test.go +++ b/cmd/core-runtime/main_test.go @@ -76,6 +76,17 @@ func TestContainsPriceEvidenceDistinguishesLinksFromPrices(t *testing.T) { } } +func TestInternetStatusQueryRecognizesConnectionChecks(t *testing.T) { + for _, query := range []string{"проверь, работает ли интернет", "есть доступ к сети?"} { + if !isInternetStatusQuery(query) { + t.Fatalf("connection check was not recognized: %q", query) + } + } + if isInternetStatusQuery("найди интернет-магазин") { + t.Fatal("ordinary search must not be treated as a connectivity check") + } +} + func TestCognitiveChannelQuestionUsesHumanSafeHealthReply(t *testing.T) { reply := humanCognitiveChannelReply(interaction.InformationRequestCognitiveChannelStatus, interaction.SpeechActQuestion, capability.Health{State: capability.HealthAvailable, CapabilityID: "provider-secret-model"}, nil) if !strings.Contains(reply, "доступен") || strings.Contains(reply, "provider-secret-model") {