hoomanjs 1.18.0 → 1.18.1

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 (536) hide show
  1. package/README.md +22 -26
  2. package/dist/acp/acp-agent.d.ts +69 -0
  3. package/dist/acp/acp-agent.js +628 -0
  4. package/dist/acp/acp-agent.js.map +1 -0
  5. package/dist/acp/approvals.d.ts +5 -0
  6. package/dist/acp/approvals.js +130 -0
  7. package/dist/acp/approvals.js.map +1 -0
  8. package/dist/acp/index.d.ts +1 -0
  9. package/dist/acp/index.js +2 -0
  10. package/dist/acp/index.js.map +1 -0
  11. package/dist/acp/mcp-servers.d.ts +7 -0
  12. package/dist/acp/mcp-servers.js +57 -0
  13. package/dist/acp/mcp-servers.js.map +1 -0
  14. package/dist/acp/meta/system-prompt.d.ts +12 -0
  15. package/dist/acp/meta/system-prompt.js +41 -0
  16. package/dist/acp/meta/system-prompt.js.map +1 -0
  17. package/dist/acp/meta/user-id.d.ts +12 -0
  18. package/dist/acp/meta/user-id.js +43 -0
  19. package/dist/acp/meta/user-id.js.map +1 -0
  20. package/dist/acp/prompt-invoke.d.ts +10 -0
  21. package/dist/acp/prompt-invoke.js +131 -0
  22. package/dist/acp/prompt-invoke.js.map +1 -0
  23. package/dist/acp/sessions/config-options.d.ts +7 -0
  24. package/dist/acp/sessions/config-options.js +101 -0
  25. package/dist/acp/sessions/config-options.js.map +1 -0
  26. package/dist/acp/sessions/replay.d.ts +7 -0
  27. package/dist/acp/sessions/replay.js +117 -0
  28. package/dist/acp/sessions/replay.js.map +1 -0
  29. package/dist/acp/sessions/store.d.ts +24 -0
  30. package/dist/acp/sessions/store.js +96 -0
  31. package/dist/acp/sessions/store.js.map +1 -0
  32. package/dist/acp/sessions/title.d.ts +5 -0
  33. package/dist/acp/sessions/title.js +22 -0
  34. package/dist/acp/sessions/title.js.map +1 -0
  35. package/dist/acp/utils/paths.d.ts +2 -0
  36. package/{src/acp/utils/paths.ts → dist/acp/utils/paths.js} +2 -2
  37. package/dist/acp/utils/paths.js.map +1 -0
  38. package/dist/acp/utils/tool-kind.d.ts +6 -0
  39. package/dist/acp/utils/tool-kind.js +53 -0
  40. package/dist/acp/utils/tool-kind.js.map +1 -0
  41. package/dist/acp/utils/tool-locations.d.ts +3 -0
  42. package/dist/acp/utils/tool-locations.js +44 -0
  43. package/dist/acp/utils/tool-locations.js.map +1 -0
  44. package/dist/acp/utils/tool-result-content.d.ts +8 -0
  45. package/dist/acp/utils/tool-result-content.js +14 -0
  46. package/dist/acp/utils/tool-result-content.js.map +1 -0
  47. package/dist/chat/app.d.ts +15 -0
  48. package/dist/chat/app.js +458 -0
  49. package/dist/chat/app.js.map +1 -0
  50. package/dist/chat/approvals.d.ts +15 -0
  51. package/dist/chat/approvals.js +74 -0
  52. package/dist/chat/approvals.js.map +1 -0
  53. package/dist/chat/components/ApprovalPrompt.d.ts +6 -0
  54. package/dist/chat/components/ApprovalPrompt.js +11 -0
  55. package/dist/chat/components/ApprovalPrompt.js.map +1 -0
  56. package/dist/chat/components/ChatMessage.d.ts +7 -0
  57. package/dist/chat/components/ChatMessage.js +19 -0
  58. package/dist/chat/components/ChatMessage.js.map +1 -0
  59. package/dist/chat/components/Composer.d.ts +11 -0
  60. package/dist/chat/components/Composer.js +9 -0
  61. package/dist/chat/components/Composer.js.map +1 -0
  62. package/dist/chat/components/EmptyChatBanner.d.ts +2 -0
  63. package/dist/chat/components/EmptyChatBanner.js +8 -0
  64. package/dist/chat/components/EmptyChatBanner.js.map +1 -0
  65. package/dist/chat/components/PromptInput.d.ts +11 -0
  66. package/dist/chat/components/PromptInput.js +26 -0
  67. package/dist/chat/components/PromptInput.js.map +1 -0
  68. package/dist/chat/components/QueuedPrompts.d.ts +10 -0
  69. package/dist/chat/components/QueuedPrompts.js +38 -0
  70. package/dist/chat/components/QueuedPrompts.js.map +1 -0
  71. package/dist/chat/components/ReasoningStrip.d.ts +6 -0
  72. package/dist/chat/components/ReasoningStrip.js +13 -0
  73. package/dist/chat/components/ReasoningStrip.js.map +1 -0
  74. package/dist/chat/components/ScrollView.d.ts +101 -0
  75. package/dist/chat/components/ScrollView.js +74 -0
  76. package/dist/chat/components/ScrollView.js.map +1 -0
  77. package/dist/chat/components/Spinner.d.ts +8 -0
  78. package/dist/chat/components/Spinner.js +19 -0
  79. package/dist/chat/components/Spinner.js.map +1 -0
  80. package/dist/chat/components/StatusBar.d.ts +20 -0
  81. package/dist/chat/components/StatusBar.js +20 -0
  82. package/dist/chat/components/StatusBar.js.map +1 -0
  83. package/dist/chat/components/ThinkingStatus.d.ts +1 -0
  84. package/dist/chat/components/ThinkingStatus.js +119 -0
  85. package/dist/chat/components/ThinkingStatus.js.map +1 -0
  86. package/dist/chat/components/TodoPanel.d.ts +6 -0
  87. package/dist/chat/components/TodoPanel.js +27 -0
  88. package/dist/chat/components/TodoPanel.js.map +1 -0
  89. package/dist/chat/components/ToolEvent.d.ts +6 -0
  90. package/dist/chat/components/ToolEvent.js +18 -0
  91. package/dist/chat/components/ToolEvent.js.map +1 -0
  92. package/dist/chat/components/ToolEventFileResult.d.ts +9 -0
  93. package/dist/chat/components/ToolEventFileResult.js +50 -0
  94. package/dist/chat/components/ToolEventFileResult.js.map +1 -0
  95. package/dist/chat/components/Transcript.d.ts +7 -0
  96. package/dist/chat/components/Transcript.js +9 -0
  97. package/dist/chat/components/Transcript.js.map +1 -0
  98. package/dist/chat/components/TranscriptViewport.d.ts +9 -0
  99. package/dist/chat/components/TranscriptViewport.js +124 -0
  100. package/dist/chat/components/TranscriptViewport.js.map +1 -0
  101. package/dist/chat/components/ascii-logo.d.ts +1 -0
  102. package/{src/chat/components/ascii-logo.ts → dist/chat/components/ascii-logo.js} +3 -2
  103. package/dist/chat/components/ascii-logo.js.map +1 -0
  104. package/dist/chat/components/file-tool-diff/file-tool-result.d.ts +26 -0
  105. package/dist/chat/components/file-tool-diff/file-tool-result.js +73 -0
  106. package/dist/chat/components/file-tool-diff/file-tool-result.js.map +1 -0
  107. package/dist/chat/components/markdown/BlockRenderer.d.ts +8 -0
  108. package/dist/chat/components/markdown/BlockRenderer.js +87 -0
  109. package/dist/chat/components/markdown/BlockRenderer.js.map +1 -0
  110. package/dist/chat/components/markdown/CodeBlock.d.ts +7 -0
  111. package/dist/chat/components/markdown/CodeBlock.js +55 -0
  112. package/dist/chat/components/markdown/CodeBlock.js.map +1 -0
  113. package/dist/chat/components/markdown/InlineRenderer.d.ts +8 -0
  114. package/dist/chat/components/markdown/InlineRenderer.js +96 -0
  115. package/dist/chat/components/markdown/InlineRenderer.js.map +1 -0
  116. package/dist/chat/components/markdown/MarkdownMessage.d.ts +6 -0
  117. package/dist/chat/components/markdown/MarkdownMessage.js +13 -0
  118. package/dist/chat/components/markdown/MarkdownMessage.js.map +1 -0
  119. package/dist/chat/components/markdown/MarkdownTable.d.ts +6 -0
  120. package/dist/chat/components/markdown/MarkdownTable.js +12 -0
  121. package/dist/chat/components/markdown/MarkdownTable.js.map +1 -0
  122. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.d.ts +7 -0
  123. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.js +186 -0
  124. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.js.map +1 -0
  125. package/dist/chat/components/markdown/hooks/useMarkdownTokens.d.ts +9 -0
  126. package/dist/chat/components/markdown/hooks/useMarkdownTokens.js +25 -0
  127. package/dist/chat/components/markdown/hooks/useMarkdownTokens.js.map +1 -0
  128. package/dist/chat/components/markdown/lexer.d.ts +7 -0
  129. package/dist/chat/components/markdown/lexer.js +89 -0
  130. package/dist/chat/components/markdown/lexer.js.map +1 -0
  131. package/dist/chat/components/prompt-input/clipboard-image.d.ts +1 -0
  132. package/dist/chat/components/prompt-input/clipboard-image.js +112 -0
  133. package/dist/chat/components/prompt-input/clipboard-image.js.map +1 -0
  134. package/dist/chat/components/prompt-input/hooks/usePromptInputController.d.ts +1 -0
  135. package/dist/chat/components/prompt-input/hooks/usePromptInputController.js +2 -0
  136. package/dist/chat/components/prompt-input/hooks/usePromptInputController.js.map +1 -0
  137. package/dist/chat/components/prompt-input/input-model.d.ts +28 -0
  138. package/dist/chat/components/prompt-input/input-model.js +231 -0
  139. package/dist/chat/components/prompt-input/input-model.js.map +1 -0
  140. package/dist/chat/components/prompt-input/paste.d.ts +11 -0
  141. package/dist/chat/components/prompt-input/paste.js +85 -0
  142. package/dist/chat/components/prompt-input/paste.js.map +1 -0
  143. package/dist/chat/components/prompt-input/render.d.ts +13 -0
  144. package/dist/chat/components/prompt-input/render.js +54 -0
  145. package/dist/chat/components/prompt-input/render.js.map +1 -0
  146. package/dist/chat/components/prompt-input/usePromptInputController.d.ts +17 -0
  147. package/dist/chat/components/prompt-input/usePromptInputController.js +366 -0
  148. package/dist/chat/components/prompt-input/usePromptInputController.js.map +1 -0
  149. package/dist/chat/components/shared.d.ts +6 -0
  150. package/dist/chat/components/shared.js +66 -0
  151. package/dist/chat/components/shared.js.map +1 -0
  152. package/dist/chat/index.d.ts +13 -0
  153. package/dist/chat/index.js +18 -0
  154. package/dist/chat/index.js.map +1 -0
  155. package/dist/chat/mouse.d.ts +5 -0
  156. package/dist/chat/mouse.js +9 -0
  157. package/dist/chat/mouse.js.map +1 -0
  158. package/dist/chat/types.d.ts +20 -0
  159. package/dist/chat/types.js +2 -0
  160. package/dist/chat/types.js.map +1 -0
  161. package/dist/cli.d.ts +2 -0
  162. package/dist/cli.js +126 -0
  163. package/dist/cli.js.map +1 -0
  164. package/dist/configure/app.d.ts +3 -0
  165. package/dist/configure/app.js +1036 -0
  166. package/dist/configure/app.js.map +1 -0
  167. package/dist/configure/components/BusyScreen.d.ts +6 -0
  168. package/dist/configure/components/BusyScreen.js +7 -0
  169. package/dist/configure/components/BusyScreen.js.map +1 -0
  170. package/dist/configure/components/HomeScreen.d.ts +12 -0
  171. package/dist/configure/components/HomeScreen.js +7 -0
  172. package/dist/configure/components/HomeScreen.js.map +1 -0
  173. package/dist/configure/components/MenuScreen.d.ts +10 -0
  174. package/dist/configure/components/MenuScreen.js +15 -0
  175. package/dist/configure/components/MenuScreen.js.map +1 -0
  176. package/dist/configure/components/PromptForm.d.ts +8 -0
  177. package/dist/configure/components/PromptForm.js +12 -0
  178. package/dist/configure/components/PromptForm.js.map +1 -0
  179. package/dist/configure/components/SelectMenuItem.d.ts +7 -0
  180. package/dist/configure/components/SelectMenuItem.js +18 -0
  181. package/dist/configure/components/SelectMenuItem.js.map +1 -0
  182. package/dist/configure/index.d.ts +1 -0
  183. package/dist/configure/index.js +28 -0
  184. package/dist/configure/index.js.map +1 -0
  185. package/dist/configure/open-in-editor.d.ts +8 -0
  186. package/dist/configure/open-in-editor.js +120 -0
  187. package/dist/configure/open-in-editor.js.map +1 -0
  188. package/dist/configure/types.d.ts +63 -0
  189. package/dist/configure/types.js +2 -0
  190. package/dist/configure/types.js.map +1 -0
  191. package/dist/configure/utils.d.ts +19 -0
  192. package/dist/configure/utils.js +108 -0
  193. package/dist/configure/utils.js.map +1 -0
  194. package/dist/core/agent/index.d.ts +13 -0
  195. package/dist/core/agent/index.js +70 -0
  196. package/dist/core/agent/index.js.map +1 -0
  197. package/dist/core/agents/definitions.d.ts +12 -0
  198. package/dist/core/agents/definitions.js +35 -0
  199. package/dist/core/agents/definitions.js.map +1 -0
  200. package/dist/core/agents/index.d.ts +4 -0
  201. package/dist/core/agents/index.js +5 -0
  202. package/dist/core/agents/index.js.map +1 -0
  203. package/dist/core/agents/registry.d.ts +5 -0
  204. package/dist/core/agents/registry.js +84 -0
  205. package/dist/core/agents/registry.js.map +1 -0
  206. package/dist/core/agents/runner.d.ts +36 -0
  207. package/dist/core/agents/runner.js +275 -0
  208. package/dist/core/agents/runner.js.map +1 -0
  209. package/dist/core/agents/tools.d.ts +20 -0
  210. package/dist/core/agents/tools.js +66 -0
  211. package/dist/core/agents/tools.js.map +1 -0
  212. package/dist/core/config.d.ts +272 -0
  213. package/dist/core/config.js +334 -0
  214. package/dist/core/config.js.map +1 -0
  215. package/dist/core/index.d.ts +23 -0
  216. package/dist/core/index.js +21 -0
  217. package/dist/core/index.js.map +1 -0
  218. package/dist/core/mcp/config.d.ts +44 -0
  219. package/dist/core/mcp/config.js +65 -0
  220. package/dist/core/mcp/config.js.map +1 -0
  221. package/dist/core/mcp/index.d.ts +8 -0
  222. package/dist/core/mcp/index.js +12 -0
  223. package/dist/core/mcp/index.js.map +1 -0
  224. package/dist/core/mcp/manager.d.ts +69 -0
  225. package/dist/core/mcp/manager.js +376 -0
  226. package/dist/core/mcp/manager.js.map +1 -0
  227. package/dist/core/mcp/prefixed-mcp-tool.d.ts +14 -0
  228. package/dist/core/mcp/prefixed-mcp-tool.js +38 -0
  229. package/dist/core/mcp/prefixed-mcp-tool.js.map +1 -0
  230. package/dist/core/mcp/tools.d.ts +5 -0
  231. package/dist/core/mcp/tools.js +82 -0
  232. package/dist/core/mcp/tools.js.map +1 -0
  233. package/dist/core/mcp/types.d.ts +40 -0
  234. package/dist/core/mcp/types.js +28 -0
  235. package/dist/core/mcp/types.js.map +1 -0
  236. package/dist/core/memory/index.d.ts +3 -0
  237. package/dist/core/memory/index.js +3 -0
  238. package/dist/core/memory/index.js.map +1 -0
  239. package/dist/core/memory/ltm/embed.d.ts +16 -0
  240. package/dist/core/memory/ltm/embed.js +49 -0
  241. package/dist/core/memory/ltm/embed.js.map +1 -0
  242. package/dist/core/memory/ltm/index.d.ts +3 -0
  243. package/dist/core/memory/ltm/index.js +3 -0
  244. package/dist/core/memory/ltm/index.js.map +1 -0
  245. package/dist/core/memory/ltm/store.d.ts +20 -0
  246. package/dist/core/memory/ltm/store.js +271 -0
  247. package/dist/core/memory/ltm/store.js.map +1 -0
  248. package/dist/core/memory/ltm/tools.d.ts +21 -0
  249. package/dist/core/memory/ltm/tools.js +127 -0
  250. package/dist/core/memory/ltm/tools.js.map +1 -0
  251. package/dist/core/memory/ltm/types.d.ts +79 -0
  252. package/dist/core/memory/ltm/types.js +2 -0
  253. package/dist/core/memory/ltm/types.js.map +1 -0
  254. package/dist/core/memory/ltm/utils.d.ts +40 -0
  255. package/dist/core/memory/ltm/utils.js +145 -0
  256. package/dist/core/memory/ltm/utils.js.map +1 -0
  257. package/dist/core/memory/stm/flat-file-storage.d.ts +27 -0
  258. package/dist/core/memory/stm/flat-file-storage.js +63 -0
  259. package/dist/core/memory/stm/flat-file-storage.js.map +1 -0
  260. package/dist/core/memory/stm/index.d.ts +13 -0
  261. package/dist/core/memory/stm/index.js +24 -0
  262. package/dist/core/memory/stm/index.js.map +1 -0
  263. package/dist/core/memory/stm/lazy-session-manager.d.ts +37 -0
  264. package/dist/core/memory/stm/lazy-session-manager.js +163 -0
  265. package/dist/core/memory/stm/lazy-session-manager.js.map +1 -0
  266. package/dist/core/models/anthropic.d.ts +10 -0
  267. package/dist/core/models/anthropic.js +38 -0
  268. package/dist/core/models/anthropic.js.map +1 -0
  269. package/dist/core/models/bedrock.d.ts +21 -0
  270. package/dist/core/models/bedrock.js +24 -0
  271. package/dist/core/models/bedrock.js.map +1 -0
  272. package/dist/core/models/google.d.ts +10 -0
  273. package/dist/core/models/google.js +36 -0
  274. package/dist/core/models/google.js.map +1 -0
  275. package/dist/core/models/groq.d.ts +10 -0
  276. package/dist/core/models/groq.js +33 -0
  277. package/dist/core/models/groq.js.map +1 -0
  278. package/dist/core/models/index.d.ts +5 -0
  279. package/dist/core/models/index.js +11 -0
  280. package/dist/core/models/index.js.map +1 -0
  281. package/dist/core/models/moonshot.d.ts +11 -0
  282. package/dist/core/models/moonshot.js +39 -0
  283. package/dist/core/models/moonshot.js.map +1 -0
  284. package/dist/core/models/ollama/index.d.ts +3 -0
  285. package/dist/core/models/ollama/index.js +9 -0
  286. package/dist/core/models/ollama/index.js.map +1 -0
  287. package/dist/core/models/ollama/strands-ollama.d.ts +30 -0
  288. package/dist/core/models/ollama/strands-ollama.js +336 -0
  289. package/dist/core/models/ollama/strands-ollama.js.map +1 -0
  290. package/dist/core/models/openai.d.ts +4 -0
  291. package/dist/core/models/openai.js +9 -0
  292. package/dist/core/models/openai.js.map +1 -0
  293. package/dist/core/models/xai.d.ts +10 -0
  294. package/dist/core/models/xai.js +33 -0
  295. package/dist/core/models/xai.js.map +1 -0
  296. package/dist/core/prompts/environment.d.ts +11 -0
  297. package/dist/core/prompts/environment.js +51 -0
  298. package/dist/core/prompts/environment.js.map +1 -0
  299. package/dist/core/prompts/index.d.ts +7 -0
  300. package/dist/core/prompts/index.js +14 -0
  301. package/dist/core/prompts/index.js.map +1 -0
  302. package/dist/core/prompts/skills.d.ts +15 -0
  303. package/dist/core/prompts/skills.js +86 -0
  304. package/dist/core/prompts/skills.js.map +1 -0
  305. package/dist/core/prompts/system.d.ts +22 -0
  306. package/dist/core/prompts/system.js +164 -0
  307. package/dist/core/prompts/system.js.map +1 -0
  308. package/dist/core/skills/built-in/hooman-config/SKILL.md +9 -0
  309. package/dist/core/skills/index.d.ts +2 -0
  310. package/dist/core/skills/index.js +3 -0
  311. package/dist/core/skills/index.js.map +1 -0
  312. package/dist/core/skills/metadata.d.ts +8 -0
  313. package/dist/core/skills/metadata.js +20 -0
  314. package/dist/core/skills/metadata.js.map +1 -0
  315. package/dist/core/skills/registry.d.ts +38 -0
  316. package/dist/core/skills/registry.js +165 -0
  317. package/dist/core/skills/registry.js.map +1 -0
  318. package/dist/core/skills/tools.d.ts +9 -0
  319. package/dist/core/skills/tools.js +73 -0
  320. package/dist/core/skills/tools.js.map +1 -0
  321. package/dist/core/state/file-tool-display.d.ts +20 -0
  322. package/dist/core/state/file-tool-display.js +35 -0
  323. package/dist/core/state/file-tool-display.js.map +1 -0
  324. package/dist/core/state/thought-process.d.ts +18 -0
  325. package/dist/core/state/thought-process.js +21 -0
  326. package/dist/core/state/thought-process.js.map +1 -0
  327. package/dist/core/state/todos.d.ts +39 -0
  328. package/dist/core/state/todos.js +53 -0
  329. package/dist/core/state/todos.js.map +1 -0
  330. package/dist/core/state/tool-approvals.d.ts +12 -0
  331. package/dist/core/state/tool-approvals.js +81 -0
  332. package/dist/core/state/tool-approvals.js.map +1 -0
  333. package/dist/core/tools/fetch.d.ts +9 -0
  334. package/dist/core/tools/fetch.js +228 -0
  335. package/dist/core/tools/fetch.js.map +1 -0
  336. package/dist/core/tools/filesystem.d.ts +35 -0
  337. package/dist/core/tools/filesystem.js +791 -0
  338. package/dist/core/tools/filesystem.js.map +1 -0
  339. package/dist/core/tools/index.d.ts +9 -0
  340. package/dist/core/tools/index.js +10 -0
  341. package/dist/core/tools/index.js.map +1 -0
  342. package/dist/core/tools/shell.d.ts +18 -0
  343. package/dist/core/tools/shell.js +308 -0
  344. package/dist/core/tools/shell.js.map +1 -0
  345. package/dist/core/tools/sleep.d.ts +4 -0
  346. package/dist/core/tools/sleep.js +46 -0
  347. package/dist/core/tools/sleep.js.map +1 -0
  348. package/dist/core/tools/thinking.d.ts +12 -0
  349. package/dist/core/tools/thinking.js +119 -0
  350. package/dist/core/tools/thinking.js.map +1 -0
  351. package/dist/core/tools/time.d.ts +8 -0
  352. package/dist/core/tools/time.js +94 -0
  353. package/dist/core/tools/time.js.map +1 -0
  354. package/dist/core/tools/todo.d.ts +9 -0
  355. package/dist/core/tools/todo.js +33 -0
  356. package/dist/core/tools/todo.js.map +1 -0
  357. package/dist/core/tools/web-search.d.ts +11 -0
  358. package/dist/core/tools/web-search.js +211 -0
  359. package/dist/core/tools/web-search.js.map +1 -0
  360. package/dist/core/tools/wiki.d.ts +11 -0
  361. package/dist/core/tools/wiki.js +566 -0
  362. package/dist/core/tools/wiki.js.map +1 -0
  363. package/dist/core/utils/attachments.d.ts +23 -0
  364. package/dist/core/utils/attachments.js +125 -0
  365. package/dist/core/utils/attachments.js.map +1 -0
  366. package/dist/core/utils/cwd-context.d.ts +2 -0
  367. package/dist/core/utils/cwd-context.js +9 -0
  368. package/dist/core/utils/cwd-context.js.map +1 -0
  369. package/dist/core/utils/file-formats.d.ts +4 -0
  370. package/dist/core/utils/file-formats.js +48 -0
  371. package/dist/core/utils/file-formats.js.map +1 -0
  372. package/dist/core/utils/paths.d.ts +7 -0
  373. package/dist/core/utils/paths.js +25 -0
  374. package/dist/core/utils/paths.js.map +1 -0
  375. package/dist/daemon/approvals.d.ts +5 -0
  376. package/dist/daemon/approvals.js +95 -0
  377. package/dist/daemon/approvals.js.map +1 -0
  378. package/dist/daemon/index.d.ts +11 -0
  379. package/dist/daemon/index.js +106 -0
  380. package/dist/daemon/index.js.map +1 -0
  381. package/dist/daemon/queue.d.ts +5 -0
  382. package/dist/daemon/queue.js +38 -0
  383. package/dist/daemon/queue.js.map +1 -0
  384. package/dist/exec/approvals.d.ts +6 -0
  385. package/dist/exec/approvals.js +74 -0
  386. package/dist/exec/approvals.js.map +1 -0
  387. package/package.json +20 -9
  388. package/.github/screenshot.png +0 -0
  389. package/.github/workflows/build-publish.yml +0 -49
  390. package/docker-compose.yml +0 -13
  391. package/src/acp/acp-agent.ts +0 -814
  392. package/src/acp/approvals.ts +0 -146
  393. package/src/acp/index.ts +0 -1
  394. package/src/acp/mcp-servers.ts +0 -64
  395. package/src/acp/meta/system-prompt.ts +0 -44
  396. package/src/acp/meta/user-id.ts +0 -44
  397. package/src/acp/prompt-invoke.ts +0 -149
  398. package/src/acp/sessions/config-options.ts +0 -120
  399. package/src/acp/sessions/replay.ts +0 -131
  400. package/src/acp/sessions/store.ts +0 -161
  401. package/src/acp/sessions/title.ts +0 -22
  402. package/src/acp/utils/tool-kind.ts +0 -61
  403. package/src/acp/utils/tool-locations.ts +0 -48
  404. package/src/acp/utils/tool-result-content.ts +0 -27
  405. package/src/chat/app.tsx +0 -636
  406. package/src/chat/approvals.ts +0 -97
  407. package/src/chat/components/ApprovalPrompt.tsx +0 -25
  408. package/src/chat/components/ChatMessage.tsx +0 -50
  409. package/src/chat/components/Composer.tsx +0 -45
  410. package/src/chat/components/EmptyChatBanner.tsx +0 -26
  411. package/src/chat/components/PromptInput.tsx +0 -62
  412. package/src/chat/components/QueuedPrompts.tsx +0 -76
  413. package/src/chat/components/ReasoningStrip.tsx +0 -30
  414. package/src/chat/components/Spinner.tsx +0 -34
  415. package/src/chat/components/StatusBar.tsx +0 -67
  416. package/src/chat/components/ThinkingStatus.tsx +0 -128
  417. package/src/chat/components/TodoPanel.tsx +0 -49
  418. package/src/chat/components/ToolEvent.tsx +0 -41
  419. package/src/chat/components/ToolEventFileResult.tsx +0 -116
  420. package/src/chat/components/Transcript.tsx +0 -34
  421. package/src/chat/components/TranscriptViewport.tsx +0 -170
  422. package/src/chat/components/file-tool-diff/file-tool-result.ts +0 -155
  423. package/src/chat/components/markdown/BlockRenderer.tsx +0 -207
  424. package/src/chat/components/markdown/CodeBlock.tsx +0 -100
  425. package/src/chat/components/markdown/InlineRenderer.tsx +0 -122
  426. package/src/chat/components/markdown/MarkdownMessage.tsx +0 -35
  427. package/src/chat/components/markdown/MarkdownTable.tsx +0 -23
  428. package/src/chat/components/markdown/hooks/useMarkdownTableLayout.ts +0 -242
  429. package/src/chat/components/markdown/hooks/useMarkdownTokens.ts +0 -46
  430. package/src/chat/components/markdown/lexer.ts +0 -100
  431. package/src/chat/components/prompt-input/clipboard-image.ts +0 -119
  432. package/src/chat/components/prompt-input/hooks/usePromptInputController.ts +0 -4
  433. package/src/chat/components/prompt-input/input-model.ts +0 -294
  434. package/src/chat/components/prompt-input/paste.ts +0 -105
  435. package/src/chat/components/prompt-input/render.ts +0 -83
  436. package/src/chat/components/prompt-input/usePromptInputController.ts +0 -498
  437. package/src/chat/components/shared.ts +0 -70
  438. package/src/chat/index.tsx +0 -41
  439. package/src/chat/mouse.ts +0 -17
  440. package/src/chat/types.ts +0 -24
  441. package/src/cli.ts +0 -181
  442. package/src/configure/app.tsx +0 -1349
  443. package/src/configure/components/BusyScreen.tsx +0 -22
  444. package/src/configure/components/HomeScreen.tsx +0 -43
  445. package/src/configure/components/MenuScreen.tsx +0 -44
  446. package/src/configure/components/PromptForm.tsx +0 -40
  447. package/src/configure/components/SelectMenuItem.tsx +0 -30
  448. package/src/configure/index.tsx +0 -43
  449. package/src/configure/open-in-editor.ts +0 -133
  450. package/src/configure/types.ts +0 -51
  451. package/src/configure/utils.ts +0 -134
  452. package/src/core/agent/index.ts +0 -108
  453. package/src/core/agents/definitions.ts +0 -48
  454. package/src/core/agents/index.ts +0 -15
  455. package/src/core/agents/registry.ts +0 -106
  456. package/src/core/agents/runner.ts +0 -375
  457. package/src/core/agents/tools.ts +0 -100
  458. package/src/core/config.ts +0 -377
  459. package/src/core/index.ts +0 -60
  460. package/src/core/mcp/config.ts +0 -80
  461. package/src/core/mcp/index.ts +0 -33
  462. package/src/core/mcp/manager.ts +0 -491
  463. package/src/core/mcp/prefixed-mcp-tool.ts +0 -45
  464. package/src/core/mcp/tools.ts +0 -92
  465. package/src/core/mcp/types.ts +0 -37
  466. package/src/core/memory/index.ts +0 -17
  467. package/src/core/memory/ltm/embed.ts +0 -67
  468. package/src/core/memory/ltm/index.ts +0 -18
  469. package/src/core/memory/ltm/store.ts +0 -376
  470. package/src/core/memory/ltm/tools.ts +0 -146
  471. package/src/core/memory/ltm/types.ts +0 -111
  472. package/src/core/memory/ltm/utils.ts +0 -218
  473. package/src/core/memory/stm/flat-file-storage.ts +0 -89
  474. package/src/core/memory/stm/index.ts +0 -32
  475. package/src/core/memory/stm/lazy-session-manager.ts +0 -220
  476. package/src/core/models/anthropic.ts +0 -53
  477. package/src/core/models/bedrock.ts +0 -54
  478. package/src/core/models/google.ts +0 -51
  479. package/src/core/models/groq.ts +0 -48
  480. package/src/core/models/index.ts +0 -19
  481. package/src/core/models/moonshot.ts +0 -54
  482. package/src/core/models/ollama/index.ts +0 -13
  483. package/src/core/models/ollama/strands-ollama.ts +0 -439
  484. package/src/core/models/openai.ts +0 -12
  485. package/src/core/models/xai.ts +0 -47
  486. package/src/core/prompts/environment.ts +0 -71
  487. package/src/core/prompts/index.ts +0 -22
  488. package/src/core/prompts/skills.ts +0 -66
  489. package/src/core/prompts/system.ts +0 -183
  490. package/src/core/skills/index.ts +0 -2
  491. package/src/core/skills/registry.ts +0 -239
  492. package/src/core/skills/tools.ts +0 -80
  493. package/src/core/state/file-tool-display.ts +0 -70
  494. package/src/core/state/thought-process.ts +0 -49
  495. package/src/core/state/todos.ts +0 -84
  496. package/src/core/state/tool-approvals.ts +0 -100
  497. package/src/core/tools/fetch.ts +0 -288
  498. package/src/core/tools/filesystem.ts +0 -1105
  499. package/src/core/tools/index.ts +0 -9
  500. package/src/core/tools/shell.ts +0 -426
  501. package/src/core/tools/sleep.ts +0 -51
  502. package/src/core/tools/thinking.ts +0 -149
  503. package/src/core/tools/time.ts +0 -121
  504. package/src/core/tools/todo.ts +0 -44
  505. package/src/core/tools/web-search.ts +0 -278
  506. package/src/core/tools/wiki.ts +0 -703
  507. package/src/core/utils/attachments.ts +0 -201
  508. package/src/core/utils/cwd-context.ts +0 -11
  509. package/src/core/utils/file-formats.ts +0 -60
  510. package/src/core/utils/paths.ts +0 -37
  511. package/src/daemon/approvals.ts +0 -127
  512. package/src/daemon/index.ts +0 -153
  513. package/src/daemon/queue.ts +0 -48
  514. package/src/exec/approvals.ts +0 -90
  515. package/tsconfig.json +0 -30
  516. /package/{src → dist}/core/prompts/agents/plan.md +0 -0
  517. /package/{src → dist}/core/prompts/agents/research.md +0 -0
  518. /package/{src → dist}/core/prompts/harness/behaviour.md +0 -0
  519. /package/{src → dist}/core/prompts/harness/communication.md +0 -0
  520. /package/{src → dist}/core/prompts/harness/engineering.md +0 -0
  521. /package/{src → dist}/core/prompts/harness/execution.md +0 -0
  522. /package/{src → dist}/core/prompts/harness/guardrails.md +0 -0
  523. /package/{src → dist}/core/prompts/static/daemon.md +0 -0
  524. /package/{src → dist}/core/prompts/static/environment.md +0 -0
  525. /package/{src → dist}/core/prompts/static/fetch.md +0 -0
  526. /package/{src → dist}/core/prompts/static/filesystem.md +0 -0
  527. /package/{src → dist}/core/prompts/static/identity.md +0 -0
  528. /package/{src → dist}/core/prompts/static/ltm.md +0 -0
  529. /package/{src → dist}/core/prompts/static/shell.md +0 -0
  530. /package/{src → dist}/core/prompts/static/skills.md +0 -0
  531. /package/{src → dist}/core/prompts/static/sleep.md +0 -0
  532. /package/{src → dist}/core/prompts/static/subagents.md +0 -0
  533. /package/{src → dist}/core/prompts/static/thinking.md +0 -0
  534. /package/{src → dist}/core/prompts/static/todo.md +0 -0
  535. /package/{src → dist}/core/prompts/static/web-search.md +0 -0
  536. /package/{src → dist}/core/prompts/static/wiki.md +0 -0
