@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,112 @@
1
+ //#region src/ai/adapter/openai/sse.ts
2
+ function parseSSELine(line) {
3
+ if (!line.startsWith("data: ")) return null;
4
+ const data = line.slice(6);
5
+ if (data === "[DONE]" || data === "\"[DONE]\"") return null;
6
+ try {
7
+ const parsed = JSON.parse(data);
8
+ if (parsed.error) return { error: parsed.error.message || "Unknown error" };
9
+ const chunk = parsed;
10
+ const choice = chunk.choices?.[0];
11
+ return {
12
+ id: chunk.id,
13
+ messageId: chunk.messageId,
14
+ content: choice?.delta?.content,
15
+ reasoningContent: choice?.delta?.reasoning_content,
16
+ toolCalls: choice?.delta?.tool_calls ?? void 0,
17
+ finishReason: choice?.finish_reason,
18
+ model: chunk.model
19
+ };
20
+ } catch {
21
+ return null;
22
+ }
23
+ }
24
+ /** Process an SSE stream from a ReadableStream reader */
25
+ async function processSSEStream(reader, onContent, onToolCall, onError, onReasoning, onMessageId, parseLine = parseSSELine) {
26
+ const decoder = new TextDecoder();
27
+ let assistantContent = "";
28
+ let assistantReasoning = "";
29
+ let assistantMessageId = "";
30
+ let finishReason = null;
31
+ let resolvedModel = null;
32
+ let responsesOutput = [];
33
+ const toolCallsMap = /* @__PURE__ */ new Map();
34
+ let lineBuffer = "";
35
+ while (true) {
36
+ const result = await reader.read();
37
+ if (result.done) break;
38
+ const chunk = decoder.decode(result.value, { stream: true });
39
+ const lines = (lineBuffer + chunk).split("\n");
40
+ lineBuffer = lines.pop() || "";
41
+ for (const line of lines) {
42
+ const parsed = parseLine(line);
43
+ if (parsed) {
44
+ if (parsed.error) {
45
+ onError?.(parsed.error);
46
+ throw new Error(parsed.error);
47
+ }
48
+ if (parsed.messageId && !assistantMessageId) {
49
+ assistantMessageId = parsed.messageId;
50
+ onMessageId?.(parsed.messageId);
51
+ } else if (parsed.id && !assistantMessageId) assistantMessageId = parsed.id;
52
+ if (parsed.model && !resolvedModel) resolvedModel = parsed.model;
53
+ if (parsed.content) {
54
+ assistantContent += parsed.content;
55
+ onContent(parsed.content);
56
+ }
57
+ if (parsed.reasoningContent) {
58
+ assistantReasoning += parsed.reasoningContent;
59
+ onReasoning?.(parsed.reasoningContent);
60
+ }
61
+ if (parsed.finishReason) finishReason = parsed.finishReason;
62
+ if (parsed.responsesOutput?.length) responsesOutput = parsed.responsesOutput;
63
+ if (parsed.toolCalls) for (const tc of parsed.toolCalls) {
64
+ if (tc.index === void 0) continue;
65
+ const existing = toolCallsMap.get(tc.index);
66
+ if (existing) {
67
+ if (tc.function?.arguments) existing.arguments += tc.function.arguments;
68
+ } else toolCallsMap.set(tc.index, {
69
+ id: tc.id || "",
70
+ type: tc.type || "function",
71
+ name: tc.function?.name || "",
72
+ arguments: tc.function?.arguments || ""
73
+ });
74
+ }
75
+ }
76
+ }
77
+ }
78
+ if (lineBuffer.trim()) {
79
+ const parsed = parseLine(lineBuffer);
80
+ if (parsed) {
81
+ if (parsed.content) {
82
+ assistantContent += parsed.content;
83
+ onContent(parsed.content);
84
+ }
85
+ if (parsed.reasoningContent) {
86
+ assistantReasoning += parsed.reasoningContent;
87
+ onReasoning?.(parsed.reasoningContent);
88
+ }
89
+ if (parsed.finishReason) finishReason = parsed.finishReason;
90
+ }
91
+ }
92
+ const toolCalls = Array.from(toolCallsMap.values()).map((tc) => ({
93
+ id: tc.id,
94
+ type: tc.type,
95
+ function: {
96
+ name: tc.name,
97
+ arguments: tc.arguments
98
+ }
99
+ }));
100
+ if (toolCalls.length > 0 && onToolCall) onToolCall(toolCalls);
101
+ return {
102
+ content: assistantContent,
103
+ messageId: assistantMessageId,
104
+ toolCalls,
105
+ finishReason,
106
+ model: resolvedModel,
107
+ reasoning: assistantReasoning,
108
+ responsesOutput
109
+ };
110
+ }
111
+ //#endregion
112
+ export { parseSSELine, processSSEStream };
@@ -0,0 +1,40 @@
1
+ import type { ChatModel, TokenUsage, ToolCall, ToolCallDelta, UnreachableSession } from '../../types.js';
2
+ export interface CompletionMessage {
3
+ role: string;
4
+ content?: unknown;
5
+ name?: string;
6
+ reasoning_content?: string;
7
+ responses_output?: unknown[] | null;
8
+ tool_call_id?: string;
9
+ tool_calls?: ToolCall[] | null;
10
+ attachment_ids?: string[] | null | undefined;
11
+ }
12
+ export interface CompletionRequest {
13
+ model: string;
14
+ messages: CompletionMessage[];
15
+ stream?: boolean;
16
+ [key: string]: unknown;
17
+ }
18
+ export interface CompletionChunkChoice {
19
+ delta?: {
20
+ content?: unknown;
21
+ reasoning_content?: string;
22
+ tool_calls?: ToolCallDelta[] | null;
23
+ };
24
+ finish_reason?: string | null;
25
+ index?: number;
26
+ }
27
+ export interface CompletionChunk {
28
+ id: string;
29
+ model: string;
30
+ object?: string;
31
+ created?: number;
32
+ messageId?: string;
33
+ choices?: CompletionChunkChoice[] | null;
34
+ usage?: TokenUsage;
35
+ }
36
+ export interface ModelsWireResponse {
37
+ object: string;
38
+ data: ChatModel[] | null;
39
+ unreachable_sessions?: UnreachableSession[] | null;
40
+ }
@@ -0,0 +1,131 @@
1
+ import type { Allocation, ApprovalPart, AttachmentRef, ChatModel, Conversation, ConversationSummary, ProviderInfo, ShareGroup, SharePermission, SharePermissionLevel, TodoItem, ToolCall, UnreachableSession } from '../types.js';
2
+ import type { CompletionMessage } from './openai/wire.js';
3
+ export declare class ChatAdapterError extends Error {
4
+ status?: number | undefined;
5
+ constructor(message: string, options?: {
6
+ status?: number;
7
+ cause?: unknown;
8
+ });
9
+ }
10
+ export interface ModelsList {
11
+ models: ChatModel[];
12
+ unreachableSessions: UnreachableSession[];
13
+ }
14
+ export interface StreamRequest {
15
+ model: string;
16
+ messages: CompletionMessage[];
17
+ conversationId: string;
18
+ parentMessageId?: string | null;
19
+ userMessageId: string;
20
+ allocation?: string | null;
21
+ useResponses?: boolean;
22
+ }
23
+ export interface StreamHandlers {
24
+ onContent: (content: string) => void;
25
+ onReasoning?: (reasoning: string) => void;
26
+ onMessageId?: (messageId: string) => void;
27
+ onPart?: (delta: PartDelta) => void;
28
+ }
29
+ export type PartDelta = {
30
+ type: 'tool_start';
31
+ id: string;
32
+ name: string;
33
+ args: string;
34
+ startLine?: number;
35
+ } | {
36
+ type: 'tool_update';
37
+ id: string;
38
+ args: string;
39
+ } | {
40
+ type: 'tool_end';
41
+ id: string;
42
+ result: string;
43
+ isError?: boolean;
44
+ } | {
45
+ type: 'subagent_start';
46
+ id: string;
47
+ agentType?: string;
48
+ color?: string;
49
+ background?: boolean;
50
+ description?: string;
51
+ } | {
52
+ type: 'subagent_action';
53
+ id: string;
54
+ action: string;
55
+ } | {
56
+ type: 'subagent_end';
57
+ id: string;
58
+ ok: boolean;
59
+ summary?: string;
60
+ report?: string;
61
+ } | {
62
+ type: 'approval_request';
63
+ approval: ApprovalPart;
64
+ } | {
65
+ type: 'approval_resolved';
66
+ id: string;
67
+ answer?: string;
68
+ } | {
69
+ type: 'notice' | 'warning';
70
+ text: string;
71
+ } | {
72
+ type: 'todo_snapshot';
73
+ todos: TodoItem[];
74
+ };
75
+ export interface StreamResult {
76
+ content: string;
77
+ messageId: string;
78
+ toolCalls: ToolCall[];
79
+ finishReason: string | null;
80
+ model: string | null;
81
+ reasoning: string;
82
+ responsesOutput: unknown[];
83
+ }
84
+ export type StreamCompletion = (req: StreamRequest, handlers: StreamHandlers, signal?: AbortSignal) => Promise<StreamResult>;
85
+ export interface ConversationsAdapter {
86
+ list(): Promise<ConversationSummary[]>;
87
+ get(id: string): Promise<Conversation>;
88
+ create(title?: string): Promise<ConversationSummary>;
89
+ rename(id: string, title: string): Promise<void>;
90
+ remove(id: string): Promise<void>;
91
+ }
92
+ export interface ProvidersAdapter {
93
+ list(): Promise<ProviderInfo[]>;
94
+ }
95
+ export interface AttachmentPage {
96
+ attachments: AttachmentRef[];
97
+ total: number;
98
+ nextCursor?: string;
99
+ hasMore: boolean;
100
+ }
101
+ export interface AttachmentsAdapter {
102
+ list(opts: {
103
+ limit: number;
104
+ cursor?: string;
105
+ }): Promise<AttachmentPage>;
106
+ upload(file: File, conversationId?: string): Promise<AttachmentRef>;
107
+ remove(id: string): Promise<void>;
108
+ downloadUrl(id: string): string;
109
+ onOpen?(attachment: AttachmentRef): void;
110
+ }
111
+ export interface SharingAdapter {
112
+ listPermissions(conversationId: string): Promise<SharePermission[]>;
113
+ listGroups(): Promise<ShareGroup[]>;
114
+ addPermission(conversationId: string, permission: Omit<SharePermission, 'id' | 'teamName'>): Promise<void>;
115
+ updatePermission(conversationId: string, permissionId: string, permission: SharePermissionLevel): Promise<void>;
116
+ removePermission(conversationId: string, permissionId: string): Promise<void>;
117
+ }
118
+ export interface AllocationsAdapter {
119
+ list(): Promise<Allocation[]>;
120
+ }
121
+ export interface ChatAdapter {
122
+ conversations: ConversationsAdapter;
123
+ models: {
124
+ list(): Promise<ModelsList>;
125
+ };
126
+ streamCompletion: StreamCompletion;
127
+ providers?: ProvidersAdapter;
128
+ attachments?: AttachmentsAdapter;
129
+ sharing?: SharingAdapter;
130
+ allocations?: AllocationsAdapter;
131
+ }
@@ -0,0 +1,11 @@
1
+ //#region src/ai/adapter/types.ts
2
+ var ChatAdapterError = class extends Error {
3
+ status;
4
+ constructor(message, options) {
5
+ super(message, options?.cause === void 0 ? {} : { cause: options.cause });
6
+ this.name = "ChatAdapterError";
7
+ this.status = options?.status;
8
+ }
9
+ };
10
+ //#endregion
11
+ export { ChatAdapterError };
@@ -0,0 +1,2 @@
1
+ import type { PseudoUserKind } from '../types.js';
2
+ export declare function classifyPseudoUserMessage(role: string, content: string | null | undefined): PseudoUserKind | null;
@@ -0,0 +1,12 @@
1
+ //#region src/ai/agent/classifier.ts
2
+ var COMPACTION_MARKER = "[Conversation summary from automatic compaction]";
3
+ function classifyPseudoUserMessage(role, content) {
4
+ if (role !== "user" || !content) return null;
5
+ const t = content.trimStart();
6
+ if (t.startsWith("<command-input>")) return "command-input";
7
+ if (t.startsWith("<shell-input>")) return "shell-input";
8
+ if (t.startsWith(COMPACTION_MARKER)) return "compaction";
9
+ return null;
10
+ }
11
+ //#endregion
12
+ export { classifyPseudoUserMessage };
@@ -0,0 +1,35 @@
1
+ export declare const MAX_EDIT_DIFF_LINES = 100;
2
+ export declare const MAX_WRITE_DIFF_LINES = 50;
3
+ export declare const DIFF_CONTEXT = 3;
4
+ export interface EditToolArgs {
5
+ path?: string;
6
+ old_string?: string;
7
+ new_string?: string;
8
+ content?: string;
9
+ replace_all?: boolean;
10
+ }
11
+ export declare function isEditDiffTool(name: string): boolean;
12
+ export declare function parseEditArgs(argsJSON: string): EditToolArgs | null;
13
+ export declare function wordEmphasisRanges(oldLine: string, newLine: string): Array<[number, number]> | null;
14
+ export declare function lineDelta(oldLines: string[], newLines: string[]): [number, number];
15
+ export interface DiffRow {
16
+ kind: 'add' | 'del' | 'ctx' | 'gap';
17
+ oldNo?: number;
18
+ newNo?: number;
19
+ text: string;
20
+ emphasis?: Array<[number, number]>;
21
+ }
22
+ export interface EditDiffModel {
23
+ rows: DiffRow[];
24
+ added: number;
25
+ removed: number;
26
+ truncated: boolean;
27
+ }
28
+ export declare function computeEditDiff(oldString: string, newString: string, startLine?: number): EditDiffModel;
29
+ export interface WriteModel {
30
+ rows: DiffRow[];
31
+ total: number;
32
+ truncated: boolean;
33
+ }
34
+ export declare function computeWriteRows(content: string): WriteModel;
35
+ export declare function editSummary(toolName: string, argsJSON: string): string;
@@ -0,0 +1,223 @@
1
+ import { sanitizeLabel } from "./toolfmt.js";
2
+ //#region src/ai/agent/diff.ts
3
+ var MAX_EDIT_DIFF_LINES = 100;
4
+ var MAX_WRITE_DIFF_LINES = 50;
5
+ function isEditDiffTool(name) {
6
+ return name === "EditFile" || name === "WriteFile";
7
+ }
8
+ function parseEditArgs(argsJSON) {
9
+ try {
10
+ const a = JSON.parse(argsJSON);
11
+ return a && typeof a === "object" ? a : null;
12
+ } catch {
13
+ return null;
14
+ }
15
+ }
16
+ function splitLines(s) {
17
+ const trimmed = s.endsWith("\n") ? s.slice(0, -1) : s;
18
+ return trimmed === "" ? [] : trimmed.split("\n");
19
+ }
20
+ function getOpCodes(a, b) {
21
+ const n = a.length;
22
+ const m = b.length;
23
+ const lcs = Array.from({ length: n + 1 }, () => new Array(m + 1).fill(0));
24
+ for (let i = n - 1; i >= 0; i--) {
25
+ const row = lcs[i];
26
+ const next = lcs[i + 1];
27
+ if (!row || !next) continue;
28
+ for (let j = m - 1; j >= 0; j--) row[j] = a[i] === b[j] ? (next[j + 1] ?? 0) + 1 : Math.max(next[j] ?? 0, row[j + 1] ?? 0);
29
+ }
30
+ const ops = [];
31
+ let i = 0;
32
+ let j = 0;
33
+ const push = (tag, i1, i2, j1, j2) => {
34
+ const last = ops[ops.length - 1];
35
+ if (last && last.tag === tag && last.i2 === i1 && last.j2 === j1) {
36
+ last.i2 = i2;
37
+ last.j2 = j2;
38
+ return;
39
+ }
40
+ ops.push({
41
+ tag,
42
+ i1,
43
+ i2,
44
+ j1,
45
+ j2
46
+ });
47
+ };
48
+ while (i < n && j < m) if (a[i] === b[j]) {
49
+ push("e", i, i + 1, j, j + 1);
50
+ i++;
51
+ j++;
52
+ } else if ((lcs[i + 1]?.[j] ?? 0) >= (lcs[i]?.[j + 1] ?? 0)) {
53
+ push("d", i, i + 1, j, j);
54
+ i++;
55
+ } else {
56
+ push("i", i, i, j, j + 1);
57
+ j++;
58
+ }
59
+ if (i < n) push("d", i, n, j, j);
60
+ if (j < m) push("i", i, i, j, m);
61
+ const merged = [];
62
+ for (const op of ops) {
63
+ const last = merged[merged.length - 1];
64
+ if (last && (last.tag === "d" && op.tag === "i" || last.tag === "i" && op.tag === "d")) {
65
+ merged[merged.length - 1] = {
66
+ tag: "r",
67
+ i1: Math.min(last.i1, op.i1),
68
+ i2: Math.max(last.i2, op.i2),
69
+ j1: Math.min(last.j1, op.j1),
70
+ j2: Math.max(last.j2, op.j2)
71
+ };
72
+ continue;
73
+ }
74
+ merged.push(op);
75
+ }
76
+ return merged;
77
+ }
78
+ function tokenizeWords(line) {
79
+ return line.match(/\w+|\s+|[^\w\s]+/g) ?? [];
80
+ }
81
+ function wordEmphasisRanges(oldLine, newLine) {
82
+ const a = tokenizeWords(oldLine);
83
+ const b = tokenizeWords(newLine);
84
+ if (a.length === 0 || b.length === 0) return null;
85
+ const ops = getOpCodes(a, b);
86
+ if (!ops.some((op) => op.tag === "e" && a.slice(op.i1, op.i2).some((t) => /\w/.test(t)))) return null;
87
+ const starts = [];
88
+ let pos = 0;
89
+ for (const t of b) {
90
+ starts.push(pos);
91
+ pos += t.length;
92
+ }
93
+ starts.push(pos);
94
+ const ranges = [];
95
+ for (const op of ops) {
96
+ if (op.tag !== "i" && op.tag !== "r") continue;
97
+ if (op.j1 >= op.j2) continue;
98
+ const start = starts[op.j1] ?? 0;
99
+ const end = starts[op.j2] ?? pos;
100
+ const last = ranges[ranges.length - 1];
101
+ if (last && last[1] === start) last[1] = end;
102
+ else ranges.push([start, end]);
103
+ }
104
+ return ranges.length > 0 ? ranges : null;
105
+ }
106
+ function lineDelta(oldLines, newLines) {
107
+ let added = 0;
108
+ let removed = 0;
109
+ for (const op of getOpCodes(oldLines, newLines)) {
110
+ if (op.tag === "d" || op.tag === "r") removed += op.i2 - op.i1;
111
+ if (op.tag === "i" || op.tag === "r") added += op.j2 - op.j1;
112
+ }
113
+ return [added, removed];
114
+ }
115
+ function computeEditDiff(oldString, newString, startLine = 0) {
116
+ const oldLines = splitLines(oldString);
117
+ const newLines = splitLines(newString);
118
+ const [added, removed] = lineDelta(oldLines, newLines);
119
+ const ops = getOpCodes(oldLines, newLines);
120
+ const numbered = startLine > 0;
121
+ const rows = [];
122
+ let truncated = false;
123
+ const push = (row) => {
124
+ if (rows.length >= 100) {
125
+ truncated = true;
126
+ return false;
127
+ }
128
+ rows.push(row);
129
+ return true;
130
+ };
131
+ outer: for (let k = 0; k < ops.length; k++) {
132
+ const op = ops[k];
133
+ if (!op) continue;
134
+ if (op.tag === "e") {
135
+ const len = op.i2 - op.i1;
136
+ const leading = k > 0 ? Math.min(3, len) : 0;
137
+ const trailing = k < ops.length - 1 ? Math.min(3, len) : 0;
138
+ const showAll = len <= leading + trailing;
139
+ const emit = (offset) => {
140
+ const oldNo = op.i1 + offset + 1;
141
+ const newNo = op.j1 + offset + 1;
142
+ return push({
143
+ kind: "ctx",
144
+ text: oldLines[op.i1 + offset] ?? "",
145
+ ...numbered ? {
146
+ oldNo: startLine + oldNo - 1,
147
+ newNo: startLine + newNo - 1
148
+ } : {}
149
+ });
150
+ };
151
+ if (showAll) {
152
+ for (let x = 0; x < len; x++) if (!emit(x)) break outer;
153
+ } else {
154
+ for (let x = 0; x < leading; x++) if (!emit(x)) break outer;
155
+ if (!push({
156
+ kind: "gap",
157
+ text: ""
158
+ })) break;
159
+ for (let x = len - trailing; x < len; x++) if (!emit(x)) break outer;
160
+ }
161
+ continue;
162
+ }
163
+ if (op.tag === "d" || op.tag === "r") {
164
+ for (let x = op.i1; x < op.i2; x++) if (!push({
165
+ kind: "del",
166
+ text: oldLines[x] ?? "",
167
+ ...numbered ? { oldNo: startLine + x } : {}
168
+ })) break outer;
169
+ }
170
+ if (op.tag === "i" || op.tag === "r") {
171
+ const paired = op.tag === "r" ? Math.min(op.i2 - op.i1, op.j2 - op.j1) : 0;
172
+ for (let x = op.j1; x < op.j2; x++) {
173
+ const k = x - op.j1;
174
+ const emphasis = k < paired ? wordEmphasisRanges(oldLines[op.i1 + k] ?? "", newLines[x] ?? "") : null;
175
+ if (!push({
176
+ kind: "add",
177
+ text: newLines[x] ?? "",
178
+ ...numbered ? { newNo: startLine + x } : {},
179
+ ...emphasis ? { emphasis } : {}
180
+ })) break outer;
181
+ }
182
+ }
183
+ }
184
+ return {
185
+ rows,
186
+ added,
187
+ removed,
188
+ truncated
189
+ };
190
+ }
191
+ function computeWriteRows(content) {
192
+ const lines = splitLines(content);
193
+ return {
194
+ rows: lines.slice(0, 50).map((text, i) => ({
195
+ kind: "ctx",
196
+ newNo: i + 1,
197
+ text
198
+ })),
199
+ total: lines.length,
200
+ truncated: lines.length > 50
201
+ };
202
+ }
203
+ function editSummary(toolName, argsJSON) {
204
+ const a = parseEditArgs(argsJSON);
205
+ if (!a) return "";
206
+ const count = (n) => `${n} ${n === 1 ? "line" : "lines"}`;
207
+ if (toolName === "EditFile") {
208
+ const [added, removed] = lineDelta(splitLines(a.old_string ?? ""), splitLines(a.new_string ?? ""));
209
+ if (added > 0 && removed > 0) return `Added ${count(added)}, removed ${count(removed)}`;
210
+ if (added > 0) return `Added ${count(added)}`;
211
+ if (removed > 0) return `Removed ${count(removed)}`;
212
+ return "";
213
+ }
214
+ if (toolName === "WriteFile") {
215
+ if (a.content === void 0) return "";
216
+ let s = `Wrote ${count(splitLines(a.content).length)}`;
217
+ if (a.path) s += ` to ${sanitizeLabel(a.path)}`;
218
+ return s;
219
+ }
220
+ return "";
221
+ }
222
+ //#endregion
223
+ export { MAX_EDIT_DIFF_LINES, MAX_WRITE_DIFF_LINES, computeEditDiff, computeWriteRows, editSummary, isEditDiffTool, lineDelta, parseEditArgs, wordEmphasisRanges };
@@ -0,0 +1,6 @@
1
+ export interface DiffToken {
2
+ content: string;
3
+ color?: string;
4
+ }
5
+ export declare function languageForPath(path: string | undefined): string | null;
6
+ export declare function tokenizeDiffLines(lines: string[], lang: string, isDark: boolean): Promise<DiffToken[][] | null>;
@@ -0,0 +1,101 @@
1
+ //#region src/ai/agent/diffHighlight.ts
2
+ var EXT_LANG = {
3
+ ts: "typescript",
4
+ tsx: "tsx",
5
+ mts: "typescript",
6
+ cts: "typescript",
7
+ js: "javascript",
8
+ jsx: "jsx",
9
+ mjs: "javascript",
10
+ cjs: "javascript",
11
+ go: "go",
12
+ py: "python",
13
+ rb: "ruby",
14
+ rs: "rust",
15
+ java: "java",
16
+ c: "c",
17
+ h: "c",
18
+ cc: "cpp",
19
+ cpp: "cpp",
20
+ hpp: "cpp",
21
+ cs: "csharp",
22
+ php: "php",
23
+ swift: "swift",
24
+ kt: "kotlin",
25
+ scala: "scala",
26
+ sh: "shellscript",
27
+ bash: "shellscript",
28
+ zsh: "shellscript",
29
+ fish: "fish",
30
+ ps1: "powershell",
31
+ sql: "sql",
32
+ json: "json",
33
+ jsonc: "jsonc",
34
+ yaml: "yaml",
35
+ yml: "yaml",
36
+ toml: "toml",
37
+ xml: "xml",
38
+ html: "html",
39
+ css: "css",
40
+ scss: "scss",
41
+ less: "less",
42
+ md: "markdown",
43
+ mdx: "mdx",
44
+ vue: "vue",
45
+ svelte: "svelte",
46
+ tf: "terraform",
47
+ hcl: "hcl",
48
+ proto: "proto",
49
+ graphql: "graphql",
50
+ gql: "graphql",
51
+ dockerfile: "dockerfile",
52
+ lua: "lua",
53
+ r: "r",
54
+ pl: "perl",
55
+ ex: "elixir",
56
+ exs: "elixir",
57
+ zig: "zig"
58
+ };
59
+ function languageForPath(path) {
60
+ if (!path) return null;
61
+ const base = path.split("/").pop() ?? "";
62
+ if (base.toLowerCase() === "dockerfile") return "dockerfile";
63
+ const dot = base.lastIndexOf(".");
64
+ if (dot <= 0) return null;
65
+ return EXT_LANG[base.slice(dot + 1).toLowerCase()] ?? null;
66
+ }
67
+ var highlighters = /* @__PURE__ */ new Map();
68
+ function getHighlighter(lang) {
69
+ let p = highlighters.get(lang);
70
+ if (!p) {
71
+ p = (async () => {
72
+ const [{ createHighlighter }, { createJavaScriptRegexEngine }] = await Promise.all([import("shiki"), import("shiki/engine/javascript")]);
73
+ return await createHighlighter({
74
+ langs: [lang],
75
+ themes: ["github-light", "github-dark"],
76
+ engine: createJavaScriptRegexEngine({ forgiving: true })
77
+ });
78
+ })().catch(() => null);
79
+ highlighters.set(lang, p);
80
+ }
81
+ return p;
82
+ }
83
+ async function tokenizeDiffLines(lines, lang, isDark) {
84
+ const highlighter = await getHighlighter(lang);
85
+ if (!highlighter) return null;
86
+ try {
87
+ const tokens = highlighter.codeToTokensBase(lines.join("\n"), {
88
+ lang,
89
+ theme: isDark ? "github-dark" : "github-light"
90
+ });
91
+ if (tokens.length !== lines.length) return null;
92
+ return tokens.map((line) => line.map((t) => ({
93
+ content: t.content,
94
+ ...t.color ? { color: t.color } : {}
95
+ })));
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
100
+ //#endregion
101
+ export { languageForPath, tokenizeDiffLines };
@@ -0,0 +1,6 @@
1
+ export { classifyPseudoUserMessage } from './classifier.js';
2
+ export { computeEditDiff, computeWriteRows, type DiffRow, type EditDiffModel, type EditToolArgs, editSummary, isEditDiffTool, lineDelta, MAX_EDIT_DIFF_LINES, MAX_WRITE_DIFF_LINES, parseEditArgs, type WriteModel, wordEmphasisRanges, } from './diff.js';
3
+ export { type DiffToken, languageForPath, tokenizeDiffLines, } from './diffHighlight.js';
4
+ export { clampPermissionMode, DEFAULT_PERMISSION_MODE, isNamedPermissionMode, NAMED_PERMISSION_MODES, type NamedPermissionMode, type PermissionMode, permissionModesUpTo, } from './permissions.js';
5
+ export { AGENT_COLOR_NAMES, agentColorHex, bashExitCode, clip, fullToolArgs, isGroupableTool, plural, resultFailed, rollupSentence, sanitizeLabel, sanitizePanelText, summarizeToolArgs, type ToolHeader, toolHeaderFor, toolSummary, } from './toolfmt.js';
6
+ export { agentTypeLabel, askQuestionFromArgs, firstNonEmptyLine, hiddenTranscriptTool, INTERRUPTED_NOTICE, interruptionNotice, parseSubagentNotice, planFromArgs, type SubagentNotice, subagentDeliveryLine, taskCallFromArgs, thinkingHeading, } from './transcript.js';