indusagi 0.12.19 → 0.12.21

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 (518) hide show
  1. package/README.md +16 -36
  2. package/dist/agent/agent-loop.d.ts +3 -9
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +19 -58
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/agent.d.ts +9 -10
  7. package/dist/agent/agent.d.ts.map +1 -1
  8. package/dist/agent/agent.js +182 -129
  9. package/dist/agent/agent.js.map +1 -1
  10. package/dist/agent/error-handler.d.ts.map +1 -1
  11. package/dist/agent/error-handler.js.map +1 -1
  12. package/dist/agent/event-bus.d.ts.map +1 -1
  13. package/dist/agent/event-bus.js +1 -3
  14. package/dist/agent/event-bus.js.map +1 -1
  15. package/dist/agent/index.d.ts.map +1 -1
  16. package/dist/agent/index.js +0 -6
  17. package/dist/agent/index.js.map +1 -1
  18. package/dist/agent/messages.d.ts +1 -1
  19. package/dist/agent/messages.d.ts.map +1 -1
  20. package/dist/agent/proxy.d.ts +1 -14
  21. package/dist/agent/proxy.d.ts.map +1 -1
  22. package/dist/agent/proxy.js +67 -148
  23. package/dist/agent/proxy.js.map +1 -1
  24. package/dist/agent/session-manager.d.ts +10 -10
  25. package/dist/agent/session-manager.d.ts.map +1 -1
  26. package/dist/agent/session-manager.js +20 -16
  27. package/dist/agent/session-manager.js.map +1 -1
  28. package/dist/agent/state-manager.d.ts +1 -1
  29. package/dist/agent/state-manager.d.ts.map +1 -1
  30. package/dist/agent/state-manager.js +1 -0
  31. package/dist/agent/state-manager.js.map +1 -1
  32. package/dist/agent/telemetry.d.ts.map +1 -1
  33. package/dist/agent/telemetry.js +1 -3
  34. package/dist/agent/telemetry.js.map +1 -1
  35. package/dist/agent/tools/bash.d.ts.map +1 -1
  36. package/dist/agent/tools/bash.js +143 -118
  37. package/dist/agent/tools/bash.js.map +1 -1
  38. package/dist/agent/tools/edit-diff.d.ts +1 -1
  39. package/dist/agent/tools/edit-diff.d.ts.map +1 -1
  40. package/dist/agent/tools/edit-diff.js +189 -175
  41. package/dist/agent/tools/edit-diff.js.map +1 -1
  42. package/dist/agent/tools/edit.d.ts.map +1 -1
  43. package/dist/agent/tools/edit.js +137 -121
  44. package/dist/agent/tools/edit.js.map +1 -1
  45. package/dist/agent/tools/find.d.ts.map +1 -1
  46. package/dist/agent/tools/find.js +100 -65
  47. package/dist/agent/tools/find.js.map +1 -1
  48. package/dist/agent/tools/grep.d.ts.map +1 -1
  49. package/dist/agent/tools/grep.js +126 -97
  50. package/dist/agent/tools/grep.js.map +1 -1
  51. package/dist/agent/tools/index.d.ts +53 -40
  52. package/dist/agent/tools/index.d.ts.map +1 -1
  53. package/dist/agent/tools/index.js +19 -12
  54. package/dist/agent/tools/index.js.map +1 -1
  55. package/dist/agent/tools/ls.d.ts +2 -1
  56. package/dist/agent/tools/ls.d.ts.map +1 -1
  57. package/dist/agent/tools/ls.js +145 -94
  58. package/dist/agent/tools/ls.js.map +1 -1
  59. package/dist/agent/tools/path-utils.d.ts.map +1 -1
  60. package/dist/agent/tools/path-utils.js +48 -29
  61. package/dist/agent/tools/path-utils.js.map +1 -1
  62. package/dist/agent/tools/process-controller.d.ts +15 -0
  63. package/dist/agent/tools/process-controller.d.ts.map +1 -0
  64. package/dist/agent/tools/process-controller.js +39 -0
  65. package/dist/agent/tools/process-controller.js.map +1 -0
  66. package/dist/agent/tools/process-manager.d.ts +60 -0
  67. package/dist/agent/tools/process-manager.d.ts.map +1 -0
  68. package/dist/agent/tools/process-manager.js +485 -0
  69. package/dist/agent/tools/process-manager.js.map +1 -0
  70. package/dist/agent/tools/process-types.d.ts +74 -0
  71. package/dist/agent/tools/process-types.d.ts.map +1 -0
  72. package/dist/agent/tools/process-types.js +7 -0
  73. package/dist/agent/tools/process-types.js.map +1 -0
  74. package/dist/agent/tools/process.d.ts +38 -0
  75. package/dist/agent/tools/process.d.ts.map +1 -0
  76. package/dist/agent/tools/process.js +360 -0
  77. package/dist/agent/tools/process.js.map +1 -0
  78. package/dist/agent/tools/read.d.ts.map +1 -1
  79. package/dist/agent/tools/read.js +157 -135
  80. package/dist/agent/tools/read.js.map +1 -1
  81. package/dist/agent/tools/registry.js +2 -4
  82. package/dist/agent/tools/registry.js.map +1 -1
  83. package/dist/agent/tools/teams/activity-tracker.d.ts +66 -0
  84. package/dist/agent/tools/teams/activity-tracker.d.ts.map +1 -0
  85. package/dist/agent/tools/teams/activity-tracker.js +480 -0
  86. package/dist/agent/tools/teams/activity-tracker.js.map +1 -0
  87. package/dist/agent/tools/teams/cleanup.d.ts +51 -0
  88. package/dist/agent/tools/teams/cleanup.d.ts.map +1 -0
  89. package/dist/agent/tools/teams/cleanup.js +219 -0
  90. package/dist/agent/tools/teams/cleanup.js.map +1 -0
  91. package/dist/agent/tools/teams/fs-lock.d.ts +12 -0
  92. package/dist/agent/tools/teams/fs-lock.d.ts.map +1 -0
  93. package/dist/agent/tools/teams/fs-lock.js +74 -0
  94. package/dist/agent/tools/teams/fs-lock.js.map +1 -0
  95. package/dist/agent/tools/teams/index.d.ts +12 -0
  96. package/dist/agent/tools/teams/index.d.ts.map +1 -0
  97. package/dist/agent/tools/teams/index.js +12 -0
  98. package/dist/agent/tools/teams/index.js.map +1 -0
  99. package/dist/agent/tools/teams/mailbox.d.ts +21 -0
  100. package/dist/agent/tools/teams/mailbox.d.ts.map +1 -0
  101. package/dist/agent/tools/teams/mailbox.js +106 -0
  102. package/dist/agent/tools/teams/mailbox.js.map +1 -0
  103. package/dist/agent/tools/teams/model-policy.d.ts +23 -0
  104. package/dist/agent/tools/teams/model-policy.d.ts.map +1 -0
  105. package/dist/agent/tools/teams/model-policy.js +113 -0
  106. package/dist/agent/tools/teams/model-policy.js.map +1 -0
  107. package/dist/agent/tools/teams/names.d.ts +28 -0
  108. package/dist/agent/tools/teams/names.d.ts.map +1 -0
  109. package/dist/agent/tools/teams/names.js +109 -0
  110. package/dist/agent/tools/teams/names.js.map +1 -0
  111. package/dist/agent/tools/teams/protocol.d.ts +75 -0
  112. package/dist/agent/tools/teams/protocol.d.ts.map +1 -0
  113. package/dist/agent/tools/teams/protocol.js +205 -0
  114. package/dist/agent/tools/teams/protocol.js.map +1 -0
  115. package/dist/agent/tools/teams/task-store.d.ts +89 -0
  116. package/dist/agent/tools/teams/task-store.d.ts.map +1 -0
  117. package/dist/agent/tools/teams/task-store.js +445 -0
  118. package/dist/agent/tools/teams/task-store.js.map +1 -0
  119. package/dist/agent/tools/teams/team-attach-claim.d.ts +36 -0
  120. package/dist/agent/tools/teams/team-attach-claim.d.ts.map +1 -0
  121. package/dist/agent/tools/teams/team-attach-claim.js +144 -0
  122. package/dist/agent/tools/teams/team-attach-claim.js.map +1 -0
  123. package/dist/agent/tools/teams/team-config.d.ts +55 -0
  124. package/dist/agent/tools/teams/team-config.d.ts.map +1 -0
  125. package/dist/agent/tools/teams/team-config.js +252 -0
  126. package/dist/agent/tools/teams/team-config.js.map +1 -0
  127. package/dist/agent/tools/teams/worktree.d.ts +40 -0
  128. package/dist/agent/tools/teams/worktree.d.ts.map +1 -0
  129. package/dist/agent/tools/teams/worktree.js +213 -0
  130. package/dist/agent/tools/teams/worktree.js.map +1 -0
  131. package/dist/agent/tools/todo-store.js +2 -1
  132. package/dist/agent/tools/todo-store.js.map +1 -1
  133. package/dist/agent/tools/todo.d.ts +2 -2
  134. package/dist/agent/tools/todo.js +2 -2
  135. package/dist/agent/tools/truncate.d.ts.map +1 -1
  136. package/dist/agent/tools/truncate.js +150 -134
  137. package/dist/agent/tools/truncate.js.map +1 -1
  138. package/dist/agent/tools/utils/hook-runner.d.ts +9 -10
  139. package/dist/agent/tools/utils/hook-runner.d.ts.map +1 -1
  140. package/dist/agent/tools/utils/hook-runner.js +18 -16
  141. package/dist/agent/tools/utils/hook-runner.js.map +1 -1
  142. package/dist/agent/tools/utils/image-resize.d.ts +1 -14
  143. package/dist/agent/tools/utils/image-resize.d.ts.map +1 -1
  144. package/dist/agent/tools/utils/image-resize.js +80 -34
  145. package/dist/agent/tools/utils/image-resize.js.map +1 -1
  146. package/dist/agent/tools/utils/mime.d.ts +0 -8
  147. package/dist/agent/tools/utils/mime.d.ts.map +1 -1
  148. package/dist/agent/tools/utils/mime.js +43 -32
  149. package/dist/agent/tools/utils/mime.js.map +1 -1
  150. package/dist/agent/tools/utils/shell.d.ts +1 -23
  151. package/dist/agent/tools/utils/shell.d.ts.map +1 -1
  152. package/dist/agent/tools/utils/shell.js +43 -86
  153. package/dist/agent/tools/utils/shell.js.map +1 -1
  154. package/dist/agent/tools/write.d.ts.map +1 -1
  155. package/dist/agent/tools/write.js +105 -62
  156. package/dist/agent/tools/write.js.map +1 -1
  157. package/dist/agent/types.d.ts +69 -64
  158. package/dist/agent/types.d.ts.map +1 -1
  159. package/dist/agent/types.js +38 -23
  160. package/dist/agent/types.js.map +1 -1
  161. package/dist/agent.d.ts +4 -0
  162. package/dist/agent.d.ts.map +1 -1
  163. package/dist/agent.js +4 -0
  164. package/dist/agent.js.map +1 -1
  165. package/dist/ai/api-registry.d.ts.map +1 -1
  166. package/dist/ai/api-registry.js +3 -4
  167. package/dist/ai/api-registry.js.map +1 -1
  168. package/dist/ai/cli.js +62 -82
  169. package/dist/ai/cli.js.map +1 -1
  170. package/dist/ai/env-api-keys.d.ts.map +1 -1
  171. package/dist/ai/env-api-keys.js +78 -81
  172. package/dist/ai/env-api-keys.js.map +1 -1
  173. package/dist/ai/index.d.ts +6 -0
  174. package/dist/ai/index.d.ts.map +1 -1
  175. package/dist/ai/index.js +6 -0
  176. package/dist/ai/index.js.map +1 -1
  177. package/dist/ai/models.d.ts +7 -17
  178. package/dist/ai/models.d.ts.map +1 -1
  179. package/dist/ai/models.generated.d.ts +19 -0
  180. package/dist/ai/models.generated.d.ts.map +1 -1
  181. package/dist/ai/models.generated.js +14 -2
  182. package/dist/ai/models.generated.js.map +1 -1
  183. package/dist/ai/models.js +17 -11
  184. package/dist/ai/models.js.map +1 -1
  185. package/dist/ai/providers/amazon-bedrock.d.ts.map +1 -1
  186. package/dist/ai/providers/amazon-bedrock.js +319 -248
  187. package/dist/ai/providers/amazon-bedrock.js.map +1 -1
  188. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  189. package/dist/ai/providers/anthropic.js +378 -324
  190. package/dist/ai/providers/anthropic.js.map +1 -1
  191. package/dist/ai/providers/azure-openai-responses.d.ts.map +1 -1
  192. package/dist/ai/providers/azure-openai-responses.js +164 -123
  193. package/dist/ai/providers/azure-openai-responses.js.map +1 -1
  194. package/dist/ai/providers/google-shared.d.ts +0 -18
  195. package/dist/ai/providers/google-shared.d.ts.map +1 -1
  196. package/dist/ai/providers/google-shared.js +224 -225
  197. package/dist/ai/providers/google-shared.js.map +1 -1
  198. package/dist/ai/providers/google-vertex.d.ts.map +1 -1
  199. package/dist/ai/providers/google-vertex.js +244 -226
  200. package/dist/ai/providers/google-vertex.js.map +1 -1
  201. package/dist/ai/providers/google.d.ts +3 -0
  202. package/dist/ai/providers/google.d.ts.map +1 -1
  203. package/dist/ai/providers/google.js +232 -210
  204. package/dist/ai/providers/google.js.map +1 -1
  205. package/dist/ai/providers/kimi.js +1 -0
  206. package/dist/ai/providers/kimi.js.map +1 -1
  207. package/dist/ai/providers/mock.d.ts +10 -0
  208. package/dist/ai/providers/mock.d.ts.map +1 -0
  209. package/dist/ai/providers/mock.js +64 -0
  210. package/dist/ai/providers/mock.js.map +1 -0
  211. package/dist/ai/providers/openai-codex-responses.d.ts.map +1 -1
  212. package/dist/ai/providers/openai-codex-responses.js +178 -133
  213. package/dist/ai/providers/openai-codex-responses.js.map +1 -1
  214. package/dist/ai/providers/openai-completions.d.ts.map +1 -1
  215. package/dist/ai/providers/openai-completions.js +468 -387
  216. package/dist/ai/providers/openai-completions.js.map +1 -1
  217. package/dist/ai/providers/openai-responses-shared.d.ts.map +1 -1
  218. package/dist/ai/providers/openai-responses-shared.js +187 -166
  219. package/dist/ai/providers/openai-responses-shared.js.map +1 -1
  220. package/dist/ai/providers/openai-responses.d.ts.map +1 -1
  221. package/dist/ai/providers/openai-responses.js +108 -85
  222. package/dist/ai/providers/openai-responses.js.map +1 -1
  223. package/dist/ai/providers/openai-scaffold.d.ts +4 -0
  224. package/dist/ai/providers/openai-scaffold.d.ts.map +1 -0
  225. package/dist/ai/providers/openai-scaffold.js +33 -0
  226. package/dist/ai/providers/openai-scaffold.js.map +1 -0
  227. package/dist/ai/providers/register-builtins.d.ts.map +1 -1
  228. package/dist/ai/providers/register-builtins.js +109 -42
  229. package/dist/ai/providers/register-builtins.js.map +1 -1
  230. package/dist/ai/providers/simple-options.js +2 -0
  231. package/dist/ai/providers/simple-options.js.map +1 -1
  232. package/dist/ai/providers/transform-messages.js +3 -9
  233. package/dist/ai/providers/transform-messages.js.map +1 -1
  234. package/dist/ai/stream.d.ts +4 -14
  235. package/dist/ai/stream.d.ts.map +1 -1
  236. package/dist/ai/stream.js +0 -36
  237. package/dist/ai/stream.js.map +1 -1
  238. package/dist/ai/types.d.ts +22 -3
  239. package/dist/ai/types.d.ts.map +1 -1
  240. package/dist/ai/types.js +154 -77
  241. package/dist/ai/types.js.map +1 -1
  242. package/dist/ai/utils/base-stream-handler.js +1 -0
  243. package/dist/ai/utils/base-stream-handler.js.map +1 -1
  244. package/dist/ai/utils/event-stream.d.ts +2 -0
  245. package/dist/ai/utils/event-stream.d.ts.map +1 -1
  246. package/dist/ai/utils/event-stream.js +22 -5
  247. package/dist/ai/utils/event-stream.js.map +1 -1
  248. package/dist/ai/utils/json-parse.d.ts +3 -0
  249. package/dist/ai/utils/json-parse.d.ts.map +1 -1
  250. package/dist/ai/utils/json-parse.js +8 -5
  251. package/dist/ai/utils/json-parse.js.map +1 -1
  252. package/dist/ai/utils/oauth/anthropic.d.ts.map +1 -1
  253. package/dist/ai/utils/oauth/anthropic.js +110 -65
  254. package/dist/ai/utils/oauth/anthropic.js.map +1 -1
  255. package/dist/ai/utils/oauth/github-copilot.d.ts +8 -16
  256. package/dist/ai/utils/oauth/github-copilot.d.ts.map +1 -1
  257. package/dist/ai/utils/oauth/github-copilot.js +218 -227
  258. package/dist/ai/utils/oauth/github-copilot.js.map +1 -1
  259. package/dist/ai/utils/oauth/openai-codex.d.ts +4 -2
  260. package/dist/ai/utils/oauth/openai-codex.d.ts.map +1 -1
  261. package/dist/ai/utils/oauth/openai-codex.js +221 -236
  262. package/dist/ai/utils/oauth/openai-codex.js.map +1 -1
  263. package/dist/ai/utils/oauth/pkce.d.ts +6 -5
  264. package/dist/ai/utils/oauth/pkce.d.ts.map +1 -1
  265. package/dist/ai/utils/oauth/pkce.js +24 -21
  266. package/dist/ai/utils/oauth/pkce.js.map +1 -1
  267. package/dist/ai/utils/oauth/types.d.ts +31 -12
  268. package/dist/ai/utils/oauth/types.d.ts.map +1 -1
  269. package/dist/ai/utils/oauth/types.js +10 -1
  270. package/dist/ai/utils/oauth/types.js.map +1 -1
  271. package/dist/ai/utils/overflow.d.ts.map +1 -1
  272. package/dist/ai/utils/overflow.js +49 -21
  273. package/dist/ai/utils/overflow.js.map +1 -1
  274. package/dist/ai/utils/provider-adapter.js +9 -0
  275. package/dist/ai/utils/provider-adapter.js.map +1 -1
  276. package/dist/ai/utils/provider-client-builder.js +1 -1
  277. package/dist/ai/utils/provider-client-builder.js.map +1 -1
  278. package/dist/ai/utils/provider-errors.js +2 -0
  279. package/dist/ai/utils/provider-errors.js.map +1 -1
  280. package/dist/ai/utils/sanitize-unicode.d.ts +0 -20
  281. package/dist/ai/utils/sanitize-unicode.d.ts.map +1 -1
  282. package/dist/ai/utils/sanitize-unicode.js +35 -17
  283. package/dist/ai/utils/sanitize-unicode.js.map +1 -1
  284. package/dist/ai/utils/stream-event-helper.js +3 -0
  285. package/dist/ai/utils/stream-event-helper.js.map +1 -1
  286. package/dist/ai/utils/stream-handler-types.js +5 -0
  287. package/dist/ai/utils/stream-handler-types.js.map +1 -1
  288. package/dist/ai/utils/streaming-state-manager.js +4 -2
  289. package/dist/ai/utils/streaming-state-manager.js.map +1 -1
  290. package/dist/ai/utils/typebox-helpers.d.ts +6 -4
  291. package/dist/ai/utils/typebox-helpers.d.ts.map +1 -1
  292. package/dist/ai/utils/typebox-helpers.js +25 -7
  293. package/dist/ai/utils/typebox-helpers.js.map +1 -1
  294. package/dist/ai/utils/validation.d.ts.map +1 -1
  295. package/dist/ai/utils/validation.js +67 -34
  296. package/dist/ai/utils/validation.js.map +1 -1
  297. package/dist/ai.d.ts +4 -0
  298. package/dist/ai.d.ts.map +1 -1
  299. package/dist/ai.js +4 -0
  300. package/dist/ai.js.map +1 -1
  301. package/dist/cli.d.ts +3 -0
  302. package/dist/cli.d.ts.map +1 -0
  303. package/dist/cli.js +3 -0
  304. package/dist/cli.js.map +1 -0
  305. package/dist/index.d.ts +1 -0
  306. package/dist/index.d.ts.map +1 -1
  307. package/dist/index.js +1 -0
  308. package/dist/index.js.map +1 -1
  309. package/dist/mcp/client-pool.js +3 -2
  310. package/dist/mcp/client-pool.js.map +1 -1
  311. package/dist/mcp/client.js +19 -6
  312. package/dist/mcp/client.js.map +1 -1
  313. package/dist/mcp/config.d.ts +6 -6
  314. package/dist/mcp/config.js +17 -17
  315. package/dist/mcp/config.js.map +1 -1
  316. package/dist/mcp/errors.js +8 -0
  317. package/dist/mcp/errors.js.map +1 -1
  318. package/dist/mcp/index.d.ts +5 -5
  319. package/dist/mcp/index.js +5 -5
  320. package/dist/mcp/schema-converter.d.ts +1 -1
  321. package/dist/mcp/schema-converter.js +1 -1
  322. package/dist/mcp/server.d.ts +4 -4
  323. package/dist/mcp/server.js +12 -7
  324. package/dist/mcp/server.js.map +1 -1
  325. package/dist/mcp/tool-factory.d.ts +2 -2
  326. package/dist/mcp/tool-factory.js +2 -2
  327. package/dist/mcp.d.ts +0 -4
  328. package/dist/mcp.d.ts.map +1 -1
  329. package/dist/mcp.js +0 -4
  330. package/dist/mcp.js.map +1 -1
  331. package/dist/observability.d.ts +2 -0
  332. package/dist/observability.d.ts.map +1 -0
  333. package/dist/observability.js +2 -0
  334. package/dist/observability.js.map +1 -0
  335. package/dist/tui/autocomplete.d.ts +14 -18
  336. package/dist/tui/autocomplete.d.ts.map +1 -1
  337. package/dist/tui/autocomplete.js +290 -402
  338. package/dist/tui/autocomplete.js.map +1 -1
  339. package/dist/tui/components/box.d.ts +1 -6
  340. package/dist/tui/components/box.d.ts.map +1 -1
  341. package/dist/tui/components/box.js +98 -67
  342. package/dist/tui/components/box.js.map +1 -1
  343. package/dist/tui/components/cancellable-loader.d.ts +6 -3
  344. package/dist/tui/components/cancellable-loader.d.ts.map +1 -1
  345. package/dist/tui/components/cancellable-loader.js +8 -9
  346. package/dist/tui/components/cancellable-loader.js.map +1 -1
  347. package/dist/tui/components/editor.d.ts +18 -0
  348. package/dist/tui/components/editor.d.ts.map +1 -1
  349. package/dist/tui/components/editor.js +356 -354
  350. package/dist/tui/components/editor.js.map +1 -1
  351. package/dist/tui/components/image.d.ts +2 -0
  352. package/dist/tui/components/image.d.ts.map +1 -1
  353. package/dist/tui/components/image.js +79 -37
  354. package/dist/tui/components/image.js.map +1 -1
  355. package/dist/tui/components/input.d.ts +4 -8
  356. package/dist/tui/components/input.d.ts.map +1 -1
  357. package/dist/tui/components/input.js +236 -232
  358. package/dist/tui/components/input.js.map +1 -1
  359. package/dist/tui/components/loader.d.ts +5 -5
  360. package/dist/tui/components/loader.d.ts.map +1 -1
  361. package/dist/tui/components/loader.js +22 -19
  362. package/dist/tui/components/loader.js.map +1 -1
  363. package/dist/tui/components/markdown.d.ts +2 -32
  364. package/dist/tui/components/markdown.d.ts.map +1 -1
  365. package/dist/tui/components/markdown.js +338 -357
  366. package/dist/tui/components/markdown.js.map +1 -1
  367. package/dist/tui/components/select-list.d.ts +1 -0
  368. package/dist/tui/components/select-list.d.ts.map +1 -1
  369. package/dist/tui/components/select-list.js +83 -82
  370. package/dist/tui/components/select-list.js.map +1 -1
  371. package/dist/tui/components/settings-list.d.ts +10 -10
  372. package/dist/tui/components/settings-list.d.ts.map +1 -1
  373. package/dist/tui/components/settings-list.js +48 -40
  374. package/dist/tui/components/settings-list.js.map +1 -1
  375. package/dist/tui/components/spacer.d.ts +1 -0
  376. package/dist/tui/components/spacer.d.ts.map +1 -1
  377. package/dist/tui/components/spacer.js +20 -5
  378. package/dist/tui/components/spacer.js.map +1 -1
  379. package/dist/tui/components/text.d.ts.map +1 -1
  380. package/dist/tui/components/text.js +47 -20
  381. package/dist/tui/components/text.js.map +1 -1
  382. package/dist/tui/components/truncated-text.d.ts +8 -4
  383. package/dist/tui/components/truncated-text.d.ts.map +1 -1
  384. package/dist/tui/components/truncated-text.js +15 -12
  385. package/dist/tui/components/truncated-text.js.map +1 -1
  386. package/dist/tui/editor-component.d.ts +87 -23
  387. package/dist/tui/editor-component.d.ts.map +1 -1
  388. package/dist/tui/fuzzy.d.ts.map +1 -1
  389. package/dist/tui/fuzzy.js +101 -50
  390. package/dist/tui/fuzzy.js.map +1 -1
  391. package/dist/tui/keybindings.d.ts +3 -3
  392. package/dist/tui/keybindings.d.ts.map +1 -1
  393. package/dist/tui/keybindings.js +137 -111
  394. package/dist/tui/keybindings.js.map +1 -1
  395. package/dist/tui/keys.d.ts +46 -43
  396. package/dist/tui/keys.d.ts.map +1 -1
  397. package/dist/tui/keys.js +493 -411
  398. package/dist/tui/keys.js.map +1 -1
  399. package/dist/tui/stdin-buffer.d.ts.map +1 -1
  400. package/dist/tui/stdin-buffer.js +162 -159
  401. package/dist/tui/stdin-buffer.js.map +1 -1
  402. package/dist/tui/terminal-image.d.ts +10 -5
  403. package/dist/tui/terminal-image.d.ts.map +1 -1
  404. package/dist/tui/terminal-image.js +53 -51
  405. package/dist/tui/terminal-image.js.map +1 -1
  406. package/dist/tui/terminal.d.ts +4 -27
  407. package/dist/tui/terminal.d.ts.map +1 -1
  408. package/dist/tui/terminal.js +123 -121
  409. package/dist/tui/terminal.js.map +1 -1
  410. package/dist/tui/tui.d.ts +14 -1
  411. package/dist/tui/tui.d.ts.map +1 -1
  412. package/dist/tui/tui.js +185 -145
  413. package/dist/tui/tui.js.map +1 -1
  414. package/dist/tui/utils.d.ts.map +1 -1
  415. package/dist/tui/utils.js +235 -216
  416. package/dist/tui/utils.js.map +1 -1
  417. package/dist/tui.d.ts +4 -0
  418. package/dist/tui.d.ts.map +1 -1
  419. package/dist/tui.js +4 -0
  420. package/dist/tui.js.map +1 -1
  421. package/package.json +23 -43
  422. package/LICENSE.md +0 -22
  423. package/dist/agent/tools/task-types.d.ts +0 -74
  424. package/dist/agent/tools/task-types.d.ts.map +0 -1
  425. package/dist/agent/tools/task-types.js +0 -8
  426. package/dist/agent/tools/task-types.js.map +0 -1
  427. package/dist/agent/tools/task.d.ts +0 -84
  428. package/dist/agent/tools/task.d.ts.map +0 -1
  429. package/dist/agent/tools/task.js +0 -184
  430. package/dist/agent/tools/task.js.map +0 -1
  431. package/dist/memory/embedder/base.d.ts +0 -41
  432. package/dist/memory/embedder/base.d.ts.map +0 -1
  433. package/dist/memory/embedder/base.js +0 -10
  434. package/dist/memory/embedder/base.js.map +0 -1
  435. package/dist/memory/embedder/index.d.ts +0 -8
  436. package/dist/memory/embedder/index.d.ts.map +0 -1
  437. package/dist/memory/embedder/index.js +0 -6
  438. package/dist/memory/embedder/index.js.map +0 -1
  439. package/dist/memory/embedder/openai.d.ts +0 -35
  440. package/dist/memory/embedder/openai.d.ts.map +0 -1
  441. package/dist/memory/embedder/openai.js +0 -103
  442. package/dist/memory/embedder/openai.js.map +0 -1
  443. package/dist/memory/index.d.ts +0 -33
  444. package/dist/memory/index.d.ts.map +0 -1
  445. package/dist/memory/index.js +0 -31
  446. package/dist/memory/index.js.map +0 -1
  447. package/dist/memory/memory.d.ts +0 -126
  448. package/dist/memory/memory.d.ts.map +0 -1
  449. package/dist/memory/memory.js +0 -280
  450. package/dist/memory/memory.js.map +0 -1
  451. package/dist/memory/processors/base.d.ts +0 -42
  452. package/dist/memory/processors/base.d.ts.map +0 -1
  453. package/dist/memory/processors/base.js +0 -6
  454. package/dist/memory/processors/base.js.map +0 -1
  455. package/dist/memory/processors/index.d.ts +0 -16
  456. package/dist/memory/processors/index.d.ts.map +0 -1
  457. package/dist/memory/processors/index.js +0 -18
  458. package/dist/memory/processors/index.js.map +0 -1
  459. package/dist/memory/processors/message-history.d.ts +0 -35
  460. package/dist/memory/processors/message-history.d.ts.map +0 -1
  461. package/dist/memory/processors/message-history.js +0 -51
  462. package/dist/memory/processors/message-history.js.map +0 -1
  463. package/dist/memory/processors/observational-memory/index.d.ts +0 -82
  464. package/dist/memory/processors/observational-memory/index.d.ts.map +0 -1
  465. package/dist/memory/processors/observational-memory/index.js +0 -234
  466. package/dist/memory/processors/observational-memory/index.js.map +0 -1
  467. package/dist/memory/processors/observational-memory/observer-agent.d.ts +0 -64
  468. package/dist/memory/processors/observational-memory/observer-agent.d.ts.map +0 -1
  469. package/dist/memory/processors/observational-memory/observer-agent.js +0 -362
  470. package/dist/memory/processors/observational-memory/observer-agent.js.map +0 -1
  471. package/dist/memory/processors/observational-memory/reflector-agent.d.ts +0 -38
  472. package/dist/memory/processors/observational-memory/reflector-agent.d.ts.map +0 -1
  473. package/dist/memory/processors/observational-memory/reflector-agent.js +0 -213
  474. package/dist/memory/processors/observational-memory/reflector-agent.js.map +0 -1
  475. package/dist/memory/processors/observational-memory/token-counter.d.ts +0 -35
  476. package/dist/memory/processors/observational-memory/token-counter.d.ts.map +0 -1
  477. package/dist/memory/processors/observational-memory/token-counter.js +0 -90
  478. package/dist/memory/processors/observational-memory/token-counter.js.map +0 -1
  479. package/dist/memory/processors/semantic-recall.d.ts +0 -55
  480. package/dist/memory/processors/semantic-recall.d.ts.map +0 -1
  481. package/dist/memory/processors/semantic-recall.js +0 -143
  482. package/dist/memory/processors/semantic-recall.js.map +0 -1
  483. package/dist/memory/processors/working-memory.d.ts +0 -41
  484. package/dist/memory/processors/working-memory.d.ts.map +0 -1
  485. package/dist/memory/processors/working-memory.js +0 -82
  486. package/dist/memory/processors/working-memory.js.map +0 -1
  487. package/dist/memory/storage/base.d.ts +0 -288
  488. package/dist/memory/storage/base.d.ts.map +0 -1
  489. package/dist/memory/storage/base.js +0 -211
  490. package/dist/memory/storage/base.js.map +0 -1
  491. package/dist/memory/storage/index.d.ts +0 -9
  492. package/dist/memory/storage/index.d.ts.map +0 -1
  493. package/dist/memory/storage/index.js +0 -7
  494. package/dist/memory/storage/index.js.map +0 -1
  495. package/dist/memory/storage/inmemory.d.ts +0 -93
  496. package/dist/memory/storage/inmemory.d.ts.map +0 -1
  497. package/dist/memory/storage/inmemory.js +0 -646
  498. package/dist/memory/storage/inmemory.js.map +0 -1
  499. package/dist/memory/tools/working-memory.d.ts +0 -100
  500. package/dist/memory/tools/working-memory.d.ts.map +0 -1
  501. package/dist/memory/tools/working-memory.js +0 -237
  502. package/dist/memory/tools/working-memory.js.map +0 -1
  503. package/dist/memory/types.d.ts +0 -386
  504. package/dist/memory/types.d.ts.map +0 -1
  505. package/dist/memory/types.js +0 -58
  506. package/dist/memory/types.js.map +0 -1
  507. package/dist/memory/vector/base.d.ts +0 -145
  508. package/dist/memory/vector/base.d.ts.map +0 -1
  509. package/dist/memory/vector/base.js +0 -83
  510. package/dist/memory/vector/base.js.map +0 -1
  511. package/dist/memory/vector/index.d.ts +0 -8
  512. package/dist/memory/vector/index.d.ts.map +0 -1
  513. package/dist/memory/vector/index.js +0 -7
  514. package/dist/memory/vector/index.js.map +0 -1
  515. package/dist/memory/vector/inmemory.d.ts +0 -47
  516. package/dist/memory/vector/inmemory.d.ts.map +0 -1
  517. package/dist/memory/vector/inmemory.js +0 -234
  518. package/dist/memory/vector/inmemory.js.map +0 -1
