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,814 +0,0 @@
1
- import path from "node:path";
2
- import { Readable, Writable } from "node:stream";
3
- import { stdin, stdout } from "node:process";
4
- import type {
5
- Agent as AgentContract,
6
- PromptResponse,
7
- SetSessionConfigOptionResponse,
8
- StopReason,
9
- ToolCallContent,
10
- } from "@agentclientprotocol/sdk";
11
- import {
12
- AgentSideConnection,
13
- ndJsonStream,
14
- PROTOCOL_VERSION,
15
- RequestError,
16
- } from "@agentclientprotocol/sdk";
17
- import type { Agent as StrandsAgent } from "@strands-agents/sdk";
18
- import {
19
- BeforeToolCallEvent,
20
- isModelStreamEvent,
21
- Message,
22
- type MessageData,
23
- ModelStreamUpdateEvent,
24
- } from "@strands-agents/sdk";
25
- import type { StopReason as StrandsStopReason } from "@strands-agents/sdk";
26
- import { bootstrap } from "../core/index.ts";
27
- import { runWithCwd } from "../core/utils/cwd-context.ts";
28
- import { acpSessionsRootPath } from "./utils/paths.ts";
29
- import { inferToolKind } from "./utils/tool-kind.ts";
30
- import { toolResultToAcpContent } from "./utils/tool-result-content.ts";
31
- import { createAcpToolApprovalHook } from "./approvals.ts";
32
- import { replayConversationHistory } from "./sessions/replay.ts";
33
- import {
34
- applySessionConfigOption,
35
- buildSessionConfigOptions,
36
- } from "./sessions/config-options.ts";
37
- import { extractAcpClientSystemPrompt } from "./meta/system-prompt.ts";
38
- import { extractAcpClientUserId } from "./meta/user-id.ts";
39
- import { deriveSessionTitleFromEcho } from "./sessions/title.ts";
40
- import { acpPromptEchoText, acpPromptToInvokeArgs } from "./prompt-invoke.ts";
41
- import type { Config } from "../core/config.ts";
42
- import { normalizeAcpSessionMcpServers } from "./mcp-servers.ts";
43
- import {
44
- listStoredSessionIds,
45
- loadSessionMessages,
46
- patchSessionMeta,
47
- readSessionMeta,
48
- saveSessionMessages,
49
- toSessionInfo,
50
- writeSessionMeta,
51
- type SessionMetaFile,
52
- } from "./sessions/store.ts";
53
-
54
- const DEFAULT_MODE_ID = "default" as const;
55
- const LIST_PAGE_SIZE = 40;
56
-
57
- /** Fallback when a session record is missing (never mutate). */
58
- const EMPTY_STREAMED_TOOL_CALL_IDS = new Set<string>();
59
-
60
- type SessionRecord = {
61
- cwd: string;
62
- agent: StrandsAgent;
63
- config: Config;
64
- currentModeId: string;
65
- readonly availableModeIds: ReadonlySet<string>;
66
- mcpDisconnect: () => Promise<void>;
67
- hookOff: () => void;
68
- turnAbort: AbortController | null;
69
- /** Chains `prompt` turns so concurrent RPCs for the same session serialize. */
70
- promptExclusive: Promise<void>;
71
- /** Tool calls that already received `tool_call` from the model stream this turn. */
72
- streamedToolCallIds: Set<string>;
73
- /** Incremental JSON fragments for `toolUseInputDelta` keyed by `toolUseId`. */
74
- streamingToolInputJson: Map<string, string>;
75
- /** Latest tool use block seen in the model stream (sequential tool calls). */
76
- lastStreamToolUseId: string | null;
77
- };
78
-
79
- function negotiateProtocolVersion(clientVersion: number): number {
80
- if (!Number.isFinite(clientVersion) || clientVersion < 1) {
81
- return PROTOCOL_VERSION;
82
- }
83
- return clientVersion > PROTOCOL_VERSION ? PROTOCOL_VERSION : clientVersion;
84
- }
85
-
86
- function assertAbsolutePath(value: string, field: string): void {
87
- const trimmed = value?.trim() ?? "";
88
- if (!trimmed) {
89
- throw RequestError.invalidParams({
90
- [field]: value,
91
- message: `${field} must be a non-empty absolute path`,
92
- });
93
- }
94
- if (!path.isAbsolute(trimmed)) {
95
- throw RequestError.invalidParams({
96
- [field]: value,
97
- message: `${field} must be an absolute path`,
98
- });
99
- }
100
- }
101
-
102
- function parseStreamingToolJson(buffer: string): unknown {
103
- try {
104
- return JSON.parse(buffer) as unknown;
105
- } catch {
106
- return { _partialJson: buffer };
107
- }
108
- }
109
-
110
- function isCancellationError(
111
- err: unknown,
112
- cancelSignals: readonly AbortSignal[],
113
- ): boolean {
114
- if (cancelSignals.some((s) => s.aborted)) {
115
- return true;
116
- }
117
- if (!err || typeof err !== "object") {
118
- return false;
119
- }
120
- const e = err as { name?: string };
121
- return e.name === "AbortError" || e.name === "CancelledError";
122
- }
123
-
124
- function toAcpStopReason(reason: StrandsStopReason): StopReason {
125
- switch (reason) {
126
- case "cancelled":
127
- return "cancelled";
128
- case "maxTokens":
129
- case "modelContextWindowExceeded":
130
- return "max_tokens";
131
- case "contentFiltered":
132
- case "guardrailIntervened":
133
- return "refusal";
134
- case "endTurn":
135
- case "toolUse":
136
- case "stopSequence":
137
- default:
138
- return "end_turn";
139
- }
140
- }
141
-
142
- function serializeAgentMessages(agent: StrandsAgent): MessageData[] {
143
- return agent.messages.map((m) => m.toJSON());
144
- }
145
-
146
- async function readPackageDetails(): Promise<{
147
- name: string;
148
- version: string;
149
- }> {
150
- const path = new URL("../../package.json", import.meta.url);
151
- const pkg = (await Bun.file(path).json()) as {
152
- bin?: string | Record<string, string>;
153
- name?: string;
154
- version?: string;
155
- };
156
- const commandName =
157
- typeof pkg.bin === "string"
158
- ? pkg.name
159
- : pkg.bin && typeof pkg.bin === "object"
160
- ? Object.keys(pkg.bin)[0]
161
- : undefined;
162
- return {
163
- name: commandName ?? pkg.name ?? "hooman",
164
- version: pkg.version ?? "0.0.0",
165
- };
166
- }
167
-
168
- export class AcpAgent implements AgentContract {
169
- readonly #connection: AgentSideConnection;
170
- readonly #sessions = new Map<string, SessionRecord>();
171
- readonly #acpRoot: string;
172
- #version: string | null = null;
173
-
174
- constructor(connection: AgentSideConnection) {
175
- this.#connection = connection;
176
- this.#acpRoot = acpSessionsRootPath();
177
- queueMicrotask(() => {
178
- if (connection.signal.aborted) {
179
- void this.#disposeAllSessions();
180
- return;
181
- }
182
- connection.signal.addEventListener(
183
- "abort",
184
- () => {
185
- void this.#disposeAllSessions();
186
- },
187
- { once: true },
188
- );
189
- });
190
- }
191
-
192
- async initialize(params: Parameters<AgentContract["initialize"]>[0]) {
193
- const { name, version } = await readPackageDetails();
194
- this.#version ??= version;
195
- return {
196
- protocolVersion: negotiateProtocolVersion(params.protocolVersion),
197
- agentInfo: {
198
- name,
199
- title: name,
200
- version: this.#version,
201
- },
202
- authMethods: [],
203
- agentCapabilities: {
204
- loadSession: true,
205
- mcpCapabilities: {
206
- http: true,
207
- sse: true,
208
- },
209
- promptCapabilities: {
210
- embeddedContext: true,
211
- image: true,
212
- audio: true,
213
- },
214
- sessionCapabilities: {
215
- list: {},
216
- },
217
- },
218
- };
219
- }
220
-
221
- async authenticate(_params: Parameters<AgentContract["authenticate"]>[0]) {
222
- return {};
223
- }
224
-
225
- async setSessionMode(
226
- params: Parameters<NonNullable<AgentContract["setSessionMode"]>>[0],
227
- ) {
228
- const rec = this.#sessions.get(params.sessionId);
229
- if (!rec) {
230
- throw RequestError.invalidParams({ sessionId: params.sessionId });
231
- }
232
- if (!rec.availableModeIds.has(params.modeId)) {
233
- throw RequestError.invalidParams({ modeId: params.modeId });
234
- }
235
- rec.currentModeId = params.modeId;
236
- return {};
237
- }
238
-
239
- async setSessionConfigOption(
240
- params: Parameters<NonNullable<AgentContract["setSessionConfigOption"]>>[0],
241
- ): Promise<SetSessionConfigOptionResponse> {
242
- const rec = this.#sessions.get(params.sessionId);
243
- if (!rec) {
244
- throw RequestError.invalidParams({ sessionId: params.sessionId });
245
- }
246
- applySessionConfigOption(rec.config, params);
247
- return { configOptions: buildSessionConfigOptions(rec.config) };
248
- }
249
-
250
- async extMethod(
251
- method: string,
252
- _params: Record<string, unknown>,
253
- ): Promise<Record<string, unknown>> {
254
- throw RequestError.methodNotFound(method);
255
- }
256
-
257
- async extNotification(
258
- _method: string,
259
- _params: Record<string, unknown>,
260
- ): Promise<void> {
261
- return;
262
- }
263
-
264
- async listSessions(
265
- params: Parameters<NonNullable<AgentContract["listSessions"]>>[0],
266
- ) {
267
- void params.additionalDirectories;
268
- const ids = await listStoredSessionIds(this.#acpRoot);
269
- const rows: Array<{
270
- id: string;
271
- info: NonNullable<Awaited<ReturnType<typeof toSessionInfo>>>;
272
- }> = [];
273
- for (const id of ids) {
274
- const info = await toSessionInfo(this.#acpRoot, id);
275
- if (info) {
276
- rows.push({ id, info });
277
- }
278
- }
279
- let filtered = rows;
280
- if (params.cwd) {
281
- filtered = rows.filter((r) => r.info.cwd === params.cwd);
282
- }
283
- filtered.sort((a, b) =>
284
- String(b.info.updatedAt ?? "").localeCompare(
285
- String(a.info.updatedAt ?? ""),
286
- ),
287
- );
288
- let offset = 0;
289
- if (params.cursor) {
290
- try {
291
- const raw = Buffer.from(params.cursor, "base64").toString("utf8");
292
- const o = JSON.parse(raw) as { offset?: number };
293
- offset = Number.isFinite(o.offset) ? Math.max(0, o.offset!) : 0;
294
- } catch {
295
- offset = 0;
296
- }
297
- }
298
- const slice = filtered
299
- .slice(offset, offset + LIST_PAGE_SIZE)
300
- .map((r) => r.info);
301
- const nextOffset = offset + LIST_PAGE_SIZE;
302
- const nextCursor =
303
- nextOffset < filtered.length
304
- ? Buffer.from(JSON.stringify({ offset: nextOffset }), "utf8").toString(
305
- "base64",
306
- )
307
- : null;
308
- return { sessions: slice, nextCursor };
309
- }
310
-
311
- async newSession(params: Parameters<AgentContract["newSession"]>[0]) {
312
- assertAbsolutePath(params.cwd, "cwd");
313
- const sessionId = crypto.randomUUID();
314
- const clientUserId = extractAcpClientUserId(params._meta) ?? null;
315
- const clientSystemPrompt =
316
- extractAcpClientSystemPrompt(params._meta) ?? null;
317
- const bootstrapUserId = clientUserId ?? sessionId;
318
- const mcpServers = normalizeAcpSessionMcpServers(params.mcpServers);
319
-
320
- const now = new Date().toISOString();
321
- const meta: SessionMetaFile = {
322
- cwd: params.cwd,
323
- createdAt: now,
324
- updatedAt: now,
325
- title: null,
326
- userId: clientUserId,
327
- systemPrompt: clientSystemPrompt,
328
- mcpServers,
329
- };
330
- await writeSessionMeta(this.#acpRoot, sessionId, meta);
331
-
332
- const {
333
- config,
334
- agent,
335
- mcp: { manager },
336
- } = await bootstrap(
337
- "acp",
338
- {
339
- userId: bootstrapUserId,
340
- sessionId,
341
- acp: {
342
- mcpServers,
343
- ...(clientSystemPrompt ? { systemPrompt: clientSystemPrompt } : {}),
344
- },
345
- },
346
- false,
347
- );
348
-
349
- const availableModeIds = new Set<string>([DEFAULT_MODE_ID]);
350
-
351
- const hookOff = agent.addHook(
352
- BeforeToolCallEvent,
353
- createAcpToolApprovalHook(
354
- this.#connection,
355
- sessionId,
356
- () =>
357
- this.#sessions.get(sessionId)?.streamedToolCallIds ??
358
- EMPTY_STREAMED_TOOL_CALL_IDS,
359
- ),
360
- );
361
-
362
- this.#sessions.set(sessionId, {
363
- cwd: params.cwd,
364
- agent,
365
- config,
366
- currentModeId: DEFAULT_MODE_ID,
367
- availableModeIds,
368
- hookOff,
369
- mcpDisconnect: async () => {
370
- try {
371
- await manager.disconnect();
372
- } catch {
373
- /* ignore */
374
- }
375
- },
376
- turnAbort: null,
377
- promptExclusive: Promise.resolve(),
378
- streamedToolCallIds: new Set(),
379
- streamingToolInputJson: new Map(),
380
- lastStreamToolUseId: null,
381
- });
382
-
383
- return {
384
- sessionId,
385
- modes: {
386
- currentModeId: DEFAULT_MODE_ID,
387
- availableModes: [
388
- {
389
- id: DEFAULT_MODE_ID,
390
- name: "Default",
391
- description: "Standard Hooman behaviour for this session.",
392
- },
393
- ],
394
- },
395
- models: null,
396
- configOptions: buildSessionConfigOptions(config),
397
- };
398
- }
399
-
400
- async loadSession(
401
- params: Parameters<NonNullable<AgentContract["loadSession"]>>[0],
402
- ) {
403
- if (this.#sessions.has(params.sessionId)) {
404
- throw RequestError.invalidParams({
405
- sessionId: params.sessionId,
406
- message: "Session is already active in this agent process.",
407
- });
408
- }
409
- const existing = await readSessionMeta(this.#acpRoot, params.sessionId);
410
- if (!existing) {
411
- throw RequestError.resourceNotFound(`session:${params.sessionId}`);
412
- }
413
-
414
- assertAbsolutePath(params.cwd, "cwd");
415
-
416
- const fromRequest = extractAcpClientUserId(params._meta);
417
- const requestedSystemPrompt = extractAcpClientSystemPrompt(params._meta);
418
- const storedUserId = existing.userId ?? null;
419
- const storedSystemPrompt = existing.systemPrompt ?? null;
420
- const clientUserId = fromRequest !== undefined ? fromRequest : storedUserId;
421
- const clientSystemPrompt =
422
- requestedSystemPrompt !== undefined
423
- ? requestedSystemPrompt
424
- : storedSystemPrompt;
425
- const bootstrapUserId = clientUserId ?? params.sessionId;
426
- const mcpServers =
427
- params.mcpServers.length > 0
428
- ? normalizeAcpSessionMcpServers(params.mcpServers)
429
- : (existing.mcpServers ?? []);
430
-
431
- const {
432
- config,
433
- agent,
434
- mcp: { manager },
435
- } = await bootstrap(
436
- "acp",
437
- {
438
- userId: bootstrapUserId,
439
- sessionId: params.sessionId,
440
- acp: {
441
- mcpServers,
442
- ...(clientSystemPrompt ? { systemPrompt: clientSystemPrompt } : {}),
443
- },
444
- },
445
- false,
446
- );
447
-
448
- const saved = await loadSessionMessages(this.#acpRoot, params.sessionId);
449
- agent.messages.length = 0;
450
- for (const md of saved) {
451
- agent.messages.push(Message.fromJSON(md));
452
- }
453
-
454
- await replayConversationHistory(
455
- this.#connection,
456
- params.sessionId,
457
- agent.messages,
458
- );
459
-
460
- const availableModeIds = new Set<string>([DEFAULT_MODE_ID]);
461
- const hookOff = agent.addHook(
462
- BeforeToolCallEvent,
463
- createAcpToolApprovalHook(
464
- this.#connection,
465
- params.sessionId,
466
- () =>
467
- this.#sessions.get(params.sessionId)?.streamedToolCallIds ??
468
- EMPTY_STREAMED_TOOL_CALL_IDS,
469
- ),
470
- );
471
-
472
- this.#sessions.set(params.sessionId, {
473
- cwd: params.cwd,
474
- agent,
475
- config,
476
- currentModeId: DEFAULT_MODE_ID,
477
- availableModeIds,
478
- hookOff,
479
- mcpDisconnect: async () => {
480
- try {
481
- await manager.disconnect();
482
- } catch {
483
- /* ignore */
484
- }
485
- },
486
- turnAbort: null,
487
- promptExclusive: Promise.resolve(),
488
- streamedToolCallIds: new Set(),
489
- streamingToolInputJson: new Map(),
490
- lastStreamToolUseId: null,
491
- });
492
-
493
- await patchSessionMeta(this.#acpRoot, params.sessionId, {
494
- cwd: params.cwd,
495
- updatedAt: new Date().toISOString(),
496
- ...(fromRequest !== undefined ? { userId: fromRequest || null } : {}),
497
- ...(requestedSystemPrompt !== undefined
498
- ? { systemPrompt: requestedSystemPrompt || null }
499
- : {}),
500
- mcpServers,
501
- });
502
-
503
- return {
504
- modes: {
505
- currentModeId: DEFAULT_MODE_ID,
506
- availableModes: [
507
- {
508
- id: DEFAULT_MODE_ID,
509
- name: "Default",
510
- description: "Standard Hooman behaviour for this session.",
511
- },
512
- ],
513
- },
514
- models: null,
515
- configOptions: buildSessionConfigOptions(config),
516
- };
517
- }
518
-
519
- async cancel(params: Parameters<AgentContract["cancel"]>[0]) {
520
- const rec = this.#sessions.get(params.sessionId);
521
- if (!rec) {
522
- return;
523
- }
524
- rec.turnAbort?.abort();
525
- try {
526
- rec.agent.cancel();
527
- } catch {
528
- /* ignore */
529
- }
530
- }
531
-
532
- async prompt(params: Parameters<AgentContract["prompt"]>[0]) {
533
- const rec = this.#sessions.get(params.sessionId);
534
- if (!rec) {
535
- throw RequestError.invalidParams({ sessionId: params.sessionId });
536
- }
537
-
538
- const prevExclusive = rec.promptExclusive;
539
- let releaseExclusive!: () => void;
540
- const exclusiveGate = new Promise<void>((resolve) => {
541
- releaseExclusive = resolve;
542
- });
543
- rec.promptExclusive = prevExclusive.then(() => exclusiveGate);
544
- await prevExclusive;
545
-
546
- const turnAbort = new AbortController();
547
- rec.turnAbort = turnAbort;
548
- rec.streamedToolCallIds.clear();
549
- rec.streamingToolInputJson.clear();
550
- rec.lastStreamToolUseId = null;
551
-
552
- let stopReason: StopReason = "end_turn";
553
-
554
- try {
555
- const echo = acpPromptEchoText(params.prompt);
556
- if (echo.length > 0) {
557
- await this.#connection.sessionUpdate({
558
- sessionId: params.sessionId,
559
- update: {
560
- sessionUpdate: "user_message_chunk",
561
- content: { type: "text", text: echo },
562
- },
563
- });
564
- const meta = await readSessionMeta(this.#acpRoot, params.sessionId);
565
- const needsTitle =
566
- meta &&
567
- (meta.title === undefined ||
568
- meta.title === null ||
569
- String(meta.title).trim() === "");
570
- if (needsTitle) {
571
- const title = deriveSessionTitleFromEcho(echo);
572
- if (title) {
573
- await patchSessionMeta(this.#acpRoot, params.sessionId, { title });
574
- await this.#connection.sessionUpdate({
575
- sessionId: params.sessionId,
576
- update: {
577
- sessionUpdate: "session_info_update",
578
- title,
579
- updatedAt: new Date().toISOString(),
580
- },
581
- });
582
- }
583
- }
584
- }
585
-
586
- const invokeArgs = acpPromptToInvokeArgs(params.prompt);
587
- const cancelSignal = AbortSignal.any([
588
- this.#connection.signal,
589
- turnAbort.signal,
590
- ]);
591
-
592
- try {
593
- await runWithCwd(rec.cwd, async () => {
594
- const stream = rec.agent.stream(invokeArgs, { cancelSignal });
595
- let iter = await stream.next();
596
- while (!iter.done) {
597
- const ev = iter.value;
598
-
599
- if (ev.type === "modelStreamUpdateEvent") {
600
- await this.#dispatchModelStreamUpdate(params.sessionId, ev, rec);
601
- } else if (ev.type === "afterToolCallEvent") {
602
- await this.#connection.sessionUpdate({
603
- sessionId: params.sessionId,
604
- update: {
605
- sessionUpdate: "tool_call_update",
606
- toolCallId: ev.toolUse.toolUseId,
607
- status:
608
- ev.result.status === "success" ? "completed" : "failed",
609
- rawOutput: ev.result.toJSON() as unknown,
610
- content: toolResultToAcpContent(ev.result),
611
- },
612
- });
613
- } else if (ev.type === "agentResultEvent") {
614
- stopReason = toAcpStopReason(ev.result.stopReason);
615
- }
616
-
617
- iter = await stream.next();
618
- }
619
- });
620
- } catch (err) {
621
- const cancelSignals = [
622
- cancelSignal,
623
- turnAbort.signal,
624
- this.#connection.signal,
625
- ] as const;
626
- if (isCancellationError(err, cancelSignals)) {
627
- stopReason = "cancelled";
628
- } else {
629
- const message = err instanceof Error ? err.message : String(err);
630
- await this.#connection.sessionUpdate({
631
- sessionId: params.sessionId,
632
- update: {
633
- sessionUpdate: "agent_message_chunk",
634
- content: {
635
- type: "text",
636
- text: `\n[error] ${message}\n`,
637
- },
638
- },
639
- });
640
- stopReason = "refusal";
641
- }
642
- }
643
- } finally {
644
- rec.turnAbort = null;
645
- releaseExclusive();
646
- try {
647
- await saveSessionMessages(
648
- this.#acpRoot,
649
- params.sessionId,
650
- serializeAgentMessages(rec.agent),
651
- );
652
- } catch {
653
- /* ignore */
654
- }
655
- }
656
-
657
- return { stopReason } satisfies PromptResponse;
658
- }
659
-
660
- async #dispatchModelStreamUpdate(
661
- sessionId: string,
662
- ev: ModelStreamUpdateEvent,
663
- rec: SessionRecord,
664
- ): Promise<void> {
665
- const inner = ev.event;
666
- if (!isModelStreamEvent(inner)) {
667
- return;
668
- }
669
- switch (inner.type) {
670
- case "modelContentBlockStartEvent": {
671
- const start = inner.start;
672
- if (start?.type === "toolUseStart") {
673
- rec.streamedToolCallIds.add(start.toolUseId);
674
- rec.lastStreamToolUseId = start.toolUseId;
675
- rec.streamingToolInputJson.set(start.toolUseId, "");
676
- await this.#connection.sessionUpdate({
677
- sessionId,
678
- update: {
679
- sessionUpdate: "tool_call",
680
- toolCallId: start.toolUseId,
681
- title: start.name,
682
- kind: inferToolKind(start.name),
683
- status: "pending",
684
- rawInput: {},
685
- },
686
- });
687
- }
688
- return;
689
- }
690
- case "modelContentBlockDeltaEvent": {
691
- const { delta } = inner;
692
- if (delta.type === "textDelta" && delta.text) {
693
- await this.#connection.sessionUpdate({
694
- sessionId,
695
- update: {
696
- sessionUpdate: "agent_message_chunk",
697
- content: { type: "text", text: delta.text },
698
- },
699
- });
700
- return;
701
- }
702
- if (delta.type === "reasoningContentDelta") {
703
- if (delta.text) {
704
- await this.#connection.sessionUpdate({
705
- sessionId,
706
- update: {
707
- sessionUpdate: "agent_thought_chunk",
708
- content: { type: "text", text: delta.text },
709
- },
710
- });
711
- }
712
- return;
713
- }
714
- if (delta.type === "toolUseInputDelta") {
715
- const toolUseId = this.#streamToolUseIdForInputDelta(rec);
716
- if (!toolUseId) {
717
- return;
718
- }
719
- const prev = rec.streamingToolInputJson.get(toolUseId) ?? "";
720
- const next = prev + delta.input;
721
- rec.streamingToolInputJson.set(toolUseId, next);
722
- await this.#connection.sessionUpdate({
723
- sessionId,
724
- update: {
725
- sessionUpdate: "tool_call_update",
726
- toolCallId: toolUseId,
727
- rawInput: parseStreamingToolJson(next),
728
- },
729
- });
730
- return;
731
- }
732
- if (delta.type === "citationsDelta") {
733
- const n = delta.citations?.length ?? 0;
734
- if (n > 0) {
735
- await this.#connection.sessionUpdate({
736
- sessionId,
737
- update: {
738
- sessionUpdate: "agent_thought_chunk",
739
- content: {
740
- type: "text",
741
- text: `[citations: ${n} reference(s)]\n`,
742
- },
743
- },
744
- });
745
- }
746
- }
747
- return;
748
- }
749
- case "modelRedactionEvent": {
750
- const replace =
751
- inner.outputRedaction?.replaceContent ??
752
- inner.inputRedaction?.replaceContent;
753
- if (replace) {
754
- await this.#connection.sessionUpdate({
755
- sessionId,
756
- update: {
757
- sessionUpdate: "agent_message_chunk",
758
- content: { type: "text", text: replace },
759
- },
760
- });
761
- }
762
- return;
763
- }
764
- default:
765
- return;
766
- }
767
- }
768
-
769
- #streamToolUseIdForInputDelta(rec: SessionRecord): string | undefined {
770
- if (
771
- rec.lastStreamToolUseId &&
772
- rec.streamedToolCallIds.has(rec.lastStreamToolUseId)
773
- ) {
774
- return rec.lastStreamToolUseId;
775
- }
776
- const keys = [...rec.streamingToolInputJson.keys()];
777
- return keys.length === 1 ? keys[0]! : undefined;
778
- }
779
-
780
- async #disposeAllSessions(): Promise<void> {
781
- const ids = [...this.#sessions.keys()];
782
- for (const id of ids) {
783
- await this.#destroySession(id);
784
- }
785
- }
786
-
787
- async #destroySession(sessionId: string): Promise<void> {
788
- const rec = this.#sessions.get(sessionId);
789
- if (!rec) {
790
- return;
791
- }
792
- rec.turnAbort?.abort();
793
- try {
794
- rec.agent.cancel();
795
- } catch {
796
- /* ignore */
797
- }
798
- rec.hookOff();
799
- await rec.mcpDisconnect();
800
- this.#sessions.delete(sessionId);
801
- }
802
- }
803
-
804
- export async function runAcpStdio(): Promise<void> {
805
- const stream = ndJsonStream(
806
- Writable.toWeb(stdout) as unknown as WritableStream<Uint8Array>,
807
- Readable.toWeb(stdin) as unknown as ReadableStream<Uint8Array>,
808
- );
809
- const connection = new AgentSideConnection(
810
- (conn) => new AcpAgent(conn),
811
- stream,
812
- );
813
- await connection.closed;
814
- }