597a142f by Ean Schuessler

Add agent runtime infrastructure

- AgentEntities.xml: Entity extensions for agent tasks
- AgentServices.xml: Agent runner, client, and queue services
- AgentData.xml: Scheduled job, user, and AI config seed data
1 parent ba87ad1f
<?xml version="1.0" encoding="UTF-8"?>
<entity-facade-xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://moqui.org/xsd/entity-facade-3.xsd" type="seed">
<!-- ========================================================= -->
<!-- Agent Runtime Scheduled Job -->
<!-- ========================================================= -->
<moqui.service.ScheduledJob
jobName="AgentQueuePoller"
description="Polls Agent Queue and processes pending tasks"
serviceName="AgentServices.poll#AgentQueue"
cronExpression="0/30 * * * * ?"
runAsUser="ADMIN"
paused="N"/>
<!-- ========================================================= -->
<!-- Agent User Account (for authentication) -->
<!-- ========================================================= -->
<moqui.security.UserAccount
userId="AGENT_CLAUDE"
username="agent-claude"
currentPassword="16ac58bbfa332c1c55bd98b53e60720bfa90d394"
passwordHashType="SHA"
enabled="Y"
description="Agent user for AI runtime"/>
<moqui.security.UserGroup userGroupId="AgentUsers" description="AI Agent Users"/>
<moqui.security.UserGroupMember userGroupId="AgentUsers" userId="AGENT_CLAUDE" fromDate="2026-02-04 00:00:00.000"/>
<!-- Agent users have permission to execute the delegation service -->
<moqui.security.ArtifactGroup artifactGroupId="AgentDelegationServices" description="Agent Tool Delegation Services"/>
<moqui.security.ArtifactGroupMember artifactGroupId="AgentDelegationServices" artifactName="AgentServices.call#McpToolWithDelegation" artifactTypeEnumId="AT_SERVICE"/>
<moqui.security.ArtifactAuthz userGroupId="AgentUsers" artifactGroupId="AgentDelegationServices" authzTypeEnumId="AUTHZT_ALLOW" authzActionEnumId="AUTHZA_ALL"/>
<!-- ========================================================= -->
<!-- Sample AI Configuration (for testing) -->
<!-- ========================================================= -->
<!-- Using localhost:11434 for Ollama (if available) -->
<!-- Or configure for your VLLM/OpenAI endpoint -->
<moqui.mcp.agent.ProductStoreAiConfig
productStoreId="POPCOMMERCE_RETAIL"
aiConfigId="DEFAULT"
serviceTypeEnumId="AistOllama"
description="Default AI Config for Testing (Ollama)"
endpointUrl="http://localhost:11434/v1"
modelName="llama3.2:3b"
temperature="0.7"
maxTokens="2048"
/>
</entity-facade-xml>
<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://moqui.org/xsd/entity-definition-3.xsd">
<!-- ========================================================= -->
<!-- System Message Extensions for Agent Tasks -->
<!-- ========================================================= -->
<extend-entity entity-name="SystemMessage" package="moqui.service.message">
<field name="requestedByPartyId" type="id">
<description>The human user (Party) who requested this agent task.</description>
</field>
<field name="effectiveUserId" type="id">
<description>The UserAccount ID to impersonate during execution (RBAC context).</description>
</field>
<field name="productStoreId" type="id">
<description>The context ProductStore for this task (determines AI config).</description>
</field>
<field name="aiConfigId" type="id">
<description>Specific AI configuration used for this task.</description>
</field>
<relationship type="one" title="RequestedBy" related="mantle.party.Party">
<key-map field-name="requestedByPartyId" related="partyId"/>
</relationship>
<!-- Note: effectiveUserId links to UserAccount, but we don't force FK to allow system users -->
<relationship type="one" related="mantle.product.store.ProductStore">
<key-map field-name="productStoreId"/>
</relationship>
<relationship type="one" related="moqui.mcp.agent.ProductStoreAiConfig">
<key-map field-name="productStoreId"/>
<key-map field-name="aiConfigId"/>
</relationship>
</extend-entity>
<!-- ========================================================= -->
<!-- AI Gateway Configuration (Per Store) -->
<!-- ========================================================= -->
<entity entity-name="ProductStoreAiConfig" package="moqui.mcp.agent">
<description>Configures AI Service Providers (OpenAI, VLLM, etc.) per Product Store.</description>
<field name="productStoreId" type="id" is-pk="true"/>
<field name="aiConfigId" type="id" is-pk="true"/>
<field name="serviceTypeEnumId" type="id"/>
<field name="description" type="text-medium"/>
<!-- Connection Details -->
<field name="endpointUrl" type="text-medium"/>
<field name="apiKey" type="text-medium" encrypt="true"/>
<field name="organizationId" type="text-short"/>
<!-- Model Parameters -->
<field name="modelName" type="text-short"/>
<field name="temperature" type="number-decimal"/>
<field name="maxTokens" type="number-integer"/>
<!-- System Prompt Template -->
<field name="systemMessageId" type="id">
<description>Template for the system prompt (instruction set)</description>
</field>
<relationship type="one" related="mantle.product.store.ProductStore">
<key-map field-name="productStoreId"/>
</relationship>
<relationship type="one" title="AiServiceType" related="moqui.basic.Enumeration">
<key-map field-name="serviceTypeEnumId" related="enumId"/>
</relationship>
<relationship type="one" title="PromptTemplate" related="moqui.service.message.SystemMessage">
<key-map field-name="systemMessageId"/>
</relationship>
<seed-data>
<!-- AI Service Types -->
<moqui.basic.EnumerationType description="AI Service Type" enumTypeId="AiServiceType"/>
<moqui.basic.Enumeration enumId="AistOpenAi" description="OpenAI" enumTypeId="AiServiceType"/>
<moqui.basic.Enumeration enumId="AistVllm" description="VLLM (OpenAI Compatible)" enumTypeId="AiServiceType"/>
<moqui.basic.Enumeration enumId="AistAnthropic" description="Anthropic" enumTypeId="AiServiceType"/>
<moqui.basic.Enumeration enumId="AistOllama" description="Ollama" enumTypeId="AiServiceType"/>
<!-- Agent Task Message Type -->
<moqui.basic.Enumeration enumId="SmtyAgentTask" description="Agent Task" enumTypeId="SystemMessageType"/>
<!-- AI Product Store Settings -->
<moqui.basic.Enumeration enumId="AiEndpointUrl" description="AI Endpoint URL" enumTypeId="ProductStoreSettingType"/>
<moqui.basic.Enumeration enumId="AiApiKey" description="AI API Key" enumTypeId="ProductStoreSettingType"/>
<moqui.basic.Enumeration enumId="AiModelName" description="AI Model Name" enumTypeId="ProductStoreSettingType"/>
<moqui.basic.Enumeration enumId="AiTemperature" description="AI Temperature" enumTypeId="ProductStoreSettingType"/>
</seed-data>
</entity>
</entities>