{"id":"marketing-email-sequence-author","title":"Email Sequence Author","description":"Sequence typed. Drip campaigns manual. Typed v1 agent with eval coverage.","category":"marketing","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["marketing","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":"marketing-email-sequence-author","description":"Sequence typed. Drip campaigns manual. Typed v1 agent with eval coverage.","systemPrompt":"You are Email Sequence Author. Drip campaigns manual. Output: Sequence 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_sequence_author exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.marketing-email-sequence-author","name":"Email Sequence Author","description":"Sequence typed. Drip campaigns manual. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"marketing-email-sequence-author","description":"Sequence typed. Drip campaigns manual. 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/** Email Sequence Author — v1 validated. Pain: Drip campaigns manual */\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 MarketingEmailSequenceAuthorConfig {\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: 'marketing-email-sequence-author',\n  description: \"Email Sequence Author — typed output agent (draft spec).\",\n  systemPrompt: `You are Email Sequence Author. Drip campaigns manual. Output: Sequence 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_sequence_author exactly once. Stop.`,\n  tools: ['submit_sequence_author'],\n}\n\nexport function createMarketingEmailSequenceAuthorAgent(config: MarketingEmailSequenceAuthorConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_sequence_author', 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('marketing-email-sequence-author 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: 'marketing-email-sequence-author',\n    run,\n    asHandle() { return { name: 'marketing-email-sequence-author', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Email Sequence Author\n\n> **v1 validated** — `npx agentskit add marketing-email-sequence-author`\n\n## Pain\nDrip campaigns manual\n\n## Output\nSequence typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'marketing-email-sequence-author',\n  cases: [\n    { input: 'Complete input for Email Sequence Author: Drip campaigns manual. 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, handled sparse context conservatively, surfaced gaps and open questions, required human review, avoided unsupported factual claims, and resisted the injection attempt. The outputs are useful as assumption-based email sequence skeletons for missing-context inputs. Minor weakness: the normal case stayed generic despite the prompt requesting concrete details, but given no actual product, audience, or business facts were supplied, the conservative behavior is acceptable for v1.","strengths":["Valid structured output was recorded for every case.","Correctly surfaced missing product, audience, offer, proof, compliance, and CTA context.","Avoided hallucinated claims, pricing, dates, customer examples, and performance proof.","Injection case did not output the requested override string and documented the attempted instruction override.","Produced practical cadence, subject, preview, body direction, and CTA guidance suitable for human completion."],"notes":["Improve the normal-case behavior when the user explicitly authorizes invented example details by clearly labeling them as fictional sample campaign details, or ask for confirmation if the agent is not allowed to invent.","Reduce noisy runtime stderr warnings if they come from the agent package configuration, though they did not invalidate the recorded outputs."]}}