@flanksource/clicky-ui 0.3.44 → 0.3.46

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 (537) hide show
  1. package/README.md +24 -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/AccessMark.cjs +23 -0
  16. package/dist/data/AccessMark.cjs.map +1 -0
  17. package/dist/data/AccessMark.d.ts +11 -0
  18. package/dist/data/AccessMark.d.ts.map +1 -0
  19. package/dist/data/AccessMark.js +23 -0
  20. package/dist/data/AccessMark.js.map +1 -0
  21. package/dist/data/CodeBlock.cjs +3 -2
  22. package/dist/data/CodeBlock.cjs.map +1 -1
  23. package/dist/data/CodeBlock.d.ts +3 -1
  24. package/dist/data/CodeBlock.d.ts.map +1 -1
  25. package/dist/data/CodeBlock.js +3 -2
  26. package/dist/data/CodeBlock.js.map +1 -1
  27. package/dist/data/CodeDiff.cjs +116 -23
  28. package/dist/data/CodeDiff.cjs.map +1 -1
  29. package/dist/data/CodeDiff.d.ts +26 -0
  30. package/dist/data/CodeDiff.d.ts.map +1 -1
  31. package/dist/data/CodeDiff.js +116 -23
  32. package/dist/data/CodeDiff.js.map +1 -1
  33. package/dist/data/GraphDiagram.cjs +75 -11
  34. package/dist/data/GraphDiagram.cjs.map +1 -1
  35. package/dist/data/GraphDiagram.d.ts +17 -2
  36. package/dist/data/GraphDiagram.d.ts.map +1 -1
  37. package/dist/data/GraphDiagram.js +76 -12
  38. package/dist/data/GraphDiagram.js.map +1 -1
  39. package/dist/data/GraphDiagramGroups.cjs +100 -0
  40. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  41. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  42. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  43. package/dist/data/GraphDiagramGroups.js +100 -0
  44. package/dist/data/GraphDiagramGroups.js.map +1 -0
  45. package/dist/data/GraphDiagramNodes.cjs +46 -51
  46. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  47. package/dist/data/GraphDiagramNodes.d.ts +8 -9
  48. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  49. package/dist/data/GraphDiagramNodes.js +46 -51
  50. package/dist/data/GraphDiagramNodes.js.map +1 -1
  51. package/dist/data/JsonView.cjs +118 -49
  52. package/dist/data/JsonView.cjs.map +1 -1
  53. package/dist/data/JsonView.d.ts +13 -10
  54. package/dist/data/JsonView.d.ts.map +1 -1
  55. package/dist/data/JsonView.js +118 -49
  56. package/dist/data/JsonView.js.map +1 -1
  57. package/dist/data/MarkdownEditor.cjs +2 -2
  58. package/dist/data/MarkdownEditor.cjs.map +1 -1
  59. package/dist/data/MarkdownEditor.js +2 -2
  60. package/dist/data/MarkdownEditor.js.map +1 -1
  61. package/dist/data/TreeNode.cjs +1 -1
  62. package/dist/data/TreeNode.cjs.map +1 -1
  63. package/dist/data/TreeNode.d.ts.map +1 -1
  64. package/dist/data/TreeNode.js +1 -1
  65. package/dist/data/TreeNode.js.map +1 -1
  66. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  67. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  69. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  70. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  71. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  72. package/dist/data/ai/ChatButton.cjs +2 -0
  73. package/dist/data/ai/ChatButton.cjs.map +1 -1
  74. package/dist/data/ai/ChatButton.d.ts +1 -1
  75. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  76. package/dist/data/ai/ChatButton.js +2 -0
  77. package/dist/data/ai/ChatButton.js.map +1 -1
  78. package/dist/data/ai/ChatFab.cjs +5 -1
  79. package/dist/data/ai/ChatFab.cjs.map +1 -1
  80. package/dist/data/ai/ChatFab.d.ts +5 -1
  81. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  82. package/dist/data/ai/ChatFab.js +5 -1
  83. package/dist/data/ai/ChatFab.js.map +1 -1
  84. package/dist/data/ai/ChatWindow.cjs +2 -8
  85. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  86. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  87. package/dist/data/ai/ChatWindow.js +2 -8
  88. package/dist/data/ai/ChatWindow.js.map +1 -1
  89. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  90. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  91. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  92. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  93. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  94. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  95. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  96. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  97. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  98. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  99. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  100. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  101. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  102. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  103. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  104. package/dist/data/ai/SessionViewer.cjs +13 -4
  105. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  106. package/dist/data/ai/SessionViewer.d.ts +5 -1
  107. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  108. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  109. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  110. package/dist/data/ai/SessionViewer.header.js +1 -1
  111. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  112. package/dist/data/ai/SessionViewer.js +13 -4
  113. package/dist/data/ai/SessionViewer.js.map +1 -1
  114. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  115. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  116. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  117. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.model.js +2 -0
  119. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  121. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  123. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.rows.js +41 -27
  125. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  127. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  128. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  129. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  130. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  131. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  132. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  133. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  134. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  135. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  136. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  137. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  138. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  139. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  140. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  141. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  142. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  143. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  144. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  146. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  148. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  152. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  153. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  154. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  155. package/dist/data/ai/SessionViewerMenu.js +18 -1
  156. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  157. package/dist/data/ai/ToolPreferences.cjs +149 -143
  158. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  159. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  160. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  161. package/dist/data/ai/ToolPreferences.js +151 -146
  162. package/dist/data/ai/ToolPreferences.js.map +1 -1
  163. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  164. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  165. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  166. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  167. package/dist/data/ai/ToolPreferences.model.js +15 -11
  168. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  169. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  170. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  171. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  172. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  173. package/dist/data/ai/ToolPreferencesList.js +2 -1
  174. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  175. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  176. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  177. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  178. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  179. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  180. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  181. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  182. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  183. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  184. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  185. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  186. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  187. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  188. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  189. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  190. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  191. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  192. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  193. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  194. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  195. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  196. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  197. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  198. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  199. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  200. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  201. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  202. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  203. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  204. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  205. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  206. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  207. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  208. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  209. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  210. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  211. package/dist/data/ai/index.d.ts +2 -2
  212. package/dist/data/ai/index.d.ts.map +1 -1
  213. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  214. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  215. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  216. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  217. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  218. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  219. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  220. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  221. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  222. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  223. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  224. package/dist/data/ai/use-session-token-sizing.js +73 -0
  225. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  226. package/dist/data/call-graph/CallGraph.cjs +269 -0
  227. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  228. package/dist/data/call-graph/CallGraph.d.ts +78 -0
  229. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  230. package/dist/data/call-graph/CallGraph.js +269 -0
  231. package/dist/data/call-graph/CallGraph.js.map +1 -0
  232. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  233. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  234. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  235. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  236. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  237. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  238. package/dist/data/call-graph/CallGraphMembers.cjs +51 -0
  239. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  240. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  241. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  242. package/dist/data/call-graph/CallGraphMembers.js +51 -0
  243. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  244. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  245. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  246. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  247. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  248. package/dist/data/call-graph/CallGraphParts.js +204 -0
  249. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  250. package/dist/data/call-graph/CallGraphToolbar.cjs +198 -0
  251. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  252. package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
  253. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  254. package/dist/data/call-graph/CallGraphToolbar.js +198 -0
  255. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  256. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  257. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  258. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  259. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  260. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  261. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  262. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  263. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  264. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  265. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  266. package/dist/data/call-graph/call-graph-labels.js +96 -0
  267. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  268. package/dist/data/call-graph/call-graph-model.cjs +312 -0
  269. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  270. package/dist/data/call-graph/call-graph-model.d.ts +138 -0
  271. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  272. package/dist/data/call-graph/call-graph-model.js +312 -0
  273. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  274. package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
  275. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  276. package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
  277. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  278. package/dist/data/call-graph/call-graph-vocabulary.js +195 -0
  279. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  280. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  281. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  282. package/dist/data/call-graph/index.d.ts +7 -0
  283. package/dist/data/call-graph/index.d.ts.map +1 -0
  284. package/dist/data/call-graph/types.cjs +5 -0
  285. package/dist/data/call-graph/types.cjs.map +1 -0
  286. package/dist/data/call-graph/types.d.ts +140 -0
  287. package/dist/data/call-graph/types.d.ts.map +1 -0
  288. package/dist/data/call-graph/types.js +5 -0
  289. package/dist/data/call-graph/types.js.map +1 -0
  290. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  291. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  292. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  293. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  294. package/dist/data/call-graph/use-call-graph.js +93 -0
  295. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  296. package/dist/data/chat/Chat.cjs +39 -15
  297. package/dist/data/chat/Chat.cjs.map +1 -1
  298. package/dist/data/chat/Chat.d.ts.map +1 -1
  299. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  300. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  301. package/dist/data/chat/Chat.fixtures.js +2 -2
  302. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  303. package/dist/data/chat/Chat.js +40 -16
  304. package/dist/data/chat/Chat.js.map +1 -1
  305. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  306. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  307. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  308. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  309. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  310. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  311. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  312. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  313. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  314. package/dist/data/chat/ContextMeter.bar.js +5 -8
  315. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  316. package/dist/data/chat/ContextMeter.cjs +18 -19
  317. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  318. package/dist/data/chat/ContextMeter.d.ts +1 -1
  319. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  320. package/dist/data/chat/ContextMeter.js +18 -19
  321. package/dist/data/chat/ContextMeter.js.map +1 -1
  322. package/dist/data/chat/Conversation.cjs +2 -1
  323. package/dist/data/chat/Conversation.cjs.map +1 -1
  324. package/dist/data/chat/Conversation.d.ts +4 -1
  325. package/dist/data/chat/Conversation.d.ts.map +1 -1
  326. package/dist/data/chat/Conversation.js +2 -1
  327. package/dist/data/chat/Conversation.js.map +1 -1
  328. package/dist/data/chat/Message.cjs +39 -12
  329. package/dist/data/chat/Message.cjs.map +1 -1
  330. package/dist/data/chat/Message.d.ts +1 -1
  331. package/dist/data/chat/Message.d.ts.map +1 -1
  332. package/dist/data/chat/Message.js +40 -13
  333. package/dist/data/chat/Message.js.map +1 -1
  334. package/dist/data/chat/ToolCall.cjs +60 -5
  335. package/dist/data/chat/ToolCall.cjs.map +1 -1
  336. package/dist/data/chat/ToolCall.d.ts +7 -2
  337. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  338. package/dist/data/chat/ToolCall.js +60 -5
  339. package/dist/data/chat/ToolCall.js.map +1 -1
  340. package/dist/data/chat/approval.cjs.map +1 -1
  341. package/dist/data/chat/approval.d.ts +2 -2
  342. package/dist/data/chat/approval.d.ts.map +1 -1
  343. package/dist/data/chat/approval.js.map +1 -1
  344. package/dist/data/chat/tool-policy.cjs +59 -2
  345. package/dist/data/chat/tool-policy.cjs.map +1 -1
  346. package/dist/data/chat/tool-policy.d.ts +9 -0
  347. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  348. package/dist/data/chat/tool-policy.js +59 -2
  349. package/dist/data/chat/tool-policy.js.map +1 -1
  350. package/dist/data/chat/types.cjs +6 -0
  351. package/dist/data/chat/types.cjs.map +1 -1
  352. package/dist/data/chat/types.d.ts +13 -4
  353. package/dist/data/chat/types.d.ts.map +1 -1
  354. package/dist/data/chat/types.js +7 -1
  355. package/dist/data/chat/types.js.map +1 -1
  356. package/dist/data/chat/usage-snapshot.cjs +11 -6
  357. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  358. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  359. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  360. package/dist/data/chat/usage-snapshot.js +11 -6
  361. package/dist/data/chat/usage-snapshot.js.map +1 -1
  362. package/dist/data/data-access.cjs +8 -0
  363. package/dist/data/data-access.cjs.map +1 -0
  364. package/dist/data/data-access.d.ts +5 -0
  365. package/dist/data/data-access.d.ts.map +1 -0
  366. package/dist/data/data-access.js +8 -0
  367. package/dist/data/data-access.js.map +1 -0
  368. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  369. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  370. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  371. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  372. package/dist/data/git/GitChangeList.cjs +6 -2
  373. package/dist/data/git/GitChangeList.cjs.map +1 -1
  374. package/dist/data/git/GitChangeList.d.ts +6 -1
  375. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  376. package/dist/data/git/GitChangeList.js +6 -2
  377. package/dist/data/git/GitChangeList.js.map +1 -1
  378. package/dist/data/graph-columns-layout.cjs +61 -14
  379. package/dist/data/graph-columns-layout.cjs.map +1 -1
  380. package/dist/data/graph-columns-layout.d.ts +42 -0
  381. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  382. package/dist/data/graph-columns-layout.js +61 -14
  383. package/dist/data/graph-columns-layout.js.map +1 -1
  384. package/dist/data/graph-diagram-model.cjs +5 -0
  385. package/dist/data/graph-diagram-model.cjs.map +1 -1
  386. package/dist/data/graph-diagram-model.d.ts +24 -0
  387. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  388. package/dist/data/graph-diagram-model.js +5 -0
  389. package/dist/data/graph-diagram-model.js.map +1 -1
  390. package/dist/data/graph-edge-routing.cjs +9 -3
  391. package/dist/data/graph-edge-routing.cjs.map +1 -1
  392. package/dist/data/graph-edge-routing.d.ts +2 -0
  393. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  394. package/dist/data/graph-edge-routing.js +9 -3
  395. package/dist/data/graph-edge-routing.js.map +1 -1
  396. package/dist/data/graph-group-window.cjs +60 -0
  397. package/dist/data/graph-group-window.cjs.map +1 -0
  398. package/dist/data/graph-group-window.d.ts +33 -0
  399. package/dist/data/graph-group-window.d.ts.map +1 -0
  400. package/dist/data/graph-group-window.js +60 -0
  401. package/dist/data/graph-group-window.js.map +1 -0
  402. package/dist/data/json-view/JsonSource.cjs +84 -0
  403. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  404. package/dist/data/json-view/JsonSource.d.ts +7 -0
  405. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  406. package/dist/data/json-view/JsonSource.js +84 -0
  407. package/dist/data/json-view/JsonSource.js.map +1 -0
  408. package/dist/data/json-view/parse-prefix.cjs +132 -0
  409. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  410. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  411. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  412. package/dist/data/json-view/parse-prefix.js +132 -0
  413. package/dist/data/json-view/parse-prefix.js.map +1 -0
  414. package/dist/data/json-view/parse-source.cjs +62 -0
  415. package/dist/data/json-view/parse-source.cjs.map +1 -0
  416. package/dist/data/json-view/parse-source.d.ts +16 -0
  417. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  418. package/dist/data/json-view/parse-source.js +62 -0
  419. package/dist/data/json-view/parse-source.js.map +1 -0
  420. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  421. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  422. package/dist/data/json-view/types.d.ts +14 -0
  423. package/dist/data/json-view/types.d.ts.map +1 -0
  424. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  425. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  426. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  427. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  429. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  430. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  431. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  432. package/dist/data/runtime/RuntimeBar.js +2 -5
  433. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  434. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  435. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  436. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  437. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  438. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  439. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  440. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  441. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  442. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  443. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  444. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  445. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  446. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  447. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  448. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  449. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  450. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  451. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  452. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  453. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  454. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  455. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  456. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  457. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  458. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  459. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  460. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  461. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  462. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  463. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  464. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  465. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  466. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  467. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  468. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  469. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  470. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  471. package/dist/data/use-group-windows.cjs +50 -0
  472. package/dist/data/use-group-windows.cjs.map +1 -0
  473. package/dist/data/use-group-windows.d.ts +27 -0
  474. package/dist/data/use-group-windows.d.ts.map +1 -0
  475. package/dist/data/use-group-windows.js +50 -0
  476. package/dist/data/use-group-windows.js.map +1 -0
  477. package/dist/data/use-pan-zoom.cjs +23 -10
  478. package/dist/data/use-pan-zoom.cjs.map +1 -1
  479. package/dist/data/use-pan-zoom.d.ts +16 -2
  480. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  481. package/dist/data/use-pan-zoom.js +23 -10
  482. package/dist/data/use-pan-zoom.js.map +1 -1
  483. package/dist/data/version-info.cjs +3 -3
  484. package/dist/data/version-info.js +3 -3
  485. package/dist/data.cjs +36 -2
  486. package/dist/data.cjs.map +1 -1
  487. package/dist/data.d.ts +5 -2
  488. package/dist/data.d.ts.map +1 -1
  489. package/dist/data.js +35 -1
  490. package/dist/data.js.map +1 -1
  491. package/dist/hooks/event-hub.cjs +229 -0
  492. package/dist/hooks/event-hub.cjs.map +1 -0
  493. package/dist/hooks/event-hub.d.ts +26 -0
  494. package/dist/hooks/event-hub.d.ts.map +1 -0
  495. package/dist/hooks/event-hub.js +229 -0
  496. package/dist/hooks/event-hub.js.map +1 -0
  497. package/dist/hooks.cjs +2 -0
  498. package/dist/hooks.cjs.map +1 -1
  499. package/dist/hooks.d.ts +1 -0
  500. package/dist/hooks.d.ts.map +1 -1
  501. package/dist/hooks.js +2 -0
  502. package/dist/hooks.js.map +1 -1
  503. package/dist/index.cjs +40 -4
  504. package/dist/index.cjs.map +1 -1
  505. package/dist/index.js +37 -1
  506. package/dist/index.js.map +1 -1
  507. package/dist/layout/Workspace.cjs +13 -4
  508. package/dist/layout/Workspace.cjs.map +1 -1
  509. package/dist/layout/Workspace.d.ts +7 -2
  510. package/dist/layout/Workspace.d.ts.map +1 -1
  511. package/dist/layout/Workspace.js +13 -4
  512. package/dist/layout/Workspace.js.map +1 -1
  513. package/dist/lib/permission-strategies.cjs +71 -11
  514. package/dist/lib/permission-strategies.cjs.map +1 -1
  515. package/dist/lib/permission-strategies.d.ts +3 -0
  516. package/dist/lib/permission-strategies.d.ts.map +1 -1
  517. package/dist/lib/permission-strategies.js +71 -11
  518. package/dist/lib/permission-strategies.js.map +1 -1
  519. package/dist/overlay/modalStack.cjs +13 -6
  520. package/dist/overlay/modalStack.cjs.map +1 -1
  521. package/dist/overlay/modalStack.d.ts.map +1 -1
  522. package/dist/overlay/modalStack.js +13 -6
  523. package/dist/overlay/modalStack.js.map +1 -1
  524. package/dist/styles.css +1 -1
  525. package/package.json +5 -3
  526. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  527. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  528. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  529. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  530. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  531. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  532. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  533. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  534. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  535. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  536. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  537. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../../lib/utils.js";
3
3
  import { Icon } from "../Icon.js";
4
+ import { ModeBadge } from "./ToolPreferencesList.js";
4
5
  import { UiChevronDown } from "../../icons/components/UiChevronDown.js";
5
6
  import { UiChevronRight } from "../../icons/components/UiChevronRight.js";
6
7
  function ToolDirectoryHeader({
@@ -8,8 +9,9 @@ function ToolDirectoryHeader({
8
9
  count,
9
10
  open,
10
11
  variant,
12
+ mode,
11
13
  onToggle,
12
- onAdd
14
+ onCycle
13
15
  }) {
14
16
  return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-stretch", children: [
15
17
  /* @__PURE__ */ jsx(
@@ -22,30 +24,24 @@ function ToolDirectoryHeader({
22
24
  "flex shrink-0 items-center pl-2 text-muted-foreground hover:bg-muted",
23
25
  variant === "child" && "text-foreground/80 hover:bg-accent/50"
24
26
  ),
25
- children: /* @__PURE__ */ jsx(
26
- Icon,
27
- {
28
- icon: open ? UiChevronDown : UiChevronRight,
29
- className: "size-3"
30
- }
31
- )
27
+ children: /* @__PURE__ */ jsx(Icon, { icon: open ? UiChevronDown : UiChevronRight, className: "size-3" })
32
28
  }
33
29
  ),
34
30
  /* @__PURE__ */ jsxs(
35
31
  "button",
36
32
  {
37
33
  type: "button",
38
- "aria-label": `${label} ${count}${onAdd ? " · Add strategy" : ""}`,
39
- title: onAdd ? `Add an Ask strategy for ${label}` : void 0,
40
- onClick: onAdd ?? onToggle,
34
+ "aria-label": onCycle ? `Toggle ${label} group` : `${label} ${count}`,
35
+ title: onCycle ? `Cycle all ${count} tools in ${label}` : void 0,
36
+ onClick: onCycle ?? onToggle,
41
37
  className: cn(
42
38
  "flex min-w-0 flex-1 items-center gap-1 pr-2 text-left text-muted-foreground hover:bg-muted",
43
39
  variant === "section" ? "py-1 text-[10px] font-semibold uppercase tracking-wider" : "py-1 text-[11px] font-medium text-foreground/80 hover:bg-accent/50"
44
40
  ),
45
41
  children: [
46
42
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: label }),
47
- onAdd && /* @__PURE__ */ jsx("span", { className: "text-[9px] font-semibold normal-case tracking-normal text-muted-foreground/70", children: "Add" }),
48
- /* @__PURE__ */ jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground/70", children: count })
43
+ /* @__PURE__ */ jsx("span", { className: "tabular-nums text-[10px] text-muted-foreground/70", children: count }),
44
+ mode && /* @__PURE__ */ jsx(ModeBadge, { mode })
49
45
  ]
50
46
  }
51
47
  )
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.directory-header.js","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":[],"mappings":";;;;;AAIO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,QACpD,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA,YAAY,WAAW;AAAA,QAAA;AAAA,QAGzB,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,OAAO,gBAAgB;AAAA,YAC7B,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA;AAAA,IAEF;AAAA,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,WAAW;AAAA,UACT;AAAA,UACA,YAAY,YACR,4DACA;AAAA,QAAA;AAAA,QAGN,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,OAAM;AAAA,UAChD,SACC,oBAAC,QAAA,EAAK,WAAU,iFAAgF,UAAA,OAEhG;AAAA,UAEF,oBAAC,QAAA,EAAK,WAAU,qDACb,UAAA,MAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;"}
1
+ {"version":3,"file":"ToolSchemaBrowser.directory-header.js","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":[],"mappings":";;;;;;AAMO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAG,OAAO,aAAa,QAAQ,IAAI,KAAK;AAAA,QACpD,SAAS;AAAA,QACT,WAAW;AAAA,UACT;AAAA,UACA,YAAY,WAAW;AAAA,QAAA;AAAA,QAGzB,8BAAC,MAAA,EAAK,MAAM,OAAO,gBAAgB,gBAAgB,WAAU,SAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAExE;AAAA,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,WAAW;AAAA,UACT;AAAA,UACA,YAAY,YACR,4DACA;AAAA,QAAA;AAAA,QAGN,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,2BAA2B,UAAA,OAAM;AAAA,UACjD,oBAAC,QAAA,EAAK,WAAU,qDACb,UAAA,OACH;AAAA,UACC,QAAQ,oBAAC,WAAA,EAAU,KAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAClC,GACF;AAEJ;"}
@@ -1,15 +1,17 @@
1
- import { jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useMemo } from "react";
3
- import { useListMenuSelection } from "../../components/use-list-menu-selection.js";
4
3
  import { SplitPane } from "../../layout/SplitPane.js";
5
4
  import { cn } from "../../lib/utils.js";
6
5
  import { ToolSchemaBrowserDetail } from "./ToolSchemaBrowser.detail.js";
7
6
  import { EMPTY_TOOL_HINT_FILTERS, filterToolSchemaBrowserTools, buildToolSchemaSections } from "./ToolSchemaBrowser.model.js";
8
7
  import { ToolSchemaBrowserSidebar } from "./ToolSchemaBrowser.sidebar.js";
8
+ import { ToolPermissionStrategies } from "./ToolSchemaBrowser.strategies.js";
9
9
  function ToolSchemaBrowser({
10
10
  tools,
11
11
  value,
12
12
  onRule,
13
+ rules,
14
+ onRulesChange,
13
15
  className
14
16
  }) {
15
17
  var _a;
@@ -23,9 +25,6 @@ function ToolSchemaBrowser({
23
25
  const [selected, setSelected] = useState(
24
26
  ((_a = tools[0]) == null ? void 0 : _a.name) ?? null
25
27
  );
26
- const selection = useListMenuSelection({
27
- keys: tools.map((tool) => tool.name)
28
- });
29
28
  const filtered = useMemo(
30
29
  () => filterToolSchemaBrowserTools(tools, query, filters),
31
30
  [filters, query, tools]
@@ -47,55 +46,55 @@ function ToolSchemaBrowser({
47
46
  ...current,
48
47
  [key]: value2
49
48
  }));
50
- return /* @__PURE__ */ jsx(
51
- "div",
52
- {
53
- className: cn(
54
- "min-h-0 overflow-hidden rounded-md border border-border bg-background",
55
- className
56
- ),
57
- children: /* @__PURE__ */ jsx(
58
- SplitPane,
59
- {
60
- defaultSplit: 34,
61
- minLeft: 24,
62
- minRight: 42,
63
- className: "min-h-0",
64
- leftClass: "flex min-h-0 flex-col overflow-hidden",
65
- rightClass: "min-h-0 overflow-y-auto",
66
- left: /* @__PURE__ */ jsx(
67
- ToolSchemaBrowserSidebar,
68
- {
69
- query,
70
- view,
71
- filters,
72
- sections,
73
- active,
74
- filteredCount: filtered.length,
75
- isOpen,
76
- value,
77
- onRule,
78
- onQueryChange: setQuery,
79
- onViewChange: setView,
80
- onFilterChange: updateFilter,
81
- onClearFilters: () => setFilters({ ...EMPTY_TOOL_HINT_FILTERS }),
82
- onToggle: toggle,
83
- onSelect: setSelected,
84
- ...onRule ? { selection } : {}
85
- }
86
- ),
87
- right: active ? /* @__PURE__ */ jsx(
88
- ToolSchemaBrowserDetail,
89
- {
90
- tool: active,
91
- tab,
92
- onTabChange: setTab
93
- }
94
- ) : /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: "No tools" })
95
- }
96
- )
97
- }
98
- );
49
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex min-h-0 flex-col gap-2", className), children: [
50
+ rules && onRulesChange && /* @__PURE__ */ jsx(
51
+ ToolPermissionStrategies,
52
+ {
53
+ rules,
54
+ tools,
55
+ onRulesChange
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-hidden rounded-md border border-border bg-background", children: /* @__PURE__ */ jsx(
59
+ SplitPane,
60
+ {
61
+ defaultSplit: 34,
62
+ minLeft: 24,
63
+ minRight: 42,
64
+ className: "min-h-0",
65
+ leftClass: "flex min-h-0 flex-col overflow-hidden",
66
+ rightClass: "min-h-0 overflow-y-auto",
67
+ left: /* @__PURE__ */ jsx(
68
+ ToolSchemaBrowserSidebar,
69
+ {
70
+ query,
71
+ view,
72
+ filters,
73
+ sections,
74
+ active,
75
+ filteredCount: filtered.length,
76
+ isOpen,
77
+ value,
78
+ onRule,
79
+ onQueryChange: setQuery,
80
+ onViewChange: setView,
81
+ onFilterChange: updateFilter,
82
+ onClearFilters: () => setFilters({ ...EMPTY_TOOL_HINT_FILTERS }),
83
+ onToggle: toggle,
84
+ onSelect: setSelected
85
+ }
86
+ ),
87
+ right: active ? /* @__PURE__ */ jsx(
88
+ ToolSchemaBrowserDetail,
89
+ {
90
+ tool: active,
91
+ tab,
92
+ onTabChange: setTab
93
+ }
94
+ ) : /* @__PURE__ */ jsx("div", { className: "px-3 py-8 text-center text-xs text-muted-foreground", children: "No tools" })
95
+ }
96
+ ) })
97
+ ] });
99
98
  }
