diff --git a/src/apps/gh-flow/Program.cs b/src/apps/gh-flow/Program.cs index a20d9c8db..6bd56e66a 100644 --- a/src/apps/gh-flow/Program.cs +++ b/src/apps/gh-flow/Program.cs @@ -67,6 +67,7 @@ builder.Host.UseOrleans(siloBuilder => .AddMemoryStreams("StreamProvider") .AddMemoryGrainStorage("PubSubStore") .AddMemoryGrainStorage("messages"); + siloBuilder.UseInMemoryReminderService(); siloBuilder.UseDashboard(x => x.HostSelf = true); }); diff --git a/src/libs/Microsoft.AI.DevTeam/Agents/AiAgent.cs b/src/libs/Microsoft.AI.DevTeam/Agents/AiAgent.cs index f2f68b1aa..761751b80 100644 --- a/src/libs/Microsoft.AI.DevTeam/Agents/AiAgent.cs +++ b/src/libs/Microsoft.AI.DevTeam/Agents/AiAgent.cs @@ -65,8 +65,6 @@ public class AgentState { public List History { get; set; } public string Understanding { get; set; } - public long ParentIssueNumber { get; set; } - public int CommentId { get; set; } } public enum ChatUserType diff --git a/src/libs/Microsoft.AI.DevTeam/Agents/AzureGenie.cs b/src/libs/Microsoft.AI.DevTeam/Agents/AzureGenie.cs index ff8a818c8..8d138195a 100644 --- a/src/libs/Microsoft.AI.DevTeam/Agents/AzureGenie.cs +++ b/src/libs/Microsoft.AI.DevTeam/Agents/AzureGenie.cs @@ -50,16 +50,16 @@ public class AzureGenie : Agent var issueNumber = long.Parse(item.Data["issueNumber"]); await Store(item.Data["org"], item.Data["repo"], parentNumber, issueNumber, "run", "sh", "output", item.Message); await RunInSandbox(item.Data["org"], item.Data["repo"], parentNumber, issueNumber); - // await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event - // { - // Type = EventType.CodeCreated, - // Data = new Dictionary { - // { "org", item.Data["org"] }, - // { "repo", item.Data["repo"] }, - // { "issueNumber", item.Data["issueNumber"] }, - // { "parentNumber", item.Data["parentNumber"] } - // } - // }); + await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event + { + Type = EventType.SandboxRunCreated, + Data = new Dictionary { + { "org", item.Data["org"] }, + { "repo", item.Data["repo"] }, + { "issueNumber", item.Data["issueNumber"] }, + { "parentNumber", item.Data["parentNumber"] } + } + }); } break; diff --git a/src/libs/Microsoft.AI.DevTeam/Agents/Developer.cs b/src/libs/Microsoft.AI.DevTeam/Agents/Developer.cs index b5cdedf16..0e564431d 100644 --- a/src/libs/Microsoft.AI.DevTeam/Agents/Developer.cs +++ b/src/libs/Microsoft.AI.DevTeam/Agents/Developer.cs @@ -51,8 +51,18 @@ public class Dev : AiAgent }); break; case EventType.CodeChainClosed: - await CloseImplementation(); - // postEvent EventType.CodeFinished + var lastCode = _state.State.History.Last().Message; + await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event { + Type = EventType.CodeCreated, + Data = new Dictionary { + { "org", item.Data["org"] }, + { "repo", item.Data["repo"] }, + { "issueNumber", item.Data["issueNumber"] }, + { "code", lastCode }, + { "parentNumber", item.Data["parentNumber"] } + }, + Message = lastCode + }); break; default: break; diff --git a/src/libs/Microsoft.AI.DevTeam/Agents/Sandbox.cs b/src/libs/Microsoft.AI.DevTeam/Agents/Sandbox.cs index d1d4a4506..5e232a32a 100644 --- a/src/libs/Microsoft.AI.DevTeam/Agents/Sandbox.cs +++ b/src/libs/Microsoft.AI.DevTeam/Agents/Sandbox.cs @@ -1,25 +1,40 @@ using Orleans.Runtime; +using Orleans.Streams; using Orleans.Timers; namespace Microsoft.AI.DevTeam; -public class Sandbox : Grain, IRemindable +[ImplicitStreamSubscription(Consts.MainNamespace)] +public class Sandbox : Agent, IRemindable { private const string ReminderName = "SandboxRunReminder"; - private readonly IManageGithub _ghService; private readonly IManageAzure _azService; private readonly IReminderRegistry _reminderRegistry; private IGrainReminder? _reminder; protected readonly IPersistentState _state; - public Sandbox([PersistentState("state", "messages")] IPersistentState state, IManageGithub ghService, + public Sandbox([PersistentState("state", "messages")] IPersistentState state, IReminderRegistry reminderRegistry, IManageAzure azService) { - _ghService = ghService; _reminderRegistry = reminderRegistry; _azService = azService; _state = state; } + public override async Task HandleEvent(Event item, StreamSequenceToken? token) + { + switch(item.Type) + { + case EventType.SandboxRunCreated: + var org = item.Data["org"]; + var repo = item.Data["repo"]; + var parentIssueNumber = long.Parse(item.Data["parentIssueNumber"]); + var issueNumber = long.Parse(item.Data["issueNumber"]); + await ScheduleCommitSandboxRun(org, repo, parentIssueNumber, issueNumber); + break; + default: + break; + } + } public async Task ScheduleCommitSandboxRun(string org, string repo, long parentIssueNumber, long issueNumber) { await StoreState(org, repo, parentIssueNumber, issueNumber); @@ -38,8 +53,16 @@ public class Sandbox : Grain, IRemindable if (await _azService.IsSandboxCompleted(sandboxId)) { await _azService.DeleteSandbox(sandboxId); - await _ghService.CommitToBranch(_state.State.Org, _state.State.Repo, _state.State.ParentIssueNumber, _state.State.IssueNumber, _state.State.RootDir, _state.State.Branch); - await _ghService.MarkTaskComplete(_state.State.Org, _state.State.Repo, _state.State.CommentId); + await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event + { + Type = EventType.SandboxRunFinished, + Data = new Dictionary { + { "org", _state.State.Org }, + { "repo", _state.State.Repo }, + { "issueNumber", _state.State.IssueNumber.ToString() }, + { "parentIssueNumber", _state.State.ParentIssueNumber.ToString() } + } + }); await Cleanup(); } } @@ -54,7 +77,7 @@ public class Sandbox : Grain, IRemindable _state.State.Org = org; _state.State.Repo = repo; _state.State.ParentIssueNumber = parentIssueNumber; - // TODO: Add all of the state properties + _state.State.IssueNumber = issueNumber; _state.State.IsCompleted = false; await _state.WriteStateAsync(); } @@ -66,6 +89,8 @@ public class Sandbox : Grain, IRemindable this.GetGrainId(), _reminder); await _state.WriteStateAsync(); } + + } @@ -75,9 +100,5 @@ public class SandboxMetadata public string Repo { get; set; } public long ParentIssueNumber { get; set; } public long IssueNumber { get; set; } - public string RootDir { get; set; } - public string Branch { get; set; } - public int CommentId { get; set; } - public bool IsCompleted { get; set; } } diff --git a/src/libs/Microsoft.AI.DevTeam/Events/Event.cs b/src/libs/Microsoft.AI.DevTeam/Events/Event.cs index 7f8384904..22f63d68d 100644 --- a/src/libs/Microsoft.AI.DevTeam/Events/Event.cs +++ b/src/libs/Microsoft.AI.DevTeam/Events/Event.cs @@ -13,7 +13,6 @@ public class Event public enum EventType { NewAsk, - ChainClosed, ReadmeChainClosed, CodeChainClosed, CodeGenerationRequested, @@ -27,5 +26,6 @@ public enum EventType SandboxRunFinished, ReadmeCreated, CodeCreated, - DevPlanCreated + DevPlanCreated, + SandboxRunCreated } \ No newline at end of file