5df8fd90c3
## Summary This PR significantly simplifies the AI chat architecture by removing complex routing/planning mechanisms and introduces clickable record links in AI responses. ## Changes ### AI Chat Architecture Simplification - **Removed** the entire `ai-chat-router` module (~850 lines) including: - Strategy decider service - Plan generator service - Complex routing logic - **Removed** agent execution planning services (~700 lines): - `agent-execution.service.ts` - `agent-plan-executor.service.ts` - `agent-tool-generator.service.ts` - **Added** centralized `ToolRegistryService` for tool management: - Builds searchable tool index (database, action, workflow tools) - Provides tool lookup by name - Supports agent search for loading expertise - **Added** `ChatExecutionService` as simple replacement: - Includes full tool catalog in system prompt - Pre-loads common tools (find/create/update for company, person, opportunity, task, note) - Uses `load_tools` mechanism for dynamic tool activation - Enables native web search by default ### Record References in AI Responses - Added `recordReferences` field to tool outputs for create, find, and update operations - Implemented `[[record:objectName:recordId:displayName]]` syntax for AI to reference records - Created `RecordLink` component that renders clickable chips with object icons - Integrated record link parsing into the markdown renderer - Users can now click directly on created/found records in AI responses ### Workflow Agent Fixes - Fixed cache invalidation issue when creating agents in workflows - Added default prompt for workflow-created agents to prevent validation errors - Relaxed agent validation to only check properties being updated (not all required properties) ### Code Quality Improvements - Extracted `getRecordDisplayName` utility that mirrors frontend's `getLabelIdentifierFieldValue` logic - Uses object metadata to determine the correct label identifier field - Handles `FULL_NAME` composite type for person/workspaceMember objects - Shared across create, find, and update record services ## Net Impact - **~1,200 lines deleted** (complex routing/planning code) - **~500 lines added** (simpler tool registry + record links) - Significantly reduced code complexity - Better tool discovery through full catalog in system prompt - Improved UX with clickable record references ## Testing - Typecheck passes - Lint passes - Manual testing of AI chat with record creation and linking
53 lines
2.2 KiB
TypeScript
53 lines
2.2 KiB
TypeScript
import { forwardRef, Module } from '@nestjs/common';
|
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
|
|
|
import { WorkspaceDomainsModule } from 'src/engine/core-modules/domain/workspace-domains/workspace-domains.module';
|
|
import { ToolProviderModule } from 'src/engine/core-modules/tool-provider/tool-provider.module';
|
|
import { UserWorkspaceModule } from 'src/engine/core-modules/user-workspace/user-workspace.module';
|
|
import { AiAgentModule } from 'src/engine/metadata-modules/ai/ai-agent/ai-agent.module';
|
|
import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity';
|
|
import { AiBillingModule } from 'src/engine/metadata-modules/ai/ai-billing/ai-billing.module';
|
|
import { AiModelsModule } from 'src/engine/metadata-modules/ai/ai-models/ai-models.module';
|
|
import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permissions.module';
|
|
import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity';
|
|
import { UserRoleModule } from 'src/engine/metadata-modules/user-role/user-role.module';
|
|
import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module';
|
|
|
|
import { AgentMessagePartEntity } from './entities/agent-message-part.entity';
|
|
import { AgentMessageEntity } from './entities/agent-message.entity';
|
|
import { AgentTurnEntity } from './entities/agent-turn.entity';
|
|
import { AgentActorContextService } from './services/agent-actor-context.service';
|
|
import { AgentAsyncExecutorService } from './services/agent-async-executor.service';
|
|
|
|
@Module({
|
|
imports: [
|
|
AiBillingModule,
|
|
AiModelsModule,
|
|
AiAgentModule,
|
|
WorkspaceDomainsModule,
|
|
UserWorkspaceModule,
|
|
UserRoleModule,
|
|
PermissionsModule,
|
|
WorkspaceCacheModule,
|
|
forwardRef(() => ToolProviderModule),
|
|
TypeOrmModule.forFeature([
|
|
AgentEntity,
|
|
AgentMessageEntity,
|
|
AgentMessagePartEntity,
|
|
AgentTurnEntity,
|
|
RoleTargetEntity,
|
|
]),
|
|
],
|
|
providers: [AgentAsyncExecutorService, AgentActorContextService],
|
|
exports: [
|
|
AgentAsyncExecutorService,
|
|
AgentActorContextService,
|
|
TypeOrmModule.forFeature([
|
|
AgentMessageEntity,
|
|
AgentMessagePartEntity,
|
|
AgentTurnEntity,
|
|
]),
|
|
],
|
|
})
|
|
export class AiAgentExecutionModule {}
|