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('.'))
.Where(parts => parts.Length == 2)
.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
// Issue 1
// Sub issue 2
@ -74,12 +75,12 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
if (issuesEvent.Action == IssuesAction.Opened)
{
_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)
{
_logger.LogInformation("Processing HandleClosingIssue");
await HandleClosingIssue(issueNumber, skillName, functionName, suffix, org, repo);
await HandleClosingIssue(issueNumber, parentNumber, suffix, org, repo);
}
}
catch (System.Exception)
@ -101,15 +102,17 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
var issueNumber = issueCommentEvent.Issue.Number;
var input = issueCommentEvent.Issue.Body;
// Assumes the label follows the following convention: Skill.Function example: PM.Readme
var labels = issueCommentEvent.Issue.Labels.First().Name.Split(".");
var skillName = labels[0];
var functionName = labels[1];
var labels = issueCommentEvent.Issue.Labels
.Select(l => l.Name.Split('.'))
.Where(parts => parts.Length == 2)
.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}";
// we only resond to non-bot comments
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)
@ -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 streamId = StreamId.Create(suffix, issueNumber.ToString());
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
{
Type = EventType.ChainClosed,
Org = org,
Repo = repo,
IssueNumber = issueNumber
Data = data
});
}
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
{
@ -150,21 +158,20 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
(nameof(DevLead), nameof(DevLead.Plan)) => EventType.NewAskPlan,
(nameof(Developer), nameof(Developer.Implement)) => EventType.NewAskImplement,
_ => EventType.NewAsk
};
var data = new Dictionary<string, string>
{
{ "org", org },
{ "repo", repo },
{ "issueNumber", issueNumber.ToString() },
{ "parentNumber", parentNumber?.ToString()}
};
await stream.OnNextAsync(new Event
{
Type = eventType,
Message = input,
Org = org,
Repo = repo,
IssueNumber = issueNumber
Data = data
});
// else if (skillName == "Repo" && functionName == "Ingest")
// {
// var ingestor = _grains.GetGrain<IIngestRepo>(suffix);
// await ingestor.IngestionFlow(org, repo, "main");
// }
}
catch (System.Exception)
{

View File

@ -115,7 +115,7 @@ public class DeveloperLead : SemanticPersona
switch (item.Type)
{
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;
case EventType.NewAskPlan:
await CreatePlan(item.Message);

View File

@ -80,7 +80,7 @@ public class Dev : SemanticPersona
switch (item.Type)
{
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;
case EventType.NewAskImplement:
await GenerateCode(item.Message);

View File

@ -42,7 +42,7 @@ public class ProductManager : SemanticPersona
switch (item.Type)
{
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;
case EventType.NewAskReadme:
await CreateReadme(item.Message);

View File

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

View File

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