← Tasks
[AI-05] Goldilocks Cost Zero (structured)
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 Cost Zero (structured)
Created
25d ago
Completed
25d ago
Quality
Overall
79%
Pass
PASS
Graded By
-
Graded At
-
Cost
Input Tokens
-
Output Tokens
-
Est. USD
$0.0003
Result
{
"code": "```typescript\n// EN: ACP (Agent Communication Protocol) module for buyer/seller marketplace agents. // VI: Mô-đun ACP (Giao thức giao tiếp giữa các tác nhân) cho các tác nhân thị trường người mua/người bán. // ES: Módulo ACP (Protocolo de Comunicación entre Agentes) para agentes de mercado comprador/vendedor.\n// SPEC: AI-05\n\nimport { z } from \"zod\";\n\n// EN: Define ACP message types. // VI: Xác định các loại tin nhắn ACP. // ES: Definir los tipos de mensajes ACP.\n// SPEC: AI-05\nexport enum ACPMessageType {\n Offer = \"Offer\",\n CounterOffer = \"CounterOffer\",\n Accept = \"Accept\",\n Reject = \"Reject\",\n Query = \"Query\",\n Information = \"Information\",\n}\n\n// EN: ACP Message type definition. // VI: Định nghĩa kiểu Tin nhắn ACP. // ES: Definición del tipo de Mensaje ACP.\n// SPEC: AI-05\nexport type ACPMessage = {\n type: ACPMessageType;\n sender: string;\n receiver: string;\n payload?: any;\n};\n\n// EN: Agent type definition. // VI: Định nghĩa kiểu Agent. // ES: Definición del tipo Agente.\n// SPEC: AI-05\nexport type Agent = {\n id: string;\n type: string;\n handleMessage: (message: ACPMessage) => ACPMessage | null;\n};\n\n// EN: Zod schema for ACPMessage validation. // VI: Lược đồ Zod để xác thực ACPMessage. // ES: Esquema Zod para la validación de ACPMessage.\n// SPEC: AI-05\nexport const ACPMessageSchema = z.object({\n type: z.nativeEnum(ACPMessageType),\n sender: z.string(),\n receiver: z.string(),\n payload: z.any().optional(),\n});\n\n// EN: BuyerAgent class definition. // VI: Định nghĩa lớp BuyerAgent. // ES: Definición de la clase BuyerAgent.\n// SPEC: AI-05\nexport class BuyerAgent implements Agent {\n id: string;\n type: string = \"Buyer\";\n\n constructor(id: string) {\n this.id = id;\n }\n\n handleMessage(message: ACPMessage): ACPMessage | null {\n // EN: Process incoming messages and potentially respond. // VI: Xử lý tin nhắn đến và có khả năng phản hồi. // ES: Procesar los mensajes entrantes y potencialmente responder.\n // SPEC: AI-05\n console.log(`Buyer ${this.id} received message: ${JSON.stringify(message)}`);\n\n if (message.type === ACPMessageType.Offer) {\n // EN: Evaluate the offer and potentially make a counter-offer. // VI: Đánh giá ưu đãi và có khả năng đưa ra một ưu đãi phản hồi. // ES: Evaluar la oferta y potencialmente hacer una contraoferta.\n // SPEC: AI-05\n const offerPrice = message.payload?.price;\n if (offerPrice && offerPrice > 100) {\n const counterOffer: ACPMessage = {\n type: ACPMessageType.CounterOffer,\n sender: this.id,\n receiver: message.sender,\n payload: { price: offerPrice * 0.9 }, // EN: Counter-offer with 10% discount. // VI: Ưu đãi phản hồi với chiết khấu 10%. // ES: Contraoferta con un descuento del 10%.\n };\n return counterOffer;\n } else {\n const acceptOffer: ACPMessage = {\n type: ACPMessageType.Accept,\n sender: this.id,\n receiver: message.sender,\n payload: {},\n };\n return acceptOffer;\n }\n } else if (message.type === ACPMessageType.Information) {\n console.log(`Buyer ${this.id} received information: ${JSON.stringify(message.payload)}`);\n return null;\n } else if (message.type === ACPMessageType.Reject) {\n console.log(`Buyer ${this.id} received rejection: ${JSON.stringify(message.payload)}`);\n return null;\n }\n\n return null; // EN: No response. // VI: Không có phản hồi. // ES: Sin respuesta.\n }\n}\n\n// EN: SellerAgent class definition. // VI: Định nghĩa lớp SellerAgent. // ES: Definición de la clase SellerAgent.\n// SPEC: AI-05\nexport class SellerAgent implements Agent {\n id: string;\n type: string = \"Seller\";\n\n constructor(id: string) {\n this.id = id;\n }\n\n handleMessage(message: ACPMessage): ACPMessage | null {\n // EN: Process incoming messages and potentially respond. // VI: Xử lý tin nhắn đến và có khả năng phản hồi. // ES: Procesar los mensajes entrantes y potencialmente responder.\n // SPEC: AI-05\n console.log(`Seller ${this.id} received message: ${JSON.stringify(message)}`);\n\n if (message.type === ACPMessageType.Query) {\n // EN: Respond to a query with an offer. // VI: Trả lời một truy vấn bằng một ưu đãi. // ES: Responder a una consulta con una oferta.\n // SPEC: AI-05\n const offer: ACPMessage = {\n type: ACPMessageType.Offer,\n sender: this.id,\n receiver: message.sender,\n payload: { price: 120 },\n };\n return offer;\n } else if (message.type === ACPMessageType.CounterOffer) {\n // EN: Accept counter offer. // VI: Chấp nhận đề nghị ngược lại. // ES: Aceptar contraoferta.\n // SPEC: AI-05\n const acceptOffer: ACPMessage = {\n type: ACPMessageType.Accept,\n sender: this.id,\n receiver: message.sender,\n payload: {},\n };\n return acceptOffer;\n } else if (message.type === ACPMessageType.Accept) {\n console.log(`Seller ${this.id} accepted offer from ${message.sender}`);\n return null;\n } else if (message.type === ACPMessageType.Information) {\n console.log(`Seller ${this.id} received information: ${JSON.stringify(message.payload)}`);\n return null;\n } else if (message.type === ACPMessageType.Reject) {\n console.log(`Seller ${this.id} received rejection: ${JSON.stringify(message.payload)}`);\n return null;\n }\n\n return null; // EN: No response. // VI: Không có phản hồi. // ES: Sin respuesta.\n }\n}\n\n// EN: MarketplaceAgent class definition. // VI: Định nghĩa lớp MarketplaceAgent. // ES: Definición de la clase MarketplaceAgent.\n// SPEC: AI-05\nexport class MarketplaceAgent implements Agent {\n id: string;\n type: string = \"Marketplace\";\n private listings: { [itemId: string]: { sellerId: string; price: number } } = {};\n\n constructor(id: string) {\n this.id = id;\n }\n\n addListing(itemId: string, sellerId: string, price: number): void {\n this.listings[itemId] = { sellerId: sellerId, price: price };\n console.log(`Marketplace added listing: Item ${itemId} from Seller ${sellerId} for $${price}`);\n }\n\n findListing(itemId: string): { sellerId: string; price: number } | undefined {\n return this.listings[itemId];\n }\n\n handleMessage(message: ACPMessage): ACPMessage | null {\n // EN: Handle messages related to listings and transactions. // VI: Xử lý tin nhắn liên quan đến danh sách và giao dịch. // ES: Manejar mensajes relacionados con listados y transacciones.\n // SPEC: AI-05\n\n switch (message.type) {\n case ACPMessageType.Query:\n // EN: If the message is a query, attempt to find a listing. // VI: Nếu tin nhắn là một truy vấn, hãy cố gắng tìm một danh sách. // ES: Si el mensaje es una consulta, intente encontrar un listado.\n const itemId = message.payload?.itemId;\n if (itemId) {\n const listing = this.findListing(itemId);\n if (listing) {\n return {\n type: ACPMessageType.Information,\n sender: this.id,\n receiver: message.sender,\n payload: listing,\n };\n } else {\n return {\n type: ACPMessageType.Reject,\n sender: this.id,\n receiver: message.sender,\n payload: { reason: `Item ${itemId} not found.` },\n };\n }\n } else {\n return {\n type: ACPMessageType.Reject,\n sender: this.id,\n receiver: message.sender,\n payload: { reason: \"Item ID missing in query.\" },\n };\n }\n default:\n console.log(`Marketplace received message: ${JSON.stringify(message)}`);\n return null;\n }\n }\n}\n\n// EN: Executes the Agent Communication Protocol. // VI: Thực thi Giao thức giao tiếp giữa các tác nhân. // ES: Ejecuta el Protocolo de Comunicación entre Agentes.\n// SPEC: AI-05\nexport function executeACP(\n buyer: BuyerAgent,\n seller: SellerAgent,\n initialMessage: ACPMessage\n): ACPMessage | null {\n // EN: Simulate message exchange between buyer and seller. // VI: Mô phỏng trao đổi tin nhắn giữa người mua và người bán. // ES: Simular el intercambio de mensajes entre comprador y vendedor.\n // SPEC: AI-05\n\n const validationResult = ACPMessageSchema.safeParse(initialMessage);\n if (!validationResult.success) {\n console.error(\"Invalid initial message:\", validationResult.error);\n return null;\n }\n\n let message: ACPMessage | null = initialMessage;\n let response: ACPMessage | null = null;\n let i = 0; // EN: Counter to prevent infinite loops // VI: Bộ đếm để ngăn chặn vòng lặp vô hạn // ES: Contador para evitar bucles infinitos\n const max_iterations = 10;\n\n while (message && i < max_iterations) {\n i++;\n console.log(`Iteration ${i}`);\n\n // Check for missing or invalid payload\n if (!message.payload) {\n console.warn(`Message payload is missing or invalid: ${JSON.stringify(message)}`);\n }\n\n response = seller.handleMessage(message);\n if (response) {\n console.log(`Seller responded: ${JSON.stringify(response)}`);\n message = response;\n response = buyer.handleMessage(message);\n\n if (response) {\n console.log(`Buyer responded: ${JSON.stringify(response)}`);\n message = response;\n } else {\n message = null;\n }\n } else {\n message = null;\n }\n }\n\n if (i === max_iterations) {\n console.warn(\"Max iterations reached. Terminating ACP.\"); // EN: Warn if max iterations reached // VI: Cảnh báo nếu đạt số lần lặp tối đa // ES: Advertencia si se alcanza el número máximo de iteraciones\n }\n\n return response;\n}\n```",
"spec_id": "AI-05"
}Audit Trail (2)
25d agotask_completedTeam Cost Zero (structured)
25d agotask_createdfoundry_goldilocks
Task ID: 33979ad7-e65b-4a8f-b064-f5d925e73344