@flanksource/clicky-ui 0.3.55 → 0.3.56

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 (991) hide show
  1. package/NOTICE.md +6 -0
  2. package/dist/ai.cjs +6 -0
  3. package/dist/ai.js +3 -1
  4. package/dist/chat.cjs +2 -0
  5. package/dist/chat.d.ts +1 -0
  6. package/dist/chat.d.ts.map +1 -1
  7. package/dist/chat.js +2 -1
  8. package/dist/comments/CommentCard.cjs +37 -7
  9. package/dist/comments/CommentCard.cjs.map +1 -1
  10. package/dist/comments/CommentCard.d.ts +11 -1
  11. package/dist/comments/CommentCard.d.ts.map +1 -1
  12. package/dist/comments/CommentCard.js +37 -7
  13. package/dist/comments/CommentCard.js.map +1 -1
  14. package/dist/comments/CommentCardParts.cjs +9 -4
  15. package/dist/comments/CommentCardParts.cjs.map +1 -1
  16. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  17. package/dist/comments/CommentCardParts.js +9 -4
  18. package/dist/comments/CommentCardParts.js.map +1 -1
  19. package/dist/comments/CommentComposer.cjs +8 -8
  20. package/dist/comments/CommentComposer.cjs.map +1 -1
  21. package/dist/comments/CommentComposer.d.ts.map +1 -1
  22. package/dist/comments/CommentComposer.js +8 -8
  23. package/dist/comments/CommentComposer.js.map +1 -1
  24. package/dist/comments/CommentProvider.cjs +5 -1
  25. package/dist/comments/CommentProvider.cjs.map +1 -1
  26. package/dist/comments/CommentProvider.d.ts +1 -1
  27. package/dist/comments/CommentProvider.d.ts.map +1 -1
  28. package/dist/comments/CommentProvider.js +5 -1
  29. package/dist/comments/CommentProvider.js.map +1 -1
  30. package/dist/comments/CommentSidePanel.cjs +17 -11
  31. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  32. package/dist/comments/CommentSidePanel.d.ts +6 -0
  33. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  34. package/dist/comments/CommentSidePanel.js +17 -11
  35. package/dist/comments/CommentSidePanel.js.map +1 -1
  36. package/dist/comments/CommentThread.cjs +4 -1
  37. package/dist/comments/CommentThread.cjs.map +1 -1
  38. package/dist/comments/CommentThread.d.ts +4 -1
  39. package/dist/comments/CommentThread.d.ts.map +1 -1
  40. package/dist/comments/CommentThread.js +4 -1
  41. package/dist/comments/CommentThread.js.map +1 -1
  42. package/dist/comments/CommentThreadList.cjs +6 -3
  43. package/dist/comments/CommentThreadList.cjs.map +1 -1
  44. package/dist/comments/CommentThreadList.d.ts +7 -2
  45. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  46. package/dist/comments/CommentThreadList.js +6 -3
  47. package/dist/comments/CommentThreadList.js.map +1 -1
  48. package/dist/comments/MentionTextarea.cjs +1 -1
  49. package/dist/comments/MentionTextarea.cjs.map +1 -1
  50. package/dist/comments/MentionTextarea.d.ts.map +1 -1
  51. package/dist/comments/MentionTextarea.js +1 -1
  52. package/dist/comments/MentionTextarea.js.map +1 -1
  53. package/dist/comments/comment-assign.cjs +68 -0
  54. package/dist/comments/comment-assign.cjs.map +1 -0
  55. package/dist/comments/comment-assign.d.ts +31 -0
  56. package/dist/comments/comment-assign.d.ts.map +1 -0
  57. package/dist/comments/comment-assign.js +67 -0
  58. package/dist/comments/comment-assign.js.map +1 -0
  59. package/dist/comments/comment-types.cjs.map +1 -1
  60. package/dist/comments/comment-types.d.ts +39 -0
  61. package/dist/comments/comment-types.d.ts.map +1 -1
  62. package/dist/comments/comment-types.js.map +1 -1
  63. package/dist/comments/comment-utils.cjs +2 -0
  64. package/dist/comments/comment-utils.cjs.map +1 -1
  65. package/dist/comments/comment-utils.d.ts +2 -0
  66. package/dist/comments/comment-utils.d.ts.map +1 -1
  67. package/dist/comments/comment-utils.js +2 -0
  68. package/dist/comments/comment-utils.js.map +1 -1
  69. package/dist/comments.cjs +3 -0
  70. package/dist/comments.d.ts +1 -0
  71. package/dist/comments.d.ts.map +1 -1
  72. package/dist/comments.js +2 -1
  73. package/dist/components/ComboboxMenu.cjs +23 -13
  74. package/dist/components/ComboboxMenu.cjs.map +1 -1
  75. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  76. package/dist/components/ComboboxMenu.js +23 -13
  77. package/dist/components/ComboboxMenu.js.map +1 -1
  78. package/dist/components/FilterBar.cjs +29 -6
  79. package/dist/components/FilterBar.cjs.map +1 -1
  80. package/dist/components/FilterBar.d.ts +3 -1
  81. package/dist/components/FilterBar.d.ts.map +1 -1
  82. package/dist/components/FilterBar.js +29 -6
  83. package/dist/components/FilterBar.js.map +1 -1
  84. package/dist/components/ItemActions.cjs +1 -1
  85. package/dist/components/ItemActions.cjs.map +1 -1
  86. package/dist/components/ItemActions.js +1 -1
  87. package/dist/components/ItemActions.js.map +1 -1
  88. package/dist/components/ListMenu.cjs +33 -3
  89. package/dist/components/ListMenu.cjs.map +1 -1
  90. package/dist/components/ListMenu.d.ts +4 -1
  91. package/dist/components/ListMenu.d.ts.map +1 -1
  92. package/dist/components/ListMenu.js +33 -3
  93. package/dist/components/ListMenu.js.map +1 -1
  94. package/dist/components/ListMenuItems.cjs +80 -0
  95. package/dist/components/ListMenuItems.cjs.map +1 -0
  96. package/dist/components/ListMenuItems.d.ts +8 -0
  97. package/dist/components/ListMenuItems.d.ts.map +1 -0
  98. package/dist/components/ListMenuItems.js +80 -0
  99. package/dist/components/ListMenuItems.js.map +1 -0
  100. package/dist/components/LocalPathPicker.cjs +182 -0
  101. package/dist/components/LocalPathPicker.cjs.map +1 -0
  102. package/dist/components/LocalPathPicker.d.ts +11 -0
  103. package/dist/components/LocalPathPicker.d.ts.map +1 -0
  104. package/dist/components/LocalPathPicker.js +182 -0
  105. package/dist/components/LocalPathPicker.js.map +1 -0
  106. package/dist/components/LocalPathTree.cjs +89 -0
  107. package/dist/components/LocalPathTree.cjs.map +1 -0
  108. package/dist/components/LocalPathTree.d.ts +9 -0
  109. package/dist/components/LocalPathTree.d.ts.map +1 -0
  110. package/dist/components/LocalPathTree.js +89 -0
  111. package/dist/components/LocalPathTree.js.map +1 -0
  112. package/dist/components/RangeSlider.cjs +10 -30
  113. package/dist/components/RangeSlider.cjs.map +1 -1
  114. package/dist/components/RangeSlider.d.ts.map +1 -1
  115. package/dist/components/RangeSlider.js +4 -24
  116. package/dist/components/RangeSlider.js.map +1 -1
  117. package/dist/components/Slider.cjs +79 -0
  118. package/dist/components/Slider.cjs.map +1 -0
  119. package/dist/components/Slider.d.ts +23 -0
  120. package/dist/components/Slider.d.ts.map +1 -0
  121. package/dist/components/Slider.js +79 -0
  122. package/dist/components/Slider.js.map +1 -0
  123. package/dist/components/combobox-types.d.ts +4 -1
  124. package/dist/components/combobox-types.d.ts.map +1 -1
  125. package/dist/components/filter-bar-field-utils.cjs +3 -5
  126. package/dist/components/filter-bar-field-utils.cjs.map +1 -1
  127. package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
  128. package/dist/components/filter-bar-field-utils.js +3 -5
  129. package/dist/components/filter-bar-field-utils.js.map +1 -1
  130. package/dist/components/filter-bar-tree-model.cjs +22 -0
  131. package/dist/components/filter-bar-tree-model.cjs.map +1 -0
  132. package/dist/components/filter-bar-tree-model.d.ts +33 -0
  133. package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
  134. package/dist/components/filter-bar-tree-model.js +21 -0
  135. package/dist/components/filter-bar-tree-model.js.map +1 -0
  136. package/dist/components/filter-bar-tree.cjs +84 -0
  137. package/dist/components/filter-bar-tree.cjs.map +1 -0
  138. package/dist/components/filter-bar-tree.d.ts +7 -0
  139. package/dist/components/filter-bar-tree.d.ts.map +1 -0
  140. package/dist/components/filter-bar-tree.js +84 -0
  141. package/dist/components/filter-bar-tree.js.map +1 -0
  142. package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
  143. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
  144. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
  145. package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
  146. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
  147. package/dist/components/json-schema-form-help-links.cjs +18 -0
  148. package/dist/components/json-schema-form-help-links.cjs.map +1 -0
  149. package/dist/components/json-schema-form-help-links.d.ts +5 -0
  150. package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
  151. package/dist/components/json-schema-form-help-links.js +18 -0
  152. package/dist/components/json-schema-form-help-links.js.map +1 -0
  153. package/dist/components/json-schema-form-help-model.cjs +7 -0
  154. package/dist/components/json-schema-form-help-model.cjs.map +1 -0
  155. package/dist/components/json-schema-form-help-model.d.ts +3 -0
  156. package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
  157. package/dist/components/json-schema-form-help-model.js +7 -0
  158. package/dist/components/json-schema-form-help-model.js.map +1 -0
  159. package/dist/components/json-schema-form-json.cjs +48 -0
  160. package/dist/components/json-schema-form-json.cjs.map +1 -0
  161. package/dist/components/json-schema-form-json.d.ts +7 -0
  162. package/dist/components/json-schema-form-json.d.ts.map +1 -0
  163. package/dist/components/json-schema-form-json.js +48 -0
  164. package/dist/components/json-schema-form-json.js.map +1 -0
  165. package/dist/components/json-schema-form-layout.cjs +7 -5
  166. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  167. package/dist/components/json-schema-form-layout.d.ts +2 -2
  168. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  169. package/dist/components/json-schema-form-layout.js +7 -5
  170. package/dist/components/json-schema-form-layout.js.map +1 -1
  171. package/dist/components/json-schema-form-object.cjs +2 -13
  172. package/dist/components/json-schema-form-object.cjs.map +1 -1
  173. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  174. package/dist/components/json-schema-form-object.js +2 -13
  175. package/dist/components/json-schema-form-object.js.map +1 -1
  176. package/dist/components/json-schema-form-refs.cjs +1 -1
  177. package/dist/components/json-schema-form-refs.cjs.map +1 -1
  178. package/dist/components/json-schema-form-refs.d.ts.map +1 -1
  179. package/dist/components/json-schema-form-refs.js +1 -1
  180. package/dist/components/json-schema-form-refs.js.map +1 -1
  181. package/dist/components/json-schema-form-render.cjs +20 -6
  182. package/dist/components/json-schema-form-render.cjs.map +1 -1
  183. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  184. package/dist/components/json-schema-form-render.js +20 -6
  185. package/dist/components/json-schema-form-render.js.map +1 -1
  186. package/dist/components/json-schema-form-resolve.cjs +22 -2
  187. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  188. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  189. package/dist/components/json-schema-form-resolve.js +22 -2
  190. package/dist/components/json-schema-form-resolve.js.map +1 -1
  191. package/dist/components/json-schema-form-types.d.ts +5 -1
  192. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  193. package/dist/components/json-schema-form-union-model.cjs +46 -0
  194. package/dist/components/json-schema-form-union-model.cjs.map +1 -0
  195. package/dist/components/json-schema-form-union-model.d.ts +6 -0
  196. package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
  197. package/dist/components/json-schema-form-union-model.js +43 -0
  198. package/dist/components/json-schema-form-union-model.js.map +1 -0
  199. package/dist/components/json-schema-form-union.cjs +52 -0
  200. package/dist/components/json-schema-form-union.cjs.map +1 -0
  201. package/dist/components/json-schema-form-union.d.ts +7 -0
  202. package/dist/components/json-schema-form-union.d.ts.map +1 -0
  203. package/dist/components/json-schema-form-union.js +52 -0
  204. package/dist/components/json-schema-form-union.js.map +1 -0
  205. package/dist/components/list-menu-virtual.cjs +5 -0
  206. package/dist/components/list-menu-virtual.cjs.map +1 -0
  207. package/dist/components/list-menu-virtual.d.ts +12 -0
  208. package/dist/components/list-menu-virtual.d.ts.map +1 -0
  209. package/dist/components/list-menu-virtual.js +6 -0
  210. package/dist/components/list-menu-virtual.js.map +1 -0
  211. package/dist/components/local-path.cjs +12 -0
  212. package/dist/components/local-path.cjs.map +1 -0
  213. package/dist/components/local-path.d.ts +14 -0
  214. package/dist/components/local-path.d.ts.map +1 -0
  215. package/dist/components/local-path.js +12 -0
  216. package/dist/components/local-path.js.map +1 -0
  217. package/dist/components/slider-shared.cjs +32 -0
  218. package/dist/components/slider-shared.cjs.map +1 -0
  219. package/dist/components/slider-shared.d.ts +18 -0
  220. package/dist/components/slider-shared.d.ts.map +1 -0
  221. package/dist/components/slider-shared.js +27 -0
  222. package/dist/components/slider-shared.js.map +1 -0
  223. package/dist/components.cjs +8 -0
  224. package/dist/components.d.ts +6 -1
  225. package/dist/components.d.ts.map +1 -1
  226. package/dist/components.js +5 -1
  227. package/dist/connections/ConnectionsPage.cjs +51 -19
  228. package/dist/connections/ConnectionsPage.cjs.map +1 -1
  229. package/dist/connections/ConnectionsPage.d.ts +9 -1
  230. package/dist/connections/ConnectionsPage.d.ts.map +1 -1
  231. package/dist/connections/ConnectionsPage.js +52 -20
  232. package/dist/connections/ConnectionsPage.js.map +1 -1
  233. package/dist/connections/connectionDashboard.cjs +13 -8
  234. package/dist/connections/connectionDashboard.cjs.map +1 -1
  235. package/dist/connections/connectionDashboard.d.ts +8 -3
  236. package/dist/connections/connectionDashboard.d.ts.map +1 -1
  237. package/dist/connections/connectionDashboard.js +14 -9
  238. package/dist/connections/connectionDashboard.js.map +1 -1
  239. package/dist/connections/connectionDashboardModel.cjs.map +1 -1
  240. package/dist/connections/connectionDashboardModel.d.ts +4 -0
  241. package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
  242. package/dist/connections/connectionDashboardModel.js.map +1 -1
  243. package/dist/connections/connectionDashboardRow.cjs +75 -55
  244. package/dist/connections/connectionDashboardRow.cjs.map +1 -1
  245. package/dist/connections/connectionDashboardRow.d.ts +3 -2
  246. package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
  247. package/dist/connections/connectionDashboardRow.js +75 -55
  248. package/dist/connections/connectionDashboardRow.js.map +1 -1
  249. package/dist/connections/connectionNamespaceField.cjs +17 -0
  250. package/dist/connections/connectionNamespaceField.cjs.map +1 -0
  251. package/dist/connections/connectionNamespaceField.d.ts +10 -0
  252. package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
  253. package/dist/connections/connectionNamespaceField.js +17 -0
  254. package/dist/connections/connectionNamespaceField.js.map +1 -0
  255. package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
  256. package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
  257. package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
  258. package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
  259. package/dist/connections/connectionSchemaFormExtensions.js +96 -0
  260. package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
  261. package/dist/connections/connectionsPageModel.cjs +11 -0
  262. package/dist/connections/connectionsPageModel.cjs.map +1 -1
  263. package/dist/connections/connectionsPageModel.d.ts +5 -0
  264. package/dist/connections/connectionsPageModel.d.ts.map +1 -1
  265. package/dist/connections/connectionsPageModel.js +11 -1
  266. package/dist/connections/connectionsPageModel.js.map +1 -1
  267. package/dist/connections.cjs +5 -0
  268. package/dist/connections.d.ts +2 -1
  269. package/dist/connections.d.ts.map +1 -1
  270. package/dist/connections.js +3 -2
  271. package/dist/data/AvatarBadge.cjs +3 -3
  272. package/dist/data/AvatarBadge.cjs.map +1 -1
  273. package/dist/data/AvatarBadge.js +3 -3
  274. package/dist/data/AvatarBadge.js.map +1 -1
  275. package/dist/data/CodeDiff.cjs +2 -0
  276. package/dist/data/CodeDiff.cjs.map +1 -1
  277. package/dist/data/CodeDiff.js +2 -0
  278. package/dist/data/CodeDiff.js.map +1 -1
  279. package/dist/data/DataTable.cjs +3 -2
  280. package/dist/data/DataTable.cjs.map +1 -1
  281. package/dist/data/DataTable.d.ts.map +1 -1
  282. package/dist/data/DataTable.js +3 -2
  283. package/dist/data/DataTable.js.map +1 -1
  284. package/dist/data/Gauge.cjs +1 -1
  285. package/dist/data/Gauge.cjs.map +1 -1
  286. package/dist/data/Gauge.js +1 -1
  287. package/dist/data/Gauge.js.map +1 -1
  288. package/dist/data/HighlightedTokens.cjs +2 -10
  289. package/dist/data/HighlightedTokens.cjs.map +1 -1
  290. package/dist/data/HighlightedTokens.d.ts.map +1 -1
  291. package/dist/data/HighlightedTokens.js +1 -9
  292. package/dist/data/HighlightedTokens.js.map +1 -1
  293. package/dist/data/Markdown.cjs +38 -11
  294. package/dist/data/Markdown.cjs.map +1 -1
  295. package/dist/data/Markdown.d.ts +9 -1
  296. package/dist/data/Markdown.d.ts.map +1 -1
  297. package/dist/data/Markdown.js +39 -12
  298. package/dist/data/Markdown.js.map +1 -1
  299. package/dist/data/MultiGaugeBar.cjs +157 -0
  300. package/dist/data/MultiGaugeBar.cjs.map +1 -0
  301. package/dist/data/MultiGaugeBar.d.ts +29 -0
  302. package/dist/data/MultiGaugeBar.d.ts.map +1 -0
  303. package/dist/data/MultiGaugeBar.js +157 -0
  304. package/dist/data/MultiGaugeBar.js.map +1 -0
  305. package/dist/data/OpenInFilesLink.cjs +27 -0
  306. package/dist/data/OpenInFilesLink.cjs.map +1 -0
  307. package/dist/data/OpenInFilesLink.d.ts +15 -0
  308. package/dist/data/OpenInFilesLink.d.ts.map +1 -0
  309. package/dist/data/OpenInFilesLink.js +27 -0
  310. package/dist/data/OpenInFilesLink.js.map +1 -0
  311. package/dist/data/ProgressBar.cjs +5 -3
  312. package/dist/data/ProgressBar.cjs.map +1 -1
  313. package/dist/data/ProgressBar.d.ts +5 -1
  314. package/dist/data/ProgressBar.d.ts.map +1 -1
  315. package/dist/data/ProgressBar.js +5 -3
  316. package/dist/data/ProgressBar.js.map +1 -1
  317. package/dist/data/ProgressBars.cjs +13 -5
  318. package/dist/data/ProgressBars.cjs.map +1 -1
  319. package/dist/data/ProgressBars.d.ts +6 -1
  320. package/dist/data/ProgressBars.d.ts.map +1 -1
  321. package/dist/data/ProgressBars.js +13 -5
  322. package/dist/data/ProgressBars.js.map +1 -1
  323. package/dist/data/Properties.cjs +3 -3
  324. package/dist/data/Properties.cjs.map +1 -1
  325. package/dist/data/Properties.js +3 -3
  326. package/dist/data/Properties.js.map +1 -1
  327. package/dist/data/TaskProgress.cjs +14 -6
  328. package/dist/data/TaskProgress.cjs.map +1 -1
  329. package/dist/data/TaskProgress.d.ts +3 -1
  330. package/dist/data/TaskProgress.d.ts.map +1 -1
  331. package/dist/data/TaskProgress.js +14 -6
  332. package/dist/data/TaskProgress.js.map +1 -1
  333. package/dist/data/TaskPrompts.cjs +96 -0
  334. package/dist/data/TaskPrompts.cjs.map +1 -0
  335. package/dist/data/TaskPrompts.d.ts +6 -0
  336. package/dist/data/TaskPrompts.d.ts.map +1 -0
  337. package/dist/data/TaskPrompts.js +96 -0
  338. package/dist/data/TaskPrompts.js.map +1 -0
  339. package/dist/data/TaskSnapshot.cjs.map +1 -1
  340. package/dist/data/TaskSnapshot.d.ts +3 -0
  341. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  342. package/dist/data/TaskSnapshot.js.map +1 -1
  343. package/dist/data/TimeseriesCoreBars.cjs +7 -3
  344. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  345. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  346. package/dist/data/TimeseriesCoreBars.js +8 -4
  347. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  348. package/dist/data/TimeseriesGauge.cjs +12 -5
  349. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  350. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  351. package/dist/data/TimeseriesGauge.js +13 -6
  352. package/dist/data/TimeseriesGauge.js.map +1 -1
  353. package/dist/data/TimeseriesPanel.cjs +10 -9
  354. package/dist/data/TimeseriesPanel.cjs.map +1 -1
  355. package/dist/data/TimeseriesPanel.d.ts +1 -1
  356. package/dist/data/TimeseriesPanel.d.ts.map +1 -1
  357. package/dist/data/TimeseriesPanel.js +11 -10
  358. package/dist/data/TimeseriesPanel.js.map +1 -1
  359. package/dist/data/TimeseriesPanel.model.cjs +62 -10
  360. package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
  361. package/dist/data/TimeseriesPanel.model.d.ts +40 -1
  362. package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
  363. package/dist/data/TimeseriesPanel.model.js +62 -11
  364. package/dist/data/TimeseriesPanel.model.js.map +1 -1
  365. package/dist/data/WorkloadCard.cjs +7 -3
  366. package/dist/data/WorkloadCard.cjs.map +1 -1
  367. package/dist/data/WorkloadCard.d.ts +3 -1
  368. package/dist/data/WorkloadCard.d.ts.map +1 -1
  369. package/dist/data/WorkloadCard.js +7 -3
  370. package/dist/data/WorkloadCard.js.map +1 -1
  371. package/dist/data/WorkloadCard.model.cjs.map +1 -1
  372. package/dist/data/WorkloadCard.model.d.ts +2 -0
  373. package/dist/data/WorkloadCard.model.d.ts.map +1 -1
  374. package/dist/data/WorkloadCard.model.js.map +1 -1
  375. package/dist/data/ai/ChatWindow.placement.cjs +2 -1
  376. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
  377. package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
  378. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
  379. package/dist/data/ai/ChatWindow.placement.js +2 -1
  380. package/dist/data/ai/ChatWindow.placement.js.map +1 -1
  381. package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
  382. package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
  383. package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
  384. package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
  385. package/dist/data/ai/SpecRuntimeBar.js +2 -2
  386. package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
  387. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
  388. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  389. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
  390. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  391. package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
  392. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  393. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
  394. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  395. package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
  396. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  397. package/dist/data/ai/ThreadPicker.cjs +2 -2
  398. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  399. package/dist/data/ai/ThreadPicker.js +2 -2
  400. package/dist/data/ai/ThreadPicker.js.map +1 -1
  401. package/dist/data/ai/index.d.ts +2 -0
  402. package/dist/data/ai/index.d.ts.map +1 -1
  403. package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
  404. package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
  405. package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
  406. package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
  407. package/dist/data/ai/use-prompt-run-stream.js +126 -0
  408. package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
  409. package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
  410. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
  411. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
  412. package/dist/data/cache-browser/CacheBrowser.js +1 -0
  413. package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
  414. package/dist/data/charts/BarChart.cjs +194 -0
  415. package/dist/data/charts/BarChart.cjs.map +1 -0
  416. package/dist/data/charts/BarChart.d.ts +19 -0
  417. package/dist/data/charts/BarChart.d.ts.map +1 -0
  418. package/dist/data/charts/BarChart.js +194 -0
  419. package/dist/data/charts/BarChart.js.map +1 -0
  420. package/dist/data/charts/ChartLegend.cjs +54 -0
  421. package/dist/data/charts/ChartLegend.cjs.map +1 -0
  422. package/dist/data/charts/ChartLegend.d.ts +17 -0
  423. package/dist/data/charts/ChartLegend.d.ts.map +1 -0
  424. package/dist/data/charts/ChartLegend.js +54 -0
  425. package/dist/data/charts/ChartLegend.js.map +1 -0
  426. package/dist/data/charts/Sparkline.cjs +56 -0
  427. package/dist/data/charts/Sparkline.cjs.map +1 -0
  428. package/dist/data/charts/Sparkline.d.ts +15 -0
  429. package/dist/data/charts/Sparkline.d.ts.map +1 -0
  430. package/dist/data/charts/Sparkline.js +56 -0
  431. package/dist/data/charts/Sparkline.js.map +1 -0
  432. package/dist/data/charts/StackedBarChart.cjs +241 -0
  433. package/dist/data/charts/StackedBarChart.cjs.map +1 -0
  434. package/dist/data/charts/StackedBarChart.d.ts +20 -0
  435. package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
  436. package/dist/data/charts/StackedBarChart.js +241 -0
  437. package/dist/data/charts/StackedBarChart.js.map +1 -0
  438. package/dist/data/charts/TrendChart.cjs +157 -0
  439. package/dist/data/charts/TrendChart.cjs.map +1 -0
  440. package/dist/data/charts/TrendChart.d.ts +20 -0
  441. package/dist/data/charts/TrendChart.d.ts.map +1 -0
  442. package/dist/data/charts/TrendChart.js +157 -0
  443. package/dist/data/charts/TrendChart.js.map +1 -0
  444. package/dist/data/charts/chart-marks.cjs +115 -0
  445. package/dist/data/charts/chart-marks.cjs.map +1 -0
  446. package/dist/data/charts/chart-marks.d.ts +39 -0
  447. package/dist/data/charts/chart-marks.d.ts.map +1 -0
  448. package/dist/data/charts/chart-marks.js +112 -0
  449. package/dist/data/charts/chart-marks.js.map +1 -0
  450. package/dist/data/charts/chart-palette.cjs +74 -0
  451. package/dist/data/charts/chart-palette.cjs.map +1 -0
  452. package/dist/data/charts/chart-palette.d.ts +58 -0
  453. package/dist/data/charts/chart-palette.d.ts.map +1 -0
  454. package/dist/data/charts/chart-palette.js +72 -0
  455. package/dist/data/charts/chart-palette.js.map +1 -0
  456. package/dist/data/charts/chart-scale.cjs +115 -0
  457. package/dist/data/charts/chart-scale.cjs.map +1 -0
  458. package/dist/data/charts/chart-scale.d.ts +41 -0
  459. package/dist/data/charts/chart-scale.d.ts.map +1 -0
  460. package/dist/data/charts/chart-scale.js +104 -0
  461. package/dist/data/charts/chart-scale.js.map +1 -0
  462. package/dist/data/charts/chart.test-utils.d.ts +7 -0
  463. package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
  464. package/dist/data/charts/index.d.ts +7 -0
  465. package/dist/data/charts/index.d.ts.map +1 -0
  466. package/dist/data/chat/MessageActions.cjs +1 -1
  467. package/dist/data/chat/MessageActions.cjs.map +1 -1
  468. package/dist/data/chat/MessageActions.js +1 -1
  469. package/dist/data/chat/MessageActions.js.map +1 -1
  470. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
  471. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
  472. package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
  473. package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
  474. package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
  475. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
  476. package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
  477. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  478. package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
  479. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  480. package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
  481. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  482. package/dist/data/diagnostics/ProblemActions.cjs +37 -0
  483. package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
  484. package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
  485. package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
  486. package/dist/data/diagnostics/ProblemActions.js +37 -0
  487. package/dist/data/diagnostics/ProblemActions.js.map +1 -0
  488. package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
  489. package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
  490. package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
  491. package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
  492. package/dist/data/diagnostics/ProblemFacet.js +33 -0
  493. package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
  494. package/dist/data/diagnostics/ProblemRow.cjs +62 -0
  495. package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
  496. package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
  497. package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
  498. package/dist/data/diagnostics/ProblemRow.js +62 -0
  499. package/dist/data/diagnostics/ProblemRow.js.map +1 -0
  500. package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
  501. package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
  502. package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
  503. package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
  504. package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
  505. package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
  506. package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
  507. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  508. package/dist/data/diagnostics/StackFrameRow.js +1 -1
  509. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  510. package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
  511. package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
  512. package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
  513. package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
  514. package/dist/data/diagnostics/diagnostic-identity.js +14 -0
  515. package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
  516. package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
  517. package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
  518. package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
  519. package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
  520. package/dist/data/diagnostics/use-problem-expansion.js +16 -0
  521. package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
  522. package/dist/data/git/GitChangeList.cjs +9 -6
  523. package/dist/data/git/GitChangeList.cjs.map +1 -1
  524. package/dist/data/git/GitChangeList.d.ts +6 -0
  525. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  526. package/dist/data/git/GitChangeList.js +9 -6
  527. package/dist/data/git/GitChangeList.js.map +1 -1
  528. package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
  529. package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
  530. package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
  531. package/dist/data/git/pickers/ReferencePicker.js +1 -0
  532. package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
  533. package/dist/data/lint/LintDetail.cjs +230 -189
  534. package/dist/data/lint/LintDetail.cjs.map +1 -1
  535. package/dist/data/lint/LintDetail.d.ts +25 -3
  536. package/dist/data/lint/LintDetail.d.ts.map +1 -1
  537. package/dist/data/lint/LintDetail.js +231 -192
  538. package/dist/data/lint/LintDetail.js.map +1 -1
  539. package/dist/data/lint/LintFilterBar.cjs +78 -83
  540. package/dist/data/lint/LintFilterBar.cjs.map +1 -1
  541. package/dist/data/lint/LintFilterBar.d.ts +23 -6
  542. package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
  543. package/dist/data/lint/LintFilterBar.js +78 -85
  544. package/dist/data/lint/LintFilterBar.js.map +1 -1
  545. package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
  546. package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
  547. package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
  548. package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
  549. package/dist/data/lint/LintIgnoreMenu.js +58 -0
  550. package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
  551. package/dist/data/lint/LintResults.cjs +59 -14
  552. package/dist/data/lint/LintResults.cjs.map +1 -1
  553. package/dist/data/lint/LintResults.d.ts +25 -1
  554. package/dist/data/lint/LintResults.d.ts.map +1 -1
  555. package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
  556. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
  557. package/dist/data/lint/LintResults.js +60 -15
  558. package/dist/data/lint/LintResults.js.map +1 -1
  559. package/dist/data/lint/LintTable.cjs +156 -0
  560. package/dist/data/lint/LintTable.cjs.map +1 -0
  561. package/dist/data/lint/LintTable.d.ts +13 -0
  562. package/dist/data/lint/LintTable.d.ts.map +1 -0
  563. package/dist/data/lint/LintTable.js +156 -0
  564. package/dist/data/lint/LintTable.js.map +1 -0
  565. package/dist/data/lint/LintTreeNode.cjs +42 -19
  566. package/dist/data/lint/LintTreeNode.cjs.map +1 -1
  567. package/dist/data/lint/LintTreeNode.d.ts +7 -2
  568. package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
  569. package/dist/data/lint/LintTreeNode.js +44 -21
  570. package/dist/data/lint/LintTreeNode.js.map +1 -1
  571. package/dist/data/lint/ViolationSnippet.cjs +113 -0
  572. package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
  573. package/dist/data/lint/ViolationSnippet.d.ts +20 -0
  574. package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
  575. package/dist/data/lint/ViolationSnippet.js +112 -0
  576. package/dist/data/lint/ViolationSnippet.js.map +1 -0
  577. package/dist/data/lint/actions.cjs +44 -16
  578. package/dist/data/lint/actions.cjs.map +1 -1
  579. package/dist/data/lint/actions.d.ts +7 -3
  580. package/dist/data/lint/actions.d.ts.map +1 -1
  581. package/dist/data/lint/actions.js +44 -16
  582. package/dist/data/lint/actions.js.map +1 -1
  583. package/dist/data/lint/grouping.cjs +105 -8
  584. package/dist/data/lint/grouping.cjs.map +1 -1
  585. package/dist/data/lint/grouping.d.ts +21 -1
  586. package/dist/data/lint/grouping.d.ts.map +1 -1
  587. package/dist/data/lint/grouping.js +105 -10
  588. package/dist/data/lint/grouping.js.map +1 -1
  589. package/dist/data/lint/ignore-menu-items.cjs +18 -0
  590. package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
  591. package/dist/data/lint/ignore-menu-items.d.ts +6 -0
  592. package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
  593. package/dist/data/lint/ignore-menu-items.js +17 -0
  594. package/dist/data/lint/ignore-menu-items.js.map +1 -0
  595. package/dist/data/lint/index.d.ts +7 -5
  596. package/dist/data/lint/index.d.ts.map +1 -1
  597. package/dist/data/lint/stats.cjs +19 -4
  598. package/dist/data/lint/stats.cjs.map +1 -1
  599. package/dist/data/lint/stats.d.ts +13 -3
  600. package/dist/data/lint/stats.d.ts.map +1 -1
  601. package/dist/data/lint/stats.js +17 -5
  602. package/dist/data/lint/stats.js.map +1 -1
  603. package/dist/data/lint/types.cjs +8 -0
  604. package/dist/data/lint/types.cjs.map +1 -1
  605. package/dist/data/lint/types.d.ts +47 -0
  606. package/dist/data/lint/types.d.ts.map +1 -1
  607. package/dist/data/lint/types.js +8 -1
  608. package/dist/data/lint/types.js.map +1 -1
  609. package/dist/data/lint/violation-menu-items.cjs +31 -0
  610. package/dist/data/lint/violation-menu-items.cjs.map +1 -0
  611. package/dist/data/lint/violation-menu-items.d.ts +12 -0
  612. package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
  613. package/dist/data/lint/violation-menu-items.js +31 -0
  614. package/dist/data/lint/violation-menu-items.js.map +1 -0
  615. package/dist/data/markdown-source-blocks.cjs +38 -0
  616. package/dist/data/markdown-source-blocks.cjs.map +1 -0
  617. package/dist/data/markdown-source-blocks.d.ts +32 -0
  618. package/dist/data/markdown-source-blocks.d.ts.map +1 -0
  619. package/dist/data/markdown-source-blocks.js +35 -0
  620. package/dist/data/markdown-source-blocks.js.map +1 -0
  621. package/dist/data/test-runner/FilterFacet.cjs +52 -0
  622. package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
  623. package/dist/data/test-runner/FilterFacet.d.ts +13 -0
  624. package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
  625. package/dist/data/test-runner/FilterFacet.js +52 -0
  626. package/dist/data/test-runner/FilterFacet.js.map +1 -0
  627. package/dist/data/test-runner/MatrixMarks.cjs +19 -29
  628. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  629. package/dist/data/test-runner/MatrixMarks.d.ts +4 -4
  630. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  631. package/dist/data/test-runner/MatrixMarks.js +19 -29
  632. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  633. package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
  634. package/dist/data/test-runner/TestAttemptDetail.js +1 -1
  635. package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
  636. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  637. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  638. package/dist/data/test-runner/TestDetailPanel.js +11 -0
  639. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  640. package/dist/data/test-runner/TestFilterBar.cjs +3 -44
  641. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  642. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  643. package/dist/data/test-runner/TestFilterBar.js +3 -44
  644. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  645. package/dist/data/test-runner/TestRunner.cjs +3 -1
  646. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  647. package/dist/data/test-runner/TestRunner.d.ts +7 -1
  648. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  649. package/dist/data/test-runner/TestRunner.js +3 -1
  650. package/dist/data/test-runner/TestRunner.js.map +1 -1
  651. package/dist/data/test-runner/context.cjs.map +1 -1
  652. package/dist/data/test-runner/context.d.ts +3 -0
  653. package/dist/data/test-runner/context.d.ts.map +1 -1
  654. package/dist/data/test-runner/context.js.map +1 -1
  655. package/dist/data/test-runner/types.d.ts +2 -0
  656. package/dist/data/test-runner/types.d.ts.map +1 -1
  657. package/dist/data/timeseries-query.cjs +98 -2
  658. package/dist/data/timeseries-query.cjs.map +1 -1
  659. package/dist/data/timeseries-query.d.ts +31 -5
  660. package/dist/data/timeseries-query.d.ts.map +1 -1
  661. package/dist/data/timeseries-query.js +98 -3
  662. package/dist/data/timeseries-query.js.map +1 -1
  663. package/dist/data/timeseries-stream-provider.cjs +38 -0
  664. package/dist/data/timeseries-stream-provider.cjs.map +1 -0
  665. package/dist/data/timeseries-stream-provider.d.ts +26 -0
  666. package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
  667. package/dist/data/timeseries-stream-provider.js +38 -0
  668. package/dist/data/timeseries-stream-provider.js.map +1 -0
  669. package/dist/data/timeseries-stream.cjs +304 -0
  670. package/dist/data/timeseries-stream.cjs.map +1 -0
  671. package/dist/data/timeseries-stream.d.ts +81 -0
  672. package/dist/data/timeseries-stream.d.ts.map +1 -0
  673. package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
  674. package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
  675. package/dist/data/timeseries-stream.js +296 -0
  676. package/dist/data/timeseries-stream.js.map +1 -0
  677. package/dist/data/token-style.cjs +13 -0
  678. package/dist/data/token-style.cjs.map +1 -0
  679. package/dist/data/token-style.d.ts +4 -0
  680. package/dist/data/token-style.d.ts.map +1 -0
  681. package/dist/data/token-style.js +13 -0
  682. package/dist/data/token-style.js.map +1 -0
  683. package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
  684. package/dist/data/traces/ProcessTraceDetail.js +1 -1
  685. package/dist/data/traces/index.d.ts +1 -1
  686. package/dist/data/traces/index.d.ts.map +1 -1
  687. package/dist/data/use-data-table-virtual.d.ts +1 -1
  688. package/dist/data/version-info.cjs +3 -3
  689. package/dist/data/version-info.js +3 -3
  690. package/dist/data/workload-panel/MemoryStack.cjs +49 -0
  691. package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
  692. package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
  693. package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
  694. package/dist/data/workload-panel/MemoryStack.js +48 -0
  695. package/dist/data/workload-panel/MemoryStack.js.map +1 -0
  696. package/dist/data/workload-panel/Metrics.cjs +197 -0
  697. package/dist/data/workload-panel/Metrics.cjs.map +1 -0
  698. package/dist/data/workload-panel/Metrics.d.ts +11 -0
  699. package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
  700. package/dist/data/workload-panel/Metrics.js +196 -0
  701. package/dist/data/workload-panel/Metrics.js.map +1 -0
  702. package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
  703. package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
  704. package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
  705. package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
  706. package/dist/data/workload-panel/WorkloadPanel.js +66 -0
  707. package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
  708. package/dist/data/workload-panel/fixtures.d.ts +60 -0
  709. package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
  710. package/dist/data/workload-panel/model.cjs +137 -0
  711. package/dist/data/workload-panel/model.cjs.map +1 -0
  712. package/dist/data/workload-panel/model.d.ts +53 -0
  713. package/dist/data/workload-panel/model.d.ts.map +1 -0
  714. package/dist/data/workload-panel/model.js +133 -0
  715. package/dist/data/workload-panel/model.js.map +1 -0
  716. package/dist/data/workload-panel/types.d.ts +56 -0
  717. package/dist/data/workload-panel/types.d.ts.map +1 -0
  718. package/dist/data.cjs +57 -6
  719. package/dist/data.d.ts +9 -1
  720. package/dist/data.d.ts.map +1 -1
  721. package/dist/data.js +27 -10
  722. package/dist/file-findings/AnnotatedCode.cjs +243 -0
  723. package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
  724. package/dist/file-findings/AnnotatedCode.d.ts +30 -0
  725. package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
  726. package/dist/file-findings/AnnotatedCode.js +243 -0
  727. package/dist/file-findings/AnnotatedCode.js.map +1 -0
  728. package/dist/file-findings/FileFindingsView.cjs +213 -0
  729. package/dist/file-findings/FileFindingsView.cjs.map +1 -0
  730. package/dist/file-findings/FileFindingsView.d.ts +35 -0
  731. package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
  732. package/dist/file-findings/FileFindingsView.js +213 -0
  733. package/dist/file-findings/FileFindingsView.js.map +1 -0
  734. package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
  735. package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
  736. package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
  737. package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
  738. package/dist/file-findings/LazyAnnotatedCode.js +22 -0
  739. package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
  740. package/dist/file-findings/adapters.cjs +155 -0
  741. package/dist/file-findings/adapters.cjs.map +1 -0
  742. package/dist/file-findings/adapters.d.ts +24 -0
  743. package/dist/file-findings/adapters.d.ts.map +1 -0
  744. package/dist/file-findings/adapters.js +153 -0
  745. package/dist/file-findings/adapters.js.map +1 -0
  746. package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
  747. package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
  748. package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
  749. package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
  750. package/dist/file-findings/file-review/CommentDraft.js +97 -0
  751. package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
  752. package/dist/file-findings/file-review/FileReview.cjs +863 -0
  753. package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
  754. package/dist/file-findings/file-review/FileReview.d.ts +79 -0
  755. package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
  756. package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
  757. package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
  758. package/dist/file-findings/file-review/FileReview.js +863 -0
  759. package/dist/file-findings/file-review/FileReview.js.map +1 -0
  760. package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
  761. package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
  762. package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
  763. package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
  764. package/dist/file-findings/file-review/InlineAuthors.js +77 -0
  765. package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
  766. package/dist/file-findings/file-review/InlineThread.cjs +77 -0
  767. package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
  768. package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
  769. package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
  770. package/dist/file-findings/file-review/InlineThread.js +77 -0
  771. package/dist/file-findings/file-review/InlineThread.js.map +1 -0
  772. package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
  773. package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
  774. package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
  775. package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
  776. package/dist/file-findings/file-review/ProblemsList.js +164 -0
  777. package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
  778. package/dist/file-findings/file-review/SourceView.cjs +179 -0
  779. package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
  780. package/dist/file-findings/file-review/SourceView.d.ts +29 -0
  781. package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
  782. package/dist/file-findings/file-review/SourceView.js +179 -0
  783. package/dist/file-findings/file-review/SourceView.js.map +1 -0
  784. package/dist/file-findings/file-review/blame.cjs +35 -0
  785. package/dist/file-findings/file-review/blame.cjs.map +1 -0
  786. package/dist/file-findings/file-review/blame.d.ts +28 -0
  787. package/dist/file-findings/file-review/blame.d.ts.map +1 -0
  788. package/dist/file-findings/file-review/blame.js +33 -0
  789. package/dist/file-findings/file-review/blame.js.map +1 -0
  790. package/dist/file-findings/file-review/geometry.cjs +101 -0
  791. package/dist/file-findings/file-review/geometry.cjs.map +1 -0
  792. package/dist/file-findings/file-review/geometry.d.ts +45 -0
  793. package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
  794. package/dist/file-findings/file-review/geometry.js +98 -0
  795. package/dist/file-findings/file-review/geometry.js.map +1 -0
  796. package/dist/file-findings/file-review/hooks.cjs +101 -0
  797. package/dist/file-findings/file-review/hooks.cjs.map +1 -0
  798. package/dist/file-findings/file-review/hooks.d.ts +22 -0
  799. package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
  800. package/dist/file-findings/file-review/hooks.js +99 -0
  801. package/dist/file-findings/file-review/hooks.js.map +1 -0
  802. package/dist/file-findings/file-review/marks.cjs +52 -0
  803. package/dist/file-findings/file-review/marks.cjs.map +1 -0
  804. package/dist/file-findings/file-review/marks.d.ts +23 -0
  805. package/dist/file-findings/file-review/marks.d.ts.map +1 -0
  806. package/dist/file-findings/file-review/marks.js +47 -0
  807. package/dist/file-findings/file-review/marks.js.map +1 -0
  808. package/dist/file-findings/file-review/problem-filters.cjs +14 -0
  809. package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
  810. package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
  811. package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
  812. package/dist/file-findings/file-review/problem-filters.js +13 -0
  813. package/dist/file-findings/file-review/problem-filters.js.map +1 -0
  814. package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
  815. package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
  816. package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
  817. package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
  818. package/dist/file-findings/file-review/quote-anchor.js +226 -0
  819. package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
  820. package/dist/file-findings/file-review/source-anchor.cjs +104 -0
  821. package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
  822. package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
  823. package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
  824. package/dist/file-findings/file-review/source-anchor.js +99 -0
  825. package/dist/file-findings/file-review/source-anchor.js.map +1 -0
  826. package/dist/file-findings/file-review/source-marks.cjs +71 -0
  827. package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
  828. package/dist/file-findings/file-review/source-marks.d.ts +27 -0
  829. package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
  830. package/dist/file-findings/file-review/source-marks.js +68 -0
  831. package/dist/file-findings/file-review/source-marks.js.map +1 -0
  832. package/dist/file-findings/findings-comments.cjs +136 -0
  833. package/dist/file-findings/findings-comments.cjs.map +1 -0
  834. package/dist/file-findings/findings-comments.d.ts +28 -0
  835. package/dist/file-findings/findings-comments.d.ts.map +1 -0
  836. package/dist/file-findings/findings-comments.js +131 -0
  837. package/dist/file-findings/findings-comments.js.map +1 -0
  838. package/dist/file-findings/findings-languages.cjs +53 -0
  839. package/dist/file-findings/findings-languages.cjs.map +1 -0
  840. package/dist/file-findings/findings-languages.d.ts +11 -0
  841. package/dist/file-findings/findings-languages.d.ts.map +1 -0
  842. package/dist/file-findings/findings-languages.js +53 -0
  843. package/dist/file-findings/findings-languages.js.map +1 -0
  844. package/dist/file-findings/mdx-source.cjs +48 -0
  845. package/dist/file-findings/mdx-source.cjs.map +1 -0
  846. package/dist/file-findings/mdx-source.d.ts +7 -0
  847. package/dist/file-findings/mdx-source.d.ts.map +1 -0
  848. package/dist/file-findings/mdx-source.js +48 -0
  849. package/dist/file-findings/mdx-source.js.map +1 -0
  850. package/dist/file-findings/monaco-language.cjs +73 -0
  851. package/dist/file-findings/monaco-language.cjs.map +1 -0
  852. package/dist/file-findings/monaco-language.d.ts +11 -0
  853. package/dist/file-findings/monaco-language.d.ts.map +1 -0
  854. package/dist/file-findings/monaco-language.js +72 -0
  855. package/dist/file-findings/monaco-language.js.map +1 -0
  856. package/dist/file-findings/severity-counts.cjs +20 -0
  857. package/dist/file-findings/severity-counts.cjs.map +1 -0
  858. package/dist/file-findings/severity-counts.d.ts +5 -0
  859. package/dist/file-findings/severity-counts.d.ts.map +1 -0
  860. package/dist/file-findings/severity-counts.js +19 -0
  861. package/dist/file-findings/severity-counts.js.map +1 -0
  862. package/dist/file-findings/types.cjs +12 -0
  863. package/dist/file-findings/types.cjs.map +1 -0
  864. package/dist/file-findings/types.d.ts +43 -0
  865. package/dist/file-findings/types.d.ts.map +1 -0
  866. package/dist/file-findings/types.js +11 -0
  867. package/dist/file-findings/types.js.map +1 -0
  868. package/dist/file-findings.cjs +47 -0
  869. package/dist/file-findings.d.ts +15 -0
  870. package/dist/file-findings.d.ts.map +1 -0
  871. package/dist/file-findings.js +15 -0
  872. package/dist/hooks/event-hub.cjs +22 -8
  873. package/dist/hooks/event-hub.cjs.map +1 -1
  874. package/dist/hooks/event-hub.d.ts.map +1 -1
  875. package/dist/hooks/event-hub.js +22 -8
  876. package/dist/hooks/event-hub.js.map +1 -1
  877. package/dist/icons/components/UiBrowser.cjs +51 -0
  878. package/dist/icons/components/UiBrowser.cjs.map +1 -0
  879. package/dist/icons/components/UiBrowser.d.ts +15 -0
  880. package/dist/icons/components/UiBrowser.d.ts.map +1 -0
  881. package/dist/icons/components/UiBrowser.js +48 -0
  882. package/dist/icons/components/UiBrowser.js.map +1 -0
  883. package/dist/icons/components/UiCreditCard.cjs +51 -0
  884. package/dist/icons/components/UiCreditCard.cjs.map +1 -0
  885. package/dist/icons/components/UiCreditCard.d.ts +15 -0
  886. package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
  887. package/dist/icons/components/UiCreditCard.js +48 -0
  888. package/dist/icons/components/UiCreditCard.js.map +1 -0
  889. package/dist/icons/components/UiShoppingCart.cjs +51 -0
  890. package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
  891. package/dist/icons/components/UiShoppingCart.d.ts +15 -0
  892. package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
  893. package/dist/icons/components/UiShoppingCart.js +48 -0
  894. package/dist/icons/components/UiShoppingCart.js.map +1 -0
  895. package/dist/icons/index.d.ts +6 -0
  896. package/dist/icons/index.d.ts.map +1 -1
  897. package/dist/icons/registry.cjs +6 -0
  898. package/dist/icons/registry.cjs.map +1 -1
  899. package/dist/icons/registry.d.ts.map +1 -1
  900. package/dist/icons/registry.js +6 -0
  901. package/dist/icons/registry.js.map +1 -1
  902. package/dist/icons.cjs +9 -0
  903. package/dist/icons.js +4 -1
  904. package/dist/index.cjs +75 -7
  905. package/dist/index.d.ts +1 -0
  906. package/dist/index.d.ts.map +1 -1
  907. package/dist/index.js +35 -12
  908. package/dist/layout/AppShell.cjs +37 -21
  909. package/dist/layout/AppShell.cjs.map +1 -1
  910. package/dist/layout/AppShell.d.ts +13 -2
  911. package/dist/layout/AppShell.d.ts.map +1 -1
  912. package/dist/layout/AppShell.js +37 -21
  913. package/dist/layout/AppShell.js.map +1 -1
  914. package/dist/layout/AppShell.nav.cjs +7 -6
  915. package/dist/layout/AppShell.nav.cjs.map +1 -1
  916. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  917. package/dist/layout/AppShell.nav.js +7 -6
  918. package/dist/layout/AppShell.nav.js.map +1 -1
  919. package/dist/layout/SplitPane.cjs +16 -6
  920. package/dist/layout/SplitPane.cjs.map +1 -1
  921. package/dist/layout/SplitPane.d.ts +12 -2
  922. package/dist/layout/SplitPane.d.ts.map +1 -1
  923. package/dist/layout/SplitPane.js +16 -6
  924. package/dist/layout/SplitPane.js.map +1 -1
  925. package/dist/layout/Workspace.cjs +37 -33
  926. package/dist/layout/Workspace.cjs.map +1 -1
  927. package/dist/layout/Workspace.d.ts.map +1 -1
  928. package/dist/layout/Workspace.js +37 -33
  929. package/dist/layout/Workspace.js.map +1 -1
  930. package/dist/layout/Workspace.regions.cjs +3 -3
  931. package/dist/layout/Workspace.regions.cjs.map +1 -1
  932. package/dist/layout/Workspace.regions.js +3 -3
  933. package/dist/layout/Workspace.regions.js.map +1 -1
  934. package/dist/lib/breakpoints.cjs +102 -0
  935. package/dist/lib/breakpoints.cjs.map +1 -0
  936. package/dist/lib/breakpoints.d.ts +36 -0
  937. package/dist/lib/breakpoints.d.ts.map +1 -0
  938. package/dist/lib/breakpoints.js +99 -0
  939. package/dist/lib/breakpoints.js.map +1 -0
  940. package/dist/lib/combobox.cjs +2 -1
  941. package/dist/lib/combobox.cjs.map +1 -1
  942. package/dist/lib/combobox.d.ts +1 -1
  943. package/dist/lib/combobox.d.ts.map +1 -1
  944. package/dist/lib/combobox.js +2 -1
  945. package/dist/lib/combobox.js.map +1 -1
  946. package/dist/lib/path-tree.cjs +21 -0
  947. package/dist/lib/path-tree.cjs.map +1 -1
  948. package/dist/lib/path-tree.d.ts +15 -0
  949. package/dist/lib/path-tree.d.ts.map +1 -1
  950. package/dist/lib/path-tree.js +21 -1
  951. package/dist/lib/path-tree.js.map +1 -1
  952. package/dist/overlay/Modal.cjs +2 -1
  953. package/dist/overlay/Modal.cjs.map +1 -1
  954. package/dist/overlay/Modal.d.ts.map +1 -1
  955. package/dist/overlay/Modal.js +2 -1
  956. package/dist/overlay/Modal.js.map +1 -1
  957. package/dist/overlay/dropdownMenuContext.d.ts +1 -1
  958. package/dist/profiles/editor/profileEditor.cjs +1 -1
  959. package/dist/profiles/editor/profileEditor.cjs.map +1 -1
  960. package/dist/profiles/editor/profileEditor.js +1 -1
  961. package/dist/profiles/editor/profileEditor.js.map +1 -1
  962. package/dist/profiles/editor/profileEditorSections.cjs +2 -2
  963. package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
  964. package/dist/profiles/editor/profileEditorSections.js +2 -2
  965. package/dist/profiles/editor/profileEditorSections.js.map +1 -1
  966. package/dist/profiles/query/prometheusResults.cjs +24 -36
  967. package/dist/profiles/query/prometheusResults.cjs.map +1 -1
  968. package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
  969. package/dist/profiles/query/prometheusResults.js +24 -36
  970. package/dist/profiles/query/prometheusResults.js.map +1 -1
  971. package/dist/rpc/CommandForm.cjs +1 -1
  972. package/dist/rpc/CommandForm.cjs.map +1 -1
  973. package/dist/rpc/CommandForm.js +1 -1
  974. package/dist/rpc/CommandForm.js.map +1 -1
  975. package/dist/rpc/classify.cjs +1 -1
  976. package/dist/rpc/classify.cjs.map +1 -1
  977. package/dist/rpc/classify.d.ts.map +1 -1
  978. package/dist/rpc/classify.js +1 -1
  979. package/dist/rpc/classify.js.map +1 -1
  980. package/dist/rpc/useOperations.d.ts +24 -24
  981. package/dist/rpc.cjs +0 -2
  982. package/dist/rpc.d.ts +0 -1
  983. package/dist/rpc.d.ts.map +1 -1
  984. package/dist/rpc.js +1 -2
  985. package/dist/styles.css +1 -1
  986. package/dist/utils.cjs +6 -0
  987. package/dist/utils.d.ts +2 -1
  988. package/dist/utils.d.ts.map +1 -1
  989. package/dist/utils.js +3 -2
  990. package/package.json +9 -3
  991. package/schemas/json-schema-form.schema.json +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MentionTextarea.d.ts","sourceRoot":"","sources":["../../src/comments/MentionTextarea.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,wDAAwD;IACxD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAsGF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sHAsL1B,CAAC"}
1
+ {"version":3,"file":"MentionTextarea.d.ts","sourceRoot":"","sources":["../../src/comments/MentionTextarea.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,sDAAsD;IACtD,YAAY,EAAE,kBAAkB,EAAE,CAAC;IACnC,wDAAwD;IACxD,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAsGF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sHAuL1B,CAAC"}
@@ -173,7 +173,7 @@ var MentionTextarea = forwardRef(function MentionTextarea({ value, onChange, men
173
173
  value,
174
174
  placeholder,
175
175
  "data-testid": dataTestId,
176
- className: cn("w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-placeholder", className),
176
+ className: cn("w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-placeholder [@media(pointer:coarse)]:text-base", className),
177
177
  onChange: (e) => {
178
178
  onChange(e.target.value);
179
179
  refreshMention(e.target);
@@ -1 +1 @@
1
- {"version":3,"file":"MentionTextarea.js","names":["_Fragment"],"sources":["../../src/comments/MentionTextarea.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { CommentAuthorAvatar } from \"./CommentAuthor\";\nimport type { CommentMention, CommentMentionable } from \"./comment-types\";\n\nexport type MentionTextareaProps = {\n /** Controlled value. */\n value: string;\n /** Called with the next value on edit or mention insertion. */\n onChange: (value: string) => void;\n /** People/agents offered in the @-mention popover. */\n mentionables: CommentMentionable[];\n /** Fired when a mention is inserted via the popover. */\n onMentionSelect?: (mention: CommentMention) => void;\n /** Enter (without Shift) while the popover is closed. */\n onSubmit?: () => void;\n /** Escape while the popover is closed. */\n onCancel?: () => void;\n placeholder?: string;\n autoFocus?: boolean;\n rows?: number;\n className?: string;\n \"data-testid\"?: string;\n};\n\nconst MENTION_QUERY = /(^|\\s)@([\\w.-]*)$/;\nconst MAX_RESULTS = 8;\n\ntype ActiveMention = { atIndex: number; query: string };\ntype CaretRect = { top: number; left: number; height: number };\n\nfunction detectMention(value: string, caret: number): ActiveMention | null {\n const match = value.slice(0, caret).match(MENTION_QUERY);\n if (!match) return null;\n const query = match[2] ?? \"\";\n const atIndex = caret - query.length - 1;\n return { atIndex, query };\n}\n\nfunction filterMentionables(\n mentionables: CommentMentionable[],\n query: string,\n): CommentMentionable[] {\n const q = query.toLowerCase();\n const matches = q\n ? mentionables.filter(\n (m) =>\n m.name.toLowerCase().includes(q) || m.id.toLowerCase().includes(q),\n )\n : mentionables;\n return matches.slice(0, MAX_RESULTS);\n}\n\nconst MIRROR_PROPS = [\n \"boxSizing\",\n \"width\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"fontStyle\",\n \"fontVariant\",\n \"fontWeight\",\n \"fontStretch\",\n \"fontSize\",\n \"lineHeight\",\n \"fontFamily\",\n \"textAlign\",\n \"textTransform\",\n \"textIndent\",\n \"letterSpacing\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n \"wordWrap\",\n \"overflowWrap\",\n] as const;\n\n// Measures the caret pixel position with an off-screen mirror div that copies the\n// textarea's box metrics — the dependency-free way to anchor a popover at the caret.\nfunction caretViewportRect(\n el: HTMLTextAreaElement,\n position: number,\n): CaretRect {\n if (\n typeof document === \"undefined\" ||\n typeof getComputedStyle !== \"function\"\n ) {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, height: 16 };\n }\n const style = getComputedStyle(el);\n const mirror = document.createElement(\"div\");\n for (const prop of MIRROR_PROPS) mirror.style[prop] = style[prop];\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.overflowWrap = \"break-word\";\n mirror.style.top = \"0\";\n mirror.style.left = \"-9999px\";\n mirror.textContent = el.value.slice(0, position);\n\n const marker = document.createElement(\"span\");\n marker.textContent = el.value.slice(position) || \".\";\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n\n const lineHeight =\n parseInt(style.lineHeight, 10) || parseInt(style.fontSize, 10) || 16;\n const offsetTop = marker.offsetTop;\n const offsetLeft = marker.offsetLeft;\n document.body.removeChild(mirror);\n\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top + offsetTop - el.scrollTop,\n left: rect.left + offsetLeft - el.scrollLeft,\n height: lineHeight,\n };\n}\n\n/**\n * A textarea with an @-mention autocomplete. Typing `@` opens a caret-anchored\n * popover filtered against `mentionables`; selecting one inserts the name and\n * fires `onMentionSelect`. Enter submits and Escape cancels only when the\n * popover is closed.\n */\nexport const MentionTextarea = forwardRef<\n HTMLTextAreaElement,\n MentionTextareaProps\n>(function MentionTextarea(\n {\n value,\n onChange,\n mentionables,\n onMentionSelect,\n onSubmit,\n onCancel,\n placeholder,\n autoFocus,\n rows = 2,\n className,\n \"data-testid\": dataTestId,\n },\n forwardedRef,\n) {\n const innerRef = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(\n forwardedRef,\n () => innerRef.current as HTMLTextAreaElement,\n );\n\n const [active, setActive] = useState<ActiveMention | null>(null);\n const [caretRect, setCaretRect] = useState<CaretRect | null>(null);\n const [activeIndex, setActiveIndex] = useState(0);\n const floatingZ = useFloatingZIndex();\n\n const results = active ? filterMentionables(mentionables, active.query) : [];\n const open = active != null && results.length > 0;\n\n function refreshMention(el: HTMLTextAreaElement) {\n const next = detectMention(el.value, el.selectionStart ?? el.value.length);\n setActive(next);\n setActiveIndex(0);\n setCaretRect(next ? caretViewportRect(el, el.selectionStart ?? 0) : null);\n }\n\n function insertMention(m: CommentMentionable) {\n const el = innerRef.current;\n if (!el || !active) return;\n const caret = el.selectionStart ?? value.length;\n const next = `${value.slice(0, active.atIndex)}@${m.name} ${value.slice(caret)}`;\n const nextCaret = active.atIndex + m.name.length + 2;\n onChange(next);\n onMentionSelect?.({ id: m.id, name: m.name, kind: m.kind });\n setActive(null);\n setCaretRect(null);\n requestAnimationFrame(() => {\n el.focus();\n el.setSelectionRange(nextCaret, nextCaret);\n });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLTextAreaElement>) {\n if (open) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % results.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + results.length) % results.length);\n return;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n const choice = results[activeIndex];\n if (choice) insertMention(choice);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActive(null);\n setCaretRect(null);\n return;\n }\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSubmit?.();\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel?.();\n }\n }\n\n useEffect(() => {\n if (!autoFocus) return;\n const el = innerRef.current;\n const raf = requestAnimationFrame(() => {\n el?.focus();\n const len = el?.value.length ?? 0;\n el?.setSelectionRange(len, len);\n });\n return () => cancelAnimationFrame(raf);\n }, [autoFocus]);\n\n return (\n <>\n <textarea\n ref={innerRef}\n rows={rows}\n value={value}\n placeholder={placeholder}\n data-testid={dataTestId}\n className={cn(\n \"w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-placeholder\",\n className,\n )}\n onChange={(e) => {\n onChange(e.target.value);\n refreshMention(e.target);\n }}\n onKeyUp={(e) => refreshMention(e.currentTarget)}\n onClick={(e) => refreshMention(e.currentTarget)}\n onKeyDown={onKeyDown}\n onBlur={() => {\n setActive(null);\n setCaretRect(null);\n }}\n />\n {open &&\n typeof document !== \"undefined\" &&\n createPortal(\n <ul\n role=\"listbox\"\n data-testid=\"mention-popover\"\n style={{\n position: \"fixed\",\n top: (caretRect?.top ?? 0) + (caretRect?.height ?? 16) + 2,\n left: caretRect?.left ?? 0,\n zIndex: floatingZ,\n }}\n className=\"max-h-56 min-w-[12rem] overflow-auto rounded-md border border-border bg-popover py-1 shadow-md\"\n >\n {results.map((m, i) => (\n <li key={m.id}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={i === activeIndex}\n // Use mousedown so selection runs before the textarea blur closes the popover.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(m);\n }}\n onMouseEnter={() => setActiveIndex(i)}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground\",\n i === activeIndex && \"bg-accent text-accent-foreground\",\n )}\n >\n <CommentAuthorAvatar\n author={{\n name: m.name,\n kind: m.kind,\n ...(m.avatar ? { avatar: m.avatar } : {}),\n ...(m.icon ? { icon: m.icon } : {}),\n }}\n size=\"xs\"\n bare\n />\n <span className=\"truncate\">{m.name}</span>\n {m.kind === \"agent\" && (\n <span className=\"ml-auto text-[10px] text-muted-foreground\">\n agent\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n </>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"MentionTextarea.js","names":["_Fragment"],"sources":["../../src/comments/MentionTextarea.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type KeyboardEvent,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../lib/utils\";\nimport { useFloatingZIndex } from \"../overlay/modalStack\";\nimport { CommentAuthorAvatar } from \"./CommentAuthor\";\nimport type { CommentMention, CommentMentionable } from \"./comment-types\";\n\nexport type MentionTextareaProps = {\n /** Controlled value. */\n value: string;\n /** Called with the next value on edit or mention insertion. */\n onChange: (value: string) => void;\n /** People/agents offered in the @-mention popover. */\n mentionables: CommentMentionable[];\n /** Fired when a mention is inserted via the popover. */\n onMentionSelect?: (mention: CommentMention) => void;\n /** Enter (without Shift) while the popover is closed. */\n onSubmit?: () => void;\n /** Escape while the popover is closed. */\n onCancel?: () => void;\n placeholder?: string;\n autoFocus?: boolean;\n rows?: number;\n className?: string;\n \"data-testid\"?: string;\n};\n\nconst MENTION_QUERY = /(^|\\s)@([\\w.-]*)$/;\nconst MAX_RESULTS = 8;\n\ntype ActiveMention = { atIndex: number; query: string };\ntype CaretRect = { top: number; left: number; height: number };\n\nfunction detectMention(value: string, caret: number): ActiveMention | null {\n const match = value.slice(0, caret).match(MENTION_QUERY);\n if (!match) return null;\n const query = match[2] ?? \"\";\n const atIndex = caret - query.length - 1;\n return { atIndex, query };\n}\n\nfunction filterMentionables(\n mentionables: CommentMentionable[],\n query: string,\n): CommentMentionable[] {\n const q = query.toLowerCase();\n const matches = q\n ? mentionables.filter(\n (m) =>\n m.name.toLowerCase().includes(q) || m.id.toLowerCase().includes(q),\n )\n : mentionables;\n return matches.slice(0, MAX_RESULTS);\n}\n\nconst MIRROR_PROPS = [\n \"boxSizing\",\n \"width\",\n \"borderTopWidth\",\n \"borderRightWidth\",\n \"borderBottomWidth\",\n \"borderLeftWidth\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"fontStyle\",\n \"fontVariant\",\n \"fontWeight\",\n \"fontStretch\",\n \"fontSize\",\n \"lineHeight\",\n \"fontFamily\",\n \"textAlign\",\n \"textTransform\",\n \"textIndent\",\n \"letterSpacing\",\n \"wordSpacing\",\n \"tabSize\",\n \"whiteSpace\",\n \"wordWrap\",\n \"overflowWrap\",\n] as const;\n\n// Measures the caret pixel position with an off-screen mirror div that copies the\n// textarea's box metrics — the dependency-free way to anchor a popover at the caret.\nfunction caretViewportRect(\n el: HTMLTextAreaElement,\n position: number,\n): CaretRect {\n if (\n typeof document === \"undefined\" ||\n typeof getComputedStyle !== \"function\"\n ) {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, height: 16 };\n }\n const style = getComputedStyle(el);\n const mirror = document.createElement(\"div\");\n for (const prop of MIRROR_PROPS) mirror.style[prop] = style[prop];\n mirror.style.position = \"absolute\";\n mirror.style.visibility = \"hidden\";\n mirror.style.whiteSpace = \"pre-wrap\";\n mirror.style.overflowWrap = \"break-word\";\n mirror.style.top = \"0\";\n mirror.style.left = \"-9999px\";\n mirror.textContent = el.value.slice(0, position);\n\n const marker = document.createElement(\"span\");\n marker.textContent = el.value.slice(position) || \".\";\n mirror.appendChild(marker);\n document.body.appendChild(mirror);\n\n const lineHeight =\n parseInt(style.lineHeight, 10) || parseInt(style.fontSize, 10) || 16;\n const offsetTop = marker.offsetTop;\n const offsetLeft = marker.offsetLeft;\n document.body.removeChild(mirror);\n\n const rect = el.getBoundingClientRect();\n return {\n top: rect.top + offsetTop - el.scrollTop,\n left: rect.left + offsetLeft - el.scrollLeft,\n height: lineHeight,\n };\n}\n\n/**\n * A textarea with an @-mention autocomplete. Typing `@` opens a caret-anchored\n * popover filtered against `mentionables`; selecting one inserts the name and\n * fires `onMentionSelect`. Enter submits and Escape cancels only when the\n * popover is closed.\n */\nexport const MentionTextarea = forwardRef<\n HTMLTextAreaElement,\n MentionTextareaProps\n>(function MentionTextarea(\n {\n value,\n onChange,\n mentionables,\n onMentionSelect,\n onSubmit,\n onCancel,\n placeholder,\n autoFocus,\n rows = 2,\n className,\n \"data-testid\": dataTestId,\n },\n forwardedRef,\n) {\n const innerRef = useRef<HTMLTextAreaElement>(null);\n useImperativeHandle(\n forwardedRef,\n () => innerRef.current as HTMLTextAreaElement,\n );\n\n const [active, setActive] = useState<ActiveMention | null>(null);\n const [caretRect, setCaretRect] = useState<CaretRect | null>(null);\n const [activeIndex, setActiveIndex] = useState(0);\n const floatingZ = useFloatingZIndex();\n\n const results = active ? filterMentionables(mentionables, active.query) : [];\n const open = active != null && results.length > 0;\n\n function refreshMention(el: HTMLTextAreaElement) {\n const next = detectMention(el.value, el.selectionStart ?? el.value.length);\n setActive(next);\n setActiveIndex(0);\n setCaretRect(next ? caretViewportRect(el, el.selectionStart ?? 0) : null);\n }\n\n function insertMention(m: CommentMentionable) {\n const el = innerRef.current;\n if (!el || !active) return;\n const caret = el.selectionStart ?? value.length;\n const next = `${value.slice(0, active.atIndex)}@${m.name} ${value.slice(caret)}`;\n const nextCaret = active.atIndex + m.name.length + 2;\n onChange(next);\n onMentionSelect?.({ id: m.id, name: m.name, kind: m.kind });\n setActive(null);\n setCaretRect(null);\n requestAnimationFrame(() => {\n el.focus();\n el.setSelectionRange(nextCaret, nextCaret);\n });\n }\n\n function onKeyDown(e: KeyboardEvent<HTMLTextAreaElement>) {\n if (open) {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActiveIndex((i) => (i + 1) % results.length);\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActiveIndex((i) => (i - 1 + results.length) % results.length);\n return;\n }\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n const choice = results[activeIndex];\n if (choice) insertMention(choice);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n setActive(null);\n setCaretRect(null);\n return;\n }\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n onSubmit?.();\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel?.();\n }\n }\n\n useEffect(() => {\n if (!autoFocus) return;\n const el = innerRef.current;\n const raf = requestAnimationFrame(() => {\n el?.focus();\n const len = el?.value.length ?? 0;\n el?.setSelectionRange(len, len);\n });\n return () => cancelAnimationFrame(raf);\n }, [autoFocus]);\n\n return (\n <>\n <textarea\n ref={innerRef}\n rows={rows}\n value={value}\n placeholder={placeholder}\n data-testid={dataTestId}\n className={cn(\n // iOS zooms the page into any focused field under 16px.\n \"w-full resize-none bg-transparent text-sm leading-snug outline-none placeholder:text-placeholder [@media(pointer:coarse)]:text-base\",\n className,\n )}\n onChange={(e) => {\n onChange(e.target.value);\n refreshMention(e.target);\n }}\n onKeyUp={(e) => refreshMention(e.currentTarget)}\n onClick={(e) => refreshMention(e.currentTarget)}\n onKeyDown={onKeyDown}\n onBlur={() => {\n setActive(null);\n setCaretRect(null);\n }}\n />\n {open &&\n typeof document !== \"undefined\" &&\n createPortal(\n <ul\n role=\"listbox\"\n data-testid=\"mention-popover\"\n style={{\n position: \"fixed\",\n top: (caretRect?.top ?? 0) + (caretRect?.height ?? 16) + 2,\n left: caretRect?.left ?? 0,\n zIndex: floatingZ,\n }}\n className=\"max-h-56 min-w-[12rem] overflow-auto rounded-md border border-border bg-popover py-1 shadow-md\"\n >\n {results.map((m, i) => (\n <li key={m.id}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={i === activeIndex}\n // Use mousedown so selection runs before the textarea blur closes the popover.\n onMouseDown={(e) => {\n e.preventDefault();\n insertMention(m);\n }}\n onMouseEnter={() => setActiveIndex(i)}\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground\",\n i === activeIndex && \"bg-accent text-accent-foreground\",\n )}\n >\n <CommentAuthorAvatar\n author={{\n name: m.name,\n kind: m.kind,\n ...(m.avatar ? { avatar: m.avatar } : {}),\n ...(m.icon ? { icon: m.icon } : {}),\n }}\n size=\"xs\"\n bare\n />\n <span className=\"truncate\">{m.name}</span>\n {m.kind === \"agent\" && (\n <span className=\"ml-auto text-[10px] text-muted-foreground\">\n agent\n </span>\n )}\n </button>\n </li>\n ))}\n </ul>,\n document.body,\n )}\n </>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ const require_comment_stage = require("../lib/comment-stage.cjs");
2
+ const require_UiRobotAi = require("../icons/components/UiRobotAi.cjs");
3
+ const require_UiUser = require("../icons/components/UiUser.cjs");
4
+ // src/comments/comment-assign.ts
5
+ function isSameAssignee(left, right) {
6
+ return left.name === right.name && (left.kind ?? "user") === (right.kind ?? "user");
7
+ }
8
+ /**
9
+ * The targets of an assignment: each configured person or agent, "Unassign"
10
+ * while someone holds the root, then the caller's extra items. The dashboard
11
+ * mounts these directly under its own trigger; cards nest them under "Assign…".
12
+ */
13
+ function assignTargetItems(options) {
14
+ const { comment, config, onAssign, extraAssignItems, run } = options;
15
+ const items = [];
16
+ if (onAssign) {
17
+ for (const { id, name, kind } of config.assignees ?? []) {
18
+ const target = {
19
+ id,
20
+ name,
21
+ kind
22
+ };
23
+ const current = comment.assignee !== void 0 && isSameAssignee(comment.assignee, target);
24
+ items.push({
25
+ label: name,
26
+ icon: kind === "agent" ? require_UiRobotAi.UiRobotAi : require_UiUser.UiUser,
27
+ disabled: current,
28
+ title: current ? `Already assigned to ${name}` : `Assign to ${name}`,
29
+ onSelect: () => run("assign", () => onAssign(target))
30
+ });
31
+ }
32
+ if (comment.assignee) items.push({
33
+ label: "Unassign",
34
+ icon: require_UiUser.UiUserMinus,
35
+ onSelect: () => run("assign", () => onAssign(null))
36
+ });
37
+ }
38
+ items.push(...extraAssignItems?.(comment) ?? []);
39
+ return items;
40
+ }
41
+ /**
42
+ * The root-only entries of a card's actions menu: Acknowledge while nobody
43
+ * holds an active root, and an "Assign…" submenu of its targets. Empty for
44
+ * resolved or closed roots, which are no longer being worked on.
45
+ */
46
+ function assignmentMenuItems(options) {
47
+ const { comment, config, onAcknowledge, run } = options;
48
+ if (comment.parentId) return [];
49
+ if (require_comment_stage.resolveCommentStage(config, comment.status) !== "active") return [];
50
+ const items = [];
51
+ if (onAcknowledge && !comment.assignee) items.push({
52
+ label: "Acknowledge",
53
+ icon: require_UiUser.UiUserCheck,
54
+ onSelect: () => run("acknowledge", onAcknowledge)
55
+ });
56
+ const targets = assignTargetItems(options);
57
+ if (targets.length > 0) items.push({
58
+ label: "Assign…",
59
+ icon: require_UiUser.UiUserPlus,
60
+ onSelect: () => {},
61
+ children: targets
62
+ });
63
+ return items;
64
+ }
65
+ exports.assignTargetItems = assignTargetItems;
66
+ exports.assignmentMenuItems = assignmentMenuItems;
67
+
68
+ //# sourceMappingURL=comment-assign.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-assign.cjs","names":["UiRobotAi","UiUser","UiUserMinus","resolveCommentStage","UiUserCheck","UiUserPlus"],"sources":["../../src/comments/comment-assign.ts"],"sourcesContent":["import type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { UiRobotAi, UiUser, UiUserCheck, UiUserMinus, UiUserPlus } from \"../icons\";\nimport { resolveCommentStage } from \"../lib/comment-stage\";\nimport type { Comment, CommentAuthor, CommentConfig } from \"./comment-types\";\n\n/** Runs a card action and reports a failure against `verb` instead of swallowing it. */\nexport type CommentActionRunner = (\n verb: string,\n action: () => void | Promise<void>,\n) => void;\n\nexport type CommentAssignmentOptions = {\n comment: Comment;\n config: CommentConfig;\n /** Claim the root for the current user or agent; omit to hide Acknowledge. */\n onAcknowledge?: () => void | Promise<void>;\n /** Hand the root to `assignee`, or clear it with `null`; omit to hide the people list. */\n onAssign?: (assignee: CommentAuthor | null) => void | Promise<void>;\n /**\n * Caller-owned entries appended to the Assign menu (for example \"Run agent\"),\n * computed per comment so they can reflect its state.\n */\n extraAssignItems?: (comment: Comment) => DropdownMenuItem[];\n run: CommentActionRunner;\n};\n\nfunction isSameAssignee(left: CommentAuthor, right: CommentAuthor): boolean {\n return left.name === right.name && (left.kind ?? \"user\") === (right.kind ?? \"user\");\n}\n\n/**\n * The targets of an assignment: each configured person or agent, \"Unassign\"\n * while someone holds the root, then the caller's extra items. The dashboard\n * mounts these directly under its own trigger; cards nest them under \"Assign…\".\n */\nexport function assignTargetItems(\n options: CommentAssignmentOptions,\n): DropdownMenuItem[] {\n const { comment, config, onAssign, extraAssignItems, run } = options;\n const items: DropdownMenuItem[] = [];\n if (onAssign) {\n for (const { id, name, kind } of config.assignees ?? []) {\n const target: CommentAuthor = { id, name, kind };\n const current =\n comment.assignee !== undefined &&\n isSameAssignee(comment.assignee, target);\n items.push({\n label: name,\n icon: kind === \"agent\" ? UiRobotAi : UiUser,\n disabled: current,\n title: current ? `Already assigned to ${name}` : `Assign to ${name}`,\n onSelect: () => run(\"assign\", () => onAssign(target)),\n });\n }\n if (comment.assignee) {\n items.push({\n label: \"Unassign\",\n icon: UiUserMinus,\n onSelect: () => run(\"assign\", () => onAssign(null)),\n });\n }\n }\n items.push(...(extraAssignItems?.(comment) ?? []));\n return items;\n}\n\n/**\n * The root-only entries of a card's actions menu: Acknowledge while nobody\n * holds an active root, and an \"Assign…\" submenu of its targets. Empty for\n * resolved or closed roots, which are no longer being worked on.\n */\nexport function assignmentMenuItems(\n options: CommentAssignmentOptions,\n): DropdownMenuItem[] {\n const { comment, config, onAcknowledge, run } = options;\n if (comment.parentId) return [];\n if (resolveCommentStage(config, comment.status) !== \"active\") return [];\n const items: DropdownMenuItem[] = [];\n if (onAcknowledge && !comment.assignee) {\n items.push({\n label: \"Acknowledge\",\n icon: UiUserCheck,\n onSelect: () => run(\"acknowledge\", onAcknowledge),\n });\n }\n const targets = assignTargetItems(options);\n if (targets.length > 0) {\n items.push({\n label: \"Assign…\",\n icon: UiUserPlus,\n // Opening the submenu is the whole action; the parent never fires it.\n onSelect: () => {},\n children: targets,\n });\n }\n return items;\n}\n"],"mappings":";;;;AA0BA,SAAS,eAAe,MAAqB,OAA+B;CAC1E,OAAO,KAAK,SAAS,MAAM,SAAS,KAAK,QAAQ,aAAa,MAAM,QAAQ;AAC9E;;;;;;AAOA,SAAgB,kBACd,SACoB;CACpB,MAAM,EAAE,SAAS,QAAQ,UAAU,kBAAkB,QAAQ;CAC7D,MAAM,QAA4B,CAAC;CACnC,IAAI,UAAU;EACZ,KAAK,MAAM,EAAE,IAAI,MAAM,UAAU,OAAO,aAAa,CAAC,GAAG;GACvD,MAAM,SAAwB;IAAE;IAAI;IAAM;GAAK;GAC/C,MAAM,UACJ,QAAQ,aAAa,KAAA,KACrB,eAAe,QAAQ,UAAU,MAAM;GACzC,MAAM,KAAK;IACT,OAAO;IACP,MAAM,SAAS,UAAUA,kBAAAA,YAAYC,eAAAA;IACrC,UAAU;IACV,OAAO,UAAU,uBAAuB,SAAS,aAAa;IAC9D,gBAAgB,IAAI,gBAAgB,SAAS,MAAM,CAAC;GACtD,CAAC;EACH;EACA,IAAI,QAAQ,UACV,MAAM,KAAK;GACT,OAAO;GACP,MAAMC,eAAAA;GACN,gBAAgB,IAAI,gBAAgB,SAAS,IAAI,CAAC;EACpD,CAAC;CAEL;CACA,MAAM,KAAK,GAAI,mBAAmB,OAAO,KAAK,CAAC,CAAE;CACjD,OAAO;AACT;;;;;;AAOA,SAAgB,oBACd,SACoB;CACpB,MAAM,EAAE,SAAS,QAAQ,eAAe,QAAQ;CAChD,IAAI,QAAQ,UAAU,OAAO,CAAC;CAC9B,IAAIC,sBAAAA,oBAAoB,QAAQ,QAAQ,MAAM,MAAM,UAAU,OAAO,CAAC;CACtE,MAAM,QAA4B,CAAC;CACnC,IAAI,iBAAiB,CAAC,QAAQ,UAC5B,MAAM,KAAK;EACT,OAAO;EACP,MAAMC,eAAAA;EACN,gBAAgB,IAAI,eAAe,aAAa;CAClD,CAAC;CAEH,MAAM,UAAU,kBAAkB,OAAO;CACzC,IAAI,QAAQ,SAAS,GACnB,MAAM,KAAK;EACT,OAAO;EACP,MAAMC,eAAAA;EAEN,gBAAgB,CAAC;EACjB,UAAU;CACZ,CAAC;CAEH,OAAO;AACT"}
@@ -0,0 +1,31 @@
1
+ import { DropdownMenuItem } from '../overlay/DropdownMenu.js';
2
+ import { Comment, CommentAuthor, CommentConfig } from './comment-types.js';
3
+ /** Runs a card action and reports a failure against `verb` instead of swallowing it. */
4
+ export type CommentActionRunner = (verb: string, action: () => void | Promise<void>) => void;
5
+ export type CommentAssignmentOptions = {
6
+ comment: Comment;
7
+ config: CommentConfig;
8
+ /** Claim the root for the current user or agent; omit to hide Acknowledge. */
9
+ onAcknowledge?: () => void | Promise<void>;
10
+ /** Hand the root to `assignee`, or clear it with `null`; omit to hide the people list. */
11
+ onAssign?: (assignee: CommentAuthor | null) => void | Promise<void>;
12
+ /**
13
+ * Caller-owned entries appended to the Assign menu (for example "Run agent"),
14
+ * computed per comment so they can reflect its state.
15
+ */
16
+ extraAssignItems?: (comment: Comment) => DropdownMenuItem[];
17
+ run: CommentActionRunner;
18
+ };
19
+ /**
20
+ * The targets of an assignment: each configured person or agent, "Unassign"
21
+ * while someone holds the root, then the caller's extra items. The dashboard
22
+ * mounts these directly under its own trigger; cards nest them under "Assign…".
23
+ */
24
+ export declare function assignTargetItems(options: CommentAssignmentOptions): DropdownMenuItem[];
25
+ /**
26
+ * The root-only entries of a card's actions menu: Acknowledge while nobody
27
+ * holds an active root, and an "Assign…" submenu of its targets. Empty for
28
+ * resolved or closed roots, which are no longer being worked on.
29
+ */
30
+ export declare function assignmentMenuItems(options: CommentAssignmentOptions): DropdownMenuItem[];
31
+ //# sourceMappingURL=comment-assign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-assign.d.ts","sourceRoot":"","sources":["../../src/comments/comment-assign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE7E,wFAAwF;AACxF,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAC/B,IAAI,CAAC;AAEV,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC;IACtB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,gBAAgB,EAAE,CAAC;IAC5D,GAAG,EAAE,mBAAmB,CAAC;CAC1B,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,gBAAgB,EAAE,CA2BpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,wBAAwB,GAChC,gBAAgB,EAAE,CAuBpB"}
@@ -0,0 +1,67 @@
1
+ import { resolveCommentStage } from "../lib/comment-stage.js";
2
+ import { UiRobotAi } from "../icons/components/UiRobotAi.js";
3
+ import { UiUser, UiUserCheck, UiUserMinus, UiUserPlus } from "../icons/components/UiUser.js";
4
+ // src/comments/comment-assign.ts
5
+ function isSameAssignee(left, right) {
6
+ return left.name === right.name && (left.kind ?? "user") === (right.kind ?? "user");
7
+ }
8
+ /**
9
+ * The targets of an assignment: each configured person or agent, "Unassign"
10
+ * while someone holds the root, then the caller's extra items. The dashboard
11
+ * mounts these directly under its own trigger; cards nest them under "Assign…".
12
+ */
13
+ function assignTargetItems(options) {
14
+ const { comment, config, onAssign, extraAssignItems, run } = options;
15
+ const items = [];
16
+ if (onAssign) {
17
+ for (const { id, name, kind } of config.assignees ?? []) {
18
+ const target = {
19
+ id,
20
+ name,
21
+ kind
22
+ };
23
+ const current = comment.assignee !== void 0 && isSameAssignee(comment.assignee, target);
24
+ items.push({
25
+ label: name,
26
+ icon: kind === "agent" ? UiRobotAi : UiUser,
27
+ disabled: current,
28
+ title: current ? `Already assigned to ${name}` : `Assign to ${name}`,
29
+ onSelect: () => run("assign", () => onAssign(target))
30
+ });
31
+ }
32
+ if (comment.assignee) items.push({
33
+ label: "Unassign",
34
+ icon: UiUserMinus,
35
+ onSelect: () => run("assign", () => onAssign(null))
36
+ });
37
+ }
38
+ items.push(...extraAssignItems?.(comment) ?? []);
39
+ return items;
40
+ }
41
+ /**
42
+ * The root-only entries of a card's actions menu: Acknowledge while nobody
43
+ * holds an active root, and an "Assign…" submenu of its targets. Empty for
44
+ * resolved or closed roots, which are no longer being worked on.
45
+ */
46
+ function assignmentMenuItems(options) {
47
+ const { comment, config, onAcknowledge, run } = options;
48
+ if (comment.parentId) return [];
49
+ if (resolveCommentStage(config, comment.status) !== "active") return [];
50
+ const items = [];
51
+ if (onAcknowledge && !comment.assignee) items.push({
52
+ label: "Acknowledge",
53
+ icon: UiUserCheck,
54
+ onSelect: () => run("acknowledge", onAcknowledge)
55
+ });
56
+ const targets = assignTargetItems(options);
57
+ if (targets.length > 0) items.push({
58
+ label: "Assign…",
59
+ icon: UiUserPlus,
60
+ onSelect: () => {},
61
+ children: targets
62
+ });
63
+ return items;
64
+ }
65
+ export { assignTargetItems, assignmentMenuItems };
66
+
67
+ //# sourceMappingURL=comment-assign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-assign.js","names":[],"sources":["../../src/comments/comment-assign.ts"],"sourcesContent":["import type { DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { UiRobotAi, UiUser, UiUserCheck, UiUserMinus, UiUserPlus } from \"../icons\";\nimport { resolveCommentStage } from \"../lib/comment-stage\";\nimport type { Comment, CommentAuthor, CommentConfig } from \"./comment-types\";\n\n/** Runs a card action and reports a failure against `verb` instead of swallowing it. */\nexport type CommentActionRunner = (\n verb: string,\n action: () => void | Promise<void>,\n) => void;\n\nexport type CommentAssignmentOptions = {\n comment: Comment;\n config: CommentConfig;\n /** Claim the root for the current user or agent; omit to hide Acknowledge. */\n onAcknowledge?: () => void | Promise<void>;\n /** Hand the root to `assignee`, or clear it with `null`; omit to hide the people list. */\n onAssign?: (assignee: CommentAuthor | null) => void | Promise<void>;\n /**\n * Caller-owned entries appended to the Assign menu (for example \"Run agent\"),\n * computed per comment so they can reflect its state.\n */\n extraAssignItems?: (comment: Comment) => DropdownMenuItem[];\n run: CommentActionRunner;\n};\n\nfunction isSameAssignee(left: CommentAuthor, right: CommentAuthor): boolean {\n return left.name === right.name && (left.kind ?? \"user\") === (right.kind ?? \"user\");\n}\n\n/**\n * The targets of an assignment: each configured person or agent, \"Unassign\"\n * while someone holds the root, then the caller's extra items. The dashboard\n * mounts these directly under its own trigger; cards nest them under \"Assign…\".\n */\nexport function assignTargetItems(\n options: CommentAssignmentOptions,\n): DropdownMenuItem[] {\n const { comment, config, onAssign, extraAssignItems, run } = options;\n const items: DropdownMenuItem[] = [];\n if (onAssign) {\n for (const { id, name, kind } of config.assignees ?? []) {\n const target: CommentAuthor = { id, name, kind };\n const current =\n comment.assignee !== undefined &&\n isSameAssignee(comment.assignee, target);\n items.push({\n label: name,\n icon: kind === \"agent\" ? UiRobotAi : UiUser,\n disabled: current,\n title: current ? `Already assigned to ${name}` : `Assign to ${name}`,\n onSelect: () => run(\"assign\", () => onAssign(target)),\n });\n }\n if (comment.assignee) {\n items.push({\n label: \"Unassign\",\n icon: UiUserMinus,\n onSelect: () => run(\"assign\", () => onAssign(null)),\n });\n }\n }\n items.push(...(extraAssignItems?.(comment) ?? []));\n return items;\n}\n\n/**\n * The root-only entries of a card's actions menu: Acknowledge while nobody\n * holds an active root, and an \"Assign…\" submenu of its targets. Empty for\n * resolved or closed roots, which are no longer being worked on.\n */\nexport function assignmentMenuItems(\n options: CommentAssignmentOptions,\n): DropdownMenuItem[] {\n const { comment, config, onAcknowledge, run } = options;\n if (comment.parentId) return [];\n if (resolveCommentStage(config, comment.status) !== \"active\") return [];\n const items: DropdownMenuItem[] = [];\n if (onAcknowledge && !comment.assignee) {\n items.push({\n label: \"Acknowledge\",\n icon: UiUserCheck,\n onSelect: () => run(\"acknowledge\", onAcknowledge),\n });\n }\n const targets = assignTargetItems(options);\n if (targets.length > 0) {\n items.push({\n label: \"Assign…\",\n icon: UiUserPlus,\n // Opening the submenu is the whole action; the parent never fires it.\n onSelect: () => {},\n children: targets,\n });\n }\n return items;\n}\n"],"mappings":";;;;AA0BA,SAAS,eAAe,MAAqB,OAA+B;CAC1E,OAAO,KAAK,SAAS,MAAM,SAAS,KAAK,QAAQ,aAAa,MAAM,QAAQ;AAC9E;;;;;;AAOA,SAAgB,kBACd,SACoB;CACpB,MAAM,EAAE,SAAS,QAAQ,UAAU,kBAAkB,QAAQ;CAC7D,MAAM,QAA4B,CAAC;CACnC,IAAI,UAAU;EACZ,KAAK,MAAM,EAAE,IAAI,MAAM,UAAU,OAAO,aAAa,CAAC,GAAG;GACvD,MAAM,SAAwB;IAAE;IAAI;IAAM;GAAK;GAC/C,MAAM,UACJ,QAAQ,aAAa,KAAA,KACrB,eAAe,QAAQ,UAAU,MAAM;GACzC,MAAM,KAAK;IACT,OAAO;IACP,MAAM,SAAS,UAAU,YAAY;IACrC,UAAU;IACV,OAAO,UAAU,uBAAuB,SAAS,aAAa;IAC9D,gBAAgB,IAAI,gBAAgB,SAAS,MAAM,CAAC;GACtD,CAAC;EACH;EACA,IAAI,QAAQ,UACV,MAAM,KAAK;GACT,OAAO;GACP,MAAM;GACN,gBAAgB,IAAI,gBAAgB,SAAS,IAAI,CAAC;EACpD,CAAC;CAEL;CACA,MAAM,KAAK,GAAI,mBAAmB,OAAO,KAAK,CAAC,CAAE;CACjD,OAAO;AACT;;;;;;AAOA,SAAgB,oBACd,SACoB;CACpB,MAAM,EAAE,SAAS,QAAQ,eAAe,QAAQ;CAChD,IAAI,QAAQ,UAAU,OAAO,CAAC;CAC9B,IAAI,oBAAoB,QAAQ,QAAQ,MAAM,MAAM,UAAU,OAAO,CAAC;CACtE,MAAM,QAA4B,CAAC;CACnC,IAAI,iBAAiB,CAAC,QAAQ,UAC5B,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EACN,gBAAgB,IAAI,eAAe,aAAa;CAClD,CAAC;CAEH,MAAM,UAAU,kBAAkB,OAAO;CACzC,IAAI,QAAQ,SAAS,GACnB,MAAM,KAAK;EACT,OAAO;EACP,MAAM;EAEN,gBAAgB,CAAC;EACjB,UAAU;CACZ,CAAC;CAEH,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.cjs","names":[],"sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from active or resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"mappings":";;AAkHA,IAAa,kBAAkB;;AA+G/B,IAAa,2BAAkD;CAC7D;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,OAAO;CACT;CACA;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;EAAW,OAAO;CAAS;AACvE;;AAGA,IAAa,0BAA0B;CAAC;CAAQ;CAAe;AAAM"}
1
+ {"version":3,"file":"comment-types.cjs","names":[],"sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n /** The agent that posted on `name`'s behalf, when another agent wrote the text. */\n via?: string;\n /** The session that produced the text, so the run can be inspected later. */\n sessionId?: string;\n /** AI response cost in USD for producing the text. */\n cost?: number;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\nexport type CommentAgentRunState = \"queued\" | \"sent\" | \"done\" | \"error\";\n\n/**\n * A root handed to an agent session. Hosts may share one session between many\n * roots; the library only carries the record so a host can render it.\n */\nexport type CommentAgentRun = {\n /** Absent when the hand-off failed before a session existed. */\n sessionId?: string;\n /** ISO-8601 time the hand-off was requested. */\n requestedAt: string;\n state: CommentAgentRunState;\n /** Why the hand-off failed; present only when `state` is `error`. */\n error?: string;\n /** Host label for where the root went, and how it was delivered, when not the host's default session. */\n target?: { label: string; channel?: string };\n};\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** Who holds the thread while it is being worked on; roots only. */\n assignee?: CommentAuthor;\n /** ISO-8601 time when `acknowledgedBy` picked the thread up; absent while merely assigned. */\n acknowledgedAt?: string;\n /** Who acknowledged the thread. */\n acknowledgedBy?: CommentAuthor;\n /** The agent-session hand-off for this thread; roots only. */\n agentRun?: CommentAgentRun;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from active or resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n /** Claim an unassigned active root for the current user or agent. */\n onAcknowledge?: (id: string) => void | Promise<void>;\n /** Hand an active root to `assignee`, or return it to unassigned with `null`. */\n onAssign?: (\n id: string,\n assignee: CommentAuthor | null,\n ) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** People/agents a root can be assigned to; the Assign menu lists exactly these. */\n assignees?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"mappings":";;AAwHA,IAAa,kBAAkB;;AAkJ/B,IAAa,2BAAkD;CAC7D;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,OAAO;CACT;CACA;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;EAAW,OAAO;CAAS;AACvE;;AAGA,IAAa,0BAA0B;CAAC;CAAQ;CAAe;AAAM"}
@@ -78,6 +78,12 @@ export type CommentAuthor = {
78
78
  avatar?: string;
79
79
  /** Glyph override for `kind: "agent"` authors. */
80
80
  icon?: string | StaticIconComponent;
81
+ /** The agent that posted on `name`'s behalf, when another agent wrote the text. */
82
+ via?: string;
83
+ /** The session that produced the text, so the run can be inspected later. */
84
+ sessionId?: string;
85
+ /** AI response cost in USD for producing the text. */
86
+ cost?: number;
81
87
  };
82
88
  /**
83
89
  * An opaque anchor key locating a comment within a document. Not a JSON path —
@@ -90,6 +96,25 @@ export type CommentRating = "positive" | "negative";
90
96
  export type CommentReviewDecision = "approved" | "rejected" | "revision_requested";
91
97
  /** Anchor key reserved for document-level (un-anchored) comments. */
92
98
  export declare const DOCUMENT_ANCHOR = "__document__";
99
+ export type CommentAgentRunState = "queued" | "sent" | "done" | "error";
100
+ /**
101
+ * A root handed to an agent session. Hosts may share one session between many
102
+ * roots; the library only carries the record so a host can render it.
103
+ */
104
+ export type CommentAgentRun = {
105
+ /** Absent when the hand-off failed before a session existed. */
106
+ sessionId?: string;
107
+ /** ISO-8601 time the hand-off was requested. */
108
+ requestedAt: string;
109
+ state: CommentAgentRunState;
110
+ /** Why the hand-off failed; present only when `state` is `error`. */
111
+ error?: string;
112
+ /** Host label for where the root went, and how it was delivered, when not the host's default session. */
113
+ target?: {
114
+ label: string;
115
+ channel?: string;
116
+ };
117
+ };
93
118
  /** A single comment. Replies set `parentId`; roots leave it null. */
94
119
  export type Comment = {
95
120
  id: string;
@@ -113,6 +138,14 @@ export type Comment = {
113
138
  closedAt?: string;
114
139
  /** Human who closed the comment. */
115
140
  closedBy?: CommentAuthor;
141
+ /** Who holds the thread while it is being worked on; roots only. */
142
+ assignee?: CommentAuthor;
143
+ /** ISO-8601 time when `acknowledgedBy` picked the thread up; absent while merely assigned. */
144
+ acknowledgedAt?: string;
145
+ /** Who acknowledged the thread. */
146
+ acknowledgedBy?: CommentAuthor;
147
+ /** The agent-session hand-off for this thread; roots only. */
148
+ agentRun?: CommentAgentRun;
116
149
  /** facet.key → selected option value. */
117
150
  facets?: Record<string, string>;
118
151
  refs?: CommentRefGroup[];
@@ -148,6 +181,10 @@ export type CommentCallbacks = {
148
181
  onUpdateStatus?: (id: string, status: string) => void | Promise<void>;
149
182
  /** Human-only transition from active or resolved to closed. */
150
183
  onClose?: (id: string) => void | Promise<void>;
184
+ /** Claim an unassigned active root for the current user or agent. */
185
+ onAcknowledge?: (id: string) => void | Promise<void>;
186
+ /** Hand an active root to `assignee`, or return it to unassigned with `null`. */
187
+ onAssign?: (id: string, assignee: CommentAuthor | null) => void | Promise<void>;
151
188
  onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;
152
189
  onDelete?: (id: string) => void | Promise<void>;
153
190
  onChecklistToggle?: (id: string, index: number, next: string) => void | Promise<void>;
@@ -164,6 +201,8 @@ export type CommentConfig = {
164
201
  facets?: CommentFacet[];
165
202
  /** People/agents available for @-mention. */
166
203
  mentionables?: CommentMentionable[];
204
+ /** People/agents a root can be assigned to; the Assign menu lists exactly these. */
205
+ assignees?: CommentMentionable[];
167
206
  /** Status values a checklist item cycles through on click. */
168
207
  checklistStatusCycle?: string[];
169
208
  };
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.d.ts","sourceRoot":"","sources":["../../src/comments/comment-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comment-types.d.ts","sourceRoot":"","sources":["../../src/comments/comment-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-types.js","names":[],"sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from active or resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"mappings":";;AAkHA,IAAa,kBAAkB;;AA+G/B,IAAa,2BAAkD;CAC7D;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,OAAO;CACT;CACA;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;EAAW,OAAO;CAAS;AACvE;;AAGA,IAAa,0BAA0B;CAAC;CAAQ;CAAe;AAAM"}
1
+ {"version":3,"file":"comment-types.js","names":[],"sources":["../../src/comments/comment-types.ts"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { StaticIconComponent } from \"../data/Icon\";\n\n/** Semantic tone driving a status/facet color (maps onto Badge tones). */\nexport type CommentTone =\n | \"default\"\n | \"info\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"neutral\";\n\n/** Product lifecycle stage represented by one or more stored statuses. */\nexport type CommentStatusStage = \"active\" | \"resolved\" | \"closed\";\n\n/** A single selectable status (e.g. \"open\", \"resolved\"). Consumer-defined. */\nexport type CommentStatusConfig = {\n /** Stable value stored on a comment's `status`. */\n value: string;\n /** Human label shown in menus and badges. */\n label: string;\n /** Color tone for the status chip. */\n tone?: CommentTone;\n /** Optional leading glyph. */\n icon?: string | StaticIconComponent;\n /** Lifecycle stage used by review queues and status actions. */\n stage?: CommentStatusStage;\n /**\n * Whether this status counts as \"unresolved/open\" — drives progress tallies\n * and which groups start expanded. Defaults to false.\n */\n unresolved?: boolean;\n};\n\n/** One option of a generic facet (e.g. a \"category\" value). */\nexport type CommentFacetOption = {\n value: string;\n label: string;\n tone?: CommentTone;\n /** Compact glyph for the collapsed card (e.g. \"BS\" for a category). */\n short?: string;\n};\n\n/**\n * A generic, consumer-supplied classification axis. Replaces the financial\n * category/severity vocabulary — any app declares its own facets.\n */\nexport type CommentFacet = {\n /** Key into `Comment.facets`. */\n key: string;\n label: string;\n options: CommentFacetOption[];\n /** Allow several values to be selected at once in the filter bar. */\n multiple?: boolean;\n};\n\nexport type CommentMentionKind = \"user\" | \"agent\";\n\n/** A person or agent that can be @-mentioned in the composer. */\nexport type CommentMentionable = {\n id: string;\n name: string;\n /** Image URL for `kind: \"user\"`. */\n avatar?: string;\n kind: CommentMentionKind;\n /** Glyph override for `kind: \"agent\"`. */\n icon?: string | StaticIconComponent;\n};\n\n/** A resolved mention emitted when a comment referencing a mentionable is posted. */\nexport type CommentMention = {\n id: string;\n name: string;\n kind: CommentMentionKind;\n};\n\n/** A labelled group of reference chips (e.g. linked ids). */\nexport type CommentRefGroup = {\n label: string;\n items: string[];\n /** Render items in a monospace font. */\n mono?: boolean;\n};\n\n/** One item of a generic checklist; `status` cycles through `checklistStatusCycle`. */\nexport type CommentChecklistItem = {\n label: string;\n status: string;\n};\n\nexport type CommentAuthor = {\n id?: string;\n name: string;\n kind?: CommentMentionKind;\n avatar?: string;\n /** Glyph override for `kind: \"agent\"` authors. */\n icon?: string | StaticIconComponent;\n /** The agent that posted on `name`'s behalf, when another agent wrote the text. */\n via?: string;\n /** The session that produced the text, so the run can be inspected later. */\n sessionId?: string;\n /** AI response cost in USD for producing the text. */\n cost?: number;\n};\n\n/**\n * An opaque anchor key locating a comment within a document. Not a JSON path —\n * any stable string a consumer registers via the provider. `null`/absent means\n * document-level.\n */\nexport type CommentAnchor = string;\n\n/** Binary review signal attached to a root comment. */\nexport type CommentRating = \"positive\" | \"negative\";\nexport type CommentReviewDecision =\n | \"approved\"\n | \"rejected\"\n | \"revision_requested\";\n\n/** Anchor key reserved for document-level (un-anchored) comments. */\nexport const DOCUMENT_ANCHOR = \"__document__\";\n\nexport type CommentAgentRunState = \"queued\" | \"sent\" | \"done\" | \"error\";\n\n/**\n * A root handed to an agent session. Hosts may share one session between many\n * roots; the library only carries the record so a host can render it.\n */\nexport type CommentAgentRun = {\n /** Absent when the hand-off failed before a session existed. */\n sessionId?: string;\n /** ISO-8601 time the hand-off was requested. */\n requestedAt: string;\n state: CommentAgentRunState;\n /** Why the hand-off failed; present only when `state` is `error`. */\n error?: string;\n /** Host label for where the root went, and how it was delivered, when not the host's default session. */\n target?: { label: string; channel?: string };\n};\n\n/** A single comment. Replies set `parentId`; roots leave it null. */\nexport type Comment = {\n id: string;\n body: string;\n /** ISO-8601 creation time. */\n createdAt: string;\n /** ISO-8601 last-update time. */\n updatedAt?: string;\n author: CommentAuthor | null;\n /** Key into the configured statuses; roots only. */\n status?: string;\n /** Parent comment id when this is a reply. */\n parentId?: string | null;\n /** Where the comment is anchored; null/absent = document-level. */\n anchor?: CommentAnchor | null;\n /** Optional positive/negative review signal; roots only. */\n rating?: CommentRating;\n /** Human decision on an opted-in playground review element; roots only. */\n reviewDecision?: CommentReviewDecision;\n /** ISO-8601 time when a human closed the resolved comment. */\n closedAt?: string;\n /** Human who closed the comment. */\n closedBy?: CommentAuthor;\n /** Who holds the thread while it is being worked on; roots only. */\n assignee?: CommentAuthor;\n /** ISO-8601 time when `acknowledgedBy` picked the thread up; absent while merely assigned. */\n acknowledgedAt?: string;\n /** Who acknowledged the thread. */\n acknowledgedBy?: CommentAuthor;\n /** The agent-session hand-off for this thread; roots only. */\n agentRun?: CommentAgentRun;\n /** facet.key → selected option value. */\n facets?: Record<string, string>;\n refs?: CommentRefGroup[];\n checklist?: CommentChecklistItem[];\n};\n\n/** Payload for creating a new root comment. */\nexport type CommentCreateInput = {\n body: string;\n anchor?: CommentAnchor | null;\n rating?: CommentRating;\n reviewDecision?: CommentReviewDecision;\n facets?: Record<string, string>;\n mentions?: CommentMention[];\n};\n\nexport type CommentCreateAction = { id: string; label: string };\n\n/** Payload for replying to a comment. */\nexport type CommentReplyInput = {\n parentId: string;\n body: string;\n anchor?: CommentAnchor | null;\n mentions?: CommentMention[];\n};\n\n/**\n * Controlled callbacks. The components own no data fetching; the consumer\n * performs the mutation and feeds the updated `comments` back in.\n */\nexport type CommentCallbacks = {\n onCreate?: (\n input: CommentCreateInput,\n actionId?: string,\n ) => void | Promise<void>;\n onReply?: (input: CommentReplyInput) => void | Promise<void>;\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n /** Human-only transition from active or resolved to closed. */\n onClose?: (id: string) => void | Promise<void>;\n /** Claim an unassigned active root for the current user or agent. */\n onAcknowledge?: (id: string) => void | Promise<void>;\n /** Hand an active root to `assignee`, or return it to unassigned with `null`. */\n onAssign?: (\n id: string,\n assignee: CommentAuthor | null,\n ) => void | Promise<void>;\n onUpdateRating?: (id: string, rating: CommentRating) => void | Promise<void>;\n onDelete?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (\n id: string,\n index: number,\n next: string,\n ) => void | Promise<void>;\n /** Fired when a posted comment references a mentionable. */\n onMention?: (mention: CommentMention, context: { body: string }) => void;\n};\n\n/** Static configuration shared across the comment components. */\nexport type CommentConfig = {\n /** Selectable statuses; the first `unresolved` one is the default for new comments. */\n statuses: CommentStatusConfig[];\n /** Classification axes (category/severity/etc.). */\n facets?: CommentFacet[];\n /** People/agents available for @-mention. */\n mentionables?: CommentMentionable[];\n /** People/agents a root can be assigned to; the Assign menu lists exactly these. */\n assignees?: CommentMentionable[];\n /** Status values a checklist item cycles through on click. */\n checklistStatusCycle?: string[];\n};\n\n/** Aggregate metadata for one anchor, derived from the comment list. */\nexport type CommentAnchorMeta = {\n count: number;\n authors: string[];\n latestStatus?: string;\n};\n\n/** Selected filter state for the filter bar / `applyCommentFilters`. */\nexport type CommentFilters = {\n /** Selected status values; empty = all statuses. */\n statuses: Set<string>;\n /** facet.key → selected option values; empty set = all values for that facet. */\n facets: Record<string, Set<string>>;\n /** Restrict to an author kind, or \"all\". */\n authorKind?: CommentMentionKind | \"all\";\n};\n\n/** Optional renderers passed down to a card. */\nexport type CommentRenderOptions = {\n /** Custom comment-body renderer (e.g. full Markdown). Defaults to CommentMarkdown. */\n renderBody?: (body: string) => ReactNode;\n};\n\n/** A domain-free default status set: open / in progress / resolved / closed. */\nexport const DEFAULT_COMMENT_STATUSES: CommentStatusConfig[] = [\n {\n value: \"open\",\n label: \"Open\",\n tone: \"info\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"in_progress\",\n label: \"In progress\",\n tone: \"warning\",\n unresolved: true,\n stage: \"active\",\n },\n {\n value: \"resolved\",\n label: \"Resolved\",\n tone: \"success\",\n stage: \"resolved\",\n },\n { value: \"closed\", label: \"Closed\", tone: \"neutral\", stage: \"closed\" },\n];\n\n/** Default checklist status cycle used when a consumer omits one. */\nexport const DEFAULT_CHECKLIST_CYCLE = [\"open\", \"in_progress\", \"done\"];\n"],"mappings":";;AAwHA,IAAa,kBAAkB;;AAkJ/B,IAAa,2BAAkD;CAC7D;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,YAAY;EACZ,OAAO;CACT;CACA;EACE,OAAO;EACP,OAAO;EACP,MAAM;EACN,OAAO;CACT;CACA;EAAE,OAAO;EAAU,OAAO;EAAU,MAAM;EAAW,OAAO;CAAS;AACvE;;AAGA,IAAa,0BAA0B;CAAC;CAAQ;CAAe;AAAM"}
@@ -196,6 +196,8 @@ function buildThreadListHandlers(comments, config, cb) {
196
196
  const handlers = {};
197
197
  if (cb.onUpdateStatus) handlers.onUpdateStatus = cb.onUpdateStatus;
198
198
  if (cb.onClose) handlers.onClose = cb.onClose;
199
+ if (cb.onAcknowledge) handlers.onAcknowledge = cb.onAcknowledge;
200
+ if (cb.onAssign) handlers.onAssign = cb.onAssign;
199
201
  if (cb.onDelete) handlers.onDelete = cb.onDelete;
200
202
  if (cb.onChecklistToggle) {
201
203
  const toggle = cb.onChecklistToggle;
@@ -1 +1 @@
1
- {"version":3,"file":"comment-utils.cjs","names":["DEFAULT_CHECKLIST_CYCLE"],"sources":["../../src/comments/comment-utils.ts"],"sourcesContent":["import type { BadgeTone } from \"../data/Badge\";\nimport {\n DEFAULT_CHECKLIST_CYCLE,\n type Comment,\n type CommentAnchor,\n type CommentAnchorMeta,\n type CommentAuthor,\n type CommentCallbacks,\n type CommentConfig,\n type CommentFacet,\n type CommentFacetOption,\n type CommentFilters,\n type CommentMention,\n type CommentMentionable,\n type CommentMentionKind,\n type CommentStatusConfig,\n type CommentTone,\n DOCUMENT_ANCHOR,\n} from \"./comment-types\";\n\n/** Human-readable name for an author, falling back to \"Unknown\". */\nexport function authorDisplayName(author: CommentAuthor | null): string {\n return author?.name?.trim() || \"Unknown\";\n}\n\n/** Maps a CommentTone onto the Badge component's tone vocabulary. */\nexport function toneToBadgeTone(tone: CommentTone | undefined): BadgeTone {\n switch (tone) {\n case \"success\":\n return \"success\";\n case \"danger\":\n return \"danger\";\n case \"warning\":\n return \"warning\";\n case \"info\":\n return \"info\";\n case \"neutral\":\n case \"default\":\n default:\n return \"neutral\";\n }\n}\n\n/** Looks up the status config for a stored status value. */\nexport function resolveStatusConfig(\n config: CommentConfig,\n value: string | undefined,\n): CommentStatusConfig | undefined {\n if (value == null) return undefined;\n return config.statuses.find((s) => s.value === value);\n}\n\n/** Looks up a facet option for a stored facet value. */\nexport function resolveFacetOption(\n facet: CommentFacet,\n value: string | undefined,\n): CommentFacetOption | undefined {\n if (value == null) return undefined;\n return facet.options.find((o) => o.value === value);\n}\n\n/** The default status value for new comments: first unresolved, else first. */\nexport function defaultStatusValue(config: CommentConfig): string | undefined {\n const unresolved = config.statuses.find((s) => s.unresolved);\n return (unresolved ?? config.statuses[0])?.value;\n}\n\n/** Whether a stored status counts as unresolved/open. */\nexport function isUnresolved(\n config: CommentConfig,\n status: string | undefined,\n): boolean {\n return resolveStatusConfig(config, status)?.unresolved ?? false;\n}\n\n/** Returns the root (non-reply) comments in input order. */\nexport function getRoots(comments: Comment[]): Comment[] {\n return comments.filter((c) => !c.parentId);\n}\n\n/** Indexes replies by their parent id. */\nexport function buildReplyMap(comments: Comment[]): Map<string, Comment[]> {\n const map = new Map<string, Comment[]>();\n for (const reply of comments) {\n if (!reply.parentId) continue;\n const items = map.get(reply.parentId) ?? [];\n items.push(reply);\n map.set(reply.parentId, items);\n }\n return map;\n}\n\n/**\n * Comments forming the threads rooted at `anchor`: matching roots plus their\n * descendants. Replies carry no anchor of their own — they belong to a thread,\n * not to a location — so selecting by anchor equality alone would drop them.\n */\nexport function selectAnchorThreads(\n comments: Comment[],\n anchor: CommentAnchor,\n): Comment[] {\n const roots = comments.filter(\n (c) => !c.parentId && (c.anchor ?? DOCUMENT_ANCHOR) === anchor,\n );\n const ids = new Set(roots.map((c) => String(c.id)));\n const descendants: Comment[] = [];\n // Fixed point, so a reply to a reply is kept when replies are not flattened.\n for (let grew = true; grew; ) {\n grew = false;\n for (const c of comments) {\n if (!c.parentId || ids.has(String(c.id))) continue;\n if (!ids.has(String(c.parentId))) continue;\n ids.add(String(c.id));\n descendants.push(c);\n grew = true;\n }\n }\n return [...roots, ...descendants];\n}\n\n/**\n * Threads whose root is not yet resolved. A root carrying no status has not\n * been acted on, so it counts as unresolved; replies follow their root.\n */\nexport function selectUnresolvedThreads(\n comments: Comment[],\n config: CommentConfig,\n): Comment[] {\n const keep = new Set(\n getRoots(comments)\n .filter(\n (root) => root.status == null || isUnresolved(config, root.status),\n )\n .map((root) => String(root.id)),\n );\n return comments.filter((c) => keep.has(String(c.parentId ?? c.id)));\n}\n\n/** Stable reply ordering: by creation time, then id. */\nexport function sortReplies(replies: Comment[]): Comment[] {\n return [...replies].sort((a, b) => {\n if (a.createdAt !== b.createdAt)\n return a.createdAt.localeCompare(b.createdAt);\n return String(a.id).localeCompare(String(b.id));\n });\n}\n\n/** Groups root comments by the value of a facet key (missing → \"\"). */\nexport function groupByFacet(\n comments: Comment[],\n facetKey: string,\n): Map<string, Comment[]> {\n const map = new Map<string, Comment[]>();\n for (const root of getRoots(comments)) {\n const key = root.facets?.[facetKey] ?? \"\";\n const items = map.get(key) ?? [];\n items.push(root);\n map.set(key, items);\n }\n return map;\n}\n\n/** Per-anchor comment counts derived from the list (document-level → DOCUMENT_ANCHOR). */\nexport function deriveAnchorCounts(\n comments: Comment[],\n): Record<CommentAnchor, number> {\n const counts: Record<CommentAnchor, number> = {};\n for (const c of comments) {\n const key = c.anchor ?? DOCUMENT_ANCHOR;\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n}\n\n/** Per-anchor aggregate metadata (count, distinct authors, latest status). */\nexport function deriveAnchorMeta(\n comments: Comment[],\n): Record<CommentAnchor, CommentAnchorMeta> {\n const grouped: Record<CommentAnchor, Comment[]> = {};\n for (const c of comments) {\n const key = c.anchor ?? DOCUMENT_ANCHOR;\n (grouped[key] ??= []).push(c);\n }\n const meta: Record<CommentAnchor, CommentAnchorMeta> = {};\n for (const [anchor, items] of Object.entries(grouped)) {\n const authors = [\n ...new Set(\n items.map((c) => c.author?.name).filter((n): n is string => !!n),\n ),\n ];\n const latest = items.reduce((a, b) =>\n (a.updatedAt ?? a.createdAt) > (b.updatedAt ?? b.createdAt) ? a : b,\n );\n meta[anchor] = {\n count: items.length,\n authors,\n ...(latest.status != null ? { latestStatus: latest.status } : {}),\n };\n }\n return meta;\n}\n\n/** Sums counts for an anchor and its descendants under a separator-delimited prefix. */\nexport function commentCountForPrefix(\n counts: Record<string, number>,\n prefix: string,\n separator = \".\",\n): number {\n let total = 0;\n for (const [key, count] of Object.entries(counts)) {\n if (key === prefix || key.startsWith(prefix + separator)) total += count;\n }\n return total;\n}\n\n/** Advances a checklist status to the next in the cycle (wrapping). */\nexport function nextChecklistStatus(\n current: string,\n cycle = DEFAULT_CHECKLIST_CYCLE,\n): string {\n const idx = cycle.indexOf(current);\n if (idx === -1) return cycle[0] ?? current;\n return cycle[(idx + 1) % cycle.length] ?? current;\n}\n\n/** Strips inline markdown punctuation and truncates to a plain preview. */\nexport function truncatePlain(body: string, max = 80): string {\n const plain = body.replace(/[#*_`~>[\\]()!]/g, \"\").trim();\n return plain.length > max ? `${plain.slice(0, max)}…` : plain;\n}\n\nfunction authorKindOf(comment: Comment): CommentMentionKind {\n return comment.author?.kind ?? \"user\";\n}\n\n/**\n * Filters a comment list by status / facets / author kind while keeping threads\n * intact: a reply survives iff its root survives. An empty status set or empty\n * per-facet set means \"no constraint\" for that axis.\n */\nexport function applyCommentFilters(\n comments: Comment[],\n filters: CommentFilters,\n config: CommentConfig,\n): Comment[] {\n const facetKeys = (config.facets ?? []).map((f) => f.key);\n const passingRootIds = new Set<string>();\n\n for (const root of getRoots(comments)) {\n if (\n filters.statuses.size > 0 &&\n (root.status == null || !filters.statuses.has(root.status))\n ) {\n continue;\n }\n if (\n filters.authorKind &&\n filters.authorKind !== \"all\" &&\n authorKindOf(root) !== filters.authorKind\n ) {\n continue;\n }\n const facetsPass = facetKeys.every((key) => {\n const selected = filters.facets[key];\n if (!selected || selected.size === 0) return true;\n const value = root.facets?.[key];\n return value != null && selected.has(value);\n });\n if (!facetsPass) continue;\n passingRootIds.add(root.id);\n }\n\n return comments.filter((c) =>\n c.parentId ? passingRootIds.has(c.parentId) : passingRootIds.has(c.id),\n );\n}\n\n/** True when any filter axis constrains the result. */\nexport function hasActiveFilters(filters: CommentFilters): boolean {\n if (filters.statuses.size > 0) return true;\n if (filters.authorKind && filters.authorKind !== \"all\") return true;\n return Object.values(filters.facets).some((set) => set.size > 0);\n}\n\n/** An empty filter state. */\nexport function emptyCommentFilters(): CommentFilters {\n return { statuses: new Set(), facets: {}, authorKind: \"all\" };\n}\n\n/** Finds mentionables whose `@name` token appears in a body (case-insensitive). */\nexport function matchMentionsInBody(\n body: string,\n mentionables: CommentMentionable[],\n): CommentMention[] {\n const lower = body.toLowerCase();\n return mentionables\n .filter((m) => lower.includes(`@${m.name.toLowerCase()}`))\n .map((m) => ({ id: m.id, name: m.name, kind: m.kind }));\n}\n\n/** Per-id handlers consumed by CommentThreadList. */\nexport type ThreadListHandlers = {\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n onClose?: (id: string) => void | Promise<void>;\n onChecklistToggle?: (id: string, index: number) => void;\n onDelete?: (id: string) => void;\n onReply?: (parent: Comment, body: string) => void | Promise<void>;\n};\n\n/**\n * Adapts high-level {@link CommentCallbacks} into the id-keyed handlers a\n * {@link CommentThreadList} consumes: resolves the next checklist status from the\n * cycle and extracts mentions from a reply body. Shared by `CommentThread` and\n * `CommentSidePanel` so the adaptation lives in one place.\n */\nexport function buildThreadListHandlers(\n comments: Comment[],\n config: CommentConfig,\n cb: CommentCallbacks,\n): ThreadListHandlers {\n const handlers: ThreadListHandlers = {};\n if (cb.onUpdateStatus) handlers.onUpdateStatus = cb.onUpdateStatus;\n if (cb.onClose) handlers.onClose = cb.onClose;\n if (cb.onDelete) handlers.onDelete = cb.onDelete;\n if (cb.onChecklistToggle) {\n const toggle = cb.onChecklistToggle;\n handlers.onChecklistToggle = (id, index) => {\n const item = comments.find((c) => c.id === id)?.checklist?.[index];\n if (!item) return;\n void toggle(\n id,\n index,\n nextChecklistStatus(item.status, config.checklistStatusCycle),\n );\n };\n }\n if (cb.onReply) {\n const reply = cb.onReply;\n const onMention = cb.onMention;\n handlers.onReply = async (parent, body) => {\n const mentions = matchMentionsInBody(body, config.mentionables ?? []);\n await reply({\n parentId: parent.id,\n body,\n anchor: parent.anchor ?? null,\n ...(mentions.length > 0 ? { mentions } : {}),\n });\n for (const mention of mentions) onMention?.(mention, { body });\n };\n }\n return handlers;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"comment-utils.cjs","names":["DEFAULT_CHECKLIST_CYCLE"],"sources":["../../src/comments/comment-utils.ts"],"sourcesContent":["import type { BadgeTone } from \"../data/Badge\";\nimport {\n DEFAULT_CHECKLIST_CYCLE,\n type Comment,\n type CommentAnchor,\n type CommentAnchorMeta,\n type CommentAuthor,\n type CommentCallbacks,\n type CommentConfig,\n type CommentFacet,\n type CommentFacetOption,\n type CommentFilters,\n type CommentMention,\n type CommentMentionable,\n type CommentMentionKind,\n type CommentStatusConfig,\n type CommentTone,\n DOCUMENT_ANCHOR,\n} from \"./comment-types\";\n\n/** Human-readable name for an author, falling back to \"Unknown\". */\nexport function authorDisplayName(author: CommentAuthor | null): string {\n return author?.name?.trim() || \"Unknown\";\n}\n\n/** Maps a CommentTone onto the Badge component's tone vocabulary. */\nexport function toneToBadgeTone(tone: CommentTone | undefined): BadgeTone {\n switch (tone) {\n case \"success\":\n return \"success\";\n case \"danger\":\n return \"danger\";\n case \"warning\":\n return \"warning\";\n case \"info\":\n return \"info\";\n case \"neutral\":\n case \"default\":\n default:\n return \"neutral\";\n }\n}\n\n/** Looks up the status config for a stored status value. */\nexport function resolveStatusConfig(\n config: CommentConfig,\n value: string | undefined,\n): CommentStatusConfig | undefined {\n if (value == null) return undefined;\n return config.statuses.find((s) => s.value === value);\n}\n\n/** Looks up a facet option for a stored facet value. */\nexport function resolveFacetOption(\n facet: CommentFacet,\n value: string | undefined,\n): CommentFacetOption | undefined {\n if (value == null) return undefined;\n return facet.options.find((o) => o.value === value);\n}\n\n/** The default status value for new comments: first unresolved, else first. */\nexport function defaultStatusValue(config: CommentConfig): string | undefined {\n const unresolved = config.statuses.find((s) => s.unresolved);\n return (unresolved ?? config.statuses[0])?.value;\n}\n\n/** Whether a stored status counts as unresolved/open. */\nexport function isUnresolved(\n config: CommentConfig,\n status: string | undefined,\n): boolean {\n return resolveStatusConfig(config, status)?.unresolved ?? false;\n}\n\n/** Returns the root (non-reply) comments in input order. */\nexport function getRoots(comments: Comment[]): Comment[] {\n return comments.filter((c) => !c.parentId);\n}\n\n/** Indexes replies by their parent id. */\nexport function buildReplyMap(comments: Comment[]): Map<string, Comment[]> {\n const map = new Map<string, Comment[]>();\n for (const reply of comments) {\n if (!reply.parentId) continue;\n const items = map.get(reply.parentId) ?? [];\n items.push(reply);\n map.set(reply.parentId, items);\n }\n return map;\n}\n\n/**\n * Comments forming the threads rooted at `anchor`: matching roots plus their\n * descendants. Replies carry no anchor of their own — they belong to a thread,\n * not to a location — so selecting by anchor equality alone would drop them.\n */\nexport function selectAnchorThreads(\n comments: Comment[],\n anchor: CommentAnchor,\n): Comment[] {\n const roots = comments.filter(\n (c) => !c.parentId && (c.anchor ?? DOCUMENT_ANCHOR) === anchor,\n );\n const ids = new Set(roots.map((c) => String(c.id)));\n const descendants: Comment[] = [];\n // Fixed point, so a reply to a reply is kept when replies are not flattened.\n for (let grew = true; grew; ) {\n grew = false;\n for (const c of comments) {\n if (!c.parentId || ids.has(String(c.id))) continue;\n if (!ids.has(String(c.parentId))) continue;\n ids.add(String(c.id));\n descendants.push(c);\n grew = true;\n }\n }\n return [...roots, ...descendants];\n}\n\n/**\n * Threads whose root is not yet resolved. A root carrying no status has not\n * been acted on, so it counts as unresolved; replies follow their root.\n */\nexport function selectUnresolvedThreads(\n comments: Comment[],\n config: CommentConfig,\n): Comment[] {\n const keep = new Set(\n getRoots(comments)\n .filter(\n (root) => root.status == null || isUnresolved(config, root.status),\n )\n .map((root) => String(root.id)),\n );\n return comments.filter((c) => keep.has(String(c.parentId ?? c.id)));\n}\n\n/** Stable reply ordering: by creation time, then id. */\nexport function sortReplies(replies: Comment[]): Comment[] {\n return [...replies].sort((a, b) => {\n if (a.createdAt !== b.createdAt)\n return a.createdAt.localeCompare(b.createdAt);\n return String(a.id).localeCompare(String(b.id));\n });\n}\n\n/** Groups root comments by the value of a facet key (missing → \"\"). */\nexport function groupByFacet(\n comments: Comment[],\n facetKey: string,\n): Map<string, Comment[]> {\n const map = new Map<string, Comment[]>();\n for (const root of getRoots(comments)) {\n const key = root.facets?.[facetKey] ?? \"\";\n const items = map.get(key) ?? [];\n items.push(root);\n map.set(key, items);\n }\n return map;\n}\n\n/** Per-anchor comment counts derived from the list (document-level → DOCUMENT_ANCHOR). */\nexport function deriveAnchorCounts(\n comments: Comment[],\n): Record<CommentAnchor, number> {\n const counts: Record<CommentAnchor, number> = {};\n for (const c of comments) {\n const key = c.anchor ?? DOCUMENT_ANCHOR;\n counts[key] = (counts[key] ?? 0) + 1;\n }\n return counts;\n}\n\n/** Per-anchor aggregate metadata (count, distinct authors, latest status). */\nexport function deriveAnchorMeta(\n comments: Comment[],\n): Record<CommentAnchor, CommentAnchorMeta> {\n const grouped: Record<CommentAnchor, Comment[]> = {};\n for (const c of comments) {\n const key = c.anchor ?? DOCUMENT_ANCHOR;\n (grouped[key] ??= []).push(c);\n }\n const meta: Record<CommentAnchor, CommentAnchorMeta> = {};\n for (const [anchor, items] of Object.entries(grouped)) {\n const authors = [\n ...new Set(\n items.map((c) => c.author?.name).filter((n): n is string => !!n),\n ),\n ];\n const latest = items.reduce((a, b) =>\n (a.updatedAt ?? a.createdAt) > (b.updatedAt ?? b.createdAt) ? a : b,\n );\n meta[anchor] = {\n count: items.length,\n authors,\n ...(latest.status != null ? { latestStatus: latest.status } : {}),\n };\n }\n return meta;\n}\n\n/** Sums counts for an anchor and its descendants under a separator-delimited prefix. */\nexport function commentCountForPrefix(\n counts: Record<string, number>,\n prefix: string,\n separator = \".\",\n): number {\n let total = 0;\n for (const [key, count] of Object.entries(counts)) {\n if (key === prefix || key.startsWith(prefix + separator)) total += count;\n }\n return total;\n}\n\n/** Advances a checklist status to the next in the cycle (wrapping). */\nexport function nextChecklistStatus(\n current: string,\n cycle = DEFAULT_CHECKLIST_CYCLE,\n): string {\n const idx = cycle.indexOf(current);\n if (idx === -1) return cycle[0] ?? current;\n return cycle[(idx + 1) % cycle.length] ?? current;\n}\n\n/** Strips inline markdown punctuation and truncates to a plain preview. */\nexport function truncatePlain(body: string, max = 80): string {\n const plain = body.replace(/[#*_`~>[\\]()!]/g, \"\").trim();\n return plain.length > max ? `${plain.slice(0, max)}…` : plain;\n}\n\nfunction authorKindOf(comment: Comment): CommentMentionKind {\n return comment.author?.kind ?? \"user\";\n}\n\n/**\n * Filters a comment list by status / facets / author kind while keeping threads\n * intact: a reply survives iff its root survives. An empty status set or empty\n * per-facet set means \"no constraint\" for that axis.\n */\nexport function applyCommentFilters(\n comments: Comment[],\n filters: CommentFilters,\n config: CommentConfig,\n): Comment[] {\n const facetKeys = (config.facets ?? []).map((f) => f.key);\n const passingRootIds = new Set<string>();\n\n for (const root of getRoots(comments)) {\n if (\n filters.statuses.size > 0 &&\n (root.status == null || !filters.statuses.has(root.status))\n ) {\n continue;\n }\n if (\n filters.authorKind &&\n filters.authorKind !== \"all\" &&\n authorKindOf(root) !== filters.authorKind\n ) {\n continue;\n }\n const facetsPass = facetKeys.every((key) => {\n const selected = filters.facets[key];\n if (!selected || selected.size === 0) return true;\n const value = root.facets?.[key];\n return value != null && selected.has(value);\n });\n if (!facetsPass) continue;\n passingRootIds.add(root.id);\n }\n\n return comments.filter((c) =>\n c.parentId ? passingRootIds.has(c.parentId) : passingRootIds.has(c.id),\n );\n}\n\n/** True when any filter axis constrains the result. */\nexport function hasActiveFilters(filters: CommentFilters): boolean {\n if (filters.statuses.size > 0) return true;\n if (filters.authorKind && filters.authorKind !== \"all\") return true;\n return Object.values(filters.facets).some((set) => set.size > 0);\n}\n\n/** An empty filter state. */\nexport function emptyCommentFilters(): CommentFilters {\n return { statuses: new Set(), facets: {}, authorKind: \"all\" };\n}\n\n/** Finds mentionables whose `@name` token appears in a body (case-insensitive). */\nexport function matchMentionsInBody(\n body: string,\n mentionables: CommentMentionable[],\n): CommentMention[] {\n const lower = body.toLowerCase();\n return mentionables\n .filter((m) => lower.includes(`@${m.name.toLowerCase()}`))\n .map((m) => ({ id: m.id, name: m.name, kind: m.kind }));\n}\n\n/** Per-id handlers consumed by CommentThreadList. */\nexport type ThreadListHandlers = {\n onUpdateStatus?: (id: string, status: string) => void | Promise<void>;\n onClose?: (id: string) => void | Promise<void>;\n onAcknowledge?: (id: string) => void | Promise<void>;\n onAssign?: (\n id: string,\n assignee: CommentAuthor | null,\n ) => void | Promise<void>;\n onChecklistToggle?: (id: string, index: number) => void;\n onDelete?: (id: string) => void;\n onReply?: (parent: Comment, body: string) => void | Promise<void>;\n};\n\n/**\n * Adapts high-level {@link CommentCallbacks} into the id-keyed handlers a\n * {@link CommentThreadList} consumes: resolves the next checklist status from the\n * cycle and extracts mentions from a reply body. Shared by `CommentThread` and\n * `CommentSidePanel` so the adaptation lives in one place.\n */\nexport function buildThreadListHandlers(\n comments: Comment[],\n config: CommentConfig,\n cb: CommentCallbacks,\n): ThreadListHandlers {\n const handlers: ThreadListHandlers = {};\n if (cb.onUpdateStatus) handlers.onUpdateStatus = cb.onUpdateStatus;\n if (cb.onClose) handlers.onClose = cb.onClose;\n if (cb.onAcknowledge) handlers.onAcknowledge = cb.onAcknowledge;\n if (cb.onAssign) handlers.onAssign = cb.onAssign;\n if (cb.onDelete) handlers.onDelete = cb.onDelete;\n if (cb.onChecklistToggle) {\n const toggle = cb.onChecklistToggle;\n handlers.onChecklistToggle = (id, index) => {\n const item = comments.find((c) => c.id === id)?.checklist?.[index];\n if (!item) return;\n void toggle(\n id,\n index,\n nextChecklistStatus(item.status, config.checklistStatusCycle),\n );\n };\n }\n if (cb.onReply) {\n const reply = cb.onReply;\n const onMention = cb.onMention;\n handlers.onReply = async (parent, body) => {\n const mentions = matchMentionsInBody(body, config.mentionables ?? []);\n await reply({\n parentId: parent.id,\n body,\n anchor: parent.anchor ?? null,\n ...(mentions.length > 0 ? { mentions } : {}),\n });\n for (const mention of mentions) onMention?.(mention, { body });\n };\n }\n return handlers;\n}\n"],"mappings":"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"}
@@ -57,6 +57,8 @@ export declare function matchMentionsInBody(body: string, mentionables: CommentM
57
57
  export type ThreadListHandlers = {
58
58
  onUpdateStatus?: (id: string, status: string) => void | Promise<void>;
59
59
  onClose?: (id: string) => void | Promise<void>;
60
+ onAcknowledge?: (id: string) => void | Promise<void>;
61
+ onAssign?: (id: string, assignee: CommentAuthor | null) => void | Promise<void>;
60
62
  onChecklistToggle?: (id: string, index: number) => void;
61
63
  onDelete?: (id: string) => void;
62
64
  onReply?: (parent: Comment, body: string) => void | Promise<void>;