@flanksource/clicky-ui 0.2.13 → 0.2.15

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 (466) hide show
  1. package/dist/chat.cjs +20 -0
  2. package/dist/chat.cjs.map +1 -0
  3. package/dist/chat.d.ts +2 -0
  4. package/dist/chat.d.ts.map +1 -0
  5. package/dist/chat.js +20 -0
  6. package/dist/chat.js.map +1 -0
  7. package/dist/components/Combobox.cjs +5 -3
  8. package/dist/components/Combobox.cjs.map +1 -1
  9. package/dist/components/Combobox.d.ts +2 -0
  10. package/dist/components/Combobox.d.ts.map +1 -1
  11. package/dist/components/Combobox.js +5 -3
  12. package/dist/components/Combobox.js.map +1 -1
  13. package/dist/components/DateTimePicker.cjs +3 -1
  14. package/dist/components/DateTimePicker.cjs.map +1 -1
  15. package/dist/components/DateTimePicker.d.ts +5 -1
  16. package/dist/components/DateTimePicker.d.ts.map +1 -1
  17. package/dist/components/DateTimePicker.js +3 -1
  18. package/dist/components/DateTimePicker.js.map +1 -1
  19. package/dist/components/FilterBar.cjs +8 -41
  20. package/dist/components/FilterBar.cjs.map +1 -1
  21. package/dist/components/FilterBar.d.ts +0 -2
  22. package/dist/components/FilterBar.d.ts.map +1 -1
  23. package/dist/components/FilterBar.js +3 -36
  24. package/dist/components/FilterBar.js.map +1 -1
  25. package/dist/components/FormatOptionsDropdown.cjs +2 -18
  26. package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
  27. package/dist/components/FormatOptionsDropdown.d.ts +1 -17
  28. package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
  29. package/dist/components/FormatOptionsDropdown.js +1 -17
  30. package/dist/components/FormatOptionsDropdown.js.map +1 -1
  31. package/dist/components/JsonSchemaForm.cjs +128 -12
  32. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  33. package/dist/components/JsonSchemaForm.d.ts +1 -1
  34. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  35. package/dist/components/JsonSchemaForm.js +131 -15
  36. package/dist/components/JsonSchemaForm.js.map +1 -1
  37. package/dist/components/SecretKeySelector.cjs +1 -2
  38. package/dist/components/SecretKeySelector.cjs.map +1 -1
  39. package/dist/components/SecretKeySelector.d.ts +5 -3
  40. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  41. package/dist/components/SecretKeySelector.js +2 -3
  42. package/dist/components/SecretKeySelector.js.map +1 -1
  43. package/dist/components/TreePickerField.cjs +137 -0
  44. package/dist/components/TreePickerField.cjs.map +1 -0
  45. package/dist/components/TreePickerField.d.ts +30 -0
  46. package/dist/components/TreePickerField.d.ts.map +1 -0
  47. package/dist/components/TreePickerField.js +137 -0
  48. package/dist/components/TreePickerField.js.map +1 -0
  49. package/dist/components/WorkloadPicker.cjs +6 -81
  50. package/dist/components/WorkloadPicker.cjs.map +1 -1
  51. package/dist/components/WorkloadPicker.d.ts +1 -20
  52. package/dist/components/WorkloadPicker.d.ts.map +1 -1
  53. package/dist/components/WorkloadPicker.js +3 -78
  54. package/dist/components/WorkloadPicker.js.map +1 -1
  55. package/dist/components/button-variants.cjs +30 -0
  56. package/dist/components/button-variants.cjs.map +1 -0
  57. package/dist/components/button-variants.d.ts +5 -0
  58. package/dist/components/button-variants.d.ts.map +1 -0
  59. package/dist/components/button-variants.js +30 -0
  60. package/dist/components/button-variants.js.map +1 -0
  61. package/dist/components/button.cjs +11 -82
  62. package/dist/components/button.cjs.map +1 -1
  63. package/dist/components/button.d.ts +1 -5
  64. package/dist/components/button.d.ts.map +1 -1
  65. package/dist/components/button.js +5 -76
  66. package/dist/components/button.js.map +1 -1
  67. package/dist/components/filter-bar-utils.cjs +37 -0
  68. package/dist/components/filter-bar-utils.cjs.map +1 -0
  69. package/dist/components/filter-bar-utils.d.ts +4 -0
  70. package/dist/components/filter-bar-utils.d.ts.map +1 -0
  71. package/dist/components/filter-bar-utils.js +37 -0
  72. package/dist/components/filter-bar-utils.js.map +1 -0
  73. package/dist/components/format-options.cjs +20 -0
  74. package/dist/components/format-options.cjs.map +1 -0
  75. package/dist/components/format-options.d.ts +18 -0
  76. package/dist/components/format-options.d.ts.map +1 -0
  77. package/dist/components/format-options.js +20 -0
  78. package/dist/components/format-options.js.map +1 -0
  79. package/dist/components/json-schema-form-array.cjs +13 -17
  80. package/dist/components/json-schema-form-array.cjs.map +1 -1
  81. package/dist/components/json-schema-form-array.d.ts +1 -2
  82. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  83. package/dist/components/json-schema-form-array.js +3 -7
  84. package/dist/components/json-schema-form-array.js.map +1 -1
  85. package/dist/components/json-schema-form-fields.cjs +90 -232
  86. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  87. package/dist/components/json-schema-form-fields.d.ts +51 -6
  88. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-fields.js +82 -224
  90. package/dist/components/json-schema-form-fields.js.map +1 -1
  91. package/dist/components/json-schema-form-object.cjs +149 -0
  92. package/dist/components/json-schema-form-object.cjs.map +1 -0
  93. package/dist/components/json-schema-form-object.d.ts +10 -0
  94. package/dist/components/json-schema-form-object.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-object.js +149 -0
  96. package/dist/components/json-schema-form-object.js.map +1 -0
  97. package/dist/components/json-schema-form-preferences.cjs +41 -0
  98. package/dist/components/json-schema-form-preferences.cjs.map +1 -0
  99. package/dist/components/json-schema-form-preferences.d.ts +10 -0
  100. package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-preferences.js +41 -0
  102. package/dist/components/json-schema-form-preferences.js.map +1 -0
  103. package/dist/components/json-schema-form-render.cjs +43 -72
  104. package/dist/components/json-schema-form-render.cjs.map +1 -1
  105. package/dist/components/json-schema-form-render.d.ts +5 -33
  106. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-render.js +41 -70
  108. package/dist/components/json-schema-form-render.js.map +1 -1
  109. package/dist/components/json-schema-form-resolve.cjs +9 -1
  110. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  111. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-resolve.js +9 -1
  113. package/dist/components/json-schema-form-resolve.js.map +1 -1
  114. package/dist/components/json-schema-form-types.d.ts +58 -1
  115. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  116. package/dist/components/json-schema-form-utils.cjs +96 -0
  117. package/dist/components/json-schema-form-utils.cjs.map +1 -0
  118. package/dist/components/json-schema-form-utils.d.ts +17 -0
  119. package/dist/components/json-schema-form-utils.d.ts.map +1 -0
  120. package/dist/components/json-schema-form-utils.js +96 -0
  121. package/dist/components/json-schema-form-utils.js.map +1 -0
  122. package/dist/components/loading.cjs +109 -0
  123. package/dist/components/loading.cjs.map +1 -0
  124. package/dist/components/loading.d.ts +27 -0
  125. package/dist/components/loading.d.ts.map +1 -0
  126. package/dist/components/loading.js +109 -0
  127. package/dist/components/loading.js.map +1 -0
  128. package/dist/components/workload-picker-utils.cjs +88 -0
  129. package/dist/components/workload-picker-utils.cjs.map +1 -0
  130. package/dist/components/workload-picker-utils.d.ts +34 -0
  131. package/dist/components/workload-picker-utils.d.ts.map +1 -0
  132. package/dist/components/workload-picker-utils.js +88 -0
  133. package/dist/components/workload-picker-utils.js.map +1 -0
  134. package/dist/components.cjs +18 -6
  135. package/dist/components.cjs.map +1 -1
  136. package/dist/components.d.ts +10 -3
  137. package/dist/components.d.ts.map +1 -1
  138. package/dist/components.js +16 -4
  139. package/dist/components.js.map +1 -1
  140. package/dist/data/Badge.cjs +11 -91
  141. package/dist/data/Badge.cjs.map +1 -1
  142. package/dist/data/Badge.d.ts +1 -5
  143. package/dist/data/Badge.d.ts.map +1 -1
  144. package/dist/data/Badge.js +11 -91
  145. package/dist/data/Badge.js.map +1 -1
  146. package/dist/data/Clicky.cjs +4 -3
  147. package/dist/data/Clicky.cjs.map +1 -1
  148. package/dist/data/Clicky.d.ts.map +1 -1
  149. package/dist/data/Clicky.js +4 -3
  150. package/dist/data/Clicky.js.map +1 -1
  151. package/dist/data/DataTable.cjs +161 -156
  152. package/dist/data/DataTable.cjs.map +1 -1
  153. package/dist/data/DataTable.d.ts +25 -4
  154. package/dist/data/DataTable.d.ts.map +1 -1
  155. package/dist/data/DataTable.js +140 -135
  156. package/dist/data/DataTable.js.map +1 -1
  157. package/dist/data/FilterPill.cjs +3 -0
  158. package/dist/data/FilterPill.cjs.map +1 -1
  159. package/dist/data/FilterPill.d.ts.map +1 -1
  160. package/dist/data/FilterPill.js +3 -0
  161. package/dist/data/FilterPill.js.map +1 -1
  162. package/dist/data/Icon.cjs +7 -7
  163. package/dist/data/Icon.cjs.map +1 -1
  164. package/dist/data/Icon.js +7 -7
  165. package/dist/data/Icon.js.map +1 -1
  166. package/dist/data/LogDetails.cjs +5 -14
  167. package/dist/data/LogDetails.cjs.map +1 -1
  168. package/dist/data/LogDetails.d.ts +8 -4
  169. package/dist/data/LogDetails.d.ts.map +1 -1
  170. package/dist/data/LogDetails.js +4 -13
  171. package/dist/data/LogDetails.js.map +1 -1
  172. package/dist/data/LogsTable.cjs +6 -165
  173. package/dist/data/LogsTable.cjs.map +1 -1
  174. package/dist/data/LogsTable.d.ts +2 -15
  175. package/dist/data/LogsTable.d.ts.map +1 -1
  176. package/dist/data/LogsTable.js +6 -165
  177. package/dist/data/LogsTable.js.map +1 -1
  178. package/dist/data/TimeseriesCoreBars.cjs +8 -1
  179. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  180. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  181. package/dist/data/TimeseriesCoreBars.js +8 -1
  182. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  183. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  184. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  185. package/dist/data/TreeNode.cjs +13 -7
  186. package/dist/data/TreeNode.cjs.map +1 -1
  187. package/dist/data/TreeNode.d.ts.map +1 -1
  188. package/dist/data/TreeNode.js +13 -7
  189. package/dist/data/TreeNode.js.map +1 -1
  190. package/dist/data/badge-variants.cjs +85 -0
  191. package/dist/data/badge-variants.cjs.map +1 -0
  192. package/dist/data/badge-variants.d.ts +6 -0
  193. package/dist/data/badge-variants.d.ts.map +1 -0
  194. package/dist/data/badge-variants.js +85 -0
  195. package/dist/data/badge-variants.js.map +1 -0
  196. package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
  197. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
  198. package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
  199. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
  200. package/dist/data/cache-browser/CacheBrowser.js +59 -0
  201. package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
  202. package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
  203. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
  204. package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
  205. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
  206. package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
  207. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
  208. package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
  209. package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
  210. package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
  211. package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
  212. package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
  213. package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
  214. package/dist/data/cache-browser/CacheTree.cjs +189 -0
  215. package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
  216. package/dist/data/cache-browser/CacheTree.d.ts +27 -0
  217. package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
  218. package/dist/data/cache-browser/CacheTree.js +189 -0
  219. package/dist/data/cache-browser/CacheTree.js.map +1 -0
  220. package/dist/data/cache-browser/CacheValue.cjs +86 -0
  221. package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
  222. package/dist/data/cache-browser/CacheValue.d.ts +11 -0
  223. package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
  224. package/dist/data/cache-browser/CacheValue.js +86 -0
  225. package/dist/data/cache-browser/CacheValue.js.map +1 -0
  226. package/dist/data/cache-browser/adapter.cjs +52 -0
  227. package/dist/data/cache-browser/adapter.cjs.map +1 -0
  228. package/dist/data/cache-browser/adapter.d.ts +48 -0
  229. package/dist/data/cache-browser/adapter.d.ts.map +1 -0
  230. package/dist/data/cache-browser/adapter.js +52 -0
  231. package/dist/data/cache-browser/adapter.js.map +1 -0
  232. package/dist/data/cache-browser/api.cjs +42 -0
  233. package/dist/data/cache-browser/api.cjs.map +1 -0
  234. package/dist/data/cache-browser/api.d.ts +33 -0
  235. package/dist/data/cache-browser/api.d.ts.map +1 -0
  236. package/dist/data/cache-browser/api.js +42 -0
  237. package/dist/data/cache-browser/api.js.map +1 -0
  238. package/dist/data/cache-browser/index.d.ts +9 -0
  239. package/dist/data/cache-browser/index.d.ts.map +1 -0
  240. package/dist/data/cache-browser/types.cjs +7 -0
  241. package/dist/data/cache-browser/types.cjs.map +1 -0
  242. package/dist/data/cache-browser/types.d.ts +78 -0
  243. package/dist/data/cache-browser/types.d.ts.map +1 -0
  244. package/dist/data/cache-browser/types.js +7 -0
  245. package/dist/data/cache-browser/types.js.map +1 -0
  246. package/dist/data/cells/TagList.cjs +4 -101
  247. package/dist/data/cells/TagList.cjs.map +1 -1
  248. package/dist/data/cells/TagList.d.ts +1 -49
  249. package/dist/data/cells/TagList.d.ts.map +1 -1
  250. package/dist/data/cells/TagList.js +3 -100
  251. package/dist/data/cells/TagList.js.map +1 -1
  252. package/dist/data/cells/Timestamp.cjs +3 -192
  253. package/dist/data/cells/Timestamp.cjs.map +1 -1
  254. package/dist/data/cells/Timestamp.d.ts +1 -50
  255. package/dist/data/cells/Timestamp.d.ts.map +1 -1
  256. package/dist/data/cells/Timestamp.js +2 -191
  257. package/dist/data/cells/Timestamp.js.map +1 -1
  258. package/dist/data/cells/tag-utils.cjs +103 -0
  259. package/dist/data/cells/tag-utils.cjs.map +1 -0
  260. package/dist/data/cells/tag-utils.d.ts +51 -0
  261. package/dist/data/cells/tag-utils.d.ts.map +1 -0
  262. package/dist/data/cells/tag-utils.js +103 -0
  263. package/dist/data/cells/tag-utils.js.map +1 -0
  264. package/dist/data/cells/timestamp-format.cjs +193 -0
  265. package/dist/data/cells/timestamp-format.cjs.map +1 -0
  266. package/dist/data/cells/timestamp-format.d.ts +51 -0
  267. package/dist/data/cells/timestamp-format.d.ts.map +1 -0
  268. package/dist/data/cells/timestamp-format.js +193 -0
  269. package/dist/data/cells/timestamp-format.js.map +1 -0
  270. package/dist/data/chat/Chat.cjs +48 -0
  271. package/dist/data/chat/Chat.cjs.map +1 -0
  272. package/dist/data/chat/Chat.d.ts +26 -0
  273. package/dist/data/chat/Chat.d.ts.map +1 -0
  274. package/dist/data/chat/Chat.fixtures.d.ts +6 -0
  275. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
  276. package/dist/data/chat/Chat.js +48 -0
  277. package/dist/data/chat/Chat.js.map +1 -0
  278. package/dist/data/chat/Conversation.cjs +34 -0
  279. package/dist/data/chat/Conversation.cjs.map +1 -0
  280. package/dist/data/chat/Conversation.d.ts +11 -0
  281. package/dist/data/chat/Conversation.d.ts.map +1 -0
  282. package/dist/data/chat/Conversation.js +34 -0
  283. package/dist/data/chat/Conversation.js.map +1 -0
  284. package/dist/data/chat/Message.cjs +44 -0
  285. package/dist/data/chat/Message.cjs.map +1 -0
  286. package/dist/data/chat/Message.d.ts +10 -0
  287. package/dist/data/chat/Message.d.ts.map +1 -0
  288. package/dist/data/chat/Message.js +44 -0
  289. package/dist/data/chat/Message.js.map +1 -0
  290. package/dist/data/chat/PromptInput.cjs +61 -0
  291. package/dist/data/chat/PromptInput.cjs.map +1 -0
  292. package/dist/data/chat/PromptInput.d.ts +16 -0
  293. package/dist/data/chat/PromptInput.d.ts.map +1 -0
  294. package/dist/data/chat/PromptInput.js +61 -0
  295. package/dist/data/chat/PromptInput.js.map +1 -0
  296. package/dist/data/chat/ToolCall.cjs +92 -0
  297. package/dist/data/chat/ToolCall.cjs.map +1 -0
  298. package/dist/data/chat/ToolCall.d.ts +14 -0
  299. package/dist/data/chat/ToolCall.d.ts.map +1 -0
  300. package/dist/data/chat/ToolCall.js +92 -0
  301. package/dist/data/chat/ToolCall.js.map +1 -0
  302. package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
  303. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
  304. package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
  305. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
  306. package/dist/data/chat/clickyOperationsToTools.js +73 -0
  307. package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
  308. package/dist/data/chat/index.d.ts +8 -0
  309. package/dist/data/chat/index.d.ts.map +1 -0
  310. package/dist/data/chat/types.cjs +18 -0
  311. package/dist/data/chat/types.cjs.map +1 -0
  312. package/dist/data/chat/types.d.ts +41 -0
  313. package/dist/data/chat/types.d.ts.map +1 -0
  314. package/dist/data/chat/types.js +18 -0
  315. package/dist/data/chat/types.js.map +1 -0
  316. package/dist/data/data-table-utils.cjs +55 -0
  317. package/dist/data/data-table-utils.cjs.map +1 -0
  318. package/dist/data/data-table-utils.d.ts +24 -0
  319. package/dist/data/data-table-utils.d.ts.map +1 -0
  320. package/dist/data/data-table-utils.js +55 -0
  321. package/dist/data/data-table-utils.js.map +1 -0
  322. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
  323. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  324. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  325. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
  326. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  327. package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
  328. package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
  329. package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
  330. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
  331. package/dist/data/diagnostics/GoroutineCard.js +2 -21
  332. package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
  333. package/dist/data/diagnostics/ThreadCard.cjs +3 -38
  334. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  335. package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
  336. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  337. package/dist/data/diagnostics/ThreadCard.js +2 -37
  338. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  339. package/dist/data/diagnostics/state-styles.cjs +59 -0
  340. package/dist/data/diagnostics/state-styles.cjs.map +1 -0
  341. package/dist/data/diagnostics/state-styles.d.ts +5 -0
  342. package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
  343. package/dist/data/diagnostics/state-styles.js +59 -0
  344. package/dist/data/diagnostics/state-styles.js.map +1 -0
  345. package/dist/data/logs-normalize.cjs +166 -0
  346. package/dist/data/logs-normalize.cjs.map +1 -0
  347. package/dist/data/logs-normalize.d.ts +16 -0
  348. package/dist/data/logs-normalize.d.ts.map +1 -0
  349. package/dist/data/logs-normalize.js +166 -0
  350. package/dist/data/logs-normalize.js.map +1 -0
  351. package/dist/data/task-status.cjs +19 -19
  352. package/dist/data/task-status.cjs.map +1 -1
  353. package/dist/data/task-status.js +19 -19
  354. package/dist/data/task-status.js.map +1 -1
  355. package/dist/data/version-info.cjs +3 -3
  356. package/dist/data/version-info.js +3 -3
  357. package/dist/data.cjs +43 -18
  358. package/dist/data.cjs.map +1 -1
  359. package/dist/data.d.ts +11 -5
  360. package/dist/data.d.ts.map +1 -1
  361. package/dist/data.js +30 -5
  362. package/dist/data.js.map +1 -1
  363. package/dist/hooks/density-provider.cjs +38 -0
  364. package/dist/hooks/density-provider.cjs.map +1 -0
  365. package/dist/hooks/density-provider.d.ts +20 -0
  366. package/dist/hooks/density-provider.d.ts.map +1 -0
  367. package/dist/hooks/density-provider.js +38 -0
  368. package/dist/hooks/density-provider.js.map +1 -0
  369. package/dist/hooks/theme-provider.cjs +43 -0
  370. package/dist/hooks/theme-provider.cjs.map +1 -0
  371. package/dist/hooks/theme-provider.d.ts +9 -0
  372. package/dist/hooks/theme-provider.d.ts.map +1 -0
  373. package/dist/hooks/theme-provider.js +43 -0
  374. package/dist/hooks/theme-provider.js.map +1 -0
  375. package/dist/hooks/use-density.cjs +8 -37
  376. package/dist/hooks/use-density.cjs.map +1 -1
  377. package/dist/hooks/use-density.d.ts +5 -20
  378. package/dist/hooks/use-density.d.ts.map +1 -1
  379. package/dist/hooks/use-density.js +9 -38
  380. package/dist/hooks/use-density.js.map +1 -1
  381. package/dist/hooks/use-theme.cjs +10 -43
  382. package/dist/hooks/use-theme.cjs.map +1 -1
  383. package/dist/hooks/use-theme.d.ts +6 -9
  384. package/dist/hooks/use-theme.d.ts.map +1 -1
  385. package/dist/hooks/use-theme.js +11 -44
  386. package/dist/hooks/use-theme.js.map +1 -1
  387. package/dist/hooks.cjs +5 -2
  388. package/dist/hooks.cjs.map +1 -1
  389. package/dist/hooks.d.ts +4 -2
  390. package/dist/hooks.d.ts.map +1 -1
  391. package/dist/hooks.js +5 -2
  392. package/dist/hooks.js.map +1 -1
  393. package/dist/icons/changeIconAliases.cjs +13 -13
  394. package/dist/icons/changeIconAliases.cjs.map +1 -1
  395. package/dist/icons/changeIconAliases.d.ts.map +1 -1
  396. package/dist/icons/changeIconAliases.js +13 -13
  397. package/dist/icons/changeIconAliases.js.map +1 -1
  398. package/dist/index.cjs +71 -30
  399. package/dist/index.cjs.map +1 -1
  400. package/dist/index.js +53 -12
  401. package/dist/index.js.map +1 -1
  402. package/dist/overlay/DropdownMenu.cjs +2 -0
  403. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  404. package/dist/overlay/DropdownMenu.d.ts +3 -1
  405. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  406. package/dist/overlay/DropdownMenu.js +2 -0
  407. package/dist/overlay/DropdownMenu.js.map +1 -1
  408. package/dist/overlay/Modal.cjs +11 -4
  409. package/dist/overlay/Modal.cjs.map +1 -1
  410. package/dist/overlay/Modal.d.ts +1 -1
  411. package/dist/overlay/Modal.d.ts.map +1 -1
  412. package/dist/overlay/Modal.js +11 -4
  413. package/dist/overlay/Modal.js.map +1 -1
  414. package/dist/overlay/modalStack.cjs +35 -0
  415. package/dist/overlay/modalStack.cjs.map +1 -0
  416. package/dist/overlay/modalStack.d.ts +13 -0
  417. package/dist/overlay/modalStack.d.ts.map +1 -0
  418. package/dist/overlay/modalStack.js +35 -0
  419. package/dist/overlay/modalStack.js.map +1 -0
  420. package/dist/rpc/AcceptPicker.cjs +2 -18
  421. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  422. package/dist/rpc/AcceptPicker.d.ts +1 -41
  423. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  424. package/dist/rpc/AcceptPicker.js +2 -18
  425. package/dist/rpc/AcceptPicker.js.map +1 -1
  426. package/dist/rpc/CommandOutput.cjs +1 -1
  427. package/dist/rpc/CommandOutput.cjs.map +1 -1
  428. package/dist/rpc/CommandOutput.js +1 -1
  429. package/dist/rpc/CommandOutput.js.map +1 -1
  430. package/dist/rpc/EndpointList.cjs +1 -1
  431. package/dist/rpc/EndpointList.cjs.map +1 -1
  432. package/dist/rpc/EndpointList.js +1 -1
  433. package/dist/rpc/EndpointList.js.map +1 -1
  434. package/dist/rpc/OperationCatalog.cjs +23 -41
  435. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  436. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  437. package/dist/rpc/OperationCatalog.js +24 -42
  438. package/dist/rpc/OperationCatalog.js.map +1 -1
  439. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  440. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  441. package/dist/rpc/OperationCommandPage.js.map +1 -1
  442. package/dist/rpc/accept-options.cjs +20 -0
  443. package/dist/rpc/accept-options.cjs.map +1 -0
  444. package/dist/rpc/accept-options.d.ts +42 -0
  445. package/dist/rpc/accept-options.d.ts.map +1 -0
  446. package/dist/rpc/accept-options.js +20 -0
  447. package/dist/rpc/accept-options.js.map +1 -0
  448. package/dist/rpc/classify.cjs +15 -4
  449. package/dist/rpc/classify.cjs.map +1 -1
  450. package/dist/rpc/classify.d.ts.map +1 -1
  451. package/dist/rpc/classify.js +15 -4
  452. package/dist/rpc/classify.js.map +1 -1
  453. package/dist/rpc/clickyMetadata.cjs +13 -3
  454. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  455. package/dist/rpc/clickyMetadata.d.ts +2 -0
  456. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  457. package/dist/rpc/clickyMetadata.js +14 -4
  458. package/dist/rpc/clickyMetadata.js.map +1 -1
  459. package/dist/rpc.cjs +3 -2
  460. package/dist/rpc.cjs.map +1 -1
  461. package/dist/rpc.d.ts +2 -1
  462. package/dist/rpc.d.ts.map +1 -1
  463. package/dist/rpc.js +2 -1
  464. package/dist/rpc.js.map +1 -1
  465. package/dist/styles.css +1 -1
  466. package/package.json +16 -1
