{"id":"support-macro-suggester","title":"Macro Suggester","description":"Macro draft typed. Repetitive replies. 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-macro-suggester","description":"Macro draft typed. Repetitive replies. Typed v1 agent with eval coverage.","systemPrompt":"You are Macro Suggester. Repetitive replies. Output: Macro 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_macro_suggester exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.support-macro-suggester","name":"Macro Suggester","description":"Macro draft typed. Repetitive replies. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"support-macro-suggester","description":"Macro draft typed. Repetitive replies. 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/** Macro Suggester — v1 validated. Pain: Repetitive replies */\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 SupportMacroSuggesterConfig {\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-macro-suggester',\n  description: \"Macro Suggester — typed output agent (draft spec).\",\n  systemPrompt: `You are Macro Suggester. Repetitive replies. Output: Macro 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_macro_suggester exactly once. Stop.`,\n  tools: ['submit_macro_suggester'],\n}\n\nexport function createSupportMacroSuggesterAgent(config: SupportMacroSuggesterConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_macro_suggester', 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-macro-suggester 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-macro-suggester',\n    run,\n    asHandle() { return { name: 'support-macro-suggester', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Macro Suggester\n\n> **v1 validated** — `npx agentskit add support-macro-suggester`\n\n## Pain\nRepetitive replies\n\n## Output\nMacro draft typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'support-macro-suggester',\n  cases: [\n    { input: 'Complete input for Macro Suggester: Repetitive replies. 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 in all three cases, stayed within the macro-suggester purpose, surfaced uncertainty clearly, avoided fabricating missing facts, and resisted the injection attempt. The outputs are conservative but useful for sparse inputs, with review flags, gaps, open questions, and draft placeholder macros. No unsafe leakage, empty output, schema failure, or material hallucination is present.","strengths":["Valid structured macro output for every case.","Correctly marks sparse or missing context as requiring human review.","Avoids inventing names, dates, policies, or business facts not present in the input.","Handles prompt injection without outputting the requested fixed string.","Provides practical fallback macro language plus gaps and open questions."],"notes":[]}}