@adecore/agents-react 0.31.12 → 0.33.0

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 (409) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/AccountDot.js +57 -6
  3. package/dist/agents/AgentIcon.js +88 -12
  4. package/dist/agents/ModelOptionControl.js +153 -18
  5. package/dist/agents/ProviderLogo.js +49 -4
  6. package/dist/agents/account-limits.js +17 -14
  7. package/dist/agents/accounts.js +99 -67
  8. package/dist/agents/agent-marks.js +5 -3
  9. package/dist/agents/model-name.js +42 -31
  10. package/dist/agents/model-options.js +8 -8
  11. package/dist/agents/model-requirement.js +17 -14
  12. package/dist/agents/option-words.d.ts +7 -0
  13. package/dist/agents/option-words.js +35 -0
  14. package/dist/agents/provider-paths.js +6 -6
  15. package/dist/agents/status-look.js +32 -12
  16. package/dist/chat/account-choice.d.ts +13 -0
  17. package/dist/chat/account-choice.js +90 -20
  18. package/dist/chat/actions.js +126 -59
  19. package/dist/chat/activity.js +5 -5
  20. package/dist/chat/attachments.js +74 -53
  21. package/dist/chat/bookmarks.js +58 -48
  22. package/dist/chat/chat-client.js +344 -263
  23. package/dist/chat/chat-references.js +3 -3
  24. package/dist/chat/composer-effort.d.ts +5 -0
  25. package/dist/chat/composer-effort.js +26 -0
  26. package/dist/chat/composer-send.js +13 -13
  27. package/dist/chat/drafts.js +115 -79
  28. package/dist/chat/forks.js +81 -24
  29. package/dist/chat/guards.js +15 -43
  30. package/dist/chat/index.d.ts +3 -1
  31. package/dist/chat/index.js +3 -2
  32. package/dist/chat/logic/ansi.js +170 -167
  33. package/dist/chat/logic/answers.js +2 -2
  34. package/dist/chat/logic/bookmarks.js +19 -19
  35. package/dist/chat/logic/command-looks.js +138 -96
  36. package/dist/chat/logic/context-usage.js +13 -9
  37. package/dist/chat/logic/continue-after-stop.js +15 -19
  38. package/dist/chat/logic/effort.d.ts +14 -0
  39. package/dist/chat/logic/effort.js +34 -0
  40. package/dist/chat/logic/embedded-code.js +387 -326
  41. package/dist/chat/logic/fork.js +134 -110
  42. package/dist/chat/logic/generated-image.js +54 -23
  43. package/dist/chat/logic/goal.js +28 -20
  44. package/dist/chat/logic/handback.js +6 -6
  45. package/dist/chat/logic/json.js +2 -2
  46. package/dist/chat/logic/limit.js +46 -30
  47. package/dist/chat/logic/picker-entries.d.ts +5 -3
  48. package/dist/chat/logic/picker-entries.js +83 -43
  49. package/dist/chat/logic/resume-compaction.d.ts +14 -1
  50. package/dist/chat/logic/resume-compaction.js +93 -24
  51. package/dist/chat/logic/scrubber.js +188 -136
  52. package/dist/chat/logic/thought.js +13 -16
  53. package/dist/chat/logic/thread-cards.js +60 -48
  54. package/dist/chat/logic/timeline-copy.js +30 -38
  55. package/dist/chat/logic/timeline-target.js +92 -63
  56. package/dist/chat/logic/timeline.js +499 -355
  57. package/dist/chat/logic/tool-catalog.js +54 -34
  58. package/dist/chat/logic/tools.js +106 -82
  59. package/dist/chat/logic/visual-height.js +18 -18
  60. package/dist/chat/logic/visual-viewport.js +6 -3
  61. package/dist/chat/logic/welcome.js +9 -9
  62. package/dist/chat/logic/workflow.d.ts +10 -0
  63. package/dist/chat/logic/workflow.js +130 -32
  64. package/dist/chat/mentions.js +149 -109
  65. package/dist/chat/persisted-json.js +51 -54
  66. package/dist/chat/preferences.d.ts +4 -0
  67. package/dist/chat/preferences.js +162 -84
  68. package/dist/chat/prompt-hold.js +9 -9
  69. package/dist/chat/quote.js +21 -30
  70. package/dist/chat/reading-width.js +12 -10
  71. package/dist/chat/recent-messages.js +34 -21
  72. package/dist/chat/resume-compaction-dismissals.js +25 -5
  73. package/dist/chat/runtime-modes.js +3 -3
  74. package/dist/chat/send-key.js +11 -7
  75. package/dist/chat/stash.js +89 -69
  76. package/dist/chat/subagent-conversation.js +181 -139
  77. package/dist/chat/subagent-list.js +65 -67
  78. package/dist/chat/subagent-support.js +12 -7
  79. package/dist/chat/subagent-view.js +132 -44
  80. package/dist/chat/thumbnails.js +88 -60
  81. package/dist/chat/timeline-flash.js +24 -12
  82. package/dist/chat/timeline-scroll.js +116 -86
  83. package/dist/chat/ui/AccountPill.js +126 -15
  84. package/dist/chat/ui/AnsiOutput.js +62 -6
  85. package/dist/chat/ui/BookmarkMarker.js +231 -41
  86. package/dist/chat/ui/BookmarkSubmenu.js +165 -18
  87. package/dist/chat/ui/ChatActivity.js +649 -70
  88. package/dist/chat/ui/ChatReferenceChip.js +104 -9
  89. package/dist/chat/ui/CodeBlock.js +132 -58
  90. package/dist/chat/ui/Composer.js +866 -132
  91. package/dist/chat/ui/ComposerInput.js +309 -120
  92. package/dist/chat/ui/DiffPool.js +75 -14
  93. package/dist/chat/ui/EditDiff.js +160 -21
  94. package/dist/chat/ui/FadingWords.js +32 -3
  95. package/dist/chat/ui/GoalDock.js +235 -42
  96. package/dist/chat/ui/ImageView.js +617 -61
  97. package/dist/chat/ui/LimitState.js +446 -72
  98. package/dist/chat/ui/Markdown.js +991 -173
  99. package/dist/chat/ui/MermaidBlock.js +285 -79
  100. package/dist/chat/ui/MessageActions.js +251 -39
  101. package/dist/chat/ui/ModelMarks.js +55 -5
  102. package/dist/chat/ui/Pickers.js +664 -113
  103. package/dist/chat/ui/PromptComposer.js +281 -51
  104. package/dist/chat/ui/QuoteButton.js +151 -57
  105. package/dist/chat/ui/ResumeCompactionDock.d.ts +6 -2
  106. package/dist/chat/ui/ResumeCompactionDock.js +141 -6
  107. package/dist/chat/ui/RowTime.js +59 -5
  108. package/dist/chat/ui/RunSettings.js +1744 -154
  109. package/dist/chat/ui/Scrubber.js +517 -88
  110. package/dist/chat/ui/ShellCommand.js +183 -107
  111. package/dist/chat/ui/SubagentControls.js +212 -24
  112. package/dist/chat/ui/SubagentInfo.js +170 -13
  113. package/dist/chat/ui/SubagentStopButton.js +115 -24
  114. package/dist/chat/ui/SubagentTimeline.js +357 -91
  115. package/dist/chat/ui/Timeline.js +988 -476
  116. package/dist/chat/ui/TimelineMenu.js +552 -37
  117. package/dist/chat/ui/UnifiedDiff.js +234 -27
  118. package/dist/chat/ui/UploadThumb.js +37 -7
  119. package/dist/chat/ui/VisualDialogs.js +251 -20
  120. package/dist/chat/ui/VisualFrame.js +321 -95
  121. package/dist/chat/ui/Welcome.js +72 -7
  122. package/dist/chat/ui/chips.js +1 -1
  123. package/dist/chat/ui/code-lines.js +36 -36
  124. package/dist/chat/ui/code-streaming.js +1 -1
  125. package/dist/chat/ui/code-theme.js +7 -7
  126. package/dist/chat/ui/composer/ComposerControls.js +329 -21
  127. package/dist/chat/ui/composer/ComposerMenu.js +358 -30
  128. package/dist/chat/ui/composer/DraftParts.js +185 -11
  129. package/dist/chat/ui/composer/QueuedMessages.js +138 -13
  130. package/dist/chat/ui/composer/chips.js +29 -19
  131. package/dist/chat/ui/composer/editor.js +79 -63
  132. package/dist/chat/ui/composer/insert.js +26 -12
  133. package/dist/chat/ui/composer/key-handler.js +180 -127
  134. package/dist/chat/ui/composer/keys.js +90 -73
  135. package/dist/chat/ui/composer/menu-aria.js +18 -9
  136. package/dist/chat/ui/composer/placeholder.js +78 -31
  137. package/dist/chat/ui/composer/surface.js +13 -37
  138. package/dist/chat/ui/composer/use-chat-controls.js +230 -90
  139. package/dist/chat/ui/composer/use-compaction-offer.js +50 -18
  140. package/dist/chat/ui/composer/use-composer-draft.js +65 -34
  141. package/dist/chat/ui/composer/use-composer-menus.js +478 -193
  142. package/dist/chat/ui/composer/use-composer-submit.js +251 -109
  143. package/dist/chat/ui/composer/use-continuable-turn.js +33 -6
  144. package/dist/chat/ui/composer/use-draft-files.js +245 -93
  145. package/dist/chat/ui/composer/use-effort-stepper.d.ts +13 -0
  146. package/dist/chat/ui/composer/use-effort-stepper.js +88 -0
  147. package/dist/chat/ui/composer/use-notice.js +61 -16
  148. package/dist/chat/ui/composer/use-pending-requests.js +38 -17
  149. package/dist/chat/ui/composer/use-prompt-history.js +117 -45
  150. package/dist/chat/ui/composer/use-prompt-hold.js +119 -35
  151. package/dist/chat/ui/composer/use-take-back.js +94 -72
  152. package/dist/chat/ui/diff/ApprovalReview.js +101 -23
  153. package/dist/chat/ui/diff/DiffFallbackBoundary.js +21 -13
  154. package/dist/chat/ui/diff/DiffOmitted.js +56 -6
  155. package/dist/chat/ui/diff/DiffStack.js +92 -8
  156. package/dist/chat/ui/diff/DiffUnavailable.js +56 -6
  157. package/dist/chat/ui/diff/EditorEditDiff.js +263 -51
  158. package/dist/chat/ui/diff/EditorPatchDiff.js +39 -14
  159. package/dist/chat/ui/diff/LegacyDiffPool.js +27 -10
  160. package/dist/chat/ui/diff/LegacyEditDiff.js +97 -20
  161. package/dist/chat/ui/diff/LegacyUnifiedDiff.js +172 -42
  162. package/dist/chat/ui/diff/RawDiff.js +65 -5
  163. package/dist/chat/ui/diff/ReviewDiff.js +77 -5
  164. package/dist/chat/ui/diff/diff-props.js +1 -1
  165. package/dist/chat/ui/diff/diff-source-budget.js +46 -35
  166. package/dist/chat/ui/diff/editor-edit-model.js +18 -14
  167. package/dist/chat/ui/diff/review-plan.js +63 -40
  168. package/dist/chat/ui/diff/review-settle.js +24 -9
  169. package/dist/chat/ui/diff/syntax-runtime.js +236 -201
  170. package/dist/chat/ui/diff/use-review-stack.js +146 -25
  171. package/dist/chat/ui/diff-syntax.js +70 -58
  172. package/dist/chat/ui/diff-theme.js +31 -12
  173. package/dist/chat/ui/file-links.js +39 -10
  174. package/dist/chat/ui/find-reveal.js +29 -8
  175. package/dist/chat/ui/full-diff.js +17 -12
  176. package/dist/chat/ui/highlighter.js +143 -113
  177. package/dist/chat/ui/icons.js +16 -7
  178. package/dist/chat/ui/index.js +1 -1
  179. package/dist/chat/ui/intelligent-ui/UiBlockFrame.js +556 -82
  180. package/dist/chat/ui/intelligent-ui/UiFallbackPart.js +73 -5
  181. package/dist/chat/ui/intelligent-ui/UiReply.js +666 -262
  182. package/dist/chat/ui/intelligent-ui/block-local.js +59 -31
  183. package/dist/chat/ui/intelligent-ui/chart-data.js +77 -67
  184. package/dist/chat/ui/intelligent-ui/node-text.js +77 -91
  185. package/dist/chat/ui/intelligent-ui/registry.js +46 -46
  186. package/dist/chat/ui/intelligent-ui/render-context.js +1 -1
  187. package/dist/chat/ui/intelligent-ui/renderers/base-land.js +1 -1
  188. package/dist/chat/ui/intelligent-ui/renderers/binding.js +3 -3
  189. package/dist/chat/ui/intelligent-ui/renderers/chart.js +1223 -123
  190. package/dist/chat/ui/intelligent-ui/renderers/choices.js +312 -34
  191. package/dist/chat/ui/intelligent-ui/renderers/content.js +1241 -86
  192. package/dist/chat/ui/intelligent-ui/renderers/data.js +619 -54
  193. package/dist/chat/ui/intelligent-ui/renderers/inputs.js +868 -67
  194. package/dist/chat/ui/intelligent-ui/renderers/links.js +366 -62
  195. package/dist/chat/ui/intelligent-ui/renderers/map-slots.js +118 -60
  196. package/dist/chat/ui/intelligent-ui/renderers/map-style.js +85 -78
  197. package/dist/chat/ui/intelligent-ui/renderers/map-view.js +282 -217
  198. package/dist/chat/ui/intelligent-ui/renderers/map.js +621 -69
  199. package/dist/chat/ui/intelligent-ui/renderers/place-point.js +15 -8
  200. package/dist/chat/ui/intelligent-ui/renderers/structure.js +262 -20
  201. package/dist/chat/ui/intelligent-ui/renderers/text.js +674 -49
  202. package/dist/chat/ui/intelligent-ui/reply-parts.js +24 -15
  203. package/dist/chat/ui/intelligent-ui/table-data.js +97 -57
  204. package/dist/chat/ui/intelligent-ui/tones.js +31 -31
  205. package/dist/chat/ui/intelligent-ui/use-in-view.js +30 -12
  206. package/dist/chat/ui/intelligent-ui/use-later.js +28 -13
  207. package/dist/chat/ui/intelligent-ui/use-truncated.js +45 -21
  208. package/dist/chat/ui/intelligent-ui/use-ui-links.js +296 -109
  209. package/dist/chat/ui/intelligent-ui/use-ui-queries.js +256 -246
  210. package/dist/chat/ui/markdown-blocks.js +296 -262
  211. package/dist/chat/ui/mermaid.d.ts +8 -20
  212. package/dist/chat/ui/mermaid.js +47 -84
  213. package/dist/chat/ui/quote-selection.js +32 -29
  214. package/dist/chat/ui/rehype-chips.js +35 -23
  215. package/dist/chat/ui/rehype-fade.js +28 -17
  216. package/dist/chat/ui/remark-html-as-text.js +22 -15
  217. package/dist/chat/ui/reply-context.js +1 -1
  218. package/dist/chat/ui/reveal.js +161 -72
  219. package/dist/chat/ui/rows/ForksRow.js +226 -24
  220. package/dist/chat/ui/rows/GeneratedImageRow.js +541 -87
  221. package/dist/chat/ui/rows/MessageRows.js +1706 -159
  222. package/dist/chat/ui/rows/RowContainer.js +57 -7
  223. package/dist/chat/ui/rows/Rows.js +463 -54
  224. package/dist/chat/ui/rows/SubagentRow.js +577 -60
  225. package/dist/chat/ui/rows/TaskRow.js +359 -40
  226. package/dist/chat/ui/rows/VisualRow.js +233 -11
  227. package/dist/chat/ui/rows/WorkRows.d.ts +3 -0
  228. package/dist/chat/ui/rows/WorkRows.js +1945 -164
  229. package/dist/chat/ui/rows/WorkflowRow.js +756 -37
  230. package/dist/chat/ui/rows/row-rhythm.js +27 -17
  231. package/dist/chat/ui/theme-watch.js +26 -23
  232. package/dist/chat/ui/timestamp-format.js +4 -1
  233. package/dist/chat/ui/use-diff-source-tokens.js +70 -34
  234. package/dist/chat/ui/useToggleSet.js +51 -19
  235. package/dist/chat/ui/visual-theme.js +153 -128
  236. package/dist/chat/visual-bridge.js +123 -123
  237. package/dist/chat/visual-viewport.js +94 -83
  238. package/dist/chat/visuals.js +13 -5
  239. package/dist/host-hooks.d.ts +29 -0
  240. package/dist/host-hooks.js +78 -0
  241. package/dist/host.js +120 -48
  242. package/dist/index.js +1 -1
  243. package/dist/lazy.js +38 -32
  244. package/dist/locales/en/agent-chat.d.ts +42 -0
  245. package/dist/locales/en/agent-chat.js +755 -713
  246. package/dist/locales/en/agent-prompts.js +42 -42
  247. package/dist/locales/en/agent-providers.d.ts +1 -0
  248. package/dist/locales/en/agent-providers.js +166 -165
  249. package/dist/locales/en/agent-usage.d.ts +6 -0
  250. package/dist/locales/en/agent-usage.js +129 -123
  251. package/dist/locales/nl/agent-chat.d.ts +42 -0
  252. package/dist/locales/nl/agent-chat.js +755 -713
  253. package/dist/locales/nl/agent-prompts.js +42 -42
  254. package/dist/locales/nl/agent-providers.d.ts +1 -0
  255. package/dist/locales/nl/agent-providers.js +166 -165
  256. package/dist/locales/nl/agent-usage.d.ts +6 -0
  257. package/dist/locales/nl/agent-usage.js +129 -123
  258. package/dist/locales.js +14 -14
  259. package/dist/mounted-registry.js +31 -30
  260. package/dist/port-transport.js +122 -111
  261. package/dist/prompts/index.js +1 -1
  262. package/dist/prompts/logic/focus.js +15 -14
  263. package/dist/prompts/logic/keys.js +93 -59
  264. package/dist/prompts/logic/prompts.js +27 -14
  265. package/dist/prompts/logic/subjects.js +60 -46
  266. package/dist/prompts/logic/useFocusAfterAnswer.js +60 -20
  267. package/dist/prompts/logic/usePromptSession.js +88 -77
  268. package/dist/prompts/ui/ApprovalBody.js +246 -27
  269. package/dist/prompts/ui/PromptActions.js +215 -9
  270. package/dist/prompts/ui/PromptCard.js +215 -36
  271. package/dist/prompts/ui/PromptView.js +372 -34
  272. package/dist/prompts/ui/QuestionBody.js +269 -73
  273. package/dist/providers/AccountColors.js +36 -5
  274. package/dist/providers/AccountDetail.js +683 -50
  275. package/dist/providers/AccountVariables.js +139 -32
  276. package/dist/providers/AddAccountForm.js +125 -38
  277. package/dist/providers/CliDetail.js +343 -36
  278. package/dist/providers/InstallPage.js +644 -59
  279. package/dist/providers/ProviderList.d.ts +2 -1
  280. package/dist/providers/ProviderList.js +215 -23
  281. package/dist/providers/ProvidersPane.d.ts +4 -2
  282. package/dist/providers/ProvidersPane.js +244 -64
  283. package/dist/providers/account-actions.js +54 -30
  284. package/dist/providers/index.js +1 -1
  285. package/dist/providers/install-steps.js +12 -9
  286. package/dist/providers/pane-target.d.ts +3 -0
  287. package/dist/providers/pane-target.js +34 -13
  288. package/dist/providers/parts.js +62 -12
  289. package/dist/providers/provider-abilities.js +5 -5
  290. package/dist/providers/provider-groups.js +75 -40
  291. package/dist/providers/variables.js +73 -39
  292. package/dist/scope.js +6 -6
  293. package/dist/settings/sections.js +18 -18
  294. package/dist/state/chats.js +404 -192
  295. package/dist/state/index.js +1 -1
  296. package/dist/state/provider-accounts.js +70 -47
  297. package/dist/state/providers.js +45 -16
  298. package/dist/state/usage.js +154 -77
  299. package/dist/storage.js +69 -68
  300. package/dist/testing/index.js +1 -1
  301. package/dist/testing/prompts.js +105 -67
  302. package/dist/transport.js +10 -10
  303. package/dist/ui/PlainTextarea.js +27 -3
  304. package/dist/usage/LimitsList.js +646 -40
  305. package/dist/usage/UsageBreakdown.js +879 -38
  306. package/dist/usage/UsageChart.js +311 -32
  307. package/dist/usage/UsageDialog.js +46 -4
  308. package/dist/usage/UsageLimits.js +467 -34
  309. package/dist/usage/UsageLimitsCard.js +95 -11
  310. package/dist/usage/UsagePage.js +817 -96
  311. package/dist/usage/UsagePane.js +164 -10
  312. package/dist/usage/UsageSummary.js +151 -6
  313. package/dist/usage/UsageTiles.js +164 -14
  314. package/dist/usage/format.js +32 -32
  315. package/dist/usage/index.d.ts +1 -1
  316. package/dist/usage/index.js +2 -1
  317. package/dist/usage/limit-groups.d.ts +2 -0
  318. package/dist/usage/limit-groups.js +77 -59
  319. package/dist/usage/limits.js +78 -43
  320. package/dist/usage/money.js +20 -4
  321. package/dist/usage/summary.js +85 -64
  322. package/package.json +9 -9
  323. package/src/agents/ModelOptionControl.tsx +3 -1
  324. package/src/agents/option-words.ts +27 -0
  325. package/src/chat/account-choice.ts +41 -1
  326. package/src/chat/composer-effort.ts +32 -0
  327. package/src/chat/forks.ts +4 -5
  328. package/src/chat/index.ts +3 -1
  329. package/src/chat/logic/effort.ts +32 -0
  330. package/src/chat/logic/picker-entries.ts +45 -10
  331. package/src/chat/logic/resume-compaction.ts +95 -17
  332. package/src/chat/logic/timeline.ts +11 -3
  333. package/src/chat/logic/workflow.ts +86 -4
  334. package/src/chat/preferences.ts +35 -0
  335. package/src/chat/subagent-view.ts +2 -3
  336. package/src/chat/ui/AnsiOutput.tsx +1 -2
  337. package/src/chat/ui/BookmarkSubmenu.tsx +3 -3
  338. package/src/chat/ui/ChatActivity.tsx +14 -22
  339. package/src/chat/ui/ChatReferenceChip.tsx +2 -3
  340. package/src/chat/ui/Composer.tsx +15 -7
  341. package/src/chat/ui/EditDiff.tsx +2 -3
  342. package/src/chat/ui/LimitState.tsx +2 -2
  343. package/src/chat/ui/Markdown.tsx +10 -8
  344. package/src/chat/ui/MermaidBlock.tsx +57 -49
  345. package/src/chat/ui/Pickers.tsx +49 -29
  346. package/src/chat/ui/PromptComposer.tsx +7 -9
  347. package/src/chat/ui/ResumeCompactionDock.tsx +16 -4
  348. package/src/chat/ui/RunSettings.tsx +67 -28
  349. package/src/chat/ui/Scrubber.tsx +3 -3
  350. package/src/chat/ui/ShellCommand.tsx +2 -0
  351. package/src/chat/ui/SubagentInfo.tsx +2 -3
  352. package/src/chat/ui/SubagentTimeline.tsx +12 -16
  353. package/src/chat/ui/Timeline.tsx +6 -6
  354. package/src/chat/ui/UnifiedDiff.tsx +3 -4
  355. package/src/chat/ui/VisualFrame.tsx +5 -8
  356. package/src/chat/ui/code-theme.ts +4 -4
  357. package/src/chat/ui/composer/placeholder.ts +2 -2
  358. package/src/chat/ui/composer/use-compaction-offer.ts +36 -16
  359. package/src/chat/ui/composer/use-composer-menus.ts +4 -9
  360. package/src/chat/ui/composer/use-composer-submit.ts +2 -1
  361. package/src/chat/ui/composer/use-effort-stepper.ts +56 -0
  362. package/src/chat/ui/composer/use-notice.ts +2 -2
  363. package/src/chat/ui/diff/EditorEditDiff.tsx +9 -13
  364. package/src/chat/ui/diff/LegacyEditDiff.tsx +12 -17
  365. package/src/chat/ui/diff/LegacyUnifiedDiff.tsx +13 -21
  366. package/src/chat/ui/diff/use-review-stack.ts +4 -4
  367. package/src/chat/ui/diff-theme.ts +3 -3
  368. package/src/chat/ui/file-links.ts +2 -2
  369. package/src/chat/ui/intelligent-ui/UiReply.tsx +2 -0
  370. package/src/chat/ui/intelligent-ui/renderers/chart.tsx +3 -3
  371. package/src/chat/ui/intelligent-ui/renderers/content.tsx +5 -6
  372. package/src/chat/ui/intelligent-ui/renderers/map-view.tsx +2 -1
  373. package/src/chat/ui/intelligent-ui/renderers/map.tsx +2 -1
  374. package/src/chat/ui/intelligent-ui/use-truncated.ts +16 -19
  375. package/src/chat/ui/intelligent-ui/use-ui-links.ts +3 -3
  376. package/src/chat/ui/mermaid.ts +52 -96
  377. package/src/chat/ui/rows/ForksRow.tsx +3 -5
  378. package/src/chat/ui/rows/GeneratedImageRow.tsx +2 -1
  379. package/src/chat/ui/rows/MessageRows.tsx +12 -21
  380. package/src/chat/ui/rows/SubagentRow.tsx +3 -3
  381. package/src/chat/ui/rows/TaskRow.tsx +1 -1
  382. package/src/chat/ui/rows/WorkRows.tsx +11 -6
  383. package/src/chat/ui/rows/WorkflowRow.tsx +144 -54
  384. package/src/chat/ui/useToggleSet.ts +15 -18
  385. package/src/chat/ui/visual-theme.ts +2 -3
  386. package/src/host-hooks.ts +113 -0
  387. package/src/lazy.tsx +2 -0
  388. package/src/locales/en/agent-chat.ts +142 -108
  389. package/src/locales/en/agent-prompts.ts +7 -7
  390. package/src/locales/en/agent-providers.ts +35 -34
  391. package/src/locales/en/agent-usage.ts +26 -20
  392. package/src/locales/nl/agent-chat.ts +134 -100
  393. package/src/locales/nl/agent-prompts.ts +5 -5
  394. package/src/locales/nl/agent-providers.ts +33 -32
  395. package/src/locales/nl/agent-usage.ts +25 -20
  396. package/src/providers/CliDetail.tsx +2 -1
  397. package/src/providers/InstallPage.tsx +2 -4
  398. package/src/providers/ProviderList.tsx +12 -2
  399. package/src/providers/ProvidersPane.tsx +45 -15
  400. package/src/providers/pane-target.ts +20 -4
  401. package/src/state/chats.ts +2 -2
  402. package/src/usage/LimitsList.tsx +12 -13
  403. package/src/usage/UsageBreakdown.tsx +17 -6
  404. package/src/usage/UsageLimits.tsx +2 -1
  405. package/src/usage/UsagePage.tsx +3 -3
  406. package/src/usage/index.ts +1 -1
  407. package/src/usage/limit-groups.ts +12 -0
  408. package/src/usage/limits.ts +2 -2
  409. package/src/usage/money.ts +1 -2
