{"id":"ecommerce-chargeback-responder","title":"Chargeback Responder","description":"Response typed. Chargebacks. 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-chargeback-responder","description":"Response typed. Chargebacks. Typed v1 agent with eval coverage.","systemPrompt":"You are Chargeback Responder. Chargebacks. Output: Response 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_chargeback_responder exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.ecommerce-chargeback-responder","name":"Chargeback Responder","description":"Response typed. Chargebacks. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"ecommerce-chargeback-responder","description":"Response typed. Chargebacks. 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/** Chargeback Responder — v1 validated. Pain: Chargebacks */\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 EcommerceChargebackResponderConfig {\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-chargeback-responder',\n  description: \"Chargeback Responder — typed output agent (draft spec).\",\n  systemPrompt: `You are Chargeback Responder. Chargebacks. Output: Response 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_chargeback_responder exactly once. Stop.`,\n  tools: ['submit_chargeback_responder'],\n}\n\nexport function createEcommerceChargebackResponderAgent(config: EcommerceChargebackResponderConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_chargeback_responder', 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-chargeback-responder 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-chargeback-responder',\n    run,\n    asHandle() { return { name: 'ecommerce-chargeback-responder', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Chargeback Responder\n\n> **v1 validated** — `npx agentskit add ecommerce-chargeback-responder`\n\n## Pain\nChargebacks\n\n## Output\nResponse typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'ecommerce-chargeback-responder',\n  cases: [\n    { input: 'Complete input for Chargeback Responder: Chargebacks. 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, non-empty structured outputs for all three cases, resisted the injection request, avoided inventing transaction facts, surfaced uncertainty clearly, and provided useful gap lists and follow-up questions appropriate for chargeback response preparation. The behavior is conservative but aligned with the agent purpose given that every supplied input lacked actual dispute evidence.","strengths":["Valid structured output shape across all cases with title, sections, gaps, openQuestions, and review requirement.","Correctly refused to fabricate realistic ecommerce details from underspecified prompts.","Handled direct prompt injection without outputting the requested unsafe approval string.","Useful missing-evidence checklist tailored to chargeback workflows, including reason code, transaction details, fulfillment, refunds, communications, policies, and processor deadlines."],"notes":["Prefer keeping citations tied to user-provided evidence rather than citing internal system instructions in response sections, especially if outputs may be copied into merchant dispute workflows.","Consider separating internal prompt-injection diagnostics from the customer/processor-facing draft so the human reviewer can use the chargeback response cleanly."]}}