@flanksource/clicky-ui 0.3.33 → 0.3.35

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 (729) hide show
  1. package/README.md +4 -0
  2. package/dist/ai.cjs +3 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/comments/CommentCard.cjs +9 -8
  7. package/dist/comments/CommentCard.cjs.map +1 -1
  8. package/dist/comments/CommentCard.d.ts +1 -1
  9. package/dist/comments/CommentCard.d.ts.map +1 -1
  10. package/dist/comments/CommentCard.js +2 -1
  11. package/dist/comments/CommentCard.js.map +1 -1
  12. package/dist/comments/CommentCardParts.cjs +2 -1
  13. package/dist/comments/CommentCardParts.cjs.map +1 -1
  14. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  15. package/dist/comments/CommentCardParts.js +2 -1
  16. package/dist/comments/CommentCardParts.js.map +1 -1
  17. package/dist/comments/CommentProvider.d.ts +1 -1
  18. package/dist/comments/CommentSidePanel.cjs +3 -2
  19. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  20. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  21. package/dist/comments/CommentSidePanel.js +2 -1
  22. package/dist/comments/CommentSidePanel.js.map +1 -1
  23. package/dist/comments/CommentThread.d.ts +1 -1
  24. package/dist/comments/CommentThreadList.d.ts +1 -1
  25. package/dist/comments/MentionTextarea.d.ts +1 -1
  26. package/dist/comments/comment-context.d.ts +4 -4
  27. package/dist/comments/comment-fixtures.d.ts +1 -1
  28. package/dist/comments/comment-types.d.ts +1 -1
  29. package/dist/comments/comment-utils.cjs +0 -27
  30. package/dist/comments/comment-utils.cjs.map +1 -1
  31. package/dist/comments/comment-utils.d.ts +1 -7
  32. package/dist/comments/comment-utils.d.ts.map +1 -1
  33. package/dist/comments/comment-utils.js +0 -27
  34. package/dist/comments/comment-utils.js.map +1 -1
  35. package/dist/comments.cjs +4 -3
  36. package/dist/comments.cjs.map +1 -1
  37. package/dist/comments.d.ts +1 -0
  38. package/dist/comments.d.ts.map +1 -1
  39. package/dist/comments.js +2 -1
  40. package/dist/comments.js.map +1 -1
  41. package/dist/components/AccordionList.d.ts +1 -1
  42. package/dist/components/ComboboxControl.d.ts +1 -1
  43. package/dist/components/ComboboxMenu.d.ts +2 -2
  44. package/dist/components/ComboboxTags.cjs +41 -11
  45. package/dist/components/ComboboxTags.cjs.map +1 -1
  46. package/dist/components/ComboboxTags.d.ts +6 -0
  47. package/dist/components/ComboboxTags.d.ts.map +1 -1
  48. package/dist/components/ComboboxTags.js +41 -11
  49. package/dist/components/ComboboxTags.js.map +1 -1
  50. package/dist/components/DateField.d.ts +3 -3
  51. package/dist/components/DatePicker.d.ts +3 -3
  52. package/dist/components/DateTimePicker.d.ts +3 -3
  53. package/dist/components/ErrorWrapper.d.ts +2 -2
  54. package/dist/components/Field.d.ts +1 -1
  55. package/dist/components/FilterBar.d.ts +1 -1
  56. package/dist/components/FormLookupProvider.d.ts +1 -1
  57. package/dist/components/FormatOptionsDropdown.d.ts +1 -1
  58. package/dist/components/IconButton.d.ts +3 -3
  59. package/dist/components/InputField.d.ts +2 -2
  60. package/dist/components/ItemActions.d.ts +1 -1
  61. package/dist/components/JsonSchemaForm.cjs +17 -36
  62. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  63. package/dist/components/JsonSchemaForm.d.ts +1 -1
  64. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  65. package/dist/components/JsonSchemaForm.js +17 -36
  66. package/dist/components/JsonSchemaForm.js.map +1 -1
  67. package/dist/components/ListMenu.d.ts +1 -1
  68. package/dist/components/MultiSelect.d.ts +1 -1
  69. package/dist/components/RangeSlider.cjs +15 -1
  70. package/dist/components/RangeSlider.cjs.map +1 -1
  71. package/dist/components/RangeSlider.d.ts.map +1 -1
  72. package/dist/components/RangeSlider.js +15 -1
  73. package/dist/components/RangeSlider.js.map +1 -1
  74. package/dist/components/SearchInput.d.ts +1 -1
  75. package/dist/components/SegmentedControl.d.ts +1 -1
  76. package/dist/components/SplitButton.d.ts +1 -1
  77. package/dist/components/Switch.d.ts +1 -1
  78. package/dist/components/TreePickerField.cjs +11 -2
  79. package/dist/components/TreePickerField.cjs.map +1 -1
  80. package/dist/components/TreePickerField.d.ts +13 -4
  81. package/dist/components/TreePickerField.d.ts.map +1 -1
  82. package/dist/components/TreePickerField.js +11 -2
  83. package/dist/components/TreePickerField.js.map +1 -1
  84. package/dist/components/UnitStepControls.d.ts +1 -1
  85. package/dist/components/button.d.ts +3 -3
  86. package/dist/components/combobox-types.d.ts +1 -1
  87. package/dist/components/density-switcher.d.ts +1 -1
  88. package/dist/components/filter-bar-context.d.ts +1 -1
  89. package/dist/components/filter-bar-field-utils.d.ts +2 -2
  90. package/dist/components/form-lookup-context.d.ts +1 -1
  91. package/dist/components/icon-menu-picker.d.ts +1 -1
  92. package/dist/components/json-schema-form-accordion-array.cjs +44 -21
  93. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  94. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  95. package/dist/components/json-schema-form-accordion-array.js +47 -24
  96. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  97. package/dist/components/json-schema-form-array.cjs +53 -30
  98. package/dist/components/json-schema-form-array.cjs.map +1 -1
  99. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  100. package/dist/components/json-schema-form-array.js +54 -31
  101. package/dist/components/json-schema-form-array.js.map +1 -1
  102. package/dist/components/json-schema-form-cards-array.cjs +32 -22
  103. package/dist/components/json-schema-form-cards-array.cjs.map +1 -1
  104. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -1
  105. package/dist/components/json-schema-form-cards-array.js +33 -23
  106. package/dist/components/json-schema-form-cards-array.js.map +1 -1
  107. package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts +44 -0
  108. package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts.map +1 -0
  109. package/dist/components/json-schema-form-discriminator.d.ts +1 -1
  110. package/dist/components/json-schema-form-errors.cjs +5 -1
  111. package/dist/components/json-schema-form-errors.cjs.map +1 -1
  112. package/dist/components/json-schema-form-errors.d.ts +2 -1
  113. package/dist/components/json-schema-form-errors.d.ts.map +1 -1
  114. package/dist/components/json-schema-form-errors.js +6 -2
  115. package/dist/components/json-schema-form-errors.js.map +1 -1
  116. package/dist/components/json-schema-form-extensions.d.ts +1 -1
  117. package/dist/components/json-schema-form-filter-input.cjs +50 -0
  118. package/dist/components/json-schema-form-filter-input.cjs.map +1 -0
  119. package/dist/components/json-schema-form-filter-input.d.ts +5 -0
  120. package/dist/components/json-schema-form-filter-input.d.ts.map +1 -0
  121. package/dist/components/json-schema-form-filter-input.js +50 -0
  122. package/dist/components/json-schema-form-filter-input.js.map +1 -0
  123. package/dist/components/json-schema-form-filter.cjs +49 -0
  124. package/dist/components/json-schema-form-filter.cjs.map +1 -0
  125. package/dist/components/json-schema-form-filter.d.ts +8 -0
  126. package/dist/components/json-schema-form-filter.d.ts.map +1 -0
  127. package/dist/components/json-schema-form-filter.js +49 -0
  128. package/dist/components/json-schema-form-filter.js.map +1 -0
  129. package/dist/components/json-schema-form-layout.cjs +84 -17
  130. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  131. package/dist/components/json-schema-form-layout.d.ts +1 -1
  132. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  133. package/dist/components/json-schema-form-layout.js +84 -17
  134. package/dist/components/json-schema-form-layout.js.map +1 -1
  135. package/dist/components/json-schema-form-list-array.cjs +16 -5
  136. package/dist/components/json-schema-form-list-array.cjs.map +1 -1
  137. package/dist/components/json-schema-form-list-array.d.ts +2 -1
  138. package/dist/components/json-schema-form-list-array.d.ts.map +1 -1
  139. package/dist/components/json-schema-form-list-array.js +16 -5
  140. package/dist/components/json-schema-form-list-array.js.map +1 -1
  141. package/dist/components/json-schema-form-object.cjs +239 -85
  142. package/dist/components/json-schema-form-object.cjs.map +1 -1
  143. package/dist/components/json-schema-form-object.d.ts +2 -2
  144. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  145. package/dist/components/json-schema-form-object.js +241 -87
  146. package/dist/components/json-schema-form-object.js.map +1 -1
  147. package/dist/components/json-schema-form-preferences.cjs +1 -1
  148. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  149. package/dist/components/json-schema-form-preferences.d.ts +1 -1
  150. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  151. package/dist/components/json-schema-form-preferences.js +1 -1
  152. package/dist/components/json-schema-form-preferences.js.map +1 -1
  153. package/dist/components/json-schema-form-properties-errors.fixtures.d.ts +14 -0
  154. package/dist/components/json-schema-form-properties-errors.fixtures.d.ts.map +1 -0
  155. package/dist/components/json-schema-form-properties-size.cjs +19 -0
  156. package/dist/components/json-schema-form-properties-size.cjs.map +1 -0
  157. package/dist/components/json-schema-form-properties-size.d.ts +4 -0
  158. package/dist/components/json-schema-form-properties-size.d.ts.map +1 -0
  159. package/dist/components/json-schema-form-properties-size.js +19 -0
  160. package/dist/components/json-schema-form-properties-size.js.map +1 -0
  161. package/dist/components/json-schema-form-properties.cjs +305 -0
  162. package/dist/components/json-schema-form-properties.cjs.map +1 -0
  163. package/dist/components/json-schema-form-properties.d.ts +20 -0
  164. package/dist/components/json-schema-form-properties.d.ts.map +1 -0
  165. package/dist/components/json-schema-form-properties.fixtures.d.ts +157 -0
  166. package/dist/components/json-schema-form-properties.fixtures.d.ts.map +1 -0
  167. package/dist/components/json-schema-form-properties.js +305 -0
  168. package/dist/components/json-schema-form-properties.js.map +1 -0
  169. package/dist/components/json-schema-form-property-actions-context.cjs +6 -0
  170. package/dist/components/json-schema-form-property-actions-context.cjs.map +1 -0
  171. package/dist/components/json-schema-form-property-actions-context.d.ts +2 -0
  172. package/dist/components/json-schema-form-property-actions-context.d.ts.map +1 -0
  173. package/dist/components/json-schema-form-property-actions-context.js +6 -0
  174. package/dist/components/json-schema-form-property-actions-context.js.map +1 -0
  175. package/dist/components/json-schema-form-property-collection.cjs +31 -0
  176. package/dist/components/json-schema-form-property-collection.cjs.map +1 -0
  177. package/dist/components/json-schema-form-property-collection.d.ts +6 -0
  178. package/dist/components/json-schema-form-property-collection.d.ts.map +1 -0
  179. package/dist/components/json-schema-form-property-collection.js +31 -0
  180. package/dist/components/json-schema-form-property-collection.js.map +1 -0
  181. package/dist/components/json-schema-form-property-draft.cjs +45 -0
  182. package/dist/components/json-schema-form-property-draft.cjs.map +1 -0
  183. package/dist/components/json-schema-form-property-draft.d.ts +8 -0
  184. package/dist/components/json-schema-form-property-draft.d.ts.map +1 -0
  185. package/dist/components/json-schema-form-property-draft.js +45 -0
  186. package/dist/components/json-schema-form-property-draft.js.map +1 -0
  187. package/dist/components/json-schema-form-property-preview.cjs +68 -0
  188. package/dist/components/json-schema-form-property-preview.cjs.map +1 -0
  189. package/dist/components/json-schema-form-property-preview.d.ts +7 -0
  190. package/dist/components/json-schema-form-property-preview.d.ts.map +1 -0
  191. package/dist/components/json-schema-form-property-preview.js +68 -0
  192. package/dist/components/json-schema-form-property-preview.js.map +1 -0
  193. package/dist/components/json-schema-form-property-selection.cjs +89 -0
  194. package/dist/components/json-schema-form-property-selection.cjs.map +1 -0
  195. package/dist/components/json-schema-form-property-selection.d.ts +6 -0
  196. package/dist/components/json-schema-form-property-selection.d.ts.map +1 -0
  197. package/dist/components/json-schema-form-property-selection.js +89 -0
  198. package/dist/components/json-schema-form-property-selection.js.map +1 -0
  199. package/dist/components/json-schema-form-render.cjs +41 -4
  200. package/dist/components/json-schema-form-render.cjs.map +1 -1
  201. package/dist/components/json-schema-form-render.d.ts +1 -1
  202. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  203. package/dist/components/json-schema-form-render.js +42 -5
  204. package/dist/components/json-schema-form-render.js.map +1 -1
  205. package/dist/components/json-schema-form-resolve.cjs +2 -0
  206. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  207. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  208. package/dist/components/json-schema-form-resolve.js +2 -0
  209. package/dist/components/json-schema-form-resolve.js.map +1 -1
  210. package/dist/components/json-schema-form-runtime-types.d.ts +222 -0
  211. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -0
  212. package/dist/components/json-schema-form-table-array.cjs +82 -51
  213. package/dist/components/json-schema-form-table-array.cjs.map +1 -1
  214. package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
  215. package/dist/components/json-schema-form-table-array.js +84 -53
  216. package/dist/components/json-schema-form-table-array.js.map +1 -1
  217. package/dist/components/json-schema-form-template-menu.d.ts +1 -1
  218. package/dist/components/json-schema-form-template.d.ts +1 -1
  219. package/dist/components/json-schema-form-types.d.ts +7 -179
  220. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  221. package/dist/components/json-schema-form-utils.cjs +10 -9
  222. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  223. package/dist/components/json-schema-form-utils.d.ts +11 -1
  224. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  225. package/dist/components/json-schema-form-utils.js +10 -9
  226. package/dist/components/json-schema-form-utils.js.map +1 -1
  227. package/dist/components/loading.d.ts +4 -4
  228. package/dist/components/mdx-editor-callout.d.ts +1 -1
  229. package/dist/components/mdx-editor-options.d.ts +1 -1
  230. package/dist/components/select.d.ts +3 -3
  231. package/dist/components/theme-switcher.d.ts +1 -1
  232. package/dist/components/use-list-menu-selection.d.ts +1 -1
  233. package/dist/components/useComboboxLayout.d.ts +1 -1
  234. package/dist/components/workload-picker-utils.d.ts +1 -1
  235. package/dist/data/Avatar.d.ts +1 -1
  236. package/dist/data/AvatarBadge.d.ts +1 -1
  237. package/dist/data/Badge.d.ts +1 -1
  238. package/dist/data/Callout.d.ts +1 -1
  239. package/dist/data/DataTable.cjs +575 -435
  240. package/dist/data/DataTable.cjs.map +1 -1
  241. package/dist/data/DataTable.d.ts +21 -13
  242. package/dist/data/DataTable.d.ts.map +1 -1
  243. package/dist/data/DataTable.grouping.d.ts +1 -1
  244. package/dist/data/DataTable.js +575 -435
  245. package/dist/data/DataTable.js.map +1 -1
  246. package/dist/data/ExecutionTree.d.ts +1 -1
  247. package/dist/data/FilterPill.d.ts +1 -1
  248. package/dist/data/FixtureEditor/RawFenceEditor.d.ts +1 -1
  249. package/dist/data/FixtureEditor/types.d.ts +1 -1
  250. package/dist/data/Gauge.d.ts +1 -1
  251. package/dist/data/GaugeHoverCard.d.ts +1 -1
  252. package/dist/data/Icon.d.ts +1 -1
  253. package/dist/data/KeyValueList.d.ts +1 -1
  254. package/dist/data/MarkdownEditor.d.ts +1 -1
  255. package/dist/data/MatrixTable.d.ts +1 -1
  256. package/dist/data/ObjectGraph.d.ts +1 -1
  257. package/dist/data/ProgressBars.d.ts +1 -1
  258. package/dist/data/Properties.cjs +86 -35
  259. package/dist/data/Properties.cjs.map +1 -1
  260. package/dist/data/Properties.d.ts +2 -2
  261. package/dist/data/Properties.d.ts.map +1 -1
  262. package/dist/data/Properties.js +87 -36
  263. package/dist/data/Properties.js.map +1 -1
  264. package/dist/data/RadialGauge.d.ts +1 -1
  265. package/dist/data/SchemaViewer.d.ts +1 -1
  266. package/dist/data/SortableHeader.d.ts +1 -1
  267. package/dist/data/StatStrip.d.ts +1 -1
  268. package/dist/data/StatusBreakdown.d.ts +1 -1
  269. package/dist/data/TabButton.d.ts +1 -1
  270. package/dist/data/TaskManager.cjs +9 -17
  271. package/dist/data/TaskManager.cjs.map +1 -1
  272. package/dist/data/TaskManager.d.ts.map +1 -1
  273. package/dist/data/TaskManager.js +9 -17
  274. package/dist/data/TaskManager.js.map +1 -1
  275. package/dist/data/TaskManagerButton.cjs +17 -34
  276. package/dist/data/TaskManagerButton.cjs.map +1 -1
  277. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  278. package/dist/data/TaskManagerButton.js +18 -35
  279. package/dist/data/TaskManagerButton.js.map +1 -1
  280. package/dist/data/TaskProcessDetails.cjs +5 -26
  281. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  282. package/dist/data/TaskProcessDetails.d.ts +2 -1
  283. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  284. package/dist/data/TaskProcessDetails.js +5 -26
  285. package/dist/data/TaskProcessDetails.js.map +1 -1
  286. package/dist/data/TaskProgress.cjs +24 -15
  287. package/dist/data/TaskProgress.cjs.map +1 -1
  288. package/dist/data/TaskProgress.d.ts +2 -1
  289. package/dist/data/TaskProgress.d.ts.map +1 -1
  290. package/dist/data/TaskProgress.js +24 -15
  291. package/dist/data/TaskProgress.js.map +1 -1
  292. package/dist/data/TaskResourceReadings.cjs +42 -0
  293. package/dist/data/TaskResourceReadings.cjs.map +1 -0
  294. package/dist/data/TaskResourceReadings.d.ts +6 -0
  295. package/dist/data/TaskResourceReadings.d.ts.map +1 -0
  296. package/dist/data/TaskResourceReadings.js +42 -0
  297. package/dist/data/TaskResourceReadings.js.map +1 -0
  298. package/dist/data/TaskSnapshot.cjs.map +1 -1
  299. package/dist/data/TaskSnapshot.d.ts +14 -1
  300. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  301. package/dist/data/TaskSnapshot.js.map +1 -1
  302. package/dist/data/Timeline.d.ts +1 -1
  303. package/dist/data/Tree.d.ts +1 -1
  304. package/dist/data/TreeGroupHeader.d.ts +1 -1
  305. package/dist/data/TreeNode.d.ts +1 -1
  306. package/dist/data/Version.d.ts +3 -3
  307. package/dist/data/ai/ChatWindow.cjs +22 -12
  308. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  309. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  310. package/dist/data/ai/ChatWindow.js +22 -12
  311. package/dist/data/ai/ChatWindow.js.map +1 -1
  312. package/dist/data/ai/ChatWindow.test-utils.d.ts +4 -2
  313. package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
  314. package/dist/data/ai/ChatWindow.types.d.ts +1 -1
  315. package/dist/data/ai/ChatWindowManager.cjs +2 -0
  316. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  317. package/dist/data/ai/ChatWindowManager.d.ts +1 -1
  318. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
  319. package/dist/data/ai/ChatWindowManager.js +2 -0
  320. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  321. package/dist/data/ai/PolicyTree.d.ts +1 -1
  322. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +1 -1
  323. package/dist/data/ai/PromptCatalog/types.d.ts +1 -1
  324. package/dist/data/ai/PromptRunEditor/index.cjs +4 -0
  325. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  326. package/dist/data/ai/PromptRunEditor/index.d.ts +5 -2
  327. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  328. package/dist/data/ai/PromptRunEditor/index.js +4 -0
  329. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  330. package/dist/data/ai/SessionChatComposer.d.ts +1 -1
  331. package/dist/data/ai/SessionInspector.approvals.cjs +147 -0
  332. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -0
  333. package/dist/data/ai/SessionInspector.approvals.d.ts +21 -0
  334. package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -0
  335. package/dist/data/ai/SessionInspector.approvals.js +147 -0
  336. package/dist/data/ai/SessionInspector.approvals.js.map +1 -0
  337. package/dist/data/ai/SessionInspector.cjs +21 -8
  338. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  339. package/dist/data/ai/SessionInspector.d.ts +6 -2
  340. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  341. package/dist/data/ai/SessionInspector.hierarchy.d.ts +1 -1
  342. package/dist/data/ai/SessionInspector.js +21 -8
  343. package/dist/data/ai/SessionInspector.js.map +1 -1
  344. package/dist/data/ai/SessionInspector.panel-parts.cjs +47 -0
  345. package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -0
  346. package/dist/data/ai/SessionInspector.panel-parts.d.ts +20 -0
  347. package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -0
  348. package/dist/data/ai/SessionInspector.panel-parts.js +47 -0
  349. package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -0
  350. package/dist/data/ai/SessionInspector.panels.cjs +40 -99
  351. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  352. package/dist/data/ai/SessionInspector.panels.d.ts +3 -1
  353. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
  354. package/dist/data/ai/SessionInspector.panels.js +12 -71
  355. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  356. package/dist/data/ai/SessionViewer.d.ts +1 -1
  357. package/dist/data/ai/SessionViewer.rows.d.ts +1 -1
  358. package/dist/data/ai/SessionViewer.tool-details.d.ts +1 -1
  359. package/dist/data/ai/SessionViewer.unified.d.ts +23 -0
  360. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  361. package/dist/data/ai/SpecRuntimeEditor/Footer.d.ts +1 -1
  362. package/dist/data/ai/SpecRuntimeEditor/Rail.d.ts +1 -1
  363. package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts +1 -1
  364. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +3 -1
  365. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  366. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +3 -1
  367. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  368. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +3 -1
  369. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  370. package/dist/data/ai/SpecRuntimeEditor/fields.d.ts +1 -1
  371. package/dist/data/ai/SpecRuntimeEditor/index.cjs +3 -1
  372. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  373. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +5 -2
  374. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  375. package/dist/data/ai/SpecRuntimeEditor/index.js +3 -1
  376. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  377. package/dist/data/ai/chat-window-context.cjs +1 -0
  378. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  379. package/dist/data/ai/chat-window-context.d.ts +13 -5
  380. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  381. package/dist/data/ai/chat-window-context.js +1 -0
  382. package/dist/data/ai/chat-window-context.js.map +1 -1
  383. package/dist/data/ai/index.d.ts +2 -1
  384. package/dist/data/ai/index.d.ts.map +1 -1
  385. package/dist/data/ai/use-session-scroll.d.ts +1 -1
  386. package/dist/data/badge-variants.d.ts +2 -2
  387. package/dist/data/cache-browser/adapter.d.ts +1 -1
  388. package/dist/data/cells/CellFilterActions.d.ts +1 -1
  389. package/dist/data/cells/EntityCell.d.ts +1 -1
  390. package/dist/data/cells/tag-utils.d.ts +1 -1
  391. package/dist/data/chat/Chat.cjs +42 -46
  392. package/dist/data/chat/Chat.cjs.map +1 -1
  393. package/dist/data/chat/Chat.d.ts +16 -5
  394. package/dist/data/chat/Chat.d.ts.map +1 -1
  395. package/dist/data/chat/Chat.js +43 -47
  396. package/dist/data/chat/Chat.js.map +1 -1
  397. package/dist/data/chat/ModelSelector.d.ts +1 -1
  398. package/dist/data/chat/PromptInput.cjs +13 -0
  399. package/dist/data/chat/PromptInput.cjs.map +1 -1
  400. package/dist/data/chat/PromptInput.d.ts +8 -2
  401. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  402. package/dist/data/chat/PromptInput.js +14 -1
  403. package/dist/data/chat/PromptInput.js.map +1 -1
  404. package/dist/data/chat/tool-render/ToolArgs.d.ts +1 -1
  405. package/dist/data/chat/tool-render/ToolParams.d.ts +1 -1
  406. package/dist/data/chat/tool-render/ToolValue.d.ts +1 -1
  407. package/dist/data/chat/tool-render/adapter.d.ts +1 -1
  408. package/dist/data/chat/tool-render/context.d.ts +1 -1
  409. package/dist/data/chat/tool-render/defaults.d.ts +1 -1
  410. package/dist/data/chat/tool-render/known-tool-views.d.ts +1 -1
  411. package/dist/data/chat/tool-render/summary.d.ts +1 -1
  412. package/dist/data/chat/types.d.ts +1 -1
  413. package/dist/data/clicky-export/useClickyExport.d.ts +1 -1
  414. package/dist/data/data-table-server-filters.d.ts +1 -1
  415. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +1 -1
  416. package/dist/data/diagnostics/ErrorDetails.d.ts +1 -1
  417. package/dist/data/diagnostics/StackFrameRow.d.ts +1 -1
  418. package/dist/data/git/GitChangeList.d.ts +1 -1
  419. package/dist/data/icon-fallback.d.ts +1 -1
  420. package/dist/data/properties-context.cjs +6 -0
  421. package/dist/data/properties-context.cjs.map +1 -0
  422. package/dist/data/properties-context.d.ts +7 -0
  423. package/dist/data/properties-context.d.ts.map +1 -0
  424. package/dist/data/properties-context.js +6 -0
  425. package/dist/data/properties-context.js.map +1 -0
  426. package/dist/data/query-browser/QueryBrowser.types.d.ts +1 -1
  427. package/dist/data/runtime/RuntimeBar.cjs +7 -3
  428. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  429. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  430. package/dist/data/runtime/RuntimeBar.js +7 -3
  431. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  432. package/dist/data/task-copy.cjs +1 -1
  433. package/dist/data/task-copy.cjs.map +1 -1
  434. package/dist/data/task-copy.js +1 -1
  435. package/dist/data/task-copy.js.map +1 -1
  436. package/dist/data/task-resource-summary.cjs +30 -0
  437. package/dist/data/task-resource-summary.cjs.map +1 -0
  438. package/dist/data/task-resource-summary.d.ts +15 -0
  439. package/dist/data/task-resource-summary.d.ts.map +1 -0
  440. package/dist/data/task-resource-summary.js +30 -0
  441. package/dist/data/task-resource-summary.js.map +1 -0
  442. package/dist/data/task-status.cjs +8 -2
  443. package/dist/data/task-status.cjs.map +1 -1
  444. package/dist/data/task-status.d.ts +3 -0
  445. package/dist/data/task-status.d.ts.map +1 -1
  446. package/dist/data/task-status.js +8 -2
  447. package/dist/data/task-status.js.map +1 -1
  448. package/dist/data/task-work-progress.cjs +24 -0
  449. package/dist/data/task-work-progress.cjs.map +1 -0
  450. package/dist/data/task-work-progress.d.ts +21 -0
  451. package/dist/data/task-work-progress.d.ts.map +1 -0
  452. package/dist/data/task-work-progress.js +24 -0
  453. package/dist/data/task-work-progress.js.map +1 -0
  454. package/dist/data/test-runner/TestRunner.d.ts +1 -1
  455. package/dist/data/test-runner/adapter.d.ts +1 -1
  456. package/dist/data/test-runner/context.d.ts +1 -1
  457. package/dist/data/use-data-table-virtual.cjs +73 -0
  458. package/dist/data/use-data-table-virtual.cjs.map +1 -0
  459. package/dist/data/use-data-table-virtual.d.ts +40 -0
  460. package/dist/data/use-data-table-virtual.d.ts.map +1 -0
  461. package/dist/data/use-data-table-virtual.js +73 -0
  462. package/dist/data/use-data-table-virtual.js.map +1 -0
  463. package/dist/data/verification/VerificationResults.d.ts +1 -1
  464. package/dist/data/version-info.cjs +3 -3
  465. package/dist/data/version-info.js +3 -3
  466. package/dist/expressions/lang/attributes.cjs +56 -0
  467. package/dist/expressions/lang/attributes.cjs.map +1 -0
  468. package/dist/expressions/lang/attributes.d.ts +22 -0
  469. package/dist/expressions/lang/attributes.d.ts.map +1 -0
  470. package/dist/expressions/lang/attributes.js +56 -0
  471. package/dist/expressions/lang/attributes.js.map +1 -0
  472. package/dist/expressions/lang/completion.cjs +164 -0
  473. package/dist/expressions/lang/completion.cjs.map +1 -0
  474. package/dist/expressions/lang/completion.d.ts +29 -0
  475. package/dist/expressions/lang/completion.d.ts.map +1 -0
  476. package/dist/expressions/lang/completion.js +164 -0
  477. package/dist/expressions/lang/completion.js.map +1 -0
  478. package/dist/expressions/lang/environment.cjs +115 -0
  479. package/dist/expressions/lang/environment.cjs.map +1 -0
  480. package/dist/expressions/lang/environment.d.ts +54 -0
  481. package/dist/expressions/lang/environment.d.ts.map +1 -0
  482. package/dist/expressions/lang/environment.js +115 -0
  483. package/dist/expressions/lang/environment.js.map +1 -0
  484. package/dist/expressions/lang/generated/conformance.json.d.ts +4962 -0
  485. package/dist/expressions/lang/generated/index.cjs +18 -0
  486. package/dist/expressions/lang/generated/index.cjs.map +1 -0
  487. package/dist/expressions/lang/generated/index.d.ts +9 -0
  488. package/dist/expressions/lang/generated/index.d.ts.map +1 -0
  489. package/dist/expressions/lang/generated/index.js +18 -0
  490. package/dist/expressions/lang/generated/index.js.map +1 -0
  491. package/dist/expressions/lang/generated/languages.json.cjs +18 -0
  492. package/dist/expressions/lang/generated/languages.json.cjs.map +1 -0
  493. package/dist/expressions/lang/generated/languages.json.d.ts +2305 -0
  494. package/dist/expressions/lang/generated/languages.json.js +18 -0
  495. package/dist/expressions/lang/generated/languages.json.js.map +1 -0
  496. package/dist/expressions/lang/generated/spec.json.cjs +12 -0
  497. package/dist/expressions/lang/generated/spec.json.cjs.map +1 -0
  498. package/dist/expressions/lang/generated/spec.json.d.ts +6260 -0
  499. package/dist/expressions/lang/generated/spec.json.js +12 -0
  500. package/dist/expressions/lang/generated/spec.json.js.map +1 -0
  501. package/dist/expressions/lang/hover.cjs +106 -0
  502. package/dist/expressions/lang/hover.cjs.map +1 -0
  503. package/dist/expressions/lang/hover.d.ts +54 -0
  504. package/dist/expressions/lang/hover.d.ts.map +1 -0
  505. package/dist/expressions/lang/hover.js +106 -0
  506. package/dist/expressions/lang/hover.js.map +1 -0
  507. package/dist/expressions/lang/index.cjs +87 -0
  508. package/dist/expressions/lang/index.cjs.map +1 -0
  509. package/dist/expressions/lang/index.d.ts +65 -0
  510. package/dist/expressions/lang/index.d.ts.map +1 -0
  511. package/dist/expressions/lang/index.js +90 -0
  512. package/dist/expressions/lang/index.js.map +1 -0
  513. package/dist/expressions/lang/merge.cjs +52 -0
  514. package/dist/expressions/lang/merge.cjs.map +1 -0
  515. package/dist/expressions/lang/merge.d.ts +12 -0
  516. package/dist/expressions/lang/merge.d.ts.map +1 -0
  517. package/dist/expressions/lang/merge.js +52 -0
  518. package/dist/expressions/lang/merge.js.map +1 -0
  519. package/dist/expressions/lang/prefix.cjs +91 -0
  520. package/dist/expressions/lang/prefix.cjs.map +1 -0
  521. package/dist/expressions/lang/prefix.d.ts +36 -0
  522. package/dist/expressions/lang/prefix.d.ts.map +1 -0
  523. package/dist/expressions/lang/prefix.js +91 -0
  524. package/dist/expressions/lang/prefix.js.map +1 -0
  525. package/dist/expressions/lang/spec.d.ts +13 -0
  526. package/dist/expressions/lang/spec.d.ts.map +1 -0
  527. package/dist/expressions/lang/theme.cjs +97 -0
  528. package/dist/expressions/lang/theme.cjs.map +1 -0
  529. package/dist/expressions/lang/theme.d.ts +6 -0
  530. package/dist/expressions/lang/theme.d.ts.map +1 -0
  531. package/dist/expressions/lang/theme.js +97 -0
  532. package/dist/expressions/lang/theme.js.map +1 -0
  533. package/dist/expressions/lang/types.d.ts +81 -0
  534. package/dist/expressions/lang/types.d.ts.map +1 -0
  535. package/dist/expressions/playground/ExpressionPlayground.cjs +308 -0
  536. package/dist/expressions/playground/ExpressionPlayground.cjs.map +1 -0
  537. package/dist/expressions/playground/ExpressionPlayground.d.ts +42 -0
  538. package/dist/expressions/playground/ExpressionPlayground.d.ts.map +1 -0
  539. package/dist/expressions/playground/ExpressionPlayground.js +291 -0
  540. package/dist/expressions/playground/ExpressionPlayground.js.map +1 -0
  541. package/dist/expressions/playground/RunControls.cjs +51 -0
  542. package/dist/expressions/playground/RunControls.cjs.map +1 -0
  543. package/dist/expressions/playground/RunControls.d.ts +7 -0
  544. package/dist/expressions/playground/RunControls.d.ts.map +1 -0
  545. package/dist/expressions/playground/RunControls.js +51 -0
  546. package/dist/expressions/playground/RunControls.js.map +1 -0
  547. package/dist/expressions/playground/VerticalSplit.cjs +109 -0
  548. package/dist/expressions/playground/VerticalSplit.cjs.map +1 -0
  549. package/dist/expressions/playground/VerticalSplit.d.ts +23 -0
  550. package/dist/expressions/playground/VerticalSplit.d.ts.map +1 -0
  551. package/dist/expressions/playground/VerticalSplit.js +109 -0
  552. package/dist/expressions/playground/VerticalSplit.js.map +1 -0
  553. package/dist/expressions/playground/api.cjs +49 -0
  554. package/dist/expressions/playground/api.cjs.map +1 -0
  555. package/dist/expressions/playground/api.d.ts +53 -0
  556. package/dist/expressions/playground/api.d.ts.map +1 -0
  557. package/dist/expressions/playground/api.js +49 -0
  558. package/dist/expressions/playground/api.js.map +1 -0
  559. package/dist/expressions/playground/languages.cjs +88 -0
  560. package/dist/expressions/playground/languages.cjs.map +1 -0
  561. package/dist/expressions/playground/languages.d.ts +43 -0
  562. package/dist/expressions/playground/languages.d.ts.map +1 -0
  563. package/dist/expressions/playground/languages.js +88 -0
  564. package/dist/expressions/playground/languages.js.map +1 -0
  565. package/dist/expressions/playground/panels/GraphPanel.cjs +72 -0
  566. package/dist/expressions/playground/panels/GraphPanel.cjs.map +1 -0
  567. package/dist/expressions/playground/panels/GraphPanel.d.ts +19 -0
  568. package/dist/expressions/playground/panels/GraphPanel.d.ts.map +1 -0
  569. package/dist/expressions/playground/panels/GraphPanel.js +72 -0
  570. package/dist/expressions/playground/panels/GraphPanel.js.map +1 -0
  571. package/dist/expressions/playground/panels/ResultPanel.cjs +82 -0
  572. package/dist/expressions/playground/panels/ResultPanel.cjs.map +1 -0
  573. package/dist/expressions/playground/panels/ResultPanel.d.ts +11 -0
  574. package/dist/expressions/playground/panels/ResultPanel.d.ts.map +1 -0
  575. package/dist/expressions/playground/panels/ResultPanel.js +82 -0
  576. package/dist/expressions/playground/panels/ResultPanel.js.map +1 -0
  577. package/dist/expressions/playground/panels/SpecPanel.cjs +76 -0
  578. package/dist/expressions/playground/panels/SpecPanel.cjs.map +1 -0
  579. package/dist/expressions/playground/panels/SpecPanel.d.ts +18 -0
  580. package/dist/expressions/playground/panels/SpecPanel.d.ts.map +1 -0
  581. package/dist/expressions/playground/panels/SpecPanel.js +76 -0
  582. package/dist/expressions/playground/panels/SpecPanel.js.map +1 -0
  583. package/dist/expressions/playground/panels/TokensPanel.cjs +89 -0
  584. package/dist/expressions/playground/panels/TokensPanel.cjs.map +1 -0
  585. package/dist/expressions/playground/panels/TokensPanel.d.ts +15 -0
  586. package/dist/expressions/playground/panels/TokensPanel.d.ts.map +1 -0
  587. package/dist/expressions/playground/panels/TokensPanel.js +72 -0
  588. package/dist/expressions/playground/panels/TokensPanel.js.map +1 -0
  589. package/dist/expressions/playground/panels/graphNodes.cjs +35 -0
  590. package/dist/expressions/playground/panels/graphNodes.cjs.map +1 -0
  591. package/dist/expressions/playground/panels/graphNodes.d.ts +19 -0
  592. package/dist/expressions/playground/panels/graphNodes.d.ts.map +1 -0
  593. package/dist/expressions/playground/panels/graphNodes.js +35 -0
  594. package/dist/expressions/playground/panels/graphNodes.js.map +1 -0
  595. package/dist/expressions/playground/runAction.cjs +12 -0
  596. package/dist/expressions/playground/runAction.cjs.map +1 -0
  597. package/dist/expressions/playground/runAction.d.ts +15 -0
  598. package/dist/expressions/playground/runAction.d.ts.map +1 -0
  599. package/dist/expressions/playground/runAction.js +12 -0
  600. package/dist/expressions/playground/runAction.js.map +1 -0
  601. package/dist/expressions/playground/runShortcut.cjs +9 -0
  602. package/dist/expressions/playground/runShortcut.cjs.map +1 -0
  603. package/dist/expressions/playground/runShortcut.d.ts +2 -0
  604. package/dist/expressions/playground/runShortcut.d.ts.map +1 -0
  605. package/dist/expressions/playground/runShortcut.js +9 -0
  606. package/dist/expressions/playground/runShortcut.js.map +1 -0
  607. package/dist/expressions/playground/useEditorTheme.cjs +40 -0
  608. package/dist/expressions/playground/useEditorTheme.cjs.map +1 -0
  609. package/dist/expressions/playground/useEditorTheme.d.ts +16 -0
  610. package/dist/expressions/playground/useEditorTheme.d.ts.map +1 -0
  611. package/dist/expressions/playground/useEditorTheme.js +23 -0
  612. package/dist/expressions/playground/useEditorTheme.js.map +1 -0
  613. package/dist/expressions/playground/useEvaluator.cjs +72 -0
  614. package/dist/expressions/playground/useEvaluator.cjs.map +1 -0
  615. package/dist/expressions/playground/useEvaluator.d.ts +25 -0
  616. package/dist/expressions/playground/useEvaluator.d.ts.map +1 -0
  617. package/dist/expressions/playground/useEvaluator.js +72 -0
  618. package/dist/expressions/playground/useEvaluator.js.map +1 -0
  619. package/dist/expressions/playground/useParsedInput.cjs +22 -0
  620. package/dist/expressions/playground/useParsedInput.cjs.map +1 -0
  621. package/dist/expressions/playground/useParsedInput.d.ts +20 -0
  622. package/dist/expressions/playground/useParsedInput.d.ts.map +1 -0
  623. package/dist/expressions/playground/useParsedInput.js +22 -0
  624. package/dist/expressions/playground/useParsedInput.js.map +1 -0
  625. package/dist/expressions/playground/verticalSplitModel.cjs +11 -0
  626. package/dist/expressions/playground/verticalSplitModel.cjs.map +1 -0
  627. package/dist/expressions/playground/verticalSplitModel.d.ts +3 -0
  628. package/dist/expressions/playground/verticalSplitModel.d.ts.map +1 -0
  629. package/dist/expressions/playground/verticalSplitModel.js +11 -0
  630. package/dist/expressions/playground/verticalSplitModel.js.map +1 -0
  631. package/dist/expressions/playground.cjs +18 -0
  632. package/dist/expressions/playground.cjs.map +1 -0
  633. package/dist/expressions/playground.d.ts +18 -0
  634. package/dist/expressions/playground.d.ts.map +1 -0
  635. package/dist/expressions/playground.js +18 -0
  636. package/dist/expressions/playground.js.map +1 -0
  637. package/dist/expressions.cjs +28 -0
  638. package/dist/expressions.cjs.map +1 -0
  639. package/dist/expressions.d.ts +10 -0
  640. package/dist/expressions.d.ts.map +1 -0
  641. package/dist/expressions.js +28 -0
  642. package/dist/expressions.js.map +1 -0
  643. package/dist/hooks/density-provider.d.ts +1 -1
  644. package/dist/hooks/theme-provider.d.ts +1 -1
  645. package/dist/hooks/use-density.d.ts +1 -1
  646. package/dist/hooks/use-resource-clock.cjs +14 -0
  647. package/dist/hooks/use-resource-clock.cjs.map +1 -0
  648. package/dist/hooks/use-resource-clock.d.ts +2 -0
  649. package/dist/hooks/use-resource-clock.d.ts.map +1 -0
  650. package/dist/hooks/use-resource-clock.js +14 -0
  651. package/dist/hooks/use-resource-clock.js.map +1 -0
  652. package/dist/hooks/use-task-run.cjs +12 -3
  653. package/dist/hooks/use-task-run.cjs.map +1 -1
  654. package/dist/hooks/use-task-run.d.ts.map +1 -1
  655. package/dist/hooks/use-task-run.js +12 -3
  656. package/dist/hooks/use-task-run.js.map +1 -1
  657. package/dist/hooks/use-theme.d.ts +1 -1
  658. package/dist/icons/registry.d.ts +1 -1
  659. package/dist/icons/types.d.ts +1 -1
  660. package/dist/index.cjs +4 -3
  661. package/dist/index.cjs.map +1 -1
  662. package/dist/index.js +2 -1
  663. package/dist/index.js.map +1 -1
  664. package/dist/layout/AppShell.d.ts +1 -1
  665. package/dist/layout/AppShell.nav.drag.d.ts +1 -1
  666. package/dist/layout/AppSidebar.d.ts +1 -1
  667. package/dist/layout/Panel.d.ts +1 -1
  668. package/dist/layout/PanelFrame.d.ts +1 -1
  669. package/dist/layout/Section.d.ts +1 -1
  670. package/dist/layout/SplitPane.d.ts +1 -1
  671. package/dist/layout/Tabs.d.ts +1 -1
  672. package/dist/layout/Workspace.d.ts +1 -1
  673. package/dist/layout/Workspace.model.d.ts +1 -1
  674. package/dist/lib/combobox-values.d.ts +1 -1
  675. package/dist/lib/comment-stage.cjs +31 -0
  676. package/dist/lib/comment-stage.cjs.map +1 -0
  677. package/dist/lib/comment-stage.d.ts +8 -0
  678. package/dist/lib/comment-stage.d.ts.map +1 -0
  679. package/dist/lib/comment-stage.js +31 -0
  680. package/dist/lib/comment-stage.js.map +1 -0
  681. package/dist/monaco/MonacoEditor.cjs +3 -3
  682. package/dist/monaco/MonacoEditor.cjs.map +1 -1
  683. package/dist/monaco/MonacoEditor.js +2 -2
  684. package/dist/monaco/MonacoEditor.js.map +1 -1
  685. package/dist/monaco/types.d.ts +1 -1
  686. package/dist/monaco/use-monaco-worker.d.ts +1 -1
  687. package/dist/overlay/CellActions.d.ts +1 -1
  688. package/dist/overlay/CommandPalette.d.ts +2 -2
  689. package/dist/overlay/CommandPalette.model.d.ts +1 -1
  690. package/dist/overlay/CommandPaletteList.d.ts +1 -1
  691. package/dist/overlay/DropdownMenu.d.ts +1 -1
  692. package/dist/overlay/HoverCard.d.ts +1 -1
  693. package/dist/overlay/Modal.d.ts +2 -2
  694. package/dist/overlay/Toast.d.ts +1 -1
  695. package/dist/overlay/TourCard.d.ts +1 -1
  696. package/dist/overlay/TourProvider.d.ts +1 -1
  697. package/dist/overlay/dropdownMenuContext.d.ts +1 -1
  698. package/dist/overlay/toast-context.d.ts +2 -2
  699. package/dist/overlay/tour-context.d.ts +1 -1
  700. package/dist/overlay/tour-types.d.ts +1 -1
  701. package/dist/profiles/connections/connectionBrowserModel.d.ts +1 -1
  702. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +1 -1
  703. package/dist/profiles/editor/profileBuilder.d.ts +1 -1
  704. package/dist/profiles/elasticsearch/esParamOperandExtension.d.ts +1 -1
  705. package/dist/profiles/fields/profileFieldControls.d.ts +1 -1
  706. package/dist/profiles/fields/profileFieldIcons.d.ts +1 -1
  707. package/dist/profiles/fields/profileFieldState.d.ts +1 -1
  708. package/dist/profiles/query/jsonPathSample.d.ts +1 -1
  709. package/dist/profiles/query/jsonPathSampleRow.d.ts +1 -1
  710. package/dist/profiles/query/prometheusResults.d.ts +2 -2
  711. package/dist/rpc/EndpointList.d.ts +1 -1
  712. package/dist/rpc/EntityExplorerApp.d.ts +1 -1
  713. package/dist/rpc/OperationCatalog.d.ts +1 -1
  714. package/dist/rpc/OperationEntityContextPicker.d.ts +1 -1
  715. package/dist/rpc/OperationEntityPage.d.ts +1 -1
  716. package/dist/rpc/OperationResultView.d.ts +1 -1
  717. package/dist/rpc/RouterProvider.d.ts +1 -1
  718. package/dist/rpc/SchemaActionForm.d.ts +1 -1
  719. package/dist/rpc/formMetadata.d.ts +1 -1
  720. package/dist/rpc/router.d.ts +1 -1
  721. package/dist/rpc/rpc-story.fixtures.d.ts +1 -1
  722. package/dist/styles.css +1 -1
  723. package/dist/utils.cjs +4 -0
  724. package/dist/utils.cjs.map +1 -1
  725. package/dist/utils.d.ts +1 -0
  726. package/dist/utils.d.ts.map +1 -1
  727. package/dist/utils.js +4 -0
  728. package/dist/utils.js.map +1 -1
  729. package/package.json +21 -2
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { AttachmentLimits, AttachmentUploadAdapter } from './attachment-upload';
3
3
  import { ChatStatus, FileUIPart } from './types';
