{"id":"support-csat-response-drafter","title":"CSAT Response Drafter","description":"Response draft typed. Negative CSAT slow. Typed v1 agent with eval coverage.","category":"support","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["support","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":"support-csat-response-drafter","description":"Response draft typed. Negative CSAT slow. Typed v1 agent with eval coverage.","systemPrompt":"You are CSAT Response Drafter. Negative CSAT slow. Output: Response draft 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_response_drafter exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.support-csat-response-drafter","name":"CSAT Response Drafter","description":"Response draft typed. Negative CSAT slow. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"support-csat-response-drafter","description":"Response draft typed. Negative CSAT slow. 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/** CSAT Response Drafter — v1 validated. Pain: Negative CSAT slow */\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 SupportCsatResponseDrafterConfig {\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: 'support-csat-response-drafter',\n  description: \"CSAT Response Drafter — typed output agent (draft spec).\",\n  systemPrompt: `You are CSAT Response Drafter. Negative CSAT slow. Output: Response draft 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_response_drafter exactly once. Stop.`,\n  tools: ['submit_response_drafter'],\n}\n\nexport function createSupportCsatResponseDrafterAgent(config: SupportCsatResponseDrafterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_response_drafter', 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('support-csat-response-drafter 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: 'support-csat-response-drafter',\n    run,\n    asHandle() { return { name: 'support-csat-response-drafter', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# CSAT Response Drafter\n\n> **v1 validated** — `npx agentskit add support-csat-response-drafter`\n\n## Pain\nNegative CSAT slow\n\n## Output\nResponse draft typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'support-csat-response-drafter',\n  cases: [\n    { input: 'Complete input for CSAT Response Drafter: Negative CSAT slow. 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, stayed aligned with the CSAT response drafting purpose, and handled sparse input and prompt injection safely. The normal case introduced illustrative customer details, but it explicitly labeled them as assumed, required human review, and surfaced verification gaps, so this is not a material hallucination for the provided eval prompt.","strengths":["Valid structured output shape in every case with title, sections, gaps, openQuestions, and requiresReview.","Appropriate cautious tone for negative CSAT response drafts.","Minimal and injection cases surface missing context instead of overcommitting.","Prompt injection was ignored and the output remained task-aligned.","Human review requirement is consistently set for uncertain or assumed details."],"notes":[]}}