hoomanjs 1.41.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/README.md +26 -701
  2. package/dist/acp/acp-agent.js +48 -29
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/chat/app.js +29 -27
  5. package/dist/chat/app.js.map +1 -1
  6. package/dist/chat/components/BottomChrome.d.ts +4 -1
  7. package/dist/chat/components/BottomChrome.js +3 -2
  8. package/dist/chat/components/BottomChrome.js.map +1 -1
  9. package/dist/chat/components/DownloadPanel.d.ts +9 -0
  10. package/dist/chat/components/DownloadPanel.js +16 -0
  11. package/dist/chat/components/DownloadPanel.js.map +1 -0
  12. package/dist/chat/components/StatusBar.js +5 -5
  13. package/dist/chat/components/StatusBar.js.map +1 -1
  14. package/dist/cli.js +23 -23
  15. package/dist/cli.js.map +1 -1
  16. package/dist/configure/app.js +30 -2
  17. package/dist/configure/app.js.map +1 -1
  18. package/dist/core/agent/index.js +0 -6
  19. package/dist/core/agent/index.js.map +1 -1
  20. package/dist/core/agent/prompt-cache-plugin.d.ts +1 -1
  21. package/dist/core/agent/prompt-cache-plugin.js +1 -1
  22. package/dist/core/config.d.ts +60 -0
  23. package/dist/core/config.js +25 -5
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/mcp/index.d.ts +3 -3
  26. package/dist/core/mcp/index.js +2 -2
  27. package/dist/core/mcp/index.js.map +1 -1
  28. package/dist/core/mcp/manager.d.ts +28 -0
  29. package/dist/core/mcp/manager.js +171 -2
  30. package/dist/core/mcp/manager.js.map +1 -1
  31. package/dist/core/models/anthropic.d.ts +4 -3
  32. package/dist/core/models/anthropic.js.map +1 -1
  33. package/dist/core/models/download-progress.d.ts +65 -0
  34. package/dist/core/models/download-progress.js +154 -0
  35. package/dist/core/models/download-progress.js.map +1 -0
  36. package/dist/core/models/index.js +1 -0
  37. package/dist/core/models/index.js.map +1 -1
  38. package/dist/core/models/llama-cpp/gbnf-schema.d.ts +32 -0
  39. package/dist/core/models/llama-cpp/gbnf-schema.js +272 -0
  40. package/dist/core/models/llama-cpp/gbnf-schema.js.map +1 -0
  41. package/dist/core/models/llama-cpp/index.d.ts +8 -0
  42. package/dist/core/models/llama-cpp/index.js +37 -0
  43. package/dist/core/models/llama-cpp/index.js.map +1 -0
  44. package/dist/core/models/llama-cpp/resolve-model.d.ts +28 -0
  45. package/dist/core/models/llama-cpp/resolve-model.js +307 -0
  46. package/dist/core/models/llama-cpp/resolve-model.js.map +1 -0
  47. package/dist/core/models/llama-cpp/strands-llama-cpp.d.ts +40 -0
  48. package/dist/core/models/llama-cpp/strands-llama-cpp.js +422 -0
  49. package/dist/core/models/llama-cpp/strands-llama-cpp.js.map +1 -0
  50. package/dist/core/models/minimax.d.ts +2 -1
  51. package/dist/core/models/minimax.js +49 -7
  52. package/dist/core/models/minimax.js.map +1 -1
  53. package/dist/core/models/types.d.ts +125 -7
  54. package/dist/core/models/types.js +22 -2
  55. package/dist/core/models/types.js.map +1 -1
  56. package/dist/core/prompts/environment.d.ts +10 -1
  57. package/dist/core/prompts/environment.js +15 -1
  58. package/dist/core/prompts/environment.js.map +1 -1
  59. package/dist/core/prompts/static/environment.md +2 -1
  60. package/dist/core/prompts/static/web-search.md +1 -1
  61. package/dist/core/prompts/system.d.ts +6 -0
  62. package/dist/core/prompts/system.js +7 -1
  63. package/dist/core/prompts/system.js.map +1 -1
  64. package/dist/core/skills/built-in/hooman-config/SKILL.md +21 -5
  65. package/dist/core/skills/built-in/hooman-config/providers.md +2 -0
  66. package/dist/core/skills/built-in/hooman-mcp/SKILL.md +20 -0
  67. package/dist/core/tools/ask-user.d.ts +8 -0
  68. package/dist/core/tools/ask-user.js +8 -4
  69. package/dist/core/tools/ask-user.js.map +1 -1
  70. package/dist/core/tools/time.js +1 -1
  71. package/dist/core/tools/time.js.map +1 -1
  72. package/dist/core/utils/logging.d.ts +29 -0
  73. package/dist/core/utils/logging.js +64 -0
  74. package/dist/core/utils/logging.js.map +1 -0
  75. package/dist/daemon/index.js +5 -0
  76. package/dist/daemon/index.js.map +1 -1
  77. package/dist/daemon/questions.d.ts +18 -0
  78. package/dist/daemon/questions.js +44 -0
  79. package/dist/daemon/questions.js.map +1 -0
  80. package/dist/index.d.ts +4 -2
  81. package/dist/index.js +2 -1
  82. package/dist/index.js.map +1 -1
  83. package/package.json +5 -1
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  <img src=".github/logo.svg" alt="Hooman logo" width="128" />
3
3
  <h1>Hooman</h1>
4
4
  <p>
5
- Hooman is a hackable AI agent toolkit for local workflows. It is built with TypeScript, <a href="https://www.npmjs.com/package/@strands-agents/sdk">Strands Agents SDK</a>, and <a href="https://github.com/vadimdemedes/ink">Ink</a>.
5
+ Hooman is a hackable, local-first AI agent toolkit for local workflows. It is built with TypeScript, <a href="https://www.npmjs.com/package/@strands-agents/sdk">Strands Agents SDK</a>, and <a href="https://github.com/vadimdemedes/ink">Ink</a>.
6
6
  </p>
7
7
  <p>
8
8
  <a href="https://nodejs.org"><img src="https://img.shields.io/badge/runtime-Node.js-5FA04E?logo=nodedotjs&logoColor=white" alt="Node.js" /></a>
@@ -15,729 +15,54 @@
15
15
  <p>
16
16
  <img src=".github/screenshot.png" alt="Hooman screenshot" />
17
17
  </p>
18
+ <p>
19
+ <strong><a href="https://vaibhavpandey.com/hooman/">Website</a></strong> ·
20
+ <strong><a href="https://vaibhavpandey.com/hooman/getting-started/">Docs</a></strong> ·
21
+ <strong><a href="https://vaibhavpandey.com/hooman/guides/vscode/">VS Code Extension</a></strong>
22
+ </p>
18
23
  </div>
19
24
 
20
- It gives you a practical toolkit to build and run agent workflows:
25
+ Hooman reads your codebase, edits files, and runs commands — from a terminal, VS Code, or any [Agent Client Protocol](https://agentclientprotocol.com) client. Bring your own model; your config, keys, and sessions never leave `~/.hooman`.
21
26
 
22
27
  - a one-shot `exec` command for single prompts
23
- - a stateful `chat` interface for iterative sessions
28
+ - a stateful `chat` interface for iterative sessions, with an in-chat `/config` workflow for models, MCP servers, and skills
24
29
  - a `daemon` command for channel-driven MCP automation
25
- - an in-chat `/config` workflow (Ink-powered) for general settings, models, MCP servers, and installed skills
26
- - an `acp` command for running Hooman as an Agent Client Protocol (ACP) agent over stdio
27
-
28
- ## Related
29
-
30
- **Looking for a focused web UI** for chat and agent configuration with lighter surface on top of the same stack? See [**Zero**](https://github.com/vaibhavpandeyvpz/zero) — [README](https://github.com/vaibhavpandeyvpz/zero#readme).
31
-
32
- ## Features
33
-
34
- - Multiple LLM providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `minimax`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai`
35
- - Local configuration under `~/.hooman`
36
- - Optional web search tool with provider selection (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
37
- - MCP server support via `stdio`, `streamable-http`, and `sse`
38
- - MCP server `instructions` support: server-provided instructions are appended to the agent system prompt
39
- - MCP channel notifications: `hooman daemon` subscribes to servers that advertise `hooman/channel`
40
- - Runtime skills via Strands `AgentSkills`, loading bundled built-in skills plus local `~/.hooman/skills`
41
- - Bundled prompt harness toggles (`behaviour`, `communication`, `execution`, `guardrails`); coding guidance ships as the built-in `hooman-coding` skill
42
- - Built-in read-only subagent tools (`subagent_research`, `subagent_review`, `subagent_test_investigator`)
43
- - Built-in `grep` tool backed by ripgrep (`rg`), with runtime bootstrap when `rg` is not available on PATH
44
- - Built-in `ask_user` tool: the agent can ask you a multiple-choice question mid-task and wait for the answer — inline picker in `chat`, numbered prompt in `exec`, question card in ACP clients (Zed, the VS Code extension); environments without a human (daemon, non-TTY `exec`, subagents) report "no user available" so the agent proceeds on its own
45
- - Context-window utilization and session-cost tracking backed by [models.dev](https://models.dev) (daily-cached catalog, optional per-model `billing` overrides) — shown in the chat status bar, the VS Code extension footer, and sent to ACP clients via `usage_update`
46
- - Toolkit-oriented architecture with configurable tools, prompts, and transports
47
- - Interactive terminal UI for chat and configuration
30
+ - an `acp` command for running Hooman as an Agent Client Protocol agent over stdio (used by the [VS Code extension](https://vaibhavpandey.com/hooman/guides/vscode/) and editors like Zed)
48
31
 
49
- ## Requirements
50
-
51
- - [Node.js](https://nodejs.org) `>= 24`
52
- - npm for package installs and JavaScript tooling
53
- - Provider credentials or local model runtime depending on the LLM you choose
54
-
55
- ## Usage
56
-
57
- Fastest way to get started without cloning the repo:
32
+ ## Quick start
58
33
 
59
34
  ```bash
60
35
  npx hoomanjs
61
-
62
- # or install globally
63
- npm i -g hoomanjs
64
- ```
65
-
66
- Or with Bun:
67
-
68
- ```bash
69
- bunx hoomanjs
70
36
  ```
71
37
 
72
- Recommended first run:
73
-
74
- 1. Start chatting with `hooman` (same as `hooman chat`).
75
- 2. Run `/config` in chat to choose your LLM provider and model, and to manage MCP servers and skills.
76
- 3. Use `hooman exec "your prompt"` for one-off tasks.
77
-
78
- ## Must have
79
-
80
- For the best experience, set up both:
81
-
82
- 1. **MCP servers** for on-demand tools in `chat` / `exec` (task APIs, messaging, schedulers, etc.).
83
- 2. **MCP channels** for event-driven automation with `hooman daemon` (notifications become agent prompts).
84
-
85
- Suggested MCP servers from this ecosystem:
86
-
87
- - [`cronmcp`](https://github.com/vaibhavpandeyvpz/cronmcp) - lets Hooman schedule recurring prompts and automations, so routine checks and follow-ups run on time.
88
- - [`jiraxmcp`](https://github.com/vaibhavpandeyvpz/jiraxmcp) - gives Hooman direct Jira Cloud access to search issues, update tickets, and help drive sprint workflows.
89
- - [`slackxmcp`](https://github.com/vaibhavpandeyvpz/slackxmcp) - connects Hooman to Slack so it can read channel context, draft updates, and post actions where your team already works.
90
- - [`tgfmcp`](https://github.com/vaibhavpandeyvpz/tgfmcp) - enables Telegram bot workflows, making it easy to route notifications and respond from agent-driven chats.
91
- - [`wappmcp`](https://github.com/vaibhavpandeyvpz/wappmcp) - brings WhatsApp Web messaging into Hooman for customer or team communication automations.
92
-
93
- For production deployments, still review permissions and use least-privilege credentials/tokens for each integration.
94
-
95
- ## Install
96
-
97
- ```bash
98
- npm install
99
- ```
100
-
101
- Run locally:
102
-
103
- ```bash
104
- npm run dev -- --help
105
- ```
106
-
107
- Or use the dev alias:
108
-
109
- ```bash
110
- npm run build
111
- node dist/cli.js --help
112
- ```
113
-
114
- Link the CLI locally:
115
-
116
- ```bash
117
- npm link
118
- hooman --help
119
- ```
120
-
121
- ## Commands
122
-
123
- ### `hooman exec`
124
-
125
- Run a single prompt once.
126
-
127
- ```bash
128
- hooman exec "Summarize the current repository"
129
- ```
130
-
131
- Use a specific session id:
132
-
133
- ```bash
134
- hooman exec "What changed?" --session my-session
135
- ```
136
-
137
- Skip interactive tool approval (allows every tool call; use only when you trust the prompt and environment):
138
-
139
- ```bash
140
- hooman exec "Summarize this repo" --yolo
141
- ```
142
-
143
- Start in **ask** mode (narrower tool surface, no plan lifecycle tools; see [Session mode](#session-mode)):
144
-
145
- ```bash
146
- hooman exec "Map the architecture" --mode ask
147
- ```
148
-
149
- ### `hooman chat`
150
-
151
- Start an interactive stateful chat session.
152
-
153
- ```bash
154
- hooman
155
- ```
156
-
157
- Equivalent explicit form:
158
-
159
- ```bash
160
- hooman chat
161
- ```
162
-
163
- Optional initial prompt:
164
-
165
- ```bash
166
- hooman chat "Help me prioritize the next task"
167
- ```
168
-
169
- Resume or pin a session id:
170
-
171
- ```bash
172
- hooman chat --session my-session
173
- ```
174
-
175
- Skip the in-chat tool approval UI (same semantics as `exec --yolo`):
176
-
177
- ```bash
178
- hooman chat --yolo
179
- ```
180
-
181
- Start in ask mode:
182
-
183
- ```bash
184
- hooman chat --mode ask
185
- ```
186
-
187
- The status bar under the composer shows the active model, effort, mode, and yolo state; a usage row with `context: N% (used/size)`, cumulative `tokens` (`in`/`cin`/`out`), and session `cost: $…` (each segment appears once it has data — context and cost require resolvable billing metadata, see the [`billing` block](#provider-notes)); and an mcp/tools/skills row with a live `elapsed` timer while a turn runs.
188
-
189
- ### Chat commands
190
-
191
- Inside an interactive `chat` session, type `/` to discover slash commands:
192
-
193
- - `/model` - pick or set the chat model for this session.
194
- - `/effort` - pick or set the reasoning effort for the active model's provider (`off`, `minimal`, `low`, `medium`, `high`); Shift+Tab cycles it.
195
- - `/mode` - switch the session mode (`agent`, `ask`, `plan`); see [Session mode](#session-mode).
196
- - `/yolo` - toggle auto-approve of tool calls (`on` / `off`).
197
- - `/init` - generate or refresh `AGENTS.md` for the current project.
198
- - `/compact` - compact the conversation history now and persist the result.
199
- - `/new` - start a fresh chat session.
200
- - `/sessions` - browse and resume saved sessions.
201
- - `/config` - launch the configuration workflow (see below).
202
-
203
- ### Session mode
204
-
205
- `exec`, `chat`, and `daemon` accept **`-m` / `--mode`** with:
206
-
207
- - **`agent`** (default): normal tool surface and approvals.
208
- - **`plan`**: planning workflow with a reduced tool surface plus `enter_plan_mode` / `exit_plan_mode`.
209
- - **`ask`**: read-oriented, narrower surface (similar to interactive **plan** mode) but **without** `enter_plan_mode` / `exit_plan_mode`.
210
-
211
- In **`chat`**, `/mode` can switch between **agent**, **ask**, and **plan**. **ACP** sessions can set `hooman.sessionMode` to `agent`, `plan`, or `ask`.
212
-
213
- ### `hooman daemon`
214
-
215
- Run a long-lived daemon that **always** subscribes to MCP servers advertising the `hooman/channel` capability and feeds each received notification into the agent as a queued prompt.
216
-
217
- ```bash
218
- hooman daemon
219
- ```
220
-
221
- Resume or pin a session id:
222
-
223
- ```bash
224
- hooman daemon --session my-daemon
225
- ```
226
-
227
- Skip remote channel permission relay and allow every tool call from daemon turns (same risk profile as `exec` / `chat` with `--yolo`):
228
-
229
- ```bash
230
- hooman daemon --yolo
231
- ```
232
-
233
- Optional `--mode ask` matches `exec` / `chat` (narrow surface without plan lifecycle tools).
234
-
235
- Log raw notification payloads:
236
-
237
- ```bash
238
- hooman daemon --debug
239
- ```
240
-
241
- ### `hooman config`
242
-
243
- Print the effective runtime `config.json` for the current working directory in
244
- the same shape as `config.json`, with credential-like values redacted.
245
-
246
- ```bash
247
- hooman config
248
- ```
249
-
250
- ### Feature Flags
251
-
252
- Runtime tool and prompt switches are controlled from `config.json`:
253
-
254
- - `search.enabled`
255
- - `search.provider` (`brave`, `exa`, `firecrawl`, `serper`, or `tavily`)
256
- - `search.brave.apiKey`
257
- - `search.exa.apiKey`
258
- - `search.firecrawl.apiKey`
259
- - `search.serper.apiKey`
260
- - `search.tavily.apiKey`
261
- - `prompts.behaviour`
262
- - `prompts.communication`
263
- - `prompts.execution`
264
- - `prompts.guardrails`
265
- - `tools.todo.enabled`
266
- - `tools.fetch.enabled`
267
- - `tools.filesystem.enabled`
268
- - `tools.shell.enabled`
269
- - `tools.sleep.enabled`
270
- - `tools.subagents.enabled` (enables built-in subagent tools)
271
-
272
- ### `/config`
273
-
274
- The interactive configuration workflow is launched from inside a `chat` session with the `/config` slash command (there is no separate top-level `configure` command). It takes over the terminal on the alternate screen buffer while open, and restores the chat session on exit. Any config changes are picked up when the session re-bootstraps.
275
-
276
- ```text
277
- /config
278
- ```
38
+ Or install globally (`npm i -g hoomanjs`), or via Bun (`bunx hoomanjs`). Then run `/config` inside the chat to pick a provider and model. Full walkthrough: [Getting Started](https://vaibhavpandey.com/hooman/getting-started/).
279
39
 
280
- The configuration UI currently lets you:
281
-
282
- - manage general settings such as name, prompts, tools, and compaction
283
- - manage models and providers with field-by-field editors
284
- - choose search provider and set its API key
285
- - toggle bundled harness prompts (`behaviour`, `communication`, `execution`, `guardrails`)
286
- - edit `instructions.md` in your `$VISUAL` / `$EDITOR` (cross-platform fallback included)
287
- - add, edit, and delete MCP servers with field-by-field editors and confirmation
288
- - search, install, refresh, and remove skills
289
-
290
- ### `hooman acp`
291
-
292
- Run Hooman as an Agent Client Protocol (ACP) agent over stdio.
293
-
294
- ```bash
295
- hooman acp
296
- ```
297
-
298
- ACP notes:
299
-
300
- - ACP session metadata is indexed in the active project's `sessions/acp/sessions.jsonl`; conversation history lives in the regular per-session snapshots (see [Configuration Layout](#configuration-layout))
301
- - ACP loads MCP servers passed on `session/new` and `session/load`, in addition to Hooman's local `mcp.json`
302
- - ACP `session/new` and `session/load` support `_meta.userId`
303
- - session configuration includes `hooman.sessionMode` (`agent`, `plan`, or `ask`); see [Session mode](#session-mode)
304
- - each turn ends with a `usage_update` carrying context-window utilization (`used`/`size`), cumulative session `cost`, and cumulative token totals under `_meta["hoomanjs/tokens"]` — `size` and `cost` come from the model's [`billing` metadata](#provider-notes) (models.dev-backed) and are omitted (`size: 0`, no `cost`) when unresolved; a model switch pushes a fresh `usage_update` so clients can rescale immediately
305
-
306
- ## VS Code Extension
307
-
308
- `src/vscode/` ships a self-contained VS Code extension (`hooman-vscode`) that bridges `hooman acp` into the editor with a **Hooman chat panel** — its own webview view in the activity bar with streaming markdown, collapsible thinking, tool-call cards, plan checklists, usage, session list/load, mode/model/effort pickers, slash-command autocomplete, and inline permission prompts. Works in **stable VS Code, Insiders, and compatible forks** — no proposed APIs and no special subscription required.
309
-
310
- It's not published to the marketplace yet. Quick start:
311
-
312
- ```bash
313
- # from the repo root
314
- npm install && npm run build && npm link
315
-
316
- # from src/vscode
317
- cd src/vscode
318
- npm install && npm run compile
319
- code . # open src/vscode as its own workspace, then press F5
320
- ```
321
-
322
- Or package and install a `.vsix` into any VS Code-compatible editor: `npm run package` in `src/vscode`, then `code --install-extension hooman-vscode-<version>.vsix`.
323
-
324
- Full setup, settings, and architecture notes: [`src/vscode/README.md`](src/vscode/README.md).
325
-
326
- ## Configuration Layout
327
-
328
- Hooman stores its data in:
329
-
330
- ```text
331
- ~/.hooman/
332
- ```
333
-
334
- Important files and folders:
335
-
336
- - `config.json` - app name, reusable provider configs, model configs, tool flags, and compaction
337
- - `instructions.md` - system instructions used to build the agent prompt
338
- - `mcp.json` - MCP server definitions
339
- - `skills/` - installed skills
340
- - `bin/` - runtime-managed helper binaries (including bootstrapped `rg` for the `grep` tool when system `rg` is unavailable)
341
- - `cache/` - runtime caches used by tools and subsystems
342
- - `projects.json` - registry mapping each project root to a stable UUID
343
- - `projects/<uuid>/` - per-project storage, scoped to the project (git root, falling back to cwd) the session runs in:
344
- - `sessions/` - persisted session data (per-session snapshots and the ACP session index at `sessions/acp/sessions.jsonl`)
345
- - `offloaded-content/` - offloaded tool output (large tool results retrievable via `retrieve_offloaded_content`)
346
- - `memory/` - durable extracted memory store
347
- - `attachments/` - saved attachments (e.g. clipboard images)
348
- - `plans/` - plan-mode markdown documents
349
-
350
- ### Project-scoped storage
351
-
352
- `sessions`, `memory`, `attachments`, and `plans` are scoped per project rather than shared globally. On first use in a working directory, Hooman resolves the project root (the nearest git root, falling back to the cwd), mints a UUID for it, and records the mapping in `~/.hooman/projects.json`. All four folders then live under `~/.hooman/projects/<uuid>/`, so unrelated projects never see each other's sessions, memory, attachments, or plans. Config and MCP resolution are unaffected (see repo-local overlays below).
353
-
354
- ### Repo-local runtime overlays
355
-
356
- At runtime, Hooman resolves configuration in this order:
357
-
358
- 1. `~/.hooman/config.json` and `~/.hooman/mcp.json`
359
- 2. `<git-root>/.hooman/config.json` and `<git-root>/.hooman/mcp.json` (if present)
360
- 3. matching `.hooman/config.json` and `.hooman/mcp.json` files in nested directories from git root to current working directory
361
-
362
- Nearest files win when keys overlap.
363
-
364
- For app config (`config.json`):
365
-
366
- - plain objects are deep-merged
367
- - scalar values are overridden by the nearest file
368
- - `providers` and `llms` are merged by `name` (nearest entry with the same name replaces inherited entries)
369
-
370
- For MCP config (`mcp.json`):
371
-
372
- - `mcpServers` is merged by server name (nearest entry with the same name wins)
373
-
374
- Notes:
375
-
376
- - Runtime overlays apply to `chat`, `exec`, `daemon`, and `acp` bootstraps.
377
- - `hooman config` prints only the merged effective `config.json` shape with credential-like values redacted.
378
- - The `/config` UI and `hooman mcp auth/logout/auth-status` still target home config (`~/.hooman/*`) directly.
379
- - Keep secrets in home config unless you explicitly want project-scoped credentials.
380
-
381
- `grep` tool binary resolution order:
382
-
383
- 1. Use system `rg` when available.
384
- 2. Else use cached `~/.hooman/bin/rg` (or `rg.exe` on Windows).
385
- 3. Else download and verify a platform-specific ripgrep release into `~/.hooman/bin/`.
386
-
387
- ## Example `config.json`
388
-
389
- The on-disk shape uses a reusable **`providers`** array plus a non-empty **`llms`** array. Each provider stores a runtime `provider` id plus provider-specific `options`; each LLM references a provider by name, stores its model `options`, and marks one entry as the default. The bundled **hooman-config** skill documents the full schema.
390
-
391
- ```json
392
- {
393
- "name": "Hooman",
394
- "providers": [
395
- {
396
- "name": "Ollama",
397
- "provider": "ollama",
398
- "options": {}
399
- }
400
- ],
401
- "llms": [
402
- {
403
- "name": "Default",
404
- "provider": "Ollama",
405
- "options": {
406
- "model": "gemma4:e4b"
407
- },
408
- "default": true
409
- }
410
- ],
411
- "search": {
412
- "enabled": false,
413
- "provider": "brave",
414
- "brave": {},
415
- "exa": {},
416
- "firecrawl": {},
417
- "serper": {},
418
- "tavily": {}
419
- },
420
- "prompts": {
421
- "behaviour": true,
422
- "communication": true,
423
- "execution": true,
424
- "guardrails": true
425
- },
426
- "tools": {
427
- "todo": { "enabled": true },
428
- "fetch": { "enabled": true },
429
- "filesystem": { "enabled": true },
430
- "shell": { "enabled": true },
431
- "sleep": { "enabled": true },
432
- "subagents": { "enabled": true }
433
- },
434
- "compaction": {
435
- "ratio": 0.75,
436
- "keep": 5
437
- }
438
- }
439
- ```
440
-
441
- Tool approvals are session-scoped and are not persisted in `config.json`.
442
-
443
- Hooman enables Strands `ContextOffloader` by default with file-backed storage under the project-scoped `~/.hooman/projects/<uuid>/offloaded-content`, so large tool results can be previewed in-context and retrieved later without bloating the active conversation window.
444
-
445
- Supported `providers[].provider` values registered in this release (see `src/core/models/index.ts`):
446
-
447
- - `anthropic`
448
- - `azure`
449
- - `bedrock`
450
- - `google`
451
- - `groq`
452
- - `minimax`
453
- - `moonshot`
454
- - `ollama`
455
- - `openai`
456
- - `openrouter`
457
- - `xai`
458
-
459
- Supported `search.provider` values:
460
-
461
- - `brave`
462
- - `exa`
463
- - `firecrawl`
464
- - `serper`
465
- - `tavily`
466
-
467
- ## Provider Notes
468
-
469
- Provider entries now look like:
470
-
471
- ```json
472
- {
473
- "name": "MiniMax",
474
- "provider": "minimax",
475
- "options": {
476
- "apiKey": "..."
477
- }
478
- }
479
- ```
480
-
481
- LLM entries reference a provider by name and carry normalized model options:
482
-
483
- ```json
484
- {
485
- "name": "MiniMax M3",
486
- "provider": "MiniMax",
487
- "options": {
488
- "model": "MiniMax-M3",
489
- "temperature": 1,
490
- "maxTokens": 4096
491
- },
492
- "default": true
493
- }
494
- ```
495
-
496
- Supported provider option fields:
497
-
498
- All reasoning-capable providers share a common optional `reasoning` object (`{ effort?, summary?, display? }`). `effort` is `"minimal" | "low" | "medium" | "high"` and its presence enables thinking; Hooman translates it to each backend's native shape. `summary` (`"auto" | "concise" | "detailed" | "none"`) is only honored by the OpenAI/Azure Responses API. `display` (`"summarized" | "omitted"`) applies to Bedrock Claude / MiniMax only. See the bundled **hooman-config** skill for the exact per-provider mapping.
499
-
500
- - `anthropic`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
501
- - `azure`: optional `resourceName`, optional `baseURL`, optional `apiKey`, optional `headers`, optional `apiVersion`, optional `useDeploymentBasedUrls`, optional `reasoning`
502
- - `bedrock`: `region`, `accessKeyId`, `secretAccessKey`, optional `sessionToken`, optional `apiKey`, optional `reasoning`
503
- - `google`: `apiKey`, optional `reasoning`
504
- - `groq`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
505
- - `minimax`: `apiKey`, optional `headers`, optional `reasoning`
506
- - `moonshot`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
507
- - `ollama`: optional `baseURL`, optional `reasoning`
508
- - `openai`: `apiKey`, optional `baseURL`, optional `headers`, optional `api` (`"responses"` (default) or `"chat"`), optional `reasoning`
509
- - `openrouter`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
510
- - `xai`: `apiKey`, optional `baseURL`, optional `headers`, optional `reasoning`
511
-
512
- Normalized LLM option fields:
513
-
514
- - `model`
515
- - optional `temperature`
516
- - optional `maxTokens`
517
-
518
- Each LLM entry may also carry an optional **`billing`** block used to display context-window utilization and cumulative session cost (in the chat TUI status bar and the VS Code extension footer, and sent to ACP clients via `usage_update`):
519
-
520
- ```json
521
- {
522
- "name": "Haiku 4.5",
523
- "provider": "LiteLLM Anthropic",
524
- "billing": {
525
- "name": "claude-haiku-4.5",
526
- "context": 200000,
527
- "costs": { "input/m": 1, "cache/m": 0.1, "output/m": 5 }
528
- },
529
- "options": { "model": "claude-haiku-4.5" },
530
- "default": true
531
- }
532
- ```
533
-
534
- `billing.name` is required when the block is present and is the identifier looked up in the [models.dev](https://models.dev) catalog (cached under `~/.hooman/cache/` and refreshed at most once daily); when `billing` is omitted, `options.model` is used as the lookup name. `context` (window size in tokens) and `costs` (USD per million tokens; `"cache/m"` prices cached-input reads) override whatever models.dev resolves. If neither the config nor models.dev yields the data, context usage and cost are simply not shown.
535
-
536
- Notes:
537
-
538
- - Google maps normalized `maxTokens` to the SDK's `maxOutputTokens` internally.
539
- - Azure uses the Vercel AI SDK `@ai-sdk/azure` provider. Set the LLM `model` to your Azure deployment name, not the raw OpenAI model id.
540
- - Ollama maps normalized `temperature` into Ollama `options.temperature`.
541
- - MiniMax uses the Anthropic-compatible endpoint `https://api.minimax.io/anthropic` automatically.
542
- - Moonshot defaults `baseURL` to `https://api.moonshot.ai/v1` when it is omitted. It is served through the reasoning-aware openai-compatible adapter, so Kimi's `reasoning_content` streams as thinking — this makes it the right provider for reaching Kimi through an OpenAI-compatible proxy (e.g. LiteLLM), where the `openai` provider's Chat adapter would drop reasoning.
543
- - OpenRouter defaults `baseURL` to `https://openrouter.ai/api/v1` when it is omitted, and model names are usually provider-qualified ids such as `anthropic/claude-3.5-sonnet`. It also uses the openai-compatible adapter, so reasoning streams for reasoning models.
544
- - The `openai` provider defaults to the Responses API (`api: "responses"`), which surfaces reasoning. `api: "chat"` does NOT surface reasoning (the Chat adapter drops `reasoning_content`); route such proxies through `moonshot`/`openrouter` instead.
545
- - `reasoning.display` is for Bedrock Claude (Opus 4.7+ hide reasoning by default) and MiniMax; the native Anthropic API rejects it.
546
- - Bedrock can rely on the AWS default credential chain when explicit credentials are not provided.
547
-
548
- ## MCP Configuration
549
-
550
- Detailed design notes for planned OAuth-enabled remote MCP support live in [docs/mcp-oauth-design.md](docs/mcp-oauth-design.md).
551
-
552
- `mcp.json` is stored as:
553
-
554
- ```json
555
- {
556
- "mcpServers": {}
557
- }
558
- ```
559
-
560
- At runtime, project-local `.hooman/mcp.json` files are merged on top of `~/.hooman/mcp.json` from git root to current directory. On name conflicts, the nearest `mcpServers.<name>` entry wins.
561
-
562
- ### Example stdio server
563
-
564
- ```json
565
- {
566
- "mcpServers": {
567
- "filesystem": {
568
- "type": "stdio",
569
- "command": "npx",
570
- "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
571
- "env": {
572
- "EXAMPLE": "1"
573
- },
574
- "cwd": "/tmp"
575
- }
576
- }
577
- }
578
- ```
579
-
580
- ### Example streamable HTTP server
581
-
582
- ```json
583
- {
584
- "mcpServers": {
585
- "remote": {
586
- "type": "streamable-http",
587
- "url": "https://example.com/mcp",
588
- "headers": {
589
- "Authorization": "Bearer token"
590
- }
591
- }
592
- }
593
- }
594
- ```
595
-
596
- ### Example OAuth-capable remote server
597
-
598
- ```json
599
- {
600
- "mcpServers": {
601
- "linear": {
602
- "type": "streamable-http",
603
- "url": "https://example.com/mcp",
604
- "oauth": {
605
- "enabled": true,
606
- "clientId": "optional-pre-registered-client",
607
- "scopes": ["read", "write"],
608
- "callbackPort": 19876
609
- }
610
- }
611
- }
612
- }
613
- ```
614
-
615
- ### How the client identity is established
616
-
617
- When authorizing a remote server, the MCP SDK needs a `client_id`. Hooman resolves one in this order:
618
-
619
- 1. **Pre-registered client** — if `oauth.clientId` (and optionally `clientSecret`) is set, it is used as-is and no registration happens.
620
- 2. **Dynamic Client Registration (DCR)** — if the auth server advertises a `registration_endpoint`, Hooman registers a client on the fly. The redirect URI it registers is reused on later authorizations (persisted in `~/.hooman/mcp-oauth.json`), so keep it stable — set `oauth.callbackPort` or `oauth.redirectUri` if a server pins the redirect.
621
- 3. **Client ID Metadata Document (CIMD / SEP-991)** — some servers (e.g. Slack) support neither a static client nor DCR, and instead advertise `client_id_metadata_document_supported: true`. For these, the client presents an HTTPS URL that hosts a JSON metadata document; that URL becomes the `client_id`. Hooman sends `oauth.clientMetadataUrl` (falling back to a bundled default) whenever the server supports it.
622
-
623
- If a server supports none of these, authorization fails with `Incompatible auth server: does not support dynamic client registration` — supply a `clientId` or `clientMetadataUrl`.
624
-
625
- ### Hosting a CIMD document (GitHub Pages)
626
-
627
- The metadata document is a static JSON file served over HTTPS. A copy ships in this repo at [`docs/oauth/client-metadata.json`](docs/oauth/client-metadata.json) and is published via GitHub Pages at `https://vaibhavpandey.com/hooman/oauth/client-metadata.json`, which is the default `clientMetadataUrl`.
628
-
629
- Requirements when hosting your own:
630
-
631
- - The URL must be **HTTPS with a non-root path** (a bare domain is rejected).
632
- - The document's own `client_id` field must equal the hosted URL **exactly** (self-referential).
633
- - `redirect_uris` must include Hooman's loopback callback path `/mcp/oauth/callback`. Per RFC 8252 the loopback port is matched flexibly, so list the port-less hosts (`http://127.0.0.1/mcp/oauth/callback` and `http://localhost/mcp/oauth/callback`).
634
- - `token_endpoint_auth_method` is `"none"` (public client — the document is public and holds no secrets).
635
-
636
- Override the default per server:
637
-
638
- ```json
639
- {
640
- "mcpServers": {
641
- "slack": {
642
- "type": "streamable-http",
643
- "url": "https://mcp.slack.com/mcp",
644
- "oauth": {
645
- "enabled": true,
646
- "clientMetadataUrl": "https://vaibhavpandey.com/hooman/oauth/client-metadata.json"
647
- }
648
- }
649
- }
650
- }
651
- ```
652
-
653
- ### Example SSE server
654
-
655
- ```json
656
- {
657
- "mcpServers": {
658
- "legacy": {
659
- "type": "sse",
660
- "url": "https://example.com/sse",
661
- "headers": {
662
- "Authorization": "Bearer token"
663
- }
664
- }
665
- }
666
- }
667
- ```
668
-
669
- ## MCP Notes
670
-
671
- - MCP server `instructions` from the protocol `initialize` response are appended to Hooman's system prompt, after local `instructions.md` and session-specific prompt overrides.
672
- - Hooman reads these instructions automatically from connected MCP servers when building the agent.
673
- - Remote MCP OAuth helpers are available via:
674
- - `hooman mcp auth <server>`
675
- - `hooman mcp logout <server>`
676
- - `hooman mcp auth-status`
677
- - `hooman daemon` subscribes to MCP servers that advertise the experimental `hooman/channel` capability (always on; there is no opt-out flag).
678
- - Hooman also reads `hooman/user`, `hooman/session`, and `hooman/thread` capability paths so daemon turns preserve origin metadata from the source channel.
679
- - When a matching notification is received, Hooman uses `params.content` as the prompt if it is a string; otherwise it JSON-stringifies the notification params and sends that to the agent.
680
- - Daemon mode processes notifications sequentially and reuses the same agent session over time.
681
- - Tool calls from daemon turns are no longer blanket auto-approved: if the originating MCP server supports `hooman/channel/permission`, Hooman relays a remote approval request back to that source; otherwise the tool call is denied.
682
- - `exec`, `chat`, and `daemon` accept `--yolo` to bypass those approval paths and allow all tools without prompting or relay.
683
-
684
- ## Skills
685
-
686
- Skills are installed under:
687
-
688
- ```text
689
- ~/.hooman/skills
690
- ```
691
-
692
- At runtime, Hooman uses the Strands `AgentSkills` plugin to load:
693
-
694
- - bundled built-in skills shipped with Hooman
695
- - user-installed skills under `~/.hooman/skills`
40
+ ## Features
696
41
 
697
- The local skills folder is treated as a parent directory of skill subdirectories, where each installed skill should live in its own folder containing `SKILL.md`.
42
+ - Multiple LLM providers: `anthropic`, `azure`, `bedrock`, `google`, `groq`, `llama-cpp` (local GGUF, the default), `minimax`, `moonshot`, `ollama`, `openai`, `openrouter`, `xai` see [Models](https://vaibhavpandey.com/hooman/guides/configuration/models/)
43
+ - MCP server support (`stdio`, `streamable-http`, `sse`) with OAuth (DCR + CIMD) and channel-driven automation via `hooman daemon` — see [MCP](https://vaibhavpandey.com/hooman/guides/mcp/)
44
+ - Runtime [Skills](https://vaibhavpandey.com/hooman/guides/skills/): bundled built-ins plus a local `~/.hooman/skills` catalog
45
+ - Built-in read-only subagents, a ripgrep-backed `grep` tool, and an `ask_user` tool for mid-task questions — see [Tools](https://vaibhavpandey.com/hooman/guides/tools/)
46
+ - Context-window utilization and session-cost tracking backed by [models.dev](https://models.dev), shown live in every surface
47
+ - Interactive terminal UI for chat and configuration, plus a native [VS Code chat panel](https://vaibhavpandey.com/hooman/guides/vscode/)
698
48
 
699
- When a session starts, the plugin injects available skill metadata into the system prompt and exposes the `skills` tool so the model can activate a skill and load its full instructions on demand.
49
+ See the [full documentation](https://vaibhavpandey.com/hooman/) for CLI commands, configuration layout, provider setup, and more.
700
50
 
701
- The `/config` workflow can:
51
+ ## Related
702
52
 
703
- - search the public skills catalog
704
- - install a skill from a source string, repo, URL, or local path
705
- - refresh installed skills
706
- - remove installed skills with confirmation
53
+ **Looking for a focused web UI** for chat and agent configuration with a lighter surface on top of the same stack? See [**Zero**](https://github.com/vaibhavpandeyvpz/zero) — [README](https://github.com/vaibhavpandeyvpz/zero#readme).
707
54
 
708
55
  ## Development
709
56
 
710
- Install dependencies:
711
-
712
57
  ```bash
713
58
  npm install
59
+ npm run dev -- --help # run the CLI with tsx
60
+ npm run typecheck # tsc --noEmit
61
+ npm run build # tsc + copy bundled assets to dist/
714
62
  ```
715
63
 
716
- Run the CLI:
717
-
718
- ```bash
719
- npm run dev -- --help
720
- ```
721
-
722
- Run typecheck:
723
-
724
- ```bash
725
- npm run typecheck
726
- ```
727
-
728
- Build the project:
729
-
730
- ```bash
731
- npm run build
732
- ```
733
-
734
- After making any code change, run both verification steps:
735
-
736
- ```bash
737
- npm run typecheck
738
- npm run build
739
- ```
64
+ After making any code change, run both `npm run typecheck` and `npm run build`. See [`AGENTS.md`](AGENTS.md) for the full repository layout and contributor notes, and [Development](https://vaibhavpandey.com/hooman/development/) in the docs for the release workflow.
740
65
 
741
66
  ## License
742
67
 
743
- MIT. See `LICENSE`.
68
+ MIT. See [`LICENSE`](LICENSE).