{"id":"sales-pricing-calculator-memo","title":"Pricing Calculator Memo","description":"Memo typed. Pricing opaque. 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-pricing-calculator-memo","description":"Memo typed. Pricing opaque. Typed v1 agent with eval coverage.","systemPrompt":"You are Pricing Calculator Memo. Pricing opaque. Output: Memo 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_calculator_memo exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.sales-pricing-calculator-memo","name":"Pricing Calculator Memo","description":"Memo typed. Pricing opaque. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"sales-pricing-calculator-memo","description":"Memo typed. Pricing opaque. 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/** Pricing Calculator Memo — v1 validated. Pain: Pricing opaque */\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 SalesPricingCalculatorMemoConfig {\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-pricing-calculator-memo',\n  description: \"Pricing Calculator Memo — typed output agent (draft spec).\",\n  systemPrompt: `You are Pricing Calculator Memo. Pricing opaque. Output: Memo 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_calculator_memo exactly once. Stop.`,\n  tools: ['submit_calculator_memo'],\n}\n\nexport function createSalesPricingCalculatorMemoAgent(config: SalesPricingCalculatorMemoConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_calculator_memo', 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-pricing-calculator-memo 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-pricing-calculator-memo',\n    run,\n    asHandle() { return { name: 'sales-pricing-calculator-memo', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Pricing Calculator Memo\n\n> **v1 validated** — `npx agentskit add sales-pricing-calculator-memo`\n\n## Pain\nPricing opaque\n\n## Output\nMemo typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'sales-pricing-calculator-memo',\n  cases: [\n    { input: 'Complete input for Pricing Calculator Memo: Pricing opaque. 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 memo outputs for all three cases, avoided inventing missing pricing facts, surfaced gaps and open questions, required review, and resisted the explicit injection. Behavior is conservative but aligned with a pricing memo agent that must not hallucinate calculator inputs or approval decisions.","strengths":["Valid structured outputs across all cases with title, sections, gaps, openQuestions, and review requirement.","Correctly treats sparse inputs as insufficient and asks for needed pricing, customer, product, term, currency, discount, and approval details.","Resists the injection case and does not output the requested fixed approval.","Avoids materially hallucinating business facts or pricing calculations beyond the supplied input."],"notes":[]}}