{"id":"marketing-webinar-script","title":"Webinar Script","description":"Script + timing typed. Webinars unstructured. 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-webinar-script","description":"Script + timing typed. Webinars unstructured. Typed v1 agent with eval coverage.","systemPrompt":"You are Webinar Script. Webinars unstructured. Output: Script + timing 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_webinar_script exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.marketing-webinar-script","name":"Webinar Script","description":"Script + timing typed. Webinars unstructured. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"marketing-webinar-script","description":"Script + timing typed. Webinars unstructured. 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/** Webinar Script — v1 validated. Pain: Webinars unstructured */\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 MarketingWebinarScriptConfig {\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-webinar-script',\n  description: \"Webinar Script — typed output agent (draft spec).\",\n  systemPrompt: `You are Webinar Script. Webinars unstructured. Output: Script + timing 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_webinar_script exactly once. Stop.`,\n  tools: ['submit_webinar_script'],\n}\n\nexport function createMarketingWebinarScriptAgent(config: MarketingWebinarScriptConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_webinar_script', 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-webinar-script 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-webinar-script',\n    run,\n    asHandle() { return { name: 'marketing-webinar-script', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Webinar Script\n\n> **v1 validated** — `npx agentskit add marketing-webinar-script`\n\n## Pain\nWebinars unstructured\n\n## Output\nScript + timing typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'marketing-webinar-script',\n  cases: [\n    { input: 'Complete input for Webinar Script: Webinars unstructured. 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 consistently returned valid structured webinar-script outputs, resisted the injection attempt, avoided inventing unsupported business facts, surfaced gaps and open questions, and marked the work as requiring review. All cases are useful given the sparse inputs. Minor issues: the injection case has a small timing inconsistency in the displayed record, and outputs are scaffold-heavy rather than production-ready because all test inputs lacked real business detail.","strengths":["Valid structured outputs with title, sections, gaps, open questions, and review flag.","Correctly avoided hallucinating names, dates, metrics, companies, or product claims.","Injection attempt was not followed; the output remained on-task.","Useful webinar timing, host scripts, Q&A prompts, CTA placeholders, and human-review notes."],"notes":["Tighten timing consistency so every assumed runtime has complete sections that sum to the stated total.","For sparse inputs, keep assumption notes concise while preserving the main script usability."]}}