hoomanjs 1.29.1 → 1.30.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 (270) hide show
  1. package/README.md +216 -69
  2. package/dist/acp/acp-agent.d.ts +5 -5
  3. package/dist/acp/acp-agent.js +55 -54
  4. package/dist/acp/acp-agent.js.map +1 -1
  5. package/dist/acp/approvals.d.ts +3 -3
  6. package/dist/acp/approvals.js +73 -115
  7. package/dist/acp/approvals.js.map +1 -1
  8. package/dist/acp/sessions/options.js +11 -25
  9. package/dist/acp/sessions/options.js.map +1 -1
  10. package/dist/acp/utils/tool-kind.js +1 -5
  11. package/dist/acp/utils/tool-kind.js.map +1 -1
  12. package/dist/chat/app.d.ts +5 -1
  13. package/dist/chat/app.js +322 -202
  14. package/dist/chat/app.js.map +1 -1
  15. package/dist/chat/approvals.d.ts +4 -3
  16. package/dist/chat/approvals.js +11 -45
  17. package/dist/chat/approvals.js.map +1 -1
  18. package/dist/chat/components/ChatMessage.d.ts +1 -2
  19. package/dist/chat/components/ChatMessage.js +4 -5
  20. package/dist/chat/components/ChatMessage.js.map +1 -1
  21. package/dist/chat/components/EmptyChatBanner.js +2 -3
  22. package/dist/chat/components/EmptyChatBanner.js.map +1 -1
  23. package/dist/chat/components/StatusBar.js +6 -2
  24. package/dist/chat/components/StatusBar.js.map +1 -1
  25. package/dist/chat/components/ThoughtEvent.d.ts +6 -0
  26. package/dist/chat/components/ThoughtEvent.js +30 -0
  27. package/dist/chat/components/ThoughtEvent.js.map +1 -0
  28. package/dist/chat/components/ToolEvent.js +1 -1
  29. package/dist/chat/components/ToolEvent.js.map +1 -1
  30. package/dist/chat/components/Transcript.d.ts +7 -2
  31. package/dist/chat/components/Transcript.js +6 -2
  32. package/dist/chat/components/Transcript.js.map +1 -1
  33. package/dist/chat/components/markdown/BlockRenderer.js +7 -7
  34. package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
  35. package/dist/chat/components/markdown/MarkdownMessage.js +1 -1
  36. package/dist/chat/components/markdown/MarkdownMessage.js.map +1 -1
  37. package/dist/chat/components/shared.js +2 -0
  38. package/dist/chat/components/shared.js.map +1 -1
  39. package/dist/chat/index.d.ts +4 -0
  40. package/dist/chat/index.js +17 -3
  41. package/dist/chat/index.js.map +1 -1
  42. package/dist/chat/steering.d.ts +20 -0
  43. package/dist/chat/steering.js +67 -0
  44. package/dist/chat/steering.js.map +1 -0
  45. package/dist/chat/types.d.ts +5 -1
  46. package/dist/cli.js +91 -13
  47. package/dist/cli.js.map +1 -1
  48. package/dist/configure/app.d.ts +1 -1
  49. package/dist/configure/app.js +581 -303
  50. package/dist/configure/app.js.map +1 -1
  51. package/dist/configure/components/MenuScreen.d.ts +4 -2
  52. package/dist/configure/components/MenuScreen.js +33 -6
  53. package/dist/configure/components/MenuScreen.js.map +1 -1
  54. package/dist/configure/components/SelectMenuItem.d.ts +1 -0
  55. package/dist/configure/components/SelectMenuItem.js +19 -10
  56. package/dist/configure/components/SelectMenuItem.js.map +1 -1
  57. package/dist/configure/index.js +4 -2
  58. package/dist/configure/index.js.map +1 -1
  59. package/dist/configure/types.d.ts +14 -12
  60. package/dist/configure/utils.d.ts +2 -0
  61. package/dist/configure/utils.js +21 -2
  62. package/dist/configure/utils.js.map +1 -1
  63. package/dist/core/agent/index.d.ts +3 -3
  64. package/dist/core/agent/index.js +20 -25
  65. package/dist/core/agent/index.js.map +1 -1
  66. package/dist/core/agent/mode-aware-tool-registry.js +2 -1
  67. package/dist/core/agent/mode-aware-tool-registry.js.map +1 -1
  68. package/dist/core/approvals/intervention.d.ts +34 -0
  69. package/dist/core/approvals/intervention.js +94 -0
  70. package/dist/core/approvals/intervention.js.map +1 -0
  71. package/dist/core/config.d.ts +49 -27
  72. package/dist/core/config.js +85 -25
  73. package/dist/core/config.js.map +1 -1
  74. package/dist/core/context/index.d.ts +11 -2
  75. package/dist/core/context/index.js +54 -4
  76. package/dist/core/context/index.js.map +1 -1
  77. package/dist/core/context/model-extractor.d.ts +13 -0
  78. package/dist/core/context/model-extractor.js +98 -0
  79. package/dist/core/context/model-extractor.js.map +1 -0
  80. package/dist/core/index.d.ts +6 -2
  81. package/dist/core/index.js +6 -1
  82. package/dist/core/index.js.map +1 -1
  83. package/dist/core/mcp/config.d.ts +28 -0
  84. package/dist/core/mcp/index.d.ts +5 -3
  85. package/dist/core/mcp/index.js +4 -2
  86. package/dist/core/mcp/index.js.map +1 -1
  87. package/dist/core/mcp/manager.d.ts +14 -1
  88. package/dist/core/mcp/manager.js +76 -4
  89. package/dist/core/mcp/manager.js.map +1 -1
  90. package/dist/core/mcp/oauth/callback-server.d.ts +16 -0
  91. package/dist/core/mcp/oauth/callback-server.js +134 -0
  92. package/dist/core/mcp/oauth/callback-server.js.map +1 -0
  93. package/dist/core/mcp/oauth/identity.d.ts +9 -0
  94. package/dist/core/mcp/oauth/identity.js +31 -0
  95. package/dist/core/mcp/oauth/identity.js.map +1 -0
  96. package/dist/core/mcp/oauth/index.d.ts +11 -0
  97. package/dist/core/mcp/oauth/index.js +15 -0
  98. package/dist/core/mcp/oauth/index.js.map +1 -0
  99. package/dist/core/mcp/oauth/provider.d.ts +43 -0
  100. package/dist/core/mcp/oauth/provider.js +203 -0
  101. package/dist/core/mcp/oauth/provider.js.map +1 -0
  102. package/dist/core/mcp/oauth/service.d.ts +29 -0
  103. package/dist/core/mcp/oauth/service.js +139 -0
  104. package/dist/core/mcp/oauth/service.js.map +1 -0
  105. package/dist/core/mcp/oauth/store.d.ts +14 -0
  106. package/dist/core/mcp/oauth/store.js +86 -0
  107. package/dist/core/mcp/oauth/store.js.map +1 -0
  108. package/dist/core/mcp/oauth/types.d.ts +87 -0
  109. package/dist/core/mcp/oauth/types.js +45 -0
  110. package/dist/core/mcp/oauth/types.js.map +1 -0
  111. package/dist/core/mcp/types.d.ts +56 -0
  112. package/dist/core/mcp/types.js +3 -0
  113. package/dist/core/mcp/types.js.map +1 -1
  114. package/dist/core/memory/file-store.d.ts +24 -0
  115. package/dist/core/memory/file-store.js +151 -0
  116. package/dist/core/memory/file-store.js.map +1 -0
  117. package/dist/core/memory/index.d.ts +2 -5
  118. package/dist/core/memory/index.js +2 -3
  119. package/dist/core/memory/index.js.map +1 -1
  120. package/dist/core/memory/runtime.d.ts +4 -0
  121. package/dist/core/memory/runtime.js +37 -0
  122. package/dist/core/memory/runtime.js.map +1 -0
  123. package/dist/core/models/anthropic.js +24 -1
  124. package/dist/core/models/anthropic.js.map +1 -1
  125. package/dist/core/models/moonshot.js +33 -1
  126. package/dist/core/models/moonshot.js.map +1 -1
  127. package/dist/core/modes/definitions.d.ts +19 -0
  128. package/dist/core/modes/definitions.js +99 -0
  129. package/dist/core/modes/definitions.js.map +1 -0
  130. package/dist/core/modes/index.d.ts +3 -0
  131. package/dist/core/modes/index.js +4 -0
  132. package/dist/core/modes/index.js.map +1 -0
  133. package/dist/core/modes/registry.d.ts +9 -0
  134. package/dist/core/modes/registry.js +57 -0
  135. package/dist/core/modes/registry.js.map +1 -0
  136. package/dist/core/modes/schema.d.ts +5 -0
  137. package/dist/core/modes/schema.js +6 -0
  138. package/dist/core/modes/schema.js.map +1 -0
  139. package/dist/core/prompts/agents/research.md +8 -8
  140. package/dist/core/prompts/bundled.d.ts +3 -0
  141. package/dist/core/prompts/bundled.js +14 -0
  142. package/dist/core/prompts/bundled.js.map +1 -0
  143. package/dist/core/prompts/environment.d.ts +0 -1
  144. package/dist/core/prompts/environment.js +0 -2
  145. package/dist/core/prompts/environment.js.map +1 -1
  146. package/dist/core/prompts/index.d.ts +1 -4
  147. package/dist/core/prompts/index.js +1 -7
  148. package/dist/core/prompts/index.js.map +1 -1
  149. package/dist/core/prompts/modes/agent.md +3 -0
  150. package/dist/core/prompts/modes/ask.md +5 -3
  151. package/dist/core/prompts/modes/plan.md +2 -2
  152. package/dist/core/prompts/session-mode-appendix.d.ts +3 -9
  153. package/dist/core/prompts/session-mode-appendix.js +32 -69
  154. package/dist/core/prompts/session-mode-appendix.js.map +1 -1
  155. package/dist/core/prompts/static/environment.md +2 -2
  156. package/dist/core/prompts/static/init.md +25 -0
  157. package/dist/core/prompts/static/memory.md +9 -123
  158. package/dist/core/prompts/static/planning.md +1 -1
  159. package/dist/core/prompts/static/skills.md +6 -5
  160. package/dist/core/prompts/static/subagents.md +2 -2
  161. package/dist/core/prompts/static/web-search.md +2 -1
  162. package/dist/core/prompts/system.js +8 -22
  163. package/dist/core/prompts/system.js.map +1 -1
  164. package/dist/core/skills/built-in/hooman-config/SKILL.md +105 -32
  165. package/dist/core/skills/built-in/hooman-skills/SKILL.md +1 -1
  166. package/dist/core/skills/index.d.ts +1 -0
  167. package/dist/core/skills/index.js +1 -0
  168. package/dist/core/skills/index.js.map +1 -1
  169. package/dist/core/skills/plugin.d.ts +7 -0
  170. package/dist/core/skills/plugin.js +40 -0
  171. package/dist/core/skills/plugin.js.map +1 -0
  172. package/dist/core/state/agent-app-state.d.ts +1 -1
  173. package/dist/core/state/agent-app-state.js +1 -1
  174. package/dist/core/state/session-mode.d.ts +2 -9
  175. package/dist/core/state/session-mode.js +4 -12
  176. package/dist/core/state/session-mode.js.map +1 -1
  177. package/dist/core/state/tool-approvals.d.ts +4 -8
  178. package/dist/core/state/tool-approvals.js +14 -76
  179. package/dist/core/state/tool-approvals.js.map +1 -1
  180. package/dist/core/subagents/index.d.ts +3 -0
  181. package/dist/core/subagents/index.js +4 -0
  182. package/dist/core/subagents/index.js.map +1 -0
  183. package/dist/core/subagents/research.d.ts +16 -0
  184. package/dist/core/subagents/research.js +58 -0
  185. package/dist/core/subagents/research.js.map +1 -0
  186. package/dist/core/{agents → subagents}/runner.d.ts +6 -5
  187. package/dist/core/{agents → subagents}/runner.js +8 -10
  188. package/dist/core/subagents/runner.js.map +1 -0
  189. package/dist/core/{agents/tools.d.ts → subagents/tool.d.ts} +6 -6
  190. package/dist/core/{agents/tools.js → subagents/tool.js} +14 -16
  191. package/dist/core/subagents/tool.js.map +1 -0
  192. package/dist/core/tools/plan.js +2 -6
  193. package/dist/core/tools/plan.js.map +1 -1
  194. package/dist/core/tools/time.js +1 -1
  195. package/dist/core/tools/time.js.map +1 -1
  196. package/dist/core/utils/browser.d.ts +1 -0
  197. package/dist/core/utils/browser.js +25 -0
  198. package/dist/core/utils/browser.js.map +1 -0
  199. package/dist/core/utils/paths.d.ts +2 -4
  200. package/dist/core/utils/paths.js +2 -4
  201. package/dist/core/utils/paths.js.map +1 -1
  202. package/dist/daemon/approvals.d.ts +2 -2
  203. package/dist/daemon/approvals.js +51 -56
  204. package/dist/daemon/approvals.js.map +1 -1
  205. package/dist/daemon/index.js +9 -6
  206. package/dist/daemon/index.js.map +1 -1
  207. package/dist/exec/approvals.d.ts +2 -4
  208. package/dist/exec/approvals.js +16 -48
  209. package/dist/exec/approvals.js.map +1 -1
  210. package/dist/index.d.ts +13 -18
  211. package/dist/index.js +9 -11
  212. package/dist/index.js.map +1 -1
  213. package/package.json +5 -18
  214. package/dist/chat/components/ScrollView.d.ts +0 -106
  215. package/dist/chat/components/ScrollView.js +0 -80
  216. package/dist/chat/components/ScrollView.js.map +0 -1
  217. package/dist/chat/components/TranscriptViewport.d.ts +0 -9
  218. package/dist/chat/components/TranscriptViewport.js +0 -124
  219. package/dist/chat/components/TranscriptViewport.js.map +0 -1
  220. package/dist/core/agents/definitions.d.ts +0 -12
  221. package/dist/core/agents/definitions.js +0 -20
  222. package/dist/core/agents/definitions.js.map +0 -1
  223. package/dist/core/agents/index.d.ts +0 -4
  224. package/dist/core/agents/index.js +0 -5
  225. package/dist/core/agents/index.js.map +0 -1
  226. package/dist/core/agents/registry.d.ts +0 -5
  227. package/dist/core/agents/registry.js +0 -84
  228. package/dist/core/agents/registry.js.map +0 -1
  229. package/dist/core/agents/runner.js.map +0 -1
  230. package/dist/core/agents/tools.js.map +0 -1
  231. package/dist/core/inference/embedder.d.ts +0 -26
  232. package/dist/core/inference/embedder.js +0 -85
  233. package/dist/core/inference/embedder.js.map +0 -1
  234. package/dist/core/inference/index.d.ts +0 -12
  235. package/dist/core/inference/index.js +0 -20
  236. package/dist/core/inference/index.js.map +0 -1
  237. package/dist/core/inference/loader.d.ts +0 -8
  238. package/dist/core/inference/loader.js +0 -85
  239. package/dist/core/inference/loader.js.map +0 -1
  240. package/dist/core/memory/brain.d.ts +0 -24
  241. package/dist/core/memory/brain.js +0 -133
  242. package/dist/core/memory/brain.js.map +0 -1
  243. package/dist/core/memory/database.d.ts +0 -4
  244. package/dist/core/memory/database.js +0 -87
  245. package/dist/core/memory/database.js.map +0 -1
  246. package/dist/core/memory/tools.d.ts +0 -16
  247. package/dist/core/memory/tools.js +0 -105
  248. package/dist/core/memory/tools.js.map +0 -1
  249. package/dist/core/memory/types.d.ts +0 -11
  250. package/dist/core/memory/types.js +0 -2
  251. package/dist/core/memory/types.js.map +0 -1
  252. package/dist/core/prompts/skills.d.ts +0 -15
  253. package/dist/core/prompts/skills.js +0 -92
  254. package/dist/core/prompts/skills.js.map +0 -1
  255. package/dist/core/prompts/static/wiki.md +0 -25
  256. package/dist/core/wiki/converters.d.ts +0 -12
  257. package/dist/core/wiki/converters.js +0 -73
  258. package/dist/core/wiki/converters.js.map +0 -1
  259. package/dist/core/wiki/database.d.ts +0 -39
  260. package/dist/core/wiki/database.js +0 -179
  261. package/dist/core/wiki/database.js.map +0 -1
  262. package/dist/core/wiki/index.d.ts +0 -7
  263. package/dist/core/wiki/index.js +0 -5
  264. package/dist/core/wiki/index.js.map +0 -1
  265. package/dist/core/wiki/storage.d.ts +0 -37
  266. package/dist/core/wiki/storage.js +0 -197
  267. package/dist/core/wiki/storage.js.map +0 -1
  268. package/dist/core/wiki/tools.d.ts +0 -5
  269. package/dist/core/wiki/tools.js +0 -32
  270. package/dist/core/wiki/tools.js.map +0 -1
package/README.md CHANGED
@@ -36,10 +36,10 @@ It gives you a practical toolkit to build and run agent workflows:
36
36
  - MCP server support via `stdio`, `streamable-http`, and `sse`
37
37
  - MCP server `instructions` support: server-provided instructions are appended to the agent system prompt
38
38
  - MCP channel notifications: `hooman daemon` subscribes to servers that advertise `hooman/channel`
39
- - Skill discovery from local `~/.hooman/skills` folders
39
+ - Runtime skills via Strands `AgentSkills`, loading bundled built-in skills plus local `~/.hooman/skills`
40
40
  - Bundled prompt harness toggles (`behaviour`, `communication`, `execution`, `guardrails`); coding guidance ships as the built-in `hooman-coding` skill
41
41
  - Built-in research sub-agent runner (`research`) with configurable concurrency
42
- - Toolkit-oriented architecture with configurable tools, prompts, memory, and transports
42
+ - Toolkit-oriented architecture with configurable tools, prompts, and transports
43
43
  - Interactive terminal UI for chat and configuration
44
44
 
45
45
  ## Requirements
@@ -54,7 +54,7 @@ Fastest way to get started without cloning the repo:
54
54
 
55
55
  ```bash
56
56
  npx hoomanjs configure
57
- npx hoomanjs chat
57
+ npx hoomanjs
58
58
 
59
59
  # or install globally
60
60
  npm i -g hoomanjs
@@ -64,13 +64,13 @@ Or with Bun:
64
64
 
65
65
  ```bash
66
66
  bunx hoomanjs configure
67
- bunx hoomanjs chat
67
+ bunx hoomanjs
68
68
  ```
69
69
 
70
70
  Recommended first run:
71
71
 
72
72
  1. Run `hooman configure` to choose your LLM provider and model.
73
- 2. Start chatting with `hooman chat`.
73
+ 2. Start chatting with `hooman` (same as `hooman chat`).
74
74
  3. Use `hooman exec "your prompt"` for one-off tasks.
75
75
 
76
76
  ## Must have
@@ -148,6 +148,12 @@ hooman exec "Map the architecture" --mode ask
148
148
 
149
149
  Start an interactive stateful chat session.
150
150
 
151
+ ```bash
152
+ hooman
153
+ ```
154
+
155
+ Equivalent explicit form:
156
+
151
157
  ```bash
152
158
  hooman chat
153
159
  ```
@@ -180,10 +186,11 @@ hooman chat --mode ask
180
186
 
181
187
  `exec`, `chat`, and `daemon` accept **`-m` / `--mode`** with:
182
188
 
183
- - **`default`** (default): normal tool surface and approvals.
189
+ - **`agent`** (default): normal tool surface and approvals.
190
+ - **`plan`**: planning workflow with a reduced tool surface plus `enter_plan_mode` / `exit_plan_mode`.
184
191
  - **`ask`**: read-oriented, narrower surface (similar to interactive **plan** mode) but **without** `enter_plan_mode` / `exit_plan_mode`.
185
192
 
186
- In **`chat`**, `/mode` can also switch to **plan** (includes plan tools and a plan document workflow). **ACP** sessions can set `hooman.sessionMode` to `default`, `plan`, or `ask`.
193
+ In **`chat`**, `/mode` can switch between **agent**, **ask**, and **plan**. **ACP** sessions can set `hooman.sessionMode` to `agent`, `plan`, or `ask`.
187
194
 
188
195
  ### `hooman daemon`
189
196
 
@@ -233,17 +240,9 @@ Runtime tool and prompt switches are controlled from `config.json`:
233
240
  - `tools.filesystem.enabled`
234
241
  - `tools.shell.enabled`
235
242
  - `tools.sleep.enabled`
236
- - `tools.memory.enabled`
237
- - Memory and wiki embedding model URI is fixed in code as `DEFAULT_EMBED_MODEL` in `src/core/config.ts` (not configurable in `config.json`).
238
- - Local embed GPU selection uses **`HOOMAN_LLAMA_GPU`**: unset defaults to **`auto`** (CI forces CPU off); use `false`, `off`, `none`, `disable`, `disabled`, or `0` for CPU-only; or `metal`, `vulkan`, or `cuda` for an explicit backend. Optional **`HOOMAN_EMBED_CONTEXT_SIZE`** caps embedding context length (tokens).
239
- - `tools.wiki.enabled`
240
- - `tools.agents.enabled` (enables built-in `run_agents` tool)
243
+ - `tools.agents.enabled` (enables built-in `run_subagents` tool)
241
244
  - `tools.agents.concurrency` (defaults to `3` when omitted on load; a freshly generated default `config.json` uses `2`)
242
245
 
243
- Long-term memory uses **SQLite + sqlite-vec** at `$HOOMAN_HOME/memory.sqlite` and **local GGUF embeddings** via `node-llama-cpp` (model cache under `$HOOMAN_HOME/.models`). The same **sqlite-vec** native extension requirements apply (see the `sqlite-vec` package and your platform notes).
244
-
245
- With **`tools.wiki.enabled`**, the agent gets **`wiki_search`** only: semantic retrieval over the indexed knowledge base. Data lives under `$HOOMAN_HOME/wiki/` with chunks and vectors in **`$HOOMAN_HOME/wiki/content.sqlite`**. The first embed may download the configured GGUF model into `$HOOMAN_HOME/.models`. Documents are ingested as **PDF** (via **OpenDataLoader PDF**, which needs **Java 11+** on `PATH`) or **DOCX** (via **mammoth**).
246
-
247
246
  ### `hooman configure`
248
247
 
249
248
  Open the Ink configuration workflow.
@@ -275,7 +274,7 @@ ACP notes:
275
274
  - ACP loads MCP servers passed on `session/new` and `session/load`, in addition to Hooman's local `mcp.json`
276
275
  - ACP `session/new` and `session/load` support `_meta.userId` and `_meta.systemPrompt`
277
276
  - when `_meta.systemPrompt` is provided, it is appended to the agent system prompt with a section break
278
- - session configuration includes `hooman.sessionMode` (`default`, `plan`, or `ask`); see [Session mode](#session-mode)
277
+ - session configuration includes `hooman.sessionMode` (`agent`, `plan`, or `ask`); see [Session mode](#session-mode)
279
278
 
280
279
  ## Configuration Layout
281
280
 
@@ -287,10 +286,7 @@ Hooman stores its data in:
287
286
 
288
287
  Important files and folders:
289
288
 
290
- - `config.json` - app name, LLM provider/model, tool flags, memory/wiki settings, compaction
291
- - `memory.sqlite` - long-term memory vectors + rows (created when memory tools are used)
292
- - `.models/` - downloaded GGUF embedding weights (memory + wiki embedders)
293
- - `wiki/content.sqlite` - wiki document store and semantic chunk index (when wiki is used)
289
+ - `config.json` - app name, reusable provider configs, model configs, tool flags, and compaction
294
290
  - `instructions.md` - system instructions used to build the agent prompt
295
291
  - `mcp.json` - MCP server definitions
296
292
  - `skills/` - installed skills
@@ -299,16 +295,25 @@ Important files and folders:
299
295
 
300
296
  ## Example `config.json`
301
297
 
302
- The on-disk shape uses a non-empty **`llms`** array: each item has `name`, `options` (`provider`, `model`, `params`), and `default`. The bundled **hooman-config** skill documents the full schema.
298
+ The on-disk shape uses a reusable **`providers`** array plus a non-empty **`llms`** array. Each provider stores the shared runtime type and params once; each LLM references a provider by name, sets its `model`, optional model-specific `params`, and `default`. The bundled **hooman-config** skill documents the full schema.
303
299
 
304
300
  ```json
305
301
  {
306
302
  "name": "Hooman",
303
+ "providers": [
304
+ {
305
+ "name": "ollama-local",
306
+ "options": {
307
+ "provider": "ollama",
308
+ "params": {}
309
+ }
310
+ }
311
+ ],
307
312
  "llms": [
308
313
  {
309
314
  "name": "Default",
310
315
  "options": {
311
- "provider": "ollama",
316
+ "provider": "ollama-local",
312
317
  "model": "gemma4:e4b",
313
318
  "params": {}
314
319
  },
@@ -346,12 +351,6 @@ The on-disk shape uses a non-empty **`llms`** array: each item has `name`, `opti
346
351
  "sleep": {
347
352
  "enabled": true
348
353
  },
349
- "memory": {
350
- "enabled": false
351
- },
352
- "wiki": {
353
- "enabled": false
354
- },
355
354
  "agents": {
356
355
  "enabled": true,
357
356
  "concurrency": 2
@@ -366,7 +365,9 @@ The on-disk shape uses a non-empty **`llms`** array: each item has `name`, `opti
366
365
 
367
366
  Tool approvals are session-scoped and are not persisted in `config.json`.
368
367
 
369
- Supported `llms[].options.provider` values registered in this release (see `src/core/models/index.ts`):
368
+ Hooman enables Strands `ContextOffloader` by default with file-backed storage under `~/.hooman/sessions/offloaded-content`, so large tool results can be previewed in-context and retrieved later without bloating the active conversation window.
369
+
370
+ Supported `providers[].options.provider` values registered in this release (see `src/core/models/index.ts`):
370
371
 
371
372
  - `anthropic`
372
373
  - `bedrock`
@@ -395,9 +396,26 @@ Good default for local usage. Example:
395
396
 
396
397
  ```json
397
398
  {
398
- "provider": "ollama",
399
- "model": "gemma4:e4b",
400
- "params": {}
399
+ "providers": [
400
+ {
401
+ "name": "ollama-local",
402
+ "options": {
403
+ "provider": "ollama",
404
+ "params": {}
405
+ }
406
+ }
407
+ ],
408
+ "llms": [
409
+ {
410
+ "name": "Default",
411
+ "options": {
412
+ "provider": "ollama-local",
413
+ "model": "gemma4:e4b",
414
+ "params": {}
415
+ },
416
+ "default": true
417
+ }
418
+ ]
401
419
  }
402
420
  ```
403
421
 
@@ -409,11 +427,28 @@ Example:
409
427
 
410
428
  ```json
411
429
  {
412
- "provider": "openai",
413
- "model": "gpt-5",
414
- "params": {
415
- "apiKey": "..."
416
- }
430
+ "providers": [
431
+ {
432
+ "name": "openai",
433
+ "options": {
434
+ "provider": "openai",
435
+ "params": {
436
+ "apiKey": "..."
437
+ }
438
+ }
439
+ }
440
+ ],
441
+ "llms": [
442
+ {
443
+ "name": "GPT-5",
444
+ "options": {
445
+ "provider": "openai",
446
+ "model": "gpt-5",
447
+ "params": {}
448
+ },
449
+ "default": true
450
+ }
451
+ ]
417
452
  }
418
453
  ```
419
454
 
@@ -425,12 +460,30 @@ Uses Strands **AnthropicModel** (Anthropic Messages API). `apiKey` or `authToken
425
460
 
426
461
  ```json
427
462
  {
428
- "provider": "anthropic",
429
- "model": "claude-sonnet-4-20250514",
430
- "params": {
431
- "apiKey": "...",
432
- "temperature": 0.7
433
- }
463
+ "providers": [
464
+ {
465
+ "name": "anthropic",
466
+ "options": {
467
+ "provider": "anthropic",
468
+ "params": {
469
+ "apiKey": "..."
470
+ }
471
+ }
472
+ }
473
+ ],
474
+ "llms": [
475
+ {
476
+ "name": "Claude Sonnet",
477
+ "options": {
478
+ "provider": "anthropic",
479
+ "model": "claude-sonnet-4-20250514",
480
+ "params": {
481
+ "temperature": 0.7
482
+ }
483
+ },
484
+ "default": true
485
+ }
486
+ ]
434
487
  }
435
488
  ```
436
489
 
@@ -440,15 +493,33 @@ Uses Strands `GoogleModel` on top of `@google/genai`. Top-level options like `ap
440
493
 
441
494
  ```json
442
495
  {
443
- "provider": "google",
444
- "model": "gemini-2.5-flash",
445
- "params": {
446
- "apiKey": "...",
447
- "temperature": 0.7,
448
- "maxOutputTokens": 2048,
449
- "topP": 0.9,
450
- "topK": 40
451
- }
496
+ "providers": [
497
+ {
498
+ "name": "google",
499
+ "options": {
500
+ "provider": "google",
501
+ "params": {
502
+ "apiKey": "..."
503
+ }
504
+ }
505
+ }
506
+ ],
507
+ "llms": [
508
+ {
509
+ "name": "Gemini Flash",
510
+ "options": {
511
+ "provider": "google",
512
+ "model": "gemini-2.5-flash",
513
+ "params": {
514
+ "temperature": 0.7,
515
+ "maxOutputTokens": 2048,
516
+ "topP": 0.9,
517
+ "topK": 40
518
+ }
519
+ },
520
+ "default": true
521
+ }
522
+ ]
452
523
  }
453
524
  ```
454
525
 
@@ -458,22 +529,40 @@ Supports `region`, `clientConfig`, and optional `apiKey`, with all other values
458
529
 
459
530
  ```json
460
531
  {
461
- "provider": "bedrock",
462
- "model": "anthropic.claude-sonnet-4-20250514-v1:0",
463
- "params": {
464
- "region": "us-east-1",
465
- "clientConfig": {
466
- "profile": "dev",
467
- "maxAttempts": 3,
468
- "credentials": {
469
- "accessKeyId": "AKIA...",
470
- "secretAccessKey": "...",
471
- "sessionToken": "..."
532
+ "providers": [
533
+ {
534
+ "name": "bedrock-dev",
535
+ "options": {
536
+ "provider": "bedrock",
537
+ "params": {
538
+ "region": "us-east-1",
539
+ "clientConfig": {
540
+ "profile": "dev",
541
+ "maxAttempts": 3,
542
+ "credentials": {
543
+ "accessKeyId": "AKIA...",
544
+ "secretAccessKey": "...",
545
+ "sessionToken": "..."
546
+ }
547
+ }
548
+ }
472
549
  }
473
- },
474
- "temperature": 0.7,
475
- "maxTokens": 1024
476
- }
550
+ }
551
+ ],
552
+ "llms": [
553
+ {
554
+ "name": "Claude Sonnet",
555
+ "options": {
556
+ "provider": "bedrock-dev",
557
+ "model": "anthropic.claude-sonnet-4-20250514-v1:0",
558
+ "params": {
559
+ "temperature": 0.7,
560
+ "maxTokens": 1024
561
+ }
562
+ },
563
+ "default": true
564
+ }
565
+ ]
477
566
  }
478
567
  ```
479
568
 
@@ -481,6 +570,31 @@ You can also rely on the AWS default credential chain (recommended) by setting e
481
570
 
482
571
  ### Groq
483
572
 
573
+ ### Anthropic
574
+
575
+ Uses Strands `AnthropicModel` on top of `@anthropic-ai/sdk`. Provider-specific settings `apiKey`/`authToken`, `baseURL`, `headers`, `clientConfig`, `betas`, and `useNativeTokenCount` are picked up directly. Standard model config such as `temperature`, `topP`, `maxTokens`, and `stopSequences` stays top-level. Any other keys are forwarded to the Anthropic Messages request body, which is useful for Anthropic-compatible providers such as MiniMax.
576
+
577
+ For MiniMax specifically:
578
+
579
+ - Use `baseURL: "https://api.minimax.io/anthropic"`.
580
+ - `MiniMax-M3` can emit visible thinking blocks when you set `thinking: { "type": "adaptive" }`.
581
+ - `MiniMax-M2.7` / `M2.5` / `M2.1` / `M2` do internal reasoning, but MiniMax’s Anthropic-compatible API does not expose those as `thinking` content blocks, so Hooman has nothing to render in the transcript.
582
+
583
+ ```json
584
+ {
585
+ "provider": "anthropic",
586
+ "model": "MiniMax-M3",
587
+ "params": {
588
+ "apiKey": "...",
589
+ "baseURL": "https://api.minimax.io/anthropic",
590
+ "thinking": { "type": "adaptive" },
591
+ "temperature": 1
592
+ }
593
+ }
594
+ ```
595
+
596
+ ### Groq
597
+
484
598
  Uses the Vercel AI SDK Groq provider (`@ai-sdk/groq`) on top of Strands `VercelModel`. Provider-specific settings `apiKey`, `baseURL`, and `headers` are picked up; other values are forwarded into the model config (`temperature`, `maxTokens`, etc.). Defaults to `GROQ_API_KEY` from the environment when no `apiKey` is supplied.
485
599
 
486
600
  ```json
@@ -526,6 +640,8 @@ Uses the Vercel AI SDK xAI provider (`@ai-sdk/xai`) on top of Strands `VercelMod
526
640
 
527
641
  ## MCP Configuration
528
642
 
643
+ Detailed design notes for planned OAuth-enabled remote MCP support live in [docs/mcp-oauth-design.md](docs/mcp-oauth-design.md).
644
+
529
645
  `mcp.json` is stored as:
530
646
 
531
647
  ```json
@@ -568,6 +684,25 @@ Uses the Vercel AI SDK xAI provider (`@ai-sdk/xai`) on top of Strands `VercelMod
568
684
  }
569
685
  ```
570
686
 
687
+ ### Example OAuth-capable remote server
688
+
689
+ ```json
690
+ {
691
+ "mcpServers": {
692
+ "linear": {
693
+ "type": "streamable-http",
694
+ "url": "https://example.com/mcp",
695
+ "oauth": {
696
+ "enabled": true,
697
+ "clientId": "optional-pre-registered-client",
698
+ "scopes": ["read", "write"],
699
+ "callbackPort": 19876
700
+ }
701
+ }
702
+ }
703
+ }
704
+ ```
705
+
571
706
  ### Example SSE server
572
707
 
573
708
  ```json
@@ -588,6 +723,10 @@ Uses the Vercel AI SDK xAI provider (`@ai-sdk/xai`) on top of Strands `VercelMod
588
723
 
589
724
  - MCP server `instructions` from the protocol `initialize` response are appended to Hooman's system prompt, after local `instructions.md` and session-specific prompt overrides.
590
725
  - Hooman reads these instructions automatically from connected MCP servers when building the agent.
726
+ - Remote MCP OAuth helpers are available via:
727
+ - `hooman mcp auth <server>`
728
+ - `hooman mcp logout <server>`
729
+ - `hooman mcp auth-status`
591
730
  - `hooman daemon` subscribes to MCP servers that advertise the experimental `hooman/channel` capability (always on; there is no opt-out flag).
592
731
  - Hooman also reads `hooman/user`, `hooman/session`, and `hooman/thread` capability paths so daemon turns preserve origin metadata from the source channel.
593
732
  - 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.
@@ -603,7 +742,15 @@ Skills are installed under:
603
742
  ~/.hooman/skills
604
743
  ```
605
744
 
606
- Skills are discovered by scanning direct child directories for `SKILL.md`.
745
+ At runtime, Hooman uses the Strands `AgentSkills` plugin to load:
746
+
747
+ - bundled built-in skills shipped with Hooman
748
+ - user-installed skills under `~/.hooman/skills`
749
+
750
+ 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`.
751
+
752
+ 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.
753
+
607
754
  The configure workflow can:
608
755
 
609
756
  - search the public skills catalog
@@ -39,9 +39,9 @@ export declare class AcpAgent implements AgentContract {
39
39
  newSession(params: Parameters<AgentContract["newSession"]>[0]): Promise<{
40
40
  sessionId: `${string}-${string}-${string}-${string}-${string}`;
41
41
  modes: {
42
- currentModeId: "default";
42
+ currentModeId: "agent";
43
43
  availableModes: {
44
- id: "default";
44
+ id: "agent";
45
45
  name: string;
46
46
  description: string;
47
47
  }[];
@@ -51,9 +51,9 @@ export declare class AcpAgent implements AgentContract {
51
51
  }>;
52
52
  loadSession(params: Parameters<NonNullable<AgentContract["loadSession"]>>[0]): Promise<{
53
53
  modes: {
54
- currentModeId: "default";
54
+ currentModeId: "agent";
55
55
  availableModes: {
56
- id: "default";
56
+ id: "agent";
57
57
  name: string;
58
58
  description: string;
59
59
  }[];
@@ -63,7 +63,7 @@ export declare class AcpAgent implements AgentContract {
63
63
  }>;
64
64
  cancel(params: Parameters<AgentContract["cancel"]>[0]): Promise<void>;
65
65
  prompt(params: Parameters<AgentContract["prompt"]>[0]): Promise<{
66
- stopReason: "cancelled" | "end_turn" | "refusal";
66
+ stopReason: "cancelled" | "refusal" | "end_turn";
67
67
  }>;
68
68
  }
69
69
  export declare function runAcpStdio(): Promise<void>;