Skip to content

Horton agent

The built-in assistant registered by the DARIX dev server. Horton can chat conversationally, search the web, read and edit files, run shell commands, and dispatch subagents (workers) for isolated subtasks.

Source: packages/ts-darix-server/src/darix-agents/agents/horton.ts

Try it

With the dev server running (pnpm start:darix):

sh
pnpm darix spawn /horton/my-horton
pnpm darix send /horton/my-horton 'What's in this directory?'
pnpm darix observe /horton/my-horton

Tools

Horton is configured with ctx.darixTools plus the seven Horton tools:

ToolPurpose
bashRun shell commands in the working directory.
readRead a file. Tracked in a per-wake readSet.
writeCreate or overwrite a file.
editTargeted string replacement (file must be read first).
brave_searchWeb search via the Brave Search API.
fetch_urlFetch a URL and return it as markdown.
spawn_workerDispatch a subagent for an isolated subtask.

brave_search requires BRAVE_SEARCH_API_KEY in the environment; without it the tool errors at call time.

Title generation

On the first wake, Horton calls generateTitle() (Haiku) to summarise the user's first message into a 3-5 word session title and stores it via ctx.setTag('title', title). Failures are logged and ignored — the entity continues without a title.

Details

PropertyValue
Type namehorton
ModelHORTON_MODEL (claude-sonnet-4-5-20250929)
Title modelclaude-haiku-4-5-20251001
Toolsctx.darixTools + Horton tool set (7 tools)
Working directoryPassed at bootstrap (defaults to process.cwd())
Title generationYes, on first wake

Extending Horton

The system prompt and tool factory are exported so you can build your own variants:

ts
import {
  HORTON_MODEL,
  buildHortonSystemPrompt,
  createHortonTools,
} from "@durable-streams/ts-darix-server"

registry.define("my-assistant", {
  description: "Horton with an extra custom tool",
  async handler(ctx) {
    const readSet = new Set<string>()
    ctx.useAgent({
      systemPrompt: buildHortonSystemPrompt(process.cwd()),
      model: HORTON_MODEL,
      tools: [
        ...ctx.darixTools,
        ...createHortonTools(process.cwd(), ctx, readSet),
        myCustomTool,
      ],
    })
    await ctx.agent.run()
  },
})
  • Worker — the subagent type Horton dispatches via spawn_worker.