From 77404d165c9a8abf3bebc7c736dbb9b52ae53e26 Mon Sep 17 00:00:00 2001
From: Chris <66376200+crickman@users.noreply.github.com>
Date: Tue, 30 Sep 2025 14:56:14 -0700
Subject: [PATCH] .NET Workflows - Code Generation for Declarative Workflow
(#655)
* Notes
* Readme typo
* Update readme
* Checkpoint
* Namespace fix
* Fix ID and namespace
* Checkpoint
* Verified
* Comments
* Isolate "Kit"
* Address note: static
* Checkpoint
* Checkpoint "Executor<>"
* Prefix and internal executors
* Test passing
* Cleanup
* Rename "session" concept
* Revert workflow debug
* Fix template base / pragma
* Tune system scope
* Update dotnet/src/Microsoft.Agents.Workflows.Declarative/CodeGen/ResetVariableTemplate.tt
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Fix empty template
* Add validation for codegen ut
* Fix test
* Codegen baselines
* Constant
* Prep
* Mark TODO
* Fix
* Namespace
* One more
* Update baselines
* Checkpoint
* Checkpoint
* Checkpoint
* fme
* Checkpoint
* Another step
* Fixed up
* Roslyn
* Fix
* More cleaning
* Async
* Fix
* Enum checkpoint
* Refine enum
* Checkpoint
* Sync templates
* Checkpoint
* Streamline
* Pre-merge analyzer updates
* Foreach
* Placeholders
* Checkpoint
* Clean-up
* Sample path resolution
* Checkpoint
* Checkpoint - Workflow Code Building
* Validation
* Test cleanup
* Update test basline
* Update test baseline
* Fix DefaultTemplate usage
* Validation checkpoint
* Fix break/continue edges
* Verify generated code builds
* Fix merge
* Fix build validation
* Update template handling of literal string values.
* Test for metadata case
* Update baselines
* Fix merge
* Checkpoint
* Checkpoint: Conditions
* Invoke Agent Checkpoint
* Namespace
* Address code-analysis issues
* Cross platform test support
* Invoke agent checkpoint
* Clean sample
* Checkpoint: Agent Invoke Input Messages
* Checkpoint - Passing
* Checkpoint
* Regenerate all template + port conversation fix
* Checkpoint: Tests good
* Fix test for unbuntu
* Fix build command
* Checkpoint - E2E
* Test fix
* Update integration tests
* Fix merge
* Update
* Checkpoint !!!
* Baby steps
* Checkpoint
* Checkpoint E2E !!!
* So close...
* Integrate test validation
* Fix merge
* Rebase tests
* Namespace
* Namespace
* Test cleanup
* Sample comment cleanup
* Checkpoint: List conversion
* Include these
* CheckPoint: ParseValue
* Namespace
* Fix sampel
* More namspace
* Comments
* Test updates
* Test fix
* Better build
* Shared code
* Sort solution
* Fix build
* Prune solution
* One more
* Conversion matrix
* Final table conversion
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
dotnet/Directory.Packages.props | 3 +-
dotnet/agent-framework-dotnet.slnx | 3 +-
dotnet/eng/MSBuild/Shared.props | 3 +
.../Declarative/DeclarativeWorkflow.csproj | 1 -
.../DeclarativeCode/DeclarativeCode.csproj | 32 +
.../Workflows/DeclarativeCode/Generated.cs | 1351 ++++++++
.../Workflows/DeclarativeCode/Program.cs | 251 ++
.../DeclarativeEject/DeclarativeEject.csproj | 32 +
.../Workflows/DeclarativeEject/Program.cs | 103 +
.../CodeGen/ActionTemplate.cs | 27 +
.../CodeGen/AddConversationMessageTemplate.cs | 2791 +++++++++++++++++
.../CodeGen/AddConversationMessageTemplate.tt | 57 +
.../AddConversationMessageTemplateCode.cs | 31 +
.../CodeGen/ClearAllVariablesTemplate.cs | 2711 ++++++++++++++++
.../CodeGen/ClearAllVariablesTemplate.tt | 18 +
.../CodeGen/ClearAllVariablesTemplateCode.cs | 25 +
.../CodeGen/CodeTemplate.cs | 345 ++
.../CodeGen/ConditionGroupTemplate.cs | 2748 ++++++++++++++++
.../CodeGen/ConditionGroupTemplate.tt | 31 +
.../CodeGen/ConditionGroupTemplateCode.cs | 15 +
.../CopyConversationMessagesTemplate.cs | 2731 ++++++++++++++++
.../CopyConversationMessagesTemplate.tt | 26 +
.../CopyConversationMessagesTemplateCode.cs | 16 +
.../CodeGen/CreateConversationTemplate.cs | 2721 ++++++++++++++++
.../CodeGen/CreateConversationTemplate.tt | 17 +
.../CodeGen/CreateConversationTemplateCode.cs | 20 +
.../CodeGen/DefaultTemplate.cs | 66 +
.../CodeGen/DefaultTemplate.tt | 4 +
.../CodeGen/DefaultTemplateCode.cs | 21 +
.../CodeGen/EdgeTemplate.cs | 97 +
.../CodeGen/EdgeTemplate.tt | 10 +
.../CodeGen/EdgeTemplateCode.cs | 19 +
.../CodeGen/EditTableV2Template.cs | 2701 ++++++++++++++++
.../CodeGen/EditTableV2Template.tt | 15 +
.../CodeGen/EditTableV2TemplateCode.cs | 15 +
.../CodeGen/EmptyTemplate.cs | 66 +
.../CodeGen/EmptyTemplate.tt | 4 +
.../CodeGen/EmptyTemplateCode.cs | 23 +
.../CodeGen/ForeachTemplate.cs | 2782 ++++++++++++++++
.../CodeGen/ForeachTemplate.tt | 70 +
.../CodeGen/ForeachTemplateCode.cs | 20 +
.../CodeGen/InstanceTemplate.cs | 64 +
.../CodeGen/InstanceTemplate.tt | 3 +
.../CodeGen/InstanceTemplateCode.cs | 21 +
.../CodeGen/InvokeAzureAgentTemplate.cs | 2748 ++++++++++++++++
.../CodeGen/InvokeAzureAgentTemplate.tt | 43 +
.../CodeGen/InvokeAzureAgentTemplateCode.cs | 19 +
.../CodeGen/ParseValueTemplate.cs | 2777 ++++++++++++++++
.../CodeGen/ParseValueTemplate.tt | 29 +
.../CodeGen/ParseValueTemplateCode.cs | 40 +
.../CodeGen/ProviderTemplate.cs | 203 ++
.../CodeGen/ProviderTemplate.tt | 75 +
.../CodeGen/ProviderTemplateCode.cs | 48 +
.../CodeGen/QuestionTemplate.cs | 2701 ++++++++++++++++
.../CodeGen/QuestionTemplate.tt | 15 +
.../CodeGen/QuestionTemplateCode.cs | 15 +
.../CodeGen/ResetVariableTemplate.cs | 2717 ++++++++++++++++
.../CodeGen/ResetVariableTemplate.tt | 16 +
.../CodeGen/ResetVariableTemplateCode.cs | 19 +
.../RetrieveConversationMessageTemplate.cs | 2722 ++++++++++++++++
.../RetrieveConversationMessageTemplate.tt | 20 +
...RetrieveConversationMessageTemplateCode.cs | 16 +
.../RetrieveConversationMessagesTemplate.cs | 2732 ++++++++++++++++
.../RetrieveConversationMessagesTemplate.tt | 30 +
...etrieveConversationMessagesTemplateCode.cs | 27 +
.../CodeGen/RootTemplate.cs | 145 +
.../CodeGen/RootTemplate.tt | 40 +
.../CodeGen/RootTemplateCode.cs | 22 +
.../CodeGen/SendActivityTemplate.cs | 2762 ++++++++++++++++
.../CodeGen/SendActivityTemplate.tt | 34 +
.../CodeGen/SendActivityTemplateCode.cs | 15 +
.../CodeGen/SetMultipleVariablesTemplate.cs | 2727 ++++++++++++++++
.../CodeGen/SetMultipleVariablesTemplate.tt | 27 +
.../SetMultipleVariablesTemplateCode.cs | 15 +
.../CodeGen/SetTextVariableTemplate.cs | 2716 ++++++++++++++++
.../CodeGen/SetTextVariableTemplate.tt | 16 +
.../CodeGen/SetTextVariableTemplateCode.cs | 19 +
.../CodeGen/SetVariableTemplate.cs | 2718 ++++++++++++++++
.../CodeGen/SetVariableTemplate.tt | 17 +
.../CodeGen/SetVariableTemplateCode.cs | 18 +
.../Snippets/AssignVariableTemplate.tt | 12 +
.../EvaluateBoolExpressionTemplate.tt | 25 +
.../EvaluateEnumExpressionTemplate.tt | 41 +
.../Snippets/EvaluateIntExpressionTemplate.tt | 26 +
.../EvaluateListExpressionTemplate.tt | 26 +
.../EvaluateRecordExpressionTemplate.tt | 27 +
.../EvaluateStringExpressionTemplate.tt | 36 +
.../EvaluateValueExpressionTemplate.tt | 28 +
.../CodeGen/Snippets/FormatMessageTemplate.tt | 25 +
.../CodeGen/Snippets/Index.tt | 14 +
.../DeclarativeWorkflowBuilder.cs | 90 +-
.../DeclarativeWorkflowLanguage.cs | 24 +
.../Extensions/ChatMessageExtensions.cs | 2 +-
.../Extensions/DataValueExtensions.cs | 156 +-
.../Extensions/FormulaValueExtensions.cs | 2 +-
.../Extensions/IWorkflowContextExtensions.cs | 1 +
.../Extensions/JsonDocumentExtensions.cs | 99 +
.../Extensions/ObjectExtensions.cs | 200 ++
.../Extensions/RecordDataTypeExtensions.cs | 49 -
.../Extensions/StringExtensions.cs | 28 +
.../Interpreter/DeclarativeActionExecutor.cs | 3 +-
.../Interpreter/DeclarativeWorkflowContext.cs | 1 +
.../DeclarativeWorkflowExecutor.cs | 3 +-
.../Interpreter/DelegateActionExecutor.cs | 6 +-
.../Interpreter/InputPortAction.cs | 9 +
.../Interpreter/WorkflowActionVisitor.cs | 29 +-
.../Interpreter/WorkflowCodeBuilder.cs | 75 +
...ativeWorkflowModel.cs => WorkflowModel.cs} | 92 +-
.../Interpreter/WorkflowModelBuilder.cs | 34 +
.../Interpreter/WorkflowTemplateVisitor.cs | 479 +++
.../Kit/ActionExecutor.cs | 86 +
.../ActionExecutorResult.cs | 2 +-
.../Kit/AgentExecutor.cs | 39 +
.../Kit/DelegateExecutor.cs | 54 +
.../Kit/FormulaSession.cs | 13 +
.../Kit/IWorkflowContextExtensions.cs | 166 +
.../Kit/RootExecutor.cs | 121 +
.../{PowerFx => Kit}/UnassignedValue.cs | 2 +-
.../Kit/VariableType.cs | 131 +
...oft.Agents.AI.Workflows.Declarative.csproj | 17 +
.../ObjectModel/ConditionGroupExecutor.cs | 1 +
.../ObjectModel/ParseValueExecutor.cs | 52 +-
.../ObjectModel/QuestionExecutor.cs | 4 +-
.../PowerFx/SystemScope.cs | 1 +
.../PowerFx/TypeSchema.cs | 2 +-
.../PowerFx/WorkflowFormulaState.cs | 1 +
.../WorkflowAgentProvider.cs | 2 +-
dotnet/src/Shared/CodeTests/Compiler.cs | 74 +
.../DeclarativeCodeGenTest.cs | 57 +
.../Framework/WorkflowHarness.cs | 24 +
...kflows.Declarative.IntegrationTests.csproj | 2 +
.../Testcases/MathChat.json | 5 +-
.../AddConversationMessageTemplateTest.cs | 152 +
.../CodeGen/BreakLoopTemplateTest.cs | 44 +
.../CodeGen/ClearAllVariablesTemplateTest.cs | 76 +
.../CodeGen/ConditionGroupTemplateTest.cs | 108 +
.../CodeGen/ContinueLoopTemplateTest.cs | 44 +
.../CopyConversationMessagesTemplateTest.cs | 62 +
.../CodeGen/CreateConversationTemplateTest.cs | 83 +
.../CodeGen/DeclarativeEjectionTest.cs | 69 +
.../CodeGen/EdgeTemplateTest.cs | 28 +
.../CodeGen/EndConversationTest.cs | 44 +
.../CodeGen/EndDialogTest.cs | 44 +
.../CodeGen/ForeachTemplateTest.cs | 82 +
.../CodeGen/GotoTemplateTest.cs | 45 +
.../CodeGen/InvokeAzureAgentTemplateTest.cs | 156 +
.../CodeGen/ProviderTemplateTest.cs | 114 +
.../CodeGen/ResetVariableTemplateTest.cs | 49 +
...RetrieveConversationMessageTemplateTest.cs | 66 +
...etrieveConversationMessagesTemplateTest.cs | 137 +
.../SetMultipleVariablesTemplateTest.cs | 69 +
.../CodeGen/SetTextVariableTemplateTest.cs | 56 +
.../CodeGen/SetVariableTemplateTest.cs | 79 +
.../CodeGen/WorkflowActionTemplateTest.cs | 67 +
.../DeclarativeWorkflowTest.cs | 3 +-
.../Extensions/ObjectExtensionsTests.cs | 124 +
.../Extensions/StringExtensionsTests.cs | 2 +-
.../Interpreter/WorkflowModelTest.cs | 42 +-
....AI.Workflows.Declarative.UnitTests.csproj | 15 +-
.../ObjectModel/WorkflowActionExecutorTest.cs | 8 +-
.../UpdateBaseline.ps1 | 7 +
.../Workflows/ClearAllVariables.cs | 85 +
.../Workflows/Condition.cs | 180 ++
.../Workflows/ConditionElse.cs | 172 +
.../Workflows/EditTable.cs | 87 +
.../Workflows/EditTableV2.cs | 87 +
.../Workflows/EndConversation.cs | 94 +
.../Workflows/EndDialog.cs | 94 +
.../Workflows/Goto.cs | 143 +
.../Workflows/InvokeAgent.cs | 114 +
.../Workflows/InvokeAgent.yaml | 14 +
.../Workflows/LoopBreak.cs | 185 ++
.../Workflows/LoopContinue.cs | 185 ++
.../Workflows/LoopEach.cs | 181 ++
.../Workflows/ParseValue.cs | 106 +
.../Workflows/ParseValue.yaml | 7 +-
.../Workflows/ResetVariable.cs | 103 +
.../Workflows/SendActivity.cs | 110 +
.../Workflows/SetTextVariable.cs | 90 +
.../Workflows/SetVariable.cs | 87 +
workflow-samples/Marketing.yaml | 2 +-
181 files changed, 56682 insertions(+), 230 deletions(-)
create mode 100644 dotnet/samples/GettingStarted/Workflows/DeclarativeCode/DeclarativeCode.csproj
create mode 100644 dotnet/samples/GettingStarted/Workflows/DeclarativeCode/Generated.cs
create mode 100644 dotnet/samples/GettingStarted/Workflows/DeclarativeCode/Program.cs
create mode 100644 dotnet/samples/GettingStarted/Workflows/DeclarativeEject/DeclarativeEject.csproj
create mode 100644 dotnet/samples/GettingStarted/Workflows/DeclarativeEject/Program.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ActionTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/AddConversationMessageTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/AddConversationMessageTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/AddConversationMessageTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ClearAllVariablesTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ClearAllVariablesTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ClearAllVariablesTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CodeTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ConditionGroupTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ConditionGroupTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ConditionGroupTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CopyConversationMessagesTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CopyConversationMessagesTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CopyConversationMessagesTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CreateConversationTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CreateConversationTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/CreateConversationTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/DefaultTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/DefaultTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/DefaultTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EdgeTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EdgeTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EdgeTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EditTableV2Template.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EditTableV2Template.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EditTableV2TemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EmptyTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EmptyTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/EmptyTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ForeachTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ForeachTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ForeachTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InstanceTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InstanceTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InstanceTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InvokeAzureAgentTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InvokeAzureAgentTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/InvokeAzureAgentTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ParseValueTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ParseValueTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ParseValueTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ProviderTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ProviderTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ProviderTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/QuestionTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/QuestionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/QuestionTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ResetVariableTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ResetVariableTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/ResetVariableTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessageTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessageTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessageTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessagesTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessagesTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RetrieveConversationMessagesTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RootTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RootTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/RootTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SendActivityTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SendActivityTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SendActivityTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetMultipleVariablesTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetMultipleVariablesTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetMultipleVariablesTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetTextVariableTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetTextVariableTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetTextVariableTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetVariableTemplate.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetVariableTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/SetVariableTemplateCode.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/AssignVariableTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateBoolExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateEnumExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateIntExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateListExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateRecordExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateStringExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/EvaluateValueExpressionTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/FormatMessageTemplate.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/CodeGen/Snippets/Index.tt
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/DeclarativeWorkflowLanguage.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Extensions/JsonDocumentExtensions.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Extensions/ObjectExtensions.cs
delete mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Extensions/RecordDataTypeExtensions.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Interpreter/InputPortAction.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Interpreter/WorkflowCodeBuilder.cs
rename dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Interpreter/{DeclarativeWorkflowModel.cs => WorkflowModel.cs} (52%)
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Interpreter/WorkflowModelBuilder.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Interpreter/WorkflowTemplateVisitor.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/ActionExecutor.cs
rename dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/{Interpreter => Kit}/ActionExecutorResult.cs (93%)
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/AgentExecutor.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/DelegateExecutor.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/FormulaSession.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/IWorkflowContextExtensions.cs
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/RootExecutor.cs
rename dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/{PowerFx => Kit}/UnassignedValue.cs (86%)
create mode 100644 dotnet/src/Microsoft.Agents.AI.Workflows.Declarative/Kit/VariableType.cs
create mode 100644 dotnet/src/Shared/CodeTests/Compiler.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.IntegrationTests/DeclarativeCodeGenTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/AddConversationMessageTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/BreakLoopTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ClearAllVariablesTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ConditionGroupTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ContinueLoopTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/CopyConversationMessagesTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/CreateConversationTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/DeclarativeEjectionTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/EdgeTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/EndConversationTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/EndDialogTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ForeachTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/GotoTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/InvokeAzureAgentTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ProviderTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/ResetVariableTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/RetrieveConversationMessageTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/RetrieveConversationMessagesTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/SetMultipleVariablesTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/SetTextVariableTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/SetVariableTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/CodeGen/WorkflowActionTemplateTest.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Extensions/ObjectExtensionsTests.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/UpdateBaseline.ps1
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/ClearAllVariables.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/Condition.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/ConditionElse.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/EditTable.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/EditTableV2.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/EndConversation.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/EndDialog.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/Goto.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/InvokeAgent.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/InvokeAgent.yaml
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/LoopBreak.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/LoopContinue.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/LoopEach.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/ParseValue.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/ResetVariable.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/SendActivity.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/SetTextVariable.cs
create mode 100644 dotnet/tests/Microsoft.Agents.AI.Workflows.Declarative.UnitTests/Workflows/SetVariable.cs
diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props
index ef1eb280f0..bc0b0dd0db 100644
--- a/dotnet/Directory.Packages.props
+++ b/dotnet/Directory.Packages.props
@@ -107,7 +107,8 @@
-
+
+
all
diff --git a/dotnet/agent-framework-dotnet.slnx b/dotnet/agent-framework-dotnet.slnx
index db6552a9c8..246768b367 100644
--- a/dotnet/agent-framework-dotnet.slnx
+++ b/dotnet/agent-framework-dotnet.slnx
@@ -77,6 +77,8 @@
+
+
@@ -271,7 +273,6 @@
-
diff --git a/dotnet/eng/MSBuild/Shared.props b/dotnet/eng/MSBuild/Shared.props
index ffb4fc7269..54f93699ad 100644
--- a/dotnet/eng/MSBuild/Shared.props
+++ b/dotnet/eng/MSBuild/Shared.props
@@ -8,4 +8,7 @@
+
+
+
diff --git a/dotnet/samples/GettingStarted/Workflows/Declarative/DeclarativeWorkflow.csproj b/dotnet/samples/GettingStarted/Workflows/Declarative/DeclarativeWorkflow.csproj
index 52bc3c4328..37ba5f0f5b 100644
--- a/dotnet/samples/GettingStarted/Workflows/Declarative/DeclarativeWorkflow.csproj
+++ b/dotnet/samples/GettingStarted/Workflows/Declarative/DeclarativeWorkflow.csproj
@@ -25,7 +25,6 @@
-
diff --git a/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/DeclarativeCode.csproj b/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/DeclarativeCode.csproj
new file mode 100644
index 0000000000..c8321d553d
--- /dev/null
+++ b/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/DeclarativeCode.csproj
@@ -0,0 +1,32 @@
+
+
+
+ Exe
+ net9.0
+ net9.0
+ $(ProjectsDebugTargetFrameworks)
+ enable
+ disable
+ 5ee045b0-aea3-4f08-8d31-32d1a6f8fed0
+ $(NoWarn);CA1812
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/Generated.cs b/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/Generated.cs
new file mode 100644
index 0000000000..32ba92bb66
--- /dev/null
+++ b/dotnet/samples/GettingStarted/Workflows/DeclarativeCode/Generated.cs
@@ -0,0 +1,1351 @@
+// ------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// ------------------------------------------------------------------------------
+
+#nullable enable
+#pragma warning disable IDE0005 // Extra using directive is ok.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Agents.AI;
+using Microsoft.Agents.AI.Workflows;
+using Microsoft.Agents.AI.Workflows.Declarative;
+using Microsoft.Agents.AI.Workflows.Declarative.Kit;
+using Microsoft.Extensions.AI;
+
+namespace Test.WorkflowProviders;
+
+///
+/// This class provides a factory method to create a instance.
+///
+///
+/// The workflow defined here was generated from a declarative workflow definition.
+/// Declarative workflows utilize Power FX for defining conditions and expressions.
+/// To learn more about Power FX, see:
+/// https://learn.microsoft.com/power-platform/power-fx/formula-reference-copilot-studio
+///
+public static class TestWorkflowProvider
+{
+ ///
+ /// The root executor for a declarative workflow.
+ ///
+ internal sealed class WorkflowDemoRootExecutor(
+ DeclarativeWorkflowOptions options,
+ Func inputTransform) :
+ RootExecutor("workflow_demo_Root", options, inputTransform)
+ where TInput : notnull
+ {
+ protected override async ValueTask ExecuteAsync(TInput message, IWorkflowContext context, CancellationToken cancellationToken)
+ {
+ // Set environment variables
+ await this.InitializeEnvironmentAsync(
+ context,
+ "FOUNDRY_AGENT_RESEARCHWEB",
+ "FOUNDRY_AGENT_RESEARCHANALYST",
+ "FOUNDRY_AGENT_RESEARCHMANAGER",
+ "FOUNDRY_AGENT_RESEARCHWEATHER",
+ "FOUNDRY_AGENT_RESEARCHCODER").ConfigureAwait(false);
+
+ // Initialize variables
+ await context.QueueStateUpdateAsync("AgentResponse", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("AgentResponseText", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("AvailableAgents", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("FinalResponse", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("InputTask", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("InternalConversationId", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("NextSpeaker", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("Plan", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("ProgressLedgerUpdate", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("RestartCount", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("SeedTask", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("StallCount", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("TaskFacts", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("TaskInstructions", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("TeamDescription", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ await context.QueueStateUpdateAsync("TypedProgressLedger", UnassignedValue.Instance, "Local").ConfigureAwait(false);
+ }
+ }
+
+ ///
+ /// Assigns an evaluated expression, other variable, or literal value to the "Local.AvailableAgents" variable.
+ ///
+ internal sealed class SetvariableAaslmfExecutor(FormulaSession session) : ActionExecutor(id: "setVariable_aASlmF", session)
+ {
+ //
+ protected override async ValueTask