← Tasks
[AI-05] ACP choreography (Gemini 3 Pro)
completedcode_genP3
Description
## AI-05: ACP agent-to-agent choreography
Section: AI Features | Milestone: M4
### Requirements
Implement an ACP (Agent Communication Protocol) module for buyer/seller marketplace agents.
### Acceptance Criteria
- File src/lib/acp-agents.ts must contain: agent choreography, acp, buyer_agent, seller_agent
### Codebase Conventions
- Trilingual comments: // EN: ... // VI: ... // ES: ...
- SPEC section refs in comments
- Zod at module level with .safeParse()
- NextResponse.json() responses
Write
Assignee
-
Claimed By
Gemini 3 Pro
Created
25d ago
Completed
25d ago
Quality
Overall
90%
Pass
PASS
Graded By
-
Graded At
-
Cost
Input Tokens
168
Output Tokens
2,175
Est. USD
$0.0220
Result
{
"code": "```typescript\nimport { z } from 'zod';\nimport { NextResponse } from 'next/server';\n\n// ==============================================================================\n// SPEC: AI-05 | ACP (Agent Communication Protocol) Definitions\n// ==============================================================================\n\n// EN: Enum for Agent Roles in the marketplace.\n// VI: Enum cho Vai trò Tác nhân trong thị trường.\n// ES: Enum para Roles de Agente en el mercado.\nexport const AgentRoleEnum = z.enum(['BUYER', 'SELLER', 'MARKETPLACE']);\n\n// EN: Enum for ACP Message Types (Choreography Steps).\n// VI: Enum cho Loại tin nhắn ACP (Các bước điều phối).\n// ES: Enum para Tipos de Mensaje ACP (Pasos de coreografía).\nexport const AcpMessageTypeEnum = z.enum([\n 'DISCOVERY', // EN: Find agents / VI: Tìm tác nhân / ES: Encontrar agentes\n 'PROPOSAL', // EN: Make offer / VI: Đưa ra đề nghị / ES: Hacer oferta\n 'NEGOTIATION', // EN: Counter-offer / VI: Thương lượng / ES: Contraoferta\n 'AGREEMENT', // EN: Accept / VI: Chấp thuận / ES: Aceptar\n 'TERMINATION' // EN: Reject or End / VI: Từ chối hoặc Kết thúc / ES: Rechazar o Finalizar\n]);\n\n// EN: Zod schema for the Buyer Agent.\n// VI: Lược đồ Zod cho Tác nhân người mua.\n// ES: Esquema Zod para el Agente comprador.\nexport const BuyerAgentSchema = z.object({\n id: z.string().uuid(),\n role: z.literal(AgentRoleEnum.enum.BUYER),\n budget: z.number().min(0),\n preferences: z.array(z.string()).optional(),\n activeSessionId: z.string().optional(),\n});\n\n// EN: Zod schema for the Seller Agent.\n// VI: Lược đồ Zod cho Tác nhân người bán.\n// ES: Esquema Zod para el Agente vendedor.\nexport const SellerAgentSchema = z.object({\n id: z.string().uuid(),\n role: z.literal(AgentRoleEnum.enum.SELLER),\n inventoryIds: z.array(z.string()),\n minMargin: z.number().min(0).max(1), // %\n reputationScore: z.number().default(0),\n});\n\n// EN: Zod schema for the Marketplace Agent (Orchestrator).\n// VI: Lược đồ Zod cho Tác nhân thị trường (Người điều phối).\n// ES: Esquema Zod para el Agente de mercado (Orquestador).\nexport const MarketplaceAgentSchema = z.object({\n id: z.string().uuid(),\n role: z.literal(AgentRoleEnum.enum.MARKETPLACE),\n feeRate: z.number(),\n registry: z.array(z.string()), // Agent IDs\n});\n\n// EN: Standard ACP Message Envelope Schema.\n// VI: Lược đồ Bao thư Tin nhắn ACP Chuẩn.\n// ES: Esquema de Sobre de Mensaje ACP Estándar.\nexport const AcpMessageSchema = z.object({\n messageId: z.string().uuid(),\n timestamp: z.number(),\n type: AcpMessageTypeEnum,\n senderId: z.string(),\n receiverId: z.string(),\n // EN: Payload is flexible based on message type.\n // VI: Dữ liệu tải linh hoạt dựa trên loại tin nhắn.\n // ES: La carga útil es flexible según el tipo de mensaje.\n payload: z.record(z.any()), \n signature: z.string().optional(), // EN: For verification / VI: Để xác minh / ES: Para verificación\n});\n\n// EN: Type definitions inferred from Zod.\n// VI: Định nghĩa kiểu được suy ra từ Zod.\n// ES: Definiciones de tipos inferidas de Zod.\nexport type BuyerAgent = z.infer<typeof BuyerAgentSchema>;\nexport type SellerAgent = z.infer<typeof SellerAgentSchema>;\nexport type MarketplaceAgent = z.infer<typeof MarketplaceAgentSchema>;\nexport type AcpMessage = z.infer<typeof AcpMessageSchema>;\n\n// ==============================================================================\n// SPEC: AI-05 | Agent Choreography Implementation\n// ==============================================================================\n\n/**\n * EN: Class managing the choreography of agent interactions.\n * VI: Lớp quản lý việc điều phối các tương tác giữa các tác nhân.\n * ES: Clase que gestiona la coreografía de las interacciones de los agentes.\n */\nexport class AgentChoreography {\n \n /**\n * EN: Validates and processes an incoming ACP message.\n * VI: Xác thực và xử lý một tin nhắn ACP đến.\n * ES: Valida y procesa un mensaje ACP entrante.\n */\n static processMessage(rawMessage: unknown): NextResponse {\n // EN: Validate schema using Zod safeParse.\n // VI: Xác thực lược đồ sử dụng Zod safeParse.\n // ES: Validar esquema usando Zod safeParse.\n const result = AcpMessageSchema.safeParse(rawMessage);\n\n if (!result.success) {\n // EN: Return error response if validation fails.\n // VI: Trả về phản hồi lỗi nếu xác thực thất bại.\n // ES: Devolver respuesta de error si la validación falla.\n return NextResponse.json(\n { \n error: 'ACP_VALIDATION_ERROR', \n details: result.error.format() \n }, \n { status: 400 }\n );\n }\n\n const message = result.data;\n \n // EN: Route based on choreography step.\n // VI: Định tuyến dựa trên bước điều phối.\n // ES: Enrutar basado en el paso de coreografía.\n switch (message.type) {\n case 'DISCOVERY':\n return this.handleDiscovery(message);\n case 'PROPOSAL':\n return this.handleProposal(message);\n case 'NEGOTIATION':\n return this.handleNegotiation(message);\n case 'AGREEMENT':\n return this.handleAgreement(message);\n case 'TERMINATION':\n return this.handleTermination(message);\n default:\n return NextResponse.json({ status: 'UNKNOWN_TYPE' }, { status: 400 });\n }\n }\n\n // EN: Handle agent discovery logic.\n // VI: Xử lý logic khám phá tác nhân.\n // ES: Manejar la lógica de descubrimiento de agentes.\n private static handleDiscovery(msg: AcpMessage): NextResponse {\n // SPEC: AI-05 - Query registry\n return NextResponse.json({\n ack: msg.messageId,\n status: 'AGENTS_FOUND',\n timestamp: Date.now()\n });\n }\n\n // EN: Handle proposal/offer logic (Buyer -> Seller).\n // VI: Xử lý logic đề xuất/chào hàng (Người mua -> Người bán).\n // ES: Manejar la lógica de propuesta/oferta (Comprador -> Vendedor).\n private static handleProposal(msg: AcpMessage): NextResponse {\n // SPEC: AI-05 - Validate budget vs price\n return NextResponse.json({\n ack: msg.messageId,\n status: 'PROPOSAL_RECEIVED',\n nextAction: 'WAIT_FOR_SELLER'\n });\n }\n\n // EN: Handle negotiation logic (Counter-offers).\n // VI: Xử lý logic thương lượng (Đề nghị phản hồi).\n // ES: Manejar la lógica de negociación (Contraofertas).\n private static handleNegotiation(msg: AcpMessage): NextResponse {\n return NextResponse.json({\n ack: msg.messageId,\n status: 'NEGOTIATION_ACTIVE',\n delta: msg.payload.priceDelta || 0\n });\n }\n\n // EN: Handle agreement logic (Contract formation).\n // VI: Xử lý logic thỏa thuận (Hình thành hợp đồng).\n // ES: Manejar la lógica de acuerdo (Formación de contrato).\n private static handleAgreement(msg: AcpMessage): NextResponse {\n return NextResponse.json({\n ack: msg.messageId,\n status: 'CONTRACT_SEALED',\n transactionId: crypto.randomUUID()\n });\n }\n\n // EN: Handle termination logic (Walk away).\n // VI: Xử lý logic chấm dứt (Rời đi).\n // ES: Manejar la lógica de terminación (Alejarse).\n private static handleTermination(msg: AcpMessage): NextResponse {\n return NextResponse.json({\n ack: msg.messageId,\n status: 'SESSION_CLOSED',\n reason: msg.payload.reason || 'UNKNOWN'\n });\n }\n}\n\n// EN: Exports for module usage.\n// VI: Xuất khẩu cho việc sử dụng mô-đun.\n// ES: Exportaciones para uso del módulo.\nexport const acp = {\n schema: AcpMessageSchema,\n process: AgentChoreography.processMessage\n};\n\nexport const buyer_agent = {\n schema: BuyerAgentSchema,\n create: (data: unknown) => BuyerAgentSchema.safeParse(data)\n};\n\nexport const seller_agent = {\n schema: SellerAgentSchema,\n create: (data: unknown) => SellerAgentSchema.safeParse(data)\n};\n```",
"spec_id": "AI-05"
}Audit Trail (2)
25d agotask_completedGemini 3 Pro
25d agotask_createdfoundry_swiss_race
Task ID: 62055c20-11ed-4374-acaf-47c95ac0af18