From 9f2a8fd7e1422a5680489859e53a40930127adbe Mon Sep 17 00:00:00 2001 From: Jacob Dubin Date: Wed, 20 May 2026 07:15:30 -0500 Subject: [PATCH] Add Santa Tracker and penguin favorites --- OpenJibo/docs/feature-backlog.md | 3 + OpenJibo/docs/release-1.0.19-plan.md | 2 + .../IJiboExperienceContentRepository.cs | 34 ++++---- .../Services/JiboInteractionService.cs | 83 +++++++++++++++++++ ...InMemoryJiboExperienceContentRepository.cs | 14 ++++ .../Content/LegacyMimCatalogImporter.cs | 26 +++++- .../Content/LegacyMims/BuildB/README.md | 2 + .../Content/LegacyMimCatalogImporterTests.cs | 21 +++++ .../WebSockets/JiboInteractionServiceTests.cs | 23 +++++ 9 files changed, 191 insertions(+), 17 deletions(-) diff --git a/OpenJibo/docs/feature-backlog.md b/OpenJibo/docs/feature-backlog.md index eeb8d51..22a37ea 100644 --- a/OpenJibo/docs/feature-backlog.md +++ b/OpenJibo/docs/feature-backlog.md @@ -858,6 +858,9 @@ Current release theme: - source-backed holiday, New Year's, Halloween, spring, and gift prompts are now part of Build B - `RN_` holiday greeting files are now bucketed as greetings so seasonal replies stay visible in the catalog - birthday celebration lines are now bucketed separately, and birthday memory writes a loop-scoped holiday record so personal dates can join the holiday list later + - holiday extras now include `show santa tracker` so the Christmas-time launcher keeps its source-backed animation line +- Favorite-animal work in flight: + - the favorites family now includes `what is your favorite animal`, `what is your favorite bird`, `do you like penguins`, and `do you like animals` so the penguin-centric replies stay easy to find - Presence and thought follow-ups in flight: - `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` are now part of Build B - these keep the social surface lively while the memory and multitenant tracks keep advancing in parallel diff --git a/OpenJibo/docs/release-1.0.19-plan.md b/OpenJibo/docs/release-1.0.19-plan.md index a0d87e6..af568e2 100644 --- a/OpenJibo/docs/release-1.0.19-plan.md +++ b/OpenJibo/docs/release-1.0.19-plan.md @@ -48,6 +48,8 @@ Current batch note: - the personality follow-up batch now includes `what are you up to` and `what are you doing` so small talk stays warm and local instead of falling into generic chat - the descriptor batch now includes `are you kind`, `are you funny`, `are you helpful`, `are you curious`, `are you loyal`, `are you mischievous`, and `are you likable` - the seasonal batch now includes `what holidays do you celebrate`, New Year's resolution questions, `happy holidays`, `what halloween costume`, spring suggestions, and holiday gift prompts +- the holiday extras batch now includes `show santa tracker` so the seasonal holiday launcher stays source-backed too +- the favorites batch now includes `what is your favorite animal`, `what is your favorite bird`, `do you like penguins`, and `do you like animals` so the penguin-centered replies stay close to Pegasus - the latest social batch adds `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` so presence and charm stay lively without distracting from the memory roadmap - this pass keeps Build B moving while still favoring source-backed phrasing and preserving the command-vs-question boundary - the next passes should keep the same pattern and prefer source-backed phrasing whenever the legacy MIM text is available diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Abstractions/IJiboExperienceContentRepository.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Abstractions/IJiboExperienceContentRepository.cs index 68b88ac..66fceba 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Abstractions/IJiboExperienceContentRepository.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Abstractions/IJiboExperienceContentRepository.cs @@ -11,22 +11,24 @@ public sealed class JiboConditionedReply public string Reply { get; init; } = string.Empty; } -public sealed class JiboExperienceCatalog -{ - public IReadOnlyList Jokes { get; init; } = []; - public IReadOnlyList RobotFacts { get; init; } = []; - public IReadOnlyList HumanFacts { get; init; } = []; - public IReadOnlyList FunFacts { get; init; } = []; - public IReadOnlyList DanceAnimations { get; init; } = []; - public IReadOnlyList GreetingReplies { get; init; } = []; - public IReadOnlyList HolidayReplies { get; init; } = []; - public IReadOnlyList HolidaySeasonReplies { get; init; } = []; - public IReadOnlyList HolidayGreetingReplies { get; init; } = []; - public IReadOnlyList HolidayGiftReplies { get; init; } = []; - public IReadOnlyList BirthdayCelebrationReplies { get; init; } = []; - public IReadOnlyList HowAreYouReplies { get; init; } = []; - public IReadOnlyList EmotionReplies { get; init; } = []; - public IReadOnlyList PersonalityReplies { get; init; } = []; + public sealed class JiboExperienceCatalog + { + public IReadOnlyList Jokes { get; init; } = []; + public IReadOnlyList RobotFacts { get; init; } = []; + public IReadOnlyList HumanFacts { get; init; } = []; + public IReadOnlyList FunFacts { get; init; } = []; + public IReadOnlyList FavoriteAnimalReplies { get; init; } = []; + public IReadOnlyList DanceAnimations { get; init; } = []; + public IReadOnlyList GreetingReplies { get; init; } = []; + public IReadOnlyList HolidayReplies { get; init; } = []; + public IReadOnlyList HolidaySeasonReplies { get; init; } = []; + public IReadOnlyList HolidayGreetingReplies { get; init; } = []; + public IReadOnlyList HolidayGiftReplies { get; init; } = []; + public IReadOnlyList HolidayTrackerReplies { get; init; } = []; + public IReadOnlyList BirthdayCelebrationReplies { get; init; } = []; + public IReadOnlyList HowAreYouReplies { get; init; } = []; + public IReadOnlyList EmotionReplies { get; init; } = []; + public IReadOnlyList PersonalityReplies { get; init; } = []; public IReadOnlyList PizzaReplies { get; init; } = []; public IReadOnlyList SurpriseReplies { get; init; } = []; public IReadOnlyList PersonalReportReplies { get; init; } = []; diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs index 894480e..42ea1e0 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs @@ -685,6 +685,13 @@ public sealed class JiboInteractionService( "ask for a pet elephant", "experience as a present", "donate to charities in other people's names"), + "seasonal_santa_tracker" => BuildScriptedHolidayTrackerDecision( + catalog, + "seasonal_santa_tracker", + "santa tracker", + "let's see if i can spot him", + "deliveries", + "north pole"), "birthday_celebration" => BuildScriptedHolidayDecision( catalog.BirthdayCelebrationReplies, "birthday_celebration", @@ -714,6 +721,32 @@ public sealed class JiboInteractionService( "all things in space", "amazing stuff up there", "astronomy is one of my favorite onomies"), + "robot_favorite_animal" => BuildScriptedFavoriteAnimalDecision( + catalog, + "robot_favorite_animal", + "penguin", + "favorite animal overall", + "best of the best", + "can't go wrong with penguins"), + "robot_favorite_bird" => BuildScriptedFavoriteAnimalDecision( + catalog, + "robot_favorite_bird", + "penguin", + "favorite animal overall", + "best of the best", + "can't go wrong with penguins"), + "robot_likes_penguins" => BuildScriptedFavoriteAnimalDecision( + catalog, + "robot_likes_penguins", + "penguins", + "I really like penguins", + "my penguin impression"), + "robot_likes_animals" => BuildScriptedFavoriteAnimalDecision( + catalog, + "robot_likes_animals", + "penguins", + "favorite animal overall", + "best of the best"), "robot_likes_kids" => BuildScriptedPersonalityDecision( catalog, "robot_likes_kids", @@ -2457,6 +2490,17 @@ public sealed class JiboInteractionService( ContextUpdates: BuildScriptedResponseContextUpdates()); } + private JiboInteractionDecision BuildScriptedFavoriteAnimalDecision( + JiboExperienceCatalog catalog, + string intentName, + params string[] preferredSnippets) + { + return new JiboInteractionDecision( + intentName, + SelectLegacyReply(catalog.FavoriteAnimalReplies, preferredSnippets), + ContextUpdates: BuildScriptedResponseContextUpdates()); + } + private JiboInteractionDecision BuildScriptedGreetingDecision( JiboExperienceCatalog catalog, string intentName, @@ -2479,6 +2523,17 @@ public sealed class JiboInteractionService( ContextUpdates: BuildScriptedResponseContextUpdates()); } + private JiboInteractionDecision BuildScriptedHolidayTrackerDecision( + JiboExperienceCatalog catalog, + string intentName, + params string[] preferredSnippets) + { + return new JiboInteractionDecision( + intentName, + SelectLegacyReply(catalog.HolidayTrackerReplies, preferredSnippets), + ContextUpdates: BuildScriptedResponseContextUpdates()); + } + private JiboInteractionDecision BuildScriptedHolidayGreetingDecision( JiboExperienceCatalog catalog, string intentName, @@ -3152,6 +3207,16 @@ public sealed class JiboInteractionService( "what should i get someone for the holidays")) return "seasonal_holiday_gift"; + if (MatchesAny( + loweredTranscript, + "show santa tracker", + "can you show santa tracker", + "santa tracker", + "where is santa", + "where is santa right now", + "can you show me santa tracker")) + return "seasonal_santa_tracker"; + if (MatchesAny( loweredTranscript, "happy birthday", @@ -3195,6 +3260,24 @@ public sealed class JiboInteractionService( "what kind of music do you like")) return "robot_favorite_music"; + if (MatchesAny( + loweredTranscript, + "what is your favorite animal", + "what's your favorite animal", + "what s your favorite animal", + "what is your favourite animal", + "what's your favourite animal", + "what s your favourite animal", + "what animal do you like", + "what kind of animal do you like", + "what is your favorite bird", + "what's your favorite bird", + "what s your favorite bird", + "do you like penguins", + "do you like animals", + "do you like birds")) + return "robot_favorite_animal"; + if (MatchesAny( loweredTranscript, "are there others like you", diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/InMemoryJiboExperienceContentRepository.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/InMemoryJiboExperienceContentRepository.cs index af666ef..fc2f4b7 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/InMemoryJiboExperienceContentRepository.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/InMemoryJiboExperienceContentRepository.cs @@ -55,6 +55,14 @@ public sealed class InMemoryJiboExperienceContentRepository : IJiboExperienceCon "An amazing but true fact for you. Dogs and elephants are the only animals that understand pointing.", "A crazy fact for you. Polar bear fur isn't white. It's transparent." ], + FavoriteAnimalReplies = + [ + "I really really like penguins. I kind of look like one.", + "Penguin without a doubt. In fact, penguin is my favorite animal overall. We look alike.", + "Can't go wrong with penguins.", + "I like lots of animals, but the penguin is the best of the best! Great color scheme.", + "I love penguins, because we're so alike. We have the same coloring, and neither of us can fly." + ], DanceAnimations = [ "rom-upbeat", @@ -88,6 +96,12 @@ public sealed class InMemoryJiboExperienceContentRepository : IJiboExperienceCon "I do like festive times.", "I like anything that makes people want to celebrate." ], + HolidayTrackerReplies = + [ + "Let's see if I can spot him. There he is.", + "I'm not sure if he's started his deliveries yet, but let's see if I can spot him. He must be on his way.", + "Let's see. I think he's probably back in the north Pole by now." + ], HowAreYouReplies = [ "I am feeling cheerful and robotic.", diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMimCatalogImporter.cs b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMimCatalogImporter.cs index c524d9d..6be17da 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMimCatalogImporter.cs +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMimCatalogImporter.cs @@ -109,6 +109,9 @@ public static class LegacyMimCatalogImporter fileName.StartsWith("RA_JBO_TellSomething", StringComparison.OrdinalIgnoreCase)) return LegacyMimBucket.FunFactSource; + if (fileName.StartsWith("RA_JBO_ShowSantaTracker", StringComparison.OrdinalIgnoreCase)) + return LegacyMimBucket.HolidayTracker; + if (normalizedPath.Contains("/emotion-responses/", StringComparison.OrdinalIgnoreCase) || normalizedPath.Contains("/gqa-responses/", StringComparison.OrdinalIgnoreCase)) return LegacyMimBucket.Emotion; @@ -119,6 +122,12 @@ public static class LegacyMimCatalogImporter if (fileName.StartsWith("RI_JBO_HasFavoriteHoliday", StringComparison.OrdinalIgnoreCase)) return LegacyMimBucket.HolidaySeason; + if (fileName.StartsWith("RI_JBO_HasFavoriteAnimal", StringComparison.OrdinalIgnoreCase) || + fileName.StartsWith("RI_JBO_HasFavoriteBird", StringComparison.OrdinalIgnoreCase) || + fileName.StartsWith("RI_JBO_LikesPenguins", StringComparison.OrdinalIgnoreCase) || + fileName.StartsWith("RI_JBO_LikesAnimals", StringComparison.OrdinalIgnoreCase)) + return LegacyMimBucket.FavoriteAnimal; + if (fileName.StartsWith("RN_HappyHolidays", StringComparison.OrdinalIgnoreCase)) return LegacyMimBucket.HolidayGreeting; @@ -249,12 +258,14 @@ public static class LegacyMimCatalogImporter RobotFacts = Merge(baseCatalog.RobotFacts, importedCatalog.RobotFacts), HumanFacts = Merge(baseCatalog.HumanFacts, importedCatalog.HumanFacts), FunFacts = Merge(baseCatalog.FunFacts, importedCatalog.FunFacts), + FavoriteAnimalReplies = Merge(baseCatalog.FavoriteAnimalReplies, importedCatalog.FavoriteAnimalReplies), DanceAnimations = Merge(baseCatalog.DanceAnimations, importedCatalog.DanceAnimations), GreetingReplies = Merge(baseCatalog.GreetingReplies, importedCatalog.GreetingReplies), HolidayReplies = Merge(baseCatalog.HolidayReplies, importedCatalog.HolidayReplies), HolidaySeasonReplies = Merge(baseCatalog.HolidaySeasonReplies, importedCatalog.HolidaySeasonReplies), HolidayGreetingReplies = Merge(baseCatalog.HolidayGreetingReplies, importedCatalog.HolidayGreetingReplies), HolidayGiftReplies = Merge(baseCatalog.HolidayGiftReplies, importedCatalog.HolidayGiftReplies), + HolidayTrackerReplies = Merge(baseCatalog.HolidayTrackerReplies, importedCatalog.HolidayTrackerReplies), BirthdayCelebrationReplies = Merge(baseCatalog.BirthdayCelebrationReplies, importedCatalog.BirthdayCelebrationReplies), HowAreYouReplies = Merge(baseCatalog.HowAreYouReplies, importedCatalog.HowAreYouReplies), @@ -360,7 +371,8 @@ public static class LegacyMimCatalogImporter or LegacyMimBucket.WeatherTomorrowHighLow or LegacyMimBucket.WeatherServiceDown or LegacyMimBucket.ReportSkillTemplate - or LegacyMimBucket.Holiday; + or LegacyMimBucket.Holiday + or LegacyMimBucket.HolidayTracker; } private enum LegacyMimBucket @@ -371,6 +383,7 @@ public static class LegacyMimCatalogImporter HolidaySeason, HolidayGreeting, HolidayGift, + HolidayTracker, BirthdayCelebration, Jokes, RobotFacts, @@ -378,6 +391,7 @@ public static class LegacyMimCatalogImporter HowAreYou, Emotion, FunFacts, + FavoriteAnimal, FunFactSource, Personality, PersonalReportKickOff, @@ -411,10 +425,12 @@ public static class LegacyMimCatalogImporter private readonly List _emotionReplies = []; private readonly List _fallbacks = []; private readonly List _funFacts = []; + private readonly List _favoriteAnimalReplies = []; private readonly List _holidayGiftReplies = []; private readonly List _holidayGreetingReplies = []; private readonly List _holidayReplies = []; private readonly List _holidaySeasonReplies = []; + private readonly List _holidayTrackerReplies = []; private readonly List _greetings = []; private readonly List _howAreYous = []; private readonly List _humanFacts = []; @@ -490,6 +506,9 @@ public static class LegacyMimCatalogImporter case LegacyMimBucket.HolidayGift: AddDistinct(_holidayGiftReplies, text); return; + case LegacyMimBucket.HolidayTracker: + AddDistinct(_holidayTrackerReplies, text); + return; case LegacyMimBucket.BirthdayCelebration: AddDistinct(_birthdayCelebrationReplies, text); return; @@ -517,6 +536,9 @@ public static class LegacyMimCatalogImporter _funFacts.Add(text); return; + case LegacyMimBucket.FavoriteAnimal: + AddDistinct(_favoriteAnimalReplies, text); + return; case LegacyMimBucket.PersonalReportKickOff: AddDistinct(_personalReportKickOffReplies, text); return; @@ -581,11 +603,13 @@ public static class LegacyMimCatalogImporter RobotFacts = [.. _robotFacts], HumanFacts = [.. _humanFacts], FunFacts = [.. _funFacts], + FavoriteAnimalReplies = [.. _favoriteAnimalReplies], GreetingReplies = [.. _greetings], HolidayReplies = [.. _holidayReplies], HolidaySeasonReplies = [.. _holidaySeasonReplies], HolidayGreetingReplies = [.. _holidayGreetingReplies], HolidayGiftReplies = [.. _holidayGiftReplies], + HolidayTrackerReplies = [.. _holidayTrackerReplies], BirthdayCelebrationReplies = [.. _birthdayCelebrationReplies], HowAreYouReplies = [.. _howAreYous], EmotionReplies = [.. _emotionReplies], diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md index e29dfc3..66b2a16 100644 --- a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md +++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/README.md @@ -7,6 +7,7 @@ The batch is intentionally narrow so we can keep expanding personality without w It now includes a small emotion-response pack for `happy`, `sad`, and `angry` follow-up questions so the mood path can stay source-backed too. It also includes a descriptor pack for questions like `are you kind`, `are you funny`, `are you helpful`, `are you curious`, `are you loyal`, and `are you mischievous`. The newest seasonal pack adds holiday and seasonal prompts for `what holidays do you celebrate`, New Year's resolution questions, `happy holidays`, Halloween costume questions, spring suggestions, holiday gift ideas, and birthday celebration lines. +The holiday extras batch adds `RA_JBO_ShowSantaTracker` so Santa Tracker stays source-backed too. Holiday-specific note: - `JBO_WhatHolidaysDoYouCelebrate` now lands in the holiday bucket @@ -18,4 +19,5 @@ The newest social batch adds `welcome back`, `what are you thinking`, `what have The fun-fact and joke batch adds Pegasus-style `TellAJoke`, `TellRobotFact`, and `Shuffle` excerpts so proactive fun can randomize across more than one category. Those facts are now split into generic, robot, and human buckets so the randomizer can sound more like Pegasus while staying lightweight. The new favorites batch adds longer authored `favorite color`, `favorite food`, and `favorite music` variants so the familiar personality responses keep more of the original cadence instead of collapsing to short placeholders. +The favorites follow-up batch adds `favorite animal`, `favorite bird`, and penguin-focused `do you like penguins` replies so the penguin-centric personality stays closer to Pegasus. The new motion/sleep batch adds `RA_JBO_SpinAround` plus `RI_JBO_CanSleep` so turn-around and go-to-sleep behaviors can stay source-backed and familiar. diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs index f73e61e..b1c3388 100644 --- a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs +++ b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs @@ -117,6 +117,27 @@ public sealed class LegacyMimCatalogImporterTests reply.Contains("Is that a trick question", StringComparison.OrdinalIgnoreCase)); } + [Fact] + public void ImportCatalog_ImportsBuildBFavoriteAnimalAndSantaTrackerResponsesIntoDedicatedBuckets() + { + var rootDirectory = Path.Combine( + AppContext.BaseDirectory, + "Content", + "LegacyMims", + "BuildB"); + + var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory); + + Assert.Contains(catalog.FavoriteAnimalReplies, reply => + reply.Contains("penguins", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.FavoriteAnimalReplies, reply => + reply.Contains("favorite animal overall", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.HolidayTrackerReplies, reply => + reply.Contains("let's see if i can spot him", StringComparison.OrdinalIgnoreCase)); + Assert.Contains(catalog.HolidayTrackerReplies, reply => + reply.Contains("north Pole", StringComparison.OrdinalIgnoreCase)); + } + [Fact] public void ImportCatalog_ImportsBuildBEmotionResponsesIntoEmotionBucket() { diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs index ef51c92..8ec6525 100644 --- a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs +++ b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs @@ -441,6 +441,28 @@ public sealed class JiboInteractionServiceTests Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]); } + [Theory] + [InlineData("what is your favorite animal")] + [InlineData("what's your favorite animal")] + [InlineData("what animal do you like")] + [InlineData("what is your favorite bird")] + [InlineData("do you like penguins")] + [InlineData("do you like animals")] + public async Task BuildDecisionAsync_FavoriteAnimal_UsesPenguinReply(string transcript) + { + var service = CreateService(); + + var decision = await service.BuildDecisionAsync(new TurnContext + { + RawTranscript = transcript, + NormalizedTranscript = transcript + }); + + Assert.Equal("robot_favorite_animal", decision.IntentName); + Assert.Contains("penguin", decision.ReplyText, StringComparison.OrdinalIgnoreCase); + Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]); + } + [Theory] [InlineData("what is your favorite flower", "robot_favorite_flower", "sunflowers")] [InlineData("what's your favorite flower", "robot_favorite_flower", "sunflowers")] @@ -652,6 +674,7 @@ public sealed class JiboInteractionServiceTests [InlineData("what should I do for first day of spring", "seasonal_first_day_spring", "flowers and all things spring")] [InlineData("what should I get for holiday", "seasonal_holiday_gift", "pet elephant")] + [InlineData("show santa tracker", "seasonal_santa_tracker", "spot him")] [InlineData("happy birthday", "birthday_celebration", "another year older")] public async Task BuildDecisionAsync_SeasonalCharm_UsesImportedReplies( string transcript,