Skip to content

Commit

Permalink
Features/agent tables refactoring (#2923)
Browse files Browse the repository at this point in the history
<!-- Thank you for submitting a Pull Request. If you're new to
contributing to BCApps please read our pull request guideline below
* https://github.com/microsoft/BCApps/Contributing.md
-->
#### Summary <!-- Provide a general summary of your changes -->

This PR focuses on refactoring virtual tables the app depends on.
It mainly consists of renaming timeline-related tables and adjusting
fields so that the timeline uses the new log entry table instead of
agent task steps:

- Rename `Agent Task Timeline Entry` -> `Agent Task Timeline Step`. This
also changes fields that reference `Agent Task Step` to reference `Agent
Task Log Entry` instead.
- Rename `Agent Task Timeline Entry Step` -> `Agent Task Timeline Step
Detail`.
- Rename internal `Agent Task Step Group Data` -> `Agent Task Timeline
Step Data`.

#### Work Item(s) <!-- Add the issue number here after the #. The issue
needs to be open and approved. Submitting PRs with no linked issues or
unapproved issues is highly discouraged. -->
Fixes
[AB#565441](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/565441)

---------

Co-authored-by: Esteban Ardaya Heckl <[email protected]>
  • Loading branch information
esardaya and Esteban Ardaya Heckl authored Feb 12, 2025
1 parent e07f264 commit f72a4b0
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 125 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,30 +26,30 @@ codeunit 4300 "Agent Task Impl."

procedure GetStepsDoneCount(var AgentTask: Record "Agent Task"): Integer
var
AgentTaskStep: Record "Agent Task Step";
AgentTaskLogEntry: Record "Agent Task Log Entry";
begin
AgentTaskStep.SetRange("Task ID", AgentTask."ID");
AgentTaskStep.ReadIsolation := IsolationLevel::ReadCommitted;
exit(AgentTaskStep.Count());
AgentTaskLogEntry.SetRange("Task ID", AgentTask."ID");
AgentTaskLogEntry.ReadIsolation := IsolationLevel::ReadCommitted;
exit(AgentTaskLogEntry.Count());
end;

procedure GetDetailsForAgentTaskStep(var AgentTaskStep: Record "Agent Task Step"): Text
procedure GetDetailsForAgentTaskLogEntry(var AgentTaskLogEntry: Record "Agent Task Log Entry"): Text
var
ContentInStream: InStream;
ContentText: Text;
begin
AgentTaskStep.CalcFields(Details);
AgentTaskStep.Details.CreateInStream(ContentInStream, GetDefaultEncoding());
AgentTaskLogEntry.CalcFields(Details);
AgentTaskLogEntry.Details.CreateInStream(ContentInStream, GetDefaultEncoding());
ContentInStream.Read(ContentText);
exit(ContentText);
end;

procedure ShowTaskSteps(var AgentTask: Record "Agent Task")
procedure ShowTaskLogEntries(var AgentTask: Record "Agent Task")
var
AgentTaskStep: Record "Agent Task Step";
AgentTaskLogEntry: Record "Agent Task Log Entry";
begin
AgentTaskStep.SetRange("Task ID", AgentTask.ID);
Page.Run(Page::"Agent Task Step List", AgentTaskStep);
AgentTaskLogEntry.SetRange("Task ID", AgentTask.ID);
Page.Run(Page::"Agent Task Log Entry List", AgentTaskLogEntry);
end;

procedure CreateTask(AgentSecurityID: Guid; TaskTitle: Text[150]; ExternalId: Text[2048]; var NewAgentTask: Record "Agent Task")
Expand Down Expand Up @@ -98,43 +98,44 @@ codeunit 4300 "Agent Task Impl."
StartTaskIfPossible(AgentTask);
end;

procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step")
procedure CreateUserIntervention(UserInterventionRequestEntry: Record "Agent Task Log Entry")
begin
CreateUserInterventionTaskStep(UserInterventionRequestStep, '', -1);
CreateUserIntervention(UserInterventionRequestEntry, '', -1);
end;

procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; UserInput: Text)
procedure CreateUserIntervention(UserInterventionRequestEntry: Record "Agent Task Log Entry"; UserInput: Text)
begin
CreateUserInterventionTaskStep(UserInterventionRequestStep, UserInput, -1);
CreateUserIntervention(UserInterventionRequestEntry, UserInput, -1);
end;

procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; SelectedSuggestionId: Integer)
procedure CreateUserIntervention(UserInterventionRequestEntry: Record "Agent Task Log Entry"; SelectedSuggestionId: Integer)
begin
CreateUserInterventionTaskStep(UserInterventionRequestStep, '', SelectedSuggestionId);
CreateUserIntervention(UserInterventionRequestEntry, '', SelectedSuggestionId);
end;

