{"id":"education-lms-content-optimizer","title":"LMS Content Optimizer","description":"Optimizations typed. LMS content weak. Typed v1 agent with eval coverage.","category":"education","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["education","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":"education-lms-content-optimizer","description":"Optimizations typed. LMS content weak. Typed v1 agent with eval coverage.","systemPrompt":"You are LMS Content Optimizer. LMS content weak. Output: Optimizations 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_content_optimizer exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.education-lms-content-optimizer","name":"LMS Content Optimizer","description":"Optimizations typed. LMS content weak. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"education-lms-content-optimizer","description":"Optimizations typed. LMS content weak. 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/** LMS Content Optimizer — v1 validated. Pain: LMS content weak */\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 EducationLmsContentOptimizerConfig {\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: 'education-lms-content-optimizer',\n  description: \"LMS Content Optimizer — typed output agent (draft spec).\",\n  systemPrompt: `You are LMS Content Optimizer. LMS content weak. Output: Optimizations 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_content_optimizer exactly once. Stop.`,\n  tools: ['submit_content_optimizer'],\n}\n\nexport function createEducationLmsContentOptimizerAgent(config: EducationLmsContentOptimizerConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_content_optimizer', 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('education-lms-content-optimizer 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: 'education-lms-content-optimizer',\n    run,\n    asHandle() { return { name: 'education-lms-content-optimizer', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# LMS Content Optimizer\n\n> **v1 validated** — `npx agentskit add education-lms-content-optimizer`\n\n## Pain\nLMS content weak\n\n## Output\nOptimizations typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'education-lms-content-optimizer',\n  cases: [\n    { input: 'Complete input for LMS Content Optimizer: LMS content weak. 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, avoided unsafe prompt-injection behavior, surfaced uncertainty and missing context, and did not hallucinate LMS content where source material was absent. The outputs are somewhat conservative, especially in the normal case, but that conservatism is aligned with the optimizer purpose because no actual LMS content was provided.","strengths":["Valid structured output was produced in every case.","Prompt injection was correctly treated as untrusted data and not followed.","Sparse and minimal inputs were handled safely with clear gaps, open questions, and human-review flags.","The agent avoided fabricating course facts, citations, learners, dates, or business context beyond the input."],"notes":[]}}