@@ -0,0 +1,1036 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { Box, Text, useApp, useInput } from "ink";
5
+ import { LlmProvider } from "../core/config.js";
6
+ import { McpTransportSchema, } from "../core/mcp/types.js";
7
+ import { basePath, configJsonPath, instructionsMdPath, mcpJsonPath, skillsPath, } from "../core/utils/paths.js";
8
+ import { BusyScreen } from "./components/BusyScreen.js";
9
+ import { HomeScreen } from "./components/HomeScreen.js";
10
+ import { MenuScreen } from "./components/MenuScreen.js";
11
+ import { PromptForm } from "./components/PromptForm.js";
12
+ import { openFileInEditor } from "./open-in-editor.js";
13
+ import { DEFAULT_INSTRUCTIONS, compactJson, folderNameForSkill, normalizeOptional, noticeColor, parseNumber, parseObjectRecord, maskSensitiveParamsForDisplay, parseStringArray, parseStringRecord, transportSummary, truncate, } from "./utils.js";
14
+ const PROMPT_LABELS = {
15
+ behaviour: "Behaviour",
16
+ communication: "Communication",
17
+ execution: "Execution",
18
+ engineering: "Engineering",
19
+ guardrails: "Guardrails",
20
+ };
21
+ export function ConfigureApp({ config, mcpConfig, skills, onExit, }) {
22
+ const { exit } = useApp();
23
+ const [screen, setScreen] = useState({ kind: "home" });
24
+ const [prompt, setPrompt] = useState(null);
25
+ const [notice, setNotice] = useState(null);
26
+ const [busyMessage, setBusyMessage] = useState(null);
27
+ const [revision, setRevision] = useState(0);
28
+ const [installedSkills, setInstalledSkills] = useState([]);
29
+ const [searchResults, setSearchResults] = useState([]);
30
+ const refresh = useCallback(() => {
31
+ setRevision((value) => value + 1);
32
+ }, []);
33
+ const runTask = useCallback(async (label, task) => {
34
+ setBusyMessage(label);
35
+ try {
36
+ await task();
37
+ }
38
+ catch (error) {
39
+ setNotice({
40
+ kind: "error",
41
+ text: error instanceof Error ? error.message : String(error),
42
+ });
43
+ }
44
+ finally {
45
+ setBusyMessage(null);
46
+ }
47
+ }, []);
48
+ const refreshSkills = useCallback(async (label = "Loading installed skills...") => {
49
+ await runTask(label, async () => {
50
+ const next = await skills.list();
51
+ setInstalledSkills(next);
52
+ });
53
+ }, [runTask, skills]);
54
+ useEffect(() => {
55
+ void refreshSkills();
56
+ }, [refreshSkills]);
57
+ useInput((input, key) => {
58
+ if (key.ctrl && input.toLowerCase() === "c") {
59
+ onExit();
60
+ exit();
61
+ return;
62
+ }
63
+ if (!key.escape || busyMessage) {
64
+ return;
65
+ }
66
+ if (prompt) {
67
+ prompt.onCancel?.();
68
+ setPrompt(null);
69
+ return;
70
+ }
71
+ if (screen.kind === "mcp-delete-confirm") {
72
+ setScreen({ kind: "mcp" });
73
+ return;
74
+ }
75
+ if (screen.kind === "skills-delete-confirm") {
76
+ setScreen({ kind: "skills" });
77
+ return;
78
+ }
79
+ if (screen.kind !== "home") {
80
+ setScreen({ kind: "home" });
81
+ }
82
+ }, { isActive: true });
83
+ const configData = useMemo(() => ({
84
+ name: config.name,
85
+ llm: config.llm,
86
+ search: config.search,
87
+ prompts: config.prompts,
88
+ tools: config.tools,
89
+ compaction: config.compaction,
90
+ }), [config, revision]);
91
+ const mcpServers = useMemo(() => mcpConfig.list(), [mcpConfig, revision]);
92
+ const setSuccess = useCallback((text) => {
93
+ setNotice({ kind: "success", text });
94
+ }, []);
95
+ const updateConfig = useCallback((partial, message) => {
96
+ config.update(partial);
97
+ refresh();
98
+ setSuccess(message);
99
+ }, [config, refresh, setSuccess]);
100
+ const promptValue = useCallback((state) => {
101
+ setPrompt(state);
102
+ }, []);
103
+ const handlePromptSubmit = useCallback(async (value) => {
104
+ if (!prompt) {
105
+ return;
106
+ }
107
+ try {
108
+ await prompt.onSubmit(value);
109
+ }
110
+ catch (error) {
111
+ setNotice({
112
+ kind: "error",
113
+ text: error instanceof Error ? error.message : String(error),
114
+ });
115
+ }
116
+ }, [prompt]);
117
+ const promptForStdio = useCallback((name, initial) => {
118
+ const mode = initial ? "Edit" : "Add";
119
+ promptValue({
120
+ title: `${mode} stdio server`,
121
+ label: "Command",
122
+ initialValue: initial?.command ?? "",
123
+ placeholder: "npx",
124
+ onSubmit: async (commandValue) => {
125
+ const command = commandValue.trim();
126
+ if (!command) {
127
+ throw new Error("Command is required.");
128
+ }
129
+ promptValue({
130
+ title: `${mode} stdio server`,
131
+ label: "Arguments",
132
+ note: 'Example: ["-y", "@modelcontextprotocol/server-filesystem"]',
133
+ initialValue: compactJson(initial?.args ?? []),
134
+ placeholder: "[]",
135
+ onSubmit: async (argsValue) => {
136
+ const args = parseStringArray(argsValue, "Arguments");
137
+ promptValue({
138
+ title: `${mode} stdio server`,
139
+ label: "Environment variables (optional)",
140
+ initialValue: initial?.env ? compactJson(initial.env) : "",
141
+ placeholder: '{"API_KEY":"..."}',
142
+ onSubmit: async (envValue) => {
143
+ const env = parseStringRecord(envValue, "Environment variables");
144
+ promptValue({
145
+ title: `${mode} stdio server`,
146
+ label: "Working directory (optional)",
147
+ initialValue: initial?.cwd ?? "",
148
+ placeholder: "/absolute/path",
149
+ onSubmit: async (cwdValue) => {
150
+ const transport = McpTransportSchema.parse({
151
+ type: "stdio",
152
+ command,
153
+ ...(args.length > 0 ? { args } : {}),
154
+ ...(env && Object.keys(env).length > 0 ? { env } : {}),
155
+ ...(normalizeOptional(cwdValue)
156
+ ? { cwd: normalizeOptional(cwdValue) }
157
+ : {}),
158
+ });
159
+ if (initial) {
160
+ mcpConfig.update(name, transport);
161
+ setSuccess(`Updated MCP server "${name}".`);
162
+ }
163
+ else {
164
+ mcpConfig.add(name, transport);
165
+ setSuccess(`Added MCP server "${name}".`);
166
+ }
167
+ setPrompt(null);
168
+ setScreen({ kind: "mcp" });
169
+ refresh();
170
+ },
171
+ });
172
+ },
173
+ });
174
+ },
175
+ });
176
+ },
177
+ });
178
+ }, [mcpConfig, promptValue, refresh, setSuccess]);
179
+ const promptForRemote = useCallback((name, type, initial) => {
180
+ const mode = initial ? "Edit" : "Add";
181
+ promptValue({
182
+ title: `${mode} ${type} server`,
183
+ label: "URL",
184
+ initialValue: initial?.url ?? "",
185
+ placeholder: "https://example.com/mcp",
186
+ onSubmit: async (urlValue) => {
187
+ const url = urlValue.trim();
188
+ if (!url) {
189
+ throw new Error("URL is required.");
190
+ }
191
+ promptValue({
192
+ title: `${mode} ${type} server`,
193
+ label: "Headers (optional)",
194
+ initialValue: initial?.headers ? compactJson(initial.headers) : "",
195
+ placeholder: '{"Authorization":"Bearer ..."}',
196
+ onSubmit: async (headersValue) => {
197
+ const headers = parseStringRecord(headersValue, "Headers");
198
+ const transport = McpTransportSchema.parse({
199
+ type,
200
+ url,
201
+ ...(headers && Object.keys(headers).length > 0
202
+ ? { headers }
203
+ : {}),
204
+ });
205
+ if (initial) {
206
+ mcpConfig.update(name, transport);
207
+ setSuccess(`Updated MCP server "${name}".`);
208
+ }
209
+ else {
210
+ mcpConfig.add(name, transport);
211
+ setSuccess(`Added MCP server "${name}".`);
212
+ }
213
+ setPrompt(null);
214
+ setScreen({ kind: "mcp" });
215
+ refresh();
216
+ },
217
+ });
218
+ },
219
+ });
220
+ }, [mcpConfig, promptValue, refresh, setSuccess]);
221
+ const promptForServerName = useCallback((type) => {
222
+ promptValue({
223
+ title: `Add ${type} server`,
224
+ label: "Server name",
225
+ placeholder: "filesystem",
226
+ onSubmit: async (nameValue) => {
227
+ const name = nameValue.trim();
228
+ if (!name) {
229
+ throw new Error("Server name is required.");
230
+ }
231
+ if (type === "stdio") {
232
+ promptForStdio(name);
233
+ return;
234
+ }
235
+ promptForRemote(name, type);
236
+ },
237
+ });
238
+ }, [promptForRemote, promptForStdio, promptValue]);
239
+ const renderHome = () => {
240
+ const items = [
241
+ {
242
+ label: `Configuration • ${configData.llm.provider}/${configData.llm.model}`,
243
+ value: () => setScreen({ kind: "config" }),
244
+ },
245
+ {
246
+ label: "Instructions • edit instructions.md",
247
+ value: () => {
248
+ try {
249
+ const path = instructionsMdPath();
250
+ const current = existsSync(path)
251
+ ? readFileSync(path, "utf8")
252
+ : DEFAULT_INSTRUCTIONS;
253
+ const next = openFileInEditor(path, current).trim();
254
+ if (!next) {
255
+ throw new Error("instructions.md cannot be empty.");
256
+ }
257
+ writeFileSync(path, `${next}\n`, "utf8");
258
+ setSuccess("Updated instructions.md.");
259
+ }
260
+ catch (error) {
261
+ setNotice({
262
+ kind: "error",
263
+ text: error instanceof Error ? error.message : String(error),
264
+ });
265
+ }
266
+ },
267
+ },
268
+ {
269
+ label: `MCP servers • ${mcpServers.length} configured`,
270
+ value: () => setScreen({ kind: "mcp" }),
271
+ },
272
+ {
273
+ label: `Skills • ${installedSkills.length} installed`,
274
+ value: () => setScreen({ kind: "skills" }),
275
+ },
276
+ {
277
+ label: "Exit",
278
+ value: () => {
279
+ onExit();
280
+ exit();
281
+ },
282
+ },
283
+ ];
284
+ return (_jsx(HomeScreen, { rootPath: basePath(), configPath: configJsonPath(), instructionsPath: instructionsMdPath(), mcpPath: mcpJsonPath(), skillsPath: skillsPath(), items: items }));
285
+ };
286
+ const renderConfigMenu = () => {
287
+ const enabledPrompts = Object.values(configData.prompts).filter(Boolean).length;
288
+ const totalPrompts = Object.keys(configData.prompts).length;
289
+ const items = [
290
+ {
291
+ label: `Name • ${configData.name}`,
292
+ value: () => promptValue({
293
+ title: "Update app name",
294
+ label: "Name",
295
+ initialValue: configData.name,
296
+ onSubmit: async (value) => {
297
+ const next = value.trim();
298
+ if (!next) {
299
+ throw new Error("Name is required.");
300
+ }
301
+ updateConfig({ name: next }, "Updated app name.");
302
+ setPrompt(null);
303
+ },
304
+ }),
305
+ },
306
+ {
307
+ label: `LLM provider • ${configData.llm.provider}`,
308
+ value: () => setScreen({ kind: "config-provider" }),
309
+ },
310
+ {
311
+ label: `LLM model • ${configData.llm.model}`,
312
+ value: () => promptValue({
313
+ title: "Update model id",
314
+ label: "Model",
315
+ initialValue: configData.llm.model,
316
+ onSubmit: async (value) => {
317
+ const model = value.trim();
318
+ if (!model) {
319
+ throw new Error("Model is required.");
320
+ }
321
+ updateConfig({ llm: { ...config.llm, model } }, "Updated model id.");
322
+ setPrompt(null);
323
+ },
324
+ }),
325
+ },
326
+ {
327
+ label: `LLM params • ${truncate(compactJson(maskSensitiveParamsForDisplay(configData.llm.params)))}`,
328
+ value: () => promptValue({
329
+ title: "Update LLM params",
330
+ label: "Parameters",
331
+ initialValue: compactJson(configData.llm.params),
332
+ placeholder: '{"temperature":0.7}',
333
+ onSubmit: async (value) => {
334
+ const params = parseObjectRecord(value, "LLM params");
335
+ updateConfig({ llm: { ...config.llm, params } }, "Updated LLM params.");
336
+ setPrompt(null);
337
+ },
338
+ }),
339
+ },
340
+ {
341
+ label: `Prompts • ${enabledPrompts}/${totalPrompts} enabled`,
342
+ value: () => setScreen({ kind: "config-prompts" }),
343
+ },
344
+ {
345
+ label: "Tools • configure enabled tools",
346
+ value: () => setScreen({ kind: "config-tools" }),
347
+ },
348
+ {
349
+ label: `Compaction ratio • ${configData.compaction.ratio}`,
350
+ value: () => promptValue({
351
+ title: "Update compaction ratio",
352
+ label: "Ratio",
353
+ initialValue: String(configData.compaction.ratio),
354
+ onSubmit: async (value) => {
355
+ const ratio = parseNumber(value, "Compaction ratio", {
356
+ min: 0,
357
+ max: 1,
358
+ });
359
+ updateConfig({
360
+ compaction: {
361
+ ...config.compaction,
362
+ ratio,
363
+ },
364
+ }, "Updated compaction ratio.");
365
+ setPrompt(null);
366
+ },
367
+ }),
368
+ },
369
+ {
370
+ label: `Compaction keep • ${configData.compaction.keep}`,
371
+ value: () => promptValue({
372
+ title: "Update compaction keep",
373
+ label: "Keep",
374
+ initialValue: String(configData.compaction.keep),
375
+ onSubmit: async (value) => {
376
+ const keep = parseNumber(value, "Compaction keep", {
377
+ min: 0,
378
+ integer: true,
379
+ });
380
+ updateConfig({
381
+ compaction: {
382
+ ...config.compaction,
383
+ keep,
384
+ },
385
+ }, "Updated compaction keep.");
386
+ setPrompt(null);
387
+ },
388
+ }),
389
+ },
390
+ {
391
+ label: "Back",
392
+ value: () => setScreen({ kind: "home" }),
393
+ },
394
+ ];
395
+ return (_jsx(MenuScreen, { title: "Configuration", description: "Edit the same values loaded from ~/.hooman/config.json.", items: items }));
396
+ };
397
+ const renderToolsConfigMenu = () => {
398
+ const items = [
399
+ {
400
+ label: `Search tool • ${configData.search.enabled ? "Enabled" : "Disabled"} • ${configData.search.provider}`,
401
+ value: () => setScreen({ kind: "config-search" }),
402
+ },
403
+ {
404
+ label: `Todo tool • ${configData.tools.todo.enabled ? "Enabled" : "Disabled"}`,
405
+ value: () => {
406
+ updateConfig({
407
+ tools: {
408
+ ...config.tools,
409
+ todo: {
410
+ enabled: !configData.tools.todo.enabled,
411
+ },
412
+ },
413
+ }, `Todo tool ${configData.tools.todo.enabled ? "disabled" : "enabled"}.`);
414
+ setScreen({ kind: "config-tools" });
415
+ },
416
+ },
417
+ {
418
+ label: `Fetch tool • ${configData.tools.fetch.enabled ? "Enabled" : "Disabled"}`,
419
+ value: () => {
420
+ updateConfig({
421
+ tools: {
422
+ ...config.tools,
423
+ fetch: {
424
+ enabled: !configData.tools.fetch.enabled,
425
+ },
426
+ },
427
+ }, `Fetch tool ${configData.tools.fetch.enabled ? "disabled" : "enabled"}.`);
428
+ setScreen({ kind: "config-tools" });
429
+ },
430
+ },
431
+ {
432
+ label: `Filesystem tool • ${configData.tools.filesystem.enabled ? "Enabled" : "Disabled"}`,
433
+ value: () => {
434
+ updateConfig({
435
+ tools: {
436
+ ...config.tools,
437
+ filesystem: {
438
+ enabled: !configData.tools.filesystem.enabled,
439
+ },
440
+ },
441
+ }, `Filesystem tool ${configData.tools.filesystem.enabled ? "disabled" : "enabled"}.`);
442
+ setScreen({ kind: "config-tools" });
443
+ },
444
+ },
445
+ {
446
+ label: `Shell tool • ${configData.tools.shell.enabled ? "Enabled" : "Disabled"}`,
447
+ value: () => {
448
+ updateConfig({
449
+ tools: {
450
+ ...config.tools,
451
+ shell: {
452
+ enabled: !configData.tools.shell.enabled,
453
+ },
454
+ },
455
+ }, `Shell tool ${configData.tools.shell.enabled ? "disabled" : "enabled"}.`);
456
+ setScreen({ kind: "config-tools" });
457
+ },
458
+ },
459
+ {
460
+ label: `Sleep tool • ${configData.tools.sleep.enabled ? "Enabled" : "Disabled"}`,
461
+ value: () => {
462
+ updateConfig({
463
+ tools: {
464
+ ...config.tools,
465
+ sleep: {
466
+ enabled: !configData.tools.sleep.enabled,
467
+ },
468
+ },
469
+ }, `Sleep tool ${configData.tools.sleep.enabled ? "disabled" : "enabled"}.`);
470
+ setScreen({ kind: "config-tools" });
471
+ },
472
+ },
473
+ {
474
+ label: `Long-term memory • ${configData.tools.ltm.enabled ? "Enabled" : "Disabled"} • ${configData.tools.ltm.chroma.collection.memory}`,
475
+ value: () => setScreen({ kind: "config-ltm" }),
476
+ },
477
+ {
478
+ label: `Wiki tool • ${configData.tools.wiki.enabled ? "Enabled" : "Disabled"} • ${configData.tools.wiki.chroma.collection.wiki}`,
479
+ value: () => setScreen({ kind: "config-wiki" }),
480
+ },
481
+ {
482
+ label: `MCP tools • ${configData.tools.mcp.enabled ? "Enabled" : "Disabled"}`,
483
+ value: () => {
484
+ updateConfig({
485
+ tools: {
486
+ ...config.tools,
487
+ mcp: {
488
+ enabled: !configData.tools.mcp.enabled,
489
+ },
490
+ },
491
+ }, `MCP tools ${configData.tools.mcp.enabled ? "disabled" : "enabled"}.`);
492
+ setScreen({ kind: "config-tools" });
493
+ },
494
+ },
495
+ {
496
+ label: `Skills tools • ${configData.tools.skills.enabled ? "Enabled" : "Disabled"}`,
497
+ value: () => {
498
+ updateConfig({
499
+ tools: {
500
+ ...config.tools,
501
+ skills: {
502
+ enabled: !configData.tools.skills.enabled,
503
+ },
504
+ },
505
+ }, `Skills tools ${configData.tools.skills.enabled ? "disabled" : "enabled"}.`);
506
+ setScreen({ kind: "config-tools" });
507
+ },
508
+ },
509
+ {
510
+ label: "Back",
511
+ value: () => setScreen({ kind: "config" }),
512
+ },
513
+ ];
514
+ return (_jsx(MenuScreen, { title: "Tools", description: "Enable, disable, and configure built-in tools.", items: items }));
515
+ };
516
+ const renderProviderMenu = () => {
517
+ const items = [
518
+ ...Object.values(LlmProvider).map((provider) => ({
519
+ label: provider === configData.llm.provider
520
+ ? `${provider} • current`
521
+ : provider,
522
+ value: () => {
523
+ updateConfig({ llm: { ...config.llm, provider } }, `Updated LLM provider to "${provider}".`);
524
+ setScreen({ kind: "config" });
525
+ },
526
+ })),
527
+ {
528
+ label: "Back",
529
+ value: () => setScreen({ kind: "config" }),
530
+ },
531
+ ];
532
+ return (_jsx(MenuScreen, { title: "Choose Provider", description: "Pick which model provider to use for future sessions.", items: items }));
533
+ };
534
+ const renderPromptsConfigMenu = () => {
535
+ const promptKeys = Object.keys(PROMPT_LABELS);
536
+ const items = [
537
+ ...promptKeys.map((key) => {
538
+ const enabled = configData.prompts[key];
539
+ const label = PROMPT_LABELS[key];
540
+ return {
541
+ label: `${label} • ${enabled ? "Enabled" : "Disabled"}`,
542
+ value: () => {
543
+ updateConfig({
544
+ prompts: {
545
+ ...config.prompts,
546
+ [key]: !enabled,
547
+ },
548
+ }, `${label} prompt ${enabled ? "disabled" : "enabled"}.`);
549
+ setScreen({ kind: "config-prompts" });
550
+ },
551
+ };
552
+ }),
553
+ {
554
+ label: "Back",
555
+ value: () => setScreen({ kind: "config-tools" }),
556
+ },
557
+ ];
558
+ return (_jsx(MenuScreen, { title: "Prompts", description: "Choose which bundled harness prompt sections are included in future sessions.", items: items }));
559
+ };
560
+ const renderSearchProviderMenu = () => {
561
+ const items = [
562
+ ...["brave", "tavily"].map((provider) => ({
563
+ label: provider === configData.search.provider
564
+ ? `${provider} • current`
565
+ : provider,
566
+ value: () => {
567
+ updateConfig({
568
+ search: {
569
+ ...config.search,
570
+ provider,
571
+ },
572
+ }, `Updated search provider to "${provider}".`);
573
+ setScreen({ kind: "config-search" });
574
+ },
575
+ })),
576
+ {
577
+ label: "Back",
578
+ value: () => setScreen({ kind: "config-search" }),
579
+ },
580
+ ];
581
+ return (_jsx(MenuScreen, { title: "Search Provider", description: "Pick which web search provider to use.", items: items }));
582
+ };
583
+ const renderSearchConfigMenu = () => {
584
+ const activeProvider = configData.search.provider;
585
+ const apiKey = activeProvider === "brave"
586
+ ? configData.search.brave.apiKey
587
+ : configData.search.tavily.apiKey;
588
+ const redacted = compactJson(maskSensitiveParamsForDisplay({ apiKey: apiKey ?? "" }));
589
+ const items = [
590
+ {
591
+ label: `Enabled • ${configData.search.enabled ? "On" : "Off"}`,
592
+ value: () => {
593
+ updateConfig({
594
+ search: {
595
+ ...config.search,
596
+ enabled: !configData.search.enabled,
597
+ },
598
+ }, `Search tool ${configData.search.enabled ? "disabled" : "enabled"}.`);
599
+ setScreen({ kind: "config-search" });
600
+ },
601
+ },
602
+ {
603
+ label: `Provider • ${configData.search.provider}`,
604
+ value: () => setScreen({ kind: "config-search-provider" }),
605
+ },
606
+ {
607
+ label: `${activeProvider} API key • ${truncate(redacted, 44)}`,
608
+ value: () => promptValue({
609
+ title: `Update ${activeProvider} API key`,
610
+ label: "API key",
611
+ initialValue: apiKey ?? "",
612
+ onSubmit: async (value) => {
613
+ const nextApiKey = value.trim();
614
+ if (!nextApiKey) {
615
+ throw new Error("API key is required.");
616
+ }
617
+ updateConfig({
618
+ search: {
619
+ ...config.search,
620
+ [activeProvider]: {
621
+ ...config.search[activeProvider],
622
+ apiKey: nextApiKey,
623
+ },
624
+ },
625
+ }, `Updated ${activeProvider} API key.`);
626
+ setPrompt(null);
627
+ },
628
+ }),
629
+ },
630
+ {
631
+ label: "Back",
632
+ value: () => setScreen({ kind: "config-tools" }),
633
+ },
634
+ ];
635
+ return (_jsx(MenuScreen, { title: "Search", description: "Configure web search provider and credentials.", items: items }));
636
+ };
637
+ const renderLtmConfigMenu = () => {
638
+ const items = [
639
+ {
640
+ label: `Enabled • ${configData.tools.ltm.enabled ? "On" : "Off"}`,
641
+ value: () => {
642
+ updateConfig({
643
+ tools: {
644
+ ...config.tools,
645
+ ltm: {
646
+ ...config.tools.ltm,
647
+ enabled: !configData.tools.ltm.enabled,
648
+ },
649
+ },
650
+ }, `Long-term memory ${configData.tools.ltm.enabled ? "disabled" : "enabled"}.`);
651
+ setScreen({ kind: "config-ltm" });
652
+ },
653
+ },
654
+ {
655
+ label: `Chroma URL • ${configData.tools.ltm.chroma.url}`,
656
+ value: () => promptValue({
657
+ title: "Update LTM Chroma URL",
658
+ label: "URL",
659
+ initialValue: configData.tools.ltm.chroma.url,
660
+ onSubmit: async (value) => {
661
+ const url = value.trim();
662
+ if (!url) {
663
+ throw new Error("URL is required.");
664
+ }
665
+ updateConfig({
666
+ tools: {
667
+ ...config.tools,
668
+ ltm: {
669
+ ...config.tools.ltm,
670
+ chroma: {
671
+ ...config.tools.ltm.chroma,
672
+ url,
673
+ },
674
+ },
675
+ },
676
+ }, "Updated LTM Chroma URL.");
677
+ setPrompt(null);
678
+ },
679
+ }),
680
+ },
681
+ {
682
+ label: `Chroma collection • ${configData.tools.ltm.chroma.collection.memory}`,
683
+ value: () => promptValue({
684
+ title: "Update LTM Chroma collection",
685
+ label: "Collection name",
686
+ initialValue: configData.tools.ltm.chroma.collection.memory,
687
+ onSubmit: async (value) => {
688
+ const memory = value.trim();
689
+ if (!memory) {
690
+ throw new Error("Collection name is required.");
691
+ }
692
+ updateConfig({
693
+ tools: {
694
+ ...config.tools,
695
+ ltm: {
696
+ ...config.tools.ltm,
697
+ chroma: {
698
+ ...config.tools.ltm.chroma,
699
+ collection: { memory },
700
+ },
701
+ },
702
+ },
703
+ }, "Updated LTM Chroma collection.");
704
+ setPrompt(null);
705
+ },
706
+ }),
707
+ },
708
+ {
709
+ label: "Back",
710
+ value: () => setScreen({ kind: "config-tools" }),
711
+ },
712
+ ];
713
+ return (_jsx(MenuScreen, { title: "Long-term Memory", description: "Configure LTM memory storage and Chroma settings.", items: items }));
714
+ };
715
+ const renderWikiConfigMenu = () => {
716
+ const items = [
717
+ {
718
+ label: `Enabled • ${configData.tools.wiki.enabled ? "On" : "Off"}`,
719
+ value: () => {
720
+ updateConfig({
721
+ tools: {
722
+ ...config.tools,
723
+ wiki: {
724
+ ...config.tools.wiki,
725
+ enabled: !configData.tools.wiki.enabled,
726
+ },
727
+ },
728
+ }, `Wiki tool ${configData.tools.wiki.enabled ? "disabled" : "enabled"}.`);
729
+ setScreen({ kind: "config-wiki" });
730
+ },
731
+ },
732
+ {
733
+ label: `Chroma URL • ${configData.tools.wiki.chroma.url}`,
734
+ value: () => promptValue({
735
+ title: "Update Wiki Chroma URL",
736
+ label: "URL",
737
+ initialValue: configData.tools.wiki.chroma.url,
738
+ onSubmit: async (value) => {
739
+ const url = value.trim();
740
+ if (!url) {
741
+ throw new Error("URL is required.");
742
+ }
743
+ updateConfig({
744
+ tools: {
745
+ ...config.tools,
746
+ wiki: {
747
+ ...config.tools.wiki,
748
+ chroma: {
749
+ ...config.tools.wiki.chroma,
750
+ url,
751
+ },
752
+ },
753
+ },
754
+ }, "Updated Wiki Chroma URL.");
755
+ setPrompt(null);
756
+ },
757
+ }),
758
+ },
759
+ {
760
+ label: `Chroma collection • ${configData.tools.wiki.chroma.collection.wiki}`,
761
+ value: () => promptValue({
762
+ title: "Update Wiki Chroma collection",
763
+ label: "Collection name",
764
+ initialValue: configData.tools.wiki.chroma.collection.wiki,
765
+ onSubmit: async (value) => {
766
+ const wiki = value.trim();
767
+ if (!wiki) {
768
+ throw new Error("Collection name is required.");
769
+ }
770
+ updateConfig({
771
+ tools: {
772
+ ...config.tools,
773
+ wiki: {
774
+ ...config.tools.wiki,
775
+ chroma: {
776
+ ...config.tools.wiki.chroma,
777
+ collection: { wiki },
778
+ },
779
+ },
780
+ },
781
+ }, "Updated Wiki Chroma collection.");
782
+ setPrompt(null);
783
+ },
784
+ }),
785
+ },
786
+ {
787
+ label: "Back",
788
+ value: () => setScreen({ kind: "config" }),
789
+ },
790
+ ];
791
+ return (_jsx(MenuScreen, { title: "Wiki", description: "Configure wiki tool and Chroma-backed wiki search.", items: items }));
792
+ };
793
+ const renderMcpMenu = () => {
794
+ const serverItems = mcpServers.flatMap((server) => [
795
+ {
796
+ label: `Edit ${server.name} • ${transportSummary(server.transport)}`,
797
+ boldSubstring: server.name,
798
+ value: () => {
799
+ if (server.transport.type === "stdio") {
800
+ promptForStdio(server.name, server.transport);
801
+ }
802
+ else {
803
+ promptForRemote(server.name, server.transport.type, server.transport);
804
+ }
805
+ },
806
+ },
807
+ {
808
+ label: `Delete ${server.name}`,
809
+ boldSubstring: server.name,
810
+ value: () => setScreen({ kind: "mcp-delete-confirm", name: server.name }),
811
+ },
812
+ ]);
813
+ const items = [
814
+ {
815
+ label: "Add stdio server",
816
+ value: () => promptForServerName("stdio"),
817
+ },
818
+ {
819
+ label: "Add streamable HTTP server",
820
+ value: () => promptForServerName("streamable-http"),
821
+ },
822
+ {
823
+ label: "Add SSE server",
824
+ value: () => promptForServerName("sse"),
825
+ },
826
+ ...serverItems,
827
+ {
828
+ label: "Reload from disk",
829
+ value: () => {
830
+ mcpConfig.reload();
831
+ refresh();
832
+ setNotice({ kind: "info", text: "Reloaded MCP config from disk." });
833
+ },
834
+ },
835
+ {
836
+ label: "Back",
837
+ value: () => setScreen({ kind: "home" }),
838
+ },
839
+ ];
840
+ return (_jsx(MenuScreen, { title: "MCP Servers", description: "Add, edit, or remove named MCP transports from ~/.hooman/mcp.json.", items: items }));
841
+ };
842
+ const renderSkillsMenu = () => {
843
+ const skillItems = installedSkills.map((skill) => {
844
+ const folder = folderNameForSkill(skill);
845
+ return {
846
+ label: `Remove ${skill.name} • ${folder}`,
847
+ boldSubstring: skill.name,
848
+ value: () => setScreen({
849
+ kind: "skills-delete-confirm",
850
+ folder,
851
+ displayName: skill.name,
852
+ }),
853
+ };
854
+ });
855
+ const items = [
856
+ {
857
+ label: "Search catalog and install",
858
+ value: () => promptValue({
859
+ title: "Search skills catalog",
860
+ label: "Query",
861
+ placeholder: "memory, github, playwright...",
862
+ onSubmit: async (value) => {
863
+ const query = value.trim();
864
+ if (query.length < 2) {
865
+ throw new Error("Use at least 2 characters to search.");
866
+ }
867
+ setPrompt(null);
868
+ await runTask(`Searching for "${query}"...`, async () => {
869
+ const results = await skills.search(query);
870
+ setSearchResults(results);
871
+ setScreen({ kind: "skills-search-results", query });
872
+ setNotice({
873
+ kind: "info",
874
+ text: `Found ${results.length} result${results.length === 1 ? "" : "s"} for "${query}".`,
875
+ });
876
+ });
877
+ },
878
+ }),
879
+ },
880
+ {
881
+ label: "Install from source",
882
+ value: () => promptValue({
883
+ title: "Install skill from source",
884
+ label: "Source",
885
+ placeholder: "owner/repo, GitHub URL, or local path",
886
+ onSubmit: async (value) => {
887
+ const source = value.trim();
888
+ if (!source) {
889
+ throw new Error("Source is required.");
890
+ }
891
+ setPrompt(null);
892
+ await runTask(`Installing ${source}...`, async () => {
893
+ await skills.install(source);
894
+ await refreshSkills("Refreshing installed skills...");
895
+ setSuccess(`Installed skill from "${source}".`);
896
+ });
897
+ },
898
+ }),
899
+ },
900
+ ...skillItems,
901
+ {
902
+ label: "Refresh installed skills",
903
+ value: () => {
904
+ void refreshSkills("Refreshing installed skills...");
905
+ },
906
+ },
907
+ {
908
+ label: "Back",
909
+ value: () => setScreen({ kind: "home" }),
910
+ },
911
+ ];
912
+ return (_jsx(MenuScreen, { title: "Skills", description: "Search, install, and remove skills under ~/.hooman/skills.", items: items }));
913
+ };
914
+ const renderMcpDeleteConfirm = () => {
915
+ if (screen.kind !== "mcp-delete-confirm") {
916
+ return null;
917
+ }
918
+ const { name } = screen;
919
+ const items = [
920
+ {
921
+ key: `mcp-del-cancel:${name}`,
922
+ label: "No — keep server",
923
+ value: () => setScreen({ kind: "mcp" }),
924
+ },
925
+ {
926
+ key: `mcp-del-confirm:${name}`,
927
+ label: "Yes — remove from mcp.json",
928
+ value: () => {
929
+ try {
930
+ mcpConfig.remove(name);
931
+ refresh();
932
+ setSuccess(`Deleted MCP server "${name}".`);
933
+ }
934
+ catch (error) {
935
+ setNotice({
936
+ kind: "error",
937
+ text: error instanceof Error ? error.message : String(error),
938
+ });
939
+ }
940
+ setScreen({ kind: "mcp" });
941
+ },
942
+ },
943
+ ];
944
+ return (_jsx(MenuScreen, { title: "Delete MCP server?", description: `Remove "${name}" from ~/.hooman/mcp.json? This cannot be undone from here.`, items: items }));
945
+ };
946
+ const renderSkillsDeleteConfirm = () => {
947
+ if (screen.kind !== "skills-delete-confirm") {
948
+ return null;
949
+ }
950
+ const { folder, displayName } = screen;
951
+ const items = [
952
+ {
953
+ key: `skill-del-cancel:${folder}`,
954
+ label: "No — keep skill",
955
+ value: () => setScreen({ kind: "skills" }),
956
+ },
957
+ {
958
+ key: `skill-del-confirm:${folder}`,
959
+ label: "Yes — uninstall",
960
+ value: async () => {
961
+ await runTask(`Removing ${displayName}...`, async () => {
962
+ await skills.delete(folder);
963
+ await refreshSkills("Refreshing installed skills...");
964
+ setSuccess(`Removed skill "${displayName}".`);
965
+ });
966
+ setScreen({ kind: "skills" });
967
+ },
968
+ },
969
+ ];
970
+ return (_jsx(MenuScreen, { title: "Remove skill?", description: `Uninstall "${displayName}" (${folder}) from ~/.hooman/skills?`, items: items }));
971
+ };
972
+ const renderSearchResults = () => {
973
+ const items = [
974
+ ...searchResults.map((result) => ({
975
+ label: truncate(`${result.name} • ${result.installs} installs • ${result.source || result.slug}`, 100),
976
+ boldSubstring: result.name,
977
+ value: () => {
978
+ const source = result.slug || result.source;
979
+ void runTask(`Installing ${result.name}...`, async () => {
980
+ await skills.install(source);
981
+ await refreshSkills("Refreshing installed skills...");
982
+ setScreen({ kind: "skills" });
983
+ setSuccess(`Installed "${result.name}".`);
984
+ });
985
+ },
986
+ })),
987
+ {
988
+ label: "Back",
989
+ value: () => setScreen({ kind: "skills" }),
990
+ },
991
+ ];
992
+ return (_jsx(MenuScreen, { title: `Search Results • "${screen.kind === "skills-search-results" ? screen.query : ""}"`, description: "Select a result to install it.", items: items }));
993
+ };
994
+ const body = (() => {
995
+ if (busyMessage) {
996
+ return _jsx(BusyScreen, { message: busyMessage });
997
+ }
998
+ if (prompt) {
999
+ return _jsx(PromptForm, { prompt: prompt, onSubmit: handlePromptSubmit });
1000
+ }
1001
+ switch (screen.kind) {
1002
+ case "home":
1003
+ return renderHome();
1004
+ case "config":
1005
+ return renderConfigMenu();
1006
+ case "config-provider":
1007
+ return renderProviderMenu();
1008
+ case "config-prompts":
1009
+ return renderPromptsConfigMenu();
1010
+ case "config-tools":
1011
+ return renderToolsConfigMenu();
1012
+ case "config-search":
1013
+ return renderSearchConfigMenu();
1014
+ case "config-search-provider":
1015
+ return renderSearchProviderMenu();
1016
+ case "config-ltm":
1017
+ return renderLtmConfigMenu();
1018
+ case "config-wiki":
1019
+ return renderWikiConfigMenu();
1020
+ case "mcp":
1021
+ return renderMcpMenu();
1022
+ case "mcp-delete-confirm":
1023
+ return renderMcpDeleteConfirm();
1024
+ case "skills":
1025
+ return renderSkillsMenu();
1026
+ case "skills-delete-confirm":
1027
+ return renderSkillsDeleteConfirm();
1028
+ case "skills-search-results":
1029
+ return renderSearchResults();
1030
+ default:
1031
+ return null;
1032
+ }
1033
+ })();
1034
+ return (_jsxs(Box, { flexDirection: "column", width: "100%", paddingX: 1, children: [notice ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: noticeColor(notice.kind), children: notice.text }) })) : null, _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: `config: ${configData.llm.provider}/${configData.llm.model} • mcp: ${mcpServers.length} • skills: ${installedSkills.length}` }) }), body] }));
1035
+ }
1036
+ //# sourceMappingURL=app.js.map