diff --git a/.gitignore b/.gitignore
index 874e256ec..83f3dc2dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -494,6 +494,7 @@ docs/agents-working-space/*
.tools/*
.plan/
.claude/ralph-loop.local.md
+.claude/scheduled_tasks.lock
# Docs triage working directory
docs/.triage/
diff --git a/aevatar.agents.slnf b/aevatar.agents.slnf
new file mode 100644
index 000000000..98d45a794
--- /dev/null
+++ b/aevatar.agents.slnf
@@ -0,0 +1,10 @@
+{
+ "solution": {
+ "path": "aevatar.slnx",
+ "projects": [
+ "agents\\Aevatar.GAgents.Authoring.Lark\\Aevatar.GAgents.Authoring.Lark.csproj",
+ "agents\\Aevatar.GAgents.Scheduled\\Aevatar.GAgents.Scheduled.csproj",
+ "agents\\Aevatar.GAgents.Device\\Aevatar.GAgents.Device.csproj"
+ ]
+ }
+}
diff --git a/aevatar.ai.slnf b/aevatar.ai.slnf
index fae376ae1..b4bc43411 100644
--- a/aevatar.ai.slnf
+++ b/aevatar.ai.slnf
@@ -9,6 +9,8 @@
"src\\Aevatar.AI.LLMProviders.Tornado\\Aevatar.AI.LLMProviders.Tornado.csproj",
"src\\Aevatar.AI.ToolProviders.MCP\\Aevatar.AI.ToolProviders.MCP.csproj",
"src\\Aevatar.AI.ToolProviders.Skills\\Aevatar.AI.ToolProviders.Skills.csproj",
+ "src\\Aevatar.AI.ToolProviders.AgentCatalog\\Aevatar.AI.ToolProviders.AgentCatalog.csproj",
+ "src\\Aevatar.AI.ToolProviders.ChannelAdmin\\Aevatar.AI.ToolProviders.ChannelAdmin.csproj",
"test\\Aevatar.AI.Tests\\Aevatar.AI.Tests.csproj"
]
}
diff --git a/aevatar.channels.slnf b/aevatar.channels.slnf
index a2be05829..540b84a16 100644
--- a/aevatar.channels.slnf
+++ b/aevatar.channels.slnf
@@ -5,10 +5,8 @@
"agents\\Aevatar.GAgents.Channel.Abstractions\\Aevatar.GAgents.Channel.Abstractions.csproj",
"agents\\channels\\Aevatar.GAgents.Channel.NyxIdRelay\\Aevatar.GAgents.Channel.NyxIdRelay.csproj",
"agents\\Aevatar.GAgents.Channel.Runtime\\Aevatar.GAgents.Channel.Runtime.csproj",
- "agents\\Aevatar.GAgents.ChannelRuntime\\Aevatar.GAgents.ChannelRuntime.csproj",
"test\\Aevatar.GAgents.Channel.Testing\\Aevatar.GAgents.Channel.Testing.csproj",
- "test\\Aevatar.GAgents.Channel.Protocol.Tests\\Aevatar.GAgents.Channel.Protocol.Tests.csproj",
- "test\\Aevatar.GAgents.ChannelRuntime.Tests\\Aevatar.GAgents.ChannelRuntime.Tests.csproj"
+ "test\\Aevatar.GAgents.Channel.Protocol.Tests\\Aevatar.GAgents.Channel.Protocol.Tests.csproj"
]
}
}
diff --git a/aevatar.slnx b/aevatar.slnx
index ae5249b3f..caaff528f 100644
--- a/aevatar.slnx
+++ b/aevatar.slnx
@@ -15,7 +15,9 @@
-
+
+
+
@@ -43,7 +45,9 @@
+
+
diff --git a/agents/Aevatar.GAgents.Authoring.Lark/Aevatar.GAgents.Authoring.Lark.csproj b/agents/Aevatar.GAgents.Authoring.Lark/Aevatar.GAgents.Authoring.Lark.csproj
new file mode 100644
index 000000000..4cf5d438f
--- /dev/null
+++ b/agents/Aevatar.GAgents.Authoring.Lark/Aevatar.GAgents.Authoring.Lark.csproj
@@ -0,0 +1,30 @@
+
+
+ net10.0
+ enable
+ enable
+ Aevatar.GAgents.Authoring.Lark
+ Aevatar.GAgents.Authoring.Lark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardContent.cs b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardContent.cs
similarity index 99%
rename from agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardContent.cs
rename to agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardContent.cs
index 2d4d6159d..0bb047709 100644
--- a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardContent.cs
+++ b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardContent.cs
@@ -1,14 +1,15 @@
using System.Text.Json;
using Aevatar.GAgents.Channel.Abstractions;
+using Aevatar.GAgents.Scheduled;
-namespace Aevatar.GAgents.ChannelRuntime;
+namespace Aevatar.GAgents.Authoring.Lark;
///
/// Builds channel-neutral payloads for the Day One agent builder flow.
/// Actions and CardBlocks let the platform composer render native interactive cards instead of
/// bouncing a pre-serialized JSON blob through a plain-text fallback.
///
-internal static class AgentBuilderCardContent
+public static class AgentBuilderCardContent
{
private const string DailyReportAction = "create_daily_report";
private const string SocialMediaAction = "create_social_media";
diff --git a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardFlow.cs b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardFlow.cs
similarity index 99%
rename from agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardFlow.cs
rename to agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardFlow.cs
index adbc1f23a..4e47f8aa3 100644
--- a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderCardFlow.cs
+++ b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderCardFlow.cs
@@ -1,11 +1,13 @@
using System.Globalization;
using System.Text.Json;
using Aevatar.GAgents.Channel.Abstractions;
+using Aevatar.GAgents.Channel.Runtime;
+using Aevatar.GAgents.Scheduled;
using Aevatar.Studio.Application.Studio.Abstractions;
-namespace Aevatar.GAgents.ChannelRuntime;
+namespace Aevatar.GAgents.Authoring.Lark;
-internal static class AgentBuilderCardFlow
+public static class AgentBuilderCardFlow
{
private const string PrivateChatType = "p2p";
private const string CardActionChatType = "card_action";
@@ -1255,13 +1257,13 @@ private static IReadOnlyList ReadAgentList(JsonElement root)
}
}
-internal sealed record AgentListCardItem(
+public sealed record AgentListCardItem(
string AgentId,
string Template,
string Status,
string NextRun);
-internal sealed record AgentBuilderFlowDecision(
+public sealed record AgentBuilderFlowDecision(
bool RequiresToolExecution,
string ReplyPayload,
string? ToolArgumentsJson,
diff --git a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderTemplates.cs b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderTemplates.cs
similarity index 97%
rename from agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderTemplates.cs
rename to agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderTemplates.cs
index 9a9d63289..0bd7c333d 100644
--- a/agents/Aevatar.GAgents.ChannelRuntime/AgentBuilderTemplates.cs
+++ b/agents/Aevatar.GAgents.Authoring.Lark/AgentBuilderTemplates.cs
@@ -1,8 +1,8 @@
using System.Text;
-namespace Aevatar.GAgents.ChannelRuntime;
+namespace Aevatar.GAgents.Authoring.Lark;
-internal static class AgentBuilderTemplates
+public static class AgentBuilderTemplates
{
public static IReadOnlyList