defmodule CommBus do @moduledoc """ Conversational context assembly for LLM interactions. """ alias CommBus.{Assembler, Entry, Message} @doc "Scan conversation history for entries that match keyword triggers." @spec scan_triggers([Message.t()], [Entry.t()], keyword()) :: [Entry.t()] def scan_triggers(messages, entries, opts \\ []) do CommBus.Matcher.scan_triggers(messages, entries, opts) end @doc "Fit entries within a token budget using priority ordering." @spec fit_budget([Entry.t()], non_neg_integer()) :: [Entry.t()] def fit_budget(entries, limit) do CommBus.Budget.fit_budget(entries, limit) end @doc "Assemble prompt sections with injected context entries." @spec assemble_prompt(CommBus.Conversation.t(), [Entry.t()], keyword()) :: map() def assemble_prompt(conversation, entries, opts \\ []) do Assembler.assemble_prompt(conversation, entries, opts) end @doc "Render a Mustache template with provided values." @spec resolve_placeholders(String.t(), map(), keyword()) :: {:ok, String.t()} | {:error, term()} def resolve_placeholders(template, values, opts \\ []) do case CommBus.Template.render(template, values, Keyword.put_new(opts, :strict_mode, false)) do {:ok, %CommBus.Template.RenderResult{content: content}} -> {:ok, content} {:error, error} -> {:error, error} end end @doc "Render a Mustache template with metadata." @spec render_template(String.t(), map(), keyword()) :: {:ok, CommBus.Template.RenderResult.t()} | {:error, CommBus.Template.RenderError.t()} def render_template(template, values, opts \\ []) do CommBus.Template.render(template, values, opts) end end