ethos · personality is architecture
Each personality is a structural component, not a prompt. A curated toolset. A first-person identity. A memory scope. Specialists ship by default.
mit · node 24 · typescript strict · zero deps in the types layer
# install ethos $ pnpm add -g @ethosagent/cli # methodical · cites sources · flags uncertainty $ ethos chat --personality researcher > What is the strongest evidence for emergent abilities at scale?
tabs are personalities. swap them — the agent's behavior, tools, and memory scope change with the file.
A generic agent has every tool. That is its problem. The toolset is the union of every task you might ever do, which is a security surface, a cost surface, and a quality surface. Voice is mush. Memory is a pile.
Personalities invert it. Each has a curated toolset, a first-person identity (ETHOS.md), and a memory scope. Researcher gets the 8 tools it needs. Reviewer gets 3 and a per-personality memory scope so its code-review notes never leak into your coach session.
Specialization, not configuration. Personality is architecture, not a system prompt in a costume.
web_search web_extract web_crawl read_file search_files memory_read memory_write session_searchterminal read_file write_file patch_file search_files web_search web_extract execute_code run_tests lintread_file search_files session_searchweb_search web_extract memory_read memory_write session_searchterminal read_file write_file patch_file search_files execute_code run_testsEvery component is an interface, injected at construction. Personality decides which tools enter step 9 and which model handles step 8.
user input
│
▼
┌──────────────────────────────────────────────────────┐
│ AgentLoop.run(input, options) │
│ ───────────────────────────────────────────────── │
│ 1. resolve or create session │
│ 2. fire session_start hooks │
│ 3. persist user message │
│ 4. load history (trimmed) │
│ 5. prefetch memory (per personality scope) │
│ 6. build system prompt from injectors │
│ 7. before-prompt-build modifying hooks │
│ 8. agentic loop (LLM stream → tool calls → LLM ...) │
│ 9. pre-flight hooks → execute tools → collect │
└──────────────────────────────────────────────────────┘
│
▼
AsyncGenerator<AgentEvent>
│ text_delta, thinking_delta, tool_start, tool_end,
│ tool_progress, usage, done, error
▼
surfaces: cli · tui · vscode · email · telegram · slackread architecture overview →