@parallelworks/ui 0.18.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/README.md +86 -6
  2. package/dist/ai/adapter/memoryStore.d.ts +8 -0
  3. package/dist/ai/adapter/memoryStore.js +152 -0
  4. package/dist/ai/adapter/mock/index.d.ts +2 -0
  5. package/dist/ai/adapter/mock/index.js +3 -0
  6. package/dist/ai/adapter/mock/mockAdapter.d.ts +4 -0
  7. package/dist/ai/adapter/mock/mockAdapter.js +81 -0
  8. package/dist/ai/adapter/openai/createOpenAIStream.d.ts +9 -0
  9. package/dist/ai/adapter/openai/createOpenAIStream.js +33 -0
  10. package/dist/ai/adapter/openai/errors.d.ts +3 -0
  11. package/dist/ai/adapter/openai/errors.js +37 -0
  12. package/dist/ai/adapter/openai/index.d.ts +6 -0
  13. package/dist/ai/adapter/openai/index.js +6 -0
  14. package/dist/ai/adapter/openai/openaiAdapter.d.ts +9 -0
  15. package/dist/ai/adapter/openai/openaiAdapter.js +54 -0
  16. package/dist/ai/adapter/openai/responses.d.ts +4 -0
  17. package/dist/ai/adapter/openai/responses.js +108 -0
  18. package/dist/ai/adapter/openai/sse.d.ts +24 -0
  19. package/dist/ai/adapter/openai/sse.js +112 -0
  20. package/dist/ai/adapter/openai/wire.d.ts +40 -0
  21. package/dist/ai/adapter/types.d.ts +131 -0
  22. package/dist/ai/adapter/types.js +11 -0
  23. package/dist/ai/agent/classifier.d.ts +2 -0
  24. package/dist/ai/agent/classifier.js +12 -0
  25. package/dist/ai/agent/diff.d.ts +35 -0
  26. package/dist/ai/agent/diff.js +223 -0
  27. package/dist/ai/agent/diffHighlight.d.ts +6 -0
  28. package/dist/ai/agent/diffHighlight.js +101 -0
  29. package/dist/ai/agent/index.d.ts +6 -0
  30. package/dist/ai/agent/permissions.d.ts +11 -0
  31. package/dist/ai/agent/permissions.js +29 -0
  32. package/dist/ai/agent/toolfmt.d.ts +18 -0
  33. package/dist/ai/agent/toolfmt.js +383 -0
  34. package/dist/ai/agent/transcript.d.ts +38 -0
  35. package/dist/ai/agent/transcript.js +127 -0
  36. package/dist/ai/ai.css +325 -0
  37. package/dist/ai/components/AllocationSelector.d.ts +4 -0
  38. package/dist/ai/components/AllocationSelector.js +56 -0
  39. package/dist/ai/components/AttachmentManager.d.ts +1 -0
  40. package/dist/ai/components/AttachmentManager.js +144 -0
  41. package/dist/ai/components/AttachmentUpload.d.ts +24 -0
  42. package/dist/ai/components/AttachmentUpload.js +179 -0
  43. package/dist/ai/components/BlockedGroupBanner.d.ts +1 -0
  44. package/dist/ai/components/BlockedGroupBanner.js +29 -0
  45. package/dist/ai/components/BranchNavigator.d.ts +8 -0
  46. package/dist/ai/components/BranchNavigator.js +57 -0
  47. package/dist/ai/components/ChatEmptyState.d.ts +3 -0
  48. package/dist/ai/components/ChatEmptyState.js +171 -0
  49. package/dist/ai/components/ChatInput.d.ts +45 -0
  50. package/dist/ai/components/ChatInput.js +265 -0
  51. package/dist/ai/components/ChatLayout.d.ts +5 -0
  52. package/dist/ai/components/ChatLayout.js +15 -0
  53. package/dist/ai/components/ChatMessage.d.ts +24 -0
  54. package/dist/ai/components/ChatMessage.js +338 -0
  55. package/dist/ai/components/ChatMessageList.d.ts +35 -0
  56. package/dist/ai/components/ChatMessageList.js +301 -0
  57. package/dist/ai/components/ChatSidebar.d.ts +5 -0
  58. package/dist/ai/components/ChatSidebar.js +345 -0
  59. package/dist/ai/components/ChatThread.d.ts +3 -0
  60. package/dist/ai/components/ChatThread.js +198 -0
  61. package/dist/ai/components/ComposerChrome.d.ts +18 -0
  62. package/dist/ai/components/ComposerChrome.js +50 -0
  63. package/dist/ai/components/ComposerFrame.d.ts +16 -0
  64. package/dist/ai/components/ComposerFrame.js +33 -0
  65. package/dist/ai/components/DragOverlay.d.ts +5 -0
  66. package/dist/ai/components/DragOverlay.js +20 -0
  67. package/dist/ai/components/ModelSelector.d.ts +6 -0
  68. package/dist/ai/components/ModelSelector.js +343 -0
  69. package/dist/ai/components/ShareDialog.d.ts +11 -0
  70. package/dist/ai/components/ShareDialog.js +260 -0
  71. package/dist/ai/components/SlashMenu.d.ts +28 -0
  72. package/dist/ai/components/SlashMenu.js +91 -0
  73. package/dist/ai/components/agent/ActivityLine.d.ts +21 -0
  74. package/dist/ai/components/agent/ActivityLine.js +151 -0
  75. package/dist/ai/components/agent/AgentMessageParts.d.ts +54 -0
  76. package/dist/ai/components/agent/AgentMessageParts.js +721 -0
  77. package/dist/ai/components/agent/PermissionPicker.d.ts +11 -0
  78. package/dist/ai/components/agent/PermissionPicker.js +38 -0
  79. package/dist/ai/components/attachmentKeys.d.ts +4 -0
  80. package/dist/ai/components/attachmentKeys.js +10 -0
  81. package/dist/ai/core/ChatProvider.d.ts +66 -0
  82. package/dist/ai/core/ChatProvider.js +848 -0
  83. package/dist/ai/core/KeyboardShortcutsProvider.d.ts +5 -0
  84. package/dist/ai/core/KeyboardShortcutsProvider.js +9 -0
  85. package/dist/ai/core/chatReducer.d.ts +114 -0
  86. package/dist/ai/core/chatReducer.js +223 -0
  87. package/dist/ai/core/config.d.ts +47 -0
  88. package/dist/ai/core/config.js +45 -0
  89. package/dist/ai/core/events.d.ts +1 -0
  90. package/dist/ai/core/events.js +4 -0
  91. package/dist/ai/core/exportConversation.d.ts +4 -0
  92. package/dist/ai/core/exportConversation.js +42 -0
  93. package/dist/ai/core/greeting.d.ts +3 -0
  94. package/dist/ai/core/greeting.js +38 -0
  95. package/dist/ai/core/parts.d.ts +11 -0
  96. package/dist/ai/core/parts.js +84 -0
  97. package/dist/ai/core/useDragDrop.d.ts +14 -0
  98. package/dist/ai/core/useDragDrop.js +36 -0
  99. package/dist/ai/core/useKeyboardShortcuts.d.ts +12 -0
  100. package/dist/ai/core/useKeyboardShortcuts.js +77 -0
  101. package/dist/ai/core/useSSEStream.d.ts +34 -0
  102. package/dist/ai/core/useSSEStream.js +98 -0
  103. package/dist/ai/index.d.ts +40 -0
  104. package/dist/ai/index.js +44 -0
  105. package/dist/ai/strings.d.ts +167 -0
  106. package/dist/ai/strings.js +175 -0
  107. package/dist/ai/types.d.ts +236 -0
  108. package/dist/ai/ui/Avatar.d.ts +8 -0
  109. package/dist/ai/ui/Avatar.js +35 -0
  110. package/dist/ai/ui/Dropdown.d.ts +31 -0
  111. package/dist/ai/ui/Dropdown.js +110 -0
  112. package/dist/ai/ui/Markdown.d.ts +8 -0
  113. package/dist/ai/ui/Markdown.js +79 -0
  114. package/dist/ai/ui/Notice.d.ts +21 -0
  115. package/dist/ai/ui/Notice.js +77 -0
  116. package/dist/ai/ui/buttons.d.ts +1 -0
  117. package/dist/ai/ui/codeBreaks.d.ts +16 -0
  118. package/dist/ai/ui/codeBreaks.js +36 -0
  119. package/dist/ai/ui/prose.d.ts +1 -0
  120. package/dist/ai/ui/prose.js +13 -0
  121. package/dist/ai/ui/sidebar.d.ts +81 -0
  122. package/dist/ai/ui/sidebar.js +148 -0
  123. package/dist/ai/utils.d.ts +4 -0
  124. package/dist/ai/utils.js +23 -0
  125. package/dist/assets/{editor.worker-CuBRIwi-.js → editor.worker-BmHUIVG4.js} +194 -163
  126. package/dist/assets/{json.worker-8ytS02vz.js → json.worker-D8bJ92nw.js} +384 -338
  127. package/dist/assets/{yaml.worker-DJC-VUcv.js → yaml.worker-C4gyGAko.js} +15657 -13823
  128. package/dist/components/AddMenu.js +46 -0
  129. package/dist/components/Avatar.d.ts +1 -1
  130. package/dist/components/Avatar.js +46 -0
  131. package/dist/{chunks/BareModal-BtRiQezg.js → components/BareModal.js} +1 -1
  132. package/dist/components/Breadcrumbs.d.ts +1 -1
  133. package/dist/components/Breadcrumbs.js +83 -0
  134. package/dist/components/Button.js +83 -0
  135. package/dist/components/Callout.js +23 -0
  136. package/dist/components/Card.js +31 -0
  137. package/dist/components/CollapsiblePanel.js +77 -0
  138. package/dist/components/ConfirmModal.js +74 -0
  139. package/dist/components/CopyToClipboard.js +81 -0
  140. package/dist/{chunks/CreateModal-BY6DLmur.js → components/CreateModal.js} +10 -189
  141. package/dist/components/DescriptionList.js +42 -0
  142. package/dist/components/Dropdown.d.ts +1 -1
  143. package/dist/components/Dropdown.js +349 -0
  144. package/dist/components/EmptyState.d.ts +1 -1
  145. package/dist/components/EmptyState.js +27 -0
  146. package/dist/components/Filter.js +32 -0
  147. package/dist/components/FilterPill.js +13 -0
  148. package/dist/components/IconButton.js +34 -0
  149. package/dist/components/Indicator.d.ts +2 -2
  150. package/dist/{chunks/Indicator-hBSIxOPK.js → components/Indicator.js} +1 -1
  151. package/dist/components/Input.d.ts +1 -1
  152. package/dist/components/Input.js +88 -0
  153. package/dist/components/LetterBadge.d.ts +1 -1
  154. package/dist/components/LetterBadge.js +13 -0
  155. package/dist/components/Listbox.js +123 -0
  156. package/dist/{chunks/Loader-BXoXTZGc.js → components/Loader.js} +1 -1
  157. package/dist/components/Markdown.js +15 -0
  158. package/dist/components/MarkdownImpl.d.ts +1 -1
  159. package/dist/components/MultiSelect.js +171 -0
  160. package/dist/components/Overview.js +39 -0
  161. package/dist/components/PageHeader.js +194 -0
  162. package/dist/components/Pagination.js +35 -0
  163. package/dist/components/Provider.d.ts +16 -65
  164. package/dist/{chunks/Provider-Ghua9PkN.js → components/Provider.js} +54 -20
  165. package/dist/{chunks/RequiredMark-DfLdYbYZ.js → components/RequiredMark.js} +1 -1
  166. package/dist/components/SectionHeader.js +11 -0
  167. package/dist/components/SettingModeOption.js +30 -0
  168. package/dist/components/SettingRow.d.ts +1 -1
  169. package/dist/components/SettingRow.js +35 -0
  170. package/dist/components/SettingsCard.js +31 -0
  171. package/dist/components/SettingsGroup.d.ts +1 -1
  172. package/dist/components/SettingsGroup.js +17 -0
  173. package/dist/components/Sort.js +42 -0
  174. package/dist/components/StatusBadge.js +63 -0
  175. package/dist/components/SwitchToggle.js +59 -0
  176. package/dist/{chunks/SwitchToggleSmall-FcsaYSTs.js → components/SwitchToggleSmall.js} +1 -1
  177. package/dist/{chunks/Table-4OHjdKdO.js → components/Table.js} +7 -5
  178. package/dist/components/Toggle.js +20 -0
  179. package/dist/{chunks/Tooltip-Crxo_eU_.js → components/Tooltip.js} +6 -4
  180. package/dist/{chunks/StatusBadge-C1Blx_cW.js → components/dropdownUtils.js} +2 -63
  181. package/dist/components/focus.d.ts +2 -0
  182. package/dist/components/focus.js +7 -0
  183. package/dist/components/ghostButton.js +7 -0
  184. package/dist/components/inputClasses.js +4 -0
  185. package/dist/components/keys.d.ts +12 -0
  186. package/dist/components/keys.js +27 -0
  187. package/dist/components/relativeTime.js +32 -0
  188. package/dist/{chunks/useCssIsDark-DHr05dG2.js → components/useCssIsDark.js} +1 -1
  189. package/dist/duration.d.ts +3 -0
  190. package/dist/duration.js +17 -0
  191. package/dist/editor/Editor.js +13 -0
  192. package/dist/editor/EditorField.js +53 -0
  193. package/dist/editor/FormCodePanel.js +173 -0
  194. package/dist/editor/Monaco.d.ts +1 -20
  195. package/dist/editor/Monaco.js +112 -0
  196. package/dist/editor/index.d.ts +2 -1
  197. package/dist/editor/index.js +7 -2
  198. package/dist/editor/themes.js +91 -0
  199. package/dist/editor/workers.js +29 -0
  200. package/dist/editor/yaml.d.ts +5 -0
  201. package/dist/editor/yaml.js +15 -0
  202. package/dist/engine.d.ts +98 -0
  203. package/dist/file-explorer/FileExplorer.d.ts +11 -2
  204. package/dist/file-explorer/FileExplorer.js +1402 -0
  205. package/dist/file-explorer/FileExplorerContext.d.ts +1 -1
  206. package/dist/file-explorer/FileExplorerContext.js +370 -0
  207. package/dist/file-explorer/FilePreview/CodePreviewEditor.d.ts +1 -1
  208. package/dist/{chunks/CodePreviewEditor-4lx3kE-w.js → file-explorer/FilePreview/CodePreviewEditor.js} +3 -2
  209. package/dist/file-explorer/FilePreview/Inline.js +45 -0
  210. package/dist/file-explorer/FilePreview/StreamedBadge.js +16 -0
  211. package/dist/file-explorer/FilePreview/Viewer.js +526 -0
  212. package/dist/file-explorer/FilePreview/index.js +266 -0
  213. package/dist/file-explorer/FilePreview/parse.js +63 -0
  214. package/dist/file-explorer/FilePreview/previewCache.js +98 -0
  215. package/dist/file-explorer/FilePreview/previewType.d.ts +1 -1
  216. package/dist/file-explorer/FilePreview/previewType.js +151 -0
  217. package/dist/file-explorer/FilePreview/readCappedBytes.js +196 -0
  218. package/dist/file-explorer/FilePreview/useObjectBlobUrl.js +95 -0
  219. package/dist/file-explorer/FilePreview/useObjectText.js +109 -0
  220. package/dist/file-explorer/FilePreview/usePresignedUrl.js +73 -0
  221. package/dist/file-explorer/FileRow.d.ts +1 -1
  222. package/dist/file-explorer/FileRow.js +165 -0
  223. package/dist/file-explorer/FileRowsWindow.js +92 -0
  224. package/dist/file-explorer/FileTable.js +172 -0
  225. package/dist/file-explorer/FileTableHeaders.js +49 -0
  226. package/dist/file-explorer/LoadMoreRow.js +46 -0
  227. package/dist/file-explorer/TreeView.js +376 -0
  228. package/dist/file-explorer/helpers.d.ts +4 -4
  229. package/dist/file-explorer/helpers.js +537 -0
  230. package/dist/file-explorer/index.d.ts +3 -3
  231. package/dist/file-explorer/index.js +7 -5705
  232. package/dist/file-explorer/lib/batch.js +39 -0
  233. package/dist/file-explorer/lib/errors.js +9 -0
  234. package/dist/file-explorer/lib/paging.js +124 -0
  235. package/dist/file-explorer/lib/types.d.ts +6 -1
  236. package/dist/file-explorer/lib/utils.d.ts +1 -3
  237. package/dist/file-explorer/lib/utils.js +322 -0
  238. package/dist/file-explorer/toasts.js +400 -0
  239. package/dist/file-explorer/treeRows.js +73 -0
  240. package/dist/file-explorer/useNearEnd.d.ts +1 -1
  241. package/dist/file-explorer/useNearEnd.js +27 -0
  242. package/dist/form/FieldWrapper.d.ts +2 -2
  243. package/dist/form/FieldWrapper.js +54 -0
  244. package/dist/form/Fields/BooleanField.js +51 -0
  245. package/dist/form/Fields/CheckboxGroupField.js +72 -0
  246. package/dist/form/Fields/ColorField.js +33 -0
  247. package/dist/form/Fields/DropdownField.js +49 -0
  248. package/dist/form/Fields/DurationField.js +130 -0
  249. package/dist/form/Fields/LabelField.js +19 -0
  250. package/dist/form/Fields/MultiDropdownField.js +40 -0
  251. package/dist/form/Fields/NumberField.js +51 -0
  252. package/dist/form/Fields/ObjectField.js +54 -0
  253. package/dist/form/Fields/RadioField.js +49 -0
  254. package/dist/form/Fields/RangeField.js +58 -0
  255. package/dist/form/Fields/ResourceOptionIcon.d.ts +1 -1
  256. package/dist/form/Fields/ResourceOptionIcon.js +21 -0
  257. package/dist/form/Fields/StepField.js +6 -0
  258. package/dist/form/Fields/StringField.js +37 -0
  259. package/dist/form/Fields/TextAreaField.js +31 -0
  260. package/dist/form/Fields/durationValidity.js +11 -0
  261. package/dist/form/Form.d.ts +4 -21
  262. package/dist/form/Form.js +643 -0
  263. package/dist/form/SpecialTypes/DropdownWrapper.js +30 -0
  264. package/dist/form/SpecialTypes/FormikCustomDropdown.js +122 -0
  265. package/dist/form/SpecialTypes/FormikCustomInput.js +111 -0
  266. package/dist/form/SpecialTypes/FormikMultiSelectDropdown.js +31 -0
  267. package/dist/form/SpecialTypes/FormikNumericInput.js +60 -0
  268. package/dist/form/Wizard/WizardContainer.js +138 -0
  269. package/dist/form/Wizard/WizardNavigation.js +92 -0
  270. package/dist/form/Wizard/WizardStepContent.js +35 -0
  271. package/dist/form/Wizard/WizardStepIndicator.js +108 -0
  272. package/dist/form/Wizard/useWizardState.js +118 -0
  273. package/dist/form/Wizard/utils.js +34 -0
  274. package/dist/form/fieldContext.js +26 -0
  275. package/dist/form/fieldRegistry.js +50 -0
  276. package/dist/form/index.d.ts +11 -12
  277. package/dist/form/index.js +18 -2445
  278. package/dist/form/lib.d.ts +6 -1
  279. package/dist/{chunks/FieldWrapper-Bef01EWO.js → form/lib.js} +5 -104
  280. package/dist/form/types/fieldComponentTypes.d.ts +3 -2
  281. package/dist/form/types/fieldTypes.d.ts +6 -20
  282. package/dist/form/useParsedOpts.d.ts +1 -1
  283. package/dist/form/useParsedOpts.js +62 -0
  284. package/dist/form/usePrevious.js +11 -0
  285. package/dist/form/utils/checkShowIfObject.js +14 -0
  286. package/dist/form/utils/{slurmDuration.d.ts → duration.d.ts} +2 -2
  287. package/dist/form/utils/duration.js +69 -0
  288. package/dist/form/utils/getParentValue.js +23 -0
  289. package/dist/form/utils/getPlaceholder.js +9 -0
  290. package/dist/form/utils/getValueUsingPath.js +23 -0
  291. package/dist/form/utils/secondaryField.js +22 -0
  292. package/dist/graph/AnnotationBanner.js +141 -0
  293. package/dist/graph/Collapse.js +41 -0
  294. package/dist/{workflow/index.js → graph/DependencyGraph.js} +76 -1163
  295. package/dist/graph/JobSummary.js +104 -0
  296. package/dist/{workflow → graph}/MatrixGroup.d.ts +2 -2
  297. package/dist/graph/MatrixGroup.js +107 -0
  298. package/dist/graph/Reveal.js +57 -0
  299. package/dist/graph/TreeView.js +711 -0
  300. package/dist/{workflow → graph}/index.d.ts +1 -1
  301. package/dist/graph/index.js +2 -0
  302. package/dist/{workflow → graph}/types.d.ts +3 -3
  303. package/dist/graph/types.js +6 -0
  304. package/dist/icons.d.ts +20 -21
  305. package/dist/index.d.ts +38 -40
  306. package/dist/index.js +47 -599
  307. package/dist/list/ActionToolbar.js +184 -0
  308. package/dist/list/HoverCard.js +73 -0
  309. package/dist/list/ListPage.js +145 -0
  310. package/dist/list/ListPager.js +59 -0
  311. package/dist/list/ListTable.d.ts +1 -1
  312. package/dist/list/ListTable.js +163 -0
  313. package/dist/list/ListViewControls.d.ts +2 -2
  314. package/dist/list/ListViewControls.js +372 -0
  315. package/dist/list/RowContextMenu.js +350 -0
  316. package/dist/list/UserHoverCard.js +117 -0
  317. package/dist/list/index.d.ts +9 -9
  318. package/dist/list/index.js +11 -2
  319. package/dist/list/listSearch.js +137 -0
  320. package/dist/list/listView.js +210 -0
  321. package/dist/list/textEntry.js +10 -0
  322. package/dist/logviewer/LogViewer.d.ts +1 -1
  323. package/dist/logviewer/LogViewer.js +750 -0
  324. package/dist/logviewer/index.d.ts +1 -0
  325. package/dist/logviewer/index.js +3 -742
  326. package/dist/logviewer/segments.d.ts +9 -0
  327. package/dist/logviewer/segments.js +80 -0
  328. package/dist/styles/fonts.css +4 -4
  329. package/dist/styles/theme.css +6 -4
  330. package/dist/styles.css +1 -1
  331. package/dist/theme/index.js +2 -2
  332. package/package.json +38 -14
  333. package/LICENSE +0 -202
  334. package/dist/chunks/Monaco-C1POOdVv.js +0 -1046
  335. package/dist/chunks/PageHeader-l49p1nM9.js +0 -690
  336. package/dist/chunks/SwitchToggle-CHPP8uZQ.js +0 -755
  337. package/dist/chunks/editor-9_uVtUyy.js +0 -347
  338. package/dist/chunks/list-qrojZZNv.js +0 -1411
  339. package/dist/editor/usesGitlab.d.ts +0 -97
  340. package/dist/form/Fields/BucketReadOnlyField.d.ts +0 -7
  341. package/dist/form/types/workflow-schema.d.ts +0 -1145
  342. package/dist/form/utils/pwResolver.d.ts +0 -18
  343. package/dist/{chunks/MarkdownImpl-Bq4QhrtA.js → components/MarkdownImpl.js} +1 -1
  344. /package/dist/{workflow → graph}/AnnotationBanner.d.ts +0 -0
  345. /package/dist/{workflow → graph}/Collapse.d.ts +0 -0
  346. /package/dist/{workflow → graph}/DependencyGraph.d.ts +0 -0
  347. /package/dist/{workflow → graph}/JobSummary.d.ts +0 -0
  348. /package/dist/{workflow → graph}/Reveal.d.ts +0 -0
  349. /package/dist/{workflow → graph}/TreeView.d.ts +0 -0