@@ -1,4 +1,3 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
1
  import 'maplibre-gl/dist/maplibre-gl.css';
3
2
  import { useEffect, useRef, useState } from 'react';
4
3
  import { Map as MapLibreMap, Marker, setWorkerUrl } from 'maplibre-gl';
@@ -8,6 +7,8 @@ import { ButtonGroup, IconButton } from '@adecore/ui';
8
7
  import { useChatHost } from '../../../../host.js';
9
8
  import { watchTheme } from '../../theme-watch.js';
10
9
  import { baseMapStyle, boundsOf, localizedTextField, mapFitOptions, spreadOverlaps } from './map-style.js';
10
+ import { useHostCodeMode } from '../../../../host-hooks.js';
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
12
  const MARKER = 'flex size-5 items-center justify-center rounded-full bg-map-marker text-xs text-map-marker-text tabular-nums shadow-raised';
12
13
  const PICKED = 'z-1 bg-accent text-accent-text outline-2 outline-surface';
13
14
  // A tile that fails this many times with none loading in between leaves the map empty, so the outline stands in.
@@ -19,231 +20,295 @@ let workerUrlSet = null;
19
20
  * host hands the address from its own source.
20
21
  */
21
22
  function ensureBundledWorker(hosted) {
22
- const url = hosted ?? new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url).href;
23
- if (url !== workerUrlSet) {
24
- setWorkerUrl(url);
25
- workerUrlSet = url;
26
- }
23
+ const url = hosted ?? new URL('maplibre-gl/dist/maplibre-gl-worker.mjs', import.meta.url).href;
24
+ if (url !== workerUrlSet) {
25
+ setWorkerUrl(url);
26
+ workerUrlSet = url;
27
+ }
27
28
  }
28
29
  /* The grounds of the built-in map are theme tokens, which the page resolves; the style needs plain colors. */
29
30
  function readColors(element) {
30
- const style = getComputedStyle(element);
31
- return { land: style.getPropertyValue('--map-land').trim() || 'transparent', water: style.getPropertyValue('--map-water').trim() || 'transparent' };
31
+ const style = getComputedStyle(element);
32
+ return {
33
+ land: style.getPropertyValue('--map-land').trim() || 'transparent',
34
+ water: style.getPropertyValue('--map-water').trim() || 'transparent'
35
+ };
32
36
  }
33
37
  /*
34
38
  * The map itself, in the chunk that holds MapLibre. It draws the host's tiles when the source has them
35
39
  * and the outline of the world otherwise, also when the tiles turn out to be out of reach. Its
36
40
  * canvas is hidden from assistive technology, since the list of places beside it says the same.
37
41
  */
38
- export function MapView({ markers, source, selected, onPick, onStatus }) {
39
- const { t, i18n } = useTranslation('agent-chat');
40
- const host = useChatHost();
41
- const mode = host.code.useMode();
42
- const workerUrl = host.maps?.workerUrl;
43
- const element = useRef(null);
44
- const [map, setMap] = useState(null);
45
- const [outline, setOutline] = useState(false);
46
- const latest = useRef({ source, onStatus, onPick });
47
- useEffect(() => {
48
- latest.current = { source, onStatus, onPick };
49
- });
50
- const language = i18n.language.split('-')[0] ?? 'en';
51
- const styleKey = `${mode}:${source.state === 'tiles' ? source.styleUrl(mode) : 'outline'}`;
52
- const pointsKey = JSON.stringify(markers.map((marker) => [marker.id, marker.lat, marker.lon]));
53
- useEffect(() => {
54
- const container = element.current;
55
- if (container === null) {
56
- return;
57
- }
58
- const current = latest.current.source;
59
- let colors = readColors(container);
60
- const offline = current.state === 'tiles' && typeof navigator !== 'undefined' && navigator.onLine === false;
61
- const tiles = current.state === 'tiles' && !offline;
62
- let created;
63
- try {
64
- ensureBundledWorker(workerUrl);
65
- created = new MapLibreMap({
66
- container,
67
- style: current.state === 'tiles' && tiles ? current.styleUrl(mode) : baseMapStyle(colors),
68
- center: [0, 20],
69
- zoom: 1,
70
- keyboard: false,
71
- cooperativeGestures: true,
72
- attributionControl: false,
73
- dragRotate: false,
74
- pitchWithRotate: false,
75
- locale: {
76
- 'CooperativeGesturesHandler.WindowsHelpText': t('blocks.map.scrollHint'),
77
- 'CooperativeGesturesHandler.MacHelpText': t('blocks.map.scrollHint'),
78
- 'CooperativeGesturesHandler.MobileHelpText': t('blocks.map.touchHint')
79
- },
80
- transformRequest: (url) => {
81
- const now = latest.current.source;
82
- return now.state === 'tiles' && now.transformRequest ? now.transformRequest(url) : { url };
83
- }
84
- });
85
- }
86
- catch {
87
- latest.current.onStatus('failed');
88
- return;
89
- }
90
- created.touchZoomRotate.disableRotation();
91
- const canvas = created.getCanvas();
92
- canvas.tabIndex = -1;
93
- const wantsTiles = current.state === 'tiles';
94
- let drawing = tiles ? 'tiles' : 'outline';
95
- // Why the outline is drawn in place of tiles that were asked for; null while the tiles are.
96
- let reason = wantsTiles && !tiles ? 'offline' : null;
97
- let styleLoaded = false;
98
- let restoring = false;
99
- let tileErrors = 0;
100
- setOutline(!tiles);
101
- latest.current.onStatus(tiles ? 'loading' : wantsTiles ? 'offline' : 'base');
102
- const drawOutline = (why) => {
103
- if (drawing === 'outline' || !wantsTiles) {
104
- return;
105
- }
106
- drawing = 'outline';
107
- reason = why;
108
- setOutline(true);
109
- created.setStyle(baseMapStyle(colors));
110
- latest.current.onStatus(why);
111
- };
112
- const drawTiles = () => {
113
- if (current.state !== 'tiles') {
114
- return;
115
- }
116
- drawing = 'tiles';
117
- reason = null;
118
- styleLoaded = false;
119
- restoring = true;
120
- tileErrors = 0;
121
- setOutline(false);
122
- created.setStyle(current.styleUrl(mode));
123
- latest.current.onStatus('loading');
124
- };
125
- const unreachable = () => (typeof navigator !== 'undefined' && navigator.onLine === false ? 'offline' : 'unavailable');
126
- created.on('style.load', () => {
127
- if (drawing !== 'tiles') {
128
- return;
129
- }
130
- styleLoaded = true;
131
- if (restoring) {
132
- restoring = false;
133
- latest.current.onStatus('tiles');
134
- }
135
- const field = current.state === 'tiles' ? current.labelField?.(language) : undefined;
136
- if (field === undefined) {
137
- return;
138
- }
139
- for (const layer of created.getStyle().layers) {
140
- const textField = layer.type === 'symbol' ? layer.layout?.['text-field'] : undefined;
141
- if (textField !== undefined) {
142
- created.setLayoutProperty(layer.id, 'text-field', localizedTextField(textField, field));
143
- }
144
- }
145
- });
146
- created.on('load', () => {
147
- if (drawing === 'tiles') {
148
- latest.current.onStatus('tiles');
149
- }
150
- });
151
- created.on('sourcedata', (event) => {
152
- if ('tile' in event) {
153
- tileErrors = 0;
154
- }
155
- });
156
- created.on('error', (event) => {
157
- if (drawing !== 'tiles') {
158
- return;
159
- }
160
- // Before the style is here there is nothing to draw. After it, a tile the host refuses (a ticket
161
- // that ran out) or several in a row leave an empty map; a single one the map retries itself.
162
- const status = event.error?.status;
163
- if (!styleLoaded || status === 401 || status === 403 || ++tileErrors >= TILE_ERRORS_IN_A_ROW) {
164
- drawOutline(unreachable());
165
- }
166
- });
167
- const goOffline = () => drawOutline('offline');
168
- const goOnline = () => {
169
- if (reason === 'offline') {
170
- drawTiles();
171
- }
172
- };
173
- const contextLost = () => latest.current.onStatus('lost');
174
- if (wantsTiles) {
175
- window.addEventListener('offline', goOffline);
176
- window.addEventListener('online', goOnline);
177
- }
178
- canvas.addEventListener('webglcontextlost', contextLost);
179
- // Colors that change within the side repaint the outline in place: a style that differs only in its paint is
180
- // applied as a diff, so the map, its camera and its markers stay. The tiles draw colors of their own.
181
- const stopWatching = watchTheme(container.ownerDocument, () => {
182
- const next = readColors(container);
183
- if (next.land === colors.land && next.water === colors.water) {
184
- return;
185
- }
186
- colors = next;
187
- if (drawing === 'outline') {
188
- created.setStyle(baseMapStyle(colors));
189
- }
190
- });
191
- setMap(created);
192
- return () => {
193
- stopWatching();
194
- window.removeEventListener('offline', goOffline);
195
- window.removeEventListener('online', goOnline);
196
- canvas.removeEventListener('webglcontextlost', contextLost);
197
- setMap(null);
198
- created.remove();
199
- };
200
- // The map is made again when the style it draws changes, and not for any other change of the source.
201
- // oxlint-disable-next-line react-hooks/exhaustive-deps
202
- }, [styleKey, language]);
203
- useEffect(() => {
204
- const bounds = boundsOf(markers);
205
- if (map === null || bounds === null) {
206
- return;
207
- }
208
- map.fitBounds(bounds, { ...mapFitOptions(outline), duration: 0 });
209
- // The points are compared by their coordinates, so a render that rebuilt the same list does not move the map.
210
- // oxlint-disable-next-line react-hooks/exhaustive-deps
211
- }, [map, pointsKey, outline]);
212
- const pickable = onPick !== null;
213
- useEffect(() => {
214
- if (map === null) {
215
- return;
42
+ export function MapView({
43
+ markers,
44
+ source,
45
+ selected,
46
+ onPick,
47
+ onStatus
48
+ }) {
49
+ const {
50
+ t,
51
+ i18n
52
+ } = useTranslation('agent-chat');
53
+ const host = useChatHost();
54
+ const mode = useHostCodeMode();
55
+ const workerUrl = host.maps?.workerUrl;
56
+ const element = useRef(null);
57
+ const [map, setMap] = useState(null);
58
+ const [outline, setOutline] = useState(false);
59
+ const latest = useRef({
60
+ source,
61
+ onStatus,
62
+ onPick
63
+ });
64
+ useEffect(() => {
65
+ latest.current = {
66
+ source,
67
+ onStatus,
68
+ onPick
69
+ };
70
+ });
71
+ const language = i18n.language.split('-')[0] ?? 'en';
72
+ const styleKey = `${mode}:${source.state === 'tiles' ? source.styleUrl(mode) : 'outline'}`;
73
+ const pointsKey = JSON.stringify(markers.map(marker => [marker.id, marker.lat, marker.lon]));
74
+ useEffect(() => {
75
+ const container = element.current;
76
+ if (container === null) {
77
+ return;
78
+ }
79
+ const current = latest.current.source;
80
+ let colors = readColors(container);
81
+ const offline = current.state === 'tiles' && typeof navigator !== 'undefined' && navigator.onLine === false;
82
+ const tiles = current.state === 'tiles' && !offline;
83
+ let created;
84
+ try {
85
+ ensureBundledWorker(workerUrl);
86
+ created = new MapLibreMap({
87
+ container,
88
+ style: current.state === 'tiles' && tiles ? current.styleUrl(mode) : baseMapStyle(colors),
89
+ center: [0, 20],
90
+ zoom: 1,
91
+ keyboard: false,
92
+ cooperativeGestures: true,
93
+ attributionControl: false,
94
+ dragRotate: false,
95
+ pitchWithRotate: false,
96
+ locale: {
97
+ 'CooperativeGesturesHandler.WindowsHelpText': t('blocks.map.scrollHint'),
98
+ 'CooperativeGesturesHandler.MacHelpText': t('blocks.map.scrollHint'),
99
+ 'CooperativeGesturesHandler.MobileHelpText': t('blocks.map.touchHint')
100
+ },
101
+ transformRequest: url => {
102
+ const now = latest.current.source;
103
+ return now.state === 'tiles' && now.transformRequest ? now.transformRequest(url) : {
104
+ url
105
+ };
216
106
  }
217
- const drawn = markers.map((marker) => {
218
- const node = document.createElement('div');
219
- node.setAttribute('aria-hidden', 'true');
220
- node.dataset.mapMarker = marker.id;
221
- node.className = `${MARKER} ${marker.id === selected ? PICKED : ''} ${pickable ? 'cursor-pointer' : ''}`;
222
- node.textContent = String(marker.number);
223
- node.addEventListener('click', () => latest.current.onPick?.(marker.id));
224
- return { marker, drawing: new Marker({ element: node }).setLngLat([marker.lon, marker.lat]).addTo(map) };
225
- });
226
- const spread = () => {
227
- const offsets = spreadOverlaps(drawn.map(({ marker }) => ({ id: marker.id, ...map.project([marker.lon, marker.lat]) })));
228
- for (const { marker, drawing } of drawn) {
229
- drawing.setOffset(offsets.get(marker.id) ?? [0, 0]);
230
- }
231
- };
232
- spread();
233
- map.on('zoomend', spread);
234
- return () => {
235
- map.off('zoomend', spread);
236
- for (const { drawing } of drawn) {
237
- drawing.remove();
238
- }
239
- };
240
- // oxlint-disable-next-line react-hooks/exhaustive-deps
241
- }, [map, pointsKey, selected, pickable]);
242
- const showAll = () => {
243
- const bounds = boundsOf(markers);
244
- if (map !== null && bounds !== null) {
245
- map.fitBounds(bounds, mapFitOptions(outline));
107
+ });
108
+ } catch {
109
+ latest.current.onStatus('failed');
110
+ return;
111
+ }
112
+ created.touchZoomRotate.disableRotation();
113
+ const canvas = created.getCanvas();
114
+ canvas.tabIndex = -1;
115
+ const wantsTiles = current.state === 'tiles';
116
+ let drawing = tiles ? 'tiles' : 'outline';
117
+ // Why the outline is drawn in place of tiles that were asked for; null while the tiles are.
118
+ let reason = wantsTiles && !tiles ? 'offline' : null;
119
+ let styleLoaded = false;
120
+ let restoring = false;
121
+ let tileErrors = 0;
122
+ setOutline(!tiles);
123
+ latest.current.onStatus(tiles ? 'loading' : wantsTiles ? 'offline' : 'base');
124
+ const drawOutline = why => {
125
+ if (drawing === 'outline' || !wantsTiles) {
126
+ return;
127
+ }
128
+ drawing = 'outline';
129
+ reason = why;
130
+ setOutline(true);
131
+ created.setStyle(baseMapStyle(colors));
132
+ latest.current.onStatus(why);
133
+ };
134
+ const drawTiles = () => {
135
+ if (current.state !== 'tiles') {
136
+ return;
137
+ }
138
+ drawing = 'tiles';
139
+ reason = null;
140
+ styleLoaded = false;
141
+ restoring = true;
142
+ tileErrors = 0;
143
+ setOutline(false);
144
+ created.setStyle(current.styleUrl(mode));
145
+ latest.current.onStatus('loading');
146
+ };
147
+ const unreachable = () => typeof navigator !== 'undefined' && navigator.onLine === false ? 'offline' : 'unavailable';
148
+ created.on('style.load', () => {
149
+ if (drawing !== 'tiles') {
150
+ return;
151
+ }
152
+ styleLoaded = true;
153
+ if (restoring) {
154
+ restoring = false;
155
+ latest.current.onStatus('tiles');
156
+ }
157
+ const field = current.state === 'tiles' ? current.labelField?.(language) : undefined;
158
+ if (field === undefined) {
159
+ return;
160
+ }
161
+ for (const layer of created.getStyle().layers) {
162
+ const textField = layer.type === 'symbol' ? layer.layout?.['text-field'] : undefined;
163
+ if (textField !== undefined) {
164
+ created.setLayoutProperty(layer.id, 'text-field', localizedTextField(textField, field));
246
165
  }
166
+ }
167
+ });
168
+ created.on('load', () => {
169
+ if (drawing === 'tiles') {
170
+ latest.current.onStatus('tiles');
171
+ }
172
+ });
173
+ created.on('sourcedata', event => {
174
+ if ('tile' in event) {
175
+ tileErrors = 0;
176
+ }
177
+ });
178
+ created.on('error', event_0 => {
179
+ if (drawing !== 'tiles') {
180
+ return;
181
+ }
182
+ // Before the style is here there is nothing to draw. After it, a tile the host refuses (a ticket
183
+ // that ran out) or several in a row leave an empty map; a single one the map retries itself.
184
+ const status = event_0.error?.status;
185
+ if (!styleLoaded || status === 401 || status === 403 || ++tileErrors >= TILE_ERRORS_IN_A_ROW) {
186
+ drawOutline(unreachable());
187
+ }
188
+ });
189
+ const goOffline = () => drawOutline('offline');
190
+ const goOnline = () => {
191
+ if (reason === 'offline') {
192
+ drawTiles();
193
+ }
247
194
  };
248
- return (_jsxs("div", { className: "absolute inset-0", children: [_jsx("div", { ref: element, "aria-hidden": true, className: "size-full" }), _jsxs(ButtonGroup, { className: "absolute top-2 right-2 rounded-md border border-border bg-surface-raised shadow-raised", children: [_jsx(IconButton, { icon: Plus, size: "sm", label: t('blocks.map.zoomIn'), onClick: () => map?.zoomIn() }), _jsx(IconButton, { icon: Minus, size: "sm", label: t('blocks.map.zoomOut'), onClick: () => map?.zoomOut() }), markers.length > 1 && _jsx(IconButton, { icon: Maximize, size: "sm", label: t('blocks.map.showAll'), onClick: showAll })] })] }));
249
- }
195
+ const contextLost = () => latest.current.onStatus('lost');
196
+ if (wantsTiles) {
197
+ window.addEventListener('offline', goOffline);
198
+ window.addEventListener('online', goOnline);
199
+ }
200
+ canvas.addEventListener('webglcontextlost', contextLost);
201
+ // Colors that change within the side repaint the outline in place: a style that differs only in its paint is
202
+ // applied as a diff, so the map, its camera and its markers stay. The tiles draw colors of their own.
203
+ const stopWatching = watchTheme(container.ownerDocument, () => {
204
+ const next = readColors(container);
205
+ if (next.land === colors.land && next.water === colors.water) {
206
+ return;
207
+ }
208
+ colors = next;
209
+ if (drawing === 'outline') {
210
+ created.setStyle(baseMapStyle(colors));
211
+ }
212
+ });
213
+ setMap(created);
214
+ return () => {
215
+ stopWatching();
216
+ window.removeEventListener('offline', goOffline);
217
+ window.removeEventListener('online', goOnline);
218
+ canvas.removeEventListener('webglcontextlost', contextLost);
219
+ setMap(null);
220
+ created.remove();
221
+ };
222
+ // The map is made again when the style it draws changes, and not for any other change of the source.
223
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
224
+ }, [styleKey, language]);
225
+ useEffect(() => {
226
+ const bounds = boundsOf(markers);
227
+ if (map === null || bounds === null) {
228
+ return;
229
+ }
230
+ map.fitBounds(bounds, {
231
+ ...mapFitOptions(outline),
232
+ duration: 0
233
+ });
234
+ // The points are compared by their coordinates, so a render that rebuilt the same list does not move the map.
235
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
236
+ }, [map, pointsKey, outline]);
237
+ const pickable = onPick !== null;
238
+ useEffect(() => {
239
+ if (map === null) {
240
+ return;
241
+ }
242
+ const drawn = markers.map(marker_0 => {
243
+ const node = document.createElement('div');
244
+ node.setAttribute('aria-hidden', 'true');
245
+ node.dataset.mapMarker = marker_0.id;
246
+ node.className = `${MARKER} ${marker_0.id === selected ? PICKED : ''} ${pickable ? 'cursor-pointer' : ''}`;
247
+ node.textContent = String(marker_0.number);
248
+ node.addEventListener('click', () => latest.current.onPick?.(marker_0.id));
249
+ return {
250
+ marker: marker_0,
251
+ drawing: new Marker({
252
+ element: node
253
+ }).setLngLat([marker_0.lon, marker_0.lat]).addTo(map)
254
+ };
255
+ });
256
+ const spread = () => {
257
+ const offsets = spreadOverlaps(drawn.map(({
258
+ marker: marker_1
259
+ }) => ({
260
+ id: marker_1.id,
261
+ ...map.project([marker_1.lon, marker_1.lat])
262
+ })));
263
+ for (const {
264
+ marker: marker_2,
265
+ drawing: drawing_0
266
+ } of drawn) {
267
+ drawing_0.setOffset(offsets.get(marker_2.id) ?? [0, 0]);
268
+ }
269
+ };
270
+ spread();
271
+ map.on('zoomend', spread);
272
+ return () => {
273
+ map.off('zoomend', spread);
274
+ for (const {
275
+ drawing: drawing_1
276
+ } of drawn) {
277
+ drawing_1.remove();
278
+ }
279
+ };
280
+ // oxlint-disable-next-line react-hooks/exhaustive-deps
281
+ }, [map, pointsKey, selected, pickable]);
282
+ const showAll = () => {
283
+ const bounds_0 = boundsOf(markers);
284
+ if (map !== null && bounds_0 !== null) {
285
+ map.fitBounds(bounds_0, mapFitOptions(outline));
286
+ }
287
+ };
288
+ return /*#__PURE__*/_jsxs("div", {
289
+ className: "absolute inset-0",
290
+ children: [/*#__PURE__*/_jsx("div", {
291
+ ref: element,
292
+ "aria-hidden": true,
293
+ className: "size-full"
294
+ }), /*#__PURE__*/_jsxs(ButtonGroup, {
295
+ className: "absolute top-2 right-2 rounded-md border border-border bg-surface-raised shadow-raised",
296
+ children: [/*#__PURE__*/_jsx(IconButton, {
297
+ icon: Plus,
298
+ size: "sm",
299
+ label: t('blocks.map.zoomIn'),
300
+ onClick: () => map?.zoomIn()
301
+ }), /*#__PURE__*/_jsx(IconButton, {
302
+ icon: Minus,
303
+ size: "sm",
304
+ label: t('blocks.map.zoomOut'),
305
+ onClick: () => map?.zoomOut()
306
+ }), markers.length > 1 && /*#__PURE__*/_jsx(IconButton, {
307
+ icon: Maximize,
308
+ size: "sm",
309
+ label: t('blocks.map.showAll'),
310
+ onClick: showAll
311
+ })]
312
+ })]
313
+ });
314
+ }