procedure CreateUserInterventionTaskStep(UserInterventionRequestStep: Record "Agent Task Step"; UserInput: Text; SelectedSuggestionId: Integer)
procedure CreateUserIntervention(UserInterventionRequestEntry: Record "Agent Task Log Entry"; UserInput: Text; SelectedSuggestionId: Integer)
var
AgentTask: Record "Agent Task";
AgentTaskStep: Record "Agent Task Step";
DetailsOutStream: OutStream;
DetailsJson: JsonObject;
AgentALFunctions: DotNet AgentALFunctions;
UserIntervention: DotNet "AgentTaskUserIntervention";
begin
AgentTask.Get(UserInterventionRequestStep."Task ID");
AgentTask.Get(UserInterventionRequestEntry."Task ID");

AgentTaskStep."Task ID" := AgentTask.ID;
AgentTaskStep."Type" := AgentTaskStep."Type"::"User Intervention";
AgentTaskStep.Description := 'User intervention';
DetailsJson.Add('interventionRequestStepNumber', UserInterventionRequestStep."Step Number");
UserIntervention := UserIntervention.AgentTaskUserInterventionDetails();
if UserInput <> '' then
DetailsJson.Add('userInput', UserInput);
UserIntervention.UserInput := UserInput;
if SelectedSuggestionId >= 0 then
DetailsJson.Add('selectedSuggestionId', SelectedSuggestionId);
AgentTaskStep.CalcFields(Details);
Clear(AgentTaskStep.Details);
AgentTaskStep.Details.CreateOutStream(DetailsOutStream, GetDefaultEncoding());
DetailsJson.WriteTo(DetailsOutStream);
AgentTaskStep.Insert();
UserIntervention.SelectedSuggestionId := SelectedSuggestionId;
AgentALFunctions.CreateAgentTaskUserIntervention(AgentTask."Agent User Security ID", AgentTask.ID, UserInterventionRequestEntry.ID, UserIntervention);
end;

procedure GetUserInterventionRequestDetails(UserInterventionRequestEntry: Record "Agent Task Log Entry"; var UserInterventionRequest: DotNet "AgentTaskUserInterventionRequest")
var
AgentTask: Record "Agent Task";
AgentALFunctions: DotNet AgentALFunctions;
begin
AgentTask.Get(UserInterventionRequestEntry."Task ID");
UserInterventionRequest := AgentALFunctions.GetAgentTaskUserInterventionRequest(AgentTask."Agent User Security ID", AgentTask.ID, UserInterventionRequestEntry.ID);
end;

procedure StopTask(var AgentTask: Record "Agent Task"; AgentTaskStatus: enum "Agent Task Status"; UserConfirm: Boolean)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ page 4300 "Agent Task List"
ModifyAllowed = false;
DeleteAllowed = false;
AdditionalSearchTerms = 'Agent Tasks, Agent Task, Agent, Agent Log, Agent Logs';
SourceTableView = sorting("Last Step Timestamp") order(descending);
SourceTableView = sorting("Last Log Entry Timestamp") order(descending);
InherentEntitlements = X;
InherentPermissions = X;

