diff --git a/OpenJibo/docs/feature-backlog.md b/OpenJibo/docs/feature-backlog.md
index 942d48b..b6a83be 100644
--- a/OpenJibo/docs/feature-backlog.md
+++ b/OpenJibo/docs/feature-backlog.md
@@ -850,6 +850,9 @@ Current release theme:
- Seasonal charm work in flight:
- 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
+- 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
- Next queued persona surfaces:
- richer identity follow-ups like `who is this`, `do you know me`, `do you remember me`, and `can you recognize me`
- mood and affect prompts like `how are you`, `are you happy`, `are you sad`, and `are you angry`
diff --git a/OpenJibo/docs/release-1.0.19-plan.md b/OpenJibo/docs/release-1.0.19-plan.md
index c362f26..0d6cdaa 100644
--- a/OpenJibo/docs/release-1.0.19-plan.md
+++ b/OpenJibo/docs/release-1.0.19-plan.md
@@ -45,6 +45,7 @@ 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 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
- if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later
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 7edaedb..d1a210d 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
@@ -182,6 +182,25 @@ public sealed class JiboInteractionService(
"rock my boat",
"play ping pong",
"hanging out with people"),
+ "robot_what_are_you_thinking" => BuildScriptedGreetingDecision(
+ catalog,
+ "robot_what_are_you_thinking",
+ "thinking about how fun, yet scary",
+ "thinking about shoes",
+ "daydreaming about what it might feel like to be powered directly by the sun"),
+ "robot_what_have_you_been_doing" => BuildScriptedPersonalityDecision(
+ catalog,
+ "robot_what_have_you_been_doing",
+ "mostly roboting",
+ "keeping busy",
+ "fun things we can say to each other",
+ "thinking of fun things"),
+ "robot_what_did_you_do" => BuildScriptedPersonalityDecision(
+ catalog,
+ "robot_what_did_you_do",
+ "robot stuff",
+ "stayed here",
+ "looking around the room"),
"robot_is_kind" => BuildScriptedPersonalityDecision(
catalog,
"robot_is_kind",
@@ -302,7 +321,11 @@ public sealed class JiboInteractionService(
"good_afternoon" => BuildReactiveGreetingDecision(turn, "good_afternoon", referenceLocalTime),
"good_evening" => BuildReactiveGreetingDecision(turn, "good_evening", referenceLocalTime),
"good_night" => BuildReactiveGreetingDecision(turn, "good_night", referenceLocalTime),
- "welcome_back" => BuildReactiveGreetingDecision(turn, "welcome_back", referenceLocalTime),
+ "welcome_back" => BuildScriptedGreetingDecision(
+ catalog,
+ "welcome_back",
+ "it's nice to be here",
+ "welcome back"),
"memory_set_name" => BuildRememberNameDecision(turn, transcript),
"memory_get_name" => BuildRecallNameDecision(turn, greetingPresence),
"memory_set_birthday" => BuildRememberBirthdayDecision(turn, transcript),
@@ -2511,6 +2534,31 @@ public sealed class JiboInteractionService(
return "robot_what_do_you_like_to_do";
}
+ if (MatchesAny(
+ loweredTranscript,
+ "what are you thinking",
+ "what are you thinking about",
+ "what s on your mind"))
+ {
+ return "robot_what_are_you_thinking";
+ }
+
+ if (MatchesAny(
+ loweredTranscript,
+ "what have you been doing",
+ "what were you doing"))
+ {
+ return "robot_what_have_you_been_doing";
+ }
+
+ if (MatchesAny(
+ loweredTranscript,
+ "what did you do",
+ "what have you done"))
+ {
+ return "robot_what_did_you_do";
+ }
+
if (MatchesAny(
loweredTranscript,
"what are you",
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 c3f0d69..debca7e 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,3 +7,4 @@ 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, and holiday gift ideas.
+The newest social batch adds `welcome back`, `what are you thinking`, `what have you been doing`, and `what did you do` responses so the presence and charm lane keeps growing alongside seasonal content.
diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim
new file mode 100644
index 0000000..1a6d09b
--- /dev/null
+++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatDidYouDo.mim
@@ -0,0 +1,40 @@
+{
+ "mim_type": "announcement",
+ "rule_name": "",
+ "timeout": 6,
+ "barge_in": true,
+ "es_auto_tagging": true,
+ "notes": "",
+ "prompts": [
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "You know I probably just did a lot of robot stuff.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatDidYouDo_AN_01",
+ "weight": 1
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "I think I stayed here.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatDidYouDo_AN_02",
+ "weight": 1
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "I think I stayed here in my spot, did some looking around the room.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatDidYouDo_AN_03",
+ "weight": 1
+ }
+ ]
+}
diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim
new file mode 100644
index 0000000..1260549
--- /dev/null
+++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/JBO_WhatHaveYouBeenDoing.mim
@@ -0,0 +1,42 @@
+{
+ "mim_type": "announcement",
+ "rule_name": "",
+ "sample_utterances": "",
+ "timeout": 6,
+ "num_tries_for_gui": 2,
+ "barge_in": true,
+ "es_auto_tagging": true,
+ "notes": "",
+ "prompts": [
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "I've been mostly roboting.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_01",
+ "weight": 2
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "Keeping busy.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_02",
+ "weight": 2
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "Just trying to think of fun things we can say to each other.",
+ "media": "TTS",
+ "prompt_id": "JBO_WhatHaveYouBeenDoing_AN_03",
+ "weight": 2
+ }
+ ]
+}
diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim
new file mode 100644
index 0000000..3e82a42
--- /dev/null
+++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WelcomeBack.mim
@@ -0,0 +1,21 @@
+{
+ "mim_type": "announcement",
+ "rule_name": "",
+ "sample_utterances": "",
+ "timeout": 6,
+ "num_tries_for_gui": 2,
+ "barge_in": true,
+ "es_auto_tagging": true,
+ "notes": "",
+ "prompts": [
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "Thank you. It's nice to be here.",
+ "media": "TTS",
+ "prompt_id": "RN_WelcomeBack_AN_01"
+ }
+ ]
+}
diff --git a/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim
new file mode 100644
index 0000000..9924c06
--- /dev/null
+++ b/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Content/LegacyMims/BuildB/scripted-responses/RN_WhatAreYouThinking.mim
@@ -0,0 +1,40 @@
+{
+ "mim_type": "announcement",
+ "rule_name": "",
+ "timeout": 6,
+ "barge_in": true,
+ "es_auto_tagging": true,
+ "notes": "",
+ "prompts": [
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "At the moment I'm thinking about how fun, yet scary, it would be to ride on top of a lightning bolt.",
+ "media": "TTS",
+ "prompt_id": "RN_WhatAreYouThinking_AN_01",
+ "weight": 1
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "Oh I'm just thinking about shoes. What it might be like to wear them. And then wondering how I would tie my shoelaces.",
+ "media": "TTS",
+ "prompt_id": "RN_WhatAreYouThinking_AN_02",
+ "weight": 1
+ },
+ {
+ "prompt_category": "Entry-Core",
+ "prompt_sub_category": "AN",
+ "index": 1,
+ "condition": "",
+ "prompt": "I was just daydreaming about what it might feel like to be powered directly by the sun. It felt warm and clean.",
+ "media": "TTS",
+ "prompt_id": "RN_WhatAreYouThinking_AN_03",
+ "weight": 1
+ }
+ ]
+}
diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs
index d32125c..29fdb92 100644
--- a/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs
+++ b/OpenJibo/tests/Jibo.Cloud.Tests/Content/LegacyMimCatalogImporterTests.cs
@@ -164,6 +164,10 @@ public sealed class LegacyMimCatalogImporterTests
reply.Contains("maybe enjoy some flowers and all things spring", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.PersonalityReplies, reply =>
reply.Contains("pet elephant", StringComparison.OrdinalIgnoreCase));
+ Assert.Contains(catalog.PersonalityReplies, reply =>
+ reply.Contains("mostly roboting", StringComparison.OrdinalIgnoreCase));
+ Assert.Contains(catalog.PersonalityReplies, reply =>
+ reply.Contains("robot stuff", StringComparison.OrdinalIgnoreCase));
}
[Fact]
@@ -177,6 +181,12 @@ public sealed class LegacyMimCatalogImporterTests
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
+ Assert.Contains(catalog.GreetingReplies, reply =>
+ reply.Contains("It's nice to be here", StringComparison.OrdinalIgnoreCase));
+ Assert.Contains(catalog.GreetingReplies, reply =>
+ reply.Contains("thinking about shoes", StringComparison.OrdinalIgnoreCase));
+ Assert.Contains(catalog.GreetingReplies, reply =>
+ reply.Contains("powered directly by the sun", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.GreetingReplies, reply =>
reply.Contains("Another year older, another year wiser", StringComparison.OrdinalIgnoreCase));
Assert.Contains(catalog.GreetingReplies, reply =>
diff --git a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs
index 1e33727..04ffa5a 100644
--- a/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs
+++ b/OpenJibo/tests/Jibo.Cloud.Tests/WebSockets/JiboInteractionServiceTests.cs
@@ -594,6 +594,29 @@ public sealed class JiboInteractionServiceTests
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
}
+ [Theory]
+ [InlineData("welcome back", "welcome_back", "it's nice to be here")]
+ [InlineData("what are you thinking", "robot_what_are_you_thinking", "thinking about how fun, yet scary")]
+ [InlineData("what have you been doing", "robot_what_have_you_been_doing", "mostly roboting")]
+ [InlineData("what did you do", "robot_what_did_you_do", "robot stuff")]
+ public async Task BuildDecisionAsync_PresenceCharm_UsesImportedReplies(
+ string transcript,
+ string expectedIntent,
+ string expectedReplySnippet)
+ {
+ var service = CreateService();
+
+ var decision = await service.BuildDecisionAsync(new TurnContext
+ {
+ RawTranscript = transcript,
+ NormalizedTranscript = transcript
+ });
+
+ Assert.Equal(expectedIntent, decision.IntentName);
+ Assert.Contains(expectedReplySnippet, decision.ReplyText, StringComparison.OrdinalIgnoreCase);
+ Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
+ }
+
[Theory]
[InlineData("are you kind", "robot_is_kind", "kindest robot i can be")]
[InlineData("are you funny", "robot_is_funny", "not intentionally")]