Research extension — NATIVE tools.
Three model-facing bindings, bound BARE (native, no alias) in the
sandbox alongside cat/rg/patch — same surface as the foundation
kernel, no ;; -- EXTENSION search -- prompt block:
search_web(query, opts?) — web search via Exa MCP search_code(query, opts?) — code/doc context via Exa MCP search_papers(query, opts?) — arxiv papers (Atom feed)
Output shape — consistent with the rest of the :tag :observation
tool surface (cat, ls, rg). Every search fn returns the
canonical tool envelope; the agent sees the unwrapped :result map:
{:op :search-web|:search-code|:search-papers :query "…" :citations [{:type :title :url :excerpt :source …} …] :citation-count N :truncated? B :source :exa|:arxiv :endpoint "…REDACTED…" ;; web/code only :error? true ;; only on failure :error {:message … …}} ;; only on failure
:excerpt is Markdown; the channel renderer parses it through
vis/markdown->ir so the TUI / Telegram / web channels render
commonmark blocks (headings, lists, code fences) instead of dumping
the raw blob. Errors are still surfaced inline as a single citation
with :error true AND on the envelope's :error slot so failures
stay visible no matter which lens the consumer reads.
Exa MCP: the public endpoint supports basic unauthenticated use;
set EXA_API_KEY (or EXA_MCP_API_KEY) for higher limits. The
key is never logged or surfaced; the endpoint shown in results is
redacted.
arxiv: free public Atom feed via https://export.arxiv.org/api/query.
Research extension — NATIVE tools.
Three model-facing bindings, bound BARE (native, no alias) in the
sandbox alongside cat/rg/patch — same surface as the foundation
kernel, no `;; -- EXTENSION search --` prompt block:
search_web(query, opts?) — web search via Exa MCP
search_code(query, opts?) — code/doc context via Exa MCP
search_papers(query, opts?) — arxiv papers (Atom feed)
Output shape — consistent with the rest of the `:tag :observation`
tool surface (cat, ls, rg). Every search fn returns the
canonical tool envelope; the agent sees the unwrapped `:result` map:
{:op :search-web|:search-code|:search-papers
:query "…"
:citations [{:type :title :url :excerpt :source …} …]
:citation-count N
:truncated? B
:source :exa|:arxiv
:endpoint "…REDACTED…" ;; web/code only
:error? true ;; only on failure
:error {:message … …}} ;; only on failure
`:excerpt` is Markdown; the channel renderer parses it through
`vis/markdown->ir` so the TUI / Telegram / web channels render
commonmark blocks (headings, lists, code fences) instead of dumping
the raw blob. Errors are still surfaced inline as a single citation
with `:error true` AND on the envelope's `:error` slot so failures
stay visible no matter which lens the consumer reads.
Exa MCP: the public endpoint supports basic unauthenticated use;
set `EXA_API_KEY` (or `EXA_MCP_API_KEY`) for higher limits. The
key is never logged or surfaced; the endpoint shown in results is
redacted.
arxiv: free public Atom feed via `https://export.arxiv.org/api/query`.cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |