@flanksource/clicky-ui 0.3.44 → 0.3.45

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 (471) hide show
  1. package/README.md +2 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/CodeBlock.cjs +3 -2
  16. package/dist/data/CodeBlock.cjs.map +1 -1
  17. package/dist/data/CodeBlock.d.ts +3 -1
  18. package/dist/data/CodeBlock.d.ts.map +1 -1
  19. package/dist/data/CodeBlock.js +3 -2
  20. package/dist/data/CodeBlock.js.map +1 -1
  21. package/dist/data/GraphDiagram.cjs +18 -6
  22. package/dist/data/GraphDiagram.cjs.map +1 -1
  23. package/dist/data/GraphDiagram.d.ts +9 -1
  24. package/dist/data/GraphDiagram.d.ts.map +1 -1
  25. package/dist/data/GraphDiagram.js +18 -6
  26. package/dist/data/GraphDiagram.js.map +1 -1
  27. package/dist/data/GraphDiagramNodes.cjs +38 -29
  28. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  29. package/dist/data/GraphDiagramNodes.d.ts +8 -2
  30. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  31. package/dist/data/GraphDiagramNodes.js +38 -29
  32. package/dist/data/GraphDiagramNodes.js.map +1 -1
  33. package/dist/data/JsonView.cjs +118 -49
  34. package/dist/data/JsonView.cjs.map +1 -1
  35. package/dist/data/JsonView.d.ts +13 -10
  36. package/dist/data/JsonView.d.ts.map +1 -1
  37. package/dist/data/JsonView.js +118 -49
  38. package/dist/data/JsonView.js.map +1 -1
  39. package/dist/data/MarkdownEditor.cjs +2 -2
  40. package/dist/data/MarkdownEditor.cjs.map +1 -1
  41. package/dist/data/MarkdownEditor.js +2 -2
  42. package/dist/data/MarkdownEditor.js.map +1 -1
  43. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  44. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  45. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  46. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  47. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  48. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  49. package/dist/data/ai/ChatButton.cjs +2 -0
  50. package/dist/data/ai/ChatButton.cjs.map +1 -1
  51. package/dist/data/ai/ChatButton.d.ts +1 -1
  52. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  53. package/dist/data/ai/ChatButton.js +2 -0
  54. package/dist/data/ai/ChatButton.js.map +1 -1
  55. package/dist/data/ai/ChatFab.cjs +5 -1
  56. package/dist/data/ai/ChatFab.cjs.map +1 -1
  57. package/dist/data/ai/ChatFab.d.ts +5 -1
  58. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  59. package/dist/data/ai/ChatFab.js +5 -1
  60. package/dist/data/ai/ChatFab.js.map +1 -1
  61. package/dist/data/ai/ChatWindow.cjs +2 -8
  62. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  63. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  64. package/dist/data/ai/ChatWindow.js +2 -8
  65. package/dist/data/ai/ChatWindow.js.map +1 -1
  66. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  67. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  68. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  69. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  70. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  71. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  72. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  73. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  74. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  75. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  76. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  77. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  78. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  79. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  80. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  81. package/dist/data/ai/SessionViewer.cjs +13 -4
  82. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  83. package/dist/data/ai/SessionViewer.d.ts +5 -1
  84. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  85. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  86. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  87. package/dist/data/ai/SessionViewer.header.js +1 -1
  88. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  89. package/dist/data/ai/SessionViewer.js +13 -4
  90. package/dist/data/ai/SessionViewer.js.map +1 -1
  91. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  92. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  93. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  94. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  95. package/dist/data/ai/SessionViewer.model.js +2 -0
  96. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  97. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  98. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  99. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  100. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  101. package/dist/data/ai/SessionViewer.rows.js +41 -27
  102. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  103. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  104. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  105. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  106. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  107. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  108. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  109. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  110. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  111. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  112. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  113. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  114. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  115. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  116. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  117. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  119. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  121. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  123. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  125. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  127. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  128. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  129. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  130. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  131. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  132. package/dist/data/ai/SessionViewerMenu.js +18 -1
  133. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  134. package/dist/data/ai/ToolPreferences.cjs +149 -143
  135. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  136. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  137. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  138. package/dist/data/ai/ToolPreferences.js +151 -146
  139. package/dist/data/ai/ToolPreferences.js.map +1 -1
  140. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  141. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  142. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  143. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  144. package/dist/data/ai/ToolPreferences.model.js +15 -11
  145. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  146. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  147. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  148. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  149. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  150. package/dist/data/ai/ToolPreferencesList.js +2 -1
  151. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  152. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  153. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  154. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  155. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  156. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  157. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  158. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  159. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  160. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  161. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  162. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  163. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  164. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  165. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  166. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  167. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  168. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  169. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  170. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  171. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  172. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  173. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  174. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  175. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  176. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  177. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  178. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  179. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  180. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  181. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  182. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  183. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  184. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  185. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  186. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  187. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  188. package/dist/data/ai/index.d.ts +2 -2
  189. package/dist/data/ai/index.d.ts.map +1 -1
  190. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  191. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  192. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  193. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  194. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  195. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  196. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  197. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  198. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  199. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  200. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  201. package/dist/data/ai/use-session-token-sizing.js +73 -0
  202. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  203. package/dist/data/call-graph/CallGraph.cjs +250 -0
  204. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  205. package/dist/data/call-graph/CallGraph.d.ts +69 -0
  206. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  207. package/dist/data/call-graph/CallGraph.js +250 -0
  208. package/dist/data/call-graph/CallGraph.js.map +1 -0
  209. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  210. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  211. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  212. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  213. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  214. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  215. package/dist/data/call-graph/CallGraphMembers.cjs +50 -0
  216. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  217. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  218. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  219. package/dist/data/call-graph/CallGraphMembers.js +50 -0
  220. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  221. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  222. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  223. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  224. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  225. package/dist/data/call-graph/CallGraphParts.js +204 -0
  226. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  227. package/dist/data/call-graph/CallGraphToolbar.cjs +186 -0
  228. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  229. package/dist/data/call-graph/CallGraphToolbar.d.ts +45 -0
  230. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  231. package/dist/data/call-graph/CallGraphToolbar.js +186 -0
  232. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  233. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  234. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  235. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  236. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  237. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  238. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  239. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  240. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  241. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  242. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  243. package/dist/data/call-graph/call-graph-labels.js +96 -0
  244. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  245. package/dist/data/call-graph/call-graph-model.cjs +161 -0
  246. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  247. package/dist/data/call-graph/call-graph-model.d.ts +102 -0
  248. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  249. package/dist/data/call-graph/call-graph-model.js +161 -0
  250. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  251. package/dist/data/call-graph/call-graph-vocabulary.cjs +177 -0
  252. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  253. package/dist/data/call-graph/call-graph-vocabulary.d.ts +72 -0
  254. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  255. package/dist/data/call-graph/call-graph-vocabulary.js +177 -0
  256. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  257. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  258. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  259. package/dist/data/call-graph/index.d.ts +7 -0
  260. package/dist/data/call-graph/index.d.ts.map +1 -0
  261. package/dist/data/call-graph/types.cjs +5 -0
  262. package/dist/data/call-graph/types.cjs.map +1 -0
  263. package/dist/data/call-graph/types.d.ts +135 -0
  264. package/dist/data/call-graph/types.d.ts.map +1 -0
  265. package/dist/data/call-graph/types.js +5 -0
  266. package/dist/data/call-graph/types.js.map +1 -0
  267. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  268. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  269. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  270. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  271. package/dist/data/call-graph/use-call-graph.js +93 -0
  272. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  273. package/dist/data/chat/Chat.cjs +39 -15
  274. package/dist/data/chat/Chat.cjs.map +1 -1
  275. package/dist/data/chat/Chat.d.ts.map +1 -1
  276. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  277. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  278. package/dist/data/chat/Chat.fixtures.js +2 -2
  279. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  280. package/dist/data/chat/Chat.js +40 -16
  281. package/dist/data/chat/Chat.js.map +1 -1
  282. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  283. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  284. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  285. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  286. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  287. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  288. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  289. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  290. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  291. package/dist/data/chat/ContextMeter.bar.js +5 -8
  292. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  293. package/dist/data/chat/ContextMeter.cjs +18 -19
  294. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  295. package/dist/data/chat/ContextMeter.d.ts +1 -1
  296. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  297. package/dist/data/chat/ContextMeter.js +18 -19
  298. package/dist/data/chat/ContextMeter.js.map +1 -1
  299. package/dist/data/chat/Conversation.cjs +2 -1
  300. package/dist/data/chat/Conversation.cjs.map +1 -1
  301. package/dist/data/chat/Conversation.d.ts +4 -1
  302. package/dist/data/chat/Conversation.d.ts.map +1 -1
  303. package/dist/data/chat/Conversation.js +2 -1
  304. package/dist/data/chat/Conversation.js.map +1 -1
  305. package/dist/data/chat/Message.cjs +39 -12
  306. package/dist/data/chat/Message.cjs.map +1 -1
  307. package/dist/data/chat/Message.d.ts +1 -1
  308. package/dist/data/chat/Message.d.ts.map +1 -1
  309. package/dist/data/chat/Message.js +40 -13
  310. package/dist/data/chat/Message.js.map +1 -1
  311. package/dist/data/chat/ToolCall.cjs +60 -5
  312. package/dist/data/chat/ToolCall.cjs.map +1 -1
  313. package/dist/data/chat/ToolCall.d.ts +7 -2
  314. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  315. package/dist/data/chat/ToolCall.js +60 -5
  316. package/dist/data/chat/ToolCall.js.map +1 -1
  317. package/dist/data/chat/approval.cjs.map +1 -1
  318. package/dist/data/chat/approval.d.ts +2 -2
  319. package/dist/data/chat/approval.d.ts.map +1 -1
  320. package/dist/data/chat/approval.js.map +1 -1
  321. package/dist/data/chat/tool-policy.cjs +59 -2
  322. package/dist/data/chat/tool-policy.cjs.map +1 -1
  323. package/dist/data/chat/tool-policy.d.ts +9 -0
  324. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  325. package/dist/data/chat/tool-policy.js +59 -2
  326. package/dist/data/chat/tool-policy.js.map +1 -1
  327. package/dist/data/chat/types.cjs +6 -0
  328. package/dist/data/chat/types.cjs.map +1 -1
  329. package/dist/data/chat/types.d.ts +13 -4
  330. package/dist/data/chat/types.d.ts.map +1 -1
  331. package/dist/data/chat/types.js +7 -1
  332. package/dist/data/chat/types.js.map +1 -1
  333. package/dist/data/chat/usage-snapshot.cjs +11 -6
  334. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  335. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  336. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  337. package/dist/data/chat/usage-snapshot.js +11 -6
  338. package/dist/data/chat/usage-snapshot.js.map +1 -1
  339. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  340. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  341. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  342. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  343. package/dist/data/graph-columns-layout.cjs +26 -10
  344. package/dist/data/graph-columns-layout.cjs.map +1 -1
  345. package/dist/data/graph-columns-layout.d.ts +8 -0
  346. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  347. package/dist/data/graph-columns-layout.js +26 -10
  348. package/dist/data/graph-columns-layout.js.map +1 -1
  349. package/dist/data/graph-diagram-model.cjs.map +1 -1
  350. package/dist/data/graph-diagram-model.d.ts +5 -0
  351. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  352. package/dist/data/graph-diagram-model.js.map +1 -1
  353. package/dist/data/graph-edge-routing.cjs +9 -3
  354. package/dist/data/graph-edge-routing.cjs.map +1 -1
  355. package/dist/data/graph-edge-routing.d.ts +2 -0
  356. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  357. package/dist/data/graph-edge-routing.js +9 -3
  358. package/dist/data/graph-edge-routing.js.map +1 -1
  359. package/dist/data/json-view/JsonSource.cjs +84 -0
  360. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  361. package/dist/data/json-view/JsonSource.d.ts +7 -0
  362. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  363. package/dist/data/json-view/JsonSource.js +84 -0
  364. package/dist/data/json-view/JsonSource.js.map +1 -0
  365. package/dist/data/json-view/parse-prefix.cjs +132 -0
  366. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  367. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  368. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  369. package/dist/data/json-view/parse-prefix.js +132 -0
  370. package/dist/data/json-view/parse-prefix.js.map +1 -0
  371. package/dist/data/json-view/parse-source.cjs +62 -0
  372. package/dist/data/json-view/parse-source.cjs.map +1 -0
  373. package/dist/data/json-view/parse-source.d.ts +16 -0
  374. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  375. package/dist/data/json-view/parse-source.js +62 -0
  376. package/dist/data/json-view/parse-source.js.map +1 -0
  377. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  378. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  379. package/dist/data/json-view/types.d.ts +14 -0
  380. package/dist/data/json-view/types.d.ts.map +1 -0
  381. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  382. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  383. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  384. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  385. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  386. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  387. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  388. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  389. package/dist/data/runtime/RuntimeBar.js +2 -5
  390. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  391. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  392. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  393. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  394. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  395. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  396. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  397. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  398. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  399. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  400. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  401. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  402. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  403. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  404. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  405. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  406. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  407. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  408. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  409. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  410. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  411. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  412. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  413. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  414. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  415. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  416. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  417. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  418. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  419. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  420. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  421. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  422. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  423. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  424. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  425. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  426. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  427. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  428. package/dist/data/use-pan-zoom.cjs +23 -10
  429. package/dist/data/use-pan-zoom.cjs.map +1 -1
  430. package/dist/data/use-pan-zoom.d.ts +16 -2
  431. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  432. package/dist/data/use-pan-zoom.js +23 -10
  433. package/dist/data/use-pan-zoom.js.map +1 -1
  434. package/dist/data/version-info.cjs +3 -3
  435. package/dist/data/version-info.js +3 -3
  436. package/dist/data.cjs +26 -2
  437. package/dist/data.cjs.map +1 -1
  438. package/dist/data.d.ts +1 -0
  439. package/dist/data.d.ts.map +1 -1
  440. package/dist/data.js +24 -0
  441. package/dist/data.js.map +1 -1
  442. package/dist/index.cjs +28 -4
  443. package/dist/index.cjs.map +1 -1
  444. package/dist/index.js +24 -0
  445. package/dist/index.js.map +1 -1
  446. package/dist/layout/Workspace.cjs +13 -4
  447. package/dist/layout/Workspace.cjs.map +1 -1
  448. package/dist/layout/Workspace.d.ts +7 -2
  449. package/dist/layout/Workspace.d.ts.map +1 -1
  450. package/dist/layout/Workspace.js +13 -4
  451. package/dist/layout/Workspace.js.map +1 -1
  452. package/dist/lib/permission-strategies.cjs +71 -11
  453. package/dist/lib/permission-strategies.cjs.map +1 -1
  454. package/dist/lib/permission-strategies.d.ts +3 -0
  455. package/dist/lib/permission-strategies.d.ts.map +1 -1
  456. package/dist/lib/permission-strategies.js +71 -11
  457. package/dist/lib/permission-strategies.js.map +1 -1
  458. package/dist/styles.css +1 -1
  459. package/package.json +5 -3
  460. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  461. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  462. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  463. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  464. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  465. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  466. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  467. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  468. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  469. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  470. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  471. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferences.model.js","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"sourcesContent":["import type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport { normalizeToolPolicy } from \"../chat/types\";\nimport {\n resolveToolPolicy,\n type PermissionPolicy,\n type PermissionRule,\n} from \"../chat/tool-policy\";\n\nexport const POLICY_CYCLE: ToolPolicy[] = [\"auto\", \"ask\", \"deny\", \"allow\"];\n\n/** On and Off stay as the control's labels — they read better on a toggle than\n * allow/deny do. The wire vocabulary is the policy; this is presentation. */\nexport const POLICY_LABEL: Record<ToolPolicy, string> = {\n allow: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n deny: \"Off\",\n};\n\nexport const POLICY_DESCRIPTION: Record<ToolPolicy, string> = {\n allow: \"Always allow this tool to run automatically.\",\n auto: \"Use the backend's default permission policy.\",\n ask: \"Ask before running this tool.\",\n deny: \"Hide this tool from the model.\",\n};\n\nexport type BadgePolicy = ToolPolicy | \"mixed\";\n\nexport const BADGE_LABEL: Record<BadgePolicy, string> = {\n ...POLICY_LABEL,\n mixed: \"Mixed\",\n};\n\nexport const BADGE_DESCRIPTION: Record<BadgePolicy, string> = {\n ...POLICY_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\nexport type ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolPolicy;\n};\n\nexport const NO_PARENT = \"\\u0000no-parent\";\n\nexport type ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\n/** A toggle in the popover emits one rule rather than writing a mode per tool.\n * Which control was used is the thing worth recording: a group toggle means\n * \"this whole family\", so it keeps applying to tools that arrive later, while\n * writing every current member's name would silently stop at today's catalog.\n *\n * Rules are held in specificity order — group, then group+parent, then name —\n * so a per-tool toggle beats the group toggle above it however they were\n * clicked. Position, not a precedence number, is what encodes that. */\nconst RULE_RANKS: ((rule: PermissionRule) => boolean)[] = [\n (rule) => rule.name === undefined && rule.parent === undefined,\n (rule) => rule.name === undefined,\n () => true,\n];\n\nfunction ruleRank(rule: PermissionRule): number {\n return RULE_RANKS.findIndex((matches) => matches(rule));\n}\n\nfunction ruleKey(patterns: PermissionRule[\"name\"]): string {\n if (patterns === undefined) return \"\";\n return (typeof patterns === \"string\" ? [patterns] : patterns).join(\",\");\n}\n\nfunction sameSubject(a: PermissionRule, b: PermissionRule): boolean {\n return (\n ruleKey(a.name) === ruleKey(b.name) &&\n ruleKey(a.group) === ruleKey(b.group) &&\n ruleKey(a.parent) === ruleKey(b.parent)\n );\n}\n\n/** Adds one toggle's rule to the user's list, replacing any earlier rule for the\n * same subject in place so re-toggling a control does not grow the list, and\n * keeping the list in specificity order. */\nexport function withUserRule(\n rules: PermissionPolicy,\n rule: PermissionRule,\n): PermissionPolicy {\n const replaced = rules.map((existing) =>\n sameSubject(existing, rule) ? rule : existing,\n );\n const next = replaced.includes(rule) ? replaced : [...replaced, rule];\n return [...next].sort((a, b) => ruleRank(a) - ruleRank(b));\n}\n\n/** The mode to show for each tool: the user's own rules over the surface's, then\n * what the catalog says about the tool, then the fallback.\n *\n * An explicit `auto` remains visible here so the control can advance from it\n * on the next toggle. The server applies its catalog fallback when enforcing\n * the emitted rule. */\nexport function effectiveToolPolicies({\n tools,\n surfacePolicy,\n userRules,\n fallback,\n}: {\n tools: ToolMeta[];\n surfacePolicy?: PermissionPolicy | undefined;\n userRules?: PermissionPolicy | undefined;\n fallback: ToolPolicy;\n}): Record<string, ToolPolicy> {\n const policy = [...(surfacePolicy ?? []), ...(userRules ?? [])];\n const resolved: Record<string, ToolPolicy> = {};\n for (const tool of tools) {\n const matched = resolveToolPolicy(policy, tool);\n resolved[tool.name] = matched ?? tool.defaultPermission ?? fallback;\n }\n return resolved;\n}\n\nexport type ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport function groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const group = tool.group ?? \"Tools\";\n const entry: ToolPreferenceEntry = {\n key: tool.name,\n label: tool.label || tool.name,\n group,\n tool,\n defaultPermission: tool.defaultPermission ?? \"auto\",\n };\n (groups[group] ??= []).push(entry);\n }\n return Object.entries(groups)\n .map(([group, entries]) => buildToolGroup(group, entries))\n .sort((a, b) => a.group.localeCompare(b.group));\n}\n\nfunction buildToolGroup(\n group: string,\n entries: ToolPreferenceEntry[],\n): ToolGroup {\n const byParent: Record<string, ToolPreferenceEntry[]> = {};\n for (const entry of entries) {\n const parent = entry.tool.parent?.trim() || NO_PARENT;\n (byParent[parent] ??= []).push(entry);\n }\n const subGroups = Object.entries(byParent)\n .map(([parent, subEntries]) => ({\n parent,\n entries: [...subEntries].sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort(compareSubGroups);\n return {\n group,\n entries: [...entries].sort((a, b) => a.label.localeCompare(b.label)),\n subGroups,\n };\n}\n\nfunction compareSubGroups(a: ToolSubGroup, b: ToolSubGroup): number {\n if (a.parent === NO_PARENT) return b.parent === NO_PARENT ? 0 : -1;\n if (b.parent === NO_PARENT) return 1;\n return a.parent.localeCompare(b.parent);\n}\n\nexport function groupedToolEntriesWithPreferences(\n tools: ToolMeta[],\n value: Record<string, ToolPolicy>,\n): ToolGroup[] {\n const groups = groupedToolEntries(tools);\n const known = new Set(tools.map((tool) => tool.name));\n const customEntries = Object.entries(value).flatMap(([name, mode]) => {\n const normalizedMode = normalizeToolPolicy(mode);\n if (known.has(name) || !normalizedMode) return [];\n return [\n {\n key: name,\n label: name,\n group: \"Custom\",\n tool: {\n name,\n label: name,\n group: \"Custom\",\n defaultPermission: normalizedMode,\n },\n defaultPermission: normalizedMode,\n },\n ];\n });\n if (customEntries.length === 0) return groups;\n return [...groups, buildToolGroup(\"Custom\", customEntries)];\n}\n\nexport function entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return normalizeToolPolicy(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\nexport function groupToolPolicy(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return entries.reduce<ToolPolicy>(\n (mode, entry) => mostRestrictiveMode(mode, entryMode(entry, value)),\n \"allow\",\n );\n}\n\nexport function commonMode(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): BadgePolicy {\n const first = entries[0];\n if (!first) return \"mixed\";\n const firstMode = entryMode(first, value);\n return entries.every((entry) => entryMode(entry, value) === firstMode)\n ? firstMode\n : \"mixed\";\n}\n\nexport function nextMode(mode: ToolPolicy): ToolPolicy {\n const current = POLICY_CYCLE.indexOf(mode);\n return POLICY_CYCLE[\n ((current >= 0 ? current : 0) + 1) % POLICY_CYCLE.length\n ]!;\n}\n\nfunction mostRestrictiveMode(a: ToolPolicy, b: ToolPolicy): ToolPolicy {\n return modeRank(a) >= modeRank(b) ? a : b;\n}\n\nfunction modeRank(mode: ToolPolicy): number {\n switch (mode) {\n case \"allow\":\n return 0;\n case \"auto\":\n return 1;\n case \"ask\":\n return 2;\n case \"deny\":\n return 3;\n }\n}\n"],"names":[],"mappings":";;AAQO,MAAM,eAA6B,CAAC,QAAQ,OAAO,QAAQ,OAAO;AAIlE,MAAM,eAA2C;AAAA,EACtD,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AAEO,MAAM,qBAAiD;AAAA,EAC5D,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACR;AAIO,MAAM,cAA2C;AAAA,EACtD,GAAG;AAAA,EACH,OAAO;AACT;AAEO,MAAM,oBAAiD;AAAA,EAC5D,GAAG;AAAA,EACH,OAAO;AACT;AAUO,MAAM,YAAY;AAezB,MAAM,aAAoD;AAAA,EACxD,CAAC,SAAS,KAAK,SAAS,UAAa,KAAK,WAAW;AAAA,EACrD,CAAC,SAAS,KAAK,SAAS;AAAA,EACxB,MAAM;AACR;AAEA,SAAS,SAAS,MAA8B;AAC9C,SAAO,WAAW,UAAU,CAAC,YAAY,QAAQ,IAAI,CAAC;AACxD;AAEA,SAAS,QAAQ,UAA0C;AACzD,MAAI,aAAa,OAAW,QAAO;AACnC,UAAQ,OAAO,aAAa,WAAW,CAAC,QAAQ,IAAI,UAAU,KAAK,GAAG;AACxE;AAEA,SAAS,YAAY,GAAmB,GAA4B;AAClE,SACE,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,IAAI,KAClC,QAAQ,EAAE,KAAK,MAAM,QAAQ,EAAE,KAAK,KACpC,QAAQ,EAAE,MAAM,MAAM,QAAQ,EAAE,MAAM;AAE1C;AAKO,SAAS,aACd,OACA,MACkB;AAClB,QAAM,WAAW,MAAM;AAAA,IAAI,CAAC,aAC1B,YAAY,UAAU,IAAI,IAAI,OAAO;AAAA,EAAA;AAEvC,QAAM,OAAO,SAAS,SAAS,IAAI,IAAI,WAAW,CAAC,GAAG,UAAU,IAAI;AACpE,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC;AAC3D;AAQO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK+B;AAC7B,QAAM,SAAS,CAAC,GAAI,iBAAiB,CAAA,GAAK,GAAI,aAAa,EAAG;AAC9D,QAAM,WAAuC,CAAA;AAC7C,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,kBAAkB,QAAQ,IAAI;AAC9C,aAAS,KAAK,IAAI,IAAI,WAAW,KAAK,qBAAqB;AAAA,EAC7D;AACA,SAAO;AACT;AAQO,SAAS,mBAAmB,OAAgC;AACjE,QAAM,SAAgD,CAAA;AACtD,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,QAA6B;AAAA,MACjC,KAAK,KAAK;AAAA,MACV,OAAO,KAAK,SAAS,KAAK;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,mBAAmB,KAAK,qBAAqB;AAAA,IAAA;AAE/C,KAAC,kCAAkB,CAAA,IAAI,KAAK,KAAK;AAAA,EACnC;AACA,SAAO,OAAO,QAAQ,MAAM,EACzB,IAAI,CAAC,CAAC,OAAO,OAAO,MAAM,eAAe,OAAO,OAAO,CAAC,EACxD,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAClD;AAEA,SAAS,eACP,OACA,SACW;;AACX,QAAM,WAAkD,CAAA;AACxD,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAS,WAAM,KAAK,WAAX,mBAAmB,WAAU;AAC5C,KAAC,wCAAqB,CAAA,IAAI,KAAK,KAAK;AAAA,EACtC;AACA,QAAM,YAAY,OAAO,QAAQ,QAAQ,EACtC,IAAI,CAAC,CAAC,QAAQ,UAAU,OAAO;AAAA,IAC9B;AAAA,IACA,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,EAAA,EACtE,EACD,KAAK,gBAAgB;AACxB,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IACnE;AAAA,EAAA;AAEJ;AAEA,SAAS,iBAAiB,GAAiB,GAAyB;AAClE,MAAI,EAAE,WAAW,kBAAkB,EAAE,WAAW,YAAY,IAAI;AAChE,MAAI,EAAE,WAAW,UAAW,QAAO;AACnC,SAAO,EAAE,OAAO,cAAc,EAAE,MAAM;AACxC;AAEO,SAAS,kCACd,OACA,OACa;AACb,QAAM,SAAS,mBAAmB,KAAK;AACvC,QAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AACpD,QAAM,gBAAgB,OAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,IAAI,MAAM;AACpE,UAAM,iBAAiB,oBAAoB,IAAI;AAC/C,QAAI,MAAM,IAAI,IAAI,KAAK,CAAC,uBAAuB,CAAA;AAC/C,WAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,mBAAmB;AAAA,QAAA;AAAA,QAErB,mBAAmB;AAAA,MAAA;AAAA,IACrB;AAAA,EAEJ,CAAC;AACD,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,SAAO,CAAC,GAAG,QAAQ,eAAe,UAAU,aAAa,CAAC;AAC5D;AAEO,SAAS,UACd,OACA,OACY;AACZ,SAAO,oBAAoB,MAAM,MAAM,GAAG,KAAK,EAAE,KAAK,MAAM;AAC9D;AAEO,SAAS,gBACd,SACA,OACY;AACZ,SAAO,QAAQ;AAAA,IACb,CAAC,MAAM,UAAU,oBAAoB,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClE;AAAA,EAAA;AAEJ;AAEO,SAAS,WACd,SACA,OACa;AACb,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,YAAY,UAAU,OAAO,KAAK;AACxC,SAAO,QAAQ,MAAM,CAAC,UAAU,UAAU,OAAO,KAAK,MAAM,SAAS,IACjE,YACA;AACN;AAEO,SAAS,SAAS,MAA8B;AACrD,QAAM,UAAU,aAAa,QAAQ,IAAI;AACzC,SAAO,eACH,WAAW,IAAI,UAAU,KAAK,KAAK,aAAa,MACpD;AACF;AAEA,SAAS,oBAAoB,GAAe,GAA2B;AACrE,SAAO,SAAS,CAAC,KAAK,SAAS,CAAC,IAAI,IAAI;AAC1C;AAEA,SAAS,SAAS,MAA0B;AAC1C,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"ToolPreferences.model.js","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"sourcesContent":["import type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport { normalizeToolPolicy } from \"../chat/types\";\nimport {\n consolidateRules,\n resolveToolPolicy,\n type PermissionPolicy,\n type PermissionRule,\n} from \"../chat/tool-policy\";\n\nexport const POLICY_CYCLE: ToolPolicy[] = [\"auto\", \"ask\", \"deny\", \"allow\"];\n\n/** On and Off stay as the control's labels — they read better on a toggle than\n * allow/deny do. The wire vocabulary is the policy; this is presentation. */\nexport const POLICY_LABEL: Record<ToolPolicy, string> = {\n allow: \"On\",\n auto: \"Auto\",\n ask: \"Ask\",\n deny: \"Off\",\n};\n\nexport const POLICY_DESCRIPTION: Record<ToolPolicy, string> = {\n allow: \"Always allow this tool to run automatically.\",\n auto: \"Use the backend's default permission policy.\",\n ask: \"Ask before running this tool.\",\n deny: \"Hide this tool from the model.\",\n};\n\nexport type BadgePolicy = ToolPolicy | \"mixed\";\n\nexport const BADGE_LABEL: Record<BadgePolicy, string> = {\n ...POLICY_LABEL,\n mixed: \"Mixed\",\n};\n\nexport const BADGE_DESCRIPTION: Record<BadgePolicy, string> = {\n ...POLICY_DESCRIPTION,\n mixed: \"Members have different permissions.\",\n};\n\nexport type ToolPreferenceEntry = {\n key: string;\n label: string;\n group: string;\n tool: ToolMeta;\n defaultPermission: ToolPolicy;\n};\n\nexport const NO_PARENT = \"\\u0000no-parent\";\n\nexport type ToolSubGroup = {\n parent: string;\n entries: ToolPreferenceEntry[];\n};\n\n/** A toggle in the popover emits one rule rather than writing a mode per tool.\n * Which control was used is the thing worth recording: a group toggle means\n * \"this whole family\", so it keeps applying to tools that arrive later, while\n * writing every current member's name would silently stop at today's catalog.\n *\n * Rules are held in specificity order — group, then group+parent, then name —\n * so a per-tool toggle beats the group toggle above it however they were\n * clicked. Position, not a precedence number, is what encodes that. */\nconst RULE_RANKS: ((rule: PermissionRule) => boolean)[] = [\n (rule) => rule.name === undefined && rule.parent === undefined,\n (rule) => rule.name === undefined,\n () => true,\n];\n\nfunction ruleRank(rule: PermissionRule): number {\n return RULE_RANKS.findIndex((matches) => matches(rule));\n}\n\nfunction ruleKey(patterns: PermissionRule[\"name\"]): string {\n if (patterns === undefined) return \"\";\n return (typeof patterns === \"string\" ? [patterns] : patterns).join(\",\");\n}\n\nfunction sameSubject(a: PermissionRule, b: PermissionRule): boolean {\n return (\n ruleKey(a.name) === ruleKey(b.name) &&\n ruleKey(a.group) === ruleKey(b.group) &&\n ruleKey(a.parent) === ruleKey(b.parent)\n );\n}\n\n/** Adds one toggle's rule to the user's list, replacing any earlier rule for the\n * same subject in place so re-toggling a control does not grow the list, and\n * keeping the list in specificity order. */\nexport function withUserRule(\n rules: PermissionPolicy,\n rule: PermissionRule,\n): PermissionPolicy {\n const replaced = rules.map((existing) =>\n sameSubject(existing, rule) ? rule : existing,\n );\n const next = replaced.includes(rule) ? replaced : [...replaced, rule];\n return consolidateRules([...next].sort((a, b) => ruleRank(a) - ruleRank(b)));\n}\n\n/** The mode to show for each tool: the user's own rules over the surface's, then\n * what the catalog says about the tool, then the fallback.\n *\n * An explicit `auto` remains visible here so the control can advance from it\n * on the next toggle. The server applies its catalog fallback when enforcing\n * the emitted rule. */\nexport function effectiveToolPolicies({\n tools,\n surfacePolicy,\n userRules,\n fallback,\n}: {\n tools: ToolMeta[];\n surfacePolicy?: PermissionPolicy | undefined;\n userRules?: PermissionPolicy | undefined;\n fallback: ToolPolicy;\n}): Record<string, ToolPolicy> {\n const policy = [...(surfacePolicy ?? []), ...(userRules ?? [])];\n const resolved: Record<string, ToolPolicy> = {};\n for (const tool of tools) {\n const matched = resolveToolPolicy(policy, tool);\n resolved[tool.name] = matched ?? tool.defaultPermission ?? fallback;\n }\n return resolved;\n}\n\nexport type ToolGroup = {\n group: string;\n entries: ToolPreferenceEntry[];\n subGroups: ToolSubGroup[];\n};\n\nexport function toolEntry(tool: ToolMeta): ToolPreferenceEntry {\n return {\n key: tool.name,\n label: tool.label || tool.name,\n group: tool.group ?? \"Tools\",\n tool,\n defaultPermission: tool.defaultPermission ?? \"auto\",\n };\n}\n\nexport function groupedToolEntries(tools: ToolMeta[]): ToolGroup[] {\n const groups: Record<string, ToolPreferenceEntry[]> = {};\n for (const tool of tools) {\n const entry = toolEntry(tool);\n (groups[entry.group] ??= []).push(entry);\n }\n return Object.entries(groups)\n .map(([group, entries]) => buildToolGroup(group, entries))\n .sort((a, b) => a.group.localeCompare(b.group));\n}\n\nfunction buildToolGroup(\n group: string,\n entries: ToolPreferenceEntry[],\n): ToolGroup {\n const byParent: Record<string, ToolPreferenceEntry[]> = {};\n for (const entry of entries) {\n const parent = entry.tool.parent?.trim() || NO_PARENT;\n (byParent[parent] ??= []).push(entry);\n }\n const subGroups = Object.entries(byParent)\n .map(([parent, subEntries]) => ({\n parent,\n entries: [...subEntries].sort((a, b) => a.label.localeCompare(b.label)),\n }))\n .sort(compareSubGroups);\n return {\n group,\n entries: [...entries].sort((a, b) => a.label.localeCompare(b.label)),\n subGroups,\n };\n}\n\nfunction compareSubGroups(a: ToolSubGroup, b: ToolSubGroup): number {\n if (a.parent === NO_PARENT) return b.parent === NO_PARENT ? 0 : -1;\n if (b.parent === NO_PARENT) return 1;\n return a.parent.localeCompare(b.parent);\n}\n\nexport function groupedToolEntriesWithPreferences(\n tools: ToolMeta[],\n value: Record<string, ToolPolicy>,\n): ToolGroup[] {\n const groups = groupedToolEntries(tools);\n const known = new Set(tools.map((tool) => tool.name));\n const customEntries = Object.entries(value).flatMap(([name, mode]) => {\n const normalizedMode = normalizeToolPolicy(mode);\n if (known.has(name) || !normalizedMode) return [];\n return [\n {\n key: name,\n label: name,\n group: \"Custom\",\n tool: {\n name,\n label: name,\n group: \"Custom\",\n defaultPermission: normalizedMode,\n },\n defaultPermission: normalizedMode,\n },\n ];\n });\n if (customEntries.length === 0) return groups;\n return [...groups, buildToolGroup(\"Custom\", customEntries)];\n}\n\nexport function entryMode(\n entry: ToolPreferenceEntry,\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return normalizeToolPolicy(value[entry.key] ?? \"\") ?? entry.defaultPermission;\n}\n\nexport function groupToolPolicy(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): ToolPolicy {\n return entries.reduce<ToolPolicy>(\n (mode, entry) => mostRestrictiveMode(mode, entryMode(entry, value)),\n \"allow\",\n );\n}\n\nexport function commonMode(\n entries: ToolPreferenceEntry[],\n value: Record<string, ToolPolicy>,\n): BadgePolicy {\n const first = entries[0];\n if (!first) return \"mixed\";\n const firstMode = entryMode(first, value);\n return entries.every((entry) => entryMode(entry, value) === firstMode)\n ? firstMode\n : \"mixed\";\n}\n\nexport function nextMode(mode: ToolPolicy): ToolPolicy {\n const current = POLICY_CYCLE.indexOf(mode);\n return POLICY_CYCLE[\n ((current >= 0 ? current : 0) + 1) % POLICY_CYCLE.length\n ]!;\n}\n\nfunction mostRestrictiveMode(a: ToolPolicy, b: ToolPolicy): ToolPolicy {\n return modeRank(a) >= modeRank(b) ? a : b;\n}\n\nfunction modeRank(mode: ToolPolicy): number {\n switch (mode) {\n case \"allow\":\n return 0;\n case \"auto\":\n return 1;\n case \"ask\":\n return 2;\n case \"deny\":\n return 3;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -264,4 +264,5 @@ function CompactToolPreferencesList({
264
264
  }
265
265
  exports.CompactToolList = CompactToolList;
266
266
  exports.CompactToolPreferencesList = CompactToolPreferencesList;
267
+ exports.ModeBadge = ModeBadge;
267
268
  //# sourceMappingURL=ToolPreferencesList.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferencesList.cjs","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolPolicy,\n nextMode,\n type BadgePolicy,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n /** The effective mode of every tool, keyed by name — what the rows render. */\n value: Record<string, ToolPolicy>;\n /** Emits the rule a toggle means: a group header emits a group rule, a parent\n * header a group+parent rule, and a row a name rule. The caller appends it to\n * the user's list, where a name rule outranks the group rule above it.\n *\n * This is deliberately not \"here is the new map\". A group toggle that wrote\n * every current member's name would stop applying the moment the catalog\n * gained a member, and the user would have no way to tell. */\n onRule: (rule: PermissionRule) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nfunction ModeBadge({ mode }: { mode: BadgePolicy }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"allow\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"deny\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolPolicy;\n onToggle: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"deny\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleSubGroup,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolPolicy>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n onCycleSubGroup: (subGroup: ToolSubGroup, current: ToolPolicy) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onRule,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolPolicy) =>\n onRule({ name: entry.key, policy: nextMode(current) });\n const cycleGroup = (group: ToolGroup, current: ToolPolicy) =>\n onRule({ group: group.group, policy: nextMode(current) });\n // A parent is a subdivision of one group, not a group of its own, so the rule\n // has to name both — a bare `parent` would reach the same display title under\n // a different group.\n const cycleSubGroup = (\n group: ToolGroup,\n subGroup: ToolSubGroup,\n current: ToolPolicy,\n ) =>\n onRule({\n group: group.group,\n parent: subGroup.parent,\n policy: nextMode(current),\n });\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleGroup(group, groupToolPolicy(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleSubGroup={(sub, current) =>\n cycleSubGroup(group, sub, current)\n }\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onRule,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":["jsx","cn","BADGE_DESCRIPTION","jsxs","Icon","UiChevronRight","UiChevronDown","NO_PARENT","entryMode","Fragment","commonMode","groupToolPolicy","useState","nextMode","useMemo","groupedToolEntriesWithPreferences"],"mappings":"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"}
1
+ {"version":3,"file":"ToolPreferencesList.cjs","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolPolicy,\n nextMode,\n type BadgePolicy,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n /** The effective mode of every tool, keyed by name — what the rows render. */\n value: Record<string, ToolPolicy>;\n /** Emits the rule a toggle means: a group header emits a group rule, a parent\n * header a group+parent rule, and a row a name rule. The caller appends it to\n * the user's list, where a name rule outranks the group rule above it.\n *\n * This is deliberately not \"here is the new map\". A group toggle that wrote\n * every current member's name would stop applying the moment the catalog\n * gained a member, and the user would have no way to tell. */\n onRule: (rule: PermissionRule) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nexport function ModeBadge({ mode }: { mode: BadgePolicy }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"allow\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"deny\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolPolicy;\n onToggle: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"deny\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleSubGroup,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolPolicy>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n onCycleSubGroup: (subGroup: ToolSubGroup, current: ToolPolicy) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onRule,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolPolicy) =>\n onRule({ name: entry.key, policy: nextMode(current) });\n const cycleGroup = (group: ToolGroup, current: ToolPolicy) =>\n onRule({ group: group.group, policy: nextMode(current) });\n // A parent is a subdivision of one group, not a group of its own, so the rule\n // has to name both — a bare `parent` would reach the same display title under\n // a different group.\n const cycleSubGroup = (\n group: ToolGroup,\n subGroup: ToolSubGroup,\n current: ToolPolicy,\n ) =>\n onRule({\n group: group.group,\n parent: subGroup.parent,\n policy: nextMode(current),\n });\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleGroup(group, groupToolPolicy(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleSubGroup={(sub, current) =>\n cycleSubGroup(group, sub, current)\n }\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onRule,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":["jsx","cn","BADGE_DESCRIPTION","jsxs","Icon","UiChevronRight","UiChevronDown","NO_PARENT","entryMode","Fragment","commonMode","groupToolPolicy","useState","nextMode","useMemo","groupedToolEntriesWithPreferences"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ToolMeta, ToolPolicy } from '../chat/types.js';
2
2
  import { PermissionRule } from '../chat/tool-policy.js';