@@ -0,0 +1,91 @@
1
+ import cx from "classnames";
2
+ import { useEffect, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region src/ai/components/SlashMenu.tsx
5
+ var MAX_SHOWN = 8;
6
+ var TYPING_NAME = /^\/([\w:-]*)$/;
7
+ function slashMatches(input, commands) {
8
+ const typed = TYPING_NAME.exec(input);
9
+ if (!typed) return [];
10
+ const query = (typed[1] ?? "").toLowerCase();
11
+ return commands.filter((c) => c.name.toLowerCase().startsWith(query)).slice(0, MAX_SHOWN);
12
+ }
13
+ /** The palette's open state and keys; the caller owns the input. */
14
+ function useSlashMenu(input, config, setInput) {
15
+ const [active, setActive] = useState(0);
16
+ const [dismissed, setDismissed] = useState(false);
17
+ const matches = config ? slashMatches(input, config.commands) : [];
18
+ const exact = matches.length === 1 && `/${matches[0]?.name}` === input;
19
+ const open = matches.length > 0 && !dismissed && !exact;
20
+ const startsCommand = input.startsWith("/");
21
+ const onOpen = config?.onOpen;
22
+ useEffect(() => {
23
+ if (startsCommand) onOpen?.();
24
+ }, [startsCommand, onOpen]);
25
+ const query = TYPING_NAME.exec(input)?.[1] ?? null;
26
+ const [shownQuery, setShownQuery] = useState(query);
27
+ if (query !== shownQuery) {
28
+ setShownQuery(query);
29
+ setActive(0);
30
+ setDismissed(false);
31
+ }
32
+ const choose = (name) => setInput(`/${name} `);
33
+ /** True when the key belonged to the menu. */
34
+ const handleKey = (e) => {
35
+ if (!open) return false;
36
+ switch (e.key) {
37
+ case "ArrowDown":
38
+ setActive((i) => (i + 1) % matches.length);
39
+ break;
40
+ case "ArrowUp":
41
+ setActive((i) => (i - 1 + matches.length) % matches.length);
42
+ break;
43
+ case "Tab":
44
+ case "Enter": {
45
+ if (e.shiftKey) return false;
46
+ const pick = matches[Math.min(active, matches.length - 1)];
47
+ if (!pick) return false;
48
+ choose(pick.name);
49
+ break;
50
+ }
51
+ case "Escape":
52
+ setDismissed(true);
53
+ break;
54
+ default: return false;
55
+ }
56
+ e.preventDefault();
57
+ return true;
58
+ };
59
+ return {
60
+ open,
61
+ matches,
62
+ active,
63
+ choose,
64
+ handleKey
65
+ };
66
+ }
67
+ function SlashMenu({ label, matches, active, onChoose }) {
68
+ return /* @__PURE__ */ jsx("div", {
69
+ role: "listbox",
70
+ "aria-label": label,
71
+ "data-testid": "slash-menu",
72
+ className: "absolute bottom-full left-0 right-0 mb-2 z-20 overflow-hidden rounded-xl border theme-border bg-(--theme-panel-bg) shadow-lg",
73
+ children: matches.map((c, i) => /* @__PURE__ */ jsxs("button", {
74
+ type: "button",
75
+ role: "option",
76
+ "aria-selected": i === active,
77
+ onMouseDown: (e) => e.preventDefault(),
78
+ onClick: () => onChoose(c.name),
79
+ className: cx("flex w-full items-baseline gap-3 px-3 py-1.5 text-left text-sm", i === active ? "theme-hover" : "hover:theme-hover"),
80
+ children: [/* @__PURE__ */ jsxs("span", {
81
+ className: "font-mono theme-text",
82
+ children: ["/", c.name]
83
+ }), c.description && /* @__PURE__ */ jsx("span", {
84
+ className: "truncate text-xs theme-muted-text",
85
+ children: c.description
86
+ })]
87
+ }, c.name))
88
+ });
89
+ }
90
+ //#endregion
91
+ export { SlashMenu, slashMatches, useSlashMenu };
@@ -0,0 +1,21 @@
1
+ /** The agent status words: one is picked per turn and held until it ends. */
2
+ export declare const activityWords: readonly ['Thinking', 'Cogitating', 'Pondering', 'Percolating', 'Ruminating', 'Noodling', 'Conjuring', 'Simmering', 'Marinating', 'Tinkering', 'Scheming', 'Brewing', 'Wrangling', 'Finagling', 'Spelunking', 'Puttering', 'Composing', 'Synthesizing', 'Deliberating', 'Mulling', 'Contemplating', 'Vibing', 'Whittling', 'Concocting', 'Formulating', 'Hatching', 'Herding', 'Ideating', 'Manifesting', 'Moseying', 'Musing', 'Percussing', 'Reticulating', 'Schlepping', 'Stewing', 'Transmuting', 'Wibbling', 'Crunching', 'Forging', 'Cooking'];
3
+ export declare function randomActivityWord(): string;
4
+ /** Elapsed run time the way an agent status line prints it: 45s, 2m13s,
5
+ * 1h2m3s. */
6
+ export declare function formatElapsed(seconds: number): string;
7
+ /** Token counts the way an agent status line prints them: 512, 1.2k, 3.4M. */
8
+ export declare function compactCount(n: number): string;
9
+ /** The terminal's "it's working" line for a running turn: spinner, status
10
+ * word, how long the turn has run, its token counts so far, and a way to
11
+ * stop it. */
12
+ export default function ActivityLine({ startedAt, inputTokens, outputTokens, onStop, stopping, word, testId, }: {
13
+ startedAt: string | null | undefined;
14
+ inputTokens?: number | undefined;
15
+ outputTokens?: number | undefined;
16
+ onStop?: (() => void) | undefined;
17
+ stopping?: boolean;
18
+ /** Replaces the turn's word, the way a running hook names itself. */
19
+ word?: string | undefined;
20
+ testId?: string;
21
+ }): import("react").JSX.Element;
@@ -0,0 +1,151 @@
1
+ import { LoaderIcon, StopSolidIcon } from "../../../icons.js";
2
+ import { useChatConfig } from "../../core/config.js";
3
+ import cx from "classnames";
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { DateTime } from "luxon";
7
+ //#region src/ai/components/agent/ActivityLine.tsx
8
+ /** The agent status words: one is picked per turn and held until it ends. */
9
+ var activityWords = [
10
+ "Thinking",
11
+ "Cogitating",
12
+ "Pondering",
13
+ "Percolating",
14
+ "Ruminating",
15
+ "Noodling",
16
+ "Conjuring",
17
+ "Simmering",
18
+ "Marinating",
19
+ "Tinkering",
20
+ "Scheming",
21
+ "Brewing",
22
+ "Wrangling",
23
+ "Finagling",
24
+ "Spelunking",
25
+ "Puttering",
26
+ "Composing",
27
+ "Synthesizing",
28
+ "Deliberating",
29
+ "Mulling",
30
+ "Contemplating",
31
+ "Vibing",
32
+ "Whittling",
33
+ "Concocting",
34
+ "Formulating",
35
+ "Hatching",
36
+ "Herding",
37
+ "Ideating",
38
+ "Manifesting",
39
+ "Moseying",
40
+ "Musing",
41
+ "Percussing",
42
+ "Reticulating",
43
+ "Schlepping",
44
+ "Stewing",
45
+ "Transmuting",
46
+ "Wibbling",
47
+ "Crunching",
48
+ "Forging",
49
+ "Cooking"
50
+ ];
51
+ function randomActivityWord() {
52
+ return activityWords[Math.floor(Math.random() * activityWords.length)];
53
+ }
54
+ /** Elapsed run time the way an agent status line prints it: 45s, 2m13s,
55
+ * 1h2m3s. */
56
+ function formatElapsed(seconds) {
57
+ const total = Math.max(0, Math.floor(seconds));
58
+ const hours = Math.floor(total / 3600);
59
+ const minutes = Math.floor(total % 3600 / 60);
60
+ const rest = total % 60;
61
+ if (hours > 0) return `${hours}h${minutes}m${rest}s`;
62
+ if (minutes > 0) return `${minutes}m${rest}s`;
63
+ return `${rest}s`;
64
+ }
65
+ /** Token counts the way an agent status line prints them: 512, 1.2k, 3.4M. */
66
+ function compactCount(n) {
67
+ if (n >= 1e6) return `${(n / 1e6).toFixed(1)}M`;
68
+ if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;
69
+ return String(Math.floor(n));
70
+ }
71
+ function secondsSince(iso) {
72
+ return Math.max(0, DateTime.now().diff(DateTime.fromISO(iso)).as("seconds"));
73
+ }
74
+ /** Seconds since `startedAt`, re-read every second; null when there is no
75
+ * start to count from. */
76
+ function useElapsedSeconds(startedAt) {
77
+ const [elapsed, setElapsed] = useState(() => startedAt ? secondsSince(startedAt) : null);
78
+ useEffect(() => {
79
+ if (!startedAt) {
80
+ setElapsed(null);
81
+ return;
82
+ }
83
+ setElapsed(secondsSince(startedAt));
84
+ const id = setInterval(() => setElapsed(secondsSince(startedAt)), 1e3);
85
+ return () => clearInterval(id);
86
+ }, [startedAt]);
87
+ return elapsed;
88
+ }
89
+ /** A status word held for the whole turn and re-rolled when a new one starts. */
90
+ function useTurnWord(startedAt) {
91
+ const [word, setWord] = useState(randomActivityWord);
92
+ const turn = useRef(startedAt);
93
+ useEffect(() => {
94
+ if (turn.current !== startedAt) {
95
+ turn.current = startedAt;
96
+ setWord(randomActivityWord());
97
+ }
98
+ }, [startedAt]);
99
+ return word;
100
+ }
101
+ /** The terminal's "it's working" line for a running turn: spinner, status
102
+ * word, how long the turn has run, its token counts so far, and a way to
103
+ * stop it. */
104
+ function ActivityLine({ startedAt, inputTokens, outputTokens, onStop, stopping = false, word, testId }) {
105
+ const { strings } = useChatConfig();
106
+ const elapsed = useElapsedSeconds(startedAt);
107
+ const turnWord = useTurnWord(startedAt);
108
+ const meta = [];
109
+ if (elapsed !== null) meta.push(formatElapsed(elapsed));
110
+ if (inputTokens || outputTokens) meta.push(strings.activity.tokens(compactCount(inputTokens ?? 0), compactCount(outputTokens ?? 0)));
111
+ return /* @__PURE__ */ jsxs("div", {
112
+ "data-testid": testId,
113
+ className: "flex min-h-8 items-center gap-2 px-1 text-sm",
114
+ children: [
115
+ /* @__PURE__ */ jsx(LoaderIcon, {
116
+ className: "h-3.5 w-3.5 shrink-0 animate-spin text-(--theme-element) motion-reduce:hidden",
117
+ "aria-hidden": "true"
118
+ }),
119
+ /* @__PURE__ */ jsx("span", {
120
+ className: "hidden shrink-0 leading-none text-(--theme-element) motion-reduce:inline",
121
+ "aria-hidden": "true",
122
+ children: "●"
123
+ }),
124
+ /* @__PURE__ */ jsxs("span", {
125
+ "data-testid": testId ? `${testId}-word` : void 0,
126
+ className: "min-w-0 truncate text-(--theme-element)",
127
+ children: [word ?? turnWord, "…"]
128
+ }),
129
+ meta.length > 0 && /* @__PURE__ */ jsxs("span", {
130
+ "data-testid": testId ? `${testId}-meta` : void 0,
131
+ className: "shrink-0 text-xs tabular-nums theme-muted-text",
132
+ children: [
133
+ "(",
134
+ meta.join(" · "),
135
+ ")"
136
+ ]
137
+ }),
138
+ onStop && /* @__PURE__ */ jsxs("button", {
139
+ type: "button",
140
+ onClick: onStop,
141
+ disabled: stopping,
142
+ "aria-label": strings.input.stopGenerating,
143
+ title: strings.input.stopGenerating,
144
+ className: cx("ml-auto inline-flex h-7 items-center gap-1.5 rounded-md px-2 text-xs theme-muted-text transition-colors", "hover:theme-hover hover:theme-text disabled:cursor-not-allowed disabled:opacity-50"),
145
+ children: [/* @__PURE__ */ jsx(StopSolidIcon, { className: "h-3 w-3" }), strings.activity.stop]
146
+ })
147
+ ]
148
+ });
149
+ }
150
+ //#endregion
151
+ export { activityWords, compactCount, ActivityLine as default, formatElapsed, randomActivityWord };
@@ -0,0 +1,54 @@
1
+ import { type PartRendererProps } from '../../core/config.js';
2
+ import type { ApprovalPart, MessagePart, NoticePart, ReasoningPart, SubagentPart, TodoSnapshotPart, ToolCallPart } from '../../types.js';
3
+ export declare function ToolCallBlock({ part }: {
4
+ part: ToolCallPart;
5
+ }): import("react").JSX.Element;
6
+ /** Drawn the way the TUI draws a delegated Task: a tool-shaped header
7
+ * `Task(description)`, and under it the latest action while running or
8
+ * `Done (summary)` once finished. Expanding shows the whole activity feed. */
9
+ export declare function SubagentCard({ part }: {
10
+ part: SubagentPart;
11
+ }): import("react").JSX.Element;
12
+ export declare function ApprovalBlock({ part, onApprovalAnswer, }: {
13
+ part: ApprovalPart;
14
+ onApprovalAnswer?: PartRendererProps['onApprovalAnswer'];
15
+ }): import("react").JSX.Element;
16
+ export declare function TodoSnapshotBlock({ part }: {
17
+ part: TodoSnapshotPart;
18
+ }): import("react").JSX.Element;
19
+ export declare function NoticeBlock({ part }: {
20
+ part: NoticePart;
21
+ }): import("react").JSX.Element;
22
+ /** The TUI's thought: the body shows while it streams, then folds to its
23
+ * label and opens on request. The composer's activity line carries the
24
+ * live signal, so nothing here animates. */
25
+ export declare function ReasoningBlock({ part, isStreaming, }: {
26
+ part: ReasoningPart;
27
+ isStreaming?: boolean;
28
+ }): import("react").JSX.Element;
29
+ type RunMember = {
30
+ part: ToolCallPart | ReasoningPart;
31
+ index: number;
32
+ };
33
+ type RenderItem = {
34
+ kind: 'single';
35
+ part: MessagePart;
36
+ index: number;
37
+ } | {
38
+ kind: 'reasoning';
39
+ parts: ReasoningPart[];
40
+ index: number;
41
+ } | {
42
+ kind: 'rollup';
43
+ members: RunMember[];
44
+ };
45
+ /** Two thoughts with nothing visible between them read as one, not as a
46
+ * stack of identical lines. */
47
+ export declare function mergeReasoning(parts: ReasoningPart[]): ReasoningPart;
48
+ export declare function buildRenderItems(parts: MessagePart[]): RenderItem[];
49
+ export default function AgentMessageParts({ message, isStreaming, onApprovalAnswer, }: {
50
+ message: PartRendererProps['message'];
51
+ isStreaming?: boolean;
52
+ onApprovalAnswer?: PartRendererProps['onApprovalAnswer'];
53
+ }): import("react").JSX.Element;
54
+ export {};