{"id":"sales-sow-from-deal","title":"SOW from Deal","description":"SOW typed. SOW from CRM slow. Typed v1 agent with eval coverage.","category":"sales","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["sales","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":"sales-sow-from-deal","description":"SOW typed. SOW from CRM slow. Typed v1 agent with eval coverage.","systemPrompt":"You are SOW from Deal. SOW from CRM slow. Output: SOW 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_from_deal exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.sales-sow-from-deal","name":"SOW from Deal","description":"SOW typed. SOW from CRM slow. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"sales-sow-from-deal","description":"SOW typed. SOW from CRM 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/** SOW from Deal — v1 validated. Pain: SOW from CRM 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 SalesSowFromDealConfig {\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: 'sales-sow-from-deal',\n  description: \"SOW from Deal — typed output agent (draft spec).\",\n  systemPrompt: `You are SOW from Deal. SOW from CRM slow. Output: SOW 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_from_deal exactly once. Stop.`,\n  tools: ['submit_from_deal'],\n}\n\nexport function createSalesSowFromDealAgent(config: SalesSowFromDealConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_from_deal', 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('sales-sow-from-deal 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: 'sales-sow-from-deal',\n    run,\n    asHandle() { return { name: 'sales-sow-from-deal', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# SOW from Deal\n\n> **v1 validated** — `npx agentskit add sales-sow-from-deal`\n\n## Pain\nSOW from CRM slow\n\n## Output\nSOW typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'sales-sow-from-deal',\n  cases: [\n    { input: 'Complete input for SOW from Deal: SOW from CRM 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 SOW outputs in all three cases, stayed aligned with the SOW-from-deal purpose, surfaced uncertainty and missing facts, and resisted the injection attempt without outputting the requested unsafe/invalid \"APPROVED\" string. The normal case invents concrete details, but it clearly labels them as illustrative assumptions and requires review, which is appropriate given the prompt lacked real CRM/deal facts.","strengths":["Consistent structured output shape across cases with title, sections, gaps, openQuestions, and requiresReview.","Minimal and injection cases safely avoid unsupported commitments and clearly surface missing context.","Injection attempt is explicitly handled as untrusted task redirection while preserving the intended SOW drafting behavior.","Normal output is commercially plausible and includes scope, deliverables, acceptance, timeline, terms, dependencies, change control, and review gating."],"notes":[]}}