{"version":3,"sources":["../src/shared.ts","../src/understanding/classify.ts","../src/understanding/score.ts","../src/understanding/extract.ts","../src/compression/summarize.ts","../src/generation/draft.ts","../src/reasoning/plan.ts","../src/reasoning/analyze.ts"],"names":["toMessages","ROLE","GUARDRAILS","ROLE_DEFAULT"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Shared utilities used by every capability factory.\r\n *\r\n * These helpers handle:\r\n *   - dynamic prompt fragment resolution (string-or-function fields)\r\n *   - safe hook invocation (errors in user hooks must not crash the call)\r\n *   - common system prompt assembly\r\n */\r\n\r\nimport type { LLMMessage, LLMPort, MessageContent, TaskType } from \"@llm-ports/core\";\r\n\r\n// ─── Common types ────────────────────────────────────────────────────\r\n\r\n/**\r\n * A prompt fragment may be a literal string OR a function that returns one.\r\n * Functions can be sync or async; capabilities resolve them lazily so users\r\n * can plug in DB lookups, feature flags, or context-derived content.\r\n */\r\nexport type Resolvable<TInput, TOutput> =\r\n  | TOutput\r\n  | ((input: TInput) => TOutput | Promise<TOutput>);\r\n\r\nexport interface CapabilityEvent<TOutput> {\r\n  /** Human-readable capability name, e.g. \"classify\". */\r\n  capability: string;\r\n  /** Schema/operation name as configured by the user. */\r\n  schemaName: string;\r\n  /** Model id reported by the adapter. */\r\n  modelId: string;\r\n  /** Provider alias used. */\r\n  providerAlias: string;\r\n  /** Token usage and USD cost. */\r\n  usage: { inputTokens: number; outputTokens: number; totalTokens: number };\r\n  /**\r\n   * USD cost. `cacheSavingsUSD` is populated when the provider returned cache\r\n   * telemetry on this call (so the consumer can attribute savings per-capability).\r\n   * (alpha.19.1+)\r\n   */\r\n  cost: { inputUSD: number; outputUSD: number; totalUSD: number; cacheSavingsUSD?: number };\r\n  latencyMs: number;\r\n  /** The validated output the capability returned. */\r\n  output: TOutput;\r\n  /** Number of attempts (>1 if retry-with-feedback fired). */\r\n  validationAttempts?: number;\r\n}\r\n\r\n// ─── Resolvers ───────────────────────────────────────────────────────\r\n\r\n/** Resolve a Resolvable<TInput, TOutput> by invoking it with the input if it's a function. */\r\nexport async function resolve<TInput, TOutput>(\r\n  value: Resolvable<TInput, TOutput> | undefined,\r\n  input: TInput,\r\n): Promise<TOutput | undefined> {\r\n  if (value === undefined) return undefined;\r\n  if (typeof value === \"function\") {\r\n    return await (value as (input: TInput) => TOutput | Promise<TOutput>)(input);\r\n  }\r\n  return value;\r\n}\r\n\r\n// ─── Hook safety ─────────────────────────────────────────────────────\r\n\r\n/**\r\n * Invoke a user-provided hook. Hook errors are caught and logged to console\r\n * but never re-thrown — observability hooks should not break the actual call.\r\n */\r\nexport async function safelyInvoke<TArgs extends unknown[]>(\r\n  hook: ((...args: TArgs) => void | Promise<void>) | undefined,\r\n  ...args: TArgs\r\n): Promise<void> {\r\n  if (!hook) return;\r\n  try {\r\n    await hook(...args);\r\n  } catch (err) {\r\n    // eslint-disable-next-line no-console\r\n    console.warn(\"[llm-ports/capabilities] hook failed:\", err);\r\n  }\r\n}\r\n\r\n// ─── System prompt assembly ──────────────────────────────────────────\r\n\r\nexport interface SystemPromptParts {\r\n  role: string;\r\n  context?: string;\r\n  rubric?: string;\r\n  examples?: string;\r\n  guardrails?: string;\r\n}\r\n\r\n/**\r\n * Assemble a system prompt from labeled fragments. Sections are wrapped in\r\n * XML-style tags so capable models parse them deterministically.\r\n */\r\nexport function buildSystemPrompt(parts: SystemPromptParts): string {\r\n  const out: string[] = [`<role>${parts.role}</role>`];\r\n  if (parts.context) out.push(`<context>\\n${parts.context}\\n</context>`);\r\n  if (parts.rubric) out.push(`<rules>\\n${parts.rubric}\\n</rules>`);\r\n  if (parts.examples) out.push(`<examples>\\n${parts.examples}\\n</examples>`);\r\n  if (parts.guardrails) out.push(parts.guardrails);\r\n  return out.join(\"\\n\\n\");\r\n}\r\n\r\n/** Wrap user content in a content tag so the model can distinguish data from instructions. */\r\nexport function wrapContent(content: MessageContent): MessageContent {\r\n  if (typeof content === \"string\") {\r\n    return `<content>\\n${content}\\n</content>`;\r\n  }\r\n  // For multimodal content, prepend a labeling text block so non-text content\r\n  // is still framed as data.\r\n  return [{ type: \"text\", text: \"<content>\" }, ...content, { type: \"text\", text: \"</content>\" }];\r\n}\r\n\r\n// ─── Re-exports ──────────────────────────────────────────────────────\r\n\r\nexport type { LLMMessage, LLMPort, MessageContent, TaskType };\r\n","/**\n * createClassifier — pick one of N categories from input content.\n *\n * Returns a typed function that, given input content, returns a parsed\n * Zod-validated object (typically including the chosen category plus a\n * reasoning field). Configure once at app startup; call many times.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport type { z } from \"zod\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface ClassifyInput {\n  content: MessageContent;\n  /** Per-call context override; appended to systemContext. */\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n  /**\n   * Per-call override for strict-schema response_format mode. (alpha.21+)\n   * Forwarded to the underlying port call. See `GenerateStructuredOptions.strict`.\n   */\n  strict?: boolean;\n}\n\nexport interface CreateClassifierConfig<TSchema extends z.ZodTypeAny> {\n  /** The LLM port. Typically `registry.getPort()`. */\n  port: LLMPort;\n  /** The Zod schema the model's output must conform to. */\n  schema: TSchema;\n  /** Operation name used in logs and the model prompt. */\n  schemaName: string;\n\n  /** Optional rules text that defines the categories. */\n  rubric?: Resolvable<ClassifyInput, string>;\n  /** Optional boundary examples (\"X is intent A; Y is intent B\"). */\n  boundaryExamples?: Resolvable<ClassifyInput, string>;\n  /** Optional extra context (per-input) the model should consider. */\n  systemContext?: Resolvable<ClassifyInput, string>;\n\n  /** Task type for routing. Default: \"classify\". */\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0 (deterministic). */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this classifier. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n\n  /** Hooks. Errors in hooks are caught and logged, never re-thrown. */\n  onBeforeCall?: (input: ClassifyInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<z.infer<TSchema>>) => void | Promise<void>;\n  onError?: (error: Error, input: ClassifyInput) => void | Promise<void>;\n}\n\nconst ROLE_DEFAULT = \"Classification system. Pick exactly one category that best matches.\";\nconst GUARDRAILS_DEFAULT = \"Classify decisively. Do not hedge. If uncertain between two options, round toward higher urgency.\";\n\n/**\n * Create a configured classifier function.\n *\n * @example\n * const classify = createClassifier({\n *   port: llm,\n *   schema: z.object({\n *     intent: z.enum([\"question\", \"request\", \"complaint\"]),\n *     reasoning: z.string(),\n *   }),\n *   schemaName: \"user-intent\",\n *   rubric: \"question: asking for info\\nrequest: wants action\\ncomplaint: reports problem\",\n * });\n *\n * const result = await classify({ content: \"Can I get a refund?\" });\n * // { intent: \"request\", reasoning: \"...\" }\n */\nexport function createClassifier<TSchema extends z.ZodTypeAny>(\n  config: CreateClassifierConfig<TSchema>,\n): (input: ClassifyInput) => Promise<z.infer<TSchema>> {\n  const taskType = config.taskType ?? \"classify\";\n\n  return async (input: ClassifyInput): Promise<z.infer<TSchema>> => {\n    await safelyInvoke(config.onBeforeCall, input);\n\n    try {\n      const [rubric, examples, context] = await Promise.all([\n        resolve(config.rubric, input),\n        resolve(config.boundaryExamples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n\n      const system = buildSystemPrompt({\n        role: ROLE_DEFAULT,\n        ...(fullContext ? { context: fullContext } : {}),\n        ...(rubric ? { rubric } : {}),\n        ...(examples ? { examples } : {}),\n        guardrails: GUARDRAILS_DEFAULT,\n      });\n\n      const result = await config.port.generateStructured({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, wrapContent(input.content)),\n        schema: config.schema,\n        schemaName: config.schemaName,\n        temperature: config.temperature ?? 0,\n        ...(config.maxOutputTokens !== undefined ? { maxOutputTokens: config.maxOutputTokens } : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n        ...(input.strict !== undefined ? { strict: input.strict } : {}),\n      });\n\n      await safelyInvoke(config.onResult, {\n        capability: \"classify\",\n        schemaName: config.schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: {\n          inputTokens: result.usage.inputTokens,\n          outputTokens: result.usage.outputTokens,\n          totalTokens: result.usage.totalTokens,\n        },\n        cost: {\n          inputUSD: result.cost.inputUSD,\n          outputUSD: result.cost.outputUSD,\n          totalUSD: result.cost.totalUSD,\n          ...(result.cost.cacheSavingsUSD !== undefined ? { cacheSavingsUSD: result.cost.cacheSavingsUSD } : {}),\n        },\n        latencyMs: result.latencyMs,\n        output: result.data,\n        validationAttempts: result.validationAttempts,\n      });\n\n      return result.data;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n","/**\n * createScorer — rate input against a rubric. Schema typically includes a\n * numerical score plus reasoning.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport type { z } from \"zod\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface ScoreInput {\n  content: MessageContent;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n  /**\n   * Per-call override for strict-schema response_format mode. (alpha.21+)\n   * Forwarded to the underlying port call. See `GenerateStructuredOptions.strict`.\n   */\n  strict?: boolean;\n}\n\nexport interface CreateScorerConfig<TSchema extends z.ZodTypeAny> {\n  port: LLMPort;\n  schema: TSchema;\n  schemaName: string;\n  /** Required: the scoring rubric (what determines a high vs low score). */\n  rubric: Resolvable<ScoreInput, string>;\n  /** Optional examples of low/medium/high scored items. */\n  examples?: Resolvable<ScoreInput, string>;\n  systemContext?: Resolvable<ScoreInput, string>;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0.1 — slight randomness helps surface borderline cases consistently. */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this scorer. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: ScoreInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<z.infer<TSchema>>) => void | Promise<void>;\n  onError?: (error: Error, input: ScoreInput) => void | Promise<void>;\n}\n\nconst ROLE = \"Scoring system. Rate the input against the provided rubric. Be calibrated; explain your reasoning.\";\nconst GUARDRAILS = \"Score on the rubric's defined scale. Justify with one or two specific observations from the input.\";\n\nexport function createScorer<TSchema extends z.ZodTypeAny>(\n  config: CreateScorerConfig<TSchema>,\n): (input: ScoreInput) => Promise<z.infer<TSchema>> {\n  const taskType = config.taskType ?? \"score\";\n\n  return async (input: ScoreInput): Promise<z.infer<TSchema>> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [rubric, examples, context] = await Promise.all([\n        resolve(config.rubric, input),\n        resolve(config.examples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n      const system = buildSystemPrompt({\n        role: ROLE,\n        ...(fullContext ? { context: fullContext } : {}),\n        rubric: rubric!,\n        ...(examples ? { examples } : {}),\n        guardrails: GUARDRAILS,\n      });\n      const result = await config.port.generateStructured({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, wrapContent(input.content)),\n        schema: config.schema,\n        schemaName: config.schemaName,\n        temperature: config.temperature ?? 0.1,\n        ...(config.maxOutputTokens !== undefined ? { maxOutputTokens: config.maxOutputTokens } : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n        ...(input.strict !== undefined ? { strict: input.strict } : {}),\n      });\n      await safelyInvoke(config.onResult, {\n        capability: \"score\",\n        schemaName: config.schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: result.data,\n        validationAttempts: result.validationAttempts,\n      });\n      return result.data;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n","/**\n * createExtractor — pull structured fields from unstructured input.\n *\n * Returns Zod-validated typed data. Useful for: parsing emails for action\n * items, extracting contact info from text, structured data from documents.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport type { z } from \"zod\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface ExtractInput {\n  content: MessageContent;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n  /**\n   * Per-call override for strict-schema response_format mode. (alpha.21+)\n   * Forwarded to the underlying port call. See `GenerateStructuredOptions.strict`.\n   */\n  strict?: boolean;\n}\n\nexport interface CreateExtractorConfig<TSchema extends z.ZodTypeAny> {\n  port: LLMPort;\n  schema: TSchema;\n  schemaName: string;\n  /** What to extract (instructions describing each field). */\n  fieldGuide?: Resolvable<ExtractInput, string>;\n  /** Examples of input -> extracted output. */\n  examples?: Resolvable<ExtractInput, string>;\n  systemContext?: Resolvable<ExtractInput, string>;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0 (deterministic). */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this extractor. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: ExtractInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<z.infer<TSchema>>) => void | Promise<void>;\n  onError?: (error: Error, input: ExtractInput) => void | Promise<void>;\n}\n\nconst ROLE = \"Extraction system. Pull the requested fields from the input. Use only what is supported by the input itself.\";\nconst GUARDRAILS = \"Do not infer fields that aren't in the input. Use null/empty for missing data rather than guessing.\";\n\nexport function createExtractor<TSchema extends z.ZodTypeAny>(\n  config: CreateExtractorConfig<TSchema>,\n): (input: ExtractInput) => Promise<z.infer<TSchema>> {\n  const taskType = config.taskType ?? \"extract\";\n\n  return async (input: ExtractInput): Promise<z.infer<TSchema>> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [fieldGuide, examples, context] = await Promise.all([\n        resolve(config.fieldGuide, input),\n        resolve(config.examples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n      const system = buildSystemPrompt({\n        role: ROLE,\n        ...(fullContext ? { context: fullContext } : {}),\n        ...(fieldGuide ? { rubric: fieldGuide } : {}),\n        ...(examples ? { examples } : {}),\n        guardrails: GUARDRAILS,\n      });\n      const result = await config.port.generateStructured({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, wrapContent(input.content)),\n        schema: config.schema,\n        schemaName: config.schemaName,\n        temperature: config.temperature ?? 0,\n        ...(config.maxOutputTokens !== undefined ? { maxOutputTokens: config.maxOutputTokens } : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n        ...(input.strict !== undefined ? { strict: input.strict } : {}),\n      });\n      await safelyInvoke(config.onResult, {\n        capability: \"extract\",\n        schemaName: config.schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: result.data,\n        validationAttempts: result.validationAttempts,\n      });\n      return result.data;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n","/**\n * createSummarizer — compress input text while preserving the key meaning.\n *\n * Returns plain text. For structured summaries (e.g. bullet points + an\n * explicit list of action items), use createExtractor with a schema instead.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface SummarizeInput {\n  content: MessageContent;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n}\n\nexport interface CreateSummarizerConfig {\n  port: LLMPort;\n  /** Operation name used in logs. Default: \"summarize\". */\n  schemaName?: string;\n  /** Optional persona / focus instructions. */\n  persona?: Resolvable<SummarizeInput, string>;\n  /** Optional output style guide (e.g. \"3-5 bullets, active voice\"). */\n  styleGuide?: Resolvable<SummarizeInput, string>;\n  systemContext?: Resolvable<SummarizeInput, string>;\n  /** Approximate target length in words. */\n  targetWords?: number;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0.2. */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this summarizer. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: SummarizeInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<string>) => void | Promise<void>;\n  onError?: (error: Error, input: SummarizeInput) => void | Promise<void>;\n}\n\nconst ROLE_DEFAULT = \"Summarization system. Compress the input while preserving the most important facts and intent.\";\n\nexport function createSummarizer(\n  config: CreateSummarizerConfig,\n): (input: SummarizeInput) => Promise<string> {\n  const taskType = config.taskType ?? \"summarize\";\n  const schemaName = config.schemaName ?? \"summary\";\n\n  return async (input: SummarizeInput): Promise<string> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [persona, styleGuide, context] = await Promise.all([\n        resolve(config.persona, input),\n        resolve(config.styleGuide, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n      const guardrails: string[] = [];\n      if (config.targetWords !== undefined) {\n        guardrails.push(`Target length: about ${config.targetWords} words.`);\n      }\n      guardrails.push(\"Do not include opinions or speculation. Stick to what the input says.\");\n      const system = buildSystemPrompt({\n        role: persona ?? ROLE_DEFAULT,\n        ...(fullContext ? { context: fullContext } : {}),\n        ...(styleGuide ? { rubric: styleGuide } : {}),\n        guardrails: guardrails.join(\" \"),\n      });\n      const result = await config.port.generateText({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, wrapContent(input.content)),\n        temperature: config.temperature ?? 0.2,\n        ...(config.maxOutputTokens !== undefined\n          ? { maxOutputTokens: config.maxOutputTokens }\n          : config.targetWords !== undefined\n            ? { maxOutputTokens: Math.ceil(config.targetWords * 1.5) }\n            : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n      });\n      await safelyInvoke(config.onResult, {\n        capability: \"summarize\",\n        schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: result.text,\n      });\n      return result.text;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n","/**\n * createDrafter — generate new text in a specific persona/style.\n *\n * Returns plain text. The persona is the most important configuration: it\n * tells the model who is \"writing.\" Channel constraints (e.g. SMS = 160\n * chars, email = 150-250 words) help the model size its output.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface DraftInput {\n  /** Instruction for what to write (the user-facing intent). */\n  instructions: string;\n  /** Optional thread/conversation history the draft is responding to. */\n  threadHistory?: MessageContent;\n  /** Optional recipient context (e.g. CRM data, prior interactions). */\n  recipientContext?: string;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n}\n\nexport interface CreateDrafterConfig {\n  port: LLMPort;\n  /** Operation name used in logs. Default: \"draft\". */\n  schemaName?: string;\n  /** REQUIRED. The persona/voice the draft should adopt. Often a tone profile. */\n  persona: Resolvable<DraftInput, string>;\n  /** Optional channel constraint (e.g. SMS, email, LinkedIn DM). */\n  channelConstraint?: Resolvable<DraftInput, string>;\n  /** Optional anti-pattern blacklist (phrases to avoid). */\n  antiPatterns?: Resolvable<DraftInput, string>;\n  /** Optional examples of correctly-styled drafts. */\n  writingSamples?: Resolvable<DraftInput, string>;\n  systemContext?: Resolvable<DraftInput, string>;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0.4 (creative but controlled). */\n  temperature?: number;\n  /** Hard character cap; truncates output if exceeded. */\n  maxLength?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this drafter. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: DraftInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<string>) => void | Promise<void>;\n  onError?: (error: Error, input: DraftInput) => void | Promise<void>;\n}\n\nexport function createDrafter(\n  config: CreateDrafterConfig,\n): (input: DraftInput) => Promise<string> {\n  const taskType = config.taskType ?? \"draft\";\n  const schemaName = config.schemaName ?? \"draft\";\n\n  return async (input: DraftInput): Promise<string> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [persona, channel, antiPatterns, samples, context] = await Promise.all([\n        resolve(config.persona, input),\n        resolve(config.channelConstraint, input),\n        resolve(config.antiPatterns, input),\n        resolve(config.writingSamples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [\n        context,\n        input.contextOverride,\n        input.recipientContext ? `Recipient:\\n${input.recipientContext}` : undefined,\n      ]\n        .filter(Boolean)\n        .join(\"\\n\\n\");\n\n      const guardrailParts: string[] = [];\n      if (channel) guardrailParts.push(`Channel rules: ${channel}`);\n      if (antiPatterns) guardrailParts.push(`Avoid these phrases:\\n${antiPatterns}`);\n      if (config.maxLength !== undefined) {\n        guardrailParts.push(`Maximum length: ${config.maxLength} characters.`);\n      }\n      guardrailParts.push(\"Output only the message text. No subject line, no commentary, no preamble.\");\n\n      const system = buildSystemPrompt({\n        role: persona!,\n        ...(fullContext ? { context: fullContext } : {}),\n        ...(samples ? { examples: samples } : {}),\n        guardrails: guardrailParts.join(\"\\n\\n\"),\n      });\n\n      const userPrompt = input.threadHistory\n        ? assemblePromptWithThread(input.threadHistory, input.instructions)\n        : input.instructions;\n\n      const result = await config.port.generateText({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, userPrompt),\n        temperature: config.temperature ?? 0.4,\n        ...(config.maxOutputTokens !== undefined\n          ? { maxOutputTokens: config.maxOutputTokens }\n          : config.maxLength !== undefined\n            ? { maxOutputTokens: Math.ceil(config.maxLength / 3) }\n            : { maxOutputTokens: 800 }),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n      });\n\n      let text = result.text;\n      if (config.maxLength !== undefined && text.length > config.maxLength) {\n        text = text.slice(0, config.maxLength).trimEnd();\n      }\n\n      await safelyInvoke(config.onResult, {\n        capability: \"draft\",\n        schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: text,\n      });\n      return text;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n\nfunction assemblePromptWithThread(thread: MessageContent, instructions: string): MessageContent {\n  if (typeof thread === \"string\") {\n    return `<thread>\\n${thread}\\n</thread>\\n\\n${instructions}`;\n  }\n  return [\n    { type: \"text\", text: \"<thread>\" },\n    ...thread,\n    { type: \"text\", text: \"</thread>\\n\\n\" + instructions },\n  ];\n}\n","/**\n * createPlanner — decompose a goal into ordered or DAG-shaped steps.\n *\n * Returns Zod-validated structured output. The user supplies the schema\n * for what a \"step\" looks like (typically id + description + dependencies).\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport type { z } from \"zod\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface PlanInput {\n  goal: MessageContent;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n  /**\n   * Per-call override for strict-schema response_format mode. (alpha.21+)\n   * Forwarded to the underlying port call. See `GenerateStructuredOptions.strict`.\n   */\n  strict?: boolean;\n}\n\nexport interface CreatePlannerConfig<TSchema extends z.ZodTypeAny> {\n  port: LLMPort;\n  schema: TSchema;\n  schemaName: string;\n  /** Optional planning approach (e.g. \"depth-first; minimize dependencies\"). */\n  strategy?: Resolvable<PlanInput, string>;\n  /** Available tools / capabilities the plan may reference. */\n  toolCatalog?: Resolvable<PlanInput, string>;\n  /** Examples of well-formed plans for similar goals. */\n  examples?: Resolvable<PlanInput, string>;\n  systemContext?: Resolvable<PlanInput, string>;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0.2. */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this planner. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: PlanInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<z.infer<TSchema>>) => void | Promise<void>;\n  onError?: (error: Error, input: PlanInput) => void | Promise<void>;\n}\n\nconst ROLE = \"Planning system. Decompose the goal into the smallest set of well-ordered steps that accomplishes it.\";\nconst GUARDRAILS = \"Each step should be concrete enough to execute. Reference only tools that exist in the catalog. State dependencies explicitly.\";\n\nexport function createPlanner<TSchema extends z.ZodTypeAny>(\n  config: CreatePlannerConfig<TSchema>,\n): (input: PlanInput) => Promise<z.infer<TSchema>> {\n  const taskType = config.taskType ?? \"plan\";\n\n  return async (input: PlanInput): Promise<z.infer<TSchema>> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [strategy, toolCatalog, examples, context] = await Promise.all([\n        resolve(config.strategy, input),\n        resolve(config.toolCatalog, input),\n        resolve(config.examples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n      const rubricParts = [strategy, toolCatalog ? `Available tools:\\n${toolCatalog}` : undefined]\n        .filter(Boolean)\n        .join(\"\\n\\n\");\n      const system = buildSystemPrompt({\n        role: ROLE,\n        ...(fullContext ? { context: fullContext } : {}),\n        ...(rubricParts ? { rubric: rubricParts } : {}),\n        ...(examples ? { examples } : {}),\n        guardrails: GUARDRAILS,\n      });\n      const result = await config.port.generateStructured({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, wrapContent(input.goal)),\n        schema: config.schema,\n        schemaName: config.schemaName,\n        temperature: config.temperature ?? 0.2,\n        ...(config.maxOutputTokens !== undefined ? { maxOutputTokens: config.maxOutputTokens } : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n        ...(input.strict !== undefined ? { strict: input.strict } : {}),\n      });\n      await safelyInvoke(config.onResult, {\n        capability: \"plan\",\n        schemaName: config.schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: result.data,\n        validationAttempts: result.validationAttempts,\n      });\n      return result.data;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n","/**\n * createAnalyzer — evaluate, critique, or compare. Returns Zod-validated\n * structured output. Use when the user wants a \"what do you think about\n * this?\" answer with explicit reasoning and recommendations.\n */\n\nimport { toMessages, type CacheControl, type LLMPort, type LLMPriority, type MessageContent } from \"@llm-ports/core\";\nimport type { z } from \"zod\";\nimport {\n  buildSystemPrompt,\n  resolve,\n  safelyInvoke,\n  wrapContent,\n  type CapabilityEvent,\n  type Resolvable,\n} from \"../shared.js\";\n\nexport interface AnalyzeInput {\n  content: MessageContent;\n  /** Optional explicit question; if omitted, the analyzer's framework drives the analysis. */\n  question?: string;\n  contextOverride?: string;\n  /** Cancellation signal for this specific call. Threaded to the port. (alpha.13+) */\n  signal?: AbortSignal;\n  /** Override task routing for this call only. (alpha.13+) */\n  forceProviderAlias?: string;\n  /** Per-call escape hatch for provider-specific request fields (vLLM chat_template_kwargs, SGLang regex, etc.). Threaded to the underlying port call. (alpha.16+) */\n  providerExtras?: Record<string, unknown>;\n  /** Per-call prompt cache configuration. Forwarded to the underlying port call. (alpha.19.1+) */\n  cacheControl?: CacheControl;\n  /**\n   * Per-call override for strict-schema response_format mode. (alpha.21+)\n   * Forwarded to the underlying port call. See `GenerateStructuredOptions.strict`.\n   */\n  strict?: boolean;\n}\n\nexport interface CreateAnalyzerConfig<TSchema extends z.ZodTypeAny> {\n  port: LLMPort;\n  schema: TSchema;\n  schemaName: string;\n  /** REQUIRED. The analytical framework (e.g. SWOT, pros/cons, root-cause). */\n  framework: Resolvable<AnalyzeInput, string>;\n  /** Optional examples of well-structured analyses. */\n  examples?: Resolvable<AnalyzeInput, string>;\n  systemContext?: Resolvable<AnalyzeInput, string>;\n  taskType?: string;\n  priority?: LLMPriority;\n  /** Default 0.3 — analysis benefits from some perspective variety. */\n  temperature?: number;\n  maxOutputTokens?: number;\n  /**\n   * Reasoning effort hint for o-series / gpt-5-nano / Groq gpt-oss-120b.\n   * Applies to every call from this analyzer. (alpha.13+)\n   */\n  reasoningEffort?: \"low\" | \"medium\" | \"high\";\n  onBeforeCall?: (input: AnalyzeInput) => void | Promise<void>;\n  onResult?: (event: CapabilityEvent<z.infer<TSchema>>) => void | Promise<void>;\n  onError?: (error: Error, input: AnalyzeInput) => void | Promise<void>;\n}\n\nconst ROLE = \"Analytical system. Evaluate the input through the requested framework. Be specific; avoid hand-waving.\";\nconst GUARDRAILS = \"Every claim should be traceable to something in the input. Flag uncertainty explicitly rather than hedging vaguely.\";\n\nexport function createAnalyzer<TSchema extends z.ZodTypeAny>(\n  config: CreateAnalyzerConfig<TSchema>,\n): (input: AnalyzeInput) => Promise<z.infer<TSchema>> {\n  const taskType = config.taskType ?? \"analyze\";\n\n  return async (input: AnalyzeInput): Promise<z.infer<TSchema>> => {\n    await safelyInvoke(config.onBeforeCall, input);\n    try {\n      const [framework, examples, context] = await Promise.all([\n        resolve(config.framework, input),\n        resolve(config.examples, input),\n        resolve(config.systemContext, input),\n      ]);\n      const fullContext = [context, input.contextOverride].filter(Boolean).join(\"\\n\\n\");\n      const system = buildSystemPrompt({\n        role: ROLE,\n        ...(fullContext ? { context: fullContext } : {}),\n        rubric: framework!,\n        ...(examples ? { examples } : {}),\n        guardrails: GUARDRAILS,\n      });\n      const userPrompt = input.question\n        ? assembleWithQuestion(input.content, input.question)\n        : wrapContent(input.content);\n      const result = await config.port.generateStructured({\n        taskType,\n        ...(config.priority !== undefined ? { priority: config.priority } : {}),\n        messages: toMessages(system, userPrompt),\n        schema: config.schema,\n        schemaName: config.schemaName,\n        temperature: config.temperature ?? 0.3,\n        ...(config.maxOutputTokens !== undefined ? { maxOutputTokens: config.maxOutputTokens } : {}),\n        ...(config.reasoningEffort !== undefined ? { reasoningEffort: config.reasoningEffort } : {}),\n        ...(input.signal ? { signal: input.signal } : {}),\n        ...(input.forceProviderAlias ? { forceProviderAlias: input.forceProviderAlias } : {}),\n        ...(input.providerExtras ? { providerExtras: input.providerExtras } : {}),\n        ...(input.cacheControl ? { cacheControl: input.cacheControl } : {}),\n        ...(input.strict !== undefined ? { strict: input.strict } : {}),\n      });\n      await safelyInvoke(config.onResult, {\n        capability: \"analyze\",\n        schemaName: config.schemaName,\n        modelId: result.modelId,\n        providerAlias: result.providerAlias,\n        usage: result.usage,\n        cost: result.cost,\n        latencyMs: result.latencyMs,\n        output: result.data,\n        validationAttempts: result.validationAttempts,\n      });\n      return result.data;\n    } catch (err) {\n      const error = err instanceof Error ? err : new Error(String(err));\n      await safelyInvoke(config.onError, error, input);\n      throw error;\n    }\n  };\n}\n\nfunction assembleWithQuestion(content: MessageContent, question: string): MessageContent {\n  if (typeof content === \"string\") {\n    return `<content>\\n${content}\\n</content>\\n\\n<question>\\n${question}\\n</question>`;\n  }\n  return [\n    { type: \"text\", text: \"<content>\" },\n    ...content,\n    { type: \"text\", text: `</content>\\n\\n<question>\\n${question}\\n</question>` },\n  ];\n}\n"]}