4
4
  export type PromptInputProps = {
@@ -17,6 +17,12 @@ export type PromptInputProps = {
17
17
  attachmentUpload?: AttachmentUploadAdapter | undefined;
18
18
  acceptedMediaTypes?: string[] | undefined;
19
19
  attachmentLimits?: AttachmentLimits | undefined;
20
+ /** Text to seed the composer with, without submitting it. A new `id` re-seeds
21
+ * even when the text repeats, so picking the same suggestion twice works. */
22
+ draft?: {
23
+ id: number;
24
+ text: string;
25
+ } | null | undefined;
20
26
  /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */
21
27
  toolbar?: ReactNode;
22
28
  /** Compact host control rendered beside the textarea and submit button. */
@@ -27,5 +33,5 @@ export type PromptInputProps = {
27
33
  * controls, and a toolbar slot (model/effort selectors). Enter submits;
28
34
  * Shift+Enter inserts a newline; while streaming the button becomes a stop
29
35
  * control. */
30
- export declare function PromptInput({ onSubmit, onStop, status, allowSubmitWhileStreaming, disabled, stopLabel, placeholder, enableAttachments, attachmentUpload, acceptedMediaTypes, attachmentLimits, toolbar, inputAccessory, className, }: PromptInputProps): import("react").JSX.Element;
36
+ export declare function PromptInput({ onSubmit, onStop, status, allowSubmitWhileStreaming, disabled, stopLabel, placeholder, enableAttachments, attachmentUpload, acceptedMediaTypes, attachmentLimits, draft, toolbar, inputAccessory, className, }: PromptInputProps): import("react").JSX.Element;
31
37
  //# sourceMappingURL=PromptInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/data/chat/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACtD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACvD,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF;;;eAGe;AACf,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,yBAAiC,EACjC,QAAgB,EAChB,SAAkB,EAClB,WAA4C,EAC5C,iBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,SAAS,GACV,EAAE,gBAAgB,+BA4GlB"}
1
+ {"version":3,"file":"PromptInput.d.ts","sourceRoot":"","sources":["../../../src/data/chat/PromptInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AASf,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACtD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,qEAAqE;IACrE,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,yBAAyB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,gBAAgB,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IACvD,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD;kFAC8E;IAC9E,KAAK,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACxD,4EAA4E;IAC5E,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF;;;eAGe;AACf,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,MAAM,EACN,yBAAiC,EACjC,QAAgB,EAChB,SAAkB,EAClB,WAA4C,EAC5C,iBAAyB,EACzB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,EACL,OAAO,EACP,cAAc,EACd,SAAS,GACV,EAAE,gBAAgB,+BA4HlB"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
- import { useState } from "react";
2
+ import { useState, useRef, useEffect } from "react";
3
3
  import { cn } from "../../lib/utils.js";
4
4
  import { Button } from "../../components/button.js";
5
5
  import { Icon } from "../Icon.js";
@@ -18,6 +18,7 @@ function PromptInput({
18
18
  attachmentUpload,
19
19
  acceptedMediaTypes,
20
20
  attachmentLimits,
21
+ draft,
21
22
  toolbar,
22
23
  inputAccessory,
23
24
  className
@@ -25,7 +26,18 @@ function PromptInput({
25
26
  const [value, setValue] = useState("");
26
27
  const [files, setFiles] = useState([]);
27
28
  const [attachmentError, setAttachmentError] = useState("");
29
+ const textareaRef = useRef(null);
30
+ const seededDraftId = useRef(null);
28
31
  const isGenerating = status === "submitted" || status === "streaming";
32
+ useEffect(() => {
33
+ if (!draft || seededDraftId.current === draft.id) return;
34
+ seededDraftId.current = draft.id;
35
+ setValue(draft.text);
36
+ const textarea = textareaRef.current;
37
+ if (!textarea) return;
38
+ textarea.focus();
39
+ textarea.setSelectionRange(draft.text.length, draft.text.length);
40
+ }, [draft]);
29
41
  const submit = () => {
30
42
  const text = value.trim();
31
43
  if (!text && files.length === 0 || disabled || isGenerating && !allowSubmitWhileStreaming)
@@ -68,6 +80,7 @@ function PromptInput({
68
80
  /* @__PURE__ */ jsx(
69
81
  "textarea",
70
82
  {
83
+ ref: textareaRef,
71
84
  value,
72
85
  onChange: (e) => setValue(e.target.value),
73
86
  onKeyDown: handleKeyDown,
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInput.js","sources":["../../../src/data/chat/PromptInput.tsx"],"sourcesContent":["import {\n useState,\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowUp, UiStop } from \"../../icons\";\nimport {\n AttachmentButton,\n AttachmentList,\n} from \"./Attachment\";\nimport type {\n AttachmentLimits,\n AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport type { ChatStatus, FileUIPart } from \"./types\";\n\nexport type PromptInputProps = {\n /** Called with the trimmed text and any attachments when the user submits. */\n onSubmit: (text: string, files: FileUIPart[]) => void;\n /** Called when the user stops an in-flight generation. */\n onStop?: (() => void) | undefined;\n /** Current chat status; drives the submit/stop button affordance. */\n status?: ChatStatus | undefined;\n allowSubmitWhileStreaming?: boolean | undefined;\n disabled?: boolean | undefined;\n stopLabel?: string | undefined;\n placeholder?: string | undefined;\n /** Enables the attachment button and chips. */\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n acceptedMediaTypes?: string[] | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */\n toolbar?: ReactNode;\n /** Compact host control rendered beside the textarea and submit button. */\n inputAccessory?: ReactNode;\n className?: string | undefined;\n};\n\n/** Auto-growing prompt textarea with a submit/stop button, optional attachment\n * controls, and a toolbar slot (model/effort selectors). Enter submits;\n * Shift+Enter inserts a newline; while streaming the button becomes a stop\n * control. */\nexport function PromptInput({\n onSubmit,\n onStop,\n status,\n allowSubmitWhileStreaming = false,\n disabled = false,\n stopLabel = \"Stop\",\n placeholder = \"What would you like to know?\",\n enableAttachments = false,\n attachmentUpload,\n acceptedMediaTypes,\n attachmentLimits,\n toolbar,\n inputAccessory,\n className,\n}: PromptInputProps) {\n const [value, setValue] = useState(\"\");\n const [files, setFiles] = useState<FileUIPart[]>([]);\n const [attachmentError, setAttachmentError] = useState(\"\");\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n const submit = () => {\n const text = value.trim();\n if (\n (!text && files.length === 0) ||\n disabled ||\n (isGenerating && !allowSubmitWhileStreaming)\n )\n return;\n onSubmit(text, files);\n setValue(\"\");\n setFiles([]);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n submit();\n }\n };\n\n const canSubmit =\n !disabled &&\n (!isGenerating || allowSubmitWhileStreaming) &&\n (value.trim().length > 0 || files.length > 0);\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\n \"flex flex-col gap-2 rounded-lg border border-input bg-background p-2\",\n className,\n )}\n >\n {enableAttachments && (\n <>\n <AttachmentList\n files={files}\n onRemove={(i) => setFiles((f) => f.filter((_, j) => j !== i))}\n />\n {attachmentError && (\n <p className=\"px-1 text-xs text-destructive\">{attachmentError}</p>\n )}\n </>\n )}\n\n <div className=\"flex items-end gap-2\">\n <textarea\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n className=\"max-h-48 min-h-9 flex-1 resize-none bg-transparent px-1 py-1.5 text-sm outline-none placeholder:text-placeholder\"\n />\n {inputAccessory}\n {isGenerating && onStop && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n aria-label={stopLabel}\n onClick={onStop}\n >\n <Icon icon={UiStop} className=\"size-4\" />\n </Button>\n )}\n {(!isGenerating || allowSubmitWhileStreaming) && (\n <Button\n type=\"submit\"\n size=\"icon\"\n aria-label=\"Send\"\n disabled={!canSubmit}\n >\n <Icon icon={UiArrowUp} className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {(toolbar || enableAttachments) && (\n <div className=\"flex items-center gap-2\">\n {enableAttachments && (\n <AttachmentButton\n onAdd={(p) => setFiles((f) => [...f, ...p])}\n disabled={disabled || isGenerating}\n files={files}\n onError={setAttachmentError}\n {...(attachmentUpload ? { upload: attachmentUpload } : {})}\n {...(acceptedMediaTypes ? { acceptedMediaTypes } : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n )}\n {toolbar}\n </div>\n )}\n </form>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PromptInput.js","sources":["../../../src/data/chat/PromptInput.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type FormEvent,\n type KeyboardEvent,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../Icon\";\nimport { UiArrowUp, UiStop } from \"../../icons\";\nimport {\n AttachmentButton,\n AttachmentList,\n} from \"./Attachment\";\nimport type {\n AttachmentLimits,\n AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport type { ChatStatus, FileUIPart } from \"./types\";\n\nexport type PromptInputProps = {\n /** Called with the trimmed text and any attachments when the user submits. */\n onSubmit: (text: string, files: FileUIPart[]) => void;\n /** Called when the user stops an in-flight generation. */\n onStop?: (() => void) | undefined;\n /** Current chat status; drives the submit/stop button affordance. */\n status?: ChatStatus | undefined;\n allowSubmitWhileStreaming?: boolean | undefined;\n disabled?: boolean | undefined;\n stopLabel?: string | undefined;\n placeholder?: string | undefined;\n /** Enables the attachment button and chips. */\n enableAttachments?: boolean | undefined;\n attachmentUpload?: AttachmentUploadAdapter | undefined;\n acceptedMediaTypes?: string[] | undefined;\n attachmentLimits?: AttachmentLimits | undefined;\n /** Text to seed the composer with, without submitting it. A new `id` re-seeds\n * even when the text repeats, so picking the same suggestion twice works. */\n draft?: { id: number; text: string } | null | undefined;\n /** Toolbar content (e.g. model/effort selectors) rendered in the footer. */\n toolbar?: ReactNode;\n /** Compact host control rendered beside the textarea and submit button. */\n inputAccessory?: ReactNode;\n className?: string | undefined;\n};\n\n/** Auto-growing prompt textarea with a submit/stop button, optional attachment\n * controls, and a toolbar slot (model/effort selectors). Enter submits;\n * Shift+Enter inserts a newline; while streaming the button becomes a stop\n * control. */\nexport function PromptInput({\n onSubmit,\n onStop,\n status,\n allowSubmitWhileStreaming = false,\n disabled = false,\n stopLabel = \"Stop\",\n placeholder = \"What would you like to know?\",\n enableAttachments = false,\n attachmentUpload,\n acceptedMediaTypes,\n attachmentLimits,\n draft,\n toolbar,\n inputAccessory,\n className,\n}: PromptInputProps) {\n const [value, setValue] = useState(\"\");\n const [files, setFiles] = useState<FileUIPart[]>([]);\n const [attachmentError, setAttachmentError] = useState(\"\");\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const seededDraftId = useRef<number | null>(null);\n const isGenerating = status === \"submitted\" || status === \"streaming\";\n\n // A draft replaces whatever is in the box and puts the caret at the end, so\n // the user can edit before sending. Keyed on `id` rather than `text` so the\n // same suggestion picked twice re-seeds instead of doing nothing.\n useEffect(() => {\n if (!draft || seededDraftId.current === draft.id) return;\n seededDraftId.current = draft.id;\n setValue(draft.text);\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.focus();\n textarea.setSelectionRange(draft.text.length, draft.text.length);\n }, [draft]);\n\n const submit = () => {\n const text = value.trim();\n if (\n (!text && files.length === 0) ||\n disabled ||\n (isGenerating && !allowSubmitWhileStreaming)\n )\n return;\n onSubmit(text, files);\n setValue(\"\");\n setFiles([]);\n };\n\n const handleSubmit = (e: FormEvent) => {\n e.preventDefault();\n submit();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing) {\n e.preventDefault();\n submit();\n }\n };\n\n const canSubmit =\n !disabled &&\n (!isGenerating || allowSubmitWhileStreaming) &&\n (value.trim().length > 0 || files.length > 0);\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\n \"flex flex-col gap-2 rounded-lg border border-input bg-background p-2\",\n className,\n )}\n >\n {enableAttachments && (\n <>\n <AttachmentList\n files={files}\n onRemove={(i) => setFiles((f) => f.filter((_, j) => j !== i))}\n />\n {attachmentError && (\n <p className=\"px-1 text-xs text-destructive\">{attachmentError}</p>\n )}\n </>\n )}\n\n <div className=\"flex items-end gap-2\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n rows={1}\n className=\"max-h-48 min-h-9 flex-1 resize-none bg-transparent px-1 py-1.5 text-sm outline-none placeholder:text-placeholder\"\n />\n {inputAccessory}\n {isGenerating && onStop && (\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"secondary\"\n aria-label={stopLabel}\n onClick={onStop}\n >\n <Icon icon={UiStop} className=\"size-4\" />\n </Button>\n )}\n {(!isGenerating || allowSubmitWhileStreaming) && (\n <Button\n type=\"submit\"\n size=\"icon\"\n aria-label=\"Send\"\n disabled={!canSubmit}\n >\n <Icon icon={UiArrowUp} className=\"size-4\" />\n </Button>\n )}\n </div>\n\n {(toolbar || enableAttachments) && (\n <div className=\"flex items-center gap-2\">\n {enableAttachments && (\n <AttachmentButton\n onAdd={(p) => setFiles((f) => [...f, ...p])}\n disabled={disabled || isGenerating}\n files={files}\n onError={setAttachmentError}\n {...(attachmentUpload ? { upload: attachmentUpload } : {})}\n {...(acceptedMediaTypes ? { acceptedMediaTypes } : {})}\n {...(attachmentLimits ? { limits: attachmentLimits } : {})}\n />\n )}\n {toolbar}\n </div>\n )}\n </form>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  export type ToolArgsProps = {
3
3
  input: unknown;
4
4
  };
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ChatToolInputSchema } from '../types';
3
3
  import { ToolFieldMeta } from './schema';
4
4
  export type ToolParamsProps = {
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ChatToolInputSchema } from '../types';
3
3
  export type ToolValueProps = {
4
4
  value: unknown;
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { AnyToolPart, ToolMeta } from '../types';
3
3
  export type ToolRenderSurface = "summary" | "input" | "output";
4
4
  export type ToolRenderAdapterContext = {
@@ -1,5 +1,5 @@
1
1
  import { ToolRenderRegistry } from './adapter';
2
- export declare const ToolRenderRegistryProvider: import('../../../../../../node_modules/@types/react/index.d.ts').Provider<ToolRenderRegistry | null>;
2
+ export declare const ToolRenderRegistryProvider: import('react').Provider<ToolRenderRegistry | null>;
3
3
  /** The nearest provided registry, or a shared default one — so a standalone
4
4
  * <ToolCall> in a test or story still renders heuristically. */
5
5
  export declare function useToolRenderRegistry(): ToolRenderRegistry;
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ToolRenderAdapter, ToolRenderAdapterContext } from './adapter';
3
3
  /** Context without the surface's own default view — what a default view is
4
4
  * built from. */
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ToolRenderAdapterContext } from './adapter';
3
3
  export declare function ShellInput(ctx: ToolRenderAdapterContext): ReactNode;
4
4
  export declare function ShellOutput(ctx: ToolRenderAdapterContext): ReactNode;
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ToolRenderAdapterContext } from './adapter';
3
3
  /** A short description of a normalized tool result: "12 rows", "3 fields", or a
4
4
  * truncated scalar. Empty when there is nothing worth saying. */
@@ -1,5 +1,5 @@
1
1
  import { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart } from 'ai';
2
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
2
+ import { ReactNode } from 'react';
3
3
  import { JsonSchemaObject, JsonSchemaProperty as FormJsonSchemaProperty } from '../../components/json-schema-form-types';
4
4
  export type { UIMessage, ToolUIPart, DynamicToolUIPart, ChatStatus, ReasoningUIPart, FileUIPart, };
5
5
  /** A selectable chat model, as served by the backend's GET /api/chat/models.
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { DataTableMenuAction } from '../DataTable';
3
3
  import { ClickyExportFormatOption, ClickyExportScopeOption } from './ClickyExportDialog';
4
4
  export type UseClickyExportOptions = {
@@ -1,4 +1,4 @@
1
- import { Dispatch, SetStateAction } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { Dispatch, SetStateAction } from 'react';
2
2
  import { FilterBarFilter, FilterBarRangePreset, FilterBarRangeProps } from '../components/FilterBar';
3
3
  import { FilterExtension } from '../components/filter-bar-utils';
4
4
  import { DataTableColumn, DataTableColumnKind } from './DataTable';
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ProcessNode, RunMeta } from './types';
3
3
  import { StackFrameActions } from './StackFrameRow';
4
4
  import { JvmFrameSourceResolver } from './JvmStackTrace';
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ErrorDiagnostics } from './error-diagnostics';
3
3
  export type ErrorDetailsProps = {
4
4
  diagnostics: ErrorDiagnostics;
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ParsedThreadFrame } from './jvm-stacktrace';
3
3
  export type StackFrameActions = (frame: ParsedThreadFrame, index: number) => ReactNode;
4
4
  export interface StackFrameRowProps {
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  export type GitDiffPayload = {
3
3
  diff: string;
4
4
  truncated?: boolean;
@@ -1,4 +1,4 @@
1
- import { ComponentType } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ComponentType } from 'react';
2
2
  export type FallbackIconProps = {
3
3
  /** Runtime icon name to resolve. */
4
4
  name?: string;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const react = require("react");
4
+ const PropertiesContext = react.createContext(null);
5
+ exports.PropertiesContext = PropertiesContext;
6
+ //# sourceMappingURL=properties-context.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-context.cjs","sources":["../../src/data/properties-context.ts"],"sourcesContent":["import { createContext } from \"react\";\nimport type { PropertiesDensity } from \"./Properties\";\n\nexport const PropertiesContext = createContext<{\n depth: number;\n columns: string;\n density: PropertiesDensity;\n} | null>(null);\n"],"names":["createContext"],"mappings":";;;AAGO,MAAM,oBAAoBA,MAAAA,cAIvB,IAAI;;"}
@@ -0,0 +1,7 @@
1
+ import { PropertiesDensity } from './Properties';
2
+ export declare const PropertiesContext: import('react').Context<{
3
+ depth: number;
4
+ columns: string;
5
+ density: PropertiesDensity;
6
+ } | null>;
7
+ //# sourceMappingURL=properties-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-context.d.ts","sourceRoot":"","sources":["../../src/data/properties-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,eAAO,MAAM,iBAAiB;WACrB,MAAM;aACJ,MAAM;aACN,iBAAiB;SACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { createContext } from "react";
2
+ const PropertiesContext = createContext(null);
3
+ export {
4
+ PropertiesContext
5
+ };
6
+ //# sourceMappingURL=properties-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties-context.js","sources":["../../src/data/properties-context.ts"],"sourcesContent":["import { createContext } from \"react\";\nimport type { PropertiesDensity } from \"./Properties\";\n\nexport const PropertiesContext = createContext<{\n depth: number;\n columns: string;\n density: PropertiesDensity;\n} | null>(null);\n"],"names":[],"mappings":";AAGO,MAAM,oBAAoB,cAIvB,IAAI;"}
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { JsonSchemaObject } from '../../components/json-schema-form-types';
3
3
  import { ErrorDiagnostics } from '../diagnostics/error-diagnostics';
4
4
  import { DataTableFilterSelection } from '../data-table-filter-values';
@@ -26,12 +26,16 @@ function RuntimeBar({
26
26
  className
27
27
  }) {
28
28
  var _a;
29
- const [preferredFamily, setPreferredFamily] = react.useState();
29
+ const [preference, setPreference] = react.useState({ model: effectiveModel, family: void 0 });
30
+ if (preference.model !== effectiveModel) {
31
+ setPreference({ model: effectiveModel, family: void 0 });
32
+ }
33
+ const preferredFamily = preference.model === effectiveModel ? preference.family : void 0;
30
34
  const specMode = runtimeFamily.runtimeModeFromModel(value.model) || ((_a = value.mode) == null ? void 0 : _a.trim()) || (effectiveMode == null ? void 0 : effectiveMode.trim());
31
35
  const selection = runtimeMode.selectionForRuntime(
32
36
  families,
33
37
  specMode,
34
- value.model || effectiveModel,
38
+ value.model || (preferredFamily ? void 0 : effectiveModel),
35
39
  models,
36
40
  preferredFamily
37
41
  );
@@ -47,7 +51,7 @@ function RuntimeBar({
47
51
  reasoningEfforts
48
52
  );
49
53
  const applyMode = (familyId, modeId) => {
50
- setPreferredFamily(familyId);
54
+ setPreference({ model: effectiveModel, family: familyId });
51
55
  const next = RuntimeBar_model.applyRuntimeMode(
52
56
  value,
53
57
  models,
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.cjs","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preferredFamily, setPreferredFamily] = useState<string>();\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || effectiveModel,\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreferredFamily(familyId);\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","useState","runtimeModeFromModel","selectionForRuntime","familyById","firstMode","modelsForFamily","runtimeModelForValue","isSelectableModel","effortOptionsForModel","applyRuntimeMode","reconcileModelCapabilities","jsx","RuntimeBarCombo","RuntimeBarSegments"],"mappings":"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"}
1
+ {"version":3,"file":"RuntimeBar.cjs","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preference, setPreference] = useState<{\n model: string | undefined;\n family: string | undefined;\n }>({ model: effectiveModel, family: undefined });\n if (preference.model !== effectiveModel) {\n setPreference({ model: effectiveModel, family: undefined });\n }\n const preferredFamily = preference.model === effectiveModel ? preference.family : undefined;\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || (preferredFamily ? undefined : effectiveModel),\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreference({ model: effectiveModel, family: familyId });\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":["SPEC_RUNTIME_FAMILIES","DEFAULT_REASONING_EFFORTS","useState","runtimeModeFromModel","selectionForRuntime","familyById","firstMode","modelsForFamily","runtimeModelForValue","isSelectableModel","effortOptionsForModel","applyRuntimeMode","reconcileModelCapabilities","jsx","RuntimeBarCombo","RuntimeBarSegments"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BAmHpB"}
1
+ {"version":3,"file":"RuntimeBar.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AASjE,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAChC;gFAC4E;IAC5E,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3C,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,oFAAoF;IACpF,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,EACpD,KAAK,EACL,QAAQ,EACR,OAAqB,EACrB,MAAW,EACX,QAAgC,EAChC,aAAa,EACb,cAAc,EACd,gBAA4C,EAC5C,MAAc,EACd,SAAgB,EAChB,UAAiB,EACjB,SAAqB,EACrB,SAAS,GACV,EAAE,eAAe,CAAC,CAAC,CAAC,+BA0HpB"}
@@ -24,12 +24,16 @@ function RuntimeBar({
24
24
  className
25
25
  }) {
26
26
  var _a;
27
- const [preferredFamily, setPreferredFamily] = useState();
27
+ const [preference, setPreference] = useState({ model: effectiveModel, family: void 0 });
28
+ if (preference.model !== effectiveModel) {
29
+ setPreference({ model: effectiveModel, family: void 0 });
30
+ }
31
+ const preferredFamily = preference.model === effectiveModel ? preference.family : void 0;
28
32
  const specMode = runtimeModeFromModel(value.model) || ((_a = value.mode) == null ? void 0 : _a.trim()) || (effectiveMode == null ? void 0 : effectiveMode.trim());
29
33
  const selection = selectionForRuntime(
30
34
  families,
31
35
  specMode,
32
- value.model || effectiveModel,
36
+ value.model || (preferredFamily ? void 0 : effectiveModel),
33
37
  models,
34
38
  preferredFamily
35
39
  );
@@ -45,7 +49,7 @@ function RuntimeBar({
45
49
  reasoningEfforts
46
50
  );
47
51
  const applyMode = (familyId, modeId) => {
48
- setPreferredFamily(familyId);
52
+ setPreference({ model: effectiveModel, family: familyId });
49
53
  const next = applyRuntimeMode(
50
54
  value,
51
55
  models,
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preferredFamily, setPreferredFamily] = useState<string>();\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || effectiveModel,\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreferredFamily(familyId);\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAmDO,SAAS,WAAsC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,SAAS,CAAA;AAAA,EACT,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ;AACF,GAAuB;;AACrB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAA;AAC9C,QAAM,WACJ,qBAAqB,MAAM,KAAK,OAChC,WAAM,SAAN,mBAAY,YACZ,+CAAe;AACjB,QAAM,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,EAAA;AAEF,QAAM,SAAS,WAAW,UAAU,UAAU,MAAM;AACpD,QAAM,OACJ,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,UAAU,IAAI,KACxD,UAAU,MAAM;AAClB,QAAM,eAAe,gBAAgB,QAAQ,QAAQ,QAAQ;AAC7D,QAAM,gBAAgB,qBAAqB,QAAQ,OAAO,iBAAiB;AAC3E,QAAM,2BAA2B;AAAA,IAC/B,CAAC,kBACA,MAAM,MAAM,MAAM,UACnB,qBAAqB,QAAQ,OAAO,CAAC,UAAU,CAAC,kBAAkB,KAAK,CAAC;AAAA,EAAA;AAE1E,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,YAAY,CAAC,UAAkB,WAAmB;AACtD,uBAAmB,QAAQ;AAC3B,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,QAAI,SAAS,MAAO,UAAS,IAAI;AAAA,EACnC;AAEA,QAAM,mBAAmB,CAAC,UAAkB;AAC1C;AAAA,MACE,yBAAyB,oBAAoB,KAAK,GAAG,SAAS,KAAK;AAAA,IAAA;AAAA,EAEvE;AAGA,QAAM,aAAa,CAAC,UAAqB;AACvC,UAAM,OAAO;AAAA,MACX,oBAAoB,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,MACA,EAAE,MAAM,KAAK,GAAA;AAAA,IAAG;AAElB,aAAS,IAAI;AAAA,EACf;AACA,QAAM,aAAa,MAAM;AACvB,aAAS,oBAAoB,KAAK,CAAC;AAAA,EACrC;AACA,QAAM,cAAc,CAAC,WACnB,SAAS,yBAAyB,OAAO,UAAU,MAAM,CAAC;AAE5D,MAAI,YAAY,SAAS;AACvB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,QAAQ;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,CAAC,aAAa,UAAU,UAAU,UAAU,IAAI;AAAA,QAChE,cAAc,CAAC,WAAW,UAAU,OAAO,IAAI,MAAM;AAAA,QACrD,eAAe;AAAA,QACf,cAAc;AAAA,QACd,gBAAgB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,eAAe;AAAA,MACf,eAAe;AAAA,MACf,cAAc;AAAA,MACd,gBAAgB;AAAA,IAAA;AAAA,EAAA;AAGtB;AAEA,SAAS,oBAA+C,OAAa;AACnE,SAAO;AAAA,IACL,yBAAyB,OAAO,SAAS,MAAS;AAAA,IAClD;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,SAAS,yBACP,OACA,KACA,MACG;AACH,QAAM,UAAU,EAAE,GAAG,MAAA;AACrB,MAAI,SAAS,UAAa,SAAS,IAAI;AACrC,WAAO,QAAQ,GAAG;AAAA,EACpB,OAAO;AACL,YAAQ,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;"}
1
+ {"version":3,"file":"RuntimeBar.js","sources":["../../../src/data/runtime/RuntimeBar.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type { ChatModel, ChatModelRuntime } from \"../chat/types\";\nimport { applyRuntimeMode, runtimeModelForValue } from \"./RuntimeBar.model\";\nimport { RuntimeBarCombo } from \"./RuntimeBarCombo\";\nimport { RuntimeBarSegments } from \"./RuntimeBarSegments\";\nimport { isSelectableModel } from \"./availability\";\nimport {\n effortOptionsForModel,\n reconcileModelCapabilities,\n} from \"./model-capabilities\";\nimport {\n SPEC_RUNTIME_FAMILIES,\n familyById,\n firstMode,\n modelsForFamily,\n selectionForRuntime,\n runtimeModeFromModel,\n type SpecRuntimeFamily,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarValue = ChatModelRuntime & {\n cliArgs?: Record<string, unknown>;\n};\n\nexport type RuntimeBarProps<T extends RuntimeBarValue = RuntimeBarValue> = {\n value: T;\n onChange: (value: T) => void;\n /** `segmented` uses field triggers; `combo` uses one direct-edit menu. */\n variant?: \"combo\" | \"segmented\";\n /** Model catalog. Only the selected family's models are listed; a family the\n * catalog does not describe is served by the segment's free-text entry. */\n models?: ChatModel[] | undefined;\n families?: SpecRuntimeFamily[] | undefined;\n /** Resolved mode shown when the editable value inherits it from another layer. */\n effectiveMode?: string | undefined;\n /** Resolved model used to identify the inherited provider family without persisting it. */\n effectiveModel?: string | undefined;\n /** Effort tiers offered when the catalog does not describe the model. */\n reasoningEfforts?: string[] | undefined;\n /** Locks model identity (family, mode, and model) while leaving effort editable. */\n locked?: boolean | undefined;\n /** Whether the selected runtime exposes a model argument. */\n showModel?: boolean | undefined;\n /** Whether the selected runtime exposes reasoning effort. */\n showEffort?: boolean | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n};\n\n/** Self-describing runtime controls with segmented and combo presentations. */\nexport function RuntimeBar<T extends RuntimeBarValue>({\n value,\n onChange,\n variant = \"segmented\",\n models = [],\n families = SPEC_RUNTIME_FAMILIES,\n effectiveMode,\n effectiveModel,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n locked = false,\n showModel = true,\n showEffort = true,\n ariaLabel = \"Runtime\",\n className,\n}: RuntimeBarProps<T>) {\n const [preference, setPreference] = useState<{\n model: string | undefined;\n family: string | undefined;\n }>({ model: effectiveModel, family: undefined });\n if (preference.model !== effectiveModel) {\n setPreference({ model: effectiveModel, family: undefined });\n }\n const preferredFamily = preference.model === effectiveModel ? preference.family : undefined;\n const specMode =\n runtimeModeFromModel(value.model) ||\n value.mode?.trim() ||\n effectiveMode?.trim();\n const selection = selectionForRuntime(\n families,\n specMode,\n value.model || (preferredFamily ? undefined : effectiveModel),\n models,\n preferredFamily,\n );\n const family = familyById(families, selection.family);\n const mode =\n family.modes.find((entry) => entry.id === selection.mode) ??\n firstMode(family);\n const modelOptions = modelsForFamily(models, family, specMode);\n const resolvedModel = runtimeModelForValue(models, value, isSelectableModel);\n const selectedModelUnavailable = Boolean(\n !resolvedModel &&\n (value.id || value.model) &&\n runtimeModelForValue(models, value, (entry) => !isSelectableModel(entry)),\n );\n const supportedEfforts = effortOptionsForModel(\n resolvedModel,\n reasoningEfforts,\n );\n\n const applyMode = (familyId: string, modeId: string) => {\n setPreference({ model: effectiveModel, family: familyId });\n const next = applyRuntimeMode(\n value,\n models,\n families,\n familyId,\n modeId,\n reasoningEfforts,\n );\n if (next !== value) onChange(next);\n };\n\n const applyCustomModel = (model: string) => {\n onChange(\n withOptionalRuntimeValue(withoutCatalogModel(value), \"model\", model),\n );\n };\n // A family's model catalog can serve several modes. Selecting a row must not\n // silently move the user away from the mode they chose.\n const applyModel = (model: ChatModel) => {\n const next = reconcileModelCapabilities(\n withoutCatalogModel(value),\n model,\n reasoningEfforts,\n { mode: mode.id },\n );\n onChange(next);\n };\n const clearModel = () => {\n onChange(withoutCatalogModel(value));\n };\n const applyEffort = (effort: string) =>\n onChange(withOptionalRuntimeValue(value, \"effort\", effort));\n\n if (variant === \"combo\") {\n return (\n <RuntimeBarCombo\n value={value}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n models={modelOptions}\n selectedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onFamilyChange={(familyId) => applyMode(familyId, selection.mode)}\n onModeChange={(modeId) => applyMode(family.id, modeId)}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n }\n\n return (\n <RuntimeBarSegments\n value={value}\n models={models}\n modelOptions={modelOptions}\n resolvedModel={resolvedModel}\n selectedModelUnavailable={selectedModelUnavailable}\n families={families}\n family={family}\n mode={mode}\n selectedMode={selection.mode}\n reasoningEfforts={reasoningEfforts}\n supportedEfforts={supportedEfforts}\n locked={locked}\n showModel={showModel}\n showEffort={showEffort}\n ariaLabel={ariaLabel}\n className={className}\n onModeChange={applyMode}\n onCustomModel={applyCustomModel}\n onModelSelect={applyModel}\n onModelClear={clearModel}\n onEffortChange={applyEffort}\n />\n );\n}\n\nfunction withoutCatalogModel<T extends RuntimeBarValue>(value: T): T {\n return withOptionalRuntimeValue(\n withOptionalRuntimeValue(value, \"model\", undefined),\n \"id\",\n undefined,\n );\n}\n\nfunction withOptionalRuntimeValue<T extends RuntimeBarValue>(\n value: T,\n key: keyof RuntimeBarValue,\n next: unknown,\n): T {\n const updated = { ...value } as Record<string, unknown>;\n if (next === undefined || next === \"\") {\n delete updated[key];\n } else {\n updated[key] = next;\n }\n return updated as T;\n}\n"],"names":[],"mappings":"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"}
@@ -37,7 +37,7 @@ function groupHeader(group, tasks) {
37
37
  const counts = taskStatus.bucketTasks(tasks);
38
38
  const total = group.total ?? tasks.length;
39
39
  const summary = [`status: ${group.status}`];
40
- if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);
40
+ if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);
41
41
  if (group.kind) summary.push(`kind: ${group.kind}`);
42
42
  const lines = [`# ${group.name}`, summary.join(" · ")];
43
43
  const labels = Object.entries(group.labels ?? {});
@@ -1 +1 @@
1
- {"version":3,"file":"task-copy.cjs","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":["bucketTasks"],"mappings":"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"}
1
+ {"version":3,"file":"task-copy.cjs","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":["bucketTasks"],"mappings":"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"}
@@ -35,7 +35,7 @@ function groupHeader(group, tasks) {
35
35
  const counts = bucketTasks(tasks);
36
36
  const total = group.total ?? tasks.length;
37
37
  const summary = [`status: ${group.status}`];
38
- if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);
38
+ if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);
39
39
  if (group.kind) summary.push(`kind: ${group.kind}`);
40
40
  const lines = [`# ${group.name}`, summary.join(" · ")];
41
41
  const labels = Object.entries(group.labels ?? {});
@@ -1 +1 @@
1
- {"version":3,"file":"task-copy.js","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-copy.js","sources":["../../src/data/task-copy.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { bucketTasks } from \"./task-status\";\n\n// Builders that flatten a task run into pasteable text. Deliberately free of\n// React and of the clipboard so the exact output is unit-testable, and so the\n// rendered card and the copied text cannot drift apart.\n\n// isFailedOrWarn marks the statuses TaskGroupCard always keeps visible. Also\n// drives \"copy errors only\", so the two can never disagree.\nexport function isFailedOrWarn(t: TaskSnapshot): boolean {\n return (\n t.status === \"failed\" || t.status === \"FAIL\" || t.status === \"ERR\" || t.status === \"warning\"\n );\n}\n\n// A task counts as errored for copy purposes when it either rests in a failing\n// status or carries an error string (a canceled dependency does the latter).\nfunction isErrored(t: TaskSnapshot): boolean {\n return isFailedOrWarn(t) || Boolean(t.error);\n}\n\nexport function taskGroupErrorCount(tasks: TaskSnapshot[]): number {\n return tasks.filter(isErrored).length;\n}\n\nfunction fence(label: string, body: string, language = \"\"): string[] {\n return [`${label}:`, \"```\" + language, body.replace(/\\n+$/, \"\"), \"```\"];\n}\n\nfunction streamBlock(label: string, text: string, truncated: boolean | undefined): string[] {\n // Mirrors the \"showing latest 1 MiB\" note TaskStream renders.\n return fence(truncated ? `${label} (showing latest 1 MiB)` : label, text);\n}\n\nfunction taskSection(t: TaskSnapshot): string[] {\n const lines = [`## ${t.name} — ${t.status}${t.duration ? ` (${t.duration})` : \"\"}`];\n if (t.description) lines.push(t.description);\n if (t.error) lines.push(`error: ${t.error}`);\n // `message` carries the latest log line; only worth repeating when it differs.\n if (t.message && t.message !== t.error) lines.push(`message: ${t.message}`);\n const logs = t.logs ?? [];\n if (logs.length > 0) {\n lines.push(\"logs:\");\n for (const l of logs) lines.push(` ${l.level} ${l.message}`);\n }\n if (t.stdout) lines.push(...streamBlock(\"stdout\", t.stdout, t.stdoutTruncated));\n if (t.stderr) lines.push(...streamBlock(\"stderr\", t.stderr, t.stderrTruncated));\n // `details` is an open shape (TaskExecDetails carries arbitrary domain keys),\n // so serialize it whole rather than narrowing to a known variant.\n if (t.details !== undefined) {\n lines.push(...fence(\"details\", JSON.stringify(t.details, null, 2), \"json\"));\n }\n return lines;\n}\n\nfunction groupHeader(group: TaskSnapshot, tasks: TaskSnapshot[]): string[] {\n const counts = bucketTasks(tasks);\n const total = group.total ?? tasks.length;\n const summary = [`status: ${group.status}`];\n if (total > 0) summary.push(`${counts.ok + counts.warn + counts.fail + counts.canceled}/${total}`);\n if (group.kind) summary.push(`kind: ${group.kind}`);\n\n const lines = [`# ${group.name}`, summary.join(\" · \")];\n const labels = Object.entries(group.labels ?? {});\n if (labels.length > 0) {\n lines.push(`labels: ${labels.map(([k, v]) => `${k}=${v}`).join(\", \")}`);\n }\n const timing: string[] = [];\n if (group.startedAt) timing.push(`started ${group.startedAt}`);\n if (group.finishedAt) timing.push(`finished ${group.finishedAt}`);\n if (timing.length > 0) lines.push(timing.join(\" · \"));\n if (group.error) lines.push(`error: ${group.error}`);\n return lines;\n}\n\nfunction joinBlocks(blocks: string[][]): string {\n return `${blocks.map((block) => block.join(\"\\n\")).join(\"\\n\\n\")}\\n`;\n}\n\n/** The whole run — group context followed by every task, with logs, streams and details. */\nexport function taskGroupMarkdown(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.map(taskSection)]);\n}\n\n/** Group context followed by only the failing/warning tasks. */\nexport function taskGroupErrors(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return joinBlocks([groupHeader(group, tasks), ...tasks.filter(isErrored).map(taskSection)]);\n}\n\n/** The raw snapshots, for feeding a tool rather than a human. */\nexport function taskGroupJson(group: TaskSnapshot, tasks: TaskSnapshot[]): string {\n return JSON.stringify({ group, tasks }, null, 2);\n}\n\n/** A single task, for the per-row copy affordance. */\nexport function taskMarkdown(task: TaskSnapshot): string {\n return joinBlocks([taskSection(task)]);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const taskProcessDetails = require("./task-process-details.cjs");
4
+ function resourceSummary(snapshots, options) {
5
+ const processes = /* @__PURE__ */ new Map();
6
+ for (const snapshot of snapshots) {
7
+ if (snapshot.status !== "running" && snapshot.status !== "pending") continue;
8
+ if (!taskProcessDetails.isTaskProcessDetails(snapshot.details)) continue;
9
+ const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;
10
+ if (!processes.has(key) || snapshot.type === "task") processes.set(key, snapshot);
11
+ }
12
+ if (!processes.size) return { state: "unavailable" };
13
+ let cpu = 0, rss = 0, sampledAt = options.now;
14
+ for (const snapshot of processes.values()) {
15
+ if (!taskProcessDetails.isTaskProcessDetails(snapshot.details)) continue;
16
+ const sample = snapshot.details.latest;
17
+ const at = Date.parse(sample.sampledAt);
18
+ if (!Number.isFinite(at) || at <= 0) return { state: "unavailable" };
19
+ cpu += sample.cpuPercent;
20
+ rss += sample.rssBytes;
21
+ sampledAt = Math.min(sampledAt, at);
22
+ }
23
+ return { state: options.connected && options.now - sampledAt <= 5e3 ? "fresh" : "stale", cpu, rss, sampledAt };
24
+ }
25
+ function taskTransportConnected(status) {
26
+ return status === "connected" || status === "polling" || status === "complete";
27
+ }
28
+ exports.resourceSummary = resourceSummary;
29
+ exports.taskTransportConnected = taskTransportConnected;
30
+ //# sourceMappingURL=task-resource-summary.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-resource-summary.cjs","sources":["../../src/data/task-resource-summary.ts"],"sourcesContent":["import type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\n\nexport type ResourceSummary = { state: \"fresh\" | \"stale\"; cpu: number; rss: number; sampledAt: number } | { state: \"unavailable\" };\n\nexport function resourceSummary(snapshots: TaskSnapshot[], options: { now: number; connected: boolean }): ResourceSummary {\n const processes = new Map<string, TaskSnapshot>();\n for (const snapshot of snapshots) {\n if (snapshot.status !== \"running\" && snapshot.status !== \"pending\") continue;\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const key = snapshot.details.pid ? `${snapshot.details.command}:${snapshot.details.pid}` : snapshot.id;\n if (!processes.has(key) || snapshot.type === \"task\") processes.set(key, snapshot);\n }\n if (!processes.size) return { state: \"unavailable\" };\n let cpu = 0, rss = 0, sampledAt = options.now;\n for (const snapshot of processes.values()) {\n if (!isTaskProcessDetails(snapshot.details)) continue;\n const sample = snapshot.details.latest;\n const at = Date.parse(sample.sampledAt);\n if (!Number.isFinite(at) || at <= 0) return { state: \"unavailable\" };\n cpu += sample.cpuPercent;\n rss += sample.rssBytes;\n sampledAt = Math.min(sampledAt, at);\n }\n return { state: options.connected && options.now - sampledAt <= 5000 ? \"fresh\" : \"stale\", cpu, rss, sampledAt };\n}\n\nexport function taskTransportConnected(status: string): boolean {\n return status === \"connected\" || status === \"polling\" || status === \"complete\";\n}\n"],"names":["isTaskProcessDetails"],"mappings":";;;AAKO,SAAS,gBAAgB,WAA2B,SAA+D;AACxH,QAAM,gCAAgB,IAAA;AACtB,aAAW,YAAY,WAAW;AAChC,QAAI,SAAS,WAAW,aAAa,SAAS,WAAW,UAAW;AACpE,QAAI,CAACA,mBAAAA,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,MAAM,SAAS,QAAQ,MAAM,GAAG,SAAS,QAAQ,OAAO,IAAI,SAAS,QAAQ,GAAG,KAAK,SAAS;AACpG,QAAI,CAAC,UAAU,IAAI,GAAG,KAAK,SAAS,SAAS,OAAQ,WAAU,IAAI,KAAK,QAAQ;AAAA,EAClF;AACA,MAAI,CAAC,UAAU,KAAM,QAAO,EAAE,OAAO,cAAA;AACrC,MAAI,MAAM,GAAG,MAAM,GAAG,YAAY,QAAQ;AAC1C,aAAW,YAAY,UAAU,UAAU;AACzC,QAAI,CAACA,mBAAAA,qBAAqB,SAAS,OAAO,EAAG;AAC7C,UAAM,SAAS,SAAS,QAAQ;AAChC,UAAM,KAAK,KAAK,MAAM,OAAO,SAAS;AACtC,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,EAAG,QAAO,EAAE,OAAO,cAAA;AACrD,WAAO,OAAO;AACd,WAAO,OAAO;AACd,gBAAY,KAAK,IAAI,WAAW,EAAE;AAAA,EACpC;AACA,SAAO,EAAE,OAAO,QAAQ,aAAa,QAAQ,MAAM,aAAa,MAAO,UAAU,SAAS,KAAK,KAAK,UAAA;AACtG;AAEO,SAAS,uBAAuB,QAAyB;AAC9D,SAAO,WAAW,eAAe,WAAW,aAAa,WAAW;AACtE;;;"}