hoomanjs 1.18.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (536) hide show
  1. package/README.md +22 -26
  2. package/dist/acp/acp-agent.d.ts +69 -0
  3. package/dist/acp/acp-agent.js +628 -0
  4. package/dist/acp/acp-agent.js.map +1 -0
  5. package/dist/acp/approvals.d.ts +5 -0
  6. package/dist/acp/approvals.js +130 -0
  7. package/dist/acp/approvals.js.map +1 -0
  8. package/dist/acp/index.d.ts +1 -0
  9. package/dist/acp/index.js +2 -0
  10. package/dist/acp/index.js.map +1 -0
  11. package/dist/acp/mcp-servers.d.ts +7 -0
  12. package/dist/acp/mcp-servers.js +57 -0
  13. package/dist/acp/mcp-servers.js.map +1 -0
  14. package/dist/acp/meta/system-prompt.d.ts +12 -0
  15. package/dist/acp/meta/system-prompt.js +41 -0
  16. package/dist/acp/meta/system-prompt.js.map +1 -0
  17. package/dist/acp/meta/user-id.d.ts +12 -0
  18. package/dist/acp/meta/user-id.js +43 -0
  19. package/dist/acp/meta/user-id.js.map +1 -0
  20. package/dist/acp/prompt-invoke.d.ts +10 -0
  21. package/dist/acp/prompt-invoke.js +131 -0
  22. package/dist/acp/prompt-invoke.js.map +1 -0
  23. package/dist/acp/sessions/config-options.d.ts +7 -0
  24. package/dist/acp/sessions/config-options.js +101 -0
  25. package/dist/acp/sessions/config-options.js.map +1 -0
  26. package/dist/acp/sessions/replay.d.ts +7 -0
  27. package/dist/acp/sessions/replay.js +117 -0
  28. package/dist/acp/sessions/replay.js.map +1 -0
  29. package/dist/acp/sessions/store.d.ts +24 -0
  30. package/dist/acp/sessions/store.js +96 -0
  31. package/dist/acp/sessions/store.js.map +1 -0
  32. package/dist/acp/sessions/title.d.ts +5 -0
  33. package/dist/acp/sessions/title.js +22 -0
  34. package/dist/acp/sessions/title.js.map +1 -0
  35. package/dist/acp/utils/paths.d.ts +2 -0
  36. package/{src/acp/utils/paths.ts → dist/acp/utils/paths.js} +2 -2
  37. package/dist/acp/utils/paths.js.map +1 -0
  38. package/dist/acp/utils/tool-kind.d.ts +6 -0
  39. package/dist/acp/utils/tool-kind.js +53 -0
  40. package/dist/acp/utils/tool-kind.js.map +1 -0
  41. package/dist/acp/utils/tool-locations.d.ts +3 -0
  42. package/dist/acp/utils/tool-locations.js +44 -0
  43. package/dist/acp/utils/tool-locations.js.map +1 -0
  44. package/dist/acp/utils/tool-result-content.d.ts +8 -0
  45. package/dist/acp/utils/tool-result-content.js +14 -0
  46. package/dist/acp/utils/tool-result-content.js.map +1 -0
  47. package/dist/chat/app.d.ts +15 -0
  48. package/dist/chat/app.js +458 -0
  49. package/dist/chat/app.js.map +1 -0
  50. package/dist/chat/approvals.d.ts +15 -0
  51. package/dist/chat/approvals.js +74 -0
  52. package/dist/chat/approvals.js.map +1 -0
  53. package/dist/chat/components/ApprovalPrompt.d.ts +6 -0
  54. package/dist/chat/components/ApprovalPrompt.js +11 -0
  55. package/dist/chat/components/ApprovalPrompt.js.map +1 -0
  56. package/dist/chat/components/ChatMessage.d.ts +7 -0
  57. package/dist/chat/components/ChatMessage.js +19 -0
  58. package/dist/chat/components/ChatMessage.js.map +1 -0
  59. package/dist/chat/components/Composer.d.ts +11 -0
  60. package/dist/chat/components/Composer.js +9 -0
  61. package/dist/chat/components/Composer.js.map +1 -0
  62. package/dist/chat/components/EmptyChatBanner.d.ts +2 -0
  63. package/dist/chat/components/EmptyChatBanner.js +8 -0
  64. package/dist/chat/components/EmptyChatBanner.js.map +1 -0
  65. package/dist/chat/components/PromptInput.d.ts +11 -0
  66. package/dist/chat/components/PromptInput.js +26 -0
  67. package/dist/chat/components/PromptInput.js.map +1 -0
  68. package/dist/chat/components/QueuedPrompts.d.ts +10 -0
  69. package/dist/chat/components/QueuedPrompts.js +38 -0
  70. package/dist/chat/components/QueuedPrompts.js.map +1 -0
  71. package/dist/chat/components/ReasoningStrip.d.ts +6 -0
  72. package/dist/chat/components/ReasoningStrip.js +13 -0
  73. package/dist/chat/components/ReasoningStrip.js.map +1 -0
  74. package/dist/chat/components/ScrollView.d.ts +101 -0
  75. package/dist/chat/components/ScrollView.js +74 -0
  76. package/dist/chat/components/ScrollView.js.map +1 -0
  77. package/dist/chat/components/Spinner.d.ts +8 -0
  78. package/dist/chat/components/Spinner.js +19 -0
  79. package/dist/chat/components/Spinner.js.map +1 -0
  80. package/dist/chat/components/StatusBar.d.ts +20 -0
  81. package/dist/chat/components/StatusBar.js +20 -0
  82. package/dist/chat/components/StatusBar.js.map +1 -0
  83. package/dist/chat/components/ThinkingStatus.d.ts +1 -0
  84. package/dist/chat/components/ThinkingStatus.js +119 -0
  85. package/dist/chat/components/ThinkingStatus.js.map +1 -0
  86. package/dist/chat/components/TodoPanel.d.ts +6 -0
  87. package/dist/chat/components/TodoPanel.js +27 -0
  88. package/dist/chat/components/TodoPanel.js.map +1 -0
  89. package/dist/chat/components/ToolEvent.d.ts +6 -0
  90. package/dist/chat/components/ToolEvent.js +18 -0
  91. package/dist/chat/components/ToolEvent.js.map +1 -0
  92. package/dist/chat/components/ToolEventFileResult.d.ts +9 -0
  93. package/dist/chat/components/ToolEventFileResult.js +50 -0
  94. package/dist/chat/components/ToolEventFileResult.js.map +1 -0
  95. package/dist/chat/components/Transcript.d.ts +7 -0
  96. package/dist/chat/components/Transcript.js +9 -0
  97. package/dist/chat/components/Transcript.js.map +1 -0
  98. package/dist/chat/components/TranscriptViewport.d.ts +9 -0
  99. package/dist/chat/components/TranscriptViewport.js +124 -0
  100. package/dist/chat/components/TranscriptViewport.js.map +1 -0
  101. package/dist/chat/components/ascii-logo.d.ts +1 -0
  102. package/{src/chat/components/ascii-logo.ts → dist/chat/components/ascii-logo.js} +3 -2
  103. package/dist/chat/components/ascii-logo.js.map +1 -0
  104. package/dist/chat/components/file-tool-diff/file-tool-result.d.ts +26 -0
  105. package/dist/chat/components/file-tool-diff/file-tool-result.js +73 -0
  106. package/dist/chat/components/file-tool-diff/file-tool-result.js.map +1 -0
  107. package/dist/chat/components/markdown/BlockRenderer.d.ts +8 -0
  108. package/dist/chat/components/markdown/BlockRenderer.js +87 -0
  109. package/dist/chat/components/markdown/BlockRenderer.js.map +1 -0
  110. package/dist/chat/components/markdown/CodeBlock.d.ts +7 -0
  111. package/dist/chat/components/markdown/CodeBlock.js +55 -0
  112. package/dist/chat/components/markdown/CodeBlock.js.map +1 -0
  113. package/dist/chat/components/markdown/InlineRenderer.d.ts +8 -0
  114. package/dist/chat/components/markdown/InlineRenderer.js +96 -0
  115. package/dist/chat/components/markdown/InlineRenderer.js.map +1 -0
  116. package/dist/chat/components/markdown/MarkdownMessage.d.ts +6 -0
  117. package/dist/chat/components/markdown/MarkdownMessage.js +13 -0
  118. package/dist/chat/components/markdown/MarkdownMessage.js.map +1 -0
  119. package/dist/chat/components/markdown/MarkdownTable.d.ts +6 -0
  120. package/dist/chat/components/markdown/MarkdownTable.js +12 -0
  121. package/dist/chat/components/markdown/MarkdownTable.js.map +1 -0
  122. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.d.ts +7 -0
  123. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.js +186 -0
  124. package/dist/chat/components/markdown/hooks/useMarkdownTableLayout.js.map +1 -0
  125. package/dist/chat/components/markdown/hooks/useMarkdownTokens.d.ts +9 -0
  126. package/dist/chat/components/markdown/hooks/useMarkdownTokens.js +25 -0
  127. package/dist/chat/components/markdown/hooks/useMarkdownTokens.js.map +1 -0
  128. package/dist/chat/components/markdown/lexer.d.ts +7 -0
  129. package/dist/chat/components/markdown/lexer.js +89 -0
  130. package/dist/chat/components/markdown/lexer.js.map +1 -0
  131. package/dist/chat/components/prompt-input/clipboard-image.d.ts +1 -0
  132. package/dist/chat/components/prompt-input/clipboard-image.js +112 -0
  133. package/dist/chat/components/prompt-input/clipboard-image.js.map +1 -0
  134. package/dist/chat/components/prompt-input/hooks/usePromptInputController.d.ts +1 -0
  135. package/dist/chat/components/prompt-input/hooks/usePromptInputController.js +2 -0
  136. package/dist/chat/components/prompt-input/hooks/usePromptInputController.js.map +1 -0
  137. package/dist/chat/components/prompt-input/input-model.d.ts +28 -0
  138. package/dist/chat/components/prompt-input/input-model.js +231 -0
  139. package/dist/chat/components/prompt-input/input-model.js.map +1 -0
  140. package/dist/chat/components/prompt-input/paste.d.ts +11 -0
  141. package/dist/chat/components/prompt-input/paste.js +85 -0
  142. package/dist/chat/components/prompt-input/paste.js.map +1 -0
  143. package/dist/chat/components/prompt-input/render.d.ts +13 -0
  144. package/dist/chat/components/prompt-input/render.js +54 -0
  145. package/dist/chat/components/prompt-input/render.js.map +1 -0
  146. package/dist/chat/components/prompt-input/usePromptInputController.d.ts +17 -0
  147. package/dist/chat/components/prompt-input/usePromptInputController.js +366 -0
  148. package/dist/chat/components/prompt-input/usePromptInputController.js.map +1 -0
  149. package/dist/chat/components/shared.d.ts +6 -0
  150. package/dist/chat/components/shared.js +66 -0
  151. package/dist/chat/components/shared.js.map +1 -0
  152. package/dist/chat/index.d.ts +13 -0
  153. package/dist/chat/index.js +18 -0
  154. package/dist/chat/index.js.map +1 -0
  155. package/dist/chat/mouse.d.ts +5 -0
  156. package/dist/chat/mouse.js +9 -0
  157. package/dist/chat/mouse.js.map +1 -0
  158. package/dist/chat/types.d.ts +20 -0
  159. package/dist/chat/types.js +2 -0
  160. package/dist/chat/types.js.map +1 -0
  161. package/dist/cli.d.ts +2 -0
  162. package/dist/cli.js +126 -0
  163. package/dist/cli.js.map +1 -0
  164. package/dist/configure/app.d.ts +3 -0
  165. package/dist/configure/app.js +1036 -0
  166. package/dist/configure/app.js.map +1 -0
  167. package/dist/configure/components/BusyScreen.d.ts +6 -0
  168. package/dist/configure/components/BusyScreen.js +7 -0
  169. package/dist/configure/components/BusyScreen.js.map +1 -0
  170. package/dist/configure/components/HomeScreen.d.ts +12 -0
  171. package/dist/configure/components/HomeScreen.js +7 -0
  172. package/dist/configure/components/HomeScreen.js.map +1 -0
  173. package/dist/configure/components/MenuScreen.d.ts +10 -0
  174. package/dist/configure/components/MenuScreen.js +15 -0
  175. package/dist/configure/components/MenuScreen.js.map +1 -0
  176. package/dist/configure/components/PromptForm.d.ts +8 -0
  177. package/dist/configure/components/PromptForm.js +12 -0
  178. package/dist/configure/components/PromptForm.js.map +1 -0
  179. package/dist/configure/components/SelectMenuItem.d.ts +7 -0
  180. package/dist/configure/components/SelectMenuItem.js +18 -0
  181. package/dist/configure/components/SelectMenuItem.js.map +1 -0
  182. package/dist/configure/index.d.ts +1 -0
  183. package/dist/configure/index.js +28 -0
  184. package/dist/configure/index.js.map +1 -0
  185. package/dist/configure/open-in-editor.d.ts +8 -0
  186. package/dist/configure/open-in-editor.js +120 -0
  187. package/dist/configure/open-in-editor.js.map +1 -0
  188. package/dist/configure/types.d.ts +63 -0
  189. package/dist/configure/types.js +2 -0
  190. package/dist/configure/types.js.map +1 -0
  191. package/dist/configure/utils.d.ts +19 -0
  192. package/dist/configure/utils.js +108 -0
  193. package/dist/configure/utils.js.map +1 -0
  194. package/dist/core/agent/index.d.ts +13 -0
  195. package/dist/core/agent/index.js +70 -0
  196. package/dist/core/agent/index.js.map +1 -0
  197. package/dist/core/agents/definitions.d.ts +12 -0
  198. package/dist/core/agents/definitions.js +35 -0
  199. package/dist/core/agents/definitions.js.map +1 -0
  200. package/dist/core/agents/index.d.ts +4 -0
  201. package/dist/core/agents/index.js +5 -0
  202. package/dist/core/agents/index.js.map +1 -0
  203. package/dist/core/agents/registry.d.ts +5 -0
  204. package/dist/core/agents/registry.js +84 -0
  205. package/dist/core/agents/registry.js.map +1 -0
  206. package/dist/core/agents/runner.d.ts +36 -0
  207. package/dist/core/agents/runner.js +275 -0
  208. package/dist/core/agents/runner.js.map +1 -0
  209. package/dist/core/agents/tools.d.ts +20 -0
  210. package/dist/core/agents/tools.js +66 -0
  211. package/dist/core/agents/tools.js.map +1 -0
  212. package/dist/core/config.d.ts +272 -0
  213. package/dist/core/config.js +334 -0
  214. package/dist/core/config.js.map +1 -0
  215. package/dist/core/index.d.ts +23 -0
  216. package/dist/core/index.js +21 -0
  217. package/dist/core/index.js.map +1 -0
  218. package/dist/core/mcp/config.d.ts +44 -0
  219. package/dist/core/mcp/config.js +65 -0
  220. package/dist/core/mcp/config.js.map +1 -0
  221. package/dist/core/mcp/index.d.ts +8 -0
  222. package/dist/core/mcp/index.js +12 -0
  223. package/dist/core/mcp/index.js.map +1 -0
  224. package/dist/core/mcp/manager.d.ts +69 -0
  225. package/dist/core/mcp/manager.js +376 -0
  226. package/dist/core/mcp/manager.js.map +1 -0
  227. package/dist/core/mcp/prefixed-mcp-tool.d.ts +14 -0
  228. package/dist/core/mcp/prefixed-mcp-tool.js +38 -0
  229. package/dist/core/mcp/prefixed-mcp-tool.js.map +1 -0
  230. package/dist/core/mcp/tools.d.ts +5 -0
  231. package/dist/core/mcp/tools.js +82 -0
  232. package/dist/core/mcp/tools.js.map +1 -0
  233. package/dist/core/mcp/types.d.ts +40 -0
  234. package/dist/core/mcp/types.js +28 -0
  235. package/dist/core/mcp/types.js.map +1 -0
  236. package/dist/core/memory/index.d.ts +3 -0
  237. package/dist/core/memory/index.js +3 -0
  238. package/dist/core/memory/index.js.map +1 -0
  239. package/dist/core/memory/ltm/embed.d.ts +16 -0
  240. package/dist/core/memory/ltm/embed.js +49 -0
  241. package/dist/core/memory/ltm/embed.js.map +1 -0
  242. package/dist/core/memory/ltm/index.d.ts +3 -0
  243. package/dist/core/memory/ltm/index.js +3 -0
  244. package/dist/core/memory/ltm/index.js.map +1 -0
  245. package/dist/core/memory/ltm/store.d.ts +20 -0
  246. package/dist/core/memory/ltm/store.js +271 -0
  247. package/dist/core/memory/ltm/store.js.map +1 -0
  248. package/dist/core/memory/ltm/tools.d.ts +21 -0
  249. package/dist/core/memory/ltm/tools.js +127 -0
  250. package/dist/core/memory/ltm/tools.js.map +1 -0
  251. package/dist/core/memory/ltm/types.d.ts +79 -0
  252. package/dist/core/memory/ltm/types.js +2 -0
  253. package/dist/core/memory/ltm/types.js.map +1 -0
  254. package/dist/core/memory/ltm/utils.d.ts +40 -0
  255. package/dist/core/memory/ltm/utils.js +145 -0
  256. package/dist/core/memory/ltm/utils.js.map +1 -0
  257. package/dist/core/memory/stm/flat-file-storage.d.ts +27 -0
  258. package/dist/core/memory/stm/flat-file-storage.js +63 -0
  259. package/dist/core/memory/stm/flat-file-storage.js.map +1 -0
  260. package/dist/core/memory/stm/index.d.ts +13 -0
  261. package/dist/core/memory/stm/index.js +24 -0
  262. package/dist/core/memory/stm/index.js.map +1 -0
  263. package/dist/core/memory/stm/lazy-session-manager.d.ts +37 -0
  264. package/dist/core/memory/stm/lazy-session-manager.js +163 -0
  265. package/dist/core/memory/stm/lazy-session-manager.js.map +1 -0
  266. package/dist/core/models/anthropic.d.ts +10 -0
  267. package/dist/core/models/anthropic.js +38 -0
  268. package/dist/core/models/anthropic.js.map +1 -0
  269. package/dist/core/models/bedrock.d.ts +21 -0
  270. package/dist/core/models/bedrock.js +24 -0
  271. package/dist/core/models/bedrock.js.map +1 -0
  272. package/dist/core/models/google.d.ts +10 -0
  273. package/dist/core/models/google.js +36 -0
  274. package/dist/core/models/google.js.map +1 -0
  275. package/dist/core/models/groq.d.ts +10 -0
  276. package/dist/core/models/groq.js +33 -0
  277. package/dist/core/models/groq.js.map +1 -0
  278. package/dist/core/models/index.d.ts +5 -0
  279. package/dist/core/models/index.js +11 -0
  280. package/dist/core/models/index.js.map +1 -0
  281. package/dist/core/models/moonshot.d.ts +11 -0
  282. package/dist/core/models/moonshot.js +39 -0
  283. package/dist/core/models/moonshot.js.map +1 -0
  284. package/dist/core/models/ollama/index.d.ts +3 -0
  285. package/dist/core/models/ollama/index.js +9 -0
  286. package/dist/core/models/ollama/index.js.map +1 -0
  287. package/dist/core/models/ollama/strands-ollama.d.ts +30 -0
  288. package/dist/core/models/ollama/strands-ollama.js +336 -0
  289. package/dist/core/models/ollama/strands-ollama.js.map +1 -0
  290. package/dist/core/models/openai.d.ts +4 -0
  291. package/dist/core/models/openai.js +9 -0
  292. package/dist/core/models/openai.js.map +1 -0
  293. package/dist/core/models/xai.d.ts +10 -0
  294. package/dist/core/models/xai.js +33 -0
  295. package/dist/core/models/xai.js.map +1 -0
  296. package/dist/core/prompts/environment.d.ts +11 -0
  297. package/dist/core/prompts/environment.js +51 -0
  298. package/dist/core/prompts/environment.js.map +1 -0
  299. package/dist/core/prompts/index.d.ts +7 -0
  300. package/dist/core/prompts/index.js +14 -0
  301. package/dist/core/prompts/index.js.map +1 -0
  302. package/dist/core/prompts/skills.d.ts +15 -0
  303. package/dist/core/prompts/skills.js +86 -0
  304. package/dist/core/prompts/skills.js.map +1 -0
  305. package/dist/core/prompts/system.d.ts +22 -0
  306. package/dist/core/prompts/system.js +164 -0
  307. package/dist/core/prompts/system.js.map +1 -0
  308. package/dist/core/skills/built-in/hooman-config/SKILL.md +9 -0
  309. package/dist/core/skills/index.d.ts +2 -0
  310. package/dist/core/skills/index.js +3 -0
  311. package/dist/core/skills/index.js.map +1 -0
  312. package/dist/core/skills/metadata.d.ts +8 -0
  313. package/dist/core/skills/metadata.js +20 -0
  314. package/dist/core/skills/metadata.js.map +1 -0
  315. package/dist/core/skills/registry.d.ts +38 -0
  316. package/dist/core/skills/registry.js +165 -0
  317. package/dist/core/skills/registry.js.map +1 -0
  318. package/dist/core/skills/tools.d.ts +9 -0
  319. package/dist/core/skills/tools.js +73 -0
  320. package/dist/core/skills/tools.js.map +1 -0
  321. package/dist/core/state/file-tool-display.d.ts +20 -0
  322. package/dist/core/state/file-tool-display.js +35 -0
  323. package/dist/core/state/file-tool-display.js.map +1 -0
  324. package/dist/core/state/thought-process.d.ts +18 -0
  325. package/dist/core/state/thought-process.js +21 -0
  326. package/dist/core/state/thought-process.js.map +1 -0
  327. package/dist/core/state/todos.d.ts +39 -0
  328. package/dist/core/state/todos.js +53 -0
  329. package/dist/core/state/todos.js.map +1 -0
  330. package/dist/core/state/tool-approvals.d.ts +12 -0
  331. package/dist/core/state/tool-approvals.js +81 -0
  332. package/dist/core/state/tool-approvals.js.map +1 -0
  333. package/dist/core/tools/fetch.d.ts +9 -0
  334. package/dist/core/tools/fetch.js +228 -0
  335. package/dist/core/tools/fetch.js.map +1 -0
  336. package/dist/core/tools/filesystem.d.ts +35 -0
  337. package/dist/core/tools/filesystem.js +791 -0
  338. package/dist/core/tools/filesystem.js.map +1 -0
  339. package/dist/core/tools/index.d.ts +9 -0
  340. package/dist/core/tools/index.js +10 -0
  341. package/dist/core/tools/index.js.map +1 -0
  342. package/dist/core/tools/shell.d.ts +18 -0
  343. package/dist/core/tools/shell.js +308 -0
  344. package/dist/core/tools/shell.js.map +1 -0
  345. package/dist/core/tools/sleep.d.ts +4 -0
  346. package/dist/core/tools/sleep.js +46 -0
  347. package/dist/core/tools/sleep.js.map +1 -0
  348. package/dist/core/tools/thinking.d.ts +12 -0
  349. package/dist/core/tools/thinking.js +119 -0
  350. package/dist/core/tools/thinking.js.map +1 -0
  351. package/dist/core/tools/time.d.ts +8 -0
  352. package/dist/core/tools/time.js +94 -0
  353. package/dist/core/tools/time.js.map +1 -0
  354. package/dist/core/tools/todo.d.ts +9 -0
  355. package/dist/core/tools/todo.js +33 -0
  356. package/dist/core/tools/todo.js.map +1 -0
  357. package/dist/core/tools/web-search.d.ts +11 -0
  358. package/dist/core/tools/web-search.js +211 -0
  359. package/dist/core/tools/web-search.js.map +1 -0
  360. package/dist/core/tools/wiki.d.ts +11 -0
  361. package/dist/core/tools/wiki.js +566 -0
  362. package/dist/core/tools/wiki.js.map +1 -0
  363. package/dist/core/utils/attachments.d.ts +23 -0
  364. package/dist/core/utils/attachments.js +125 -0
  365. package/dist/core/utils/attachments.js.map +1 -0
  366. package/dist/core/utils/cwd-context.d.ts +2 -0
  367. package/dist/core/utils/cwd-context.js +9 -0
  368. package/dist/core/utils/cwd-context.js.map +1 -0
  369. package/dist/core/utils/file-formats.d.ts +4 -0
  370. package/dist/core/utils/file-formats.js +48 -0
  371. package/dist/core/utils/file-formats.js.map +1 -0
  372. package/dist/core/utils/paths.d.ts +7 -0
  373. package/dist/core/utils/paths.js +25 -0
  374. package/dist/core/utils/paths.js.map +1 -0
  375. package/dist/daemon/approvals.d.ts +5 -0
  376. package/dist/daemon/approvals.js +95 -0
  377. package/dist/daemon/approvals.js.map +1 -0
  378. package/dist/daemon/index.d.ts +11 -0
  379. package/dist/daemon/index.js +106 -0
  380. package/dist/daemon/index.js.map +1 -0
  381. package/dist/daemon/queue.d.ts +5 -0
  382. package/dist/daemon/queue.js +38 -0
  383. package/dist/daemon/queue.js.map +1 -0
  384. package/dist/exec/approvals.d.ts +6 -0
  385. package/dist/exec/approvals.js +74 -0
  386. package/dist/exec/approvals.js.map +1 -0
  387. package/package.json +20 -9
  388. package/.github/screenshot.png +0 -0
  389. package/.github/workflows/build-publish.yml +0 -49
  390. package/docker-compose.yml +0 -13
  391. package/src/acp/acp-agent.ts +0 -814
  392. package/src/acp/approvals.ts +0 -146
  393. package/src/acp/index.ts +0 -1
  394. package/src/acp/mcp-servers.ts +0 -64
  395. package/src/acp/meta/system-prompt.ts +0 -44
  396. package/src/acp/meta/user-id.ts +0 -44
  397. package/src/acp/prompt-invoke.ts +0 -149
  398. package/src/acp/sessions/config-options.ts +0 -120
  399. package/src/acp/sessions/replay.ts +0 -131
  400. package/src/acp/sessions/store.ts +0 -161
  401. package/src/acp/sessions/title.ts +0 -22
  402. package/src/acp/utils/tool-kind.ts +0 -61
  403. package/src/acp/utils/tool-locations.ts +0 -48
  404. package/src/acp/utils/tool-result-content.ts +0 -27
  405. package/src/chat/app.tsx +0 -636
  406. package/src/chat/approvals.ts +0 -97
  407. package/src/chat/components/ApprovalPrompt.tsx +0 -25
  408. package/src/chat/components/ChatMessage.tsx +0 -50
  409. package/src/chat/components/Composer.tsx +0 -45
  410. package/src/chat/components/EmptyChatBanner.tsx +0 -26
  411. package/src/chat/components/PromptInput.tsx +0 -62
  412. package/src/chat/components/QueuedPrompts.tsx +0 -76
  413. package/src/chat/components/ReasoningStrip.tsx +0 -30
  414. package/src/chat/components/Spinner.tsx +0 -34
  415. package/src/chat/components/StatusBar.tsx +0 -67
  416. package/src/chat/components/ThinkingStatus.tsx +0 -128
  417. package/src/chat/components/TodoPanel.tsx +0 -49
  418. package/src/chat/components/ToolEvent.tsx +0 -41
  419. package/src/chat/components/ToolEventFileResult.tsx +0 -116
  420. package/src/chat/components/Transcript.tsx +0 -34
  421. package/src/chat/components/TranscriptViewport.tsx +0 -170
  422. package/src/chat/components/file-tool-diff/file-tool-result.ts +0 -155
  423. package/src/chat/components/markdown/BlockRenderer.tsx +0 -207
  424. package/src/chat/components/markdown/CodeBlock.tsx +0 -100
  425. package/src/chat/components/markdown/InlineRenderer.tsx +0 -122
  426. package/src/chat/components/markdown/MarkdownMessage.tsx +0 -35
  427. package/src/chat/components/markdown/MarkdownTable.tsx +0 -23
  428. package/src/chat/components/markdown/hooks/useMarkdownTableLayout.ts +0 -242
  429. package/src/chat/components/markdown/hooks/useMarkdownTokens.ts +0 -46
  430. package/src/chat/components/markdown/lexer.ts +0 -100
  431. package/src/chat/components/prompt-input/clipboard-image.ts +0 -119
  432. package/src/chat/components/prompt-input/hooks/usePromptInputController.ts +0 -4
  433. package/src/chat/components/prompt-input/input-model.ts +0 -294
  434. package/src/chat/components/prompt-input/paste.ts +0 -105
  435. package/src/chat/components/prompt-input/render.ts +0 -83
  436. package/src/chat/components/prompt-input/usePromptInputController.ts +0 -498
  437. package/src/chat/components/shared.ts +0 -70
  438. package/src/chat/index.tsx +0 -41
  439. package/src/chat/mouse.ts +0 -17
  440. package/src/chat/types.ts +0 -24
  441. package/src/cli.ts +0 -181
  442. package/src/configure/app.tsx +0 -1349
  443. package/src/configure/components/BusyScreen.tsx +0 -22
  444. package/src/configure/components/HomeScreen.tsx +0 -43
  445. package/src/configure/components/MenuScreen.tsx +0 -44
  446. package/src/configure/components/PromptForm.tsx +0 -40
  447. package/src/configure/components/SelectMenuItem.tsx +0 -30
  448. package/src/configure/index.tsx +0 -43
  449. package/src/configure/open-in-editor.ts +0 -133
  450. package/src/configure/types.ts +0 -51
  451. package/src/configure/utils.ts +0 -134
  452. package/src/core/agent/index.ts +0 -108
  453. package/src/core/agents/definitions.ts +0 -48
  454. package/src/core/agents/index.ts +0 -15
  455. package/src/core/agents/registry.ts +0 -106
  456. package/src/core/agents/runner.ts +0 -375
  457. package/src/core/agents/tools.ts +0 -100
  458. package/src/core/config.ts +0 -377
  459. package/src/core/index.ts +0 -60
  460. package/src/core/mcp/config.ts +0 -80
  461. package/src/core/mcp/index.ts +0 -33
  462. package/src/core/mcp/manager.ts +0 -491
  463. package/src/core/mcp/prefixed-mcp-tool.ts +0 -45
  464. package/src/core/mcp/tools.ts +0 -92
  465. package/src/core/mcp/types.ts +0 -37
  466. package/src/core/memory/index.ts +0 -17
  467. package/src/core/memory/ltm/embed.ts +0 -67
  468. package/src/core/memory/ltm/index.ts +0 -18
  469. package/src/core/memory/ltm/store.ts +0 -376
  470. package/src/core/memory/ltm/tools.ts +0 -146
  471. package/src/core/memory/ltm/types.ts +0 -111
  472. package/src/core/memory/ltm/utils.ts +0 -218
  473. package/src/core/memory/stm/flat-file-storage.ts +0 -89
  474. package/src/core/memory/stm/index.ts +0 -32
  475. package/src/core/memory/stm/lazy-session-manager.ts +0 -220
  476. package/src/core/models/anthropic.ts +0 -53
  477. package/src/core/models/bedrock.ts +0 -54
  478. package/src/core/models/google.ts +0 -51
  479. package/src/core/models/groq.ts +0 -48
  480. package/src/core/models/index.ts +0 -19
  481. package/src/core/models/moonshot.ts +0 -54
  482. package/src/core/models/ollama/index.ts +0 -13
  483. package/src/core/models/ollama/strands-ollama.ts +0 -439
  484. package/src/core/models/openai.ts +0 -12
  485. package/src/core/models/xai.ts +0 -47
  486. package/src/core/prompts/environment.ts +0 -71
  487. package/src/core/prompts/index.ts +0 -22
  488. package/src/core/prompts/skills.ts +0 -66
  489. package/src/core/prompts/system.ts +0 -183
  490. package/src/core/skills/index.ts +0 -2
  491. package/src/core/skills/registry.ts +0 -239
  492. package/src/core/skills/tools.ts +0 -80
  493. package/src/core/state/file-tool-display.ts +0 -70
  494. package/src/core/state/thought-process.ts +0 -49
  495. package/src/core/state/todos.ts +0 -84
  496. package/src/core/state/tool-approvals.ts +0 -100
  497. package/src/core/tools/fetch.ts +0 -288
  498. package/src/core/tools/filesystem.ts +0 -1105
  499. package/src/core/tools/index.ts +0 -9
  500. package/src/core/tools/shell.ts +0 -426
  501. package/src/core/tools/sleep.ts +0 -51
  502. package/src/core/tools/thinking.ts +0 -149
  503. package/src/core/tools/time.ts +0 -121
  504. package/src/core/tools/todo.ts +0 -44
  505. package/src/core/tools/web-search.ts +0 -278
  506. package/src/core/tools/wiki.ts +0 -703
  507. package/src/core/utils/attachments.ts +0 -201
  508. package/src/core/utils/cwd-context.ts +0 -11
  509. package/src/core/utils/file-formats.ts +0 -60
  510. package/src/core/utils/paths.ts +0 -37
  511. package/src/daemon/approvals.ts +0 -127
  512. package/src/daemon/index.ts +0 -153
  513. package/src/daemon/queue.ts +0 -48
  514. package/src/exec/approvals.ts +0 -90
  515. package/tsconfig.json +0 -30
  516. /package/{src → dist}/core/prompts/agents/plan.md +0 -0
  517. /package/{src → dist}/core/prompts/agents/research.md +0 -0
  518. /package/{src → dist}/core/prompts/harness/behaviour.md +0 -0
  519. /package/{src → dist}/core/prompts/harness/communication.md +0 -0
  520. /package/{src → dist}/core/prompts/harness/engineering.md +0 -0
  521. /package/{src → dist}/core/prompts/harness/execution.md +0 -0
  522. /package/{src → dist}/core/prompts/harness/guardrails.md +0 -0
  523. /package/{src → dist}/core/prompts/static/daemon.md +0 -0
  524. /package/{src → dist}/core/prompts/static/environment.md +0 -0
  525. /package/{src → dist}/core/prompts/static/fetch.md +0 -0
  526. /package/{src → dist}/core/prompts/static/filesystem.md +0 -0
  527. /package/{src → dist}/core/prompts/static/identity.md +0 -0
  528. /package/{src → dist}/core/prompts/static/ltm.md +0 -0
  529. /package/{src → dist}/core/prompts/static/shell.md +0 -0
  530. /package/{src → dist}/core/prompts/static/skills.md +0 -0
  531. /package/{src → dist}/core/prompts/static/sleep.md +0 -0
  532. /package/{src → dist}/core/prompts/static/subagents.md +0 -0
  533. /package/{src → dist}/core/prompts/static/thinking.md +0 -0
  534. /package/{src → dist}/core/prompts/static/todo.md +0 -0
  535. /package/{src → dist}/core/prompts/static/web-search.md +0 -0
  536. /package/{src → dist}/core/prompts/static/wiki.md +0 -0
@@ -0,0 +1,125 @@
1
+ import { basename } from "node:path";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { DocumentBlock, ImageBlock, TextBlock, VideoBlock, } from "@strands-agents/sdk";
4
+ import { detectDocumentFormat, detectImageFormat, detectVideoFormat, } from "./file-formats.js";
5
+ const DEFAULT_MAX_ATTACHMENT_BYTES = 1024 * 1024;
6
+ export function normalizeAttachmentPaths(input) {
7
+ if (!Array.isArray(input)) {
8
+ return [];
9
+ }
10
+ const normalized = input
11
+ .map((value) => (typeof value === "string" ? value.trim() : ""))
12
+ .filter(Boolean);
13
+ return [...new Set(normalized)];
14
+ }
15
+ export function attachmentDiagnosticBlock(path, reason, extra, kind = "attachment") {
16
+ return new TextBlock(JSON.stringify({
17
+ path,
18
+ kind,
19
+ skipped: true,
20
+ reason,
21
+ ...(extra ?? {}),
22
+ }));
23
+ }
24
+ export async function readAttachmentAsBlocksOrBase64(filePath, options) {
25
+ const maxBytes = options?.maxBytes ?? DEFAULT_MAX_ATTACHMENT_BYTES;
26
+ const includeMetadata = options?.includeMetadata ?? true;
27
+ const unsupportedFormat = options?.unsupportedFormat ?? "base64";
28
+ const onError = options?.onError ?? "throw";
29
+ const diagnosticKind = options?.diagnosticKind ?? "attachment";
30
+ const trimmedPath = filePath.trim();
31
+ const asDiagnostic = (reason, extra) => [
32
+ attachmentDiagnosticBlock(trimmedPath, reason, extra, diagnosticKind),
33
+ ];
34
+ if (!trimmedPath) {
35
+ if (onError === "diagnostic") {
36
+ return asDiagnostic("Attachment path is empty.");
37
+ }
38
+ throw new Error("Attachment path is empty.");
39
+ }
40
+ try {
41
+ const info = await stat(trimmedPath);
42
+ if (!info.isFile()) {
43
+ if (onError === "diagnostic") {
44
+ return asDiagnostic("Attachment path is not a file.");
45
+ }
46
+ throw new Error(`Path is not a file: ${trimmedPath}`);
47
+ }
48
+ if (info.size > maxBytes) {
49
+ if (onError === "diagnostic") {
50
+ return asDiagnostic("Attachment exceeds size limit.", {
51
+ size_bytes: info.size,
52
+ max_size_bytes: maxBytes,
53
+ });
54
+ }
55
+ throw new Error(`File too large to read safely (${info.size} bytes). Use a different path or process the file with another tool.`);
56
+ }
57
+ const buffer = await readFile(trimmedPath);
58
+ const bytes = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
59
+ const metadata = (kind, format) => new TextBlock(JSON.stringify({
60
+ path: trimmedPath,
61
+ kind,
62
+ format,
63
+ size_bytes: info.size,
64
+ }));
65
+ const imageFormat = detectImageFormat(trimmedPath);
66
+ if (imageFormat) {
67
+ return [
68
+ ...(includeMetadata ? [metadata("image", imageFormat)] : []),
69
+ new ImageBlock({ format: imageFormat, source: { bytes } }),
70
+ ];
71
+ }
72
+ const videoFormat = detectVideoFormat(trimmedPath);
73
+ if (videoFormat) {
74
+ return [
75
+ ...(includeMetadata ? [metadata("video", videoFormat)] : []),
76
+ new VideoBlock({ format: videoFormat, source: { bytes } }),
77
+ ];
78
+ }
79
+ const documentFormat = detectDocumentFormat(trimmedPath);
80
+ if (documentFormat) {
81
+ return [
82
+ ...(includeMetadata ? [metadata("document", documentFormat)] : []),
83
+ new DocumentBlock({
84
+ name: basename(trimmedPath),
85
+ format: documentFormat,
86
+ source: { bytes },
87
+ }),
88
+ ];
89
+ }
90
+ if (unsupportedFormat === "diagnostic") {
91
+ return asDiagnostic("Unsupported attachment format.", {
92
+ size_bytes: info.size,
93
+ });
94
+ }
95
+ return {
96
+ path: trimmedPath,
97
+ encoding: "base64",
98
+ content: buffer.toString("base64"),
99
+ sizeBytes: buffer.length,
100
+ };
101
+ }
102
+ catch (error) {
103
+ if (onError === "diagnostic") {
104
+ return asDiagnostic("Failed to load attachment.", {
105
+ error: error instanceof Error ? error.message : String(error),
106
+ });
107
+ }
108
+ throw error;
109
+ }
110
+ }
111
+ export async function attachmentPathsToPromptBlocks(paths, options) {
112
+ const blocks = [];
113
+ for (const path of paths) {
114
+ const result = await readAttachmentAsBlocksOrBase64(path, {
115
+ ...options,
116
+ unsupportedFormat: "diagnostic",
117
+ onError: "diagnostic",
118
+ });
119
+ if (Array.isArray(result)) {
120
+ blocks.push(...result);
121
+ }
122
+ }
123
+ return blocks;
124
+ }
125
+ //# sourceMappingURL=attachments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/core/utils/attachments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runWithCwd<T>(cwd: string, fn: () => Promise<T>): Promise<T>;
2
+ export declare function getCwd(): string;
@@ -0,0 +1,9 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+ const storage = new AsyncLocalStorage();
3
+ export function runWithCwd(cwd, fn) {
4
+ return storage.run(cwd, fn);
5
+ }
6
+ export function getCwd() {
7
+ return storage.getStore() ?? process.cwd();
8
+ }
9
+ //# sourceMappingURL=cwd-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwd-context.js","sourceRoot":"","sources":["../../../src/core/utils/cwd-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAU,CAAC;AAEhD,MAAM,UAAU,UAAU,CAAI,GAAW,EAAE,EAAoB;IAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,MAAM;IACpB,OAAO,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DocumentFormat, ImageFormat, VideoFormat } from "@strands-agents/sdk";
2
+ export declare function detectImageFormat(filePath: string): ImageFormat | undefined;
3
+ export declare function detectVideoFormat(filePath: string): VideoFormat | undefined;
4
+ export declare function detectDocumentFormat(filePath: string): DocumentFormat | undefined;
@@ -0,0 +1,48 @@
1
+ import path from "node:path";
2
+ // Extension → SDK media format. Values must match the unions the Strands SDK
3
+ // exposes so ImageBlock / VideoBlock / DocumentBlock construct cleanly. Each
4
+ // provider adapter (OpenAI, Anthropic, Bedrock, Google, Ollama) converts these
5
+ // into its native shape or gracefully drops unsupported ones with a warning —
6
+ // the paired TextBlock metadata still reaches the model either way.
7
+ const IMAGE_EXT_FORMATS = {
8
+ ".png": "png",
9
+ ".jpg": "jpeg",
10
+ ".jpeg": "jpeg",
11
+ ".gif": "gif",
12
+ ".webp": "webp",
13
+ };
14
+ const VIDEO_EXT_FORMATS = {
15
+ ".mp4": "mp4",
16
+ ".mov": "mov",
17
+ ".mkv": "mkv",
18
+ ".webm": "webm",
19
+ ".flv": "flv",
20
+ ".mpeg": "mpeg",
21
+ ".mpg": "mpg",
22
+ ".wmv": "wmv",
23
+ ".3gp": "3gp",
24
+ };
25
+ const DOCUMENT_EXT_FORMATS = {
26
+ ".pdf": "pdf",
27
+ ".csv": "csv",
28
+ ".doc": "doc",
29
+ ".docx": "docx",
30
+ ".xls": "xls",
31
+ ".xlsx": "xlsx",
32
+ ".html": "html",
33
+ ".htm": "html",
34
+ ".txt": "txt",
35
+ ".md": "md",
36
+ ".json": "json",
37
+ ".xml": "xml",
38
+ };
39
+ export function detectImageFormat(filePath) {
40
+ return IMAGE_EXT_FORMATS[path.extname(filePath).toLowerCase()];
41
+ }
42
+ export function detectVideoFormat(filePath) {
43
+ return VIDEO_EXT_FORMATS[path.extname(filePath).toLowerCase()];
44
+ }
45
+ export function detectDocumentFormat(filePath) {
46
+ return DOCUMENT_EXT_FORMATS[path.extname(filePath).toLowerCase()];
47
+ }
48
+ //# sourceMappingURL=file-formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-formats.js","sourceRoot":"","sources":["../../../src/core/utils/file-formats.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,6EAA6E;AAC7E,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,oEAAoE;AACpE,MAAM,iBAAiB,GAAgC;IACrD,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,iBAAiB,GAAgC;IACrD,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,MAAM,oBAAoB,GAAmC;IAC3D,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,KAAK;IACb,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgB;IAEhB,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const basePath: () => string;
2
+ export declare const configJsonPath: () => string;
3
+ export declare const instructionsMdPath: () => string;
4
+ export declare const mcpJsonPath: () => string;
5
+ export declare const sessionsPath: () => string;
6
+ export declare const attachmentsPath: () => string;
7
+ export declare const skillsPath: () => string;
@@ -0,0 +1,25 @@
1
+ import { homedir } from "os";
2
+ import { join } from "path";
3
+ const APP_FOLDER = ".hooman";
4
+ export const basePath = () => {
5
+ return join(homedir(), APP_FOLDER);
6
+ };
7
+ export const configJsonPath = () => {
8
+ return join(basePath(), "config.json");
9
+ };
10
+ export const instructionsMdPath = () => {
11
+ return join(basePath(), "instructions.md");
12
+ };
13
+ export const mcpJsonPath = () => {
14
+ return join(basePath(), "mcp.json");
15
+ };
16
+ export const sessionsPath = () => {
17
+ return join(basePath(), "sessions");
18
+ };
19
+ export const attachmentsPath = () => {
20
+ return join(basePath(), "attachments");
21
+ };
22
+ export const skillsPath = () => {
23
+ return join(basePath(), "skills");
24
+ };
25
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/core/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE;IACrC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE;IAC9B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE;IAC/B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE;IAClC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE;IAC7B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Agent, BeforeToolCallEvent } from "@strands-agents/sdk";
2
+ import type { Manager as McpManager } from "../core/mcp/index.js";
3
+ export declare function createDaemonApprovalHandler(manager: McpManager, agent: Agent, options?: {
4
+ yolo?: boolean;
5
+ }): (event: BeforeToolCallEvent) => Promise<void>;
@@ -0,0 +1,95 @@
1
+ import { INTERNAL_ALWAYS_ALLOWED, allowToolForSession, isToolSessionAllowed, } from "../core/state/tool-approvals.js";
2
+ const TOOL_DESCRIPTION_PREVIEW_LIMIT = 50;
3
+ const TOOL_ARGS_PREVIEW_LIMIT = 50;
4
+ function randomRequestId() {
5
+ return crypto.randomUUID();
6
+ }
7
+ function truncateWithEllipsis(text, max) {
8
+ return text.length > max ? `${text.slice(0, max)}…` : text;
9
+ }
10
+ function truncateWithHiddenCharCount(text, max) {
11
+ if (text.length <= max) {
12
+ return text;
13
+ }
14
+ const hidden = text.length - max;
15
+ return `${text.slice(0, max)}…(${hidden} chars)`;
16
+ }
17
+ function inputPreview(input) {
18
+ try {
19
+ const text = JSON.stringify(input) ?? "null";
20
+ return truncateWithHiddenCharCount(text, TOOL_ARGS_PREVIEW_LIMIT);
21
+ }
22
+ catch {
23
+ return truncateWithHiddenCharCount(String(input), TOOL_ARGS_PREVIEW_LIMIT);
24
+ }
25
+ }
26
+ function readOrigin(agent) {
27
+ const raw = agent.appState.get("origin");
28
+ if (!raw || typeof raw !== "object") {
29
+ return null;
30
+ }
31
+ const entry = raw;
32
+ const text = (value) => {
33
+ if (typeof value !== "string") {
34
+ return undefined;
35
+ }
36
+ const trimmed = value.trim();
37
+ return trimmed.length > 0 ? trimmed : undefined;
38
+ };
39
+ return {
40
+ server: text(entry.server),
41
+ source: text(entry.source),
42
+ user: text(entry.user),
43
+ session: text(entry.session),
44
+ thread: text(entry.thread),
45
+ };
46
+ }
47
+ export function createDaemonApprovalHandler(manager, agent, options) {
48
+ return async (event) => {
49
+ const name = event.toolUse.name;
50
+ if (options?.yolo) {
51
+ return;
52
+ }
53
+ if (INTERNAL_ALWAYS_ALLOWED.has(name) ||
54
+ isToolSessionAllowed(event.agent, name)) {
55
+ return;
56
+ }
57
+ const origin = readOrigin(agent);
58
+ if (!origin?.server) {
59
+ event.cancel = `Tool "${name}" was denied: missing daemon origin context.`;
60
+ return;
61
+ }
62
+ const supported = await manager.supportsChannelPermission(origin.server);
63
+ if (!supported) {
64
+ event.cancel = `Tool "${name}" was denied: MCP server "${origin.server}" does not support hooman/channel/permission.`;
65
+ return;
66
+ }
67
+ let behavior;
68
+ try {
69
+ behavior = await manager.requestChannelPermission(origin.server, {
70
+ requestId: randomRequestId(),
71
+ tool: name,
72
+ description: truncateWithEllipsis(event.tool?.description?.trim() ??
73
+ `Run tool "${name}" in daemon mode.`, TOOL_DESCRIPTION_PREVIEW_LIMIT),
74
+ preview: inputPreview(event.toolUse.input),
75
+ source: origin.source,
76
+ user: origin.user,
77
+ session: origin.session,
78
+ thread: origin.thread,
79
+ });
80
+ }
81
+ catch (error) {
82
+ event.cancel = `Tool "${name}" was denied: failed to request permission (${error instanceof Error ? error.message : String(error)}).`;
83
+ return;
84
+ }
85
+ if (behavior === "allow_once") {
86
+ return;
87
+ }
88
+ if (behavior === "allow_always") {
89
+ allowToolForSession(event.agent, name);
90
+ return;
91
+ }
92
+ event.cancel = `Tool "${name}" was rejected by remote approval.`;
93
+ };
94
+ }
95
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/daemon/approvals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type Agent } from "@strands-agents/sdk";
2
+ import type { Manager as McpManager } from "../core/mcp/index.js";
3
+ type RunDaemonOptions = {
4
+ agent: Agent;
5
+ manager: McpManager;
6
+ session?: string;
7
+ channels: boolean;
8
+ debug?: boolean;
9
+ };
10
+ export declare function main(options: RunDaemonOptions): Promise<void>;
11
+ export {};
@@ -0,0 +1,106 @@
1
+ import { stderr } from "node:process";
2
+ import { Message, TextBlock, } from "@strands-agents/sdk";
3
+ import { HOOMAN_CHANNEL } from "../core/mcp/index.js";
4
+ import { attachmentPathsToPromptBlocks } from "../core/utils/attachments.js";
5
+ import { createQueue } from "./queue.js";
6
+ const MAX_ATTACHMENT_BYTES = 1024 * 1024;
7
+ function debug(text) {
8
+ stderr.write(`[daemon] ${text}\n`);
9
+ }
10
+ function resolveSessionId(message, fallback) {
11
+ const raw = message.meta.session?.trim() || fallback;
12
+ if (!raw)
13
+ return undefined;
14
+ // Namespace per `server:channel` so the same chat id coming from two
15
+ // different MCP servers (or two channels on the same server) never collide.
16
+ return `${message.meta.subscription.server}:${message.meta.subscription.channel}:${raw}`;
17
+ }
18
+ function resolveUserId(message, session) {
19
+ const raw = message.meta.user?.trim();
20
+ if (!raw)
21
+ return session;
22
+ // Same user id across different servers is not the same human, so scope
23
+ // user ids by server. Channel is intentionally omitted so long-term memory
24
+ // can stay consistent for a user across rooms within one server.
25
+ return `${message.meta.subscription.server}:${raw}`;
26
+ }
27
+ function formatSubscriptions(subscriptions) {
28
+ if (subscriptions.length === 0) {
29
+ return "none";
30
+ }
31
+ const servers = [
32
+ ...new Set(subscriptions.map((subscription) => subscription.server)),
33
+ ].sort((left, right) => left.localeCompare(right));
34
+ return `${servers.length} MCP server(s): ${servers.join(", ")}`;
35
+ }
36
+ async function toInvokeInput(message) {
37
+ if (message.attachments.length === 0) {
38
+ return message.prompt;
39
+ }
40
+ const blocks = [new TextBlock(message.prompt)];
41
+ const attachmentBlocks = await attachmentPathsToPromptBlocks(message.attachments, {
42
+ maxBytes: MAX_ATTACHMENT_BYTES,
43
+ });
44
+ blocks.push(...attachmentBlocks);
45
+ return [new Message({ role: "user", content: blocks })];
46
+ }
47
+ export async function main(options) {
48
+ if (!options.channels) {
49
+ throw new Error("No daemon inputs enabled. Pass --channels.");
50
+ }
51
+ const channels = [HOOMAN_CHANNEL];
52
+ debug(`starting daemon for channel(s): ${channels.join(", ")}`);
53
+ let unsubscribe = () => { };
54
+ const [queue, stop] = await createQueue(async (message) => {
55
+ const tag = `${message.meta.subscription.server}:${message.meta.subscription.channel}`;
56
+ const session = resolveSessionId(message, options.session);
57
+ const user = resolveUserId(message, session);
58
+ debug(`dequeued → ${tag} session=${session} user=${user}`);
59
+ if (options.debug) {
60
+ debug(`raw → ${JSON.stringify(message.meta)}`);
61
+ }
62
+ options.agent.appState.set("userId", user);
63
+ options.agent.appState.set("sessionId", session);
64
+ const origin = {
65
+ server: message.meta.subscription.server,
66
+ channel: message.meta.subscription.channel,
67
+ ...(message.meta.source ? { source: message.meta.source } : {}),
68
+ ...(message.meta.user ? { user: message.meta.user } : {}),
69
+ ...(message.meta.session ? { session: message.meta.session } : {}),
70
+ ...(message.meta.thread ? { thread: message.meta.thread } : {}),
71
+ };
72
+ options.agent.appState.set("origin", {
73
+ ...origin,
74
+ });
75
+ try {
76
+ debug(`invoking agent → ${tag} session=${session} user=${user}`);
77
+ const invokeInput = await toInvokeInput(message);
78
+ if (typeof invokeInput === "string") {
79
+ await options.agent.invoke(invokeInput);
80
+ }
81
+ else {
82
+ for await (const event of options.agent.stream(invokeInput)) {
83
+ void event;
84
+ }
85
+ }
86
+ debug(`completed → ${tag} session=${session} user=${user}`);
87
+ }
88
+ catch (error) {
89
+ const text = error instanceof Error ? error.message : String(error);
90
+ debug(`turn failed → ${tag} session=${session} user=${user}: ${text}`);
91
+ }
92
+ }, () => unsubscribe());
93
+ const handle = await options.manager.subscribeToChannels(channels, (message) => {
94
+ debug(`received notification → ${message.meta.subscription.server}:${message.meta.subscription.channel}`);
95
+ void queue.push(message);
96
+ });
97
+ unsubscribe = handle.unsubscribe;
98
+ debug(`subscribed → ${formatSubscriptions(handle.subscriptions)}`);
99
+ try {
100
+ await stop();
101
+ }
102
+ finally {
103
+ debug("stopping daemon");
104
+ }
105
+ }
106
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,OAAO,EACP,SAAS,GAGV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMtD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUzC,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,SAAS,KAAK,CAAC,IAAY;IACzB,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAuB,EACvB,QAAiB;IAEjB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC;IACrD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,qEAAqE;IACrE,4EAA4E;IAC5E,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC;AAC3F,CAAC;AAED,SAAS,aAAa,CACpB,OAAuB,EACvB,OAAgB;IAEhB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC;IACzB,wEAAwE;IACxE,2EAA2E;IAC3E,iEAAiE;IACjE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,mBAAmB,CAC1B,aAA6C;IAE7C,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG;QACd,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;KACrE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,OAAO,GAAG,OAAO,CAAC,MAAM,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAuB;IAEvB,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IACD,MAAM,MAAM,GAAmB,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,MAAM,6BAA6B,CAC1D,OAAO,CAAC,WAAW,EACnB;QACE,QAAQ,EAAE,oBAAoB;KAC/B,CACF,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAyB;IAClD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,KAAK,CAAC,mCAAmC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhE,IAAI,WAAW,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAE3B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,WAAW,CACrC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QACvF,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE7C,KAAK,CAAC,cAAc,GAAG,YAAY,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;YACxC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO;YAC1C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;YACnC,GAAG,MAAM;SACV,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,KAAK,CAAC,oBAAoB,GAAG,YAAY,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACpC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC5D,KAAK,KAAK,CAAC;gBACb,CAAC;YACH,CAAC;YACD,KAAK,CAAC,eAAe,GAAG,YAAY,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpE,KAAK,CAAC,iBAAiB,GAAG,YAAY,OAAO,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC,EACD,GAAG,EAAE,CAAC,WAAW,EAAE,CACpB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,mBAAmB,CACtD,QAAQ,EACR,CAAC,OAAO,EAAE,EAAE;QACV,KAAK,CACH,2BAA2B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CACnG,CAAC;QACF,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC,CACF,CAAC;IACF,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,KAAK,CAAC,gBAAgB,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAEnE,IAAI,CAAC;QACH,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import fastq from "fastq";
2
+ import type { ChannelMessage } from "../core/mcp/index.js";
3
+ type MessageQueue = fastq.queueAsPromised<ChannelMessage, void>;
4
+ export declare function createQueue(handler: (message: ChannelMessage) => Promise<void>, cleanup: () => void): Promise<[MessageQueue, () => Promise<void>]>;
5
+ export {};
@@ -0,0 +1,38 @@
1
+ import fastq from "fastq";
2
+ export async function createQueue(handler, cleanup) {
3
+ let stopping = false;
4
+ let resolver = null;
5
+ const queue = fastq.promise(async (message) => {
6
+ await handler(message);
7
+ }, 1);
8
+ const stopper = new Promise((resolve) => {
9
+ resolver = resolve;
10
+ });
11
+ const shutdown = () => {
12
+ if (stopping) {
13
+ return;
14
+ }
15
+ stopping = true;
16
+ queue.kill();
17
+ resolver?.();
18
+ };
19
+ const onSigInt = () => shutdown();
20
+ const onSigTerm = () => shutdown();
21
+ process.on("SIGINT", onSigInt);
22
+ process.on("SIGTERM", onSigTerm);
23
+ return [
24
+ queue,
25
+ async () => {
26
+ try {
27
+ await stopper;
28
+ }
29
+ finally {
30
+ cleanup();
31
+ await queue.drained().catch(() => { });
32
+ process.off("SIGINT", onSigInt);
33
+ process.off("SIGTERM", onSigTerm);
34
+ }
35
+ },
36
+ ];
37
+ }
38
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/daemon/queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAmD,EACnD,OAAmB;IAEnB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,GAAwB,IAAI,CAAC;IACzC,MAAM,KAAK,GAAiB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC1E,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEN,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,CAAC,IAAI,EAAE,CAAC;QACb,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAEnC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEjC,OAAO;QACL,KAAK;QACL,KAAK,IAAI,EAAE;YACT,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC;YAChB,CAAC;oBAAS,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { BeforeToolCallEvent } from "@strands-agents/sdk";
2
+ type BeforeToolCallEventHandler = (event: BeforeToolCallEvent) => Promise<void>;
3
+ export declare function createToolApprovalHandler(options?: {
4
+ yolo?: boolean;
5
+ }): BeforeToolCallEventHandler;
6
+ export {};
@@ -0,0 +1,74 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { INTERNAL_ALWAYS_ALLOWED, allowToolForSession, isToolSessionAllowed, } from "../core/state/tool-approvals.js";
4
+ const INPUT_PREVIEW_LIMIT = 1_024;
5
+ function inputPreview(input) {
6
+ try {
7
+ const text = JSON.stringify(input, null, 2) ?? "null";
8
+ return text.length > INPUT_PREVIEW_LIMIT
9
+ ? `${text.slice(0, INPUT_PREVIEW_LIMIT)}\n... (truncated)`
10
+ : text;
11
+ }
12
+ catch {
13
+ return String(input);
14
+ }
15
+ }
16
+ function canPromptForApproval() {
17
+ return Boolean(stdin.isTTY && stdout.isTTY);
18
+ }
19
+ async function promptForApproval(event) {
20
+ const rl = createInterface({ input: stdin, output: stdout });
21
+ const description = event.tool?.description?.trim();
22
+ const preview = inputPreview(event.toolUse.input);
23
+ try {
24
+ stdout.write(`\nTool approval required\n`);
25
+ stdout.write(`Tool: ${event.toolUse.name}\n`);
26
+ if (description) {
27
+ stdout.write(`Description: ${description}\n`);
28
+ }
29
+ stdout.write(`Input:\n${preview}\n`);
30
+ stdout.write(`Options: [a]llow once, [r]eject, [A]lways allow\n`);
31
+ while (true) {
32
+ const answer = (await rl.question("> ")).trim();
33
+ if (answer === "a" || answer === "allow" || answer === "") {
34
+ return "allow";
35
+ }
36
+ if (answer === "r" || answer === "reject") {
37
+ return "reject";
38
+ }
39
+ if (answer === "A" || answer === "always") {
40
+ return "always";
41
+ }
42
+ stdout.write("Enter a, r, or A.\n");
43
+ }
44
+ }
45
+ finally {
46
+ rl.close();
47
+ }
48
+ }
49
+ export function createToolApprovalHandler(options) {
50
+ return async function onBeforeToolCallEvent(event) {
51
+ const name = event.toolUse.name;
52
+ if (options?.yolo) {
53
+ return;
54
+ }
55
+ if (INTERNAL_ALWAYS_ALLOWED.has(name) ||
56
+ isToolSessionAllowed(event.agent, name)) {
57
+ return;
58
+ }
59
+ if (!canPromptForApproval()) {
60
+ event.cancel = `Tool "${name}" requires approval, but no interactive terminal is available.`;
61
+ return;
62
+ }
63
+ const decision = await promptForApproval(event);
64
+ if (decision === "allow") {
65
+ return;
66
+ }
67
+ if (decision === "always") {
68
+ allowToolForSession(event.agent, name);
69
+ return;
70
+ }
71
+ event.cancel = `Tool "${name}" was rejected by the user.`;
72
+ };
73
+ }
74
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/exec/approvals.ts"],"names":[],"mappings":"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"}