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
@@ -1,1349 +0,0 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from "react";
2
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
- import { Box, Text, useApp, useInput } from "ink";
4
- import { LlmProvider, type ConfigData } from "../core/config.ts";
5
- import {
6
- McpTransportSchema,
7
- type Sse,
8
- type Stdio,
9
- type StreamableHttp,
10
- } from "../core/mcp/types.ts";
11
- import type {
12
- SkillListEntry,
13
- SkillSearchResult,
14
- } from "../core/skills/registry.ts";
15
- import {
16
- basePath,
17
- configJsonPath,
18
- instructionsMdPath,
19
- mcpJsonPath,
20
- skillsPath,
21
- } from "../core/utils/paths.ts";
22
- import { BusyScreen } from "./components/BusyScreen.tsx";
23
- import { HomeScreen } from "./components/HomeScreen.tsx";
24
- import { MenuScreen } from "./components/MenuScreen.tsx";
25
- import { PromptForm } from "./components/PromptForm.tsx";
26
- import { openFileInEditor } from "./open-in-editor.ts";
27
- import type {
28
- ConfigureAppProps,
29
- MenuItem,
30
- Notice,
31
- PromptState,
32
- Screen,
33
- } from "./types.ts";
34
- import {
35
- DEFAULT_INSTRUCTIONS,
36
- compactJson,
37
- folderNameForSkill,
38
- normalizeOptional,
39
- noticeColor,
40
- parseNumber,
41
- parseObjectRecord,
42
- maskSensitiveParamsForDisplay,
43
- parseStringArray,
44
- parseStringRecord,
45
- transportSummary,
46
- truncate,
47
- } from "./utils.ts";
48
-
49
- const PROMPT_LABELS: Record<keyof ConfigData["prompts"], string> = {
50
- behaviour: "Behaviour",
51
- communication: "Communication",
52
- execution: "Execution",
53
- engineering: "Engineering",
54
- guardrails: "Guardrails",
55
- };
56
-
57
- export function ConfigureApp({
58
- config,
59
- mcpConfig,
60
- skills,
61
- onExit,
62
- }: ConfigureAppProps): React.JSX.Element {
63
- const { exit } = useApp();
64
- const [screen, setScreen] = useState<Screen>({ kind: "home" });
65
- const [prompt, setPrompt] = useState<PromptState | null>(null);
66
- const [notice, setNotice] = useState<Notice | null>(null);
67
- const [busyMessage, setBusyMessage] = useState<string | null>(null);
68
- const [revision, setRevision] = useState(0);
69
- const [installedSkills, setInstalledSkills] = useState<SkillListEntry[]>([]);
70
- const [searchResults, setSearchResults] = useState<SkillSearchResult[]>([]);
71
-
72
- const refresh = useCallback(() => {
73
- setRevision((value) => value + 1);
74
- }, []);
75
-
76
- const runTask = useCallback(
77
- async (label: string, task: () => Promise<void>) => {
78
- setBusyMessage(label);
79
- try {
80
- await task();
81
- } catch (error) {
82
- setNotice({
83
- kind: "error",
84
- text: error instanceof Error ? error.message : String(error),
85
- });
86
- } finally {
87
- setBusyMessage(null);
88
- }
89
- },
90
- [],
91
- );
92
-
93
- const refreshSkills = useCallback(
94
- async (label: string = "Loading installed skills...") => {
95
- await runTask(label, async () => {
96
- const next = await skills.list();
97
- setInstalledSkills(next);
98
- });
99
- },
100
- [runTask, skills],
101
- );
102
-
103
- useEffect(() => {
104
- void refreshSkills();
105
- }, [refreshSkills]);
106
-
107
- useInput(
108
- (input, key) => {
109
- if (key.ctrl && input.toLowerCase() === "c") {
110
- onExit();
111
- exit();
112
- return;
113
- }
114
- if (!key.escape || busyMessage) {
115
- return;
116
- }
117
- if (prompt) {
118
- prompt.onCancel?.();
119
- setPrompt(null);
120
- return;
121
- }
122
- if (screen.kind === "mcp-delete-confirm") {
123
- setScreen({ kind: "mcp" });
124
- return;
125
- }
126
- if (screen.kind === "skills-delete-confirm") {
127
- setScreen({ kind: "skills" });
128
- return;
129
- }
130
- if (screen.kind !== "home") {
131
- setScreen({ kind: "home" });
132
- }
133
- },
134
- { isActive: true },
135
- );
136
-
137
- const configData = useMemo(
138
- () =>
139
- ({
140
- name: config.name,
141
- llm: config.llm,
142
- search: config.search,
143
- prompts: config.prompts,
144
- tools: config.tools,
145
- compaction: config.compaction,
146
- }) satisfies ConfigData,
147
- [config, revision],
148
- );
149
-
150
- const mcpServers = useMemo(() => mcpConfig.list(), [mcpConfig, revision]);
151
-
152
- const setSuccess = useCallback((text: string) => {
153
- setNotice({ kind: "success", text });
154
- }, []);
155
-
156
- const updateConfig = useCallback(
157
- (partial: Partial<ConfigData>, message: string) => {
158
- config.update(partial);
159
- refresh();
160
- setSuccess(message);
161
- },
162
- [config, refresh, setSuccess],
163
- );
164
-
165
- const promptValue = useCallback((state: PromptState) => {
166
- setPrompt(state);
167
- }, []);
168
-
169
- const handlePromptSubmit = useCallback(
170
- async (value: string) => {
171
- if (!prompt) {
172
- return;
173
- }
174
- try {
175
- await prompt.onSubmit(value);
176
- } catch (error) {
177
- setNotice({
178
- kind: "error",
179
- text: error instanceof Error ? error.message : String(error),
180
- });
181
- }
182
- },
183
- [prompt],
184
- );
185
-
186
- const promptForStdio = useCallback(
187
- (name: string, initial?: Stdio) => {
188
- const mode = initial ? "Edit" : "Add";
189
- promptValue({
190
- title: `${mode} stdio server`,
191
- label: "Command",
192
- initialValue: initial?.command ?? "",
193
- placeholder: "npx",
194
- onSubmit: async (commandValue) => {
195
- const command = commandValue.trim();
196
- if (!command) {
197
- throw new Error("Command is required.");
198
- }
199
- promptValue({
200
- title: `${mode} stdio server`,
201
- label: "Arguments",
202
- note: 'Example: ["-y", "@modelcontextprotocol/server-filesystem"]',
203
- initialValue: compactJson(initial?.args ?? []),
204
- placeholder: "[]",
205
- onSubmit: async (argsValue) => {
206
- const args = parseStringArray(argsValue, "Arguments");
207
- promptValue({
208
- title: `${mode} stdio server`,
209
- label: "Environment variables (optional)",
210
- initialValue: initial?.env ? compactJson(initial.env) : "",
211
- placeholder: '{"API_KEY":"..."}',
212
- onSubmit: async (envValue) => {
213
- const env = parseStringRecord(
214
- envValue,
215
- "Environment variables",
216
- );
217
- promptValue({
218
- title: `${mode} stdio server`,
219
- label: "Working directory (optional)",
220
- initialValue: initial?.cwd ?? "",
221
- placeholder: "/absolute/path",
222
- onSubmit: async (cwdValue) => {
223
- const transport = McpTransportSchema.parse({
224
- type: "stdio",
225
- command,
226
- ...(args.length > 0 ? { args } : {}),
227
- ...(env && Object.keys(env).length > 0 ? { env } : {}),
228
- ...(normalizeOptional(cwdValue)
229
- ? { cwd: normalizeOptional(cwdValue) }
230
- : {}),
231
- }) as Stdio;
232
- if (initial) {
233
- mcpConfig.update(name, transport);
234
- setSuccess(`Updated MCP server "${name}".`);
235
- } else {
236
- mcpConfig.add(name, transport);
237
- setSuccess(`Added MCP server "${name}".`);
238
- }
239
- setPrompt(null);
240
- setScreen({ kind: "mcp" });
241
- refresh();
242
- },
243
- });
244
- },
245
- });
246
- },
247
- });
248
- },
249
- });
250
- },
251
- [mcpConfig, promptValue, refresh, setSuccess],
252
- );
253
-
254
- const promptForRemote = useCallback(
255
- (
256
- name: string,
257
- type: StreamableHttp["type"] | Sse["type"],
258
- initial?: StreamableHttp | Sse,
259
- ) => {
260
- const mode = initial ? "Edit" : "Add";
261
- promptValue({
262
- title: `${mode} ${type} server`,
263
- label: "URL",
264
- initialValue: initial?.url ?? "",
265
- placeholder: "https://example.com/mcp",
266
- onSubmit: async (urlValue) => {
267
- const url = urlValue.trim();
268
- if (!url) {
269
- throw new Error("URL is required.");
270
- }
271
- promptValue({
272
- title: `${mode} ${type} server`,
273
- label: "Headers (optional)",
274
- initialValue: initial?.headers ? compactJson(initial.headers) : "",
275
- placeholder: '{"Authorization":"Bearer ..."}',
276
- onSubmit: async (headersValue) => {
277
- const headers = parseStringRecord(headersValue, "Headers");
278
- const transport = McpTransportSchema.parse({
279
- type,
280
- url,
281
- ...(headers && Object.keys(headers).length > 0
282
- ? { headers }
283
- : {}),
284
- }) as StreamableHttp | Sse;
285
- if (initial) {
286
- mcpConfig.update(name, transport);
287
- setSuccess(`Updated MCP server "${name}".`);
288
- } else {
289
- mcpConfig.add(name, transport);
290
- setSuccess(`Added MCP server "${name}".`);
291
- }
292
- setPrompt(null);
293
- setScreen({ kind: "mcp" });
294
- refresh();
295
- },
296
- });
297
- },
298
- });
299
- },
300
- [mcpConfig, promptValue, refresh, setSuccess],
301
- );
302
-
303
- const promptForServerName = useCallback(
304
- (type: "stdio" | "streamable-http" | "sse") => {
305
- promptValue({
306
- title: `Add ${type} server`,
307
- label: "Server name",
308
- placeholder: "filesystem",
309
- onSubmit: async (nameValue) => {
310
- const name = nameValue.trim();
311
- if (!name) {
312
- throw new Error("Server name is required.");
313
- }
314
- if (type === "stdio") {
315
- promptForStdio(name);
316
- return;
317
- }
318
- promptForRemote(name, type);
319
- },
320
- });
321
- },
322
- [promptForRemote, promptForStdio, promptValue],
323
- );
324
-
325
- const renderHome = () => {
326
- const items: MenuItem[] = [
327
- {
328
- label: `Configuration • ${configData.llm.provider}/${configData.llm.model}`,
329
- value: () => setScreen({ kind: "config" }),
330
- },
331
- {
332
- label: "Instructions • edit instructions.md",
333
- value: () => {
334
- try {
335
- const path = instructionsMdPath();
336
- const current = existsSync(path)
337
- ? readFileSync(path, "utf8")
338
- : DEFAULT_INSTRUCTIONS;
339
- const next = openFileInEditor(path, current).trim();
340
- if (!next) {
341
- throw new Error("instructions.md cannot be empty.");
342
- }
343
- writeFileSync(path, `${next}\n`, "utf8");
344
- setSuccess("Updated instructions.md.");
345
- } catch (error) {
346
- setNotice({
347
- kind: "error",
348
- text: error instanceof Error ? error.message : String(error),
349
- });
350
- }
351
- },
352
- },
353
- {
354
- label: `MCP servers • ${mcpServers.length} configured`,
355
- value: () => setScreen({ kind: "mcp" }),
356
- },
357
- {
358
- label: `Skills • ${installedSkills.length} installed`,
359
- value: () => setScreen({ kind: "skills" }),
360
- },
361
- {
362
- label: "Exit",
363
- value: () => {
364
- onExit();
365
- exit();
366
- },
367
- },
368
- ];
369
- return (
370
- <HomeScreen
371
- rootPath={basePath()}
372
- configPath={configJsonPath()}
373
- instructionsPath={instructionsMdPath()}
374
- mcpPath={mcpJsonPath()}
375
- skillsPath={skillsPath()}
376
- items={items}
377
- />
378
- );
379
- };
380
-
381
- const renderConfigMenu = () => {
382
- const enabledPrompts = Object.values(configData.prompts).filter(
383
- Boolean,
384
- ).length;
385
- const totalPrompts = Object.keys(configData.prompts).length;
386
- const items: MenuItem[] = [
387
- {
388
- label: `Name • ${configData.name}`,
389
- value: () =>
390
- promptValue({
391
- title: "Update app name",
392
- label: "Name",
393
- initialValue: configData.name,
394
- onSubmit: async (value) => {
395
- const next = value.trim();
396
- if (!next) {
397
- throw new Error("Name is required.");
398
- }
399
- updateConfig({ name: next }, "Updated app name.");
400
- setPrompt(null);
401
- },
402
- }),
403
- },
404
- {
405
- label: `LLM provider • ${configData.llm.provider}`,
406
- value: () => setScreen({ kind: "config-provider" }),
407
- },
408
- {
409
- label: `LLM model • ${configData.llm.model}`,
410
- value: () =>
411
- promptValue({
412
- title: "Update model id",
413
- label: "Model",
414
- initialValue: configData.llm.model,
415
- onSubmit: async (value) => {
416
- const model = value.trim();
417
- if (!model) {
418
- throw new Error("Model is required.");
419
- }
420
- updateConfig(
421
- { llm: { ...config.llm, model } },
422
- "Updated model id.",
423
- );
424
- setPrompt(null);
425
- },
426
- }),
427
- },
428
- {
429
- label: `LLM params • ${truncate(
430
- compactJson(maskSensitiveParamsForDisplay(configData.llm.params)),
431
- )}`,
432
- value: () =>
433
- promptValue({
434
- title: "Update LLM params",
435
- label: "Parameters",
436
- initialValue: compactJson(configData.llm.params),
437
- placeholder: '{"temperature":0.7}',
438
- onSubmit: async (value) => {
439
- const params = parseObjectRecord(value, "LLM params");
440
- updateConfig(
441
- { llm: { ...config.llm, params } },
442
- "Updated LLM params.",
443
- );
444
- setPrompt(null);
445
- },
446
- }),
447
- },
448
- {
449
- label: `Prompts • ${enabledPrompts}/${totalPrompts} enabled`,
450
- value: () => setScreen({ kind: "config-prompts" }),
451
- },
452
- {
453
- label: "Tools • configure enabled tools",
454
- value: () => setScreen({ kind: "config-tools" }),
455
- },
456
- {
457
- label: `Compaction ratio • ${configData.compaction.ratio}`,
458
- value: () =>
459
- promptValue({
460
- title: "Update compaction ratio",
461
- label: "Ratio",
462
- initialValue: String(configData.compaction.ratio),
463
- onSubmit: async (value) => {
464
- const ratio = parseNumber(value, "Compaction ratio", {
465
- min: 0,
466
- max: 1,
467
- });
468
- updateConfig(
469
- {
470
- compaction: {
471
- ...config.compaction,
472
- ratio,
473
- },
474
- },
475
- "Updated compaction ratio.",
476
- );
477
- setPrompt(null);
478
- },
479
- }),
480
- },
481
- {
482
- label: `Compaction keep • ${configData.compaction.keep}`,
483
- value: () =>
484
- promptValue({
485
- title: "Update compaction keep",
486
- label: "Keep",
487
- initialValue: String(configData.compaction.keep),
488
- onSubmit: async (value) => {
489
- const keep = parseNumber(value, "Compaction keep", {
490
- min: 0,
491
- integer: true,
492
- });
493
- updateConfig(
494
- {
495
- compaction: {
496
- ...config.compaction,
497
- keep,
498
- },
499
- },
500
- "Updated compaction keep.",
501
- );
502
- setPrompt(null);
503
- },
504
- }),
505
- },
506
- {
507
- label: "Back",
508
- value: () => setScreen({ kind: "home" }),
509
- },
510
- ];
511
-
512
- return (
513
- <MenuScreen
514
- title="Configuration"
515
- description="Edit the same values loaded from ~/.hooman/config.json."
516
- items={items}
517
- />
518
- );
519
- };
520
-
521
- const renderToolsConfigMenu = () => {
522
- const items: MenuItem[] = [
523
- {
524
- label: `Search tool • ${configData.search.enabled ? "Enabled" : "Disabled"} • ${configData.search.provider}`,
525
- value: () => setScreen({ kind: "config-search" }),
526
- },
527
- {
528
- label: `Todo tool • ${configData.tools.todo.enabled ? "Enabled" : "Disabled"}`,
529
- value: () => {
530
- updateConfig(
531
- {
532
- tools: {
533
- ...config.tools,
534
- todo: {
535
- enabled: !configData.tools.todo.enabled,
536
- },
537
- },
538
- },
539
- `Todo tool ${configData.tools.todo.enabled ? "disabled" : "enabled"}.`,
540
- );
541
- setScreen({ kind: "config-tools" });
542
- },
543
- },
544
- {
545
- label: `Fetch tool • ${configData.tools.fetch.enabled ? "Enabled" : "Disabled"}`,
546
- value: () => {
547
- updateConfig(
548
- {
549
- tools: {
550
- ...config.tools,
551
- fetch: {
552
- enabled: !configData.tools.fetch.enabled,
553
- },
554
- },
555
- },
556
- `Fetch tool ${configData.tools.fetch.enabled ? "disabled" : "enabled"}.`,
557
- );
558
- setScreen({ kind: "config-tools" });
559
- },
560
- },
561
- {
562
- label: `Filesystem tool • ${configData.tools.filesystem.enabled ? "Enabled" : "Disabled"}`,
563
- value: () => {
564
- updateConfig(
565
- {
566
- tools: {
567
- ...config.tools,
568
- filesystem: {
569
- enabled: !configData.tools.filesystem.enabled,
570
- },
571
- },
572
- },
573
- `Filesystem tool ${configData.tools.filesystem.enabled ? "disabled" : "enabled"}.`,
574
- );
575
- setScreen({ kind: "config-tools" });
576
- },
577
- },
578
- {
579
- label: `Shell tool • ${configData.tools.shell.enabled ? "Enabled" : "Disabled"}`,
580
- value: () => {
581
- updateConfig(
582
- {
583
- tools: {
584
- ...config.tools,
585
- shell: {
586
- enabled: !configData.tools.shell.enabled,
587
- },
588
- },
589
- },
590
- `Shell tool ${configData.tools.shell.enabled ? "disabled" : "enabled"}.`,
591
- );
592
- setScreen({ kind: "config-tools" });
593
- },
594
- },
595
- {
596
- label: `Sleep tool • ${configData.tools.sleep.enabled ? "Enabled" : "Disabled"}`,
597
- value: () => {
598
- updateConfig(
599
- {
600
- tools: {
601
- ...config.tools,
602
- sleep: {
603
- enabled: !configData.tools.sleep.enabled,
604
- },
605
- },
606
- },
607
- `Sleep tool ${configData.tools.sleep.enabled ? "disabled" : "enabled"}.`,
608
- );
609
- setScreen({ kind: "config-tools" });
610
- },
611
- },
612
- {
613
- label: `Long-term memory • ${configData.tools.ltm.enabled ? "Enabled" : "Disabled"} • ${configData.tools.ltm.chroma.collection.memory}`,
614
- value: () => setScreen({ kind: "config-ltm" }),
615
- },
616
- {
617
- label: `Wiki tool • ${configData.tools.wiki.enabled ? "Enabled" : "Disabled"} • ${configData.tools.wiki.chroma.collection.wiki}`,
618
- value: () => setScreen({ kind: "config-wiki" }),
619
- },
620
- {
621
- label: `MCP tools • ${configData.tools.mcp.enabled ? "Enabled" : "Disabled"}`,
622
- value: () => {
623
- updateConfig(
624
- {
625
- tools: {
626
- ...config.tools,
627
- mcp: {
628
- enabled: !configData.tools.mcp.enabled,
629
- },
630
- },
631
- },
632
- `MCP tools ${configData.tools.mcp.enabled ? "disabled" : "enabled"}.`,
633
- );
634
- setScreen({ kind: "config-tools" });
635
- },
636
- },
637
- {
638
- label: `Skills tools • ${configData.tools.skills.enabled ? "Enabled" : "Disabled"}`,
639
- value: () => {
640
- updateConfig(
641
- {
642
- tools: {
643
- ...config.tools,
644
- skills: {
645
- enabled: !configData.tools.skills.enabled,
646
- },
647
- },
648
- },
649
- `Skills tools ${configData.tools.skills.enabled ? "disabled" : "enabled"}.`,
650
- );
651
- setScreen({ kind: "config-tools" });
652
- },
653
- },
654
- {
655
- label: "Back",
656
- value: () => setScreen({ kind: "config" }),
657
- },
658
- ];
659
-
660
- return (
661
- <MenuScreen
662
- title="Tools"
663
- description="Enable, disable, and configure built-in tools."
664
- items={items}
665
- />
666
- );
667
- };
668
-
669
- const renderProviderMenu = () => {
670
- const items: MenuItem[] = [
671
- ...Object.values(LlmProvider).map((provider) => ({
672
- label:
673
- provider === configData.llm.provider
674
- ? `${provider} • current`
675
- : provider,
676
- value: () => {
677
- updateConfig(
678
- { llm: { ...config.llm, provider } },
679
- `Updated LLM provider to "${provider}".`,
680
- );
681
- setScreen({ kind: "config" });
682
- },
683
- })),
684
- {
685
- label: "Back",
686
- value: () => setScreen({ kind: "config" }),
687
- },
688
- ];
689
-
690
- return (
691
- <MenuScreen
692
- title="Choose Provider"
693
- description="Pick which model provider to use for future sessions."
694
- items={items}
695
- />
696
- );
697
- };
698
-
699
- const renderPromptsConfigMenu = () => {
700
- const promptKeys = Object.keys(
701
- PROMPT_LABELS,
702
- ) as (keyof ConfigData["prompts"])[];
703
- const items: MenuItem[] = [
704
- ...promptKeys.map((key) => {
705
- const enabled = configData.prompts[key];
706
- const label = PROMPT_LABELS[key];
707
- return {
708
- label: `${label} • ${enabled ? "Enabled" : "Disabled"}`,
709
- value: () => {
710
- updateConfig(
711
- {
712
- prompts: {
713
- ...config.prompts,
714
- [key]: !enabled,
715
- },
716
- },
717
- `${label} prompt ${enabled ? "disabled" : "enabled"}.`,
718
- );
719
- setScreen({ kind: "config-prompts" });
720
- },
721
- };
722
- }),
723
- {
724
- label: "Back",
725
- value: () => setScreen({ kind: "config-tools" }),
726
- },
727
- ];
728
-
729
- return (
730
- <MenuScreen
731
- title="Prompts"
732
- description="Choose which bundled harness prompt sections are included in future sessions."
733
- items={items}
734
- />
735
- );
736
- };
737
-
738
- const renderSearchProviderMenu = () => {
739
- const items: MenuItem[] = [
740
- ...(["brave", "tavily"] as const).map((provider) => ({
741
- label:
742
- provider === configData.search.provider
743
- ? `${provider} • current`
744
- : provider,
745
- value: () => {
746
- updateConfig(
747
- {
748
- search: {
749
- ...config.search,
750
- provider,
751
- },
752
- },
753
- `Updated search provider to "${provider}".`,
754
- );
755
- setScreen({ kind: "config-search" });
756
- },
757
- })),
758
- {
759
- label: "Back",
760
- value: () => setScreen({ kind: "config-search" }),
761
- },
762
- ];
763
-
764
- return (
765
- <MenuScreen
766
- title="Search Provider"
767
- description="Pick which web search provider to use."
768
- items={items}
769
- />
770
- );
771
- };
772
-
773
- const renderSearchConfigMenu = () => {
774
- const activeProvider = configData.search.provider;
775
- const apiKey =
776
- activeProvider === "brave"
777
- ? configData.search.brave.apiKey
778
- : configData.search.tavily.apiKey;
779
- const redacted = compactJson(
780
- maskSensitiveParamsForDisplay({ apiKey: apiKey ?? "" }),
781
- );
782
- const items: MenuItem[] = [
783
- {
784
- label: `Enabled • ${configData.search.enabled ? "On" : "Off"}`,
785
- value: () => {
786
- updateConfig(
787
- {
788
- search: {
789
- ...config.search,
790
- enabled: !configData.search.enabled,
791
- },
792
- },
793
- `Search tool ${configData.search.enabled ? "disabled" : "enabled"}.`,
794
- );
795
- setScreen({ kind: "config-search" });
796
- },
797
- },
798
- {
799
- label: `Provider • ${configData.search.provider}`,
800
- value: () => setScreen({ kind: "config-search-provider" }),
801
- },
802
- {
803
- label: `${activeProvider} API key • ${truncate(redacted, 44)}`,
804
- value: () =>
805
- promptValue({
806
- title: `Update ${activeProvider} API key`,
807
- label: "API key",
808
- initialValue: apiKey ?? "",
809
- onSubmit: async (value) => {
810
- const nextApiKey = value.trim();
811
- if (!nextApiKey) {
812
- throw new Error("API key is required.");
813
- }
814
- updateConfig(
815
- {
816
- search: {
817
- ...config.search,
818
- [activeProvider]: {
819
- ...config.search[activeProvider],
820
- apiKey: nextApiKey,
821
- },
822
- },
823
- },
824
- `Updated ${activeProvider} API key.`,
825
- );
826
- setPrompt(null);
827
- },
828
- }),
829
- },
830
- {
831
- label: "Back",
832
- value: () => setScreen({ kind: "config-tools" }),
833
- },
834
- ];
835
-
836
- return (
837
- <MenuScreen
838
- title="Search"
839
- description="Configure web search provider and credentials."
840
- items={items}
841
- />
842
- );
843
- };
844
-
845
- const renderLtmConfigMenu = () => {
846
- const items: MenuItem[] = [
847
- {
848
- label: `Enabled • ${configData.tools.ltm.enabled ? "On" : "Off"}`,
849
- value: () => {
850
- updateConfig(
851
- {
852
- tools: {
853
- ...config.tools,
854
- ltm: {
855
- ...config.tools.ltm,
856
- enabled: !configData.tools.ltm.enabled,
857
- },
858
- },
859
- },
860
- `Long-term memory ${configData.tools.ltm.enabled ? "disabled" : "enabled"}.`,
861
- );
862
- setScreen({ kind: "config-ltm" });
863
- },
864
- },
865
- {
866
- label: `Chroma URL • ${configData.tools.ltm.chroma.url}`,
867
- value: () =>
868
- promptValue({
869
- title: "Update LTM Chroma URL",
870
- label: "URL",
871
- initialValue: configData.tools.ltm.chroma.url,
872
- onSubmit: async (value) => {
873
- const url = value.trim();
874
- if (!url) {
875
- throw new Error("URL is required.");
876
- }
877
- updateConfig(
878
- {
879
- tools: {
880
- ...config.tools,
881
- ltm: {
882
- ...config.tools.ltm,
883
- chroma: {
884
- ...config.tools.ltm.chroma,
885
- url,
886
- },
887
- },
888
- },
889
- },
890
- "Updated LTM Chroma URL.",
891
- );
892
- setPrompt(null);
893
- },
894
- }),
895
- },
896
- {
897
- label: `Chroma collection • ${configData.tools.ltm.chroma.collection.memory}`,
898
- value: () =>
899
- promptValue({
900
- title: "Update LTM Chroma collection",
901
- label: "Collection name",
902
- initialValue: configData.tools.ltm.chroma.collection.memory,
903
- onSubmit: async (value) => {
904
- const memory = value.trim();
905
- if (!memory) {
906
- throw new Error("Collection name is required.");
907
- }
908
- updateConfig(
909
- {
910
- tools: {
911
- ...config.tools,
912
- ltm: {
913
- ...config.tools.ltm,
914
- chroma: {
915
- ...config.tools.ltm.chroma,
916
- collection: { memory },
917
- },
918
- },
919
- },
920
- },
921
- "Updated LTM Chroma collection.",
922
- );
923
- setPrompt(null);
924
- },
925
- }),
926
- },
927
- {
928
- label: "Back",
929
- value: () => setScreen({ kind: "config-tools" }),
930
- },
931
- ];
932
-
933
- return (
934
- <MenuScreen
935
- title="Long-term Memory"
936
- description="Configure LTM memory storage and Chroma settings."
937
- items={items}
938
- />
939
- );
940
- };
941
-
942
- const renderWikiConfigMenu = () => {
943
- const items: MenuItem[] = [
944
- {
945
- label: `Enabled • ${configData.tools.wiki.enabled ? "On" : "Off"}`,
946
- value: () => {
947
- updateConfig(
948
- {
949
- tools: {
950
- ...config.tools,
951
- wiki: {
952
- ...config.tools.wiki,
953
- enabled: !configData.tools.wiki.enabled,
954
- },
955
- },
956
- },
957
- `Wiki tool ${configData.tools.wiki.enabled ? "disabled" : "enabled"}.`,
958
- );
959
- setScreen({ kind: "config-wiki" });
960
- },
961
- },
962
- {
963
- label: `Chroma URL • ${configData.tools.wiki.chroma.url}`,
964
- value: () =>
965
- promptValue({
966
- title: "Update Wiki Chroma URL",
967
- label: "URL",
968
- initialValue: configData.tools.wiki.chroma.url,
969
- onSubmit: async (value) => {
970
- const url = value.trim();
971
- if (!url) {
972
- throw new Error("URL is required.");
973
- }
974
- updateConfig(
975
- {
976
- tools: {
977
- ...config.tools,
978
- wiki: {
979
- ...config.tools.wiki,
980
- chroma: {
981
- ...config.tools.wiki.chroma,
982
- url,
983
- },
984
- },
985
- },
986
- },
987
- "Updated Wiki Chroma URL.",
988
- );
989
- setPrompt(null);
990
- },
991
- }),
992
- },
993
- {
994
- label: `Chroma collection • ${configData.tools.wiki.chroma.collection.wiki}`,
995
- value: () =>
996
- promptValue({
997
- title: "Update Wiki Chroma collection",
998
- label: "Collection name",
999
- initialValue: configData.tools.wiki.chroma.collection.wiki,
1000
- onSubmit: async (value) => {
1001
- const wiki = value.trim();
1002
- if (!wiki) {
1003
- throw new Error("Collection name is required.");
1004
- }
1005
- updateConfig(
1006
- {
1007
- tools: {
1008
- ...config.tools,
1009
- wiki: {
1010
- ...config.tools.wiki,
1011
- chroma: {
1012
- ...config.tools.wiki.chroma,
1013
- collection: { wiki },
1014
- },
1015
- },
1016
- },
1017
- },
1018
- "Updated Wiki Chroma collection.",
1019
- );
1020
- setPrompt(null);
1021
- },
1022
- }),
1023
- },
1024
- {
1025
- label: "Back",
1026
- value: () => setScreen({ kind: "config" }),
1027
- },
1028
- ];
1029
-
1030
- return (
1031
- <MenuScreen
1032
- title="Wiki"
1033
- description="Configure wiki tool and Chroma-backed wiki search."
1034
- items={items}
1035
- />
1036
- );
1037
- };
1038
-
1039
- const renderMcpMenu = () => {
1040
- const serverItems: MenuItem[] = mcpServers.flatMap((server) => [
1041
- {
1042
- label: `Edit ${server.name} • ${transportSummary(server.transport)}`,
1043
- boldSubstring: server.name,
1044
- value: () => {
1045
- if (server.transport.type === "stdio") {
1046
- promptForStdio(server.name, server.transport);
1047
- } else {
1048
- promptForRemote(
1049
- server.name,
1050
- server.transport.type,
1051
- server.transport,
1052
- );
1053
- }
1054
- },
1055
- },
1056
- {
1057
- label: `Delete ${server.name}`,
1058
- boldSubstring: server.name,
1059
- value: () =>
1060
- setScreen({ kind: "mcp-delete-confirm", name: server.name }),
1061
- },
1062
- ]);
1063
-
1064
- const items: MenuItem[] = [
1065
- {
1066
- label: "Add stdio server",
1067
- value: () => promptForServerName("stdio"),
1068
- },
1069
- {
1070
- label: "Add streamable HTTP server",
1071
- value: () => promptForServerName("streamable-http"),
1072
- },
1073
- {
1074
- label: "Add SSE server",
1075
- value: () => promptForServerName("sse"),
1076
- },
1077
- ...serverItems,
1078
- {
1079
- label: "Reload from disk",
1080
- value: () => {
1081
- mcpConfig.reload();
1082
- refresh();
1083
- setNotice({ kind: "info", text: "Reloaded MCP config from disk." });
1084
- },
1085
- },
1086
- {
1087
- label: "Back",
1088
- value: () => setScreen({ kind: "home" }),
1089
- },
1090
- ];
1091
-
1092
- return (
1093
- <MenuScreen
1094
- title="MCP Servers"
1095
- description="Add, edit, or remove named MCP transports from ~/.hooman/mcp.json."
1096
- items={items}
1097
- />
1098
- );
1099
- };
1100
-
1101
- const renderSkillsMenu = () => {
1102
- const skillItems: MenuItem[] = installedSkills.map((skill) => {
1103
- const folder = folderNameForSkill(skill);
1104
- return {
1105
- label: `Remove ${skill.name} • ${folder}`,
1106
- boldSubstring: skill.name,
1107
- value: () =>
1108
- setScreen({
1109
- kind: "skills-delete-confirm",
1110
- folder,
1111
- displayName: skill.name,
1112
- }),
1113
- };
1114
- });
1115
-
1116
- const items: MenuItem[] = [
1117
- {
1118
- label: "Search catalog and install",
1119
- value: () =>
1120
- promptValue({
1121
- title: "Search skills catalog",
1122
- label: "Query",
1123
- placeholder: "memory, github, playwright...",
1124
- onSubmit: async (value) => {
1125
- const query = value.trim();
1126
- if (query.length < 2) {
1127
- throw new Error("Use at least 2 characters to search.");
1128
- }
1129
- setPrompt(null);
1130
- await runTask(`Searching for "${query}"...`, async () => {
1131
- const results = await skills.search(query);
1132
- setSearchResults(results);
1133
- setScreen({ kind: "skills-search-results", query });
1134
- setNotice({
1135
- kind: "info",
1136
- text: `Found ${results.length} result${results.length === 1 ? "" : "s"} for "${query}".`,
1137
- });
1138
- });
1139
- },
1140
- }),
1141
- },
1142
- {
1143
- label: "Install from source",
1144
- value: () =>
1145
- promptValue({
1146
- title: "Install skill from source",
1147
- label: "Source",
1148
- placeholder: "owner/repo, GitHub URL, or local path",
1149
- onSubmit: async (value) => {
1150
- const source = value.trim();
1151
- if (!source) {
1152
- throw new Error("Source is required.");
1153
- }
1154
- setPrompt(null);
1155
- await runTask(`Installing ${source}...`, async () => {
1156
- await skills.install(source);
1157
- await refreshSkills("Refreshing installed skills...");
1158
- setSuccess(`Installed skill from "${source}".`);
1159
- });
1160
- },
1161
- }),
1162
- },
1163
- ...skillItems,
1164
- {
1165
- label: "Refresh installed skills",
1166
- value: () => {
1167
- void refreshSkills("Refreshing installed skills...");
1168
- },
1169
- },
1170
- {
1171
- label: "Back",
1172
- value: () => setScreen({ kind: "home" }),
1173
- },
1174
- ];
1175
-
1176
- return (
1177
- <MenuScreen
1178
- title="Skills"
1179
- description="Search, install, and remove skills under ~/.hooman/skills."
1180
- items={items}
1181
- />
1182
- );
1183
- };
1184
-
1185
- const renderMcpDeleteConfirm = () => {
1186
- if (screen.kind !== "mcp-delete-confirm") {
1187
- return null;
1188
- }
1189
- const { name } = screen;
1190
- const items: MenuItem[] = [
1191
- {
1192
- key: `mcp-del-cancel:${name}`,
1193
- label: "No — keep server",
1194
- value: () => setScreen({ kind: "mcp" }),
1195
- },
1196
- {
1197
- key: `mcp-del-confirm:${name}`,
1198
- label: "Yes — remove from mcp.json",
1199
- value: () => {
1200
- try {
1201
- mcpConfig.remove(name);
1202
- refresh();
1203
- setSuccess(`Deleted MCP server "${name}".`);
1204
- } catch (error) {
1205
- setNotice({
1206
- kind: "error",
1207
- text: error instanceof Error ? error.message : String(error),
1208
- });
1209
- }
1210
- setScreen({ kind: "mcp" });
1211
- },
1212
- },
1213
- ];
1214
-
1215
- return (
1216
- <MenuScreen
1217
- title="Delete MCP server?"
1218
- description={`Remove "${name}" from ~/.hooman/mcp.json? This cannot be undone from here.`}
1219
- items={items}
1220
- />
1221
- );
1222
- };
1223
-
1224
- const renderSkillsDeleteConfirm = () => {
1225
- if (screen.kind !== "skills-delete-confirm") {
1226
- return null;
1227
- }
1228
- const { folder, displayName } = screen;
1229
- const items: MenuItem[] = [
1230
- {
1231
- key: `skill-del-cancel:${folder}`,
1232
- label: "No — keep skill",
1233
- value: () => setScreen({ kind: "skills" }),
1234
- },
1235
- {
1236
- key: `skill-del-confirm:${folder}`,
1237
- label: "Yes — uninstall",
1238
- value: async () => {
1239
- await runTask(`Removing ${displayName}...`, async () => {
1240
- await skills.delete(folder);
1241
- await refreshSkills("Refreshing installed skills...");
1242
- setSuccess(`Removed skill "${displayName}".`);
1243
- });
1244
- setScreen({ kind: "skills" });
1245
- },
1246
- },
1247
- ];
1248
-
1249
- return (
1250
- <MenuScreen
1251
- title="Remove skill?"
1252
- description={`Uninstall "${displayName}" (${folder}) from ~/.hooman/skills?`}
1253
- items={items}
1254
- />
1255
- );
1256
- };
1257
-
1258
- const renderSearchResults = () => {
1259
- const items: MenuItem[] = [
1260
- ...searchResults.map((result) => ({
1261
- label: truncate(
1262
- `${result.name} • ${result.installs} installs • ${result.source || result.slug}`,
1263
- 100,
1264
- ),
1265
- boldSubstring: result.name,
1266
- value: () => {
1267
- const source = result.slug || result.source;
1268
- void runTask(`Installing ${result.name}...`, async () => {
1269
- await skills.install(source);
1270
- await refreshSkills("Refreshing installed skills...");
1271
- setScreen({ kind: "skills" });
1272
- setSuccess(`Installed "${result.name}".`);
1273
- });
1274
- },
1275
- })),
1276
- {
1277
- label: "Back",
1278
- value: () => setScreen({ kind: "skills" }),
1279
- },
1280
- ];
1281
-
1282
- return (
1283
- <MenuScreen
1284
- title={`Search Results • "${screen.kind === "skills-search-results" ? screen.query : ""}"`}
1285
- description="Select a result to install it."
1286
- items={items}
1287
- />
1288
- );
1289
- };
1290
-
1291
- const body = (() => {
1292
- if (busyMessage) {
1293
- return <BusyScreen message={busyMessage} />;
1294
- }
1295
- if (prompt) {
1296
- return <PromptForm prompt={prompt} onSubmit={handlePromptSubmit} />;
1297
- }
1298
- switch (screen.kind) {
1299
- case "home":
1300
- return renderHome();
1301
- case "config":
1302
- return renderConfigMenu();
1303
- case "config-provider":
1304
- return renderProviderMenu();
1305
- case "config-prompts":
1306
- return renderPromptsConfigMenu();
1307
- case "config-tools":
1308
- return renderToolsConfigMenu();
1309
- case "config-search":
1310
- return renderSearchConfigMenu();
1311
- case "config-search-provider":
1312
- return renderSearchProviderMenu();
1313
- case "config-ltm":
1314
- return renderLtmConfigMenu();
1315
- case "config-wiki":
1316
- return renderWikiConfigMenu();
1317
- case "mcp":
1318
- return renderMcpMenu();
1319
- case "mcp-delete-confirm":
1320
- return renderMcpDeleteConfirm();
1321
- case "skills":
1322
- return renderSkillsMenu();
1323
- case "skills-delete-confirm":
1324
- return renderSkillsDeleteConfirm();
1325
- case "skills-search-results":
1326
- return renderSearchResults();
1327
- default:
1328
- return null;
1329
- }
1330
- })();
1331
-
1332
- return (
1333
- <Box flexDirection="column" width="100%" paddingX={1}>
1334
- {notice ? (
1335
- <Box marginTop={1}>
1336
- <Text color={noticeColor(notice.kind)}>{notice.text}</Text>
1337
- </Box>
1338
- ) : null}
1339
-
1340
- <Box marginTop={1}>
1341
- <Text color="gray">
1342
- {`config: ${configData.llm.provider}/${configData.llm.model} • mcp: ${mcpServers.length} • skills: ${installedSkills.length}`}
1343
- </Text>
1344
- </Box>
1345
-
1346
- {body}
1347
- </Box>
1348
- );
1349
- }