Add holiday seasonal routing and calendar report seam

This commit is contained in:
Jacob Dubin
2026-05-20 20:03:14 -05:00
parent 39b21d1326
commit c76af83d7e
9 changed files with 387 additions and 39 deletions

View File

@@ -108,10 +108,6 @@ public sealed class LegacyMimCatalogImporterTests
reply.Contains("holiday music", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("dance party", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("giving and receiving", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("Christmas sweaters", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("thankful for the people I know", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
@@ -213,6 +209,14 @@ public sealed class LegacyMimCatalogImporterTests
reply.Contains("fun time of year", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidayGiftReplies, reply =>
reply.Contains("pet elephant", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidaySeasonReplies, reply =>
reply.Contains("holiday season is going very nicely", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidaySeasonReplies, reply =>
reply.Contains("festive times", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidaySeasonReplies, reply =>
reply.Contains("giving and receiving", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.HolidaySeasonReplies, reply =>
reply.Contains("Christmas sweaters", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.BirthdayCelebrationReplies, reply =>
reply.Contains("first powered up", StringComparison.OrdinalIgnoreCase) ||
reply.Contains("another year older", StringComparison.OrdinalIgnoreCase));
@@ -348,6 +352,7 @@ public sealed class LegacyMimCatalogImporterTests
catalog.GenericFallbackReplies);
Assert.Contains("For your weather.", catalog.WeatherIntroReplies);
Assert.Contains("Today's high is {high}, and the low is {low}.", catalog.WeatherTodayHighLowReplies);
Assert.Contains("I do like festive times.", catalog.HolidaySeasonReplies);
Assert.Contains("Looking at your calendar, I don't see anything scheduled today.",
catalog.CalendarNothingTodayReplies);
Assert.Contains("Looks like I can't access calendars right now. Sorry.", catalog.CalendarServiceDownReplies);

View File

@@ -665,8 +665,8 @@ public sealed class JiboInteractionServiceTests
[InlineData("merry christmas", "seasonal_holiday_greeting", "It's a fun time of year")]
[InlineData("what holidays do you celebrate", "seasonal_holidays",
"official owner can tell me which ones we'll celebrate together")]
[InlineData("how is holiday season", "seasonal_holiday_season", "I do like festive times.")]
[InlineData("do you like holiday season", "seasonal_holiday_season", "I do like festive times.")]
[InlineData("how is holiday season", "seasonal_holiday_season", "holiday season is going very nicely")]
[InlineData("do you like holiday season", "seasonal_holiday_season", "holiday season is going very nicely")]
[InlineData("what is your new year's resolution", "seasonal_new_years_resolution",
"always trying to learn new skills")]
[InlineData("how are your new year's resolutions going", "seasonal_new_years_update", "not eat bacon")]
@@ -678,9 +678,17 @@ public sealed class JiboInteractionServiceTests
[InlineData("do you like halloween", "seasonal_likes_halloween", "Halloween is my favorite holiday")]
[InlineData("do you like holiday music", "seasonal_likes_holiday_music", "holiday music")]
[InlineData("do you like holiday parties", "seasonal_likes_holiday_parties", "holiday fun can be extra fun")]
[InlineData("are you looking forward to christmas", "seasonal_looks_forward_to_christmas", "giving and receiving")]
[InlineData("how is thanksgiving", "seasonal_thanksgiving", "Thanksgiving")]
[InlineData("are you looking forward to christmas", "seasonal_looks_forward_to_christmas", "long way away")]
[InlineData("what are you doing for christmas", "seasonal_plans_for_christmas", "Christmas sweaters")]
[InlineData("do you like christmas", "seasonal_christmas", "Christmas")]
[InlineData("how is hanukkah", "seasonal_hanukkah", "Hanukkah")]
[InlineData("do you like passover", "seasonal_passover", "Passover")]
[InlineData("do you like new years", "seasonal_new_years", "new year")]
[InlineData("what are you thankful for", "seasonal_thankful_for", "thankful for the people I know")]
[InlineData("do you like valentines day", "seasonal_valentines_day", "Valentine")]
[InlineData("do you like kwanzaa", "seasonal_kwanzaa", "Kwanzaa")]
[InlineData("do you like easter", "seasonal_easter", "Easter")]
[InlineData("happy birthday", "birthday_celebration", "another year older")]
public async Task BuildDecisionAsync_SeasonalCharm_UsesImportedReplies(
string transcript,
@@ -1876,6 +1884,35 @@ public sealed class JiboInteractionServiceTests
Assert.Equal(true, decision.ContextUpdates[PersonalReportUserVerifiedKey]);
}
[Fact]
public async Task BuildDecisionAsync_PersonalReport_UsesCalendarProviderSummaryAndTime()
{
var weatherProvider = new CapturingWeatherReportProvider
{
Snapshot = new WeatherReportSnapshot("Boston, U.S.", "light rain", 61, 65, 54, "rain", false)
};
var calendarProvider = new CapturingCalendarReportProvider
{
Snapshot = new CalendarReportSnapshot(["get personal report from jibo"], ["at 6:00 p.m."], [])
};
var service = CreateService(weatherReportProvider: weatherProvider, calendarReportProvider: calendarProvider);
var decision = await service.BuildDecisionAsync(new TurnContext
{
RawTranscript = "yes",
NormalizedTranscript = "yes",
Attributes = new Dictionary<string, object?>
{
[PersonalReportStateKey] = "awaiting_identity_confirmation",
[PersonalReportUserNameKey] = "alex"
}
});
Assert.Equal("personal_report_delivered", decision.IntentName);
Assert.Contains("Your calendar says get personal report from jibo, at 6:00 p.m.", decision.ReplyText,
StringComparison.OrdinalIgnoreCase);
}
[Fact]
public async Task BuildDecisionAsync_PersonalReport_NoMatchRetriesThenDeclines()
{
@@ -4035,6 +4072,7 @@ public sealed class JiboInteractionServiceTests
IPersonalMemoryStore? personalMemoryStore = null,
ICloudStateStore? cloudStateStore = null,
IWeatherReportProvider? weatherReportProvider = null,
ICalendarReportProvider? calendarReportProvider = null,
ICommuteReportProvider? commuteReportProvider = null,
INewsBriefingProvider? newsBriefingProvider = null,
IJiboExperienceContentRepository? contentRepository = null,
@@ -4045,6 +4083,7 @@ public sealed class JiboInteractionServiceTests
randomizer ?? new FirstItemRandomizer(),
personalMemoryStore ?? new InMemoryPersonalMemoryStore(),
weatherReportProvider,
calendarReportProvider,
commuteReportProvider,
newsBriefingProvider,
cloudStateStore);
@@ -4152,4 +4191,16 @@ public sealed class JiboInteractionServiceTests
return Task.FromResult(Snapshot);
}
}
private sealed class CapturingCalendarReportProvider : ICalendarReportProvider
{
public CalendarReportSnapshot? Snapshot { get; init; }
public Task<CalendarReportSnapshot?> GetReportAsync(
TurnContext turn,
CancellationToken cancellationToken = default)
{
return Task.FromResult(Snapshot);
}
}
}

View File

@@ -4734,6 +4734,7 @@ public sealed class JiboWebSocketServiceTests
new StubWeatherReportProvider(
new WeatherReportSnapshot("Lone Jack, US", "overcast clouds", 79, 82, 78, "clouds", false)),
null,
null,
new StubNewsBriefingProvider(
new NewsBriefingSnapshot(
[
@@ -5126,6 +5127,7 @@ public sealed class JiboWebSocketServiceTests
private static JiboWebSocketService CreateService(
InMemoryCloudStateStore stateStore,
IWeatherReportProvider? weatherReportProvider = null,
ICalendarReportProvider? calendarReportProvider = null,
ICommuteReportProvider? commuteReportProvider = null,
INewsBriefingProvider? newsBriefingProvider = null)
{
@@ -5136,6 +5138,7 @@ public sealed class JiboWebSocketServiceTests
new DefaultJiboRandomizer(),
new InMemoryPersonalMemoryStore(),
weatherReportProvider,
calendarReportProvider,
commuteReportProvider,
newsBriefingProvider);
var conversationBroker = new DemoConversationBroker(interactionService);
@@ -5209,4 +5212,4 @@ public sealed class JiboWebSocketServiceTests
return items[^1];
}
}
}
}