100
99
  export {
101
100
  ToolSchemaBrowser
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.js","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":["value"],"mappings":";;;;;;;;AA4BO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAA6B,OAAO;AAC5D,QAAM,CAAC,KAAK,MAAM,IAAI,SAA+B,QAAQ;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAC5B;AAAA,EAAA;AAEF,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,MAAM,oBAAI,KAAK;AACvE,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,MAC9B,WAAM,CAAC,MAAP,mBAAU,SAAQ;AAAA,EAAA;AAEpB,QAAM,YAAY,qBAAqB;AAAA,IACrC,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,EAAA,CACpC;AAED,QAAM,WAAW;AAAA,IACf,MAAM,6BAA6B,OAAO,OAAO,OAAO;AAAA,IACxD,CAAC,SAAS,OAAO,KAAK;AAAA,EAAA;AAExB,QAAM,YACJ,MAAM,KAAA,EAAO,SAAS,KACtB,OAAO,OAAO,OAAO,EAAE,KAAK,CAACA,WAAUA,WAAU,KAAK;AACxD,QAAM,SACJ,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAAK,SAAS,CAAC,KAAK,MAAM,CAAC;AAC3E,QAAM,WAAW;AAAA,IACf,MAAM,wBAAwB,UAAU,IAAI;AAAA,IAC5C,CAAC,UAAU,IAAI;AAAA,EAAA;AAGjB,QAAM,SAAS,CAAC,QACd,aAAa,CAAC,aAAa;AACzB,UAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,QAC7B,MAAK,IAAI,GAAG;AACjB,WAAO;AAAA,EACT,CAAC;AACH,QAAM,SAAS,CAAC,QAAgB,aAAa,CAAC,UAAU,IAAI,GAAG;AAC/D,QAAM,eAAe,CAAC,KAAkBA,WACtC,WAAW,CAAC,aAAa;AAAA,IACvB,GAAG;AAAA,IACH,CAAC,GAAG,GAAGA;AAAAA,EAAA,EACP;AAEJ,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAc;AAAA,UACd,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAU;AAAA,UACV,WAAU;AAAA,UACV,YAAW;AAAA,UACX,MACE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAe,SAAS;AAAA,cACxB;AAAA,cACA;AAAA,cACA;AAAA,cACA,eAAe;AAAA,cACf,cAAc;AAAA,cACd,gBAAgB;AAAA,cAChB,gBAAgB,MAAM,WAAW,EAAE,GAAG,yBAAyB;AAAA,cAC/D,UAAU;AAAA,cACV,UAAU;AAAA,cACT,GAAI,SAAS,EAAE,cAAc,CAAA;AAAA,YAAC;AAAA,UAAA;AAAA,UAGnC,OACE,SACE;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM;AAAA,cACN;AAAA,cACA,aAAa;AAAA,YAAA;AAAA,UAAA,IAGf,oBAAC,OAAA,EAAI,WAAU,uDAAsD,UAAA,WAAA,CAErE;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"ToolSchemaBrowser.js","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":["value"],"mappings":";;;;;;;;AA+BO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,MAAM,OAAO,IAAI,SAA6B,OAAO;AAC5D,QAAM,CAAC,KAAK,MAAM,IAAI,SAA+B,QAAQ;AAC7D,QAAM,CAAC,SAAS,UAAU,IAAI;AAAA,IAC5B;AAAA,EAAA;AAEF,QAAM,CAAC,WAAW,YAAY,IAAI,SAAsB,MAAM,oBAAI,KAAK;AACvE,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,MAC9B,WAAM,CAAC,MAAP,mBAAU,SAAQ;AAAA,EAAA;AAGpB,QAAM,WAAW;AAAA,IACf,MAAM,6BAA6B,OAAO,OAAO,OAAO;AAAA,IACxD,CAAC,SAAS,OAAO,KAAK;AAAA,EAAA;AAExB,QAAM,YACJ,MAAM,KAAA,EAAO,SAAS,KACtB,OAAO,OAAO,OAAO,EAAE,KAAK,CAACA,WAAUA,WAAU,KAAK;AACxD,QAAM,SACJ,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,KAAK,SAAS,CAAC,KAAK,MAAM,CAAC;AAC3E,QAAM,WAAW;AAAA,IACf,MAAM,wBAAwB,UAAU,IAAI;AAAA,IAC5C,CAAC,UAAU,IAAI;AAAA,EAAA;AAGjB,QAAM,SAAS,CAAC,QACd,aAAa,CAAC,aAAa;AACzB,UAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,QAC7B,MAAK,IAAI,GAAG;AACjB,WAAO;AAAA,EACT,CAAC;AACH,QAAM,SAAS,CAAC,QAAgB,aAAa,CAAC,UAAU,IAAI,GAAG;AAC/D,QAAM,eAAe,CAAC,KAAkBA,WACtC,WAAW,CAAC,aAAa;AAAA,IACvB,GAAG;AAAA,IACH,CAAC,GAAG,GAAGA;AAAAA,EAAA,EACP;AAEJ,8BACG,OAAA,EAAI,WAAW,GAAG,+BAA+B,SAAS,GACxD,UAAA;AAAA,IAAA,SAAS,iBACR;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJ,oBAAC,OAAA,EAAI,WAAU,gFACb,UAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAc;AAAA,QACd,SAAS;AAAA,QACT,UAAU;AAAA,QACV,WAAU;AAAA,QACV,WAAU;AAAA,QACV,YAAW;AAAA,QACX,MACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe,SAAS;AAAA,YACxB;AAAA,YACA;AAAA,YACA;AAAA,YACA,eAAe;AAAA,YACf,cAAc;AAAA,YACd,gBAAgB;AAAA,YAChB,gBAAgB,MAAM,WAAW,EAAE,GAAG,yBAAyB;AAAA,YAC/D,UAAU;AAAA,YACV,UAAU;AAAA,UAAA;AAAA,QAAA;AAAA,QAGd,OACE,SACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN;AAAA,YACA,aAAa;AAAA,UAAA;AAAA,QAAA,IAGf,oBAAC,OAAA,EAAI,WAAU,uDAAsD,UAAA,WAAA,CAErE;AAAA,MAAA;AAAA,IAAA,EAGN,CACF;AAAA,EAAA,GACF;AAEJ;"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const ToolPreferences_model = require("./ToolPreferences.model.cjs");
3
4
  const TOOL_HINTS = [
4
5
  { key: "readOnlyHint", label: "Read only" },
5
6
  { key: "destructiveHint", label: "Destructive" },
@@ -85,46 +86,37 @@ function buildToolSchemaSections(tools, view) {
85
86
  function directoryPermissionRule({
86
87
  tools,
87
88
  view,
88
- depth
89
+ depth,
90
+ policy
89
91
  }) {
90
92
  const group = singleDirectoryValue(tools, "group");
91
93
  const parent = singleDirectoryValue(tools, "parent");
92
- const outer = view === "group" ? group : parent;
93
- const inner = view === "group" ? parent : group;
94
- if (!outer || depth === "child" && !inner) {
95
- return { name: tools.map((tool) => tool.name).sort(), policy: "ask" };
94
+ const facets = depth === "section" ? view === "group" ? { group } : { parent } : { group, parent };
95
+ if (!facets.group && !facets.parent || depth === "child" && (!group || !parent)) {
96
+ return { name: tools.map((tool) => tool.name).sort(), policy };
96
97
  }
97
- if (depth === "child") {
98
- if (!inner) throw new Error("Child tool directory has no metadata value");
99
- return view === "group" ? { group: outer, parent: inner, policy: "ask" } : { parent: outer, group: inner, policy: "ask" };
100
- }
101
- return view === "group" ? { group: outer, policy: "ask" } : { parent: outer, policy: "ask" };
98
+ return {
99
+ ...facets.group ? { group: facets.group } : {},
100
+ ...facets.parent ? { parent: facets.parent } : {},
101
+ policy
102
+ };
102
103
  }
103
104
  function singleDirectoryValue(tools, key) {
104
- const values = new Set(tools.map((tool) => tool[key]).filter(Boolean));
105
- return values.size === 1 ? [...values][0] : void 0;
106
- }
107
- function updateSelectedTools(selected, visible) {
108
- const next = new Set(selected);
109
- const allVisibleSelected = visible.length > 0 && visible.every((name) => next.has(name));
110
- for (const name of visible) {
111
- if (allVisibleSelected) next.delete(name);
112
- else next.add(name);
113
- }
114
- return [...next];
105
+ var _a;
106
+ const value = (_a = tools[0]) == null ? void 0 : _a[key];
107
+ return value && tools.every((tool) => tool[key] === value) ? value : void 0;
115
108
  }
116
- function selectedToolState(selected, visible) {
117
- const count = visible.filter((name) => selected.has(name)).length;
109
+ function directoryPolicyToggle(tools, value) {
110
+ const entries = tools.map(ToolPreferences_model.toolEntry);
118
111
  return {
119
- checked: visible.length > 0 && count === visible.length,
120
- mixed: count > 0 && count < visible.length
112
+ badge: ToolPreferences_model.commonMode(entries, value),
113
+ next: ToolPreferences_model.nextMode(ToolPreferences_model.groupToolPolicy(entries, value))
121
114
  };
122
115
  }
123
116
  exports.EMPTY_TOOL_HINT_FILTERS = EMPTY_TOOL_HINT_FILTERS;
124
117
  exports.TOOL_HINTS = TOOL_HINTS;
125
118
  exports.buildToolSchemaSections = buildToolSchemaSections;
126
119
  exports.directoryPermissionRule = directoryPermissionRule;
120
+ exports.directoryPolicyToggle = directoryPolicyToggle;
127
121
  exports.filterToolSchemaBrowserTools = filterToolSchemaBrowserTools;
128
- exports.selectedToolState = selectedToolState;
129
- exports.updateSelectedTools = updateSelectedTools;
130
122
  //# sourceMappingURL=ToolSchemaBrowser.model.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.model.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"sourcesContent":["import type { PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta } from \"../chat/types\";\n\nexport type ToolSchemaViewMode = \"group\" | \"tree\";\nexport type ToolSchemaBrowserTab = \"schema\" | \"json\";\nexport type ToolHintKey =\n | \"readOnlyHint\"\n | \"destructiveHint\"\n | \"idempotentHint\"\n | \"openWorldHint\";\nexport type ToolHintFilter = \"any\" | \"yes\" | \"no\";\nexport type ToolHintFilters = Record<ToolHintKey, ToolHintFilter>;\n\nexport type ToolSection = {\n label: string;\n count: number;\n children: Array<{ label: string; tools: ToolMeta[] }>;\n};\n\nexport const TOOL_HINTS: Array<{ key: ToolHintKey; label: string }> = [\n { key: \"readOnlyHint\", label: \"Read only\" },\n { key: \"destructiveHint\", label: \"Destructive\" },\n { key: \"idempotentHint\", label: \"Idempotent\" },\n { key: \"openWorldHint\", label: \"Open world\" },\n];\n\nexport const EMPTY_TOOL_HINT_FILTERS: ToolHintFilters = {\n readOnlyHint: \"any\",\n destructiveHint: \"any\",\n idempotentHint: \"any\",\n openWorldHint: \"any\",\n};\n\nconst NO_GROUP = \"Tools\";\nconst NO_PARENT = \"General\";\n\nexport function cycleToolHintFilter(value: ToolHintFilter): ToolHintFilter {\n if (value === \"any\") return \"yes\";\n if (value === \"yes\") return \"no\";\n return \"any\";\n}\n\nexport function toolHintFilterLabel(value: ToolHintFilter): string {\n if (value === \"yes\") return \"Yes\";\n if (value === \"no\") return \"No\";\n return \"Any\";\n}\n\nexport function filterToolSchemaBrowserTools(\n tools: ToolMeta[],\n query: string,\n filters: ToolHintFilters,\n): ToolMeta[] {\n const q = query.trim().toLowerCase();\n return tools.filter((tool) => {\n if (!matchesHintFilters(tool, filters)) return false;\n if (!q) return true;\n return [\n tool.name,\n tool.label,\n tool.title,\n tool.description,\n tool.group,\n tool.parent,\n tool.entity,\n tool.icon,\n tool.defaultPermission,\n tool.source,\n tool.server,\n ...annotationSearchText(tool),\n ...(tool.hints ?? []),\n ]\n .filter(Boolean)\n .some((value) => String(value).toLowerCase().includes(q));\n });\n}\n\nfunction matchesHintFilters(tool: ToolMeta, filters: ToolHintFilters): boolean {\n return TOOL_HINTS.every(({ key }) => {\n const filter = filters[key];\n if (filter === \"any\") return true;\n const value = tool.annotations?.[key];\n return filter === \"yes\" ? value === true : value !== true;\n });\n}\n\nfunction annotationSearchText(tool: ToolMeta): string[] {\n if (!tool.annotations) return [];\n return Object.entries(tool.annotations)\n .flatMap(([key, value]) => [key, primitiveAnnotationText(value)])\n .filter((value): value is string => Boolean(value));\n}\n\nfunction primitiveAnnotationText(value: unknown): string | undefined {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return undefined;\n}\n\nexport function buildToolSchemaSections(\n tools: ToolMeta[],\n view: ToolSchemaViewMode,\n): ToolSection[] {\n const outerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.group || NO_GROUP : tool.parent || NO_PARENT;\n const innerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.parent || NO_PARENT : tool.group || NO_GROUP;\n\n const outer = new Map<string, Map<string, ToolMeta[]>>();\n for (const tool of tools) {\n const outerKey = outerOf(tool);\n const innerKey = innerOf(tool);\n const inner = outer.get(outerKey) ?? new Map<string, ToolMeta[]>();\n const bucket = inner.get(innerKey) ?? [];\n bucket.push(tool);\n inner.set(innerKey, bucket);\n outer.set(outerKey, inner);\n }\n\n return [...outer.entries()]\n .map(([label, inner]) => {\n const children = [...inner.entries()]\n .map(([childLabel, childTools]) => ({\n label: childLabel,\n tools: [...childTools].sort((a, b) =>\n (a.label || a.name).localeCompare(b.label || b.name),\n ),\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n return {\n label,\n count: children.reduce((sum, child) => sum + child.tools.length, 0),\n children,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n}\n\nexport function directoryPermissionRule({\n tools,\n view,\n depth,\n}: {\n tools: ToolMeta[];\n view: ToolSchemaViewMode;\n depth: \"section\" | \"child\";\n}): PermissionRule {\n const group = singleDirectoryValue(tools, \"group\");\n const parent = singleDirectoryValue(tools, \"parent\");\n const outer = view === \"group\" ? group : parent;\n const inner = view === \"group\" ? parent : group;\n if (!outer || (depth === \"child\" && !inner)) {\n return { name: tools.map((tool) => tool.name).sort(), policy: \"ask\" };\n }\n if (depth === \"child\") {\n if (!inner) throw new Error(\"Child tool directory has no metadata value\");\n return view === \"group\"\n ? { group: outer, parent: inner, policy: \"ask\" }\n : { parent: outer, group: inner, policy: \"ask\" };\n }\n return view === \"group\"\n ? { group: outer, policy: \"ask\" }\n : { parent: outer, policy: \"ask\" };\n}\n\nfunction singleDirectoryValue(\n tools: ToolMeta[],\n key: \"group\" | \"parent\",\n): string | undefined {\n const values = new Set(tools.map((tool) => tool[key]).filter(Boolean));\n return values.size === 1 ? [...values][0] : undefined;\n}\n\nexport function updateSelectedTools(\n selected: readonly string[],\n visible: readonly string[],\n): string[] {\n const next = new Set(selected);\n const allVisibleSelected = visible.length > 0 && visible.every((name) => next.has(name));\n for (const name of visible) {\n if (allVisibleSelected) next.delete(name);\n else next.add(name);\n }\n return [...next];\n}\n\nexport function selectedToolState(\n selected: ReadonlySet<string>,\n visible: readonly string[],\n): { checked: boolean; mixed: boolean } {\n const count = visible.filter((name) => selected.has(name)).length;\n return {\n checked: visible.length > 0 && count === visible.length,\n mixed: count > 0 && count < visible.length,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolSchemaBrowser.model.cjs","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"sourcesContent":["import type { PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport {\n commonMode,\n groupToolPolicy,\n nextMode,\n toolEntry,\n type BadgePolicy,\n} from \"./ToolPreferences.model\";\n\nexport type ToolSchemaViewMode = \"group\" | \"tree\";\nexport type ToolSchemaBrowserTab = \"schema\" | \"json\";\nexport type ToolHintKey =\n | \"readOnlyHint\"\n | \"destructiveHint\"\n | \"idempotentHint\"\n | \"openWorldHint\";\nexport type ToolHintFilter = \"any\" | \"yes\" | \"no\";\nexport type ToolHintFilters = Record<ToolHintKey, ToolHintFilter>;\n\nexport type ToolSection = {\n label: string;\n count: number;\n children: Array<{ label: string; tools: ToolMeta[] }>;\n};\n\nexport const TOOL_HINTS: Array<{ key: ToolHintKey; label: string }> = [\n { key: \"readOnlyHint\", label: \"Read only\" },\n { key: \"destructiveHint\", label: \"Destructive\" },\n { key: \"idempotentHint\", label: \"Idempotent\" },\n { key: \"openWorldHint\", label: \"Open world\" },\n];\n\nexport const EMPTY_TOOL_HINT_FILTERS: ToolHintFilters = {\n readOnlyHint: \"any\",\n destructiveHint: \"any\",\n idempotentHint: \"any\",\n openWorldHint: \"any\",\n};\n\nconst NO_GROUP = \"Tools\";\nconst NO_PARENT = \"General\";\n\nexport function cycleToolHintFilter(value: ToolHintFilter): ToolHintFilter {\n if (value === \"any\") return \"yes\";\n if (value === \"yes\") return \"no\";\n return \"any\";\n}\n\nexport function toolHintFilterLabel(value: ToolHintFilter): string {\n if (value === \"yes\") return \"Yes\";\n if (value === \"no\") return \"No\";\n return \"Any\";\n}\n\nexport function filterToolSchemaBrowserTools(\n tools: ToolMeta[],\n query: string,\n filters: ToolHintFilters,\n): ToolMeta[] {\n const q = query.trim().toLowerCase();\n return tools.filter((tool) => {\n if (!matchesHintFilters(tool, filters)) return false;\n if (!q) return true;\n return [\n tool.name,\n tool.label,\n tool.title,\n tool.description,\n tool.group,\n tool.parent,\n tool.entity,\n tool.icon,\n tool.defaultPermission,\n tool.source,\n tool.server,\n ...annotationSearchText(tool),\n ...(tool.hints ?? []),\n ]\n .filter(Boolean)\n .some((value) => String(value).toLowerCase().includes(q));\n });\n}\n\nfunction matchesHintFilters(tool: ToolMeta, filters: ToolHintFilters): boolean {\n return TOOL_HINTS.every(({ key }) => {\n const filter = filters[key];\n if (filter === \"any\") return true;\n const value = tool.annotations?.[key];\n return filter === \"yes\" ? value === true : value !== true;\n });\n}\n\nfunction annotationSearchText(tool: ToolMeta): string[] {\n if (!tool.annotations) return [];\n return Object.entries(tool.annotations)\n .flatMap(([key, value]) => [key, primitiveAnnotationText(value)])\n .filter((value): value is string => Boolean(value));\n}\n\nfunction primitiveAnnotationText(value: unknown): string | undefined {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return undefined;\n}\n\nexport function buildToolSchemaSections(\n tools: ToolMeta[],\n view: ToolSchemaViewMode,\n): ToolSection[] {\n const outerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.group || NO_GROUP : tool.parent || NO_PARENT;\n const innerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.parent || NO_PARENT : tool.group || NO_GROUP;\n\n const outer = new Map<string, Map<string, ToolMeta[]>>();\n for (const tool of tools) {\n const outerKey = outerOf(tool);\n const innerKey = innerOf(tool);\n const inner = outer.get(outerKey) ?? new Map<string, ToolMeta[]>();\n const bucket = inner.get(innerKey) ?? [];\n bucket.push(tool);\n inner.set(innerKey, bucket);\n outer.set(outerKey, inner);\n }\n\n return [...outer.entries()]\n .map(([label, inner]) => {\n const children = [...inner.entries()]\n .map(([childLabel, childTools]) => ({\n label: childLabel,\n tools: [...childTools].sort((a, b) =>\n (a.label || a.name).localeCompare(b.label || b.name),\n ),\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n return {\n label,\n count: children.reduce((sum, child) => sum + child.tools.length, 0),\n children,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n}\n\nexport function directoryPermissionRule({\n tools,\n view,\n depth,\n policy,\n}: {\n tools: ToolMeta[];\n view: ToolSchemaViewMode;\n depth: \"section\" | \"child\";\n policy: ToolPolicy;\n}): PermissionRule {\n const group = singleDirectoryValue(tools, \"group\");\n const parent = singleDirectoryValue(tools, \"parent\");\n const facets =\n depth === \"section\"\n ? view === \"group\"\n ? { group }\n : { parent }\n : { group, parent };\n // Both facets must identify a child; a missing facet would cover siblings.\n if (\n (!facets.group && !facets.parent) ||\n (depth === \"child\" && (!group || !parent))\n ) {\n return { name: tools.map((tool) => tool.name).sort(), policy };\n }\n return {\n ...(facets.group ? { group: facets.group } : {}),\n ...(facets.parent ? { parent: facets.parent } : {}),\n policy,\n };\n}\n\nfunction singleDirectoryValue(\n tools: ToolMeta[],\n key: \"group\" | \"parent\",\n): string | undefined {\n const value = tools[0]?.[key];\n return value && tools.every((tool) => tool[key] === value) ? value : undefined;\n}\n\n/** The badge a directory shows and the rule a click on it emits: one cycle step\n * past its most restrictive member, matching the quick menu's group toggle. */\nexport function directoryPolicyToggle(\n tools: ToolMeta[],\n value: Record<string, ToolPolicy>,\n): { badge: BadgePolicy; next: ToolPolicy } {\n const entries = tools.map(toolEntry);\n return {\n badge: commonMode(entries, value),\n next: nextMode(groupToolPolicy(entries, value)),\n };\n}\n"],"names":["toolEntry","commonMode","nextMode","groupToolPolicy"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { PermissionRule } from '../chat/tool-policy.js';
2
- import { ToolMeta } from '../chat/types.js';
2
+ import { ToolMeta, ToolPolicy } from '../chat/types.js';
3
+ import { BadgePolicy } from './ToolPreferences.model.js';
3
4
  export type ToolSchemaViewMode = "group" | "tree";
4
5
  export type ToolSchemaBrowserTab = "schema" | "json";
5
6
  export type ToolHintKey = "readOnlyHint" | "destructiveHint" | "idempotentHint" | "openWorldHint";
@@ -22,14 +23,16 @@ export declare function cycleToolHintFilter(value: ToolHintFilter): ToolHintFilt
22
23
  export declare function toolHintFilterLabel(value: ToolHintFilter): string;
23
24
  export declare function filterToolSchemaBrowserTools(tools: ToolMeta[], query: string, filters: ToolHintFilters): ToolMeta[];
24
25
  export declare function buildToolSchemaSections(tools: ToolMeta[], view: ToolSchemaViewMode): ToolSection[];
25
- export declare function directoryPermissionRule({ tools, view, depth, }: {
26
+ export declare function directoryPermissionRule({ tools, view, depth, policy, }: {
26
27
  tools: ToolMeta[];
27
28
  view: ToolSchemaViewMode;
28
29
  depth: "section" | "child";
30
+ policy: ToolPolicy;
29
31
  }): PermissionRule;
30
- export declare function updateSelectedTools(selected: readonly string[], visible: readonly string[]): string[];
31
- export declare function selectedToolState(selected: ReadonlySet<string>, visible: readonly string[]): {
32
- checked: boolean;
33
- mixed: boolean;
32
+ /** The badge a directory shows and the rule a click on it emits: one cycle step
33
+ * past its most restrictive member, matching the quick menu's group toggle. */
34
+ export declare function directoryPolicyToggle(tools: ToolMeta[], value: Record<string, ToolPolicy>): {
35
+ badge: BadgePolicy;
36
+ next: ToolPolicy;
34
37
  };
35
38
  //# sourceMappingURL=ToolSchemaBrowser.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AACpB,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AAClD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKjE,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAKrC,CAAC;AAKF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAIzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAIjE;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB,QAAQ,EAAE,CAuBZ;AA6BD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,QAAQ,EAAE,EACjB,IAAI,EAAE,kBAAkB,GACvB,WAAW,EAAE,CAkCf;AAED,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,IAAI,EACJ,KAAK,GACN,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;CAC5B,GAAG,cAAc,CAiBjB;AAUD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,EAAE,CAQV;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7B,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAMtC"}
1
+ {"version":3,"file":"ToolSchemaBrowser.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,WAAW,GACnB,cAAc,GACd,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,CAAC;AACpB,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AAClD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAElE,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC,CAAC;CACvD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAKjE,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,eAKrC,CAAC;AAKF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAIzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAIjE;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB,QAAQ,EAAE,CAuBZ;AA6BD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,QAAQ,EAAE,EACjB,IAAI,EAAE,kBAAkB,GACvB,WAAW,EAAE,CAkCf;AAED,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,IAAI,EACJ,KAAK,EACL,MAAM,GACP,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;CACpB,GAAG,cAAc,CAqBjB;AAUD;gFACgF;AAChF,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAM1C"}
@@ -1,3 +1,4 @@
1
+ import { toolEntry, nextMode, groupToolPolicy, commonMode } from "./ToolPreferences.model.js";
1
2
  const TOOL_HINTS = [
2
3
  { key: "readOnlyHint", label: "Read only" },
3
4
  { key: "destructiveHint", label: "Destructive" },
@@ -83,39 +84,31 @@ function buildToolSchemaSections(tools, view) {
83
84
  function directoryPermissionRule({
84
85
  tools,
85
86
  view,
86
- depth
87
+ depth,
88
+ policy
87
89
  }) {
88
90
  const group = singleDirectoryValue(tools, "group");
89
91
  const parent = singleDirectoryValue(tools, "parent");
90
- const outer = view === "group" ? group : parent;
91
- const inner = view === "group" ? parent : group;
92
- if (!outer || depth === "child" && !inner) {
93
- return { name: tools.map((tool) => tool.name).sort(), policy: "ask" };
92
+ const facets = depth === "section" ? view === "group" ? { group } : { parent } : { group, parent };
93
+ if (!facets.group && !facets.parent || depth === "child" && (!group || !parent)) {
94
+ return { name: tools.map((tool) => tool.name).sort(), policy };
94
95
  }
95
- if (depth === "child") {
96
- if (!inner) throw new Error("Child tool directory has no metadata value");
97
- return view === "group" ? { group: outer, parent: inner, policy: "ask" } : { parent: outer, group: inner, policy: "ask" };
98
- }
99
- return view === "group" ? { group: outer, policy: "ask" } : { parent: outer, policy: "ask" };
96
+ return {
97
+ ...facets.group ? { group: facets.group } : {},
98
+ ...facets.parent ? { parent: facets.parent } : {},
99
+ policy
100
+ };
100
101
  }
101
102
  function singleDirectoryValue(tools, key) {
102
- const values = new Set(tools.map((tool) => tool[key]).filter(Boolean));
103
- return values.size === 1 ? [...values][0] : void 0;
104
- }
105
- function updateSelectedTools(selected, visible) {
106
- const next = new Set(selected);
107
- const allVisibleSelected = visible.length > 0 && visible.every((name) => next.has(name));
108
- for (const name of visible) {
109
- if (allVisibleSelected) next.delete(name);
110
- else next.add(name);
111
- }
112
- return [...next];
103
+ var _a;
104
+ const value = (_a = tools[0]) == null ? void 0 : _a[key];
105
+ return value && tools.every((tool) => tool[key] === value) ? value : void 0;
113
106
  }
114
- function selectedToolState(selected, visible) {
115
- const count = visible.filter((name) => selected.has(name)).length;
107
+ function directoryPolicyToggle(tools, value) {
108
+ const entries = tools.map(toolEntry);
116
109
  return {
117
- checked: visible.length > 0 && count === visible.length,
118
- mixed: count > 0 && count < visible.length
110
+ badge: commonMode(entries, value),
111
+ next: nextMode(groupToolPolicy(entries, value))
119
112
  };
120
113
  }
121
114
  export {
@@ -123,8 +116,7 @@ export {
123
116
  TOOL_HINTS,
124
117
  buildToolSchemaSections,
125
118
  directoryPermissionRule,
126
- filterToolSchemaBrowserTools,
127
- selectedToolState,
128
- updateSelectedTools
119
+ directoryPolicyToggle,
120
+ filterToolSchemaBrowserTools
129
121
  };
130
122
  //# sourceMappingURL=ToolSchemaBrowser.model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolSchemaBrowser.model.js","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"sourcesContent":["import type { PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta } from \"../chat/types\";\n\nexport type ToolSchemaViewMode = \"group\" | \"tree\";\nexport type ToolSchemaBrowserTab = \"schema\" | \"json\";\nexport type ToolHintKey =\n | \"readOnlyHint\"\n | \"destructiveHint\"\n | \"idempotentHint\"\n | \"openWorldHint\";\nexport type ToolHintFilter = \"any\" | \"yes\" | \"no\";\nexport type ToolHintFilters = Record<ToolHintKey, ToolHintFilter>;\n\nexport type ToolSection = {\n label: string;\n count: number;\n children: Array<{ label: string; tools: ToolMeta[] }>;\n};\n\nexport const TOOL_HINTS: Array<{ key: ToolHintKey; label: string }> = [\n { key: \"readOnlyHint\", label: \"Read only\" },\n { key: \"destructiveHint\", label: \"Destructive\" },\n { key: \"idempotentHint\", label: \"Idempotent\" },\n { key: \"openWorldHint\", label: \"Open world\" },\n];\n\nexport const EMPTY_TOOL_HINT_FILTERS: ToolHintFilters = {\n readOnlyHint: \"any\",\n destructiveHint: \"any\",\n idempotentHint: \"any\",\n openWorldHint: \"any\",\n};\n\nconst NO_GROUP = \"Tools\";\nconst NO_PARENT = \"General\";\n\nexport function cycleToolHintFilter(value: ToolHintFilter): ToolHintFilter {\n if (value === \"any\") return \"yes\";\n if (value === \"yes\") return \"no\";\n return \"any\";\n}\n\nexport function toolHintFilterLabel(value: ToolHintFilter): string {\n if (value === \"yes\") return \"Yes\";\n if (value === \"no\") return \"No\";\n return \"Any\";\n}\n\nexport function filterToolSchemaBrowserTools(\n tools: ToolMeta[],\n query: string,\n filters: ToolHintFilters,\n): ToolMeta[] {\n const q = query.trim().toLowerCase();\n return tools.filter((tool) => {\n if (!matchesHintFilters(tool, filters)) return false;\n if (!q) return true;\n return [\n tool.name,\n tool.label,\n tool.title,\n tool.description,\n tool.group,\n tool.parent,\n tool.entity,\n tool.icon,\n tool.defaultPermission,\n tool.source,\n tool.server,\n ...annotationSearchText(tool),\n ...(tool.hints ?? []),\n ]\n .filter(Boolean)\n .some((value) => String(value).toLowerCase().includes(q));\n });\n}\n\nfunction matchesHintFilters(tool: ToolMeta, filters: ToolHintFilters): boolean {\n return TOOL_HINTS.every(({ key }) => {\n const filter = filters[key];\n if (filter === \"any\") return true;\n const value = tool.annotations?.[key];\n return filter === \"yes\" ? value === true : value !== true;\n });\n}\n\nfunction annotationSearchText(tool: ToolMeta): string[] {\n if (!tool.annotations) return [];\n return Object.entries(tool.annotations)\n .flatMap(([key, value]) => [key, primitiveAnnotationText(value)])\n .filter((value): value is string => Boolean(value));\n}\n\nfunction primitiveAnnotationText(value: unknown): string | undefined {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return undefined;\n}\n\nexport function buildToolSchemaSections(\n tools: ToolMeta[],\n view: ToolSchemaViewMode,\n): ToolSection[] {\n const outerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.group || NO_GROUP : tool.parent || NO_PARENT;\n const innerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.parent || NO_PARENT : tool.group || NO_GROUP;\n\n const outer = new Map<string, Map<string, ToolMeta[]>>();\n for (const tool of tools) {\n const outerKey = outerOf(tool);\n const innerKey = innerOf(tool);\n const inner = outer.get(outerKey) ?? new Map<string, ToolMeta[]>();\n const bucket = inner.get(innerKey) ?? [];\n bucket.push(tool);\n inner.set(innerKey, bucket);\n outer.set(outerKey, inner);\n }\n\n return [...outer.entries()]\n .map(([label, inner]) => {\n const children = [...inner.entries()]\n .map(([childLabel, childTools]) => ({\n label: childLabel,\n tools: [...childTools].sort((a, b) =>\n (a.label || a.name).localeCompare(b.label || b.name),\n ),\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n return {\n label,\n count: children.reduce((sum, child) => sum + child.tools.length, 0),\n children,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n}\n\nexport function directoryPermissionRule({\n tools,\n view,\n depth,\n}: {\n tools: ToolMeta[];\n view: ToolSchemaViewMode;\n depth: \"section\" | \"child\";\n}): PermissionRule {\n const group = singleDirectoryValue(tools, \"group\");\n const parent = singleDirectoryValue(tools, \"parent\");\n const outer = view === \"group\" ? group : parent;\n const inner = view === \"group\" ? parent : group;\n if (!outer || (depth === \"child\" && !inner)) {\n return { name: tools.map((tool) => tool.name).sort(), policy: \"ask\" };\n }\n if (depth === \"child\") {\n if (!inner) throw new Error(\"Child tool directory has no metadata value\");\n return view === \"group\"\n ? { group: outer, parent: inner, policy: \"ask\" }\n : { parent: outer, group: inner, policy: \"ask\" };\n }\n return view === \"group\"\n ? { group: outer, policy: \"ask\" }\n : { parent: outer, policy: \"ask\" };\n}\n\nfunction singleDirectoryValue(\n tools: ToolMeta[],\n key: \"group\" | \"parent\",\n): string | undefined {\n const values = new Set(tools.map((tool) => tool[key]).filter(Boolean));\n return values.size === 1 ? [...values][0] : undefined;\n}\n\nexport function updateSelectedTools(\n selected: readonly string[],\n visible: readonly string[],\n): string[] {\n const next = new Set(selected);\n const allVisibleSelected = visible.length > 0 && visible.every((name) => next.has(name));\n for (const name of visible) {\n if (allVisibleSelected) next.delete(name);\n else next.add(name);\n }\n return [...next];\n}\n\nexport function selectedToolState(\n selected: ReadonlySet<string>,\n visible: readonly string[],\n): { checked: boolean; mixed: boolean } {\n const count = visible.filter((name) => selected.has(name)).length;\n return {\n checked: visible.length > 0 && count === visible.length,\n mixed: count > 0 && count < visible.length,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolSchemaBrowser.model.js","sources":["../../../src/data/ai/ToolSchemaBrowser.model.ts"],"sourcesContent":["import type { PermissionRule } from \"../chat/tool-policy\";\nimport type { ToolMeta, ToolPolicy } from \"../chat/types\";\nimport {\n commonMode,\n groupToolPolicy,\n nextMode,\n toolEntry,\n type BadgePolicy,\n} from \"./ToolPreferences.model\";\n\nexport type ToolSchemaViewMode = \"group\" | \"tree\";\nexport type ToolSchemaBrowserTab = \"schema\" | \"json\";\nexport type ToolHintKey =\n | \"readOnlyHint\"\n | \"destructiveHint\"\n | \"idempotentHint\"\n | \"openWorldHint\";\nexport type ToolHintFilter = \"any\" | \"yes\" | \"no\";\nexport type ToolHintFilters = Record<ToolHintKey, ToolHintFilter>;\n\nexport type ToolSection = {\n label: string;\n count: number;\n children: Array<{ label: string; tools: ToolMeta[] }>;\n};\n\nexport const TOOL_HINTS: Array<{ key: ToolHintKey; label: string }> = [\n { key: \"readOnlyHint\", label: \"Read only\" },\n { key: \"destructiveHint\", label: \"Destructive\" },\n { key: \"idempotentHint\", label: \"Idempotent\" },\n { key: \"openWorldHint\", label: \"Open world\" },\n];\n\nexport const EMPTY_TOOL_HINT_FILTERS: ToolHintFilters = {\n readOnlyHint: \"any\",\n destructiveHint: \"any\",\n idempotentHint: \"any\",\n openWorldHint: \"any\",\n};\n\nconst NO_GROUP = \"Tools\";\nconst NO_PARENT = \"General\";\n\nexport function cycleToolHintFilter(value: ToolHintFilter): ToolHintFilter {\n if (value === \"any\") return \"yes\";\n if (value === \"yes\") return \"no\";\n return \"any\";\n}\n\nexport function toolHintFilterLabel(value: ToolHintFilter): string {\n if (value === \"yes\") return \"Yes\";\n if (value === \"no\") return \"No\";\n return \"Any\";\n}\n\nexport function filterToolSchemaBrowserTools(\n tools: ToolMeta[],\n query: string,\n filters: ToolHintFilters,\n): ToolMeta[] {\n const q = query.trim().toLowerCase();\n return tools.filter((tool) => {\n if (!matchesHintFilters(tool, filters)) return false;\n if (!q) return true;\n return [\n tool.name,\n tool.label,\n tool.title,\n tool.description,\n tool.group,\n tool.parent,\n tool.entity,\n tool.icon,\n tool.defaultPermission,\n tool.source,\n tool.server,\n ...annotationSearchText(tool),\n ...(tool.hints ?? []),\n ]\n .filter(Boolean)\n .some((value) => String(value).toLowerCase().includes(q));\n });\n}\n\nfunction matchesHintFilters(tool: ToolMeta, filters: ToolHintFilters): boolean {\n return TOOL_HINTS.every(({ key }) => {\n const filter = filters[key];\n if (filter === \"any\") return true;\n const value = tool.annotations?.[key];\n return filter === \"yes\" ? value === true : value !== true;\n });\n}\n\nfunction annotationSearchText(tool: ToolMeta): string[] {\n if (!tool.annotations) return [];\n return Object.entries(tool.annotations)\n .flatMap(([key, value]) => [key, primitiveAnnotationText(value)])\n .filter((value): value is string => Boolean(value));\n}\n\nfunction primitiveAnnotationText(value: unknown): string | undefined {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n return undefined;\n}\n\nexport function buildToolSchemaSections(\n tools: ToolMeta[],\n view: ToolSchemaViewMode,\n): ToolSection[] {\n const outerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.group || NO_GROUP : tool.parent || NO_PARENT;\n const innerOf = (tool: ToolMeta) =>\n view === \"group\" ? tool.parent || NO_PARENT : tool.group || NO_GROUP;\n\n const outer = new Map<string, Map<string, ToolMeta[]>>();\n for (const tool of tools) {\n const outerKey = outerOf(tool);\n const innerKey = innerOf(tool);\n const inner = outer.get(outerKey) ?? new Map<string, ToolMeta[]>();\n const bucket = inner.get(innerKey) ?? [];\n bucket.push(tool);\n inner.set(innerKey, bucket);\n outer.set(outerKey, inner);\n }\n\n return [...outer.entries()]\n .map(([label, inner]) => {\n const children = [...inner.entries()]\n .map(([childLabel, childTools]) => ({\n label: childLabel,\n tools: [...childTools].sort((a, b) =>\n (a.label || a.name).localeCompare(b.label || b.name),\n ),\n }))\n .sort((a, b) => a.label.localeCompare(b.label));\n return {\n label,\n count: children.reduce((sum, child) => sum + child.tools.length, 0),\n children,\n };\n })\n .sort((a, b) => a.label.localeCompare(b.label));\n}\n\nexport function directoryPermissionRule({\n tools,\n view,\n depth,\n policy,\n}: {\n tools: ToolMeta[];\n view: ToolSchemaViewMode;\n depth: \"section\" | \"child\";\n policy: ToolPolicy;\n}): PermissionRule {\n const group = singleDirectoryValue(tools, \"group\");\n const parent = singleDirectoryValue(tools, \"parent\");\n const facets =\n depth === \"section\"\n ? view === \"group\"\n ? { group }\n : { parent }\n : { group, parent };\n // Both facets must identify a child; a missing facet would cover siblings.\n if (\n (!facets.group && !facets.parent) ||\n (depth === \"child\" && (!group || !parent))\n ) {\n return { name: tools.map((tool) => tool.name).sort(), policy };\n }\n return {\n ...(facets.group ? { group: facets.group } : {}),\n ...(facets.parent ? { parent: facets.parent } : {}),\n policy,\n };\n}\n\nfunction singleDirectoryValue(\n tools: ToolMeta[],\n key: \"group\" | \"parent\",\n): string | undefined {\n const value = tools[0]?.[key];\n return value && tools.every((tool) => tool[key] === value) ? value : undefined;\n}\n\n/** The badge a directory shows and the rule a click on it emits: one cycle step\n * past its most restrictive member, matching the quick menu's group toggle. */\nexport function directoryPolicyToggle(\n tools: ToolMeta[],\n value: Record<string, ToolPolicy>,\n): { badge: BadgePolicy; next: ToolPolicy } {\n const entries = tools.map(toolEntry);\n return {\n badge: commonMode(entries, value),\n next: nextMode(groupToolPolicy(entries, value)),\n };\n}\n"],"names":[],"mappings":"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"}