3
- import { ToolGroup } from './ToolPreferences.model.js';
3
+ import { BadgePolicy, ToolGroup } from './ToolPreferences.model.js';
4
4
  export type CompactToolPreferencesListProps = {
5
5
  tools: ToolMeta[];
6
6
  /** The effective mode of every tool, keyed by name — what the rows render. */
@@ -17,6 +17,9 @@ export type CompactToolPreferencesListProps = {
17
17
  emptyLabel?: string | undefined;
18
18
  className?: string | undefined;
19
19
  };
20
+ export declare function ModeBadge({ mode }: {
21
+ mode: BadgePolicy;
22
+ }): import("react").JSX.Element;
20
23
  export declare function CompactToolList({ groups, value, onRule, emptyLabel, }: {
21
24
  groups: ToolGroup[];
22
25
  value: Record<string, ToolPolicy>;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferencesList.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAUL,KAAK,SAAS,EAGf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC;;;;;;mEAM+D;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAuMF,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAiC,GAClC,EAAE;IACD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,+BA2EA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAA2B,EAC3B,UAAiC,EACjC,SAAS,GACV,EAAE,+BAA+B,+BAkBjC"}
1
+ {"version":3,"file":"ToolPreferencesList.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EASL,KAAK,WAAW,EAChB,KAAK,SAAS,EAGf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC;;;;;;mEAM+D;IAC/D,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,+BAkBxD;AAmLD,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAiC,GAClC,EAAE;IACD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,+BA2EA;AAED,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAA2B,EAC3B,UAAiC,EACjC,SAAS,GACV,EAAE,+BAA+B,+BAkBjC"}
@@ -262,6 +262,7 @@ function CompactToolPreferencesList({
262
262
  }
263
263
  export {
264
264
  CompactToolList,
265
- CompactToolPreferencesList
265
+ CompactToolPreferencesList,
266
+ ModeBadge
266
267
  };
267
268
  //# sourceMappingURL=ToolPreferencesList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferencesList.js","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolPolicy,\n nextMode,\n type BadgePolicy,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n /** The effective mode of every tool, keyed by name — what the rows render. */\n value: Record<string, ToolPolicy>;\n /** Emits the rule a toggle means: a group header emits a group rule, a parent\n * header a group+parent rule, and a row a name rule. The caller appends it to\n * the user's list, where a name rule outranks the group rule above it.\n *\n * This is deliberately not \"here is the new map\". A group toggle that wrote\n * every current member's name would stop applying the moment the catalog\n * gained a member, and the user would have no way to tell. */\n onRule: (rule: PermissionRule) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nfunction ModeBadge({ mode }: { mode: BadgePolicy }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"allow\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"deny\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolPolicy;\n onToggle: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"deny\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleSubGroup,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolPolicy>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n onCycleSubGroup: (subGroup: ToolSubGroup, current: ToolPolicy) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onRule,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolPolicy) =>\n onRule({ name: entry.key, policy: nextMode(current) });\n const cycleGroup = (group: ToolGroup, current: ToolPolicy) =>\n onRule({ group: group.group, policy: nextMode(current) });\n // A parent is a subdivision of one group, not a group of its own, so the rule\n // has to name both — a bare `parent` would reach the same display title under\n // a different group.\n const cycleSubGroup = (\n group: ToolGroup,\n subGroup: ToolSubGroup,\n current: ToolPolicy,\n ) =>\n onRule({\n group: group.group,\n parent: subGroup.parent,\n policy: nextMode(current),\n });\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleGroup(group, groupToolPolicy(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleSubGroup={(sub, current) =>\n cycleSubGroup(group, sub, current)\n }\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onRule,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolPreferencesList.js","sources":["../../../src/data/ai/ToolPreferencesList.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport {\n BADGE_DESCRIPTION,\n BADGE_LABEL,\n NO_PARENT,\n commonMode,\n entryMode,\n groupedToolEntriesWithPreferences,\n groupToolPolicy,\n nextMode,\n type BadgePolicy,\n type ToolGroup,\n type ToolPreferenceEntry,\n type ToolSubGroup,\n} from \"./ToolPreferences.model\";\n\nexport type CompactToolPreferencesListProps = {\n tools: ToolMeta[];\n /** The effective mode of every tool, keyed by name — what the rows render. */\n value: Record<string, ToolPolicy>;\n /** Emits the rule a toggle means: a group header emits a group rule, a parent\n * header a group+parent rule, and a row a name rule. The caller appends it to\n * the user's list, where a name rule outranks the group rule above it.\n *\n * This is deliberately not \"here is the new map\". A group toggle that wrote\n * every current member's name would stop applying the moment the catalog\n * gained a member, and the user would have no way to tell. */\n onRule: (rule: PermissionRule) => void;\n title?: string | undefined;\n emptyLabel?: string | undefined;\n className?: string | undefined;\n};\n\nexport function ModeBadge({ mode }: { mode: BadgePolicy }) {\n return (\n <span\n className={cn(\n \"shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium\",\n mode === \"allow\" &&\n \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\",\n mode === \"auto\" && \"bg-sky-500/10 text-sky-600 dark:text-sky-400\",\n mode === \"ask\" && \"bg-amber-500/10 text-amber-600 dark:text-amber-500\",\n mode === \"deny\" && \"text-muted-foreground\",\n mode === \"mixed\" &&\n \"bg-muted text-muted-foreground ring-1 ring-inset ring-border\",\n )}\n title={BADGE_DESCRIPTION[mode]}\n >\n {BADGE_LABEL[mode]}\n </span>\n );\n}\n\nfunction ToolGroupHeader({\n group,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n group: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 px-1 py-0.5\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${group}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${group} group`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${group}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n {group}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolRow({\n entry,\n mode,\n onToggle,\n indented = false,\n}: {\n entry: ToolPreferenceEntry;\n mode: ToolPolicy;\n onToggle: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n indented?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded px-1.5 py-0.5 text-left hover:bg-accent\",\n indented && \"pl-7\",\n )}\n title={entry.tool.name}\n onClick={() => onToggle(entry, mode)}\n >\n <span\n className={cn(\n \"min-w-0 truncate text-xs\",\n mode === \"deny\" && \"text-muted-foreground line-through\",\n )}\n >\n {entry.label}\n </span>\n <ModeBadge mode={mode} />\n </button>\n );\n}\n\nfunction ToolParentHeader({\n parent,\n count,\n collapsed,\n mode,\n onCollapseToggle,\n onModeToggle,\n}: {\n parent: string;\n count: number;\n collapsed: boolean;\n mode: BadgePolicy;\n onCollapseToggle: () => void;\n onModeToggle: () => void;\n}) {\n return (\n <div className=\"grid grid-cols-[1.25rem_minmax(0,1fr)] items-center gap-1 py-0.5 pl-4 pr-1\">\n <button\n type=\"button\"\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n title={`${collapsed ? \"Expand\" : \"Collapse\"} ${parent}`}\n className=\"inline-flex size-5 items-center justify-center rounded text-muted-foreground hover:bg-background hover:text-foreground\"\n onClick={onCollapseToggle}\n >\n <Icon\n icon={collapsed ? UiChevronRight : UiChevronDown}\n className=\"size-3.5\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`Toggle ${parent} tools`}\n title={`Cycle all ${count} ${count === 1 ? \"tool\" : \"tools\"} in ${parent}`}\n className=\"flex min-w-0 items-center gap-1.5 rounded px-1 py-0.5 text-left hover:bg-background/70\"\n onClick={onModeToggle}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-1.5\">\n <span className=\"min-w-0 truncate text-[11px] font-medium text-foreground/70\">\n {parent}\n </span>\n <span className=\"shrink-0 rounded bg-background px-1 text-[10px] text-muted-foreground\">\n {count}\n </span>\n </span>\n <ModeBadge mode={mode} />\n </button>\n </div>\n );\n}\n\nfunction ToolSubGroupBlock({\n subGroup,\n value,\n open,\n onToggle,\n onToggleEntry,\n onCycleSubGroup,\n}: {\n subGroup: ToolSubGroup;\n value: Record<string, ToolPolicy>;\n open: boolean;\n onToggle: () => void;\n onToggleEntry: (entry: ToolPreferenceEntry, current: ToolPolicy) => void;\n onCycleSubGroup: (subGroup: ToolSubGroup, current: ToolPolicy) => void;\n}) {\n const hasParent = subGroup.parent !== NO_PARENT;\n const rows = subGroup.entries.map((entry) => (\n <ToolRow\n key={entry.key}\n entry={entry}\n mode={entryMode(entry, value)}\n onToggle={onToggleEntry}\n indented={hasParent}\n />\n ));\n if (!hasParent) return <>{rows}</>;\n return (\n <div>\n <ToolParentHeader\n parent={subGroup.parent}\n count={subGroup.entries.length}\n collapsed={!open}\n mode={commonMode(subGroup.entries, value)}\n onCollapseToggle={onToggle}\n onModeToggle={() =>\n onCycleSubGroup(subGroup, groupToolPolicy(subGroup.entries, value))\n }\n />\n {open && rows}\n </div>\n );\n}\n\nexport function CompactToolList({\n groups,\n value,\n onRule,\n emptyLabel = \"No tools available\",\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n emptyLabel?: string | undefined;\n}) {\n const [expanded, setExpanded] = useState<Set<string>>(() => new Set());\n if (groups.length === 0) {\n return (\n <div className=\"px-2 py-2 text-xs text-muted-foreground\">\n {emptyLabel}\n </div>\n );\n }\n const isOpen = (key: string) => expanded.has(key);\n const toggle = (key: string) =>\n setExpanded((current) => {\n const next = new Set(current);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const handleToggle = (entry: ToolPreferenceEntry, current: ToolPolicy) =>\n onRule({ name: entry.key, policy: nextMode(current) });\n const cycleGroup = (group: ToolGroup, current: ToolPolicy) =>\n onRule({ group: group.group, policy: nextMode(current) });\n // A parent is a subdivision of one group, not a group of its own, so the rule\n // has to name both — a bare `parent` would reach the same display title under\n // a different group.\n const cycleSubGroup = (\n group: ToolGroup,\n subGroup: ToolSubGroup,\n current: ToolPolicy,\n ) =>\n onRule({\n group: group.group,\n parent: subGroup.parent,\n policy: nextMode(current),\n });\n return (\n <div className=\"space-y-1\">\n {groups.map((group) => {\n const groupOpen = isOpen(group.group);\n return (\n <div key={group.group}>\n <ToolGroupHeader\n group={group.group}\n count={group.entries.length}\n collapsed={!groupOpen}\n mode={commonMode(group.entries, value)}\n onCollapseToggle={() => toggle(group.group)}\n onModeToggle={() =>\n cycleGroup(group, groupToolPolicy(group.entries, value))\n }\n />\n {groupOpen && (\n <div className=\"space-y-0.5 p-0.5\">\n {group.subGroups.map((subGroup) => {\n const parentKey = `${group.group}///${subGroup.parent}`;\n return (\n <ToolSubGroupBlock\n key={subGroup.parent}\n subGroup={subGroup}\n value={value}\n open={isOpen(parentKey)}\n onToggle={() => toggle(parentKey)}\n onToggleEntry={handleToggle}\n onCycleSubGroup={(sub, current) =>\n cycleSubGroup(group, sub, current)\n }\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function CompactToolPreferencesList({\n tools,\n value,\n onRule,\n title = \"Tools preferences\",\n emptyLabel = \"No tools available\",\n className,\n}: CompactToolPreferencesListProps) {\n const groups = useMemo(\n () => groupedToolEntriesWithPreferences(tools, value),\n [tools, value],\n );\n return (\n <div className={cn(\"space-y-2\", className)}>\n {title && (\n <div className=\"text-xs font-medium text-muted-foreground\">{title}</div>\n )}\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel={emptyLabel}\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -2,16 +2,18 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
- const useListMenuSelection = require("../../components/use-list-menu-selection.cjs");
6
5
  const SplitPane = require("../../layout/SplitPane.cjs");
7
6
  const utils = require("../../lib/utils.cjs");
8
7
  const ToolSchemaBrowser_detail = require("./ToolSchemaBrowser.detail.cjs");
9
8
  const ToolSchemaBrowser_model = require("./ToolSchemaBrowser.model.cjs");
10
9
  const ToolSchemaBrowser_sidebar = require("./ToolSchemaBrowser.sidebar.cjs");
10
+ const ToolSchemaBrowser_strategies = require("./ToolSchemaBrowser.strategies.cjs");
11
11
  function ToolSchemaBrowser({
12
12
  tools,
13
13
  value,
14
14
  onRule,
15
+ rules,
16
+ onRulesChange,
15
17
  className
16
18
  }) {
17
19
  var _a;
@@ -25,9 +27,6 @@ function ToolSchemaBrowser({
25
27
  const [selected, setSelected] = react.useState(
26
28
  ((_a = tools[0]) == null ? void 0 : _a.name) ?? null
27
29
  );
28
- const selection = useListMenuSelection.useListMenuSelection({
29
- keys: tools.map((tool) => tool.name)
30
- });
31
30
  const filtered = react.useMemo(
32
31
  () => ToolSchemaBrowser_model.filterToolSchemaBrowserTools(tools, query, filters),
33
32
  [filters, query, tools]
@@ -49,55 +48,55 @@ function ToolSchemaBrowser({
49
48
  ...current,
50
49
  [key]: value2
51
50
  }));
52
- return /* @__PURE__ */ jsxRuntime.jsx(
53
- "div",
54
- {
55
- className: utils.cn(
56
- "min-h-0 overflow-hidden rounded-md border border-border bg-background",
57
- className
58
- ),
59
- children: /* @__PURE__ */ jsxRuntime.jsx(
60
- SplitPane.SplitPane,
61
- {
62
- defaultSplit: 34,
63
- minLeft: 24,
64
- minRight: 42,
65
- className: "min-h-0",
66
- leftClass: "flex min-h-0 flex-col overflow-hidden",
67
- rightClass: "min-h-0 overflow-y-auto",
68
- left: /* @__PURE__ */ jsxRuntime.jsx(
69
- ToolSchemaBrowser_sidebar.ToolSchemaBrowserSidebar,
70
- {
71
- query,
72
- view,
73
- filters,
74
- sections,
75
- active,
76
- filteredCount: filtered.length,
77
- isOpen,
78
- value,
79
- onRule,
80
- onQueryChange: setQuery,
81
- onViewChange: setView,
82
- onFilterChange: updateFilter,
83
- onClearFilters: () => setFilters({ ...ToolSchemaBrowser_model.EMPTY_TOOL_HINT_FILTERS }),
84
- onToggle: toggle,
85
- onSelect: setSelected,
86
- ...onRule ? { selection } : {}
87
- }
88
- ),
89
- right: active ? /* @__PURE__ */ jsxRuntime.jsx(
90
- ToolSchemaBrowser_detail.ToolSchemaBrowserDetail,
91
- {
92
- tool: active,
93
- tab,
94
- onTabChange: setTab
95
- }
96
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: "No tools" })
97
- }
98
- )
99
- }
100
- );
51
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("flex min-h-0 flex-col gap-2", className), children: [
52
+ rules && onRulesChange && /* @__PURE__ */ jsxRuntime.jsx(
53
+ ToolSchemaBrowser_strategies.ToolPermissionStrategies,
54
+ {
55
+ rules,
56
+ tools,
57
+ onRulesChange
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1 overflow-hidden rounded-md border border-border bg-background", children: /* @__PURE__ */ jsxRuntime.jsx(
61
+ SplitPane.SplitPane,
62
+ {
63
+ defaultSplit: 34,
64
+ minLeft: 24,
65
+ minRight: 42,
66
+ className: "min-h-0",
67
+ leftClass: "flex min-h-0 flex-col overflow-hidden",
68
+ rightClass: "min-h-0 overflow-y-auto",
69
+ left: /* @__PURE__ */ jsxRuntime.jsx(
70
+ ToolSchemaBrowser_sidebar.ToolSchemaBrowserSidebar,
71
+ {
72
+ query,
73
+ view,
74
+ filters,
75
+ sections,
76
+ active,
77
+ filteredCount: filtered.length,
78
+ isOpen,
79
+ value,
80
+ onRule,
81
+ onQueryChange: setQuery,
82
+ onViewChange: setView,
83
+ onFilterChange: updateFilter,
84
+ onClearFilters: () => setFilters({ ...ToolSchemaBrowser_model.EMPTY_TOOL_HINT_FILTERS }),
85
+ onToggle: toggle,
86
+ onSelect: setSelected
87
+ }
88
+ ),
89
+ right: active ? /* @__PURE__ */ jsxRuntime.jsx(
90
+ ToolSchemaBrowser_detail.ToolSchemaBrowserDetail,
91
+ {
92
+ tool: active,
93
+ tab,
94
+ onTabChange: setTab
95
+ }
96
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: "No tools" })
97
+ }
98
+ ) })
99
+ ] });
101
100
  }
102
101
  exports.ToolSchemaBrowser = ToolSchemaBrowser;
103
102
  //# sourceMappingURL=ToolSchemaBrowser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { useListMenuSelection } from \"../../components/use-list-menu-selection\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport { ToolSchemaBrowserDetail } from \"./ToolSchemaBrowser.detail\";\nimport {\n EMPTY_TOOL_HINT_FILTERS,\n buildToolSchemaSections,\n filterToolSchemaBrowserTools,\n type ToolHintFilter,\n type ToolHintFilters,\n type ToolHintKey,\n type ToolSchemaBrowserTab,\n type ToolSchemaViewMode,\n} from \"./ToolSchemaBrowser.model\";\nimport { ToolSchemaBrowserSidebar } from \"./ToolSchemaBrowser.sidebar\";\n\nexport type ToolSchemaBrowserProps = {\n tools: ToolMeta[];\n /** Server-resolved effective permission shown beside each tool. */\n value?: Record<string, ToolPolicy> | undefined;\n /** Enables bulk selection and emits one ordered policy rule per action. */\n onRule?: ((rule: PermissionRule) => void) | undefined;\n className?: string;\n};\n\nexport function ToolSchemaBrowser({\n tools,\n value,\n onRule,\n className,\n}: ToolSchemaBrowserProps) {\n const [query, setQuery] = useState(\"\");\n const [view, setView] = useState<ToolSchemaViewMode>(\"group\");\n const [tab, setTab] = useState<ToolSchemaBrowserTab>(\"schema\");\n const [filters, setFilters] = useState<ToolHintFilters>(\n EMPTY_TOOL_HINT_FILTERS,\n );\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n const [selected, setSelected] = useState<string | null>(\n tools[0]?.name ?? null,\n );\n const selection = useListMenuSelection({\n keys: tools.map((tool) => tool.name),\n });\n\n const filtered = useMemo(\n () => filterToolSchemaBrowserTools(tools, query, filters),\n [filters, query, tools],\n );\n const searching =\n query.trim().length > 0 ||\n Object.values(filters).some((value) => value !== \"any\");\n const active =\n filtered.find((tool) => tool.name === selected) ?? filtered[0] ?? tools[0];\n const sections = useMemo(\n () => buildToolSchemaSections(filtered, view),\n [filtered, view],\n );\n\n const toggle = (key: string) =>\n setCollapsed((previous) => {\n const next = new Set(previous);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const isOpen = (key: string) => searching || !collapsed.has(key);\n const updateFilter = (key: ToolHintKey, value: ToolHintFilter) =>\n setFilters((current) => ({\n ...current,\n [key]: value,\n }));\n\n return (\n <div\n className={cn(\n \"min-h-0 overflow-hidden rounded-md border border-border bg-background\",\n className,\n )}\n >\n <SplitPane\n defaultSplit={34}\n minLeft={24}\n minRight={42}\n className=\"min-h-0\"\n leftClass=\"flex min-h-0 flex-col overflow-hidden\"\n rightClass=\"min-h-0 overflow-y-auto\"\n left={\n <ToolSchemaBrowserSidebar\n query={query}\n view={view}\n filters={filters}\n sections={sections}\n active={active}\n filteredCount={filtered.length}\n isOpen={isOpen}\n value={value}\n onRule={onRule}\n onQueryChange={setQuery}\n onViewChange={setView}\n onFilterChange={updateFilter}\n onClearFilters={() => setFilters({ ...EMPTY_TOOL_HINT_FILTERS })}\n onToggle={toggle}\n onSelect={setSelected}\n {...(onRule ? { selection } : {})}\n />\n }\n right={\n active ? (\n <ToolSchemaBrowserDetail\n tool={active}\n tab={tab}\n onTabChange={setTab}\n />\n ) : (\n <div className=\"px-3 py-8 text-center text-xs text-muted-foreground\">\n No tools\n </div>\n )\n }\n />\n </div>\n );\n}\n"],"names":["useState","EMPTY_TOOL_HINT_FILTERS","useListMenuSelection","useMemo","filterToolSchemaBrowserTools","value","buildToolSchemaSections","jsx","cn","SplitPane","ToolSchemaBrowserSidebar","ToolSchemaBrowserDetail"],"mappings":"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"}
1
+ {"version":3,"file":"ToolSchemaBrowser.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { SplitPane } from \"../../layout/SplitPane\";\nimport { cn } from \"../../lib/utils\";\nimport type { PermissionPolicy, PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport { ToolSchemaBrowserDetail } from \"./ToolSchemaBrowser.detail\";\nimport {\n EMPTY_TOOL_HINT_FILTERS,\n buildToolSchemaSections,\n filterToolSchemaBrowserTools,\n type ToolHintFilter,\n type ToolHintFilters,\n type ToolHintKey,\n type ToolSchemaBrowserTab,\n type ToolSchemaViewMode,\n} from \"./ToolSchemaBrowser.model\";\nimport { ToolSchemaBrowserSidebar } from \"./ToolSchemaBrowser.sidebar\";\nimport { ToolPermissionStrategies } from \"./ToolSchemaBrowser.strategies\";\n\nexport type ToolSchemaBrowserProps = {\n tools: ToolMeta[];\n /** Server-resolved effective permission shown beside each tool. */\n value?: Record<string, ToolPolicy> | undefined;\n /** Enables click-to-toggle badges; emits one ordered policy rule per click. */\n onRule?: ((rule: PermissionRule) => void) | undefined;\n /** Saved rules; with `onRulesChange`, shows the collapsed strategy editor. */\n rules?: PermissionPolicy | undefined;\n onRulesChange?: ((rules: PermissionPolicy) => void) | undefined;\n className?: string;\n};\n\nexport function ToolSchemaBrowser({\n tools,\n value,\n onRule,\n rules,\n onRulesChange,\n className,\n}: ToolSchemaBrowserProps) {\n const [query, setQuery] = useState(\"\");\n const [view, setView] = useState<ToolSchemaViewMode>(\"group\");\n const [tab, setTab] = useState<ToolSchemaBrowserTab>(\"schema\");\n const [filters, setFilters] = useState<ToolHintFilters>(\n EMPTY_TOOL_HINT_FILTERS,\n );\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n const [selected, setSelected] = useState<string | null>(\n tools[0]?.name ?? null,\n );\n\n const filtered = useMemo(\n () => filterToolSchemaBrowserTools(tools, query, filters),\n [filters, query, tools],\n );\n const searching =\n query.trim().length > 0 ||\n Object.values(filters).some((value) => value !== \"any\");\n const active =\n filtered.find((tool) => tool.name === selected) ?? filtered[0] ?? tools[0];\n const sections = useMemo(\n () => buildToolSchemaSections(filtered, view),\n [filtered, view],\n );\n\n const toggle = (key: string) =>\n setCollapsed((previous) => {\n const next = new Set(previous);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const isOpen = (key: string) => searching || !collapsed.has(key);\n const updateFilter = (key: ToolHintKey, value: ToolHintFilter) =>\n setFilters((current) => ({\n ...current,\n [key]: value,\n }));\n\n return (\n <div className={cn(\"flex min-h-0 flex-col gap-2\", className)}>\n {rules && onRulesChange && (\n <ToolPermissionStrategies\n rules={rules}\n tools={tools}\n onRulesChange={onRulesChange}\n />\n )}\n <div className=\"min-h-0 flex-1 overflow-hidden rounded-md border border-border bg-background\">\n <SplitPane\n defaultSplit={34}\n minLeft={24}\n minRight={42}\n className=\"min-h-0\"\n leftClass=\"flex min-h-0 flex-col overflow-hidden\"\n rightClass=\"min-h-0 overflow-y-auto\"\n left={\n <ToolSchemaBrowserSidebar\n query={query}\n view={view}\n filters={filters}\n sections={sections}\n active={active}\n filteredCount={filtered.length}\n isOpen={isOpen}\n value={value}\n onRule={onRule}\n onQueryChange={setQuery}\n onViewChange={setView}\n onFilterChange={updateFilter}\n onClearFilters={() => setFilters({ ...EMPTY_TOOL_HINT_FILTERS })}\n onToggle={toggle}\n onSelect={setSelected}\n />\n }\n right={\n active ? (\n <ToolSchemaBrowserDetail\n tool={active}\n tab={tab}\n onTabChange={setTab}\n />\n ) : (\n <div className=\"px-3 py-8 text-center text-xs text-muted-foreground\">\n No tools\n </div>\n )\n }\n />\n </div>\n </div>\n );\n}\n"],"names":["useState","EMPTY_TOOL_HINT_FILTERS","useMemo","filterToolSchemaBrowserTools","value","buildToolSchemaSections","cn","jsx","ToolPermissionStrategies","SplitPane","ToolSchemaBrowserSidebar","ToolSchemaBrowserDetail"],"mappings":"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"}
@@ -1,12 +1,15 @@
1
- import { PermissionRule } from '../chat/tool-policy.js';
1
+ import { PermissionPolicy, PermissionRule } from '../chat/tool-policy.js';
2
2
  import { ToolMeta, ToolPolicy } from '../chat/types.js';
