{"id":"clinical-telehealth-intake","title":"Telehealth Intake","description":"Intake typed. Telehealth intake unstructured. Typed v1 agent with eval coverage.","category":"clinical","status":"validated","version":"1.0.0","source":"agentskit-registry","license":"MIT","tags":["clinical","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":"clinical-telehealth-intake","description":"Intake typed. Telehealth intake unstructured. Typed v1 agent with eval coverage.","systemPrompt":"You are Telehealth Intake. Telehealth intake unstructured. Output: Intake 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_telehealth_intake exactly once. Stop."},"flow":null,"a2a":{"id":"io.agentskit.registry.clinical-telehealth-intake","name":"Telehealth Intake","description":"Intake typed. Telehealth intake unstructured. Typed v1 agent with eval coverage.","version":"1.0.0","homepage":"https://registry.agentskit.io","skills":[{"name":"clinical-telehealth-intake","description":"Intake typed. Telehealth intake 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/** Telehealth Intake — v1 validated. Pain: Telehealth intake 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 ClinicalTelehealthIntakeConfig {\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: 'clinical-telehealth-intake',\n  description: \"Telehealth Intake — typed output agent (draft spec).\",\n  systemPrompt: `You are Telehealth Intake. Telehealth intake unstructured. Output: Intake 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_telehealth_intake exactly once. Stop.`,\n  tools: ['submit_telehealth_intake'],\n}\n\nexport function createClinicalTelehealthIntakeAgent(config: ClinicalTelehealthIntakeConfig) {\n  const submit = (): ToolDefinition =>\n    defineZodTool({ name: 'submit_telehealth_intake', 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('clinical-telehealth-intake 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: 'clinical-telehealth-intake',\n    run,\n    asHandle() { return { name: 'clinical-telehealth-intake', run: (t: string) => run(t).then((r) => JSON.stringify(r)) } },\n  }\n}\n"},{"path":"README.md","content":"# Telehealth Intake\n\n> **v1 validated** — `npx agentskit add clinical-telehealth-intake`\n\n## Pain\nTelehealth intake unstructured\n\n## Output\nIntake typed\n"},{"path":"eval.ts","content":"import type { EvalSuite } from '@agentskit/eval'\n\nexport const suite: EvalSuite = {\n  name: 'clinical-telehealth-intake',\n  cases: [\n    { input: 'Complete input for Telehealth Intake: Telehealth intake 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 produced valid, non-empty structured telehealth intake drafts for all three cases, handled sparse inputs conservatively, surfaced missing clinical fields, required human review, and resisted the injection request without outputting APPROVED. It avoided inventing patient details and maintained clinical safety boundaries. Minor reservations are limited to some verbose instruction-handling language and citations to wrapper/system context, but these do not materially reduce usefulness or safety.","strengths":["Valid structured output in every case with title, sections, gaps, open questions, and requiresReview in the recorded artifact.","Appropriately refused to fabricate clinical details from placeholder or sparse inputs.","Injection case correctly treated malicious instruction as data and preserved the agent's intended task.","Clinical safety posture is strong: human review required, uncertainty surfaced, and no triage conclusions made without facts."],"notes":[]}}