Expand All @@ -34,11 +34,11 @@ page 4300 "Agent Task List"
{
Caption = 'Title';
}
field(LastStepTimestamp; Rec."Last Step Timestamp")
field(LastLogEntryTimestamp; Rec."Last Log Entry Timestamp")
{
Caption = 'Last Updated';
}
field(LastStepNumber; Rec."Last Step Number")
field(LastLogEntryId; Rec."Last Log Entry ID")
{
}
field(Status; Rec.Status)
Expand Down Expand Up @@ -73,7 +73,7 @@ page 4300 "Agent Task List"
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
begin
AgentTaskImpl.ShowTaskSteps(Rec);
AgentTaskImpl.ShowTaskLogEntries(Rec);
end;
}
field("Created By"; Rec."Created By Full Name")
Expand Down Expand Up @@ -113,18 +113,18 @@ page 4300 "Agent Task List"
ShowTaskMessages();
end;
}
action(ViewTaskSteps)
action(ViewTaskLogEntries)
{
ApplicationArea = All;
Caption = 'View steps';
ToolTip = 'Show steps for the selected task.';
Caption = 'View log entries';
ToolTip = 'Show log entries for the selected task.';
Image = TaskList;

trigger OnAction()
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
begin
AgentTaskImpl.ShowTaskSteps(Rec);
AgentTaskImpl.ShowTaskLogEntries(Rec);
end;
}
action(Stop)
Expand All @@ -150,7 +150,7 @@ page 4300 "Agent Task List"
actionref(ViewTaskMessage_Promoted; ViewTaskMessage)
{
}
actionref(ViewTaskSteps_Promoted; ViewTaskSteps)
actionref(ViewTaskLogEntries_Promoted; ViewTaskLogEntries)
{
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,18 @@

namespace System.Agents;

page 4303 "Agent Task Step List"
#pragma warning disable AS0125
page 4303 "Agent Task Log Entry List"
{
PageType = List;
ApplicationArea = All;
SourceTable = "Agent Task Step";
Caption = 'Agent Task Steps';
SourceTable = "Agent Task Log Entry";
Caption = 'Agent Task Log';
InsertAllowed = false;
ModifyAllowed = false;
DeleteAllowed = false;
Editable = false;
SourceTableView = sorting("Step Number") order(descending);
SourceTableView = sorting("ID") order(descending);
Extensible = false;
InherentEntitlements = X;
InherentPermissions = X;
Expand All @@ -24,17 +25,31 @@ page 4303 "Agent Task Step List"
{
area(Content)
{
repeater(AgentConversationActionLog)
repeater(LogEntries)
{
field(StepNumber; Rec."Step Number")
field(ID; Rec."ID")
{
Caption = 'Step Number';
Caption = 'ID';
ToolTip = 'Specifies the unique identifier of the log entry.';
}
field(TaskID; Rec."Task ID")
{
Visible = false;
Caption = 'Task ID';
}
field(Type; Rec.Type)
{
Caption = 'Type';
}
field(PageCaption; Rec."Page Caption")
{
Caption = 'Page Caption';
}
field("User Full Name"; Rec."User Full Name")
{
Caption = 'User Full Name';
Tooltip = 'Specifies the full name of the user that was involved in performing the step..';
}
field(Description; Rec.Description)
{
Caption = 'Description';
Expand All @@ -49,11 +64,6 @@ page 4303 "Agent Task Step List"
Message(DetailsTxt);
end;
}
field("User Full Name"; Rec."User Full Name")
{
Caption = 'User Full Name';
Tooltip = 'Specifies the full name of the user that was involved in performing the step..';
}
}
}
}
Expand All @@ -72,9 +82,10 @@ page 4303 "Agent Task Step List"
var
AgentTaskImpl: Codeunit "Agent Task Impl.";
begin
DetailsTxt := AgentTaskImpl.GetDetailsForAgentTaskStep(Rec);
DetailsTxt := AgentTaskImpl.GetDetailsForAgentTaskLogEntry(Rec);
end;

var
DetailsTxt: Text;
}
}
#pragma warning restore AS0125
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ permissionset 4300 "Agent - Objects"
page "Agent Task List" = X,
page "Agent Task Message Card" = X,
page "Agent Task Message List" = X,
page "Agent Task Step List" = X,
page "Agent Task Log Entry List" = X,
codeunit "Agent Impl." = X,
codeunit "Agent Task" = X;
}
44 changes: 22 additions & 22 deletions src/System Application/App/Agent/TaskPane/AgentTaskDetails.Page.al
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ page 4313 "Agent Task Details"
{
PageType = ListPart;
ApplicationArea = All;
SourceTable = "Agent Task Timeline Entry Step";
Caption = 'Agent Task Timeline Entry Step';
SourceTable = "Agent Task Timeline Step Det.";
Caption = 'Agent Task Timeline Step Details';
Editable = false;
InsertAllowed = false;
ModifyAllowed = false;
Expand All @@ -23,7 +23,7 @@ page 4313 "Agent Task Details"
{
area(content)
{
repeater(Steps)
repeater(Details)
{
field(ClientContext; ClientContext)
{
Expand All @@ -44,19 +44,19 @@ page 4313 "Agent Task Details"
#pragma warning restore AW0005
{
Caption = 'Confirm';
ToolTip = 'Confirms the timeline entry.';
ToolTip = 'Confirms the timeline step.';

trigger OnAction()
begin
AddUserInterventionTaskStep();
AddUserIntervention();
end;
}
#pragma warning disable AW0005
action(DiscardStep)
#pragma warning restore AW0005
{
Caption = 'Discard step';
ToolTip = 'Discard the timeline entry.';
ToolTip = 'Discard the timeline step.';
trigger OnAction()
begin
SkipStep();
Expand Down Expand Up @@ -84,39 +84,39 @@ page 4313 "Agent Task Details"
end;
end;

local procedure AddUserInterventionTaskStep()
local procedure AddUserIntervention()
var
UserInterventionRequestStep: Record "Agent Task Step";
TaskTimelineEntry: Record "Agent Task Timeline Entry";
UserInterventionRequestEntry: Record "Agent Task Log Entry";
TaskTimelineStep: Record "Agent Task Timeline Step";
UserInput: Text;
begin
TaskTimelineEntry.SetRange("Task ID", Rec."Task ID");
TaskTimelineEntry.SetRange(ID, Rec."Timeline Entry ID");
TaskTimelineEntry.SetRange("Last Step Type", TaskTimelineEntry."Last Step Type"::"User Intervention Request");
if TaskTimelineEntry.FindLast() then begin
case TaskTimelineEntry."User Intervention Request Type" of
TaskTimelineEntry."User Intervention Request Type"::ReviewMessage:
TaskTimelineStep.SetRange("Task ID", Rec."Task ID");
TaskTimelineStep.SetRange(ID, Rec."Timeline Step ID");
TaskTimelineStep.SetRange("Last Log Entry Type", "Agent Task Log Entry Type"::"User Intervention Request");
if TaskTimelineStep.FindLast() then begin
case TaskTimelineStep."User Intervention Request Type" of
TaskTimelineStep."User Intervention Request Type"::ReviewMessage:
UserInput := '';
else
UserInput := UserMessage; //ToDo: Will be implemented when we have a message field.
end;
if UserInterventionRequestStep.Get(TaskTimelineEntry."Task ID", TaskTimelineEntry."Last Step Number") then
AgentTaskImpl.CreateUserInterventionTaskStep(UserInterventionRequestStep, UserInput);
if UserInterventionRequestEntry.Get(TaskTimelineStep."Task ID", TaskTimelineStep."Last Log Entry ID") then
AgentTaskImpl.CreateUserIntervention(UserInterventionRequestEntry, UserInput);
end;
end;

local procedure SkipStep()
var
TaskTimelineEntry: Record "Agent Task Timeline Entry";
TaskTimelineStep: Record "Agent Task Timeline Step";
AgentTaskMessage: Record "Agent Task Message";
begin

if not TaskTimelineEntry.Get(Rec."Task ID", Rec."Timeline Entry ID") then
if not TaskTimelineStep.Get(Rec."Task ID", Rec."Timeline Step ID") then
exit;

case TaskTimelineEntry.Type of
TaskTimelineEntry.Type::OutputMessage:
if AgentTaskMessage.Get(TaskTimelineEntry."Primary Page Record ID") then begin
case TaskTimelineStep.Type of
"Agent Task Timeline Step Type"::OutputMessage:
if AgentTaskMessage.Get(TaskTimelineStep."Primary Page Record ID") then begin
AgentTaskMessage.Status := AgentTaskMessage.Status::Discarded;
AgentTaskMessage.Modify(true);
end;
Expand Down
Loading

0 comments on commit f72a4b0

Please sign in to comment.