@ebowwa/coder 0.2.1 → 0.7.64

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 (401) hide show
  1. package/README.md +31 -32
  2. package/dist/core/__tests__/permissions.test.d.ts +12 -0
  3. package/dist/core/__tests__/permissions.test.d.ts.map +1 -0
  4. package/dist/core/__tests__/permissions.test.js +851 -0
  5. package/dist/core/agent-loop/__tests__/compaction.test.d.ts +5 -0
  6. package/dist/core/agent-loop/__tests__/compaction.test.d.ts.map +1 -0
  7. package/dist/core/agent-loop/__tests__/compaction.test.js +209 -0
  8. package/dist/core/agent-loop/__tests__/formatters.test.d.ts +5 -0
  9. package/dist/core/agent-loop/__tests__/formatters.test.d.ts.map +1 -0
  10. package/dist/core/agent-loop/__tests__/formatters.test.js +195 -0
  11. package/dist/core/agent-loop/__tests__/index.test.d.ts +5 -0
  12. package/dist/core/agent-loop/__tests__/index.test.d.ts.map +1 -0
  13. package/dist/core/agent-loop/__tests__/index.test.js +121 -0
  14. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts +5 -0
  15. package/dist/core/agent-loop/__tests__/loop-state.test.d.ts.map +1 -0
  16. package/dist/core/agent-loop/__tests__/loop-state.test.js +340 -0
  17. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts +5 -0
  18. package/dist/core/agent-loop/__tests__/message-builder.test.d.ts.map +1 -0
  19. package/dist/core/agent-loop/__tests__/message-builder.test.js +178 -0
  20. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts +5 -0
  21. package/dist/core/agent-loop/__tests__/tool-executor.test.d.ts.map +1 -0
  22. package/dist/core/agent-loop/__tests__/tool-executor.test.js +331 -0
  23. package/dist/core/agent-loop/compaction.d.ts +39 -0
  24. package/dist/core/agent-loop/compaction.d.ts.map +1 -0
  25. package/dist/core/agent-loop/compaction.js +51 -0
  26. package/dist/core/agent-loop/formatters.d.ts +21 -0
  27. package/dist/core/agent-loop/formatters.d.ts.map +1 -0
  28. package/dist/core/agent-loop/formatters.js +42 -0
  29. package/dist/core/agent-loop/index.d.ts +25 -0
  30. package/dist/core/agent-loop/index.d.ts.map +1 -0
  31. package/dist/core/agent-loop/index.js +83 -0
  32. package/dist/core/agent-loop/loop-state.d.ts +74 -0
  33. package/dist/core/agent-loop/loop-state.d.ts.map +1 -0
  34. package/dist/core/agent-loop/loop-state.js +147 -0
  35. package/dist/core/agent-loop/message-builder.d.ts +13 -0
  36. package/dist/core/agent-loop/message-builder.d.ts.map +1 -0
  37. package/dist/core/agent-loop/message-builder.js +49 -0
  38. package/dist/core/agent-loop/tool-executor.d.ts +23 -0
  39. package/dist/core/agent-loop/tool-executor.d.ts.map +1 -0
  40. package/dist/core/agent-loop/tool-executor.js +152 -0
  41. package/dist/core/agent-loop/turn-executor.d.ts +57 -0
  42. package/dist/core/agent-loop/turn-executor.d.ts.map +1 -0
  43. package/dist/core/agent-loop/turn-executor.js +124 -0
  44. package/dist/core/agent-loop/types.d.ts +141 -0
  45. package/dist/core/agent-loop/types.d.ts.map +1 -0
  46. package/dist/core/agent-loop/types.js +4 -0
  47. package/dist/core/agent-loop.d.ts +17 -0
  48. package/dist/core/agent-loop.d.ts.map +1 -0
  49. package/dist/core/agent-loop.js +16 -0
  50. package/dist/core/api-client-impl.d.ts +62 -0
  51. package/dist/core/api-client-impl.d.ts.map +1 -0
  52. package/dist/core/api-client-impl.js +479 -0
  53. package/dist/core/api-client.d.ts +6 -0
  54. package/dist/core/api-client.d.ts.map +1 -0
  55. package/dist/core/api-client.js +5 -0
  56. package/dist/core/checkpoints.d.ts +128 -0
  57. package/dist/core/checkpoints.d.ts.map +1 -0
  58. package/dist/core/checkpoints.js +438 -0
  59. package/dist/core/claude-md.d.ts +71 -0
  60. package/dist/core/claude-md.d.ts.map +1 -0
  61. package/dist/core/claude-md.js +198 -0
  62. package/dist/core/cognitive-security/hooks.d.ts +138 -0
  63. package/dist/core/cognitive-security/hooks.d.ts.map +1 -0
  64. package/dist/core/cognitive-security/hooks.js +389 -0
  65. package/dist/core/cognitive-security/index.d.ts +751 -0
  66. package/dist/core/cognitive-security/index.d.ts.map +1 -0
  67. package/dist/core/cognitive-security/index.js +1123 -0
  68. package/dist/core/cognitive-security/middleware.d.ts +136 -0
  69. package/dist/core/cognitive-security/middleware.d.ts.map +1 -0
  70. package/dist/core/cognitive-security/middleware.js +376 -0
  71. package/dist/core/config-loader.d.ts +127 -0
  72. package/dist/core/config-loader.d.ts.map +1 -0
  73. package/dist/core/config-loader.js +219 -0
  74. package/dist/core/context-compaction.d.ts +87 -0
  75. package/dist/core/context-compaction.d.ts.map +1 -0
  76. package/dist/core/context-compaction.js +428 -0
  77. package/dist/core/git-status.d.ts +25 -0
  78. package/dist/core/git-status.d.ts.map +1 -0
  79. package/dist/core/git-status.js +204 -0
  80. package/dist/core/image.d.ts +69 -0
  81. package/dist/core/image.d.ts.map +1 -0
  82. package/dist/core/image.js +290 -0
  83. package/dist/core/image.test.d.ts +2 -0
  84. package/dist/core/image.test.d.ts.map +1 -0
  85. package/dist/core/image.test.js +149 -0
  86. package/dist/core/models.d.ts +123 -0
  87. package/dist/core/models.d.ts.map +1 -0
  88. package/dist/core/models.js +325 -0
  89. package/dist/core/permissions.d.ts +81 -0
  90. package/dist/core/permissions.d.ts.map +1 -0
  91. package/dist/core/permissions.js +327 -0
  92. package/dist/core/retry.d.ts +25 -0
  93. package/dist/core/retry.d.ts.map +1 -0
  94. package/dist/core/retry.js +121 -0
  95. package/dist/core/session-store.d.ts +9 -0
  96. package/dist/core/session-store.d.ts.map +1 -0
  97. package/dist/core/session-store.js +10 -0
  98. package/dist/core/sessions/export.d.ts +47 -0
  99. package/dist/core/sessions/export.d.ts.map +1 -0
  100. package/dist/core/sessions/export.js +256 -0
  101. package/dist/core/sessions/index.d.ts +132 -0
  102. package/dist/core/sessions/index.d.ts.map +1 -0
  103. package/dist/core/sessions/index.js +442 -0
  104. package/dist/core/sessions/metadata.d.ts +77 -0
  105. package/dist/core/sessions/metadata.d.ts.map +1 -0
  106. package/dist/core/sessions/metadata.js +233 -0
  107. package/dist/core/sessions/persistence.d.ts +72 -0
  108. package/dist/core/sessions/persistence.d.ts.map +1 -0
  109. package/dist/core/sessions/persistence.js +201 -0
  110. package/dist/core/sessions/types.d.ts +110 -0
  111. package/dist/core/sessions/types.d.ts.map +1 -0
  112. package/dist/core/sessions/types.js +4 -0
  113. package/dist/core/stream-highlighter.d.ts +18 -0
  114. package/dist/core/stream-highlighter.d.ts.map +1 -0
  115. package/dist/core/stream-highlighter.js +916 -0
  116. package/dist/core/system-reminders.d.ts +89 -0
  117. package/dist/core/system-reminders.d.ts.map +1 -0
  118. package/dist/core/system-reminders.js +285 -0
  119. package/dist/ecosystem/hooks/__tests__/index.test.d.ts +5 -0
  120. package/dist/ecosystem/hooks/__tests__/index.test.d.ts.map +1 -0
  121. package/dist/ecosystem/hooks/__tests__/index.test.js +458 -0
  122. package/dist/ecosystem/hooks/index.d.ts +59 -0
  123. package/dist/ecosystem/hooks/index.d.ts.map +1 -0
  124. package/dist/ecosystem/hooks/index.js +294 -0
  125. package/dist/ecosystem/hooks/prompt-evaluator.d.ts +32 -0
  126. package/dist/ecosystem/hooks/prompt-evaluator.d.ts.map +1 -0
  127. package/dist/ecosystem/hooks/prompt-evaluator.js +229 -0
  128. package/dist/ecosystem/skills/index.d.ts +55 -0
  129. package/dist/ecosystem/skills/index.d.ts.map +1 -0
  130. package/dist/ecosystem/skills/index.js +258 -0
  131. package/dist/ecosystem/tools/__tests__/index.test.d.ts +7 -0
  132. package/dist/ecosystem/tools/__tests__/index.test.d.ts.map +1 -0
  133. package/dist/ecosystem/tools/__tests__/index.test.js +856 -0
  134. package/dist/ecosystem/tools/index.d.ts +24 -0
  135. package/dist/ecosystem/tools/index.d.ts.map +1 -0
  136. package/dist/ecosystem/tools/index.js +1709 -0
  137. package/dist/index.d.ts +24 -0
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +32 -2
  140. package/dist/interfaces/mcp/client.d.ts +40 -0
  141. package/dist/interfaces/mcp/client.d.ts.map +1 -0
  142. package/dist/interfaces/mcp/client.js +309 -0
  143. package/dist/interfaces/ui/index.d.ts +36 -0
  144. package/dist/interfaces/ui/index.d.ts.map +1 -0
  145. package/dist/interfaces/ui/index.js +61 -0
  146. package/dist/interfaces/ui/spinner.d.ts +140 -0
  147. package/dist/interfaces/ui/spinner.d.ts.map +1 -0
  148. package/dist/interfaces/ui/spinner.js +342 -0
  149. package/dist/interfaces/ui/terminal/cli/index.d.ts +12 -0
  150. package/dist/interfaces/ui/terminal/cli/index.d.ts.map +1 -0
  151. package/dist/interfaces/ui/terminal/cli/index.js +167 -0
  152. package/dist/interfaces/ui/terminal/shared/args.d.ts +39 -0
  153. package/dist/interfaces/ui/terminal/shared/args.d.ts.map +1 -0
  154. package/dist/interfaces/ui/terminal/shared/args.js +176 -0
  155. package/dist/interfaces/ui/terminal/shared/index.d.ts +11 -0
  156. package/dist/interfaces/ui/terminal/shared/index.d.ts.map +1 -0
  157. package/dist/interfaces/ui/terminal/shared/index.js +16 -0
  158. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts +124 -0
  159. package/dist/interfaces/ui/terminal/shared/loading-state.d.ts.map +1 -0
  160. package/dist/interfaces/ui/terminal/shared/loading-state.js +246 -0
  161. package/dist/interfaces/ui/terminal/shared/query.d.ts +22 -0
  162. package/dist/interfaces/ui/terminal/shared/query.d.ts.map +1 -0
  163. package/dist/interfaces/ui/terminal/shared/query.js +100 -0
  164. package/dist/interfaces/ui/terminal/shared/setup.d.ts +33 -0
  165. package/dist/interfaces/ui/terminal/shared/setup.d.ts.map +1 -0
  166. package/dist/interfaces/ui/terminal/shared/setup.js +226 -0
  167. package/dist/interfaces/ui/terminal/shared/status-line.d.ts +117 -0
  168. package/dist/interfaces/ui/terminal/shared/status-line.d.ts.map +1 -0
  169. package/dist/interfaces/ui/terminal/shared/status-line.js +267 -0
  170. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts +38 -0
  171. package/dist/interfaces/ui/terminal/shared/system-prompt.d.ts.map +1 -0
  172. package/dist/interfaces/ui/terminal/shared/system-prompt.js +102 -0
  173. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts +39 -0
  174. package/dist/interfaces/ui/terminal/tui/HelpPanel.d.ts.map +1 -0
  175. package/dist/interfaces/ui/terminal/tui/HelpPanel.js +215 -0
  176. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts +91 -0
  177. package/dist/interfaces/ui/terminal/tui/InputContext.d.ts.map +1 -0
  178. package/dist/interfaces/ui/terminal/tui/InputContext.js +154 -0
  179. package/dist/interfaces/ui/terminal/tui/InputField.d.ts +18 -0
  180. package/dist/interfaces/ui/terminal/tui/InputField.d.ts.map +1 -0
  181. package/dist/interfaces/ui/terminal/tui/InputField.js +41 -0
  182. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts +16 -0
  183. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.d.ts.map +1 -0
  184. package/dist/interfaces/ui/terminal/tui/InteractiveTUI.js +451 -0
  185. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts +10 -0
  186. package/dist/interfaces/ui/terminal/tui/MessageArea.d.ts.map +1 -0
  187. package/dist/interfaces/ui/terminal/tui/MessageArea.js +91 -0
  188. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts +48 -0
  189. package/dist/interfaces/ui/terminal/tui/MessageStore.d.ts.map +1 -0
  190. package/dist/interfaces/ui/terminal/tui/MessageStore.js +151 -0
  191. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts +9 -0
  192. package/dist/interfaces/ui/terminal/tui/StatusBar.d.ts.map +1 -0
  193. package/dist/interfaces/ui/terminal/tui/StatusBar.js +36 -0
  194. package/dist/interfaces/ui/terminal/tui/commands.d.ts +21 -0
  195. package/dist/interfaces/ui/terminal/tui/commands.d.ts.map +1 -0
  196. package/dist/interfaces/ui/terminal/tui/commands.js +359 -0
  197. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts +115 -0
  198. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.d.ts.map +1 -0
  199. package/dist/interfaces/ui/terminal/tui/components/InteractiveElements.js +306 -0
  200. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts +92 -0
  201. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.d.ts.map +1 -0
  202. package/dist/interfaces/ui/terminal/tui/components/MultilineInput.js +399 -0
  203. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts +59 -0
  204. package/dist/interfaces/ui/terminal/tui/components/PaneManager.d.ts.map +1 -0
  205. package/dist/interfaces/ui/terminal/tui/components/PaneManager.js +139 -0
  206. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts +68 -0
  207. package/dist/interfaces/ui/terminal/tui/components/Sidebar.d.ts.map +1 -0
  208. package/dist/interfaces/ui/terminal/tui/components/Sidebar.js +340 -0
  209. package/dist/interfaces/ui/terminal/tui/components/index.d.ts +23 -0
  210. package/dist/interfaces/ui/terminal/tui/components/index.d.ts.map +1 -0
  211. package/dist/interfaces/ui/terminal/tui/components/index.js +51 -0
  212. package/dist/interfaces/ui/terminal/tui/console.d.ts +20 -0
  213. package/dist/interfaces/ui/terminal/tui/console.d.ts.map +1 -0
  214. package/dist/interfaces/ui/terminal/tui/console.js +46 -0
  215. package/dist/interfaces/ui/terminal/tui/index.d.ts +20 -0
  216. package/dist/interfaces/ui/terminal/tui/index.d.ts.map +1 -0
  217. package/dist/interfaces/ui/terminal/tui/index.js +28 -0
  218. package/dist/interfaces/ui/terminal/tui/run.d.ts +13 -0
  219. package/dist/interfaces/ui/terminal/tui/run.d.ts.map +1 -0
  220. package/dist/interfaces/ui/terminal/tui/run.js +31 -0
  221. package/dist/interfaces/ui/terminal/tui/spinner.d.ts +44 -0
  222. package/dist/interfaces/ui/terminal/tui/spinner.d.ts.map +1 -0
  223. package/dist/interfaces/ui/terminal/tui/spinner.js +59 -0
  224. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts +39 -0
  225. package/dist/interfaces/ui/terminal/tui/tui-app.d.ts.map +1 -0
  226. package/dist/interfaces/ui/terminal/tui/tui-app.js +198 -0
  227. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts +167 -0
  228. package/dist/interfaces/ui/terminal/tui/tui-footer.d.ts.map +1 -0
  229. package/dist/interfaces/ui/terminal/tui/tui-footer.js +330 -0
  230. package/dist/interfaces/ui/terminal/tui/types.d.ts +165 -0
  231. package/dist/interfaces/ui/terminal/tui/types.d.ts.map +1 -0
  232. package/dist/interfaces/ui/terminal/tui/types.js +5 -0
  233. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts +23 -0
  234. package/dist/interfaces/ui/terminal/tui/useInputHandler.d.ts.map +1 -0
  235. package/dist/interfaces/ui/terminal/tui/useInputHandler.js +72 -0
  236. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts +90 -0
  237. package/dist/interfaces/ui/terminal/tui/useNativeInput.d.ts.map +1 -0
  238. package/dist/interfaces/ui/terminal/tui/useNativeInput.js +188 -0
  239. package/dist/native/index.d.ts +480 -0
  240. package/dist/native/index.d.ts.map +1 -0
  241. package/dist/native/index.js +1625 -0
  242. package/dist/teammates/index.d.ts +161 -0
  243. package/dist/teammates/index.d.ts.map +1 -0
  244. package/dist/teammates/index.js +827 -0
  245. package/dist/types/index.d.ts +482 -0
  246. package/dist/types/index.d.ts.map +1 -0
  247. package/dist/types/index.js +52 -0
  248. package/native/README.md +5 -5
  249. package/native/index.darwin-arm64.node +0 -0
  250. package/native/index.node +0 -0
  251. package/native/package.json +4 -4
  252. package/package.json +33 -16
  253. package/packages/src/core/__tests__/permissions.test.ts +1091 -0
  254. package/packages/src/core/agent-loop/__tests__/compaction.test.ts +280 -0
  255. package/packages/src/core/agent-loop/__tests__/formatters.test.ts +234 -0
  256. package/packages/src/core/agent-loop/__tests__/index.test.ts +162 -0
  257. package/packages/src/core/agent-loop/__tests__/loop-state.test.ts +413 -0
  258. package/packages/src/core/agent-loop/__tests__/message-builder.test.ts +229 -0
  259. package/packages/src/core/agent-loop/__tests__/tool-executor.test.ts +457 -0
  260. package/packages/src/core/agent-loop/compaction.ts +88 -0
  261. package/packages/src/core/agent-loop/formatters.ts +50 -0
  262. package/packages/src/core/agent-loop/index.ts +135 -0
  263. package/packages/src/core/agent-loop/loop-state.ts +187 -0
  264. package/packages/src/core/agent-loop/message-builder.ts +62 -0
  265. package/packages/src/core/agent-loop/tool-executor.ts +211 -0
  266. package/packages/src/core/agent-loop/turn-executor.ts +222 -0
  267. package/packages/src/core/agent-loop/types.ts +148 -0
  268. package/packages/src/core/agent-loop.ts +18 -0
  269. package/packages/src/core/api-client-impl.ts +619 -0
  270. package/packages/src/core/api-client.ts +6 -0
  271. package/packages/src/core/checkpoints.ts +606 -0
  272. package/packages/src/core/claude-md.ts +272 -0
  273. package/packages/src/core/cognitive-security/hooks.ts +590 -0
  274. package/packages/src/core/cognitive-security/index.ts +2041 -0
  275. package/packages/src/core/cognitive-security/middleware.ts +536 -0
  276. package/packages/src/core/config-loader.ts +324 -0
  277. package/packages/src/core/context-compaction.ts +578 -0
  278. package/packages/src/core/git-status.ts +262 -0
  279. package/packages/src/core/image.test.ts +180 -0
  280. package/packages/src/core/image.ts +350 -0
  281. package/packages/src/core/lmdb.db +0 -0
  282. package/packages/src/core/lmdb.db-lock +0 -0
  283. package/packages/src/core/models.ts +430 -0
  284. package/packages/src/core/normalizers/todo +4 -0
  285. package/packages/src/core/permissions.ts +431 -0
  286. package/packages/src/core/retry.ts +170 -0
  287. package/packages/src/core/session-store.ts +36 -0
  288. package/packages/src/core/sessions/export.ts +329 -0
  289. package/packages/src/core/sessions/index.ts +587 -0
  290. package/packages/src/core/sessions/metadata.ts +309 -0
  291. package/packages/src/core/sessions/persistence.ts +244 -0
  292. package/packages/src/core/sessions/types.ts +169 -0
  293. package/packages/src/core/stream-highlighter.ts +1123 -0
  294. package/packages/src/core/system-reminders.ts +402 -0
  295. package/packages/src/core/todo +8 -0
  296. package/packages/src/ecosystem/hooks/__tests__/index.test.ts +561 -0
  297. package/packages/src/ecosystem/hooks/index.ts +341 -0
  298. package/packages/src/ecosystem/hooks/prompt-evaluator.ts +300 -0
  299. package/packages/src/ecosystem/skills/index.ts +295 -0
  300. package/packages/src/ecosystem/tools/__tests__/index.test.ts +1335 -0
  301. package/packages/src/ecosystem/tools/index.ts +1877 -0
  302. package/packages/src/index.ts +120 -0
  303. package/packages/src/interfaces/mcp/client.ts +389 -0
  304. package/packages/src/interfaces/ui/Screenshot 2026-03-02 at 9.23.10/342/200/257PM.png +0 -0
  305. package/packages/src/interfaces/ui/Screenshot 2026-03-03 at 10.55.11/342/200/257AM.png +0 -0
  306. package/packages/src/interfaces/ui/index.ts +161 -0
  307. package/packages/src/interfaces/ui/lmdb.db +0 -0
  308. package/packages/src/interfaces/ui/lmdb.db-lock +0 -0
  309. package/packages/src/interfaces/ui/spinner.ts +451 -0
  310. package/packages/src/interfaces/ui/terminal/cli/index.ts +228 -0
  311. package/packages/src/interfaces/ui/terminal/lmdb.db +0 -0
  312. package/packages/src/interfaces/ui/terminal/lmdb.db-lock +0 -0
  313. package/packages/src/interfaces/ui/terminal/shared/args.ts +222 -0
  314. package/packages/src/interfaces/ui/terminal/shared/index.ts +71 -0
  315. package/packages/src/interfaces/ui/terminal/shared/loading-state.ts +322 -0
  316. package/packages/src/interfaces/ui/terminal/shared/query.ts +146 -0
  317. package/packages/src/interfaces/ui/terminal/shared/setup.ts +295 -0
  318. package/packages/src/interfaces/ui/terminal/shared/status-line.ts +358 -0
  319. package/packages/src/interfaces/ui/terminal/shared/system-prompt.ts +146 -0
  320. package/packages/src/interfaces/ui/terminal/tui/HelpPanel.tsx +262 -0
  321. package/packages/src/interfaces/ui/terminal/tui/InputContext.tsx +232 -0
  322. package/packages/src/interfaces/ui/terminal/tui/InputField.tsx +62 -0
  323. package/packages/src/interfaces/ui/terminal/tui/InteractiveTUI.tsx +537 -0
  324. package/packages/src/interfaces/ui/terminal/tui/MessageArea.tsx +107 -0
  325. package/packages/src/interfaces/ui/terminal/tui/MessageStore.tsx +240 -0
  326. package/packages/src/interfaces/ui/terminal/tui/StatusBar.tsx +54 -0
  327. package/packages/src/interfaces/ui/terminal/tui/commands.ts +438 -0
  328. package/packages/src/interfaces/ui/terminal/tui/components/InteractiveElements.tsx +584 -0
  329. package/packages/src/interfaces/ui/terminal/tui/components/MultilineInput.tsx +614 -0
  330. package/packages/src/interfaces/ui/terminal/tui/components/PaneManager.tsx +333 -0
  331. package/packages/src/interfaces/ui/terminal/tui/components/Sidebar.tsx +604 -0
  332. package/packages/src/interfaces/ui/terminal/tui/components/index.ts +118 -0
  333. package/packages/src/interfaces/ui/terminal/tui/console.ts +49 -0
  334. package/packages/src/interfaces/ui/terminal/tui/index.ts +90 -0
  335. package/packages/src/interfaces/ui/terminal/tui/run.tsx +42 -0
  336. package/packages/src/interfaces/ui/terminal/tui/spinner.ts +69 -0
  337. package/packages/src/interfaces/ui/terminal/tui/tui-app.tsx +390 -0
  338. package/packages/src/interfaces/ui/terminal/tui/tui-footer.ts +422 -0
  339. package/packages/src/interfaces/ui/terminal/tui/types.ts +186 -0
  340. package/packages/src/interfaces/ui/terminal/tui/useInputHandler.ts +104 -0
  341. package/packages/src/interfaces/ui/terminal/tui/useNativeInput.ts +239 -0
  342. package/packages/src/lmdb.db +0 -0
  343. package/packages/src/lmdb.db-lock +0 -0
  344. package/packages/src/native/index.ts +2345 -0
  345. package/packages/src/teammates/index.ts +982 -0
  346. package/packages/src/types/index.ts +722 -0
  347. package/dist/cli.js +0 -148
  348. package/dist/index-0pkak453.js +0 -136
  349. package/dist/index-0qd0x8b4.js +0 -110
  350. package/dist/index-0x3kprq6.js +0 -240
  351. package/dist/index-1eawy937.js +0 -308
  352. package/dist/index-24m2aygy.js +0 -240
  353. package/dist/index-29xcjnne.js +0 -280
  354. package/dist/index-2avyytn5.js +0 -349
  355. package/dist/index-4ms367ey.js +0 -136
  356. package/dist/index-4w2t3b0m.js +0 -240
  357. package/dist/index-4xfgd8nz.js +0 -261
  358. package/dist/index-5acjp9gc.js +0 -157
  359. package/dist/index-5s15hr56.js +0 -136
  360. package/dist/index-6e4wf341.js +0 -349
  361. package/dist/index-6fvnkedw.js +0 -240
  362. package/dist/index-6rqpmd4g.js +0 -128
  363. package/dist/index-77ckwnbm.js +0 -280
  364. package/dist/index-9knxy49k.js +0 -128
  365. package/dist/index-9zrnw4zx.js +0 -128
  366. package/dist/index-bk21w99v.js +0 -280
  367. package/dist/index-c41n76fv.js +0 -240
  368. package/dist/index-cb4ppjdt.js +0 -255
  369. package/dist/index-cfb2edt6.js +0 -240
  370. package/dist/index-cmfa38hh.js +0 -308
  371. package/dist/index-datjz8q1.js +0 -257
  372. package/dist/index-eadf4wvn.js +0 -240
  373. package/dist/index-em5k0m3z.js +0 -345
  374. package/dist/index-gh8r333a.js +0 -110
  375. package/dist/index-gkx6k2tr.js +0 -261
  376. package/dist/index-h5cabfks.js +0 -155
  377. package/dist/index-hcrpwyy3.js +0 -261
  378. package/dist/index-hk7fwwa8.js +0 -257
  379. package/dist/index-jb8cw7f8.js +0 -136
  380. package/dist/index-kbyw4th1.js +0 -347
  381. package/dist/index-kgj5gqnm.js +0 -345
  382. package/dist/index-mdf6xp1z.js +0 -255
  383. package/dist/index-mrhv8kvc.js +0 -280
  384. package/dist/index-mt4743dd.js +0 -161
  385. package/dist/index-qnwsg97q.js +0 -240
  386. package/dist/index-qwdy6x44.js +0 -261
  387. package/dist/index-rmj77261.js +0 -157
  388. package/dist/index-sbbw1a61.js +0 -349
  389. package/dist/index-svy5bcpn.js +0 -345
  390. package/dist/index-tvmy7tm9.js +0 -261
  391. package/dist/index-tzz4vzkj.js +0 -312
  392. package/dist/index-vz80zmhe.js +0 -110
  393. package/dist/index-wed2fk67.js +0 -240
  394. package/dist/index-wksgzz8e.js +0 -280
  395. package/dist/index-wn2m4wma.js +0 -240
  396. package/dist/index-xha05vjc.js +0 -257
  397. package/dist/index-yc6eh8p8.js +0 -136
  398. package/dist/index-ycjxx9ft.js +0 -240
  399. package/dist/index-z0gzd0fc.js +0 -110
  400. package/dist/index-z8cwtf8j.js +0 -240
  401. package/dist/index-zy5mtt00.js +0 -128
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Agent Loop - Turn-based processing system
3
+ *
4
+ * This is the main orchestrator that coordinates:
5
+ * - State management (loop-state.ts)
6
+ * - Turn execution (turn-executor.ts)
7
+ * - Tool execution (tool-executor.ts)
8
+ * - Context compaction (compaction.ts)
9
+ * - Message building (message-builder.ts)
10
+ * - Formatting utilities (formatters.ts)
11
+ */
12
+
13
+ import type { Message } from "../../types/index.js";
14
+ import { DEFAULT_CACHE_CONFIG } from "../../types/index.js";
15
+ import { PermissionManager } from "../permissions.js";
16
+ import { DEFAULT_REMINDER_CONFIG } from "../system-reminders.js";
17
+ import type { HookManager } from "../../ecosystem/hooks/index.js";
18
+
19
+ import type { AgentLoopOptions, AgentLoopResult } from "./types.js";
20
+ import { LoopState } from "./loop-state.js";
21
+ import { executeTurn, type TurnExecutorOptions } from "./turn-executor.js";
22
+
23
+ // Re-export types and utilities
24
+ export type { AgentLoopOptions, AgentLoopResult } from "./types.js";
25
+ export { formatCost, formatMetrics, formatCostBrief, formatCacheMetrics } from "./formatters.js";
26
+ export { LoopState } from "./loop-state.js";
27
+ export { executeTurn } from "./turn-executor.js";
28
+ export { executeTools, type ToolExecutionOptions } from "./tool-executor.js";
29
+ export { buildAPIMessages, injectReminderIntoContent } from "./message-builder.js";
30
+ export {
31
+ handleProactiveCompaction,
32
+ handleReactiveCompaction,
33
+ needsCompaction,
34
+ estimateMessagesTokens,
35
+ DEFAULT_PROACTIVE_OPTIONS,
36
+ DEFAULT_REACTIVE_OPTIONS,
37
+ } from "./compaction.js";
38
+
39
+ /**
40
+ * Main agent loop - processes messages in turns until completion
41
+ */
42
+ export async function agentLoop(
43
+ initialMessages: Message[],
44
+ options: AgentLoopOptions
45
+ ): Promise<AgentLoopResult> {
46
+ const {
47
+ apiKey,
48
+ model = "claude-sonnet-4-6",
49
+ maxTokens = 4096,
50
+ systemPrompt,
51
+ tools,
52
+ permissionMode,
53
+ workingDirectory,
54
+ gitStatus = null,
55
+ reminderConfig,
56
+ cacheConfig = DEFAULT_CACHE_CONFIG,
57
+ thinking,
58
+ extendedThinking,
59
+ hookManager,
60
+ sessionId,
61
+ onText,
62
+ onThinking,
63
+ onToolUse,
64
+ onToolResult,
65
+ onMetrics,
66
+ onReminder,
67
+ onPermissionRequest,
68
+ signal,
69
+ } = options;
70
+
71
+ // Initialize state
72
+ const state = new LoopState(initialMessages);
73
+ const permissionManager = new PermissionManager(permissionMode, onPermissionRequest);
74
+ const mergedReminderConfig = { ...DEFAULT_REMINDER_CONFIG, ...reminderConfig };
75
+
76
+ // Execute SessionStart hook
77
+ if (hookManager) {
78
+ await hookManager.execute("SessionStart", {
79
+ session_id: sessionId,
80
+ });
81
+ }
82
+
83
+ let shouldContinue = true;
84
+
85
+ while (shouldContinue) {
86
+ if (signal?.aborted) {
87
+ break;
88
+ }
89
+
90
+ // Build turn executor options
91
+ const turnOptions: TurnExecutorOptions = {
92
+ apiKey,
93
+ model,
94
+ maxTokens,
95
+ systemPrompt,
96
+ tools,
97
+ cacheConfig,
98
+ thinking,
99
+ extendedThinking,
100
+ workingDirectory,
101
+ gitStatus,
102
+ reminderConfig: mergedReminderConfig,
103
+ hookManager,
104
+ sessionId,
105
+ signal,
106
+ onText,
107
+ onThinking,
108
+ onToolUse,
109
+ onReminder,
110
+ permissionMode,
111
+ permissionManager,
112
+ onMetrics,
113
+ onToolResult,
114
+ };
115
+
116
+ // Execute a single turn
117
+ const turnResult = await executeTurn(state, turnOptions);
118
+
119
+ shouldContinue = turnResult.shouldContinue;
120
+
121
+ // Call onMetrics callback with the latest metrics
122
+ if (turnResult.metrics && onMetrics) {
123
+ onMetrics(turnResult.metrics);
124
+ }
125
+ }
126
+
127
+ // Execute SessionEnd hook
128
+ if (hookManager) {
129
+ await hookManager.execute("SessionEnd", {
130
+ session_id: sessionId,
131
+ });
132
+ }
133
+
134
+ return state.toResult();
135
+ }
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Loop State - Mutable state management for the agent loop
3
+ */
4
+
5
+ import type {
6
+ Message,
7
+ ToolUseBlock,
8
+ QueryMetrics,
9
+ CacheMetrics,
10
+ UsageMetrics,
11
+ } from "../../types/index.js";
12
+ import type { CompactionResult, getCompactionStats } from "../context-compaction.js";
13
+
14
+ /**
15
+ * Creates an initial cache metrics object
16
+ */
17
+ export function createInitialCacheMetrics(): CacheMetrics {
18
+ return {
19
+ cacheHits: 0,
20
+ cacheMisses: 0,
21
+ totalCacheReadTokens: 0,
22
+ totalCacheWriteTokens: 0,
23
+ cacheHitRate: 0,
24
+ estimatedSavingsUSD: 0,
25
+ };
26
+ }
27
+
28
+ /**
29
+ * LoopState class encapsulates all mutable state during the agent loop
30
+ */
31
+ export class LoopState {
32
+ messages: Message[];
33
+ metrics: QueryMetrics[] = [];
34
+ allToolsUsed: ToolUseBlock[] = [];
35
+ totalCost = 0;
36
+ totalDuration = 0;
37
+ turnNumber = 0;
38
+ previousCost = 0;
39
+ compactionCount = 0;
40
+ totalTokensCompacted = 0;
41
+ cacheMetrics: CacheMetrics;
42
+
43
+ constructor(initialMessages: Message[]) {
44
+ this.messages = [...initialMessages];
45
+ this.cacheMetrics = createInitialCacheMetrics();
46
+ }
47
+
48
+ /**
49
+ * Get the latest metrics entry
50
+ */
51
+ get latestMetrics(): QueryMetrics | undefined {
52
+ return this.metrics[this.metrics.length - 1];
53
+ }
54
+
55
+ /**
56
+ * Get usage for reminder building (with fallback)
57
+ */
58
+ get currentUsage(): UsageMetrics {
59
+ return this.latestMetrics?.usage ?? {
60
+ input_tokens: 0,
61
+ output_tokens: 0,
62
+ };
63
+ }
64
+
65
+ /**
66
+ * Add a turn's results to the state
67
+ */
68
+ addTurnResult(result: {
69
+ message: { content: unknown[]; stop_reason: string | null; id: string };
70
+ usage: UsageMetrics;
71
+ cacheMetrics?: CacheMetrics;
72
+ costUSD: number;
73
+ durationMs: number;
74
+ model: string;
75
+ messageCount: number;
76
+ }): QueryMetrics {
77
+ const queryMetrics: QueryMetrics = {
78
+ model: result.model,
79
+ messageCount: result.messageCount,
80
+ messageTokens: result.usage.input_tokens + result.usage.output_tokens,
81
+ usage: result.usage,
82
+ cacheMetrics: result.cacheMetrics,
83
+ durationMs: result.durationMs,
84
+ ttftMs: 0, // Will be set by caller if available
85
+ costUSD: result.costUSD,
86
+ stopReason: result.message.stop_reason as import("../../types/index.js").StopReason,
87
+ requestId: result.message.id,
88
+ };
89
+
90
+ this.metrics.push(queryMetrics);
91
+ this.previousCost = this.totalCost;
92
+ this.totalCost += result.costUSD;
93
+ this.totalDuration += result.durationMs;
94
+
95
+ // Aggregate cache metrics
96
+ if (result.cacheMetrics) {
97
+ this.cacheMetrics.cacheHits += result.cacheMetrics.cacheHits;
98
+ this.cacheMetrics.cacheMisses += result.cacheMetrics.cacheMisses;
99
+ this.cacheMetrics.totalCacheReadTokens += result.cacheMetrics.totalCacheReadTokens;
100
+ this.cacheMetrics.totalCacheWriteTokens += result.cacheMetrics.totalCacheWriteTokens;
101
+ this.cacheMetrics.estimatedSavingsUSD += result.cacheMetrics.estimatedSavingsUSD;
102
+ }
103
+
104
+ // Update cache hit rate
105
+ const totalCacheOps = this.cacheMetrics.cacheHits + this.cacheMetrics.cacheMisses;
106
+ this.cacheMetrics.cacheHitRate = totalCacheOps > 0
107
+ ? this.cacheMetrics.cacheHits / totalCacheOps
108
+ : 0;
109
+
110
+ return queryMetrics;
111
+ }
112
+
113
+ /**
114
+ * Add assistant message to history
115
+ */
116
+ addAssistantMessage(content: unknown[]): void {
117
+ this.messages.push({
118
+ role: "assistant",
119
+ content: content as import("../../types/index.js").ContentBlock[],
120
+ });
121
+ }
122
+
123
+ /**
124
+ * Add user message (tool results) to history
125
+ */
126
+ addUserMessage(content: import("../../types/index.js").ToolResultBlock[]): void {
127
+ this.messages.push({
128
+ role: "user",
129
+ content,
130
+ });
131
+ }
132
+
133
+ /**
134
+ * Track tool usage
135
+ */
136
+ trackToolUse(toolUseBlocks: ToolUseBlock[]): void {
137
+ this.allToolsUsed.push(...toolUseBlocks);
138
+ }
139
+
140
+ /**
141
+ * Apply compaction result to state
142
+ */
143
+ applyCompaction(
144
+ compactionResult: CompactionResult,
145
+ getStats: typeof getCompactionStats
146
+ ): boolean {
147
+ // Only apply compaction if it actually saved tokens
148
+ if (!compactionResult.didCompact || compactionResult.tokensAfter >= compactionResult.tokensBefore) {
149
+ return false;
150
+ }
151
+
152
+ // Replace messages array content
153
+ this.messages.length = 0;
154
+ this.messages.push(...compactionResult.messages);
155
+
156
+ this.compactionCount++;
157
+ const tokensSaved = compactionResult.tokensBefore - compactionResult.tokensAfter;
158
+ this.totalTokensCompacted += tokensSaved;
159
+
160
+ const stats = getStats(compactionResult);
161
+ console.log(`Context compacted: ${stats.reductionPercent}% reduction, ${stats.tokensSaved} tokens saved`);
162
+
163
+ return true;
164
+ }
165
+
166
+ /**
167
+ * Increment turn counter
168
+ */
169
+ incrementTurn(): number {
170
+ return ++this.turnNumber;
171
+ }
172
+
173
+ /**
174
+ * Convert to AgentLoopResult
175
+ */
176
+ toResult(): import("./types.js").AgentLoopResult {
177
+ return {
178
+ messages: this.messages,
179
+ metrics: this.metrics,
180
+ totalCost: this.totalCost,
181
+ totalDuration: this.totalDuration,
182
+ totalCacheMetrics: this.cacheMetrics,
183
+ compactionCount: this.compactionCount,
184
+ totalTokensCompacted: this.totalTokensCompacted,
185
+ };
186
+ }
187
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Message Builder - API message construction with reminder injection
3
+ */
4
+
5
+ import type { Message, ContentBlock, TextBlock } from "../../types/index.js";
6
+
7
+ /**
8
+ * Build API messages with system reminders injected
9
+ */
10
+ export function buildAPIMessages(
11
+ messages: Message[],
12
+ systemPrompt: string,
13
+ systemReminder?: string
14
+ ): Message[] {
15
+ // If we have a system reminder, inject it into the last user message
16
+ if (systemReminder && messages.length > 0) {
17
+ const result = [...messages];
18
+ // Find the last user message
19
+ for (let i = result.length - 1; i >= 0; i--) {
20
+ const msg = result[i];
21
+ if (msg && msg.role === "user") {
22
+ // Clone the message to avoid mutating original
23
+ const updatedMessage: Message = {
24
+ role: "user",
25
+ content: Array.isArray(msg.content)
26
+ ? injectReminderIntoContent(msg.content, systemReminder)
27
+ : [{ type: "text" as const, text: `${String(msg.content)}\n\n${systemReminder}` }],
28
+ };
29
+ result[i] = updatedMessage;
30
+ break;
31
+ }
32
+ }
33
+ return result;
34
+ }
35
+
36
+ return messages;
37
+ }
38
+
39
+ /**
40
+ * Inject system reminder into content blocks
41
+ */
42
+ export function injectReminderIntoContent(
43
+ content: ContentBlock[],
44
+ reminder: string
45
+ ): ContentBlock[] {
46
+ // Check if the last block is a text block we can append to
47
+ if (content.length > 0) {
48
+ const lastBlock = content[content.length - 1];
49
+ if (lastBlock && lastBlock.type === "text") {
50
+ // Append to existing text block
51
+ const textBlock: TextBlock = {
52
+ type: "text",
53
+ text: `${lastBlock.text}\n\n${reminder}`,
54
+ };
55
+ return [...content.slice(0, -1), textBlock];
56
+ }
57
+ }
58
+
59
+ // Add as new text block
60
+ const newBlock: TextBlock = { type: "text", text: `\n\n${reminder}` };
61
+ return [...content, newBlock];
62
+ }
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Tool Executor - Parallel tool execution with hooks and permissions
3
+ */
4
+
5
+ import type {
6
+ ToolDefinition,
7
+ ToolUseBlock,
8
+ ToolResultBlock,
9
+ ToolResult,
10
+ PermissionMode,
11
+ } from "../../types/index.js";
12
+ import type { PermissionManager, PermissionResult } from "../permissions.js";
13
+ import type { HookManager } from "../../ecosystem/hooks/index.js";
14
+ export interface ToolExecutionOptions {
15
+ tools: ToolDefinition[];
16
+ workingDirectory: string;
17
+ permissionMode: PermissionMode;
18
+ hookManager?: HookManager;
19
+ sessionId?: string;
20
+ signal?: AbortSignal;
21
+ permissionManager: import("../permissions.js").PermissionManager;
22
+ onToolResult?: (result: { id: string; result: ToolResult }) => void;
23
+ }
24
+
25
+ /**
26
+ * Internal result of a single tool execution
27
+ */
28
+ interface ToolExecutionResult {
29
+ toolUseId: string;
30
+ result: ToolResultBlock;
31
+ toolResult: { id: string; result: ToolResult } | null;
32
+ }
33
+
34
+ /**
35
+ * Execute a single tool with permission checks and hooks
36
+ */
37
+ async function executeSingleTool(
38
+ toolUse: ToolUseBlock,
39
+ options: ToolExecutionOptions
40
+ ): Promise<ToolExecutionResult> {
41
+ const { tools, workingDirectory, permissionMode, hookManager, sessionId, signal, permissionManager } = options;
42
+
43
+ const tool = tools.find((t) => t.name === toolUse.name);
44
+
45
+ if (!tool) {
46
+ return {
47
+ toolUseId: toolUse.id,
48
+ result: {
49
+ type: "tool_result" as const,
50
+ tool_use_id: toolUse.id,
51
+ content: `Error: Unknown tool "${toolUse.name}"`,
52
+ is_error: true,
53
+ },
54
+ toolResult: null,
55
+ };
56
+ }
57
+
58
+ // Check permissions using PermissionManager
59
+ const permissionResult = await permissionManager.checkPermission(
60
+ tool.name,
61
+ toolUse.input as Record<string, unknown>
62
+ );
63
+
64
+ if (permissionResult.decision === "deny" || permissionResult.decision === "denyAlways") {
65
+ return {
66
+ toolUseId: toolUse.id,
67
+ result: {
68
+ type: "tool_result" as const,
69
+ tool_use_id: toolUse.id,
70
+ content: `Permission denied for tool "${toolUse.name}"${permissionResult.reason ? `: ${permissionResult.reason}` : ""}`,
71
+ is_error: true,
72
+ },
73
+ toolResult: null,
74
+ };
75
+ }
76
+
77
+ // Execute PreToolUse hooks
78
+ if (hookManager) {
79
+ const hookResult = await hookManager.execute("PreToolUse", {
80
+ tool_name: tool.name,
81
+ tool_input: toolUse.input as Record<string, unknown>,
82
+ session_id: sessionId,
83
+ });
84
+
85
+ if (hookResult.decision === "deny" || hookResult.decision === "block") {
86
+ return {
87
+ toolUseId: toolUse.id,
88
+ result: {
89
+ type: "tool_result" as const,
90
+ tool_use_id: toolUse.id,
91
+ content: hookResult.reason || `Tool "${tool.name}" blocked by hook`,
92
+ is_error: true,
93
+ },
94
+ toolResult: null,
95
+ };
96
+ }
97
+
98
+ // Apply modified input if provided
99
+ if (hookResult.modified_input) {
100
+ Object.assign(toolUse.input, hookResult.modified_input);
101
+ }
102
+ }
103
+
104
+ // Execute tool
105
+ try {
106
+ const handlerResult = await tool.handler(toolUse.input as Record<string, unknown>, {
107
+ workingDirectory,
108
+ permissionMode,
109
+ abortSignal: signal,
110
+ });
111
+
112
+ // Execute PostToolUse hooks
113
+ let finalContent = handlerResult.content;
114
+ if (hookManager) {
115
+ const hookResult = await hookManager.execute("PostToolUse", {
116
+ tool_name: tool.name,
117
+ tool_input: toolUse.input as Record<string, unknown>,
118
+ tool_result: handlerResult,
119
+ tool_result_is_error: handlerResult.is_error,
120
+ session_id: sessionId,
121
+ });
122
+
123
+ if (hookResult.decision === "deny" || hookResult.decision === "block") {
124
+ return {
125
+ toolUseId: toolUse.id,
126
+ result: {
127
+ type: "tool_result" as const,
128
+ tool_use_id: toolUse.id,
129
+ content: hookResult.reason || `Tool "${tool.name}" result blocked by hook`,
130
+ is_error: true,
131
+ },
132
+ toolResult: null,
133
+ };
134
+ }
135
+
136
+ // Apply modified output if provided
137
+ if (hookResult.modified_input?.tool_result) {
138
+ finalContent = hookResult.modified_input.tool_result as string;
139
+ }
140
+ }
141
+
142
+ return {
143
+ toolUseId: toolUse.id,
144
+ result: {
145
+ type: "tool_result" as const,
146
+ tool_use_id: toolUse.id,
147
+ content: finalContent,
148
+ is_error: handlerResult.is_error,
149
+ },
150
+ toolResult: {
151
+ id: toolUse.id,
152
+ result: { ...handlerResult, content: finalContent },
153
+ },
154
+ };
155
+ } catch (error) {
156
+ const errorMessage = error instanceof Error ? error.message : String(error);
157
+
158
+ // Execute PostToolUseFailure hooks
159
+ if (hookManager) {
160
+ await hookManager.execute("PostToolUseFailure", {
161
+ tool_name: tool.name,
162
+ tool_input: toolUse.input as Record<string, unknown>,
163
+ error: errorMessage,
164
+ session_id: sessionId,
165
+ });
166
+ }
167
+
168
+ return {
169
+ toolUseId: toolUse.id,
170
+ result: {
171
+ type: "tool_result" as const,
172
+ tool_use_id: toolUse.id,
173
+ content: `Error: ${errorMessage}`,
174
+ is_error: true,
175
+ },
176
+ toolResult: null,
177
+ };
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Execute multiple tools in parallel and collect results
183
+ */
184
+ export async function executeTools(
185
+ toolUseBlocks: ToolUseBlock[],
186
+ options: ToolExecutionOptions
187
+ ): Promise<ToolResultBlock[]> {
188
+ // Check for abort before starting parallel execution
189
+ if (options.signal?.aborted) {
190
+ return [];
191
+ }
192
+
193
+ // Map each tool use to an async operation
194
+ const toolExecutions = toolUseBlocks.map((toolUse) =>
195
+ executeSingleTool(toolUse, options)
196
+ );
197
+
198
+ // Execute all tools in parallel
199
+ const executionResults = await Promise.all(toolExecutions);
200
+
201
+ // Collect results and notify callbacks
202
+ const toolResults: ToolResultBlock[] = [];
203
+ for (const executionResult of executionResults) {
204
+ toolResults.push(executionResult.result);
205
+ if (executionResult.toolResult && options.onToolResult) {
206
+ options.onToolResult(executionResult.toolResult);
207
+ }
208
+ }
209
+
210
+ return toolResults;
211
+ }