@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,4 +1,4 @@
1
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useMemo } from "react";
3
3
  import { Button } from "../../components/button.js";
4
4
  import { cn } from "../../lib/utils.js";
@@ -9,29 +9,114 @@ import { DEFAULT_REASONING_EFFORTS } from "../chat/effort-icons.js";
9
9
  import { AdvancedChatConfig } from "./AdvancedChatConfig.js";
10
10
  import { AdvancedCostsPanel } from "./AdvancedCostsPanel.js";
11
11
  import { ToolSchemaBrowser } from "./ToolSchemaBrowser.js";
12
- import { CompactToolList } from "./ToolPreferencesList.js";
13
- import { CompactToolPreferencesList } from "./ToolPreferencesList.js";
14
- import { groupedToolEntries } from "./ToolPreferences.model.js";
15
- import { UiSliders } from "../../icons/components/UiSliders.js";
16
- import { UiCode2 } from "../../icons/components/UiCode2.js";
12
+ import { buildToolSchemaSections } from "./ToolSchemaBrowser.model.js";
13
+ import { ToolPolicyTree } from "./ToolSchemaBrowser.tree.js";
17
14
  import { UiShield } from "../../icons/components/UiShield.js";
18
15
  import { UiCoins } from "../../icons/components/UiCoins.js";
19
- const ADVANCED_TABS = [
20
- "config",
21
- "costs",
22
- "permissions",
23
- "browser"
24
- ];
16
+ import { UiSliders } from "../../icons/components/UiSliders.js";
17
+ const ADVANCED_TABS = ["config", "costs", "permissions"];
25
18
  const ADVANCED_TAB_ICONS = {
26
19
  config: UiSliders,
27
20
  costs: UiCoins,
28
- permissions: UiShield,
29
- browser: UiCode2
21
+ permissions: UiShield
30
22
  };
31
23
  function ToolPreferences({
24
+ className = "",
25
+ ...props
26
+ }) {
27
+ const [advancedOpen, setAdvancedOpen] = useState(false);
28
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
29
+ /* @__PURE__ */ jsx(
30
+ DropdownMenu,
31
+ {
32
+ align: "right",
33
+ className,
34
+ menuClassName: "w-72 max-h-[70vh] overflow-y-auto p-1",
35
+ trigger: /* @__PURE__ */ jsx(
36
+ Button,
37
+ {
38
+ variant: "ghost",
39
+ size: "icon",
40
+ title: "Tool preferences",
41
+ "data-testid": "tool-preferences-btn",
42
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiSliders, className: "size-4" })
43
+ }
44
+ ),
45
+ children: (closeMenu) => /* @__PURE__ */ jsx(
46
+ ToolPreferencesMenu,
47
+ {
48
+ tools: props.tools,
49
+ value: props.value,
50
+ onRule: props.onRule,
51
+ onAdvanced: () => {
52
+ closeMenu();
53
+ setAdvancedOpen(true);
54
+ }
55
+ }
56
+ )
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsx(
60
+ Modal,
61
+ {
62
+ open: advancedOpen,
63
+ onClose: () => setAdvancedOpen(false),
64
+ title: "Advanced Chat Settings",
65
+ size: "xl",
66
+ children: /* @__PURE__ */ jsx(AdvancedChatSettings, { ...props, className: "h-[70vh]" })
67
+ }
68
+ )
69
+ ] });
70
+ }
71
+ function ToolPreferencesMenu({
72
+ tools,
73
+ value,
74
+ onRule,
75
+ onAdvanced,
76
+ className
77
+ }) {
78
+ const sections = useMemo(
79
+ () => buildToolSchemaSections(tools, "tree"),
80
+ [tools]
81
+ );
82
+ const [collapsed, setCollapsed] = useState(() => /* @__PURE__ */ new Set());
83
+ const toggle = (key) => setCollapsed((current) => {
84
+ const next = new Set(current);
85
+ if (next.has(key)) next.delete(key);
86
+ else next.add(key);
87
+ return next;
88
+ });
89
+ return /* @__PURE__ */ jsxs("div", { className, children: [
90
+ /* @__PURE__ */ jsx("div", { className: "mb-1 px-1 text-xs font-semibold", children: "Tool Preferences" }),
91
+ /* @__PURE__ */ jsx(
92
+ ToolPolicyTree,
93
+ {
94
+ sections,
95
+ view: "tree",
96
+ value,
97
+ onRule,
98
+ isOpen: (key) => !collapsed.has(key),
99
+ onToggle: toggle,
100
+ emptyLabel: "No tools available"
101
+ }
102
+ ),
103
+ onAdvanced && /* @__PURE__ */ jsx("div", { className: "mt-2 border-t border-border pt-2", children: /* @__PURE__ */ jsx(
104
+ "button",
105
+ {
106
+ type: "button",
107
+ className: "w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent",
108
+ onClick: onAdvanced,
109
+ children: "Advanced"
110
+ }
111
+ ) })
112
+ ] });
113
+ }
114
+ function AdvancedChatSettings({
32
115
  tools,
33
116
  value,
34
117
  onRule,
118
+ rules,
119
+ onRulesChange,
35
120
  models = [],
36
121
  runtime,
37
122
  onRuntimeChange,
@@ -44,11 +129,8 @@ function ToolPreferences({
44
129
  onReasoningEffortChange,
45
130
  permissionMode = "default",
46
131
  onPermissionModeChange,
47
- temperature,
48
- onTemperatureChange,
49
132
  budget,
50
133
  onBudgetChange,
51
- usage,
52
134
  costsApi,
53
135
  threadId,
54
136
  toolsLoading = false,
@@ -56,15 +138,13 @@ function ToolPreferences({
56
138
  catalogLoading = false,
57
139
  catalogError = null,
58
140
  onCatalogRetry,
59
- className = ""
141
+ defaultTab = "config",
142
+ className
60
143
  }) {
61
- const [advancedOpen, setAdvancedOpen] = useState(false);
62
- const [advancedTab, setAdvancedTab] = useState("config");
63
- const groups = useMemo(() => groupedToolEntries(tools), [tools]);
144
+ const [advancedTab, setAdvancedTab] = useState(defaultTab);
64
145
  const resolvedRuntime = runtime ?? {
65
146
  ...model ? { model } : {},
66
- ...reasoningEffort ? { effort: reasoningEffort } : {},
67
- ...temperature !== void 0 ? { temperature } : {}
147
+ ...reasoningEffort ? { effort: reasoningEffort } : {}
68
148
  };
69
149
  const handleRuntimeChange = (next) => {
70
150
  onRuntimeChange == null ? void 0 : onRuntimeChange(next);
@@ -75,136 +155,61 @@ function ToolPreferences({
75
155
  onReasoningEffortChange == null ? void 0 : onReasoningEffortChange(next.effort ?? "");
76
156
  }
77
157
  };
78
- return /* @__PURE__ */ jsxs(Fragment, { children: [
79
- /* @__PURE__ */ jsx(
80
- DropdownMenu,
81
- {
82
- align: "right",
83
- className,
84
- menuClassName: "w-72 max-h-[70vh] overflow-y-auto p-1",
85
- trigger: /* @__PURE__ */ jsx(
86
- Button,
87
- {
88
- variant: "ghost",
89
- size: "icon",
90
- title: "Tool preferences",
91
- "data-testid": "tool-preferences-btn",
92
- children: /* @__PURE__ */ jsx(Icon, { icon: UiSliders, className: "size-4" })
93
- }
94
- ),
95
- children: (closeMenu) => /* @__PURE__ */ jsxs("div", { children: [
96
- /* @__PURE__ */ jsx("div", { className: "mb-1 px-1 text-xs font-semibold", children: "Tool Preferences" }),
97
- /* @__PURE__ */ jsx(
98
- CompactToolList,
99
- {
100
- groups,
101
- value,
102
- onRule,
103
- emptyLabel: "No tools available"
104
- }
158
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex min-h-0 flex-col gap-3", className), children: [
159
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 rounded border border-border bg-muted/30 p-1", children: [
160
+ ADVANCED_TABS.map((tab) => /* @__PURE__ */ jsxs(
161
+ "button",
162
+ {
163
+ type: "button",
164
+ className: cn(
165
+ "inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize",
166
+ advancedTab === tab ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:bg-background/60"
105
167
  ),
106
- /* @__PURE__ */ jsx("div", { className: "mt-2 border-t border-border pt-2", children: /* @__PURE__ */ jsx(
107
- "button",
108
- {
109
- type: "button",
110
- className: "w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent",
111
- onClick: () => {
112
- closeMenu();
113
- setAdvancedOpen(true);
114
- },
115
- children: "Advanced"
116
- }
117
- ) })
118
- ] })
168
+ onClick: () => setAdvancedTab(tab),
169
+ children: [
170
+ /* @__PURE__ */ jsx(Icon, { icon: ADVANCED_TAB_ICONS[tab], className: "size-3.5" }),
171
+ tab
172
+ ]
173
+ },
174
+ tab
175
+ )),
176
+ /* @__PURE__ */ jsx("div", { className: "flex-1" }),
177
+ toolsLoading && /* @__PURE__ */ jsx("span", { className: "pr-2 text-[11px] text-muted-foreground", children: "Loading tools" }),
178
+ toolsError && /* @__PURE__ */ jsx("span", { className: "pr-2 text-[11px] text-destructive", children: toolsError })
179
+ ] }),
180
+ advancedTab === "config" ? /* @__PURE__ */ jsx(
181
+ AdvancedChatConfig,
182
+ {
183
+ models,
184
+ runtime: resolvedRuntime,
185
+ onRuntimeChange: handleRuntimeChange,
186
+ runtimeFamilies,
187
+ reasoningEfforts,
188
+ runtimeLocked,
189
+ permissionMode,
190
+ onPermissionModeChange,
191
+ budget,
192
+ onBudgetChange,
193
+ catalogLoading,
194
+ catalogError,
195
+ onCatalogRetry
119
196
  }
120
- ),
121
- /* @__PURE__ */ jsx(
122
- Modal,
197
+ ) : advancedTab === "costs" ? /* @__PURE__ */ jsx(AdvancedCostsPanel, { costsApi, threadId }) : /* @__PURE__ */ jsx(
198
+ ToolSchemaBrowser,
123
199
  {
124
- open: advancedOpen,
125
- onClose: () => setAdvancedOpen(false),
126
- title: "Advanced Chat Settings",
127
- size: "xl",
128
- children: /* @__PURE__ */ jsxs("div", { className: "flex h-[70vh] min-h-0 flex-col gap-3", children: [
129
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 rounded border border-border bg-muted/30 p-1", children: [
130
- ADVANCED_TABS.map((tab) => /* @__PURE__ */ jsxs(
131
- "button",
132
- {
133
- type: "button",
134
- className: cn(
135
- "inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize",
136
- advancedTab === tab ? "bg-background text-foreground shadow-sm" : "text-muted-foreground hover:bg-background/60"
137
- ),
138
- onClick: () => setAdvancedTab(tab),
139
- children: [
140
- /* @__PURE__ */ jsx(Icon, { icon: ADVANCED_TAB_ICONS[tab], className: "size-3.5" }),
141
- tab
142
- ]
143
- },
144
- tab
145
- )),
146
- /* @__PURE__ */ jsx("div", { className: "flex-1" }),
147
- toolsLoading && /* @__PURE__ */ jsx("span", { className: "pr-2 text-[11px] text-muted-foreground", children: "Loading tools" }),
148
- toolsError && /* @__PURE__ */ jsx("span", { className: "pr-2 text-[11px] text-destructive", children: toolsError })
149
- ] }),
150
- advancedTab === "config" ? /* @__PURE__ */ jsx(
151
- AdvancedChatConfig,
152
- {
153
- models,
154
- runtime: resolvedRuntime,
155
- onRuntimeChange: handleRuntimeChange,
156
- runtimeFamilies,
157
- reasoningEfforts,
158
- runtimeLocked,
159
- permissionMode,
160
- onPermissionModeChange,
161
- temperature,
162
- onTemperatureChange,
163
- budget,
164
- onBudgetChange,
165
- usage,
166
- catalogLoading,
167
- catalogError,
168
- onCatalogRetry
169
- }
170
- ) : advancedTab === "costs" ? /* @__PURE__ */ jsx(AdvancedCostsPanel, { costsApi, threadId }) : advancedTab === "permissions" ? /* @__PURE__ */ jsx(
171
- AdvancedPermissionsPanel,
172
- {
173
- groups,
174
- value,
175
- onRule
176
- }
177
- ) : /* @__PURE__ */ jsx(
178
- ToolSchemaBrowser,
179
- {
180
- tools,
181
- value,
182
- onRule,
183
- className: "min-h-0 flex-1"
184
- }
185
- )
186
- ] })
200
+ tools,
201
+ value,
202
+ onRule,
203
+ rules,
204
+ onRulesChange,
205
+ className: "min-h-0 flex-1"
187
206
  }
188
207
  )
189
208
  ] });
190
209
  }
191
- function AdvancedPermissionsPanel({
192
- groups,
193
- value,
194
- onRule
195
- }) {
196
- return /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-y-auto rounded border border-border p-1", children: /* @__PURE__ */ jsx(
197
- CompactToolList,
198
- {
199
- groups,
200
- value,
201
- onRule,
202
- emptyLabel: "No tools"
203
- }
204
- ) });
205
- }
206
210
  export {
207
- CompactToolPreferencesList,
208
- ToolPreferences
211
+ AdvancedChatSettings,
212
+ ToolPreferences,
213
+ ToolPreferencesMenu
209
214
  };
210
215
  //# sourceMappingURL=ToolPreferences.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferences.js","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCode2, UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolPolicy,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport {\n CompactToolList,\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport { groupedToolEntries, type ToolGroup } from \"./ToolPreferences.model\";\nimport type { PermissionRule } from \"../chat/tool-policy\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolPolicy };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n runtimeLocked?: boolean | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n temperature?: number | undefined;\n onTemperatureChange?: ((temperature: number | undefined) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n usage?: ChatUsageSummary | null | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\ntype AdvancedTab = \"config\" | \"costs\" | \"permissions\" | \"browser\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\n \"config\",\n \"costs\",\n \"permissions\",\n \"browser\",\n];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n browser: UiCode2,\n};\n\nexport function ToolPreferences({\n tools,\n value,\n onRule,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n runtimeLocked = false,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n temperature,\n onTemperatureChange,\n budget,\n onBudgetChange,\n usage,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n className = \"\",\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(\"config\");\n const groups = useMemo(() => groupedToolEntries(tools), [tools]);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n ...(temperature !== undefined ? { temperature } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <div>\n <div className=\"mb-1 px-1 text-xs font-semibold\">\n Tool Preferences\n </div>\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel=\"No tools available\"\n />\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n >\n Advanced\n </button>\n </div>\n </div>\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <div className=\"flex h-[70vh] min-h-0 flex-col gap-3\">\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n runtimeLocked={runtimeLocked}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n temperature={temperature}\n onTemperatureChange={onTemperatureChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n usage={usage}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : advancedTab === \"permissions\" ? (\n <AdvancedPermissionsPanel\n groups={groups}\n value={value}\n onRule={onRule}\n />\n ) : (\n <ToolSchemaBrowser\n tools={tools}\n value={value}\n onRule={onRule}\n className=\"min-h-0 flex-1\"\n />\n )}\n </div>\n </Modal>\n </>\n );\n}\n\nfunction AdvancedPermissionsPanel({\n groups,\n value,\n onRule,\n}: {\n groups: ToolGroup[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n}) {\n return (\n <div className=\"min-h-0 flex-1 overflow-y-auto rounded border border-border p-1\">\n <CompactToolList\n groups={groups}\n value={value}\n onRule={onRule}\n emptyLabel=\"No tools\"\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ToolPreferences.js","sources":["../../../src/data/ai/ToolPreferences.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { UiCoins, UiShield, UiSliders } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { Icon } from \"../Icon\";\nimport { DEFAULT_REASONING_EFFORTS } from \"../chat/effort-icons\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatModelRuntime,\n ClaudePermissionMode,\n ToolAnnotations,\n ToolMeta,\n ToolPolicy,\n} from \"../chat/types\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport { AdvancedChatConfig } from \"./AdvancedChatConfig\";\nimport { AdvancedCostsPanel } from \"./AdvancedCostsPanel\";\nimport { ToolSchemaBrowser } from \"./ToolSchemaBrowser\";\nimport { buildToolSchemaSections } from \"./ToolSchemaBrowser.model\";\nimport { ToolPolicyTree } from \"./ToolSchemaBrowser.tree\";\nimport {\n CompactToolPreferencesList,\n type CompactToolPreferencesListProps,\n} from \"./ToolPreferencesList\";\nimport type { PermissionPolicy, PermissionRule } from \"../chat/tool-policy\";\n\nexport type { ClaudePermissionMode, ToolAnnotations, ToolMeta, ToolPolicy };\nexport { CompactToolPreferencesList, type CompactToolPreferencesListProps };\n\nexport type ToolPreferencesProps = {\n tools: ToolMeta[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n /** The user's saved rules, edited by the Permissions tab's strategy editor. */\n rules?: PermissionPolicy | undefined;\n onRulesChange?: ((rules: PermissionPolicy) => void) | undefined;\n models?: ChatModel[] | undefined;\n runtime?: ChatModelRuntime | undefined;\n onRuntimeChange?: ((runtime: ChatModelRuntime) => void) | undefined;\n model?: string | undefined;\n onModelChange?: ((model: string) => void) | undefined;\n runtimeFamilies?: SpecRuntimeFamily[] | undefined;\n reasoningEfforts?: string[] | undefined;\n runtimeLocked?: boolean | undefined;\n reasoningEffort?: string | undefined;\n onReasoningEffortChange?: ((effort: string) => void) | undefined;\n permissionMode?: ClaudePermissionMode | undefined;\n onPermissionModeChange?: ((mode: ClaudePermissionMode) => void) | undefined;\n budget?: ChatBudgetConfig | undefined;\n onBudgetChange?: ((budget: ChatBudgetConfig) => void) | undefined;\n /** Base sessions endpoint for the Costs tab, e.g. `/api/chat/sessions`. */\n costsApi?: string | undefined;\n /** Thread whose costs the Costs tab reports. */\n threadId?: string | undefined;\n toolsLoading?: boolean | undefined;\n toolsError?: string | null | undefined;\n catalogLoading?: boolean | undefined;\n catalogError?: string | null | undefined;\n onCatalogRetry?: (() => void) | undefined;\n className?: string;\n};\n\nexport type AdvancedTab = \"config\" | \"costs\" | \"permissions\";\n\nconst ADVANCED_TABS: AdvancedTab[] = [\"config\", \"costs\", \"permissions\"];\n\nconst ADVANCED_TAB_ICONS: Record<AdvancedTab, typeof UiSliders> = {\n config: UiSliders,\n costs: UiCoins,\n permissions: UiShield,\n};\n\nexport function ToolPreferences({\n className = \"\",\n ...props\n}: ToolPreferencesProps) {\n const [advancedOpen, setAdvancedOpen] = useState(false);\n\n return (\n <>\n <DropdownMenu\n align=\"right\"\n className={className}\n menuClassName=\"w-72 max-h-[70vh] overflow-y-auto p-1\"\n trigger={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n title=\"Tool preferences\"\n data-testid=\"tool-preferences-btn\"\n >\n <Icon icon={UiSliders} className=\"size-4\" />\n </Button>\n }\n >\n {(closeMenu) => (\n <ToolPreferencesMenu\n tools={props.tools}\n value={props.value}\n onRule={props.onRule}\n onAdvanced={() => {\n closeMenu();\n setAdvancedOpen(true);\n }}\n />\n )}\n </DropdownMenu>\n <Modal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n title=\"Advanced Chat Settings\"\n size=\"xl\"\n >\n <AdvancedChatSettings {...props} className=\"h-[70vh]\" />\n </Modal>\n </>\n );\n}\n\nexport type ToolPreferencesMenuProps = {\n tools: ToolMeta[];\n value: Record<string, ToolPolicy>;\n onRule: (rule: PermissionRule) => void;\n /** Shows the Advanced action; omitted, the menu has no Advanced entry. */\n onAdvanced?: (() => void) | undefined;\n className?: string;\n};\n\nexport function ToolPreferencesMenu({\n tools,\n value,\n onRule,\n onAdvanced,\n className,\n}: ToolPreferencesMenuProps) {\n const sections = useMemo(\n () => buildToolSchemaSections(tools, \"tree\"),\n [tools],\n );\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set());\n const toggle = (key: string) =>\n setCollapsed((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\n return (\n <div className={className}>\n <div className=\"mb-1 px-1 text-xs font-semibold\">Tool Preferences</div>\n <ToolPolicyTree\n sections={sections}\n view=\"tree\"\n value={value}\n onRule={onRule}\n isOpen={(key) => !collapsed.has(key)}\n onToggle={toggle}\n emptyLabel=\"No tools available\"\n />\n {onAdvanced && (\n <div className=\"mt-2 border-t border-border pt-2\">\n <button\n type=\"button\"\n className=\"w-full rounded px-2 py-1.5 text-left text-xs hover:bg-accent\"\n onClick={onAdvanced}\n >\n Advanced\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport type AdvancedChatSettingsProps = ToolPreferencesProps & {\n defaultTab?: AdvancedTab | undefined;\n};\n\nexport function AdvancedChatSettings({\n tools,\n value,\n onRule,\n rules,\n onRulesChange,\n models = [],\n runtime,\n onRuntimeChange,\n model,\n onModelChange,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n runtimeLocked = false,\n reasoningEffort,\n onReasoningEffortChange,\n permissionMode = \"default\",\n onPermissionModeChange,\n budget,\n onBudgetChange,\n costsApi,\n threadId,\n toolsLoading = false,\n toolsError = null,\n catalogLoading = false,\n catalogError = null,\n onCatalogRetry,\n defaultTab = \"config\",\n className,\n}: AdvancedChatSettingsProps) {\n const [advancedTab, setAdvancedTab] = useState<AdvancedTab>(defaultTab);\n const resolvedRuntime =\n runtime ??\n ({\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort } : {}),\n } satisfies ChatModelRuntime);\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n onRuntimeChange?.(next);\n if ((next.id ?? next.model ?? \"\") !== (model ?? \"\")) {\n onModelChange?.(next.id ?? next.model ?? \"\");\n }\n if ((next.effort ?? \"\") !== (reasoningEffort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n return (\n <div className={cn(\"flex min-h-0 flex-col gap-3\", className)}>\n <div className=\"flex items-center gap-1 rounded border border-border bg-muted/30 p-1\">\n {ADVANCED_TABS.map((tab) => (\n <button\n key={tab}\n type=\"button\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded px-3 text-xs font-medium capitalize\",\n advancedTab === tab\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:bg-background/60\",\n )}\n onClick={() => setAdvancedTab(tab)}\n >\n <Icon icon={ADVANCED_TAB_ICONS[tab]} className=\"size-3.5\" />\n {tab}\n </button>\n ))}\n <div className=\"flex-1\" />\n {toolsLoading && (\n <span className=\"pr-2 text-[11px] text-muted-foreground\">\n Loading tools\n </span>\n )}\n {toolsError && (\n <span className=\"pr-2 text-[11px] text-destructive\">\n {toolsError}\n </span>\n )}\n </div>\n {advancedTab === \"config\" ? (\n <AdvancedChatConfig\n models={models}\n runtime={resolvedRuntime}\n onRuntimeChange={handleRuntimeChange}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n runtimeLocked={runtimeLocked}\n permissionMode={permissionMode}\n onPermissionModeChange={onPermissionModeChange}\n budget={budget}\n onBudgetChange={onBudgetChange}\n catalogLoading={catalogLoading}\n catalogError={catalogError}\n onCatalogRetry={onCatalogRetry}\n />\n ) : advancedTab === \"costs\" ? (\n <AdvancedCostsPanel costsApi={costsApi} threadId={threadId} />\n ) : (\n <ToolSchemaBrowser\n tools={tools}\n value={value}\n onRule={onRule}\n rules={rules}\n onRulesChange={onRulesChange}\n className=\"min-h-0 flex-1\"\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -44,7 +44,7 @@ function withUserRule(rules, rule) {
44
44
  (existing) => sameSubject(existing, rule) ? rule : existing
45
45
  );
46
46
  const next = replaced.includes(rule) ? replaced : [...replaced, rule];
47
- return [...next].sort((a, b) => ruleRank(a) - ruleRank(b));
47
+ return toolPolicy.consolidateRules([...next].sort((a, b) => ruleRank(a) - ruleRank(b)));
48
48
  }
49
49
  function effectiveToolPolicies({
50
50
  tools,
@@ -60,18 +60,21 @@ function effectiveToolPolicies({
60
60
  }
61
61
  return resolved;
62
62
  }
63
+ function toolEntry(tool) {
64
+ return {
65
+ key: tool.name,
66
+ label: tool.label || tool.name,
67
+ group: tool.group ?? "Tools",
68
+ tool,
69
+ defaultPermission: tool.defaultPermission ?? "auto"
70
+ };
71
+ }
63
72
  function groupedToolEntries(tools) {
73
+ var _a;
64
74
  const groups = {};
65
75
  for (const tool of tools) {
66
- const group = tool.group ?? "Tools";
67
- const entry = {
68
- key: tool.name,
69
- label: tool.label || tool.name,
70
- group,
71
- tool,
72
- defaultPermission: tool.defaultPermission ?? "auto"
73
- };
74
- (groups[group] ?? (groups[group] = [])).push(entry);
76
+ const entry = toolEntry(tool);
77
+ (groups[_a = entry.group] ?? (groups[_a] = [])).push(entry);
75
78
  }
76
79
  return Object.entries(groups).map(([group, entries]) => buildToolGroup(group, entries)).sort((a, b) => a.group.localeCompare(b.group));
77
80
  }
@@ -168,5 +171,6 @@ exports.groupToolPolicy = groupToolPolicy;
168
171
  exports.groupedToolEntries = groupedToolEntries;
169
172
  exports.groupedToolEntriesWithPreferences = groupedToolEntriesWithPreferences;
170
173
  exports.nextMode = nextMode;
174
+ exports.toolEntry = toolEntry;
171
175
  exports.withUserRule = withUserRule;
172
176
  //# sourceMappingURL=ToolPreferences.model.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferences.model.cjs","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":["resolveToolPolicy","normalizeToolPolicy"],"mappings":"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"}
1
+ {"version":3,"file":"ToolPreferences.model.cjs","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":["consolidateRules","resolveToolPolicy","normalizeToolPolicy"],"mappings":"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"}
@@ -41,6 +41,7 @@ export type ToolGroup = {
41
41
  entries: ToolPreferenceEntry[];
42
42
  subGroups: ToolSubGroup[];
43
43
  };
44
+ export declare function toolEntry(tool: ToolMeta): ToolPreferenceEntry;
44
45
  export declare function groupedToolEntries(tools: ToolMeta[]): ToolGroup[];
45
46
  export declare function groupedToolEntriesWithPreferences(tools: ToolMeta[], value: Record<string, ToolPolicy>): ToolGroup[];
46
47
  export declare function entryMode(entry: ToolPreferenceEntry, value: Record<string, ToolPolicy>): ToolPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"ToolPreferences.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,YAAY,EAAE,UAAU,EAAqC,CAAC;AAE3E;8EAC8E;AAC9E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKzD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAGnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAGzD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,iBAAiB,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,SAAS,gBAAoB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,CAAC;AAiCF;;6CAE6C;AAC7C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,cAAc,GACnB,gBAAgB,CAMlB;AAED;;;;;wBAKwB;AACxB,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,aAAa,EACb,SAAS,EACT,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAQ7B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CAgBjE;AA8BD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,SAAS,EAAE,CAuBb;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,UAAU,CAEZ;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,EAAE,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,UAAU,CAKZ;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,WAAW,CAOb;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAKrD"}
1
+ {"version":3,"file":"ToolPreferences.model.d.ts","sourceRoot":"","sources":["../../../src/data/ai/ToolPreferences.model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,YAAY,EAAE,UAAU,EAAqC,CAAC;AAE3E;8EAC8E;AAC9E,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKnD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAKzD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAGnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAGzD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,iBAAiB,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,eAAO,MAAM,SAAS,gBAAoB,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,CAAC;AAiCF;;6CAE6C;AAC7C,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,cAAc,GACnB,gBAAgB,CAMlB;AAED;;;;;wBAKwB;AACxB,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,aAAa,EACb,SAAS,EACT,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACzC,QAAQ,EAAE,UAAU,CAAC;CACtB,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAQ7B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,mBAAmB,CAQ7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,CASjE;AA8BD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,QAAQ,EAAE,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,SAAS,EAAE,CAuBb;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,UAAU,CAEZ;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,EAAE,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,UAAU,CAKZ;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,mBAAmB,EAAE,EAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAChC,WAAW,CAOb;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAKrD"}
@@ -1,5 +1,5 @@
1
1
  import { normalizeToolPolicy } from "../chat/types.js";
2
- import { resolveToolPolicy } from "../chat/tool-policy.js";
2
+ import { resolveToolPolicy, consolidateRules } from "../chat/tool-policy.js";
3
3
  const POLICY_CYCLE = ["auto", "ask", "deny", "allow"];
4
4
  const POLICY_LABEL = {
5
5
  allow: "On",
@@ -42,7 +42,7 @@ function withUserRule(rules, rule) {
42
42
  (existing) => sameSubject(existing, rule) ? rule : existing
43
43
  );
44
44
  const next = replaced.includes(rule) ? replaced : [...replaced, rule];
45
- return [...next].sort((a, b) => ruleRank(a) - ruleRank(b));
45
+ return consolidateRules([...next].sort((a, b) => ruleRank(a) - ruleRank(b)));
46
46
  }
47
47
  function effectiveToolPolicies({
48
48
  tools,
@@ -58,18 +58,21 @@ function effectiveToolPolicies({
58
58
  }
59
59
  return resolved;
60
60
  }
61
+ function toolEntry(tool) {
62
+ return {
63
+ key: tool.name,
64
+ label: tool.label || tool.name,
65
+ group: tool.group ?? "Tools",
66
+ tool,
67
+ defaultPermission: tool.defaultPermission ?? "auto"
68
+ };
69
+ }
61
70
  function groupedToolEntries(tools) {
71
+ var _a;
62
72
  const groups = {};
63
73
  for (const tool of tools) {
64
- const group = tool.group ?? "Tools";
65
- const entry = {
66
- key: tool.name,
67
- label: tool.label || tool.name,
68
- group,
69
- tool,
70
- defaultPermission: tool.defaultPermission ?? "auto"
71
- };
72
- (groups[group] ?? (groups[group] = [])).push(entry);
74
+ const entry = toolEntry(tool);
75
+ (groups[_a = entry.group] ?? (groups[_a] = [])).push(entry);
73
76
  }
74
77
  return Object.entries(groups).map(([group, entries]) => buildToolGroup(group, entries)).sort((a, b) => a.group.localeCompare(b.group));
75
78
  }
@@ -167,6 +170,7 @@ export {
167
170
  groupedToolEntries,
168
171
  groupedToolEntriesWithPreferences,
169
172
  nextMode,
173
+ toolEntry,
170
174
  withUserRule
171
175
  };
172
176
  //# sourceMappingURL=ToolPreferences.model.js.map