3
3
  export type ToolSchemaBrowserProps = {
4
4
  tools: ToolMeta[];
5
5
  /** Server-resolved effective permission shown beside each tool. */
6
6
  value?: Record<string, ToolPolicy> | undefined;
7
- /** Enables bulk selection and emits one ordered policy rule per action. */
7
+ /** Enables click-to-toggle badges; emits one ordered policy rule per click. */
8
8
  onRule?: ((rule: PermissionRule) => void) | undefined;
9
+ /** Saved rules; with `onRulesChange`, shows the collapsed strategy editor. */
10
+ rules?: PermissionPolicy | undefined;
11
+ onRulesChange?: ((rules: PermissionPolicy) => void) | undefined;
9
12
  className?: string;
10
13
  };
11
- export declare function ToolSchemaBrowser({ tools, value, onRule, className, }: ToolSchemaBrowserProps): import("react").JSX.Element;
14
+ export declare function ToolSchemaBrowser({ tools, value, onRule, rules, onRulesChange, className, }: ToolSchemaBrowserProps): import("react").JSX.Element;
12
15
  //# sourceMappingURL=ToolSchemaBrowser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAc1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;IAC/C,2EAA2E;IAC3E,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,+BA6FxB"}
1
+ {"version":3,"file":"ToolSchemaBrowser.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC;IAC/C,+EAA+E;IAC/E,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACtD,8EAA8E;IAC9E,KAAK,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,SAAS,GACV,EAAE,sBAAsB,+BA6FxB"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const utils = require("../../lib/utils.cjs");
5
5
  const Icon = require("../Icon.cjs");
6
+ const ToolPreferencesList = require("./ToolPreferencesList.cjs");
6
7
  const UiChevronDown = require("../../icons/components/UiChevronDown.cjs");
7
8
  const UiChevronRight = require("../../icons/components/UiChevronRight.cjs");
8
9
  function ToolDirectoryHeader({
@@ -10,8 +11,9 @@ function ToolDirectoryHeader({
10
11
  count,
11
12
  open,
12
13
  variant,
14
+ mode,
13
15
  onToggle,
14
- onAdd
16
+ onCycle
15
17
  }) {
16
18
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 items-stretch", children: [
17
19
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -24,30 +26,24 @@ function ToolDirectoryHeader({
24
26
  "flex shrink-0 items-center pl-2 text-muted-foreground hover:bg-muted",
25
27
  variant === "child" && "text-foreground/80 hover:bg-accent/50"
26
28
  ),
27
- children: /* @__PURE__ */ jsxRuntime.jsx(
28
- Icon.Icon,
29
- {
30
- icon: open ? UiChevronDown.UiChevronDown : UiChevronRight.UiChevronRight,
31
- className: "size-3"
32
- }
33
- )
29
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: open ? UiChevronDown.UiChevronDown : UiChevronRight.UiChevronRight, className: "size-3" })
34
30
  }
35
31
  ),
36
32
  /* @__PURE__ */ jsxRuntime.jsxs(
37
33
  "button",
38
34
  {
39
35
  type: "button",
40
- "aria-label": `${label} ${count}${onAdd ? " · Add strategy" : ""}`,
41
- title: onAdd ? `Add an Ask strategy for ${label}` : void 0,
42
- onClick: onAdd ?? onToggle,
36
+ "aria-label": onCycle ? `Toggle ${label} group` : `${label} ${count}`,
37
+ title: onCycle ? `Cycle all ${count} tools in ${label}` : void 0,
38
+ onClick: onCycle ?? onToggle,
43
39
  className: utils.cn(
44
40
  "flex min-w-0 flex-1 items-center gap-1 pr-2 text-left text-muted-foreground hover:bg-muted",
45
41
  variant === "section" ? "py-1 text-[10px] font-semibold uppercase tracking-wider" : "py-1 text-[11px] font-medium text-foreground/80 hover:bg-accent/50"
46
42
  ),
47
43
  children: [
48
44
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate", children: label }),
49
- onAdd && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] font-semibold normal-case tracking-normal text-muted-foreground/70", children: "Add" }),
50
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground/70", children: count })
45
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground/70", children: count }),
46
+ mode && /* @__PURE__ */ jsxRuntime.jsx(ToolPreferencesList.ModeBadge, { mode })
51
47
  ]
52
48
  }
53
49
  )
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.directory-header.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.directory-header.tsx"],"sourcesContent":["import { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\n\nexport function ToolDirectoryHeader({\n label,\n count,\n open,\n variant,\n onToggle,\n onAdd,\n}: {\n label: string;\n count: number;\n open: boolean;\n variant: \"section\" | \"child\";\n onToggle: () => void;\n onAdd?: (() => void) | undefined;\n}) {\n return (\n <div className=\"flex min-w-0 flex-1 items-stretch\">\n <button\n type=\"button\"\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={onToggle}\n className={cn(\n \"flex shrink-0 items-center pl-2 text-muted-foreground hover:bg-muted\",\n variant === \"child\" && \"text-foreground/80 hover:bg-accent/50\",\n )}\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"size-3\"\n />\n </button>\n <button\n type=\"button\"\n aria-label={`${label} ${count}${onAdd ? \" · Add strategy\" : \"\"}`}\n title={onAdd ? `Add an Ask strategy for ${label}` : undefined}\n onClick={onAdd ?? onToggle}\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-1 pr-2 text-left text-muted-foreground hover:bg-muted\",\n variant === \"section\"\n ? \"py-1 text-[10px] font-semibold uppercase tracking-wider\"\n : \"py-1 text-[11px] font-medium text-foreground/80 hover:bg-accent/50\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n {onAdd && (\n <span className=\"text-[9px] font-semibold normal-case tracking-normal text-muted-foreground/70\">\n Add\n </span>\n )}\n <span className=\"tabular-nums text-[10px] text-muted-foreground/70\">\n {count}\n </span>\n </button>\n </div>\n );\n}\n"],"names":["jsxs","jsx","cn","Icon","UiChevronDown","UiChevronRight"],"mappings":";;;;;;;AAIO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,QACpD,SAAS;AAAA,QACT,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA,YAAY,WAAW;AAAA,QAAA;AAAA,QAGzB,UAAAD,2BAAAA;AAAAA,UAACE,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,OAAOC,cAAAA,gBAAgBC,eAAAA;AAAAA,YAC7B,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA;AAAA,IAEFL,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,KAAK,IAAI,KAAK,GAAG,QAAQ,oBAAoB,EAAE;AAAA,QAC9D,OAAO,QAAQ,2BAA2B,KAAK,KAAK;AAAA,QACpD,SAAS,SAAS;AAAA,QAClB,WAAWE,MAAAA;AAAAA,UACT;AAAA,UACA,YAAY,YACR,4DACA;AAAA,QAAA;AAAA,QAGN,UAAA;AAAA,UAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,OAAM;AAAA,UAChD,SACCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iFAAgF,UAAA,OAEhG;AAAA,UAEFA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qDACb,UAAA,MAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;;"}
1
+ {"version":3,"file":"ToolSchemaBrowser.directory-header.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.directory-header.tsx"],"sourcesContent":["import { UiChevronDown, UiChevronRight } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport type { BadgePolicy } from \"./ToolPreferences.model\";\nimport { ModeBadge } from \"./ToolPreferencesList\";\n\nexport function ToolDirectoryHeader({\n label,\n count,\n open,\n variant,\n mode,\n onToggle,\n onCycle,\n}: {\n label: string;\n count: number;\n open: boolean;\n variant: \"section\" | \"child\";\n mode?: BadgePolicy | undefined;\n onToggle: () => void;\n /** Click-to-toggle policy for every tool under this directory. */\n onCycle?: (() => void) | undefined;\n}) {\n return (\n <div className=\"flex min-w-0 flex-1 items-stretch\">\n <button\n type=\"button\"\n aria-label={`${open ? \"Collapse\" : \"Expand\"} ${label}`}\n onClick={onToggle}\n className={cn(\n \"flex shrink-0 items-center pl-2 text-muted-foreground hover:bg-muted\",\n variant === \"child\" && \"text-foreground/80 hover:bg-accent/50\",\n )}\n >\n <Icon icon={open ? UiChevronDown : UiChevronRight} className=\"size-3\" />\n </button>\n <button\n type=\"button\"\n aria-label={onCycle ? `Toggle ${label} group` : `${label} ${count}`}\n title={onCycle ? `Cycle all ${count} tools in ${label}` : undefined}\n onClick={onCycle ?? onToggle}\n className={cn(\n \"flex min-w-0 flex-1 items-center gap-1 pr-2 text-left text-muted-foreground hover:bg-muted\",\n variant === \"section\"\n ? \"py-1 text-[10px] font-semibold uppercase tracking-wider\"\n : \"py-1 text-[11px] font-medium text-foreground/80 hover:bg-accent/50\",\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n <span className=\"tabular-nums text-[10px] text-muted-foreground/70\">\n {count}\n </span>\n {mode && <ModeBadge mode={mode} />}\n </button>\n </div>\n );\n}\n"],"names":["jsxs","jsx","cn","Icon","UiChevronDown","UiChevronRight","ModeBadge"],"mappings":";;;;;;;;AAMO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACEA,2BAAAA,KAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,QACpD,SAAS;AAAA,QACT,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA,YAAY,WAAW;AAAA,QAAA;AAAA,QAGzB,yCAACC,KAAAA,MAAA,EAAK,MAAM,OAAOC,8BAAgBC,eAAAA,gBAAgB,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAExEL,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,UAAU,UAAU,KAAK,WAAW,GAAG,KAAK,IAAI,KAAK;AAAA,QACjE,OAAO,UAAU,aAAa,KAAK,aAAa,KAAK,KAAK;AAAA,QAC1D,SAAS,WAAW;AAAA,QACpB,WAAWE,MAAAA;AAAAA,UACT;AAAA,UACA,YAAY,YACR,4DACA;AAAA,QAAA;AAAA,QAGN,UAAA;AAAA,UAAAD,2BAAAA,IAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,OAAM;AAAA,UACjDA,2BAAAA,IAAC,QAAA,EAAK,WAAU,qDACb,UAAA,OACH;AAAA,UACC,QAAQA,2BAAAA,IAACK,+BAAA,EAAU,KAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAClC,GACF;AAEJ;;"}
@@ -1,9 +1,12 @@
1
- export declare function ToolDirectoryHeader({ label, count, open, variant, onToggle, onAdd, }: {
1
+ import { BadgePolicy } from './ToolPreferences.model.js';
2
+ export declare function ToolDirectoryHeader({ label, count, open, variant, mode, onToggle, onCycle, }: {
2
3
  label: string;
3
4
  count: number;
4
5
  open: boolean;
5
6
  variant: "section" | "child";
7
+ mode?: BadgePolicy | undefined;
6
8
  onToggle: () => void;
7
- onAdd?: (() => void) | undefined;
9
+ /** Click-to-toggle policy for every tool under this directory. */
10
+ onCycle?: (() => void) | undefined;
8
11
  }): import("react").JSX.Element;
9
12
  //# sourceMappingURL=ToolSchemaBrowser.directory-header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.directory-header.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.directory-header.tsx"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAClC,+BAyCA"}
1
+ {"version":3,"file":"ToolSchemaBrowser.directory-header.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.directory-header.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,KAAK,EACL,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;IAC7B,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACpC,+BAkCA"}