← Tasks
[AI-05] Goldilocks Harsh Love (prose)
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
Team Harsh Love (prose)
Created
25d ago
Completed
25d ago
Quality
Overall
82%
Pass
PASS
Graded By
-
Graded At
-
Cost
Input Tokens
-
Output Tokens
-
Est. USD
$0.0127
Result
{
"code": "```typescript\n// EN: ACP Agents Module // VI: Módulo de agentes ACP // ES: Mô-đun ACP Agents\n// SPEC: AI-05\nimport { z } from 'zod';\n\n// EN: BuyerAgent Schema // VI: Lược đồ BuyerAgent // ES: Esquema de BuyerAgent\nconst BuyerAgentSchema = z.object({\n id: z.string(),\n budget: z.number().nonnegative(),\n desiredProduct: z.string().min(1),\n});\ntype BuyerAgent = z.infer<typeof BuyerAgentSchema>;\n\n// EN: SellerAgent Schema // VI: Lược đồ SellerAgent // ES: Esquema de SellerAgent\nconst SellerAgentSchema = z.object({\n id: z.string(),\n inventory: z.record(z.string(), z.number().int().nonnegative()), // EN: Inventory is now a record of product IDs to quantities // VI: Inventario ahora es un registro de IDs de productos a cantidades // ES: Kho hiện tại là một bản ghi ID sản phẩm đến số lượng\n priceList: z.record(z.string(), z.number().nonnegative()),\n});\ntype SellerAgent = z.infer<typeof SellerAgentSchema>;\n\n// EN: MarketplaceAgent Schema // VI: Lược đồ MarketplaceAgent // ES: Esquema de MarketplaceAgent\nconst MarketplaceAgentSchema = z.object({\n id: z.string(),\n commissionRate: z.number().nonnegative(),\n});\ntype MarketplaceAgent = z.infer<typeof MarketplaceAgentSchema>;\n\n// EN: createBuyerAgent Function // VI: Hàm createBuyerAgent // ES: Función createBuyerAgent\nfunction createBuyerAgent(id: string, budget: number, desiredProduct: string): BuyerAgent {\n // EN: Creates a new buyer agent. // VI: Tạo một tác nhân người mua mới. // ES: Crea un nuevo agente comprador.\n const buyerAgent: BuyerAgent = { id, budget, desiredProduct };\n const result = BuyerAgentSchema.safeParse(buyerAgent);\n if (!result.success) {\n throw new Error(`Invalid BuyerAgent data: ${result.error.message}`);\n }\n return buyerAgent;\n}\n\n// EN: createSellerAgent Function // VI: Hàm createSellerAgent // ES: Función createSellerAgent\nfunction createSellerAgent(id: string, inventory: Record<string, number>, priceList: Record<string, number>): SellerAgent {\n // EN: Creates a new seller agent. // VI: Tạo một tác nhân người bán mới. // ES: Crea un nuevo agente vendedor.\n const sellerAgent: SellerAgent = { id, inventory, priceList };\n const result = SellerAgentSchema.safeParse(sellerAgent);\n if (!result.success) {\n throw new Error(`Invalid SellerAgent data: ${result.error.message}`);\n }\n return sellerAgent;\n}\n\n// EN: ACP Message Types // VI: Tipos de mensajes ACP // ES: Loại tin nhắn ACP\nconst ACPMessageSchema = z.object({\n type: z.enum(['PROPOSE', 'ACCEPT', 'REJECT']),\n senderId: z.string(),\n receiverId: z.string(),\n productId: z.string(),\n price: z.number().nonnegative(),\n quantity: z.number().int().nonnegative().optional(), // EN: Optional quantity for proposals // VI: Cantidad opcional para propuestas // ES: Số lượng tùy chọn cho các đề xuất\n});\ntype ACPMessage = z.infer<typeof ACPMessageSchema>;\n\n// EN: handleTrade Function // VI: Función handleTrade // ES: Hàm handleTrade\nfunction handleTrade(\n buyer: BuyerAgent,\n seller: SellerAgent,\n message: ACPMessage,\n commissionRate: number\n): { success: boolean; message: string; commission?: number; } {\n // EN: Handles the agent communication protocol for a trade. // VI: Maneja el protocolo de comunicación del agente para un intercambio. // ES: Xử lý giao thức giao tiếp của tác nhân cho một giao dịch.\n\n const parsedMessage = ACPMessageSchema.safeParse(message);\n if (!parsedMessage.success) {\n return { success: false, message: `Invalid ACP message: ${parsedMessage.error.message}` };\n }\n\n if (message.type === 'PROPOSE') {\n if (buyer.budget < message.price * (message.quantity || 1)) {\n return { success: false, message: 'Buyer does not have sufficient funds.' };\n }\n\n if (!seller.inventory[message.productId] || seller.inventory[message.productId] < (message.quantity || 1)) {\n return { success: false, message: 'Seller does not have sufficient inventory.' };\n }\n\n if (seller.priceList[message.productId] > message.price * 1.10) { // EN: Seller rejects if offer is 10% below price list // VI: El vendedor rechaza si la oferta es 10% inferior a la lista de precios // ES: Người bán từ chối nếu giá thầu thấp hơn 10% so với bảng giá\n return {success: false, message: \"Seller rejects: Offer too low\"}\n }\n\n // EN: Seller accepts the proposal // VI: El vendedor acepta la propuesta // ES: Người bán chấp nhận đề xuất\n const commission = message.price * (message.quantity || 1) * commissionRate;\n return { success: true, message: `Trade successful. Commission: ${commission}`, commission: commission };\n\n\n } else if (message.type === 'ACCEPT') {\n // EN: In a real system, further validation would occur here to prevent race conditions. // VI: En un sistema real, se realizaría una validación adicional aquí para evitar condiciones de carrera. // ES: Trong một hệ thống thực, xác thực thêm sẽ xảy ra ở đây để ngăn chặn các điều kiện chạy đua.\n const commission = message.price * (message.quantity || 1) * commissionRate;\n return { success: true, message: `Trade successful. Commission: ${commission}`, commission: commission };\n } else if (message.type === 'REJECT') {\n return { success: false, message: 'Trade rejected by seller.' };\n }\n\n return { success: false, message: 'Unexpected message type.' };\n}\n\n// EN: simulateTrade Function // VI: Función simulateTrade // ES: Hàm simulateTrade\nfunction simulateTrade(\n buyerId: string,\n sellerId: string,\n productId: string,\n price: number,\n quantity: number,\n buyerBudget: number,\n sellerInventory: Record<string, number>,\n sellerPriceList: Record<string, number>,\n commissionRate: number\n): { success: boolean; message: string; commission?: number; } {\n // EN: Orchestrates the interaction between buyer, seller, and marketplace. // VI: Organiza la interacción entre el comprador, el vendedor y el mercado. // ES: Điều phối sự tương tác giữa người mua, người bán và thị trường.\n try {\n const buyer = createBuyerAgent(buyerId, buyerBudget, productId);\n const seller = createSellerAgent(sellerId, sellerInventory, sellerPriceList);\n\n // EN: Buyer proposes a trade // VI: El comprador propone un intercambio // ES: Người mua đề xuất một giao dịch\n const proposeMessage: ACPMessage = {\n type: 'PROPOSE',\n senderId: buyerId,\n receiverId: sellerId,\n productId: productId,\n price: price,\n quantity: quantity,\n };\n\n const transactionResult = handleTrade(buyer, seller, proposeMessage, commissionRate);\n\n return { success: transactionResult.success, message: transactionResult.message, commission: transactionResult.commission };\n } catch (error: any) {\n return { success: false, message: `Trade simulation error: ${error.message}` };\n }\n}\n\nexport {\n BuyerAgentSchema,\n SellerAgentSchema,\n MarketplaceAgentSchema,\n createBuyerAgent,\n createSellerAgent,\n handleTrade,\n simulateTrade,\n ACPMessageSchema,\n};\n\nexport type {\n BuyerAgent,\n SellerAgent,\n MarketplaceAgent,\n ACPMessage,\n};\n```",
"spec_id": "AI-05"
}Audit Trail (2)
25d agotask_completedTeam Harsh Love (prose)
25d agotask_createdfoundry_goldilocks
Task ID: 3681ef04-9ca2-48fa-9784-249833eca277