@@ -0,0 +1,189 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { cn } from "../../lib/utils.js";
5
+ import { formatBytes, formatShort } from "../../lib/format.js";
6
+ import { Icon } from "../Icon.js";
7
+ import { Tree } from "../Tree.js";
8
+ import { cacheQueryKeys } from "./api.js";
9
+ import { isLeaf } from "./types.js";
10
+ import { UiLayers } from "../../icons/components/UiLayers.js";
11
+ import { UiTag } from "../../icons/components/UiTag.js";
12
+ import { UiListFlat } from "../../icons/components/UiListFlat.js";
13
+ import { UiBraces } from "../../icons/components/UiBraces.js";
14
+ import { UiFileText } from "../../icons/components/UiFileText.js";
15
+ import { UiKey } from "../../icons/components/UiKey.js";
16
+ import { UiFolder } from "../../icons/components/UiFolder.js";
17
+ import { UiSearch } from "../../icons/components/UiSearch.js";
18
+ import { UiClose } from "../../icons/components/UiClose.js";
19
+ const typeIcons = {
20
+ string: UiFileText,
21
+ hash: UiBraces,
22
+ list: UiListFlat,
23
+ set: UiTag,
24
+ zset: UiLayers
25
+ };
26
+ function CacheTree({
27
+ client,
28
+ registry,
29
+ rootPrefix = "",
30
+ selected,
31
+ onSelect,
32
+ className
33
+ }) {
34
+ var _a, _b, _c;
35
+ const [searchInput, setSearchInput] = useState("");
36
+ const [search, setSearch] = useState("");
37
+ useEffect(() => {
38
+ const handle = setTimeout(() => setSearch(searchInput.trim()), 300);
39
+ return () => clearTimeout(handle);
40
+ }, [searchInput]);
41
+ const root = useQuery({
42
+ queryKey: cacheQueryKeys.tree(client.baseUrl, rootPrefix),
43
+ queryFn: () => client.tree(rootPrefix)
44
+ });
45
+ const searchResults = useQuery({
46
+ queryKey: cacheQueryKeys.search(client.baseUrl, search),
47
+ queryFn: () => client.search(search),
48
+ enabled: search.length > 0
49
+ });
50
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex min-h-0 flex-col", className), children: [
51
+ /* @__PURE__ */ jsxs("label", { className: "m-density-2 flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 text-xs shadow-sm", children: [
52
+ /* @__PURE__ */ jsx(Icon, { icon: UiSearch, className: "text-xs text-muted-foreground" }),
53
+ /* @__PURE__ */ jsx(
54
+ "input",
55
+ {
56
+ type: "search",
57
+ value: searchInput,
58
+ onChange: (e) => setSearchInput(e.target.value),
59
+ placeholder: "Search keys",
60
+ "aria-label": "Search cache keys",
61
+ className: "h-5 w-full border-0 bg-transparent p-0 text-xs outline-none placeholder:text-muted-foreground"
62
+ }
63
+ ),
64
+ searchInput && /* @__PURE__ */ jsx(
65
+ "button",
66
+ {
67
+ type: "button",
68
+ onClick: () => setSearchInput(""),
69
+ "aria-label": "Clear key search",
70
+ className: "inline-flex items-center rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground",
71
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "text-xs" })
72
+ }
73
+ )
74
+ ] }),
75
+ root.isError && /* @__PURE__ */ jsx(QueryError, { error: root.error }),
76
+ search ? /* @__PURE__ */ jsx(
77
+ SearchResults,
78
+ {
79
+ nodes: ((_a = searchResults.data) == null ? void 0 : _a.keys) ?? [],
80
+ truncated: ((_b = searchResults.data) == null ? void 0 : _b.truncated) ?? false,
81
+ loading: searchResults.isLoading,
82
+ error: searchResults.isError ? searchResults.error : null,
83
+ registry,
84
+ client,
85
+ selected,
86
+ onSelect
87
+ }
88
+ ) : /* @__PURE__ */ jsx(
89
+ Tree,
90
+ {
91
+ roots: ((_c = root.data) == null ? void 0 : _c.nodes) ?? [],
92
+ className: "min-h-0 flex-1",
93
+ empty: /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-sm text-muted-foreground", children: root.isLoading ? "Loading keys…" : "No keys found." }),
94
+ getKey: (node) => node.prefix ?? node.key ?? node.name,
95
+ getChildren: () => void 0,
96
+ hasMoreChildren: (node) => !isLeaf(node),
97
+ loadChildren: async (node) => (await client.tree(node.prefix ?? "")).nodes,
98
+ selected,
99
+ onSelect,
100
+ defaultOpen: () => false,
101
+ getSearchText: (node) => node.name,
102
+ renderRow: ({ node, selected: isSelected, error }) => /* @__PURE__ */ jsx(
103
+ CacheNodeRow,
104
+ {
105
+ node,
106
+ selected: isSelected,
107
+ error,
108
+ registry,
109
+ client
110
+ }
111
+ )
112
+ }
113
+ )
114
+ ] });
115
+ }
116
+ function SearchResults({
117
+ nodes,
118
+ truncated,
119
+ loading,
120
+ error,
121
+ registry,
122
+ client,
123
+ selected,
124
+ onSelect
125
+ }) {
126
+ if (error) return /* @__PURE__ */ jsx(QueryError, { error });
127
+ if (loading) {
128
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-sm text-muted-foreground", children: "Searching…" });
129
+ }
130
+ if (nodes.length === 0) {
131
+ return /* @__PURE__ */ jsx("div", { className: "px-3 py-4 text-sm text-muted-foreground", children: "No matching keys." });
132
+ }
133
+ return /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 overflow-auto", role: "listbox", "aria-label": "Matching cache keys", children: [
134
+ truncated && /* @__PURE__ */ jsxs("div", { className: "px-3 py-1 text-xs text-muted-foreground", children: [
135
+ "Showing the first ",
136
+ nodes.length,
137
+ " matches — refine the search to narrow down."
138
+ ] }),
139
+ nodes.map((node) => /* @__PURE__ */ jsx(
140
+ "button",
141
+ {
142
+ type: "button",
143
+ role: "option",
144
+ "aria-selected": (selected == null ? void 0 : selected.key) === node.key,
145
+ onClick: () => onSelect(node),
146
+ className: cn(
147
+ "flex w-full items-center gap-1.5 px-2 py-1 text-left text-sm",
148
+ (selected == null ? void 0 : selected.key) === node.key ? "border-l-2 border-primary bg-primary/10" : "hover:bg-accent"
149
+ ),
150
+ children: /* @__PURE__ */ jsx(CacheNodeRow, { node, selected: (selected == null ? void 0 : selected.key) === node.key, registry, client })
151
+ },
152
+ node.key ?? node.name
153
+ ))
154
+ ] });
155
+ }
156
+ function CacheNodeRow({
157
+ node,
158
+ selected: _selected,
159
+ error,
160
+ registry,
161
+ client
162
+ }) {
163
+ const adapter = registry.resolveRowIcon(node, null);
164
+ const icon = adapter ? adapter.renderRowIcon({ node, detail: null, client }) : /* @__PURE__ */ jsx(
165
+ Icon,
166
+ {
167
+ icon: isLeaf(node) ? typeIcons[node.type ?? ""] ?? UiKey : UiFolder,
168
+ className: "shrink-0 text-xs text-muted-foreground"
169
+ }
170
+ );
171
+ return /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-1.5", children: [
172
+ icon,
173
+ /* @__PURE__ */ jsx("span", { className: "truncate font-mono text-xs", children: node.name }),
174
+ !isLeaf(node) && /* @__PURE__ */ jsxs("span", { className: "ml-auto flex shrink-0 items-center gap-1.5 text-[10px] text-muted-foreground", children: [
175
+ node.bytes ? /* @__PURE__ */ jsx("span", { children: formatBytes(node.bytes) }) : null,
176
+ /* @__PURE__ */ jsx("span", { className: "rounded-full bg-muted px-1.5", children: formatShort(node.keys) })
177
+ ] }),
178
+ isLeaf(node) && node.bytes ? /* @__PURE__ */ jsx("span", { className: "ml-auto shrink-0 text-[10px] text-muted-foreground", children: formatBytes(node.bytes) }) : null,
179
+ error != null && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[10px] text-red-600 dark:text-red-400", children: "load failed" })
180
+ ] });
181
+ }
182
+ function QueryError({ error }) {
183
+ return /* @__PURE__ */ jsx("div", { className: "m-density-2 rounded-md border border-red-300 bg-red-50 px-density-3 py-density-2 text-xs text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200", children: error instanceof Error ? error.message : String(error) });
184
+ }
185
+ export {
186
+ CacheNodeRow,
187
+ CacheTree
188
+ };
189
+ //# sourceMappingURL=CacheTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheTree.js","sources":["../../../src/data/cache-browser/CacheTree.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cn } from \"../../lib/utils\";\nimport { formatBytes, formatShort } from \"../../lib/format\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n UiBraces,\n UiClose,\n UiFileText,\n UiFolder,\n UiKey,\n UiLayers,\n UiListFlat,\n UiSearch,\n UiTag,\n} from \"../../icons\";\nimport { Tree } from \"../Tree\";\nimport { cacheQueryKeys, type CacheClient } from \"./api\";\nimport type { CacheAdapterRegistry } from \"./adapter\";\nimport { isLeaf, type CacheTreeNode } from \"./types\";\n\nconst typeIcons: Record<string, StaticIconComponent> = {\n string: UiFileText,\n hash: UiBraces,\n list: UiListFlat,\n set: UiTag,\n zset: UiLayers,\n};\n\nexport type CacheTreeProps = {\n client: CacheClient;\n registry: CacheAdapterRegistry;\n /** Logical prefix the tree is rooted at; empty browses the whole keyspace. */\n rootPrefix?: string;\n selected: CacheTreeNode | null;\n onSelect: (node: CacheTreeNode | null) => void;\n className?: string;\n};\n\n/**\n * Lazy key tree over the cache-browser tree endpoint, with a server-side\n * substring search that swaps the tree for a flat result list while active.\n * (The tree's own toolbar filter still narrows already-loaded nodes.)\n */\nexport function CacheTree({\n client,\n registry,\n rootPrefix = \"\",\n selected,\n onSelect,\n className,\n}: CacheTreeProps) {\n const [searchInput, setSearchInput] = useState(\"\");\n const [search, setSearch] = useState(\"\");\n useEffect(() => {\n const handle = setTimeout(() => setSearch(searchInput.trim()), 300);\n return () => clearTimeout(handle);\n }, [searchInput]);\n\n const root = useQuery({\n queryKey: cacheQueryKeys.tree(client.baseUrl, rootPrefix),\n queryFn: () => client.tree(rootPrefix),\n });\n\n const searchResults = useQuery({\n queryKey: cacheQueryKeys.search(client.baseUrl, search),\n queryFn: () => client.search(search),\n enabled: search.length > 0,\n });\n\n return (\n <div className={cn(\"flex min-h-0 flex-col\", className)}>\n <label className=\"m-density-2 flex items-center gap-2 rounded-md border border-border bg-background px-2 py-1 text-xs shadow-sm\">\n <Icon icon={UiSearch} className=\"text-xs text-muted-foreground\" />\n <input\n type=\"search\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n placeholder=\"Search keys\"\n aria-label=\"Search cache keys\"\n className=\"h-5 w-full border-0 bg-transparent p-0 text-xs outline-none placeholder:text-muted-foreground\"\n />\n {searchInput && (\n <button\n type=\"button\"\n onClick={() => setSearchInput(\"\")}\n aria-label=\"Clear key search\"\n className=\"inline-flex items-center rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-accent-foreground\"\n >\n <Icon icon={UiClose} className=\"text-xs\" />\n </button>\n )}\n </label>\n\n {root.isError && <QueryError error={root.error} />}\n\n {search ? (\n <SearchResults\n nodes={searchResults.data?.keys ?? []}\n truncated={searchResults.data?.truncated ?? false}\n loading={searchResults.isLoading}\n error={searchResults.isError ? searchResults.error : null}\n registry={registry}\n client={client}\n selected={selected}\n onSelect={onSelect}\n />\n ) : (\n <Tree<CacheTreeNode>\n roots={root.data?.nodes ?? []}\n className=\"min-h-0 flex-1\"\n empty={\n <div className=\"px-3 py-4 text-sm text-muted-foreground\">\n {root.isLoading ? \"Loading keys…\" : \"No keys found.\"}\n </div>\n }\n getKey={(node) => node.prefix ?? node.key ?? node.name}\n getChildren={() => undefined}\n hasMoreChildren={(node) => !isLeaf(node)}\n loadChildren={async (node) => (await client.tree(node.prefix ?? \"\")).nodes}\n selected={selected}\n onSelect={onSelect}\n defaultOpen={() => false}\n getSearchText={(node) => node.name}\n renderRow={({ node, selected: isSelected, error }) => (\n <CacheNodeRow\n node={node}\n selected={isSelected}\n error={error}\n registry={registry}\n client={client}\n />\n )}\n />\n )}\n </div>\n );\n}\n\nfunction SearchResults({\n nodes,\n truncated,\n loading,\n error,\n registry,\n client,\n selected,\n onSelect,\n}: {\n nodes: CacheTreeNode[];\n truncated: boolean;\n loading: boolean;\n error: unknown;\n registry: CacheAdapterRegistry;\n client: CacheClient;\n selected: CacheTreeNode | null;\n onSelect: (node: CacheTreeNode) => void;\n}) {\n if (error) return <QueryError error={error} />;\n if (loading) {\n return <div className=\"px-3 py-4 text-sm text-muted-foreground\">Searching…</div>;\n }\n if (nodes.length === 0) {\n return <div className=\"px-3 py-4 text-sm text-muted-foreground\">No matching keys.</div>;\n }\n return (\n <div className=\"min-h-0 flex-1 overflow-auto\" role=\"listbox\" aria-label=\"Matching cache keys\">\n {truncated && (\n <div className=\"px-3 py-1 text-xs text-muted-foreground\">\n Showing the first {nodes.length} matches — refine the search to narrow down.\n </div>\n )}\n {nodes.map((node) => (\n <button\n key={node.key ?? node.name}\n type=\"button\"\n role=\"option\"\n aria-selected={selected?.key === node.key}\n onClick={() => onSelect(node)}\n className={cn(\n \"flex w-full items-center gap-1.5 px-2 py-1 text-left text-sm\",\n selected?.key === node.key\n ? \"border-l-2 border-primary bg-primary/10\"\n : \"hover:bg-accent\",\n )}\n >\n <CacheNodeRow node={node} selected={selected?.key === node.key} registry={registry} client={client} />\n </button>\n ))}\n </div>\n );\n}\n\n/** Shared row body: adapter icon (or type/folder icon), name and size hints. */\nexport function CacheNodeRow({\n node,\n selected: _selected,\n error,\n registry,\n client,\n}: {\n node: CacheTreeNode;\n selected: boolean;\n error?: unknown;\n registry: CacheAdapterRegistry;\n client: CacheClient;\n}) {\n const adapter = registry.resolveRowIcon(node, null);\n const icon = adapter ? (\n adapter.renderRowIcon!({ node, detail: null, client })\n ) : (\n <Icon\n icon={isLeaf(node) ? (typeIcons[node.type ?? \"\"] ?? UiKey) : UiFolder}\n className=\"shrink-0 text-xs text-muted-foreground\"\n />\n );\n return (\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n {icon}\n <span className=\"truncate font-mono text-xs\">{node.name}</span>\n {!isLeaf(node) && (\n <span className=\"ml-auto flex shrink-0 items-center gap-1.5 text-[10px] text-muted-foreground\">\n {node.bytes ? <span>{formatBytes(node.bytes)}</span> : null}\n <span className=\"rounded-full bg-muted px-1.5\">\n {formatShort(node.keys)}\n </span>\n </span>\n )}\n {isLeaf(node) && node.bytes ? (\n <span className=\"ml-auto shrink-0 text-[10px] text-muted-foreground\">\n {formatBytes(node.bytes)}\n </span>\n ) : null}\n {error != null && (\n <span className=\"shrink-0 text-[10px] text-red-600 dark:text-red-400\">\n load failed\n </span>\n )}\n </span>\n );\n}\n\nfunction QueryError({ error }: { error: unknown }) {\n return (\n <div className=\"m-density-2 rounded-md border border-red-300 bg-red-50 px-density-3 py-density-2 text-xs text-red-800 dark:border-red-800 dark:bg-red-950 dark:text-red-200\">\n {error instanceof Error ? error.message : String(error)}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const CodeBlock = require("../CodeBlock.cjs");
5
+ const KeyValueList = require("../KeyValueList.cjs");
6
+ function CacheValue({ detail }) {
7
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-col gap-density-2", children: [
8
+ detail.truncated && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200", children: [
9
+ "Showing a truncated value — the full ",
10
+ valueNoun(detail.type),
11
+ " has ",
12
+ detail.length,
13
+ " ",
14
+ unitNoun(detail.type),
15
+ "."
16
+ ] }),
17
+ /* @__PURE__ */ jsxRuntime.jsx(CacheValueBody, { detail })
18
+ ] });
19
+ }
20
+ function CacheValueBody({ detail }) {
21
+ switch (detail.type) {
22
+ case "string":
23
+ return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, { language: looksLikeJson(detail.value ?? "") ? "json" : "text", source: detail.value ?? "" });
24
+ case "hash":
25
+ return /* @__PURE__ */ jsxRuntime.jsx(
26
+ KeyValueList.KeyValueList,
27
+ {
28
+ items: Object.entries(detail.fields ?? {}).map(([field, value]) => ({
29
+ key: field,
30
+ label: field,
31
+ value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value })
32
+ })),
33
+ emptyMessage: "Empty hash"
34
+ }
35
+ );
36
+ case "list":
37
+ case "set":
38
+ return /* @__PURE__ */ jsxRuntime.jsx(
39
+ KeyValueList.KeyValueList,
40
+ {
41
+ items: (detail.items ?? []).map((item, i) => ({
42
+ key: `${i}`,
43
+ label: detail.type === "list" ? `#${i}` : "•",
44
+ value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value: item })
45
+ })),
46
+ emptyMessage: detail.type === "list" ? "Empty list" : "Empty set"
47
+ }
48
+ );
49
+ case "zset":
50
+ return /* @__PURE__ */ jsxRuntime.jsx(
51
+ KeyValueList.KeyValueList,
52
+ {
53
+ items: (detail.members ?? []).map((m, i) => ({
54
+ key: `${i}`,
55
+ label: String(m.score),
56
+ value: /* @__PURE__ */ jsxRuntime.jsx(ValueCell, { value: m.member })
57
+ })),
58
+ emptyMessage: "Empty sorted set"
59
+ }
60
+ );
61
+ default:
62
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-sm text-muted-foreground", children: [
63
+ "Values of type ",
64
+ /* @__PURE__ */ jsxRuntime.jsx("code", { children: detail.type }),
65
+ " are not rendered (",
66
+ detail.length,
67
+ " entries)."
68
+ ] });
69
+ }
70
+ }
71
+ function ValueCell({ value }) {
72
+ if (looksLikeJson(value)) return /* @__PURE__ */ jsxRuntime.jsx(CodeBlock.CodeBlock, { language: "json", source: value });
73
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "break-all font-mono text-xs", children: value });
74
+ }
75
+ function looksLikeJson(value) {
76
+ const trimmed = value.trim();
77
+ return trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]");
78
+ }
79
+ function valueNoun(type) {
80
+ return type === "string" ? "value" : type;
81
+ }
82
+ function unitNoun(type) {
83
+ return type === "string" ? "bytes" : "entries";
84
+ }
85
+ exports.CacheValue = CacheValue;
86
+ //# sourceMappingURL=CacheValue.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheValue.cjs","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"sourcesContent":["import { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport type { CacheKeyDetail } from \"./types\";\n\n/**\n * Default type-aware value rendering: JSON-looking strings get the JSON tree,\n * other strings a plain code block, hashes a key/value list, lists/sets an\n * indexed list and zsets a member/score list. Hosts override per key family\n * via CacheNodeAdapter.renderDetail.\n */\nexport function CacheValue({ detail }: { detail: CacheKeyDetail }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-density-2\">\n {detail.truncated && (\n <div className=\"rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200\">\n Showing a truncated value — the full {valueNoun(detail.type)} has {detail.length}{\" \"}\n {unitNoun(detail.type)}.\n </div>\n )}\n <CacheValueBody detail={detail} />\n </div>\n );\n}\n\nfunction CacheValueBody({ detail }: { detail: CacheKeyDetail }) {\n switch (detail.type) {\n case \"string\":\n return <CodeBlock language={looksLikeJson(detail.value ?? \"\") ? \"json\" : \"text\"} source={detail.value ?? \"\"} />;\n case \"hash\":\n return (\n <KeyValueList\n items={Object.entries(detail.fields ?? {}).map(([field, value]) => ({\n key: field,\n label: field,\n value: <ValueCell value={value} />,\n }))}\n emptyMessage=\"Empty hash\"\n />\n );\n case \"list\":\n case \"set\":\n return (\n <KeyValueList\n items={(detail.items ?? []).map((item, i) => ({\n key: `${i}`,\n label: detail.type === \"list\" ? `#${i}` : \"•\",\n value: <ValueCell value={item} />,\n }))}\n emptyMessage={detail.type === \"list\" ? \"Empty list\" : \"Empty set\"}\n />\n );\n case \"zset\":\n return (\n <KeyValueList\n items={(detail.members ?? []).map((m, i) => ({\n key: `${i}`,\n label: String(m.score),\n value: <ValueCell value={m.member} />,\n }))}\n emptyMessage=\"Empty sorted set\"\n />\n );\n default:\n return (\n <div className=\"text-sm text-muted-foreground\">\n Values of type <code>{detail.type}</code> are not rendered ({detail.length} entries).\n </div>\n );\n }\n}\n\n/** Renders one collection entry, expanding embedded JSON. */\nfunction ValueCell({ value }: { value: string }) {\n if (looksLikeJson(value)) return <CodeBlock language=\"json\" source={value} />;\n return <span className=\"break-all font-mono text-xs\">{value}</span>;\n}\n\nfunction looksLikeJson(value: string): boolean {\n const trimmed = value.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\nfunction valueNoun(type: string): string {\n return type === \"string\" ? \"value\" : type;\n}\n\nfunction unitNoun(type: string): string {\n return type === \"string\" ? \"bytes\" : \"entries\";\n}\n"],"names":["jsxs","jsx","CodeBlock","KeyValueList"],"mappings":";;;;;AAUO,SAAS,WAAW,EAAE,UAAsC;AACjE,SACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACZ,UAAA;AAAA,IAAA,OAAO,aACNA,gCAAC,OAAA,EAAI,WAAU,qKAAoK,UAAA;AAAA,MAAA;AAAA,MAC3I,UAAU,OAAO,IAAI;AAAA,MAAE;AAAA,MAAM,OAAO;AAAA,MAAQ;AAAA,MACjF,SAAS,OAAO,IAAI;AAAA,MAAE;AAAA,IAAA,GACzB;AAAA,IAEFC,+BAAC,kBAAe,OAAA,CAAgB;AAAA,EAAA,GAClC;AAEJ;AAEA,SAAS,eAAe,EAAE,UAAsC;AAC9D,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAOA,2BAAAA,IAACC,UAAAA,WAAA,EAAU,UAAU,cAAc,OAAO,SAAS,EAAE,IAAI,SAAS,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA,IAC/G,KAAK;AACH,aACED,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,OAAO,OAAO,QAAQ,OAAO,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,YAClE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAOF,2BAAAA,IAAC,WAAA,EAAU,MAAA,CAAc;AAAA,UAAA,EAChC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB,KAAK;AAAA,IACL,KAAK;AACH,aACEA,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,QAAQ,OAAO,SAAS,CAAA,GAAI,IAAI,CAAC,MAAM,OAAO;AAAA,YAC5C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,SAAS,SAAS,IAAI,CAAC,KAAK;AAAA,YAC1C,OAAOF,2BAAAA,IAAC,WAAA,EAAU,OAAO,KAAA,CAAM;AAAA,UAAA,EAC/B;AAAA,UACF,cAAc,OAAO,SAAS,SAAS,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IAG5D,KAAK;AACH,aACEA,2BAAAA;AAAAA,QAACE,aAAAA;AAAAA,QAAA;AAAA,UACC,QAAQ,OAAO,WAAW,CAAA,GAAI,IAAI,CAAC,GAAG,OAAO;AAAA,YAC3C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,EAAE,KAAK;AAAA,YACrB,OAAOF,2BAAAA,IAAC,WAAA,EAAU,OAAO,EAAE,OAAA,CAAQ;AAAA,UAAA,EACnC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB;AACE,aACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,QAAA;AAAA,QAC9BC,2BAAAA,IAAC,QAAA,EAAM,UAAA,OAAO,KAAA,CAAK;AAAA,QAAO;AAAA,QAAoB,OAAO;AAAA,QAAO;AAAA,MAAA,GAC7E;AAAA,EAAA;AAGR;AAGA,SAAS,UAAU,EAAE,SAA4B;AAC/C,MAAI,cAAc,KAAK,EAAG,uCAAQC,UAAAA,WAAA,EAAU,UAAS,QAAO,QAAQ,OAAO;AAC3E,SAAOD,2BAAAA,IAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAC9D;AAEA,SAAS,cAAc,OAAwB;AAC7C,QAAM,UAAU,MAAM,KAAA;AACtB,SACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAEpD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,WAAW,UAAU;AACvC;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,SAAS,WAAW,UAAU;AACvC;;"}
@@ -0,0 +1,11 @@
1
+ import { CacheKeyDetail } from './types';
2
+ /**
3
+ * Default type-aware value rendering: JSON-looking strings get the JSON tree,
4
+ * other strings a plain code block, hashes a key/value list, lists/sets an
5
+ * indexed list and zsets a member/score list. Hosts override per key family
6
+ * via CacheNodeAdapter.renderDetail.
7
+ */
8
+ export declare function CacheValue({ detail }: {
9
+ detail: CacheKeyDetail;
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=CacheValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheValue.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,cAAc,CAAA;CAAE,2CAYhE"}
@@ -0,0 +1,86 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { CodeBlock } from "../CodeBlock.js";
3
+ import { KeyValueList } from "../KeyValueList.js";
4
+ function CacheValue({ detail }) {
5
+ return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-density-2", children: [
6
+ detail.truncated && /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200", children: [
7
+ "Showing a truncated value — the full ",
8
+ valueNoun(detail.type),
9
+ " has ",
10
+ detail.length,
11
+ " ",
12
+ unitNoun(detail.type),
13
+ "."
14
+ ] }),
15
+ /* @__PURE__ */ jsx(CacheValueBody, { detail })
16
+ ] });
17
+ }
18
+ function CacheValueBody({ detail }) {
19
+ switch (detail.type) {
20
+ case "string":
21
+ return /* @__PURE__ */ jsx(CodeBlock, { language: looksLikeJson(detail.value ?? "") ? "json" : "text", source: detail.value ?? "" });
22
+ case "hash":
23
+ return /* @__PURE__ */ jsx(
24
+ KeyValueList,
25
+ {
26
+ items: Object.entries(detail.fields ?? {}).map(([field, value]) => ({
27
+ key: field,
28
+ label: field,
29
+ value: /* @__PURE__ */ jsx(ValueCell, { value })
30
+ })),
31
+ emptyMessage: "Empty hash"
32
+ }
33
+ );
34
+ case "list":
35
+ case "set":
36
+ return /* @__PURE__ */ jsx(
37
+ KeyValueList,
38
+ {
39
+ items: (detail.items ?? []).map((item, i) => ({
40
+ key: `${i}`,
41
+ label: detail.type === "list" ? `#${i}` : "•",
42
+ value: /* @__PURE__ */ jsx(ValueCell, { value: item })
43
+ })),
44
+ emptyMessage: detail.type === "list" ? "Empty list" : "Empty set"
45
+ }
46
+ );
47
+ case "zset":
48
+ return /* @__PURE__ */ jsx(
49
+ KeyValueList,
50
+ {
51
+ items: (detail.members ?? []).map((m, i) => ({
52
+ key: `${i}`,
53
+ label: String(m.score),
54
+ value: /* @__PURE__ */ jsx(ValueCell, { value: m.member })
55
+ })),
56
+ emptyMessage: "Empty sorted set"
57
+ }
58
+ );
59
+ default:
60
+ return /* @__PURE__ */ jsxs("div", { className: "text-sm text-muted-foreground", children: [
61
+ "Values of type ",
62
+ /* @__PURE__ */ jsx("code", { children: detail.type }),
63
+ " are not rendered (",
64
+ detail.length,
65
+ " entries)."
66
+ ] });
67
+ }
68
+ }
69
+ function ValueCell({ value }) {
70
+ if (looksLikeJson(value)) return /* @__PURE__ */ jsx(CodeBlock, { language: "json", source: value });
71
+ return /* @__PURE__ */ jsx("span", { className: "break-all font-mono text-xs", children: value });
72
+ }
73
+ function looksLikeJson(value) {
74
+ const trimmed = value.trim();
75
+ return trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]");
76
+ }
77
+ function valueNoun(type) {
78
+ return type === "string" ? "value" : type;
79
+ }
80
+ function unitNoun(type) {
81
+ return type === "string" ? "bytes" : "entries";
82
+ }
83
+ export {
84
+ CacheValue
85
+ };
86
+ //# sourceMappingURL=CacheValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CacheValue.js","sources":["../../../src/data/cache-browser/CacheValue.tsx"],"sourcesContent":["import { CodeBlock } from \"../CodeBlock\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport type { CacheKeyDetail } from \"./types\";\n\n/**\n * Default type-aware value rendering: JSON-looking strings get the JSON tree,\n * other strings a plain code block, hashes a key/value list, lists/sets an\n * indexed list and zsets a member/score list. Hosts override per key family\n * via CacheNodeAdapter.renderDetail.\n */\nexport function CacheValue({ detail }: { detail: CacheKeyDetail }) {\n return (\n <div className=\"flex min-w-0 flex-col gap-density-2\">\n {detail.truncated && (\n <div className=\"rounded-md border border-yellow-300 bg-yellow-50 px-density-3 py-density-2 text-xs text-yellow-800 dark:border-yellow-700 dark:bg-yellow-950 dark:text-yellow-200\">\n Showing a truncated value — the full {valueNoun(detail.type)} has {detail.length}{\" \"}\n {unitNoun(detail.type)}.\n </div>\n )}\n <CacheValueBody detail={detail} />\n </div>\n );\n}\n\nfunction CacheValueBody({ detail }: { detail: CacheKeyDetail }) {\n switch (detail.type) {\n case \"string\":\n return <CodeBlock language={looksLikeJson(detail.value ?? \"\") ? \"json\" : \"text\"} source={detail.value ?? \"\"} />;\n case \"hash\":\n return (\n <KeyValueList\n items={Object.entries(detail.fields ?? {}).map(([field, value]) => ({\n key: field,\n label: field,\n value: <ValueCell value={value} />,\n }))}\n emptyMessage=\"Empty hash\"\n />\n );\n case \"list\":\n case \"set\":\n return (\n <KeyValueList\n items={(detail.items ?? []).map((item, i) => ({\n key: `${i}`,\n label: detail.type === \"list\" ? `#${i}` : \"•\",\n value: <ValueCell value={item} />,\n }))}\n emptyMessage={detail.type === \"list\" ? \"Empty list\" : \"Empty set\"}\n />\n );\n case \"zset\":\n return (\n <KeyValueList\n items={(detail.members ?? []).map((m, i) => ({\n key: `${i}`,\n label: String(m.score),\n value: <ValueCell value={m.member} />,\n }))}\n emptyMessage=\"Empty sorted set\"\n />\n );\n default:\n return (\n <div className=\"text-sm text-muted-foreground\">\n Values of type <code>{detail.type}</code> are not rendered ({detail.length} entries).\n </div>\n );\n }\n}\n\n/** Renders one collection entry, expanding embedded JSON. */\nfunction ValueCell({ value }: { value: string }) {\n if (looksLikeJson(value)) return <CodeBlock language=\"json\" source={value} />;\n return <span className=\"break-all font-mono text-xs\">{value}</span>;\n}\n\nfunction looksLikeJson(value: string): boolean {\n const trimmed = value.trim();\n return (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n );\n}\n\nfunction valueNoun(type: string): string {\n return type === \"string\" ? \"value\" : type;\n}\n\nfunction unitNoun(type: string): string {\n return type === \"string\" ? \"bytes\" : \"entries\";\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,WAAW,EAAE,UAAsC;AACjE,SACE,qBAAC,OAAA,EAAI,WAAU,uCACZ,UAAA;AAAA,IAAA,OAAO,aACN,qBAAC,OAAA,EAAI,WAAU,qKAAoK,UAAA;AAAA,MAAA;AAAA,MAC3I,UAAU,OAAO,IAAI;AAAA,MAAE;AAAA,MAAM,OAAO;AAAA,MAAQ;AAAA,MACjF,SAAS,OAAO,IAAI;AAAA,MAAE;AAAA,IAAA,GACzB;AAAA,IAEF,oBAAC,kBAAe,OAAA,CAAgB;AAAA,EAAA,GAClC;AAEJ;AAEA,SAAS,eAAe,EAAE,UAAsC;AAC9D,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AACH,aAAO,oBAAC,WAAA,EAAU,UAAU,cAAc,OAAO,SAAS,EAAE,IAAI,SAAS,QAAQ,QAAQ,OAAO,SAAS,IAAI;AAAA,IAC/G,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO,OAAO,QAAQ,OAAO,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO;AAAA,YAClE,KAAK;AAAA,YACL,OAAO;AAAA,YACP,OAAO,oBAAC,WAAA,EAAU,MAAA,CAAc;AAAA,UAAA,EAChC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB,KAAK;AAAA,IACL,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,QAAQ,OAAO,SAAS,CAAA,GAAI,IAAI,CAAC,MAAM,OAAO;AAAA,YAC5C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,SAAS,SAAS,IAAI,CAAC,KAAK;AAAA,YAC1C,OAAO,oBAAC,WAAA,EAAU,OAAO,KAAA,CAAM;AAAA,UAAA,EAC/B;AAAA,UACF,cAAc,OAAO,SAAS,SAAS,eAAe;AAAA,QAAA;AAAA,MAAA;AAAA,IAG5D,KAAK;AACH,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,QAAQ,OAAO,WAAW,CAAA,GAAI,IAAI,CAAC,GAAG,OAAO;AAAA,YAC3C,KAAK,GAAG,CAAC;AAAA,YACT,OAAO,OAAO,EAAE,KAAK;AAAA,YACrB,OAAO,oBAAC,WAAA,EAAU,OAAO,EAAE,OAAA,CAAQ;AAAA,UAAA,EACnC;AAAA,UACF,cAAa;AAAA,QAAA;AAAA,MAAA;AAAA,IAGnB;AACE,aACE,qBAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA;AAAA,QAAA;AAAA,QAC9B,oBAAC,QAAA,EAAM,UAAA,OAAO,KAAA,CAAK;AAAA,QAAO;AAAA,QAAoB,OAAO;AAAA,QAAO;AAAA,MAAA,GAC7E;AAAA,EAAA;AAGR;AAGA,SAAS,UAAU,EAAE,SAA4B;AAC/C,MAAI,cAAc,KAAK,EAAG,4BAAQ,WAAA,EAAU,UAAS,QAAO,QAAQ,OAAO;AAC3E,SAAO,oBAAC,QAAA,EAAK,WAAU,+BAA+B,UAAA,OAAM;AAC9D;AAEA,SAAS,cAAc,OAAwB;AAC7C,QAAM,UAAU,MAAM,KAAA;AACtB,SACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG;AAEpD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,WAAW,UAAU;AACvC;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,SAAS,WAAW,UAAU;AACvC;"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
+ class CacheAdapterRegistry {
7
+ constructor(adapters = []) {
8
+ __publicField(this, "adapters");
9
+ this.adapters = adapters;
10
+ }
11
+ firstWith(node, detail, has) {
12
+ for (const a of this.adapters) {
13
+ if (has(a) && a.match(node, detail)) return a;
14
+ }
15
+ return null;
16
+ }
17
+ /** Adapter whose `renderDetail` should drive the value body, or null for the default. */
18
+ resolveDetail(node, detail) {
19
+ return this.firstWith(node, detail, (a) => !!a.renderDetail);
20
+ }
21
+ resolveRowIcon(node, detail) {
22
+ return this.firstWith(node, detail, (a) => !!a.renderRowIcon);
23
+ }
24
+ /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
25
+ resolveTabs(ctx) {
26
+ const seen = /* @__PURE__ */ new Set();
27
+ const tabs = [];
28
+ for (const a of this.adapters) {
29
+ if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;
30
+ for (const tab of a.detailTabs(ctx)) {
31
+ if (seen.has(tab.id)) continue;
32
+ seen.add(tab.id);
33
+ tabs.push(tab);
34
+ }
35
+ }
36
+ return tabs;
37
+ }
38
+ }
39
+ function createCacheRegistry(adapters = []) {
40
+ return new CacheAdapterRegistry(adapters);
41
+ }
42
+ function prefixAdapter(id, prefix, renderDetail) {
43
+ return {
44
+ id,
45
+ match: (node) => !!node.key && node.key.startsWith(prefix),
46
+ renderDetail
47
+ };
48
+ }
49
+ exports.CacheAdapterRegistry = CacheAdapterRegistry;
50
+ exports.createCacheRegistry = createCacheRegistry;
51
+ exports.prefixAdapter = prefixAdapter;
52
+ //# sourceMappingURL=adapter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.cjs","sources":["../../../src/data/cache-browser/adapter.ts"],"sourcesContent":["// Node adapters let a host plug domain-specific value rendering into the\n// cache browser without forking it — e.g. render `schema:`-prefixed keys with\n// a schema viewer or `task-snapshot:` keys with a task panel. An adapter\n// claims nodes via `match` (typically by key prefix or value kind) and\n// contributes detail rendering. The registry resolves the first matching\n// adapter; nodes with no match fall back to the built-in type-aware value\n// rendering. Mirrors the test-runner TestNodeAdapter contract.\n\nimport type { ReactNode } from \"react\";\nimport type { CacheClient } from \"./api\";\nimport type { CacheKeyDetail, CacheTreeNode } from \"./types\";\n\nexport type CacheAdapterContext = {\n node: CacheTreeNode;\n /** Loaded key detail; null while loading or for prefix groups. */\n detail: CacheKeyDetail | null;\n client: CacheClient;\n};\n\nexport type CacheDetailTab = {\n id: string;\n label: string;\n render: () => ReactNode;\n};\n\nexport type CacheNodeAdapter = {\n /** Stable identifier, used as a React key and for debugging. */\n id: string;\n /** Claim the node. The first registered adapter to return true wins per surface. */\n match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;\n /** Primary value body for the key, replacing the default type-aware rendering. */\n renderDetail?: (c: CacheAdapterContext) => ReactNode;\n /** Extra detail tabs, merged (in registration order) across all matching adapters. */\n detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];\n /** Replace the leading icon on the node's tree row. */\n renderRowIcon?: (c: CacheAdapterContext) => ReactNode;\n};\n\n/**\n * Ordered set of node adapters. First match wins per surface; `detailTabs`\n * merge across every matching adapter so independent adapters can each\n * contribute a tab.\n */\nexport class CacheAdapterRegistry {\n readonly adapters: CacheNodeAdapter[];\n\n constructor(adapters: CacheNodeAdapter[] = []) {\n this.adapters = adapters;\n }\n\n private firstWith(\n node: CacheTreeNode,\n detail: CacheKeyDetail | null,\n has: (a: CacheNodeAdapter) => boolean,\n ): CacheNodeAdapter | null {\n for (const a of this.adapters) {\n if (has(a) && a.match(node, detail)) return a;\n }\n return null;\n }\n\n /** Adapter whose `renderDetail` should drive the value body, or null for the default. */\n resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderDetail);\n }\n\n resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderRowIcon);\n }\n\n /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */\n resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[] {\n const seen = new Set<string>();\n const tabs: CacheDetailTab[] = [];\n for (const a of this.adapters) {\n if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;\n for (const tab of a.detailTabs(ctx)) {\n if (seen.has(tab.id)) continue;\n seen.add(tab.id);\n tabs.push(tab);\n }\n }\n return tabs;\n }\n}\n\nexport function createCacheRegistry(adapters: CacheNodeAdapter[] = []): CacheAdapterRegistry {\n return new CacheAdapterRegistry(adapters);\n}\n\n/**\n * Convenience adapter matching leaf keys by logical prefix, e.g.\n * `prefixAdapter(\"schemas\", \"schema:\", (c) => <SchemaView .../>)`.\n */\nexport function prefixAdapter(\n id: string,\n prefix: string,\n renderDetail: (c: CacheAdapterContext) => ReactNode,\n): CacheNodeAdapter {\n return {\n id,\n match: (node) => !!node.key && node.key.startsWith(prefix),\n renderDetail,\n };\n}\n"],"names":[],"mappings":";;;;;AA2CO,MAAM,qBAAqB;AAAA,EAGhC,YAAY,WAA+B,IAAI;AAFtC;AAGP,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UACN,MACA,QACA,KACyB;AACzB,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,IAAI,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,EAAG,QAAO;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,MAAqB,QAAwD;AACzF,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY;AAAA,EAC7D;AAAA,EAEA,eAAe,MAAqB,QAAwD;AAC1F,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa;AAAA,EAC9D;AAAA;AAAA,EAGA,YAAY,KAA4C;AACtD,UAAM,2BAAW,IAAA;AACjB,UAAM,OAAyB,CAAA;AAC/B,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,EAAG;AACrD,iBAAW,OAAO,EAAE,WAAW,GAAG,GAAG;AACnC,YAAI,KAAK,IAAI,IAAI,EAAE,EAAG;AACtB,aAAK,IAAI,IAAI,EAAE;AACf,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,WAA+B,IAA0B;AAC3F,SAAO,IAAI,qBAAqB,QAAQ;AAC1C;AAMO,SAAS,cACd,IACA,QACA,cACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM;AAAA,IACzD;AAAA,EAAA;AAEJ;;;;"}
@@ -0,0 +1,48 @@
1
+ import { ReactNode } from 'react';
2
+ import { CacheClient } from './api';
3
+ import { CacheKeyDetail, CacheTreeNode } from './types';
4
+ export type CacheAdapterContext = {
5
+ node: CacheTreeNode;
6
+ /** Loaded key detail; null while loading or for prefix groups. */
7
+ detail: CacheKeyDetail | null;
8
+ client: CacheClient;
9
+ };
10
+ export type CacheDetailTab = {
11
+ id: string;
12
+ label: string;
13
+ render: () => ReactNode;
14
+ };
15
+ export type CacheNodeAdapter = {
16
+ /** Stable identifier, used as a React key and for debugging. */
17
+ id: string;
18
+ /** Claim the node. The first registered adapter to return true wins per surface. */
19
+ match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;
20
+ /** Primary value body for the key, replacing the default type-aware rendering. */
21
+ renderDetail?: (c: CacheAdapterContext) => ReactNode;
22
+ /** Extra detail tabs, merged (in registration order) across all matching adapters. */
23
+ detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];
24
+ /** Replace the leading icon on the node's tree row. */
25
+ renderRowIcon?: (c: CacheAdapterContext) => ReactNode;
26
+ };
27
+ /**
28
+ * Ordered set of node adapters. First match wins per surface; `detailTabs`
29
+ * merge across every matching adapter so independent adapters can each
30
+ * contribute a tab.
31
+ */
32
+ export declare class CacheAdapterRegistry {
33
+ readonly adapters: CacheNodeAdapter[];
34
+ constructor(adapters?: CacheNodeAdapter[]);
35
+ private firstWith;
36
+ /** Adapter whose `renderDetail` should drive the value body, or null for the default. */
37
+ resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null;
38
+ resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null;
39
+ /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
40
+ resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[];
41
+ }
42
+ export declare function createCacheRegistry(adapters?: CacheNodeAdapter[]): CacheAdapterRegistry;
43
+ /**
44
+ * Convenience adapter matching leaf keys by logical prefix, e.g.
45
+ * `prefixAdapter("schemas", "schema:", (c) => <SchemaView .../>)`.
46
+ */
47
+ export declare function prefixAdapter(id: string, prefix: string, renderDetail: (c: CacheAdapterContext) => ReactNode): CacheNodeAdapter;
48
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/data/cache-browser/adapter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,kEAAkE;IAClE,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,SAAS,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,oFAAoF;IACpF,KAAK,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,KAAK,OAAO,CAAC;IACvE,kFAAkF;IAClF,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,CAAC;IACrD,sFAAsF;IACtF,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,cAAc,EAAE,CAAC;IAC1D,uDAAuD;IACvD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,CAAC;CACvD,CAAC;AAEF;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;gBAE1B,QAAQ,GAAE,gBAAgB,EAAO;IAI7C,OAAO,CAAC,SAAS;IAWjB,yFAAyF;IACzF,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAI1F,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAI3F,+EAA+E;IAC/E,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,cAAc,EAAE;CAaxD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,gBAAgB,EAAO,GAAG,oBAAoB,CAE3F;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,CAAC,CAAC,EAAE,mBAAmB,KAAK,SAAS,GAClD,gBAAgB,CAMlB"}
@@ -0,0 +1,52 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ class CacheAdapterRegistry {
5
+ constructor(adapters = []) {
6
+ __publicField(this, "adapters");
7
+ this.adapters = adapters;
8
+ }
9
+ firstWith(node, detail, has) {
10
+ for (const a of this.adapters) {
11
+ if (has(a) && a.match(node, detail)) return a;
12
+ }
13
+ return null;
14
+ }
15
+ /** Adapter whose `renderDetail` should drive the value body, or null for the default. */
16
+ resolveDetail(node, detail) {
17
+ return this.firstWith(node, detail, (a) => !!a.renderDetail);
18
+ }
19
+ resolveRowIcon(node, detail) {
20
+ return this.firstWith(node, detail, (a) => !!a.renderRowIcon);
21
+ }
22
+ /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */
23
+ resolveTabs(ctx) {
24
+ const seen = /* @__PURE__ */ new Set();
25
+ const tabs = [];
26
+ for (const a of this.adapters) {
27
+ if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;
28
+ for (const tab of a.detailTabs(ctx)) {
29
+ if (seen.has(tab.id)) continue;
30
+ seen.add(tab.id);
31
+ tabs.push(tab);
32
+ }
33
+ }
34
+ return tabs;
35
+ }
36
+ }
37
+ function createCacheRegistry(adapters = []) {
38
+ return new CacheAdapterRegistry(adapters);
39
+ }
40
+ function prefixAdapter(id, prefix, renderDetail) {
41
+ return {
42
+ id,
43
+ match: (node) => !!node.key && node.key.startsWith(prefix),
44
+ renderDetail
45
+ };
46
+ }
47
+ export {
48
+ CacheAdapterRegistry,
49
+ createCacheRegistry,
50
+ prefixAdapter
51
+ };
52
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sources":["../../../src/data/cache-browser/adapter.ts"],"sourcesContent":["// Node adapters let a host plug domain-specific value rendering into the\n// cache browser without forking it — e.g. render `schema:`-prefixed keys with\n// a schema viewer or `task-snapshot:` keys with a task panel. An adapter\n// claims nodes via `match` (typically by key prefix or value kind) and\n// contributes detail rendering. The registry resolves the first matching\n// adapter; nodes with no match fall back to the built-in type-aware value\n// rendering. Mirrors the test-runner TestNodeAdapter contract.\n\nimport type { ReactNode } from \"react\";\nimport type { CacheClient } from \"./api\";\nimport type { CacheKeyDetail, CacheTreeNode } from \"./types\";\n\nexport type CacheAdapterContext = {\n node: CacheTreeNode;\n /** Loaded key detail; null while loading or for prefix groups. */\n detail: CacheKeyDetail | null;\n client: CacheClient;\n};\n\nexport type CacheDetailTab = {\n id: string;\n label: string;\n render: () => ReactNode;\n};\n\nexport type CacheNodeAdapter = {\n /** Stable identifier, used as a React key and for debugging. */\n id: string;\n /** Claim the node. The first registered adapter to return true wins per surface. */\n match: (node: CacheTreeNode, detail: CacheKeyDetail | null) => boolean;\n /** Primary value body for the key, replacing the default type-aware rendering. */\n renderDetail?: (c: CacheAdapterContext) => ReactNode;\n /** Extra detail tabs, merged (in registration order) across all matching adapters. */\n detailTabs?: (c: CacheAdapterContext) => CacheDetailTab[];\n /** Replace the leading icon on the node's tree row. */\n renderRowIcon?: (c: CacheAdapterContext) => ReactNode;\n};\n\n/**\n * Ordered set of node adapters. First match wins per surface; `detailTabs`\n * merge across every matching adapter so independent adapters can each\n * contribute a tab.\n */\nexport class CacheAdapterRegistry {\n readonly adapters: CacheNodeAdapter[];\n\n constructor(adapters: CacheNodeAdapter[] = []) {\n this.adapters = adapters;\n }\n\n private firstWith(\n node: CacheTreeNode,\n detail: CacheKeyDetail | null,\n has: (a: CacheNodeAdapter) => boolean,\n ): CacheNodeAdapter | null {\n for (const a of this.adapters) {\n if (has(a) && a.match(node, detail)) return a;\n }\n return null;\n }\n\n /** Adapter whose `renderDetail` should drive the value body, or null for the default. */\n resolveDetail(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderDetail);\n }\n\n resolveRowIcon(node: CacheTreeNode, detail: CacheKeyDetail | null): CacheNodeAdapter | null {\n return this.firstWith(node, detail, (a) => !!a.renderRowIcon);\n }\n\n /** Merge `detailTabs` from every matching adapter, de-duplicated by tab id. */\n resolveTabs(ctx: CacheAdapterContext): CacheDetailTab[] {\n const seen = new Set<string>();\n const tabs: CacheDetailTab[] = [];\n for (const a of this.adapters) {\n if (!a.detailTabs || !a.match(ctx.node, ctx.detail)) continue;\n for (const tab of a.detailTabs(ctx)) {\n if (seen.has(tab.id)) continue;\n seen.add(tab.id);\n tabs.push(tab);\n }\n }\n return tabs;\n }\n}\n\nexport function createCacheRegistry(adapters: CacheNodeAdapter[] = []): CacheAdapterRegistry {\n return new CacheAdapterRegistry(adapters);\n}\n\n/**\n * Convenience adapter matching leaf keys by logical prefix, e.g.\n * `prefixAdapter(\"schemas\", \"schema:\", (c) => <SchemaView .../>)`.\n */\nexport function prefixAdapter(\n id: string,\n prefix: string,\n renderDetail: (c: CacheAdapterContext) => ReactNode,\n): CacheNodeAdapter {\n return {\n id,\n match: (node) => !!node.key && node.key.startsWith(prefix),\n renderDetail,\n };\n}\n"],"names":[],"mappings":";;;AA2CO,MAAM,qBAAqB;AAAA,EAGhC,YAAY,WAA+B,IAAI;AAFtC;AAGP,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UACN,MACA,QACA,KACyB;AACzB,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,IAAI,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,EAAG,QAAO;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,cAAc,MAAqB,QAAwD;AACzF,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY;AAAA,EAC7D;AAAA,EAEA,eAAe,MAAqB,QAAwD;AAC1F,WAAO,KAAK,UAAU,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa;AAAA,EAC9D;AAAA;AAAA,EAGA,YAAY,KAA4C;AACtD,UAAM,2BAAW,IAAA;AACjB,UAAM,OAAyB,CAAA;AAC/B,eAAW,KAAK,KAAK,UAAU;AAC7B,UAAI,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,EAAG;AACrD,iBAAW,OAAO,EAAE,WAAW,GAAG,GAAG;AACnC,YAAI,KAAK,IAAI,IAAI,EAAE,EAAG;AACtB,aAAK,IAAI,IAAI,EAAE;AACf,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,WAA+B,IAA0B;AAC3F,SAAO,IAAI,qBAAqB,QAAQ;AAC1C;AAMO,SAAS,cACd,IACA,QACA,cACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,OAAO,KAAK,IAAI,WAAW,MAAM;AAAA,IACzD;AAAA,EAAA;AAEJ;"}