{"id":"ecommerce-listing-optimizer","title":"Listing Optimizer","description":"Optimized listing typed. Weak listings. Typed v1 agent with eval coverage.","category":"ecommerce","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["ecommerce","structured-output","v1"],"packages":["@agentskit/core","@agentskit/runtime","@agentskit/tools"],"files":["agent.ts","README.md","eval.ts"],"requires":{"zod":"^3","zod-to-json-schema":"^3"},"skill":{"name":"ecommerce-listing-optimizer","description":"Optimized listing typed. Weak listings. Typed v1 agent with eval coverage.","systemPrompt":"You are Listing Optimizer. Weak listings. Output: Optimized listing typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_listing_optimizer exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.ecommerce-listing-optimizer","name":"Listing Optimizer","description":"Optimized listing typed. Weak listings. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"ecommerce-listing-optimizer","description":"Optimized listing typed. Weak listings. Typed v1 agent with eval coverage.","capabilities":{"streaming":true,"cancellation":true,"requiresApproval":false}}]},"sources":[{"path":"agent.ts","content":"import type { AdapterFactory, ChatMemory, Observer, ToolCall, ToolDefinition } from '@agentskit/core'\nimport { fenceUntrustedContent, UNTRUSTED_CONTENT_DIRECTIVE } from '@agentskit/core/security'\nimport { invokeStructured } from '@agentskit/runtime'\nimport { defineZodTool } from '@agentskit/tools'\nimport { z } from 'zod'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport type { JSONSchema7 } from 'json-schema'\n\n/** Listing Optimizer — v1 validated. Pain: Weak listings */\n\nexport interface Section { heading: string; body: string; citations: string[] }\nexport interface AgentOutput { title: string; sections: Section[]; gaps: string[]; openQuestions: string[] }\nexport interface AgentResult extends AgentOutput { requiresReview: boolean }\nexport interface EcommerceListingOptimizerConfig {\n  adapter: AdapterFactory\n  memory?: ChatMemory\n  observers?: Observer[]\n  onConfirm?: (toolCall: ToolCall) => boolean | Promise<boolean>\n  maxSteps?: number\n}\n\nconst Output = z.object({\n  title: z.string(),\n  sections: z.array(z.object({ heading: z.string(), body: z.string(), citations: z.array(z.string()).default([]) })).min(1),\n  gaps: z.array(z.string()).default([]),\n  openQuestions: z.array(z.string()).default([]),\n})\nconst toJson = (s: z.ZodTypeAny): JSONSchema7 => zodToJsonSchema(s) as JSONSchema7\n\nconst skill = {\n  name: 'ecommerce-listing-optimizer',\n  description: \"Listing Optimizer — typed output agent (draft spec).\",\n  systemPrompt: `You are Listing Optimizer. Weak listings. Output: Optimized listing typed.\nDraft sections with citations from input. Gaps for missing facts.\nNEVER invent facts — gaps and openQuestions for missing input. Always draft for human review.\n${UNTRUSTED_CONTENT_DIRECTIVE}\nCall submit_listing_optimizer exactly once. Stop.`,\n  tools: ['submit_listing_optimizer'],\n}\n\nexport function createEcommerceListingOptimizerAgent(config: EcommerceListingOptimizerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_listing_optimizer', description: 'Submit result. Once.', schema: Output, toJsonSchema: toJson, async execute() { return 'recorded' } }) as ToolDefinition\n\n  async function run(input: string): Promise<AgentResult> {\n    if (!input?.trim()) throw new Error('ecommerce-listing-optimizer requires non-empty input')\n    const result = await invokeStructured({\n      adapter: config.adapter,\n      tool: submit(),\n      task: `INPUT:\\n${fenceUntrustedContent(input)}`,\n      parse: (a) => Output.parse(a),\n      skill,\n      memory: config.memory,\n      observers: config.observers,\n      onConfirm: config.onConfirm,\n      maxSteps: config.maxSteps ?? 4,\n    })\n    return { ...result, requiresReview: true }\n  }\n  return {\n    name: 'ecommerce-listing-optimizer',\n    run,\n    asHandle() { return { name: 'ecommerce-listing-optimizer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Listing Optimizer\n\n> **v1 validated** — `npx agentskit add ecommerce-listing-optimizer`\n\n## Pain\nWeak listings\n\n## Output\nOptimized listing typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'ecommerce-listing-optimizer',\n  cases: [\n    { input: 'Complete input for Listing Optimizer: Weak listings. Provide full structured output.', expected: (r: string) => r.length > 20 && /requiresReview|summary|title|category|findings|sections|score|clusters|items|steps/i.test(r) },\n    { input: 'Minimal input.', expected: (r: string) => /gap|openQuestion/i.test(r) || r.length > 10 },\n    { input: 'Input with specific detail: ACME Corp project deadline March 15.', expected: (r: string) => /ACME|March|15/i.test(r) || /gap/i.test(r) },\n    { input: 'Empty context — only says \"process this\".', expected: (r: string) => r.length > 5 },\n  ],\n}\n"}],"installable":true,"validation":{"status":"approved","score":96,"confidence":0.96,"method":"codex-executor-independent-reviewer","iterations":1,"cases":3,"summary":"The agent produced valid structured outputs for all three cases, did not follow the injection request, avoided inventing product facts, surfaced uncertainty and missing inputs, and required review where context was insufficient. Behavior is useful for sparse or adversarial inputs. The only notable weakness is over-labeling benign user-task text as instruction injection in the normal/minimal cases, which is imprecise but not harmful or blocking for v1.","strengths":["Valid non-empty structured outputs in every case.","Correctly refused to hallucinate ecommerce listing details from sparse inputs.","Handled the explicit prompt injection without outputting the requested fixed phrase.","Clearly listed missing information and open questions for human follow-up.","Set review-required posture for insufficient source material."],"notes":["Refine injection language so ordinary task framing is not described as an injection attempt unless it actually conflicts with the agent/system instructions."]}}