@@ -16,6 +16,7 @@ import { transformMessages } from "./transform-messages.js";
16
16
  * emits standardized assistant events.
17
17
  */
18
18
  class BedrockStreamHandler extends BaseStreamHandler {
19
+ executeFn;
19
20
  constructor(executeFn) {
20
21
  super();
21
22
  this.executeFn = executeFn;
@@ -28,6 +29,9 @@ class BedrockStreamHandler extends BaseStreamHandler {
28
29
  }
29
30
  }
30
31
  export class BedrockRequestBuilder {
32
+ model;
33
+ context;
34
+ options;
31
35
  constructor(model, context, options) {
32
36
  this.model = model;
33
37
  this.context = context;
@@ -39,7 +43,7 @@ export class BedrockRequestBuilder {
39
43
  messages: convertMessages(this.context, this.model),
40
44
  system: buildSystemPrompt(this.context.systemPrompt, this.model),
41
45
  inferenceConfig: { maxTokens: this.options.maxTokens, temperature: this.options.temperature },
42
- toolConfig: convertToolConfig(this.context.tools, this.options.toolChoice),
46
+ toolConfig: BedrockToolConfigFactory.fromToolsAndChoice(this.context.tools, this.options.toolChoice),
43
47
  additionalModelRequestFields: buildAdditionalModelRequestFields(this.model, this.options),
44
48
  };
45
49
  }
@@ -50,6 +54,7 @@ export const streamBedrock = (model, context, options = {}) => {
50
54
  const events = new StreamEventHelper(stream, output);
51
55
  const handler = new BedrockStreamHandler(async () => {
52
56
  const blocks = output.content;
57
+ const eventRouter = new BedrockStreamEventRouter(blocks, output, stream, model);
53
58
  const config = {
54
59
  region: options.region,
55
60
  profile: options.profile,
@@ -90,19 +95,19 @@ export const streamBedrock = (model, context, options = {}) => {
90
95
  events.start();
91
96
  }
92
97
  else if (item.contentBlockStart) {
93
- handleContentBlockStart(item.contentBlockStart, blocks, output, stream);
98
+ eventRouter.onBlockStart(item.contentBlockStart);
94
99
  }
95
100
  else if (item.contentBlockDelta) {
96
- handleContentBlockDelta(item.contentBlockDelta, blocks, output, stream);
101
+ eventRouter.onBlockDelta(item.contentBlockDelta);
97
102
  }
98
103
  else if (item.contentBlockStop) {
99
- handleContentBlockStop(item.contentBlockStop, blocks, output, stream);
104
+ eventRouter.onBlockStop(item.contentBlockStop);
100
105
  }
101
106
  else if (item.messageStop) {
102
107
  output.stopReason = mapProviderStopReason(item.messageStop.stopReason, "bedrock");
103
108
  }
104
109
  else if (item.metadata) {
105
- handleMetadata(item.metadata, model, output);
110
+ eventRouter.onMetadata(item.metadata);
106
111
  }
107
112
  else if (item.internalServerException) {
108
113
  throw new Error(`Internal server error: ${item.internalServerException.message}`);
@@ -166,64 +171,88 @@ export const streamSimpleBedrock = (model, context, options) => {
166
171
  thinkingBudgets: options.thinkingBudgets,
167
172
  });
168
173
  };
169
- function handleContentBlockStart(event, blocks, output, stream) {
170
- const index = event.contentBlockIndex;
171
- const start = event.start;
172
- if (start?.toolUse) {
173
- const block = {
174
+ class BedrockStreamEventRouter {
175
+ blocks;
176
+ output;
177
+ stream;
178
+ model;
179
+ constructor(blocks, output, stream, model) {
180
+ this.blocks = blocks;
181
+ this.output = output;
182
+ this.stream = stream;
183
+ this.model = model;
184
+ }
185
+ onBlockStart(event) {
186
+ const contentIndex = event.contentBlockIndex;
187
+ const start = event.start;
188
+ if (!start?.toolUse)
189
+ return;
190
+ const toolCallBlock = {
174
191
  type: "toolCall",
175
192
  id: start.toolUse.toolUseId || "",
176
193
  name: start.toolUse.name || "",
177
194
  arguments: {},
178
195
  partialJson: "",
179
- index,
196
+ index: contentIndex,
180
197
  };
181
- output.content.push(block);
182
- stream.push({ type: "toolcall_start", contentIndex: blocks.length - 1, partial: output });
198
+ this.output.content.push(toolCallBlock);
199
+ this.stream.push({ type: "toolcall_start", contentIndex: this.blocks.length - 1, partial: this.output });
183
200
  }
184
- }
185
- function handleContentBlockDelta(event, blocks, output, stream) {
186
- const contentBlockIndex = event.contentBlockIndex;
187
- const delta = event.delta;
188
- let index = blocks.findIndex((b) => b.index === contentBlockIndex);
189
- let block = blocks[index];
190
- if (delta?.text !== undefined) {
191
- // If no text block exists yet, create one, as `handleContentBlockStart` is not sent for text blocks
192
- if (!block) {
193
- const newBlock = { type: "text", text: "", index: contentBlockIndex };
194
- output.content.push(newBlock);
195
- index = blocks.length - 1;
196
- block = blocks[index];
197
- stream.push({ type: "text_start", contentIndex: index, partial: output });
201
+ onBlockDelta(event) {
202
+ const contentIndex = event.contentBlockIndex;
203
+ const delta = event.delta;
204
+ let blockIndex = this.blocks.findIndex((b) => b.index === contentIndex);
205
+ let activeBlock = this.blocks[blockIndex];
206
+ if (delta?.text !== undefined) {
207
+ if (!activeBlock) {
208
+ const createdTextBlock = { type: "text", text: "", index: contentIndex };
209
+ this.output.content.push(createdTextBlock);
210
+ blockIndex = this.blocks.length - 1;
211
+ activeBlock = this.blocks[blockIndex];
212
+ this.stream.push({ type: "text_start", contentIndex: blockIndex, partial: this.output });
213
+ }
214
+ if (activeBlock.type === "text") {
215
+ activeBlock.text += delta.text;
216
+ this.stream.push({ type: "text_delta", contentIndex: blockIndex, delta: delta.text, partial: this.output });
217
+ }
218
+ return;
198
219
  }
199
- if (block.type === "text") {
200
- block.text += delta.text;
201
- stream.push({ type: "text_delta", contentIndex: index, delta: delta.text, partial: output });
220
+ if (delta?.toolUse && activeBlock?.type === "toolCall") {
221
+ activeBlock.partialJson = (activeBlock.partialJson || "") + (delta.toolUse.input || "");
222
+ activeBlock.arguments = parseStreamingJson(activeBlock.partialJson);
223
+ this.stream.push({
224
+ type: "toolcall_delta",
225
+ contentIndex: blockIndex,
226
+ delta: delta.toolUse.input || "",
227
+ partial: this.output,
228
+ });
229
+ return;
202
230
  }
203
- }
204
- else if (delta?.toolUse && block?.type === "toolCall") {
205
- block.partialJson = (block.partialJson || "") + (delta.toolUse.input || "");
206
- block.arguments = parseStreamingJson(block.partialJson);
207
- stream.push({ type: "toolcall_delta", contentIndex: index, delta: delta.toolUse.input || "", partial: output });
208
- }
209
- else if (delta?.reasoningContent) {
210
- let thinkingBlock = block;
211
- let thinkingIndex = index;
231
+ if (!delta?.reasoningContent) {
232
+ return;
233
+ }
234
+ let thinkingBlock = activeBlock;
235
+ let thinkingIndex = blockIndex;
212
236
  if (!thinkingBlock) {
213
- const newBlock = { type: "thinking", thinking: "", thinkingSignature: "", index: contentBlockIndex };
214
- output.content.push(newBlock);
215
- thinkingIndex = blocks.length - 1;
216
- thinkingBlock = blocks[thinkingIndex];
217
- stream.push({ type: "thinking_start", contentIndex: thinkingIndex, partial: output });
237
+ const createdThinkingBlock = {
238
+ type: "thinking",
239
+ thinking: "",
240
+ thinkingSignature: "",
241
+ index: contentIndex,
242
+ };
243
+ this.output.content.push(createdThinkingBlock);
244
+ thinkingIndex = this.blocks.length - 1;
245
+ thinkingBlock = this.blocks[thinkingIndex];
246
+ this.stream.push({ type: "thinking_start", contentIndex: thinkingIndex, partial: this.output });
218
247
  }
219
248
  if (thinkingBlock?.type === "thinking") {
220
249
  if (delta.reasoningContent.text) {
221
250
  thinkingBlock.thinking += delta.reasoningContent.text;
222
- stream.push({
251
+ this.stream.push({
223
252
  type: "thinking_delta",
224
253
  contentIndex: thinkingIndex,
225
254
  delta: delta.reasoningContent.text,
226
- partial: output,
255
+ partial: this.output,
227
256
  });
228
257
  }
229
258
  if (delta.reasoningContent.signature) {
@@ -232,45 +261,50 @@ function handleContentBlockDelta(event, blocks, output, stream) {
232
261
  }
233
262
  }
234
263
  }
235
- }
236
- function normalizeBedrockUsage(event) {
237
- return {
238
- input: event.usage?.inputTokens || 0,
239
- output: event.usage?.outputTokens || 0,
240
- cacheRead: event.usage?.cacheReadInputTokens || 0,
241
- cacheWrite: event.usage?.cacheWriteInputTokens || 0,
242
- totalTokens: event.usage?.totalTokens || (event.usage?.inputTokens || 0) + (event.usage?.outputTokens || 0),
243
- };
244
- }
245
- function handleMetadata(event, model, output) {
246
- if (event.usage) {
247
- const normalized = normalizeBedrockUsage(event);
248
- output.usage.input = normalized.input;
249
- output.usage.output = normalized.output;
250
- output.usage.cacheRead = normalized.cacheRead;
251
- output.usage.cacheWrite = normalized.cacheWrite;
252
- output.usage.totalTokens = normalized.totalTokens;
253
- calculateCost(model, output.usage);
264
+ onMetadata(event) {
265
+ if (!event.usage)
266
+ return;
267
+ const usage = this.normalizeUsage(event);
268
+ this.output.usage.input = usage.input;
269
+ this.output.usage.output = usage.output;
270
+ this.output.usage.cacheRead = usage.cacheRead;
271
+ this.output.usage.cacheWrite = usage.cacheWrite;
272
+ this.output.usage.totalTokens = usage.totalTokens;
273
+ calculateCost(this.model, this.output.usage);
254
274
  }
255
- }
256
- function handleContentBlockStop(event, blocks, output, stream) {
257
- const index = blocks.findIndex((b) => b.index === event.contentBlockIndex);
258
- const block = blocks[index];
259
- if (!block)
260
- return;
261
- delete block.index;
262
- switch (block.type) {
263
- case "text":
264
- stream.push({ type: "text_end", contentIndex: index, content: block.text, partial: output });
265
- break;
266
- case "thinking":
267
- stream.push({ type: "thinking_end", contentIndex: index, content: block.thinking, partial: output });
268
- break;
269
- case "toolCall":
270
- block.arguments = parseStreamingJson(block.partialJson);
271
- delete block.partialJson;
272
- stream.push({ type: "toolcall_end", contentIndex: index, toolCall: block, partial: output });
273
- break;
275
+ onBlockStop(event) {
276
+ const index = this.blocks.findIndex((candidate) => candidate.index === event.contentBlockIndex);
277
+ const block = this.blocks[index];
278
+ if (!block)
279
+ return;
280
+ delete block.index;
281
+ switch (block.type) {
282
+ case "text":
283
+ this.stream.push({ type: "text_end", contentIndex: index, content: block.text, partial: this.output });
284
+ break;
285
+ case "thinking":
286
+ this.stream.push({
287
+ type: "thinking_end",
288
+ contentIndex: index,
289
+ content: block.thinking,
290
+ partial: this.output,
291
+ });
292
+ break;
293
+ case "toolCall":
294
+ block.arguments = parseStreamingJson(block.partialJson);
295
+ delete block.partialJson;
296
+ this.stream.push({ type: "toolcall_end", contentIndex: index, toolCall: block, partial: this.output });
297
+ break;
298
+ }
299
+ }
300
+ normalizeUsage(event) {
301
+ return {
302
+ input: event.usage?.inputTokens || 0,
303
+ output: event.usage?.outputTokens || 0,
304
+ cacheRead: event.usage?.cacheReadInputTokens || 0,
305
+ cacheWrite: event.usage?.cacheWriteInputTokens || 0,
306
+ totalTokens: event.usage?.totalTokens || (event.usage?.inputTokens || 0) + (event.usage?.outputTokens || 0),
307
+ };
274
308
  }
275
309
  }
276
310
  /**
@@ -314,159 +348,183 @@ function normalizeToolCallId(id) {
314
348
  const sanitized = id.replace(/[^a-zA-Z0-9_-]/g, "_");
315
349
  return sanitized.length > 64 ? sanitized.slice(0, 64) : sanitized;
316
350
  }
317
- function convertMessages(context, model) {
318
- const result = [];
319
- const transformedMessages = transformMessages(context.messages, model, normalizeToolCallId);
320
- for (let i = 0; i < transformedMessages.length; i++) {
321
- const m = transformedMessages[i];
322
- switch (m.role) {
323
- case "user":
324
- result.push({
325
- role: ConversationRole.USER,
326
- content: typeof m.content === "string"
327
- ? [{ text: sanitizeSurrogates(m.content) }]
328
- : m.content.map((c) => {
329
- switch (c.type) {
330
- case "text":
331
- return { text: sanitizeSurrogates(c.text) };
332
- case "image":
333
- return { image: createImageBlock(c.mimeType, c.data) };
334
- default:
335
- throw new Error("Unknown user content type");
336
- }
337
- }),
338
- });
339
- break;
340
- case "assistant": {
341
- // Skip assistant messages with empty content (e.g., from aborted requests)
342
- // Bedrock rejects messages with empty content arrays
343
- if (m.content.length === 0) {
344
- continue;
345
- }
346
- const contentBlocks = [];
347
- for (const c of m.content) {
348
- switch (c.type) {
349
- case "text":
350
- // Skip empty text blocks
351
- if (c.text.trim().length === 0)
352
- continue;
353
- contentBlocks.push({ text: sanitizeSurrogates(c.text) });
354
- break;
355
- case "toolCall":
356
- contentBlocks.push({
357
- toolUse: { toolUseId: c.id, name: c.name, input: c.arguments },
358
- });
359
- break;
360
- case "thinking":
361
- // Skip empty thinking blocks
362
- if (c.thinking.trim().length === 0)
363
- continue;
364
- // Only Anthropic models support the signature field in reasoningText.
365
- // For other models, we omit the signature to avoid errors like:
366
- // "This model doesn't support the reasoningContent.reasoningText.signature field"
367
- if (supportsThinkingSignature(model)) {
368
- contentBlocks.push({
369
- reasoningContent: {
370
- reasoningText: { text: sanitizeSurrogates(c.thinking), signature: c.thinkingSignature },
371
- },
372
- });
373
- }
374
- else {
375
- contentBlocks.push({
376
- reasoningContent: {
377
- reasoningText: { text: sanitizeSurrogates(c.thinking) },
378
- },
379
- });
380
- }
381
- break;
382
- default:
383
- throw new Error("Unknown assistant content type");
384
- }
351
+ class BedrockMessageComposer {
352
+ model;
353
+ constructor(model) {
354
+ this.model = model;
355
+ }
356
+ compose(context) {
357
+ const composedMessages = [];
358
+ const normalizedMessages = transformMessages(context.messages, this.model, normalizeToolCallId);
359
+ for (let messageIndex = 0; messageIndex < normalizedMessages.length; messageIndex++) {
360
+ const message = normalizedMessages[messageIndex];
361
+ switch (message.role) {
362
+ case "user":
363
+ composedMessages.push(this.fromUser(message));
364
+ break;
365
+ case "assistant": {
366
+ const assistant = this.fromAssistant(message);
367
+ if (assistant)
368
+ composedMessages.push(assistant);
369
+ break;
385
370
  }
386
- // Skip if all content blocks were filtered out
387
- if (contentBlocks.length === 0) {
388
- continue;
371
+ case "toolResult": {
372
+ const merged = this.fromToolResults(normalizedMessages, messageIndex);
373
+ composedMessages.push(merged.message);
374
+ messageIndex = merged.nextIndex;
375
+ break;
389
376
  }
390
- result.push({
391
- role: ConversationRole.ASSISTANT,
392
- content: contentBlocks,
393
- });
394
- break;
377
+ default:
378
+ throw new Error("Unknown message role");
395
379
  }
396
- case "toolResult": {
397
- // Collect all consecutive toolResult messages into a single user message
398
- // Bedrock requires all tool results to be in one message
399
- const toolResults = [];
400
- // Add current tool result with all content blocks combined
401
- toolResults.push({
402
- toolResult: {
403
- toolUseId: m.toolCallId,
404
- content: m.content.map((c) => c.type === "image"
405
- ? { image: createImageBlock(c.mimeType, c.data) }
406
- : { text: sanitizeSurrogates(c.text) }),
407
- status: m.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
408
- },
409
- });
410
- // Look ahead for consecutive toolResult messages
411
- let j = i + 1;
412
- while (j < transformedMessages.length && transformedMessages[j].role === "toolResult") {
413
- const nextMsg = transformedMessages[j];
414
- toolResults.push({
415
- toolResult: {
416
- toolUseId: nextMsg.toolCallId,
417
- content: nextMsg.content.map((c) => c.type === "image"
418
- ? { image: createImageBlock(c.mimeType, c.data) }
419
- : { text: sanitizeSurrogates(c.text) }),
420
- status: nextMsg.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
421
- },
422
- });
423
- j++;
380
+ }
381
+ this.attachCachePoint(composedMessages);
382
+ return composedMessages;
383
+ }
384
+ fromUser(message) {
385
+ const userContent = typeof message.content === "string"
386
+ ? [{ text: sanitizeSurrogates(message.content) }]
387
+ : message.content.map((entry) => {
388
+ switch (entry.type) {
389
+ case "text":
390
+ return { text: sanitizeSurrogates(entry.text) };
391
+ case "image":
392
+ return { image: createImageBlock(entry.mimeType, entry.data) };
393
+ default:
394
+ throw new Error("Unknown user content type");
424
395
  }
425
- // Skip the messages we've already processed
426
- i = j - 1;
427
- result.push({
428
- role: ConversationRole.USER,
429
- content: toolResults,
430
- });
431
- break;
396
+ });
397
+ return {
398
+ role: ConversationRole.USER,
399
+ content: userContent,
400
+ };
401
+ }
402
+ fromAssistant(message) {
403
+ if (message.content.length === 0) {
404
+ return undefined;
405
+ }
406
+ const assistantBlocks = [];
407
+ for (const block of message.content) {
408
+ switch (block.type) {
409
+ case "text":
410
+ if (block.text.trim().length === 0)
411
+ continue;
412
+ assistantBlocks.push({ text: sanitizeSurrogates(block.text) });
413
+ break;
414
+ case "toolCall":
415
+ assistantBlocks.push({
416
+ toolUse: { toolUseId: block.id, name: block.name, input: block.arguments },
417
+ });
418
+ break;
419
+ case "thinking":
420
+ if (block.thinking.trim().length === 0)
421
+ continue;
422
+ assistantBlocks.push(this.buildThinkingBlock(block.thinking, block.thinkingSignature));
423
+ break;
424
+ default:
425
+ throw new Error("Unknown assistant content type");
432
426
  }
433
- default:
434
- throw new Error("Unknown message role");
435
427
  }
428
+ if (assistantBlocks.length === 0) {
429
+ return undefined;
430
+ }
431
+ return {
432
+ role: ConversationRole.ASSISTANT,
433
+ content: assistantBlocks,
434
+ };
435
+ }
436
+ fromToolResults(messages, startIndex) {
437
+ const groupedResults = [];
438
+ const first = messages[startIndex];
439
+ groupedResults.push({
440
+ toolResult: {
441
+ toolUseId: first.toolCallId,
442
+ content: this.mapToolResultContent(first),
443
+ status: first.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
444
+ },
445
+ });
446
+ let cursor = startIndex + 1;
447
+ while (cursor < messages.length && messages[cursor].role === "toolResult") {
448
+ const next = messages[cursor];
449
+ groupedResults.push({
450
+ toolResult: {
451
+ toolUseId: next.toolCallId,
452
+ content: this.mapToolResultContent(next),
453
+ status: next.isError ? ToolResultStatus.ERROR : ToolResultStatus.SUCCESS,
454
+ },
455
+ });
456
+ cursor++;
457
+ }
458
+ return {
459
+ message: { role: ConversationRole.USER, content: groupedResults },
460
+ nextIndex: cursor - 1,
461
+ };
462
+ }
463
+ attachCachePoint(messages) {
464
+ if (!supportsPromptCaching(this.model) || messages.length === 0) {
465
+ return;
466
+ }
467
+ const last = messages[messages.length - 1];
468
+ if (last.role === ConversationRole.USER && last.content) {
469
+ last.content.push({ cachePoint: { type: CachePointType.DEFAULT } });
470
+ }
471
+ }
472
+ mapToolResultContent(message) {
473
+ return message.content.map((contentBlock) => contentBlock.type === "image"
474
+ ? { image: createImageBlock(contentBlock.mimeType, contentBlock.data) }
475
+ : { text: sanitizeSurrogates(contentBlock.text) });
436
476
  }
437
- // Add cache point to the last user message for supported Claude models
438
- if (supportsPromptCaching(model) && result.length > 0) {
439
- const lastMessage = result[result.length - 1];
440
- if (lastMessage.role === ConversationRole.USER && lastMessage.content) {
441
- lastMessage.content.push({ cachePoint: { type: CachePointType.DEFAULT } });
477
+ buildThinkingBlock(thinkingText, thinkingSignature) {
478
+ if (supportsThinkingSignature(this.model)) {
479
+ return {
480
+ reasoningContent: {
481
+ reasoningText: { text: sanitizeSurrogates(thinkingText), signature: thinkingSignature },
482
+ },
483
+ };
442
484
  }
485
+ return {
486
+ reasoningContent: {
487
+ reasoningText: { text: sanitizeSurrogates(thinkingText) },
488
+ },
489
+ };
443
490
  }
444
- return result;
445
491
  }
446
- function convertToolConfig(tools, toolChoice) {
447
- if (!tools?.length || toolChoice === "none")
448
- return undefined;
449
- const bedrockTools = tools.map((tool) => ({
450
- toolSpec: {
451
- name: tool.name,
452
- description: tool.description,
453
- inputSchema: { json: tool.parameters },
454
- },
455
- }));
456
- let bedrockToolChoice;
457
- switch (toolChoice) {
458
- case "auto":
459
- bedrockToolChoice = { auto: {} };
460
- break;
461
- case "any":
462
- bedrockToolChoice = { any: {} };
463
- break;
464
- default:
465
- if (toolChoice?.type === "tool") {
466
- bedrockToolChoice = { tool: { name: toolChoice.name } };
467
- }
492
+ class BedrockToolConfigFactory {
493
+ static fromToolsAndChoice(tools, toolChoice) {
494
+ if (!tools?.length || toolChoice === "none")
495
+ return undefined;
496
+ const bedrockTools = tools.map((tool) => ({
497
+ toolSpec: {
498
+ name: tool.name,
499
+ description: tool.description,
500
+ inputSchema: { json: tool.parameters },
501
+ },
502
+ }));
503
+ const resolvedToolChoice = BedrockToolConfigFactory.resolveToolChoice(toolChoice);
504
+ return { tools: bedrockTools, toolChoice: resolvedToolChoice };
468
505
  }
469
- return { tools: bedrockTools, toolChoice: bedrockToolChoice };
506
+ static resolveToolChoice(toolChoice) {
507
+ switch (toolChoice) {
508
+ case "auto":
509
+ return { auto: {} };
510
+ case "any":
511
+ return { any: {} };
512
+ case "none":
513
+ case undefined:
514
+ return undefined;
515
+ default:
516
+ if (typeof toolChoice === "object" && toolChoice.type === "tool") {
517
+ return { tool: { name: toolChoice.name } };
518
+ }
519
+ return undefined;
520
+ }
521
+ }
522
+ }
523
+ function convertMessages(context, model) {
524
+ return new BedrockMessageComposer(model).compose(context);
525
+ }
526
+ function convertToolConfig(tools, toolChoice) {
527
+ return BedrockToolConfigFactory.fromToolsAndChoice(tools, toolChoice);
470
528
  }
471
529
  function mapStopReason(reason) {
472
530
  switch (reason) {
@@ -482,34 +540,47 @@ function mapStopReason(reason) {
482
540
  return "error";
483
541
  }
484
542
  }
485
- function buildAdditionalModelRequestFields(model, options) {
543
+ const CLAUDE_THINKING_BUDGETS = {
544
+ minimal: 1024,
545
+ low: 2048,
546
+ medium: 8192,
547
+ high: 16384,
548
+ xhigh: 16384,
549
+ };
550
+ function resolveThinkingPayload(model, options) {
486
551
  if (!options.reasoning || !model.reasoning) {
487
552
  return undefined;
488
553
  }
489
- if (model.id.includes("anthropic.claude")) {
490
- const defaultBudgets = {
491
- minimal: 1024,
492
- low: 2048,
493
- medium: 8192,
494
- high: 16384,
495
- xhigh: 16384, // Claude doesn't support xhigh, clamp to high
496
- };
497
- // Custom budgets override defaults (xhigh not in ThinkingBudgets, use high)
498
- const level = mapThinkingLevel(options.reasoning, "clamp-xhigh");
499
- const budget = options.thinkingBudgets?.[level] ?? defaultBudgets[options.reasoning];
500
- const result = {
501
- thinking: {
502
- type: "enabled",
503
- budget_tokens: budget,
504
- },
505
- };
506
- if (options.interleavedThinking) {
507
- result.anthropic_beta = ["interleaved-thinking-2025-05-14"];
508
- }
509
- return result;
554
+ if (!model.id.includes("anthropic.claude")) {
555
+ return undefined;
556
+ }
557
+ const normalizedLevel = mapThinkingLevel(options.reasoning, "clamp-xhigh");
558
+ const budget = options.thinkingBudgets?.[normalizedLevel] ?? CLAUDE_THINKING_BUDGETS[options.reasoning];
559
+ return {
560
+ type: "enabled",
561
+ budget_tokens: budget,
562
+ };
563
+ }
564
+ function resolveClaudeBetaFlags(options) {
565
+ if (options.interleavedThinking) {
566
+ return ["interleaved-thinking-2025-05-14"];
510
567
  }
511
568
  return undefined;
512
569
  }
570
+ function buildAdditionalModelRequestFields(model, options) {
571
+ const thinkingPayload = resolveThinkingPayload(model, options);
572
+ if (!thinkingPayload) {
573
+ return undefined;
574
+ }
575
+ const fields = {
576
+ thinking: thinkingPayload,
577
+ };
578
+ const betaFlags = resolveClaudeBetaFlags(options);
579
+ if (betaFlags) {
580
+ fields.anthropic_beta = betaFlags;
581
+ }
582
+ return fields;
583
+ }
513
584
  function createImageBlock(mimeType, data) {
514
585
  let format;
515
586
  switch (mimeType) {