@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,42 +1,70 @@
1
+ import { c as _c } from "react/compiler-runtime";
1
2
  import { useState } from 'react';
2
3
  /* Values that last as long as the page, past `limit` forgetting the one used longest ago. */
3
4
  export class UiPageMemory {
4
- entries = new Map();
5
- limit;
6
- constructor(limit) {
7
- this.limit = limit;
5
+ entries = new Map();
6
+ limit;
7
+ constructor(limit) {
8
+ this.limit = limit;
9
+ }
10
+ has(key) {
11
+ return this.entries.has(key);
12
+ }
13
+ /* Reading a value counts as using it. */
14
+ get(key) {
15
+ const value = this.entries.get(key);
16
+ if (value !== undefined) {
17
+ this.set(key, value);
8
18
  }
9
- has(key) {
10
- return this.entries.has(key);
11
- }
12
- /* Reading a value counts as using it. */
13
- get(key) {
14
- const value = this.entries.get(key);
15
- if (value !== undefined) {
16
- this.set(key, value);
17
- }
18
- return value;
19
- }
20
- set(key, value) {
21
- this.entries.delete(key);
22
- this.entries.set(key, value);
23
- if (this.entries.size > this.limit) {
24
- this.entries.delete(this.entries.keys().next().value);
25
- }
26
- }
27
- get size() {
28
- return this.entries.size;
19
+ return value;
20
+ }
21
+ set(key, value) {
22
+ this.entries.delete(key);
23
+ this.entries.set(key, value);
24
+ if (this.entries.size > this.limit) {
25
+ this.entries.delete(this.entries.keys().next().value);
29
26
  }
27
+ }
28
+ get size() {
29
+ return this.entries.size;
30
+ }
30
31
  }
31
32
  // Which tab or section a person opened, so a block the thread unmounts while scrolling comes back as they left it.
32
33
  const remembered = new UiPageMemory(512);
33
34
  /* State of one node that lasts as long as the page, such as a fold; local input state belongs to the runtime instead. */
34
35
  export function useBlockLocal(context, nodeId, initial) {
35
- const key = `${context.scopeId}\n${context.chatId}\n${context.itemId}\n${context.blockId}\n${nodeId}`;
36
- const [value, setValue] = useState(() => (remembered.has(key) ? remembered.get(key) : initial()));
37
- const set = (next) => {
38
- remembered.set(key, next);
39
- setValue(next);
36
+ const $ = _c(8);
37
+ const key = `${context.scopeId}\n${context.chatId}\n${context.itemId}\n${context.blockId}\n${nodeId}`;
38
+ let t0;
39
+ if ($[0] !== initial || $[1] !== key) {
40
+ t0 = () => remembered.has(key) ? remembered.get(key) : initial();
41
+ $[0] = initial;
42
+ $[1] = key;
43
+ $[2] = t0;
44
+ } else {
45
+ t0 = $[2];
46
+ }
47
+ const [value, setValue] = useState(t0);
48
+ let t1;
49
+ if ($[3] !== key) {
50
+ t1 = next => {
51
+ remembered.set(key, next);
52
+ setValue(next);
40
53
  };
41
- return [value, set];
42
- }
54
+ $[3] = key;
55
+ $[4] = t1;
56
+ } else {
57
+ t1 = $[4];
58
+ }
59
+ const set = t1;
60
+ let t2;
61
+ if ($[5] !== set || $[6] !== value) {
62
+ t2 = [value, set];
63
+ $[5] = set;
64
+ $[6] = value;
65
+ $[7] = t2;
66
+ } else {
67
+ t2 = $[7];
68
+ }
69
+ return t2;
70
+ }
@@ -3,41 +3,44 @@ export const UI_CHART_SERIES = 6;
3
3
  /* Categories a chart draws; more would not fit a column of a thread. */
4
4
  export const UI_CHART_ROWS = 60;
5
5
  function numericKeys(rows) {
6
- const keys = [];
7
- for (const row of rows) {
8
- for (const [key, value] of Object.entries(row)) {
9
- if (key !== 'label' && !keys.includes(key) && typeof value === 'number' && Number.isFinite(value)) {
10
- keys.push(key);
11
- }
12
- }
6
+ const keys = [];
7
+ for (const row of rows) {
8
+ for (const [key, value] of Object.entries(row)) {
9
+ if (key !== 'label' && !keys.includes(key) && typeof value === 'number' && Number.isFinite(value)) {
10
+ keys.push(key);
11
+ }
13
12
  }
14
- return keys;
13
+ }
14
+ return keys;
15
15
  }
16
16
  function valuesOf(rows, keys) {
17
- return {
18
- labels: rows.map((row) => (typeof row.label === 'string' || typeof row.label === 'number' ? String(row.label) : '')),
19
- series: keys.map((key) => ({
20
- key,
21
- values: rows.map((row) => {
22
- const value = row[key];
23
- return typeof value === 'number' && Number.isFinite(value) ? value : null;
24
- })
25
- }))
26
- };
17
+ return {
18
+ labels: rows.map(row => typeof row.label === 'string' || typeof row.label === 'number' ? String(row.label) : ''),
19
+ series: keys.map(key => ({
20
+ key,
21
+ values: rows.map(row => {
22
+ const value = row[key];
23
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
24
+ })
25
+ }))
26
+ };
27
27
  }
28
28
  /* All of a chart's numbers, for the table a person can open beside a drawing that left some out. */
29
29
  export function uiChartValues(data) {
30
- return valuesOf(data, numericKeys(data));
30
+ return valuesOf(data, numericKeys(data));
31
31
  }
32
32
  /*
33
33
  * The rounded ends of a value axis, or null when no drawing can scale to them: the span has to be
34
34
  * finite and above zero, and so does one over it, which rules out a subnormal span as well.
35
35
  */
36
36
  export function uiChartRange(min, max) {
37
- const low = min < 0 ? -niceCeiling(-min) : 0;
38
- const high = max > 0 ? niceCeiling(max) : low === 0 ? 1 : 0;
39
- const span = high - low;
40
- return span > 0 && Number.isFinite(span) && Number.isFinite(1 / span) ? { low, high } : null;
37
+ const low = min < 0 ? -niceCeiling(-min) : 0;
38
+ const high = max > 0 ? niceCeiling(max) : low === 0 ? 1 : 0;
39
+ const span = high - low;
40
+ return span > 0 && Number.isFinite(span) && Number.isFinite(1 / span) ? {
41
+ low,
42
+ high
43
+ } : null;
41
44
  }
42
45
  /*
43
46
  * The series a chart can draw: every key besides `label` with a finite number in some row, the
@@ -45,32 +48,39 @@ export function uiChartRange(min, max) {
45
48
  * row or no series, or when the numbers are too large to scale, which draws the fallback.
46
49
  */
47
50
  export function uiChartData(data, kind) {
48
- const rows = data.slice(0, UI_CHART_ROWS);
49
- const keys = numericKeys(rows);
50
- if (rows.length === 0 || keys.length === 0) {
51
- return null;
52
- }
53
- const { labels, series } = valuesOf(rows, keys.slice(0, UI_CHART_SERIES));
54
- const negative = series.some(({ values }) => values.some((value) => value !== null && value < 0));
55
- const drawn = kind === 'stacked' && negative ? 'bar' : kind;
56
- const extents = drawn === 'stacked'
57
- ? labels.map((_, index) => series.reduce((sum, { values }) => sum + (values[index] ?? 0), 0))
58
- : series.flatMap(({ values }) => values.filter((value) => value !== null));
59
- const min = Math.min(0, ...extents);
60
- const max = Math.max(0, ...extents);
61
- if (uiChartRange(min, max) === null) {
62
- return null;
63
- }
64
- return {
65
- labels,
66
- series,
67
- kind: drawn,
68
- min,
69
- max: max === min ? min + 1 : max,
70
- truncated: data.length > rows.length,
71
- total: data.length,
72
- omitted: numericKeys(data).filter((key) => !series.some((drawnSeries) => drawnSeries.key === key))
73
- };
51
+ const rows = data.slice(0, UI_CHART_ROWS);
52
+ const keys = numericKeys(rows);
53
+ if (rows.length === 0 || keys.length === 0) {
54
+ return null;
55
+ }
56
+ const {
57
+ labels,
58
+ series
59
+ } = valuesOf(rows, keys.slice(0, UI_CHART_SERIES));
60
+ const negative = series.some(({
61
+ values
62
+ }) => values.some(value => value !== null && value < 0));
63
+ const drawn = kind === 'stacked' && negative ? 'bar' : kind;
64
+ const extents = drawn === 'stacked' ? labels.map((_, index) => series.reduce((sum, {
65
+ values
66
+ }) => sum + (values[index] ?? 0), 0)) : series.flatMap(({
67
+ values
68
+ }) => values.filter(value => value !== null));
69
+ const min = Math.min(0, ...extents);
70
+ const max = Math.max(0, ...extents);
71
+ if (uiChartRange(min, max) === null) {
72
+ return null;
73
+ }
74
+ return {
75
+ labels,
76
+ series,
77
+ kind: drawn,
78
+ min,
79
+ max: max === min ? min + 1 : max,
80
+ truncated: data.length > rows.length,
81
+ total: data.length,
82
+ omitted: numericKeys(data).filter(key => !series.some(drawnSeries => drawnSeries.key === key))
83
+ };
74
84
  }
75
85
  /* The width of one character of a chart's type at a 16px root, an estimate since SVG text cannot wrap or be measured before it draws. */
76
86
  export const UI_CHART_CHARACTER = 7.5;
@@ -79,32 +89,32 @@ const AXIS_WIDTH = 44;
79
89
  const AXIS_GAP = 8;
80
90
  /* The character width for a root font size, since chart type is set in rem and follows a person's larger text. */
81
91
  export function uiChartCharacter(rootFontSize) {
82
- return Number.isFinite(rootFontSize) && rootFontSize > 0 ? (UI_CHART_CHARACTER * rootFontSize) / 16 : UI_CHART_CHARACTER;
92
+ return Number.isFinite(rootFontSize) && rootFontSize > 0 ? UI_CHART_CHARACTER * rootFontSize / 16 : UI_CHART_CHARACTER;
83
93
  }
84
94
  export function uiChartTextWidth(text, character = UI_CHART_CHARACTER) {
85
- return Math.ceil(text.length * character);
95
+ return Math.ceil(text.length * character);
86
96
  }
87
97
  /* Text cut to the room it has, so a label never reaches past its place; the whole of it is in the values. */
88
98
  export function uiChartText(text, room, character = UI_CHART_CHARACTER) {
89
- const fit = Math.floor(room / character);
90
- return text.length <= fit ? text : `${text.slice(0, Math.max(1, fit - 1))}…`;
99
+ const fit = Math.floor(room / character);
100
+ return text.length <= fit ? text : `${text.slice(0, Math.max(1, fit - 1))}…`;
91
101
  }
92
102
  /* A value axis as wide as its longest tick label, at most two fifths of the chart; a label longer than that is cut. */
93
103
  export function uiChartAxis(ticks, width, character = UI_CHART_CHARACTER) {
94
- const scale = character / UI_CHART_CHARACTER;
95
- const room = Math.max(AXIS_WIDTH * scale, Math.floor(width * 0.4));
96
- const tickTexts = ticks.map((tick) => uiChartText(tick, room - AXIS_GAP, character));
97
- return {
98
- axisWidth: Math.round(Math.min(room, Math.max(AXIS_WIDTH * scale, ...tickTexts.map((text) => uiChartTextWidth(text, character) + AXIS_GAP)))),
99
- tickTexts
100
- };
104
+ const scale = character / UI_CHART_CHARACTER;
105
+ const room = Math.max(AXIS_WIDTH * scale, Math.floor(width * 0.4));
106
+ const tickTexts = ticks.map(tick => uiChartText(tick, room - AXIS_GAP, character));
107
+ return {
108
+ axisWidth: Math.round(Math.min(room, Math.max(AXIS_WIDTH * scale, ...tickTexts.map(text => uiChartTextWidth(text, character) + AXIS_GAP)))),
109
+ tickTexts
110
+ };
101
111
  }
102
112
  /* A round number at or above `value`, for the top of an axis: 1, 2, 2.5 or 5 times a power of ten. */
103
113
  export function niceCeiling(value) {
104
- if (value <= 0) {
105
- return 0;
106
- }
107
- const power = 10 ** Math.floor(Math.log10(value));
108
- const step = [1, 2, 2.5, 5, 10].find((factor) => factor * power >= value) ?? 10;
109
- return step * power;
110
- }
114
+ if (value <= 0) {
115
+ return 0;
116
+ }
117
+ const power = 10 ** Math.floor(Math.log10(value));
118
+ const step = [1, 2, 2.5, 5, 10].find(factor => factor * power >= value) ?? 10;
119
+ return step * power;
120
+ }
@@ -2,118 +2,101 @@ import { parseUiEventTime } from '@adecore/intelligent-ui';
2
2
  import { formatClock, formatDateTime, formatDay, formatDayClock, formatDayClockWithYear, formatDayWithYear } from '@adecore/ui/format';
3
3
  /* The text a node holds, every `$text` below it joined as written, such as the code of a CodeBlock. */
4
4
  export function uiNodeText(node) {
5
- return node.children.map((child) => (child.type === '$text' ? String(child.props.text ?? '') : uiNodeText(child))).join('');
5
+ return node.children.map(child => child.type === '$text' ? String(child.props.text ?? '') : uiNodeText(child)).join('');
6
6
  }
7
7
  /* The same text on one line, for a name a control or a screen reader needs as a string. */
8
8
  export function uiNodeLabel(node) {
9
- return uiNodeText(node).replace(/\s+/g, ' ').trim();
9
+ return uiNodeText(node).replace(/\s+/g, ' ').trim();
10
10
  }
11
11
  /* The text written directly in a node, beside its component children: the label of a Select, whose children are mostly its options. */
12
12
  export function uiOwnLabel(node) {
13
- return node.children
14
- .filter((child) => child.type === '$text')
15
- .map((child) => String(child.props.text ?? ''))
16
- .join('')
17
- .replace(/\s+/g, ' ')
18
- .trim();
13
+ return node.children.filter(child => child.type === '$text').map(child => String(child.props.text ?? '')).join('').replace(/\s+/g, ' ').trim();
19
14
  }
20
15
  /* The valid children of one kind, which a parent reads as metadata: the columns of a table, the tabs of a strip. */
21
16
  export function uiChildrenOf(node, type) {
22
- return node.children.filter((child) => child.type === type && child.error === undefined);
17
+ return node.children.filter(child => child.type === type && child.error === undefined);
23
18
  }
24
19
  /* A Summary draws its text as inline Markdown, so the name it gives its block leaves out the code ticks, the strong marks and the address of a link. */
25
20
  function withoutMarks(text) {
26
- return text
27
- .replace(/\[([^\]]*)\]\([^)]*\)/g, '$1')
28
- .replace(/\*\*|`/g, '')
29
- .trim();
21
+ return text.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1').replace(/\*\*|`/g, '').trim();
30
22
  }
31
23
  /* The Summary that heads a block, which is its first node; a Summary further down is a subheading. */
32
24
  export function uiBlockHead(nodes) {
33
- const first = nodes[0];
34
- if (first === undefined || first.type !== 'Summary' || first.error !== undefined) {
35
- return null;
36
- }
37
- return { id: first.id, label: withoutMarks(uiNodeLabel(first)) };
25
+ const first = nodes[0];
26
+ if (first === undefined || first.type !== 'Summary' || first.error !== undefined) {
27
+ return null;
28
+ }
29
+ return {
30
+ id: first.id,
31
+ label: withoutMarks(uiNodeLabel(first))
32
+ };
38
33
  }
39
34
  /*
40
35
  * Scrolls the Source row of `nodeId` under `root` into view and focuses it, which lights the row once.
41
36
  * Opens enclosing tabs and sections first; false when the source is absent.
42
37
  */
43
38
  export async function revealUiSource(root, nodeId, ancestors = []) {
44
- for (const id of ancestors) {
45
- const control = [...root.querySelectorAll('[data-ui-reveal]')].find((element) => element.dataset.uiReveal === id);
46
- if (control && (control.getAttribute('aria-expanded') === 'false' || control.getAttribute('aria-selected') === 'false')) {
47
- control.click();
48
- await new Promise((resolve) => setTimeout(resolve, 0));
49
- }
50
- }
51
- const row = [...root.querySelectorAll('[data-ui-source]')].find((element) => element.dataset.uiSource === nodeId);
52
- if (row === undefined) {
53
- return false;
54
- }
55
- // The light runs when focus arrives, so a row that already has it lets go first.
56
- if (row.ownerDocument.activeElement === row) {
57
- row.blur();
39
+ for (const id of ancestors) {
40
+ const control = [...root.querySelectorAll('[data-ui-reveal]')].find(element => element.dataset.uiReveal === id);
41
+ if (control && (control.getAttribute('aria-expanded') === 'false' || control.getAttribute('aria-selected') === 'false')) {
42
+ control.click();
43
+ await new Promise(resolve => setTimeout(resolve, 0));
58
44
  }
59
- row.focus({ preventScroll: true });
60
- const reduced = row.ownerDocument.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches === true;
61
- row.scrollIntoView({ block: 'nearest', behavior: reduced ? 'auto' : 'smooth' });
62
- return true;
45
+ }
46
+ const row = [...root.querySelectorAll('[data-ui-source]')].find(element => element.dataset.uiSource === nodeId);
47
+ if (row === undefined) {
48
+ return false;
49
+ }
50
+ // The light runs when focus arrives, so a row that already has it lets go first.
51
+ if (row.ownerDocument.activeElement === row) {
52
+ row.blur();
53
+ }
54
+ row.focus({
55
+ preventScroll: true
56
+ });
57
+ const reduced = row.ownerDocument.defaultView?.matchMedia('(prefers-reduced-motion: reduce)').matches === true;
58
+ row.scrollIntoView({
59
+ block: 'nearest',
60
+ behavior: reduced ? 'auto' : 'smooth'
61
+ });
62
+ return true;
63
63
  }
64
64
  /* The reason codes this version says in its own words; any other code reads as the reason the machine gave. */
65
- const UI_REASON_CODES = new Set([
66
- 'access-unavailable',
67
- 'block-stale',
68
- 'busy',
69
- 'link-unchecked',
70
- 'link-unsupported',
71
- 'links-unsupported',
72
- 'no-unique-match',
73
- 'outside-project',
74
- 'query-undeclared',
75
- 'refresh-limit',
76
- 'result-too-large',
77
- 'snapshot-too-large',
78
- 'source-unregistered',
79
- 'stale-read',
80
- 'target-unavailable',
81
- 'timed-out',
82
- 'unreadable'
83
- ]);
65
+ const UI_REASON_CODES = new Set(['access-unavailable', 'block-stale', 'busy', 'link-unchecked', 'link-unsupported', 'links-unsupported', 'no-unique-match', 'outside-project', 'query-undeclared', 'refresh-limit', 'result-too-large', 'snapshot-too-large', 'source-unregistered', 'stale-read', 'target-unavailable', 'timed-out', 'unreadable']);
84
66
  /* Why a reading failed or a link stayed plain, in the person's language where the code is known. */
85
67
  export function uiReasonText(t, code, reason) {
86
- return code !== undefined && UI_REASON_CODES.has(code) ? t(`blocks.live.reasons.${code}`) : reason;
68
+ return code !== undefined && UI_REASON_CODES.has(code) ? t(`blocks.live.reasons.${code}`) : reason;
87
69
  }
88
70
  /*
89
71
  * A number with its unit, where a percent sign hugs the number and every other unit stands apart
90
72
  * from it, by a space that never lets the two wrap apart.
91
73
  */
92
74
  export function uiWithUnit(text, unit) {
93
- if (unit === undefined || unit === '') {
94
- return text;
95
- }
96
- return unit === '%' ? `${text}${unit}` : `${text}\u00a0${unit}`;
75
+ if (unit === undefined || unit === '') {
76
+ return text;
77
+ }
78
+ return unit === '%' ? `${text}${unit}` : `${text}\u00a0${unit}`;
97
79
  }
98
80
  /* Why the choices of a live block are closed: its data is still being read, or the reason a reading failed. Null while nothing live holds them. */
99
81
  export function uiLiveChoiceReason(t, live) {
100
- if (live === null || live === undefined || live.state === 'fresh') {
101
- return null;
102
- }
103
- if (live.state === 'reading') {
104
- return t('blocks.choice.reading');
105
- }
106
- const source = live.source ?? live.sources[0] ?? '';
107
- return uiReasonText(t, live.code, live.reason) ?? t(live.state === 'failed' ? 'blocks.live.failed' : 'blocks.live.refused', { source });
82
+ if (live === null || live === undefined || live.state === 'fresh') {
83
+ return null;
84
+ }
85
+ if (live.state === 'reading') {
86
+ return t('blocks.choice.reading');
87
+ }
88
+ const source = live.source ?? live.sources[0] ?? '';
89
+ return uiReasonText(t, live.code, live.reason) ?? t(live.state === 'failed' ? 'blocks.live.failed' : 'blocks.live.refused', {
90
+ source
91
+ });
108
92
  }
109
93
  /* The host of an address without its `www.`, which is how a source or a link in prose says where it goes. */
110
94
  export function uiUrlDomain(url) {
111
- try {
112
- return new URL(url).hostname.replace(/^www\./, '');
113
- }
114
- catch {
115
- return url;
116
- }
95
+ try {
96
+ return new URL(url).hostname.replace(/^www\./, '');
97
+ } catch {
98
+ return url;
99
+ }
117
100
  }
118
101
  /*
119
102
  * An event's `at` the way the person's language and region write it. The year is written once it is not the
@@ -121,20 +104,23 @@ export function uiUrlDomain(url) {
121
104
  * A text the catalog would not accept stays as written.
122
105
  */
123
106
  export function uiEventTime(at, now = Date.now()) {
124
- const moment = parseUiEventTime(at);
125
- if (moment === null) {
126
- return at;
127
- }
128
- const zone = moment.written ? 'UTC' : undefined;
129
- const year = moment.written ? moment.date.getUTCFullYear() : moment.date.getFullYear();
130
- const withYear = year !== new Date(now).getFullYear();
131
- if (moment.kind === 'time') {
132
- return moment.seconds
133
- ? formatDateTime(moment.date, { hour: '2-digit', minute: '2-digit', second: '2-digit', timeZone: 'UTC' })
134
- : formatClock(moment.date, zone);
135
- }
136
- if (moment.kind === 'date') {
137
- return withYear ? formatDayWithYear(moment.date, zone) : formatDay(moment.date, zone);
138
- }
139
- return withYear ? formatDayClockWithYear(moment.date, zone) : formatDayClock(moment.date, zone);
140
- }
107
+ const moment = parseUiEventTime(at);
108
+ if (moment === null) {
109
+ return at;
110
+ }
111
+ const zone = moment.written ? 'UTC' : undefined;
112
+ const year = moment.written ? moment.date.getUTCFullYear() : moment.date.getFullYear();
113
+ const withYear = year !== new Date(now).getFullYear();
114
+ if (moment.kind === 'time') {
115
+ return moment.seconds ? formatDateTime(moment.date, {
116
+ hour: '2-digit',
117
+ minute: '2-digit',
118
+ second: '2-digit',
119
+ timeZone: 'UTC'
120
+ }) : formatClock(moment.date, zone);
121
+ }
122
+ if (moment.kind === 'date') {
123
+ return withYear ? formatDayWithYear(moment.date, zone) : formatDay(moment.date, zone);
124
+ }
125
+ return withYear ? formatDayClockWithYear(moment.date, zone) : formatDayClock(moment.date, zone);
126
+ }
@@ -14,49 +14,49 @@ import { CalloutRenderer, EventRenderer, ProgressRenderer, StepRenderer, StepsRe
14
14
  * Select their options, a map its places).
15
15
  */
16
16
  export const UI_RENDERERS = {
17
- Summary: SummaryRenderer,
18
- Callout: CalloutRenderer,
19
- Tag: TagRenderer,
20
- Progress: ProgressRenderer,
21
- Steps: StepsRenderer,
22
- Step: StepRenderer,
23
- Timeline: TimelineRenderer,
24
- Event: EventRenderer,
25
- Stats: StatsRenderer,
26
- Stat: StatRenderer,
27
- EntityList: EntityListRenderer,
28
- Entry: EntryRenderer,
29
- Table: TableRenderer,
30
- Column: null,
31
- Chart: ChartRenderer,
32
- Tabs: TabsRenderer,
33
- Tab: TabRenderer,
34
- Sections: SectionsRenderer,
35
- Section: SectionRenderer,
36
- CodeBlock: CodeBlockRenderer,
37
- Image: ImageRenderer,
38
- Gallery: GalleryRenderer,
39
- Compare: CompareRenderer,
40
- Model: ModelRenderer,
41
- Map: MapRenderer,
42
- Place: null,
43
- Sources: SourcesRenderer,
44
- Source: SourceRenderer,
45
- File: FileRenderer,
46
- Diff: DiffRenderer,
47
- Commit: CommitRenderer,
48
- Node: NodeRenderer,
49
- Checklist: ChecklistRenderer,
50
- Item: ItemRenderer,
51
- Switch: SwitchRenderer,
52
- Slider: SliderRenderer,
53
- Segmented: SegmentedRenderer,
54
- Select: SelectRenderer,
55
- Option: null,
56
- TextField: TextFieldRenderer,
57
- Button: ButtonRenderer,
58
- Show: null,
59
- Each: null,
60
- Choices: ChoicesRenderer,
61
- Choice: ChoiceRenderer
62
- };
17
+ Summary: SummaryRenderer,
18
+ Callout: CalloutRenderer,
19
+ Tag: TagRenderer,
20
+ Progress: ProgressRenderer,
21
+ Steps: StepsRenderer,
22
+ Step: StepRenderer,
23
+ Timeline: TimelineRenderer,
24
+ Event: EventRenderer,
25
+ Stats: StatsRenderer,
26
+ Stat: StatRenderer,
27
+ EntityList: EntityListRenderer,
28
+ Entry: EntryRenderer,
29
+ Table: TableRenderer,
30
+ Column: null,
31
+ Chart: ChartRenderer,
32
+ Tabs: TabsRenderer,
33
+ Tab: TabRenderer,
34
+ Sections: SectionsRenderer,
35
+ Section: SectionRenderer,
36
+ CodeBlock: CodeBlockRenderer,
37
+ Image: ImageRenderer,
38
+ Gallery: GalleryRenderer,
39
+ Compare: CompareRenderer,
40
+ Model: ModelRenderer,
41
+ Map: MapRenderer,
42
+ Place: null,
43
+ Sources: SourcesRenderer,
44
+ Source: SourceRenderer,
45
+ File: FileRenderer,
46
+ Diff: DiffRenderer,
47
+ Commit: CommitRenderer,
48
+ Node: NodeRenderer,
49
+ Checklist: ChecklistRenderer,
50
+ Item: ItemRenderer,
51
+ Switch: SwitchRenderer,
52
+ Slider: SliderRenderer,
53
+ Segmented: SegmentedRenderer,
54
+ Select: SelectRenderer,
55
+ Option: null,
56
+ TextField: TextFieldRenderer,
57
+ Button: ButtonRenderer,
58
+ Show: null,
59
+ Each: null,
60
+ Choices: ChoicesRenderer,
61
+ Choice: ChoiceRenderer
62
+ };
@@ -1,3 +1,3 @@
1
1
  import { createContext } from 'react';
2
2
  /* The id of the Summary that heads the block. Undefined outside a frame, where every Summary heads. */
3
- export const UiHeadContext = createContext(undefined);
3
+ export const UiHeadContext = createContext(undefined);