streams WIP

This commit is contained in:
Kosta Petan 2024-02-20 18:51:28 +00:00
parent 688e21b5fa
commit 5cb2e3d51b
6 changed files with 34 additions and 31 deletions

View File

@ -37,7 +37,8 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
.Select(l => l.Name.Split('.')) .Select(l => l.Name.Split('.'))
.Where(parts => parts.Length == 2) .Where(parts => parts.Length == 2)
.ToDictionary(parts => parts[0], parts => parts[1]); .ToDictionary(parts => parts[0], parts => parts[1]);
//if(labels.ContainsKey("Parent")) var skillName = labels.Keys.Where(k=>k != "Parent").FirstOrDefault();
long? parentNumber = labels.ContainsKey("Parent") ? long.Parse(labels["Parent"]) : null;
// TODO: confert the non-parent label to skill and function // TODO: confert the non-parent label to skill and function
// Issue 1 // Issue 1
// Sub issue 2 // Sub issue 2
@ -74,12 +75,12 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
if (issuesEvent.Action == IssuesAction.Opened) if (issuesEvent.Action == IssuesAction.Opened)
{ {
_logger.LogInformation("Processing HandleNewAsk"); _logger.LogInformation("Processing HandleNewAsk");
await HandleNewAsk(issueNumber, skillName, functionName, suffix, input, org, repo); await HandleNewAsk(issueNumber,parentNumber, skillName, labels[skillName], suffix, input, org, repo);
} }
else if (issuesEvent.Action == IssuesAction.Closed && issuesEvent.Issue.User.Type.Value == UserType.Bot) else if (issuesEvent.Action == IssuesAction.Closed && issuesEvent.Issue.User.Type.Value == UserType.Bot)
{ {
_logger.LogInformation("Processing HandleClosingIssue"); _logger.LogInformation("Processing HandleClosingIssue");
await HandleClosingIssue(issueNumber, skillName, functionName, suffix, org, repo); await HandleClosingIssue(issueNumber, parentNumber, suffix, org, repo);
} }
} }
catch (System.Exception) catch (System.Exception)
@ -101,15 +102,17 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
var issueNumber = issueCommentEvent.Issue.Number; var issueNumber = issueCommentEvent.Issue.Number;
var input = issueCommentEvent.Issue.Body; var input = issueCommentEvent.Issue.Body;
// Assumes the label follows the following convention: Skill.Function example: PM.Readme // Assumes the label follows the following convention: Skill.Function example: PM.Readme
var labels = issueCommentEvent.Issue.Labels.First().Name.Split("."); var labels = issueCommentEvent.Issue.Labels
.Select(l => l.Name.Split('.'))
var skillName = labels[0]; .Where(parts => parts.Length == 2)
var functionName = labels[1]; .ToDictionary(parts => parts[0], parts => parts[1]);
var skillName = labels.Keys.Where(k=>k != "Parent").FirstOrDefault();
long? parentNumber = labels.ContainsKey("Parent") ? long.Parse(labels["Parent"]) : null;
var suffix = $"{org}-{repo}"; var suffix = $"{org}-{repo}";
// we only resond to non-bot comments // we only resond to non-bot comments
if (issueCommentEvent.Sender.Type.Value != UserType.Bot) if (issueCommentEvent.Sender.Type.Value != UserType.Bot)
{ {
await HandleNewAsk(issueNumber, skillName, functionName, suffix, input, org, repo); await HandleNewAsk(issueNumber, parentNumber, skillName, labels[skillName], suffix, input, org, repo);
} }
} }
catch (System.Exception ex) catch (System.Exception ex)
@ -119,22 +122,27 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
} }
private async Task HandleClosingIssue(long issueNumber, string skillName, string functionName, string suffix, string org, string repo) private async Task HandleClosingIssue(long issueNumber, long? parentNumber, string suffix, string org, string repo)
{ {
var streamProvider = _client.GetStreamProvider("StreamProvider"); var streamProvider = _client.GetStreamProvider("StreamProvider");
var streamId = StreamId.Create(suffix, issueNumber.ToString()); var streamId = StreamId.Create(suffix, issueNumber.ToString());
var stream = streamProvider.GetStream<Event>(streamId); var stream = streamProvider.GetStream<Event>(streamId);
var data = new Dictionary<string, string>
{
{ "org", org },
{ "repo", repo },
{ "issueNumber", issueNumber.ToString() },
{ "parentNumber", parentNumber?.ToString()}
};
await stream.OnNextAsync(new Event await stream.OnNextAsync(new Event
{ {
Type = EventType.ChainClosed, Type = EventType.ChainClosed,
Org = org, Data = data
Repo = repo,
IssueNumber = issueNumber
}); });
} }
private async Task HandleNewAsk(long issueNumber, string skillName, string functionName, string suffix, string input, string org, string repo) private async Task HandleNewAsk(long issueNumber, long? parentNumber, string skillName, string functionName, string suffix, string input, string org, string repo)
{ {
try try
{ {
@ -150,21 +158,20 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
(nameof(DevLead), nameof(DevLead.Plan)) => EventType.NewAskPlan, (nameof(DevLead), nameof(DevLead.Plan)) => EventType.NewAskPlan,
(nameof(Developer), nameof(Developer.Implement)) => EventType.NewAskImplement, (nameof(Developer), nameof(Developer.Implement)) => EventType.NewAskImplement,
_ => EventType.NewAsk _ => EventType.NewAsk
};
var data = new Dictionary<string, string>
{
{ "org", org },
{ "repo", repo },
{ "issueNumber", issueNumber.ToString() },
{ "parentNumber", parentNumber?.ToString()}
}; };
await stream.OnNextAsync(new Event await stream.OnNextAsync(new Event
{ {
Type = eventType, Type = eventType,
Message = input, Message = input,
Org = org, Data = data
Repo = repo,
IssueNumber = issueNumber
}); });
// else if (skillName == "Repo" && functionName == "Ingest")
// {
// var ingestor = _grains.GetGrain<IIngestRepo>(suffix);
// await ingestor.IngestionFlow(org, repo, "main");
// }
} }
catch (System.Exception) catch (System.Exception)
{ {

View File

@ -115,7 +115,7 @@ public class DeveloperLead : SemanticPersona
switch (item.Type) switch (item.Type)
{ {
case EventType.NewAsk: case EventType.NewAsk:
await CreateIssue(item.Org, item.Repo, item.IssueNumber, item.Message); await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
break; break;
case EventType.NewAskPlan: case EventType.NewAskPlan:
await CreatePlan(item.Message); await CreatePlan(item.Message);

View File

@ -80,7 +80,7 @@ public class Dev : SemanticPersona
switch (item.Type) switch (item.Type)
{ {
case EventType.NewAsk: case EventType.NewAsk:
await CreateIssue(item.Org, item.Repo, item.IssueNumber, item.Message); await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
break; break;
case EventType.NewAskImplement: case EventType.NewAskImplement:
await GenerateCode(item.Message); await GenerateCode(item.Message);

View File

@ -42,7 +42,7 @@ public class ProductManager : SemanticPersona
switch (item.Type) switch (item.Type)
{ {
case EventType.NewAsk: case EventType.NewAsk:
await CreateIssue(item.Org, item.Repo, item.IssueNumber, item.Message); await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
break; break;
case EventType.NewAskReadme: case EventType.NewAskReadme:
await CreateReadme(item.Message); await CreateReadme(item.Message);

View File

@ -7,11 +7,7 @@ public class Event
[Id(1)] [Id(1)]
public string Message { get; set; } public string Message { get; set; }
[Id(2)] [Id(2)]
public string Org { get; set; } public Dictionary<string,string> Data { get; set; }
[Id(3)]
public string Repo { get; set; }
[Id(4)]
public long IssueNumber { get; set; }
} }
public enum EventType public enum EventType

View File

@ -110,9 +110,9 @@ public class GithubService : IManageGithub
var newIssue = new NewIssue($"{request.Label} chain for #{request.ParentNumber}") var newIssue = new NewIssue($"{request.Label} chain for #{request.ParentNumber}")
{ {
Body = request.Input, Body = request.Input,
}; };
newIssue.Labels.Add(request.Label); newIssue.Labels.Add(request.Label);
newIssue.Labels.Add($"Parent.{request.ParentNumber}");
var issue = await _ghClient.Issue.Create(request.Org, request.Repo, newIssue); var issue = await _ghClient.Issue.Create(request.Org, request.Repo, newIssue);
var commentBody = $" - [ ] #{issue.Number} - tracks {request.Label}"; var commentBody = $" - [ ] #{issue.Number} - tracks {request.Label}";
var comment = await _ghClient.Issue.Comment.Create(request.Org, request.Repo, (int)request.ParentNumber, commentBody); var comment = await _ghClient.Issue.Comment.Create(request.Org, request.Repo, (int)request.ParentNumber, commentBody);