@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 +1 @@
1
- {"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["familyForModel","familyForMode","modeOptionFor","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UiShield","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","sessionTone","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":"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"}
1
+ {"version":3,"file":"runtimeActions.cjs","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: currentVisual?.icon ?? UiShield,\n iconClassName: unpublished\n ? \"text-destructive\"\n : currentVisual\n ? sessionTone(currentVisual.tone).text\n : \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["familyForModel","familyForMode","modeOptionFor","publishedPermissionModes","SPEC_PERMISSION_MODES","_a","collapsePermissionModeAliases","permissionModeVisual","withPermissionMode","UiShield","sessionTone","UNSPECIFIED_NAME","jsxs","Fragment","jsx","cn","SEGMENT_KEY_CLASS","Icon","SEGMENT_CAPTION_CLASS","UNSPECIFIED_LABEL","SegmentItemLabel","unspecifiedHint","presetForRef","UiSliders"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAWpC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAW,GACZ,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,GAAG,gBAAgB,GAAG,SAAS,CA4H/B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,gBAAgB,CA8DnB"}
1
+ {"version":3,"file":"runtimeActions.d.ts","sourceRoot":"","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AAOpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,4BAA4B,CAAC;AAWpC;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,cAAc,EACd,QAAQ,EACR,MAAW,GACZ,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB,GAAG,gBAAgB,GAAG,SAAS,CAgI/B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE;IACD,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,gBAAgB,CA8DnB"}
@@ -56,8 +56,8 @@ function permissionField({
56
56
  id: "permissions.mode",
57
57
  isSet: current !== void 0,
58
58
  label: PERMISSION_GROUP,
59
- icon: UiShield,
60
- iconClassName: "text-muted-foreground",
59
+ icon: (currentVisual == null ? void 0 : currentVisual.icon) ?? UiShield,
60
+ iconClassName: unpublished ? "text-destructive" : currentVisual ? sessionTone(currentVisual.tone).text : "text-muted-foreground",
61
61
  title: unpublished ? `${PERMISSION_GROUP} — ${currentVisual == null ? void 0 : currentVisual.label} is not available for ${runtimeLabel}` : `${PERMISSION_GROUP} — ${(currentVisual == null ? void 0 : currentVisual.label) ?? UNSPECIFIED_NAME}`,
62
62
  caption: /* @__PURE__ */ jsxs(Fragment, { children: [
63
63
  /* @__PURE__ */ jsx("span", { className: cn(SEGMENT_KEY_CLASS, "min-w-0 truncate"), children: "Perms" }),
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: UiShield,\n iconClassName: \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"runtimeActions.js","sources":["../../../../src/data/ai/PromptRunEditor/runtimeActions.tsx"],"sourcesContent":["import { UiShield, UiSliders } from \"../../../icons\";\nimport { cn } from \"../../../lib/utils\";\nimport type { DropdownMenuItem } from \"../../../overlay/DropdownMenu\";\nimport { presetForRef } from \"../../../lib/runtime-profile-model\";\nimport { Icon } from \"../../Icon\";\nimport type { RuntimeBarAction } from \"../../runtime/RuntimeBarActions\";\nimport type { ChatModel } from \"../../chat/types\";\nimport {\n SEGMENT_CAPTION_CLASS,\n SEGMENT_KEY_CLASS,\n SegmentItemLabel,\n} from \"../../runtime/RuntimeBarSegment\";\nimport {\n familyForMode,\n familyForModel,\n modeOptionFor,\n type SpecRuntimeFamily,\n} from \"../../runtime/runtime-mode\";\nimport {\n UNSPECIFIED_LABEL,\n UNSPECIFIED_NAME,\n unspecifiedHint,\n} from \"../../runtime/unspecified\";\nimport { sessionTone } from \"../session-tones\";\nimport type { RuntimePreset } from \"../runtime-profile\";\nimport {\n SPEC_PERMISSION_MODES,\n type AISpecRuntimeValue,\n type SpecPermissionMode,\n} from \"../SpecRuntimeEditor.model\";\nimport {\n collapsePermissionModeAliases,\n permissionModeVisual,\n} from \"../SpecRuntimeEditor/permission-mode-visuals\";\nimport { publishedPermissionModes } from \"../SpecRuntimeEditor/permissions-model\";\nimport { withPermissionMode } from \"../SpecRuntimeEditor/update\";\n\nconst PERMISSION_GROUP = \"Permission posture\";\nconst PRESETS_GROUP = \"Presets\";\n\n/**\n * The `permissions.mode` field as a runtime-bar action. Narrowing, aliasing and\n * labelling follow `PermissionModeField` exactly, so the bar and the spec\n * modal never disagree about which postures a runtime publishes.\n *\n * Undefined when the resolved runtime publishes no postures (schema\n * `enum: null`) and the spec holds none either — there is nothing to edit.\n */\nexport function permissionField({\n spec,\n families,\n effectiveMode,\n effectiveModel,\n onChange,\n models = [],\n}: {\n spec: AISpecRuntimeValue;\n families: SpecRuntimeFamily[];\n effectiveMode?: string | undefined;\n effectiveModel?: string | undefined;\n onChange: (spec: AISpecRuntimeValue) => void;\n models?: ChatModel[];\n}): RuntimeBarAction | undefined {\n const specMode = spec.mode?.trim() || effectiveMode?.trim();\n const family =\n familyForModel(families, models, spec.model ?? spec.id ?? effectiveModel) ??\n (specMode ? familyForMode(families, specMode) : undefined);\n const runtime = specMode\n ? modeOptionFor(families, specMode, family?.id)\n : undefined;\n const available = publishedPermissionModes(runtime?.schema);\n const published = SPEC_PERMISSION_MODES.filter((mode) =>\n available.includes(mode),\n );\n const current = spec.permissions?.mode;\n const support = Object.fromEntries(\n published.map((mode) => [\n mode,\n runtime?.permissions?.modes[mode] ?? { kind: \"native\" as const },\n ]),\n );\n const visible = collapsePermissionModeAliases(\n family?.id,\n published,\n current,\n support,\n );\n // A posture the runtime does not publish is a misconfiguration the operator\n // must see, not one the bar may silently drop.\n const unpublished = current !== undefined && !published.includes(current);\n if (visible.length === 0 && !unpublished) return undefined;\n\n const runtimeLabel = runtime\n ? `${family?.label ?? specMode} ${runtime.label}`\n : specMode ?? \"the current runtime\";\n const currentVisual = current\n ? permissionModeVisual(family?.id, current)\n : undefined;\n const select = (mode: SpecPermissionMode | undefined) =>\n onChange(withPermissionMode(spec, mode));\n\n return {\n id: \"permissions.mode\",\n isSet: current !== undefined,\n label: PERMISSION_GROUP,\n icon: currentVisual?.icon ?? UiShield,\n iconClassName: unpublished\n ? \"text-destructive\"\n : currentVisual\n ? sessionTone(currentVisual.tone).text\n : \"text-muted-foreground\",\n title: unpublished\n ? `${PERMISSION_GROUP} — ${currentVisual?.label} is not available for ${runtimeLabel}`\n : `${PERMISSION_GROUP} — ${currentVisual?.label ?? UNSPECIFIED_NAME}`,\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>Perms</span>\n {currentVisual && (\n <Icon\n icon={currentVisual.icon}\n className={cn(\n \"size-4 shrink-0\",\n unpublished\n ? \"text-destructive\"\n : sessionTone(currentVisual.tone).text,\n )}\n />\n )}\n <span\n className={cn(\n SEGMENT_CAPTION_CLASS,\n \"shrink-0\",\n unpublished && \"text-destructive\",\n )}\n >\n {currentVisual?.label ?? UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={UNSPECIFIED_LABEL}\n hint={unspecifiedHint()}\n selected={current === undefined}\n />\n ),\n onSelect: () => select(undefined),\n },\n ...visible.map((mode) => {\n const visual = permissionModeVisual(family?.id, mode);\n const cell = support[mode];\n return {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={visual.label}\n {...(cell?.effects?.note ? { hint: cell.effects.note } : {})}\n selected={mode === current}\n stacked\n />\n ),\n icon: visual.icon,\n iconClassName: sessionTone(visual.tone).text,\n onSelect: () => select(mode),\n };\n }),\n ...(unpublished && current\n ? [\n {\n group: PERMISSION_GROUP,\n label: (\n <SegmentItemLabel\n text={permissionModeVisual(family?.id, current).label}\n hint={`not available for ${runtimeLabel}`}\n selected\n stacked\n />\n ),\n icon: permissionModeVisual(family?.id, current).icon,\n iconClassName: \"text-destructive\",\n disabled: true,\n onSelect: () => {},\n },\n ]\n : []),\n ],\n };\n}\n\n/**\n * Preset selection as a runtime-bar action. Toggling happens in the menu;\n * ORDERING does not — reordering needs move controls, which cannot live inside\n * `role=\"menu\"` — so the field hands that off to a host-owned modal.\n */\nexport function presetsField({\n presets,\n value,\n onChange,\n onReorder,\n}: {\n presets: RuntimePreset[];\n value: string[];\n onChange: (next: string[]) => void;\n onReorder: () => void;\n}): RuntimeBarAction {\n const rows = value.map((ref) => ({\n ref,\n preset: presetForRef(ref, presets),\n }));\n const names = rows.map(({ ref, preset }) => preset?.name ?? ref);\n const missing = rows.some(({ preset }) => !preset);\n\n const toggle = (preset: RuntimePreset) => {\n const index = rows.findIndex((row) => row.preset?.id === preset.id);\n // Removing keeps the surviving order; adding appends, so the newest preset\n // resolves last and therefore wins.\n onChange(\n index === -1\n ? [...value, preset.id]\n : value.filter((_, itemIndex) => itemIndex !== index),\n );\n };\n\n return {\n id: \"presets\",\n isSet: value.length > 0,\n label: PRESETS_GROUP,\n title:\n names.length > 0 ? `Presets — ${names.join(\", \")}` : \"Presets — none\",\n caption: (\n <>\n <span className={cn(SEGMENT_KEY_CLASS, \"min-w-0 truncate\")}>\n Presets\n </span>\n <span className={cn(SEGMENT_CAPTION_CLASS, \"shrink-0\")}>\n {names.length > 0 ? String(names.length) : UNSPECIFIED_LABEL}\n </span>\n </>\n ),\n items: [\n ...presets.map((preset) => ({\n group: PRESETS_GROUP,\n label: (\n <SegmentItemLabel\n text={preset.name}\n {...(preset.description ? { hint: preset.description } : {})}\n selected={rows.some((row) => row.preset?.id === preset.id)}\n stacked\n />\n ),\n onSelect: () => toggle(preset),\n })),\n // Ordering matters past one preset; a reference the catalog cannot\n // resolve is only removable there, so it opens the modal on its own.\n ...(names.length >= 2 || missing\n ? [\n {\n group: \"Order\",\n label: \"Reorder presets…\",\n icon: UiSliders,\n onSelect: onReorder,\n } satisfies DropdownMenuItem,\n ]\n : []),\n ],\n };\n}\n"],"names":["_a"],"mappings":"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"}
@@ -89,7 +89,6 @@ function PendingApprovalRow({
89
89
  onResolve
90
90
  }) {
91
91
  const [error, setError] = react.useState(void 0);
92
- const [busy, setBusy] = react.useState(false);
93
92
  const part = {
94
93
  type: "dynamic-tool",
95
94
  toolName: request.tool,
@@ -106,10 +105,9 @@ function PendingApprovalRow({
106
105
  const handleApprove = (approvalId, approved, reason) => {
107
106
  if (!onResolve) return;
108
107
  setError(void 0);
109
- setBusy(true);
110
- void Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
108
+ return Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
111
109
  setError(err instanceof Error ? err.message : String(err));
112
- }).finally(() => setBusy(false));
110
+ });
113
111
  };
114
112
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20", children: [
115
113
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
@@ -145,10 +143,9 @@ function PendingApprovalRow({
145
143
  {
146
144
  part,
147
145
  defaultOpen: true,
148
- onApprove: busy ? void 0 : handleApprove
146
+ onApprove: handleApprove
149
147
  }
150
148
  ),
151
- busy ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1.5 pl-4 text-xs text-muted-foreground", children: "Submitting…" }) : null,
152
149
  error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", className: "mt-1.5 pl-4 text-xs text-destructive", children: error }) : null
153
150
  ] });
154
151
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n )}\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","decisionFields","formatDate","TypedApprovalBody","ToolCall","durationLabel"],"mappings":"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"}
1
+ {"version":3,"file":"SessionInspector.approvals.cjs","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n return Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={handleApprove}\n />\n )}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":["pendingApprovalRequests","jsx","EmptyState","jsxs","KeyValueList","kv","SimpleList","Icon","UiClock","useState","decisionFields","formatDate","TypedApprovalBody","ToolCall","durationLabel"],"mappings":"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"}
@@ -87,7 +87,6 @@ function PendingApprovalRow({
87
87
  onResolve
88
88
  }) {
89
89
  const [error, setError] = useState(void 0);
90
- const [busy, setBusy] = useState(false);
91
90
  const part = {
92
91
  type: "dynamic-tool",
93
92
  toolName: request.tool,
@@ -104,10 +103,9 @@ function PendingApprovalRow({
104
103
  const handleApprove = (approvalId, approved, reason) => {
105
104
  if (!onResolve) return;
106
105
  setError(void 0);
107
- setBusy(true);
108
- void Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
106
+ return Promise.resolve(onResolve(approvalId, approved ? "approve" : "deny", reason)).catch((err) => {
109
107
  setError(err instanceof Error ? err.message : String(err));
110
- }).finally(() => setBusy(false));
108
+ });
111
109
  };
112
110
  return /* @__PURE__ */ jsxs("div", { className: "rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20", children: [
113
111
  /* @__PURE__ */ jsxs("div", { className: "mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground", children: [
@@ -143,10 +141,9 @@ function PendingApprovalRow({
143
141
  {
144
142
  part,
145
143
  defaultOpen: true,
146
- onApprove: busy ? void 0 : handleApprove
144
+ onApprove: handleApprove
147
145
  }
148
146
  ),
149
- busy ? /* @__PURE__ */ jsx("p", { className: "mt-1.5 pl-4 text-xs text-muted-foreground", children: "Submitting…" }) : null,
150
147
  error ? /* @__PURE__ */ jsx("p", { role: "alert", className: "mt-1.5 pl-4 text-xs text-destructive", children: error }) : null
151
148
  ] });
152
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SessionInspector.approvals.js","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n const [busy, setBusy] = useState(false);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n setBusy(true);\n void Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n })\n .finally(() => setBusy(false));\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={busy ? undefined : handleApprove}\n />\n )}\n {busy ? (\n <p className=\"mt-1.5 pl-4 text-xs text-muted-foreground\">\n Submitting…\n </p>\n ) : null}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionInspector.approvals.js","sources":["../../../src/data/ai/SessionInspector.approvals.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { KeyValueList } from \"../KeyValueList\";\nimport { Icon } from \"../Icon\";\nimport { UiClock } from \"../../icons\";\nimport { ToolCall } from \"../chat/ToolCall\";\nimport type { AnyToolPart } from \"../chat/types\";\nimport { durationLabel, formatDate } from \"./SessionInspector.model\";\nimport { EmptyState, SimpleList } from \"./SessionInspector.panel-parts\";\nimport { kv } from \"./SessionInspector.panel-values\";\nimport {\n type ApprovalResolveHandler,\n decisionFields,\n pendingApprovalRequests,\n} from \"./SessionInspector.approvals-model\";\nimport { TypedApprovalBody } from \"./SessionViewer.approval-body\";\nimport type { DecisionHandler } from \"./SessionViewer.decision\";\nimport type {\n SessionApprovalRequest,\n SessionApprovalStats,\n} from \"./SessionViewer.unified\";\n\nexport type {\n ApprovalResolveAction,\n ApprovalResolveHandler,\n} from \"./SessionInspector.approvals-model\";\n\n/** Renders every pending tool approval directly from `session.requests[]`\n * (never from transcript parts — an approval brokered outside this session's\n * own chat has no transcript part) plus the resolved approve/deny/denial\n * summary the panel previously showed alone. */\nexport function SessionApprovalsPanel({\n approvals,\n requests,\n onResolve,\n}: {\n approvals: SessionApprovalStats | undefined;\n requests?: SessionApprovalRequest[] | undefined;\n onResolve?: ApprovalResolveHandler;\n}) {\n const pending = pendingApprovalRequests(requests);\n const hasResolvedSummary = Boolean(\n approvals &&\n (approvals.approved ||\n approvals.denied ||\n approvals.cancelled ||\n approvals.expired ||\n approvals.denials?.length),\n );\n\n if (!pending.length && !hasResolvedSummary) {\n return <EmptyState>No approval metadata.</EmptyState>;\n }\n\n return (\n <div className=\"space-y-density-4\">\n {pending.length ? (\n <PendingApprovalsList\n requests={pending}\n {...(onResolve ? { onResolve } : {})}\n />\n ) : null}\n {hasResolvedSummary ? (\n <ResolvedApprovalsSummary approvals={approvals!} />\n ) : null}\n </div>\n );\n}\n\nfunction ResolvedApprovalsSummary({\n approvals,\n}: {\n approvals: SessionApprovalStats;\n}) {\n return (\n <div className=\"space-y-density-4\">\n <KeyValueList\n items={[\n kv(\"Approved\", approvals.approved ?? 0),\n kv(\"Denied\", approvals.denied ?? 0),\n kv(\"Cancelled\", approvals.cancelled ?? 0),\n kv(\"Expired\", approvals.expired ?? 0),\n ]}\n />\n {approvals.denials?.length ? (\n <SimpleList\n title=\"Denials\"\n rows={approvals.denials.map((denial, index) => ({\n key: denial.toolUseId || `${denial.tool}-${index}`,\n title: [denial.tool, denial.toolUseId].filter(Boolean).join(\" \"),\n detail: denial.reason,\n }))}\n />\n ) : null}\n </div>\n );\n}\n\nfunction PendingApprovalsList({\n requests,\n onResolve,\n}: {\n requests: SessionApprovalRequest[];\n onResolve?: ApprovalResolveHandler;\n}) {\n return (\n <section>\n <h3 className=\"mb-density-2 flex items-center gap-1.5 text-xs font-semibold uppercase text-amber-600 dark:text-amber-400\">\n <Icon icon={UiClock} className=\"size-3.5\" />\n Awaiting approval ({requests.length})\n </h3>\n <ul className=\"space-y-density-2\">\n {requests.map((request) => (\n <li key={request.id}>\n <PendingApprovalRow\n request={request}\n {...(onResolve ? { onResolve } : {})}\n />\n </li>\n ))}\n </ul>\n </section>\n );\n}\n\nfunction PendingApprovalRow({\n request,\n onResolve,\n}: {\n request: SessionApprovalRequest;\n onResolve?: ApprovalResolveHandler;\n}) {\n const [error, setError] = useState<string | undefined>(undefined);\n\n const part: AnyToolPart = {\n type: \"dynamic-tool\",\n toolName: request.tool,\n toolCallId: request.toolCallId || request.id,\n state: \"approval-requested\",\n input: request.input,\n approval: { id: request.id },\n };\n\n const typed = request.request;\n const decideTyped: DecisionHandler | undefined = onResolve\n ? async (decision) => {\n const fields = decisionFields(decision);\n await (fields\n ? onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message, fields)\n : onResolve(request.id, decision.allow ? \"approve\" : \"deny\", decision.message));\n }\n : undefined;\n\n const handleApprove = (\n approvalId: string,\n approved: boolean,\n reason?: string,\n ) => {\n if (!onResolve) return;\n setError(undefined);\n return Promise.resolve(onResolve(approvalId, approved ? \"approve\" : \"deny\", reason))\n .catch((err: unknown) => {\n setError(err instanceof Error ? err.message : String(err));\n });\n };\n\n return (\n <div className=\"rounded-md border border-amber-300/60 bg-amber-50/40 p-density-3 dark:border-amber-800/60 dark:bg-amber-950/20\">\n <div className=\"mb-1 flex flex-wrap items-center justify-between gap-2 text-[11px] text-muted-foreground\">\n <span>\n {request.requestedBy\n ? `Requested by ${request.requestedBy}`\n : \"Requested\"}\n </span>\n <span className=\"flex gap-density-3\">\n {request.createdAt ? (\n <span title={formatDate(request.createdAt)}>\n {ageLabel(request.createdAt)} ago\n </span>\n ) : null}\n {request.expiresAt ? (\n <span title={formatDate(request.expiresAt)}>\n {remainingLabel(request.expiresAt)}\n </span>\n ) : null}\n </span>\n </div>\n {typed ? (\n <div className=\"not-prose\">\n <div className=\"font-medium text-foreground\">{request.tool}</div>\n <TypedApprovalBody\n event={{\n id: request.id,\n kind: \"tool\",\n tool: request.tool,\n pending: true,\n approvalId: request.id,\n approvalKind: typed.kind,\n approvalRequest: typed,\n }}\n request={typed}\n onDecision={decideTyped}\n />\n </div>\n ) : (\n <ToolCall\n part={part}\n defaultOpen\n onApprove={handleApprove}\n />\n )}\n {error ? (\n <p role=\"alert\" className=\"mt-1.5 pl-4 text-xs text-destructive\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction ageLabel(createdAt: string): string {\n return durationLabel(createdAt) || \"0s\";\n}\n\nfunction remainingLabel(expiresAt: string): string {\n const expiry = new Date(expiresAt).getTime();\n if (Number.isNaN(expiry)) return \"\";\n const now = Date.now();\n if (expiry <= now) return \"expired\";\n const label = durationLabel(new Date(now).toISOString(), expiresAt);\n return label ? `${label} left` : \"\";\n}\n"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ const SessionViewer_header = require("./SessionViewer.header.cjs");
15
15
  const sessionCategories = require("./session-categories.cjs");
16
16
  const SessionViewerMenu = require("./SessionViewerMenu.cjs");
17
17
  const useSessionScroll = require("./use-session-scroll.cjs");
18
+ const useSessionTokenSizing = require("./use-session-token-sizing.cjs");
18
19
  const UiRobotAi = require("../../icons/components/UiRobotAi.cjs");
19
20
  const UiArrowDown = require("../../icons/components/UiArrowDown.cjs");
20
21
  function toggleInSet(set, value) {
@@ -44,7 +45,8 @@ function SessionViewer({
44
45
  showRaw = false,
45
46
  renderMessageBadge,
46
47
  pendingTools = [],
47
- onPendingToolDecision
48
+ onPendingToolDecision,
49
+ sizeTokens
48
50
  }) {
49
51
  var _a, _b;
50
52
  const allEvents = react.useMemo(
@@ -53,6 +55,7 @@ function SessionViewer({
53
55
  );
54
56
  const displayItems = react.useMemo(() => SessionViewer_grouping.collapseWaitRuns(allEvents), [allEvents]);
55
57
  const metadata = react.useMemo(() => SessionViewer_model.getSessionMetadata(session), [session]);
58
+ const tokenSizing = useSessionTokenSizing.useSessionTokenSizing(session, allEvents, sizeTokens);
56
59
  const pageDensity = useDensity.useDensityValue();
57
60
  const [densityOverride, setDensityOverride] = react.useState(
58
61
  defaultDensity
@@ -68,6 +71,7 @@ function SessionViewer({
68
71
  const [showThinkingOverride, setShowThinkingOverride] = react.useState(void 0);
69
72
  const effectiveShowThinking = showThinkingOverride ?? showThinking;
70
73
  const [showEncryptedReasoning, setShowEncryptedReasoning] = react.useState(false);
74
+ const [showEstimatedToolCost, setShowEstimatedToolCost] = react.useState(false);
71
75
  const filters = react.useMemo(() => sessionCategories.collectSessionFilters(allEvents), [allEvents]);
72
76
  const hasThinking = react.useMemo(
73
77
  () => allEvents.some((e) => e.kind === "thinking"),
@@ -134,7 +138,10 @@ function SessionViewer({
134
138
  hasThinking,
135
139
  hasEncryptedReasoning,
136
140
  showEncryptedReasoning,
137
- onToggleEncryptedReasoning: () => setShowEncryptedReasoning((shown) => !shown)
141
+ onToggleEncryptedReasoning: () => setShowEncryptedReasoning((shown) => !shown),
142
+ showEstimatedToolCost,
143
+ onToggleEstimatedToolCost: () => setShowEstimatedToolCost((shown) => !shown),
144
+ ...tokenSizing.estimateAll ? { onEstimateTokens: tokenSizing.estimateAll, onCalculateMissingTokens: tokenSizing.calculateMissing, estimatingTokens: tokenSizing.pending } : {}
138
145
  }
139
146
  ) : null;
140
147
  const inlineMenu = menu && !menuContainer;
@@ -148,6 +155,7 @@ function SessionViewer({
148
155
  {
149
156
  group: item,
150
157
  last,
158
+ showEstimatedToolCost,
151
159
  defaultExpanded,
152
160
  showRowMetadata,
153
161
  showRaw,
@@ -160,6 +168,7 @@ function SessionViewer({
160
168
  {
161
169
  event: item,
162
170
  initialPrompt: item.id === firstUserEventId,
171
+ showEstimatedToolCost,
163
172
  last,
164
173
  defaultExpanded,
165
174
  showRowMetadata,
@@ -180,7 +189,7 @@ function SessionViewer({
180
189
  className
181
190
  ),
182
191
  ...dataAttrs,
183
- children: /* @__PURE__ */ jsxRuntime.jsxs(densityProvider.DensityValueProvider, { density: effectiveDensity, children: [
192
+ children: /* @__PURE__ */ jsxRuntime.jsx(useSessionTokenSizing.SessionTokenContext.Provider, { value: tokenSizing.context, children: /* @__PURE__ */ jsxRuntime.jsxs(densityProvider.DensityValueProvider, { density: effectiveDensity, children: [
184
193
  menu && menuContainer && reactDom.createPortal(menu, menuContainer),
185
194
  (showHeader || headerActions || inlineMenu) && /* @__PURE__ */ jsxRuntime.jsxs(
186
195
  "div",
@@ -252,7 +261,7 @@ function SessionViewer({
252
261
  }
253
262
  )
254
263
  ] }) : list
255
- ] })
264
+ ] }) })
256
265
  }
257
266
  );
258
267
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.cjs","sources":["../../../src/data/ai/SessionViewer.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { useDensityValue, type Density } from \"../../hooks/use-density\";\nimport { DensityValueProvider } from \"../../hooks/density-provider\";\nimport { UiArrowDown, UiRobotAi } from \"../../icons\";\nimport {\n getSessionMetadata,\n normalizeSession,\n summarizeSession,\n type SessionEvent,\n type SessionInput,\n} from \"./SessionViewer.model\";\nimport {\n collapseWaitRuns,\n isSessionEventGroup,\n} from \"./SessionViewer.grouping\";\nimport { SessionRow, WaitGroupRow } from \"./SessionViewer.rows\";\nimport { SessionMetadataBadges } from \"./SessionViewer.header\";\nimport {\n collectSessionFilters,\n isEncryptedReasoning,\n isEventVisible,\n type SessionCategory,\n} from \"./session-categories\";\nimport {\n SessionViewerMenu,\n type SessionThemeOverride,\n} from \"./SessionViewerMenu\";\nimport { useSessionScroll } from \"./use-session-scroll\";\nimport type {\n ApprovalDecisionFields,\n ApprovalKind,\n ApprovalRequest,\n} from \"./approval-request\";\n\nexport type {\n SessionEntry,\n SessionEvent,\n SessionInput,\n SessionActionMeta,\n} from \"./SessionViewer.model\";\nexport type { SessionThemeOverride } from \"./SessionViewerMenu\";\n\nexport interface SessionPendingTool {\n tool: string;\n input?: Record<string, unknown>;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n /** What kind of approval this is. Absent means an untyped tool approval, which\n * renders as Allow / Reject. */\n kind?: ApprovalKind;\n /** The typed approval request; drives the per-kind controls. */\n request?: ApprovalRequest;\n}\n\n/** A decision on one pending tool. `allow`/`message`/`answers` are the original\n * fields; `interrupt`, `scope`, `grants` and `content` are set only for a typed\n * request that offers them. */\nexport interface SessionToolDecision extends ApprovalDecisionFields {\n event: SessionEvent;\n allow: boolean;\n message?: string;\n}\n\nexport interface SessionViewerProps {\n /** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */\n session: SessionInput;\n className?: string;\n /** Expand each tool call's input/output by default. Defaults to false. */\n defaultExpanded?: boolean;\n /** Render assistant reasoning (\"thinking\") blocks. Defaults to true. */\n showThinking?: boolean;\n /** Show the summary header (model + action counts). Defaults to true. */\n showHeader?: boolean;\n /** Show context usage in the summary header. Defaults to true. */\n showContextMeter?: boolean;\n /** Show the 3-dot menu (density + category/tool/source filters). Defaults to true. */\n showMenu?: boolean;\n /** Controls rendered beside the 3-dot menu in the summary header. */\n headerActions?: ReactNode;\n /** Host controls rendered at the top of the 3-dot menu. */\n menuHeader?: ReactNode;\n /** Portal the 3-dot menu into this element instead of rendering it inline in\n * the summary header — lets a host place the menu in its own toolbar while the\n * filter/density state stays owned by the viewer. Ignored when `showMenu` is\n * false; falls back to inline rendering when null/undefined. */\n menuContainer?: Element | null;\n /** Initial density override; undefined inherits the page/document density. */\n defaultDensity?: Density;\n /** Initial theme override; undefined inherits the page/document `data-theme`. */\n defaultTheme?: SessionThemeOverride;\n /** Own an internal scroll container that fills its parent's height: render only\n * the newest screenful, stay pinned to the bottom (most recent activity), and\n * backfill older rows as the reader scrolls up. Off by default, so inline\n * consumers keep rendering the whole log in normal page flow. Requires a\n * height-bounded parent. */\n scrollable?: boolean;\n /** Rows rendered on first paint in `scrollable` mode. Defaults to 60. */\n windowSize?: number;\n /** Rows added each time older content loads in `scrollable` mode. Defaults to 40. */\n batchSize?: number;\n /** Stable identity used to reset the transcript window when switching sessions. */\n scrollResetKey?: string;\n /** Show per-row timestamp/source/model/turn/agent metadata. Defaults to false. */\n showRowMetadata?: boolean;\n /** Show a per-row raw JSON payload expander when available. Defaults to false. */\n showRaw?: boolean;\n /** Render content before each assistant message body. */\n renderMessageBadge?: (event: SessionEvent) => ReactNode;\n pendingTools?: readonly SessionPendingTool[];\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}\n\nfunction toggleInSet<T>(set: ReadonlySet<T>, value: T): Set<T> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\n/**\n * SessionViewer renders a recorded AI coding-agent session (the captain\n * `pkg/ai/history` JSON schema — Claude Code / Codex transcripts) as a vertical\n * action log. Each entry sits on a tone-colored icon disc from the Flanksource\n * \"Agent Action Icons\" set; user prompts/selections are right-aligned like a\n * chat. Shell commands render inline as bash blocks and file ops as their\n * cwd-relative path — the icon carries the verb. Tool responses expand behind\n * a chevron, rendered bare (no panel chrome). The \"3-dot\" menu mirrors\n * `captain history` filtering — toggle density and hide categories, tools or\n * sources.\n */\nexport function SessionViewer({\n session,\n className,\n defaultExpanded = false,\n showThinking = true,\n showHeader = true,\n showContextMeter = true,\n showMenu = true,\n headerActions,\n menuHeader,\n menuContainer,\n defaultDensity,\n defaultTheme,\n scrollable = false,\n windowSize = 60,\n batchSize = 40,\n scrollResetKey,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n pendingTools = [],\n onPendingToolDecision,\n}: SessionViewerProps) {\n const allEvents = useMemo(\n () => mergePendingTools(normalizeSession(session), pendingTools),\n [session, pendingTools],\n );\n const displayItems = useMemo(() => collapseWaitRuns(allEvents), [allEvents]);\n const metadata = useMemo(() => getSessionMetadata(session), [session]);\n\n const pageDensity = useDensityValue();\n const [densityOverride, setDensityOverride] = useState<Density | undefined>(\n defaultDensity,\n );\n const [themeOverride, setThemeOverride] = useState<\n SessionThemeOverride | undefined\n >(defaultTheme);\n const [hiddenCategories, setHiddenCategories] = useState<\n ReadonlySet<SessionCategory>\n >(() => new Set());\n const [hiddenTools, setHiddenTools] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const [hiddenSources, setHiddenSources] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n // Undefined = follow the `showThinking` prop; the menu toggle sets an override.\n const [showThinkingOverride, setShowThinkingOverride] = useState<\n boolean | undefined\n >(undefined);\n const effectiveShowThinking = showThinkingOverride ?? showThinking;\n const [showEncryptedReasoning, setShowEncryptedReasoning] = useState(false);\n\n const filters = useMemo(() => collectSessionFilters(allEvents), [allEvents]);\n const hasThinking = useMemo(\n () => allEvents.some((e) => e.kind === \"thinking\"),\n [allEvents],\n );\n const hasEncryptedReasoning = useMemo(\n () => allEvents.some(isEncryptedReasoning),\n [allEvents],\n );\n\n const visibility = {\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n showThinking: effectiveShowThinking,\n };\n const items = displayItems.filter((item) => {\n const event = isSessionEventGroup(item) ? item.representative : item;\n return (showEncryptedReasoning || !isEncryptedReasoning(event)) && isEventVisible(event, visibility);\n });\n const firstUserEventId = allEvents.find((event) => event.kind === \"user\")?.id;\n\n // Reset the window when the underlying session changes, not on filter toggles —\n // so hiding a category doesn't yank the reader back to the bottom.\n const resetKey = scrollResetKey ?? allEvents[0]?.id ?? \"\";\n const { scrollRef, contentRef, startIndex, following, resumeFollowing } = useSessionScroll({\n total: items.length,\n enabled: scrollable,\n windowSize,\n batchSize,\n resetKey,\n });\n\n if (allEvents.length === 0) {\n return (\n <div\n className={cn(\n \"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No session activity.\n </div>\n );\n }\n\n const summary = summarizeSession(allEvents);\n const effectiveDensity = densityOverride ?? pageDensity;\n const dataAttrs: Record<string, string> = {\n ...(densityOverride ? { \"data-density\": densityOverride } : {}),\n ...(themeOverride ? { \"data-theme\": themeOverride } : {}),\n };\n\n const menu = showMenu ? (\n <SessionViewerMenu\n menuHeader={menuHeader}\n density={densityOverride}\n onDensityChange={setDensityOverride}\n theme={themeOverride}\n onThemeChange={setThemeOverride}\n filters={filters}\n hiddenCategories={hiddenCategories}\n hiddenTools={hiddenTools}\n hiddenSources={hiddenSources}\n onToggleCategory={(category) =>\n setHiddenCategories((set) => toggleInSet(set, category))\n }\n onToggleTool={(tool) => setHiddenTools((set) => toggleInSet(set, tool))}\n onToggleSource={(source) =>\n setHiddenSources((set) => toggleInSet(set, source))\n }\n showThinking={effectiveShowThinking}\n onToggleThinking={() => setShowThinkingOverride(!effectiveShowThinking)}\n hasThinking={hasThinking}\n hasEncryptedReasoning={hasEncryptedReasoning}\n showEncryptedReasoning={showEncryptedReasoning}\n onToggleEncryptedReasoning={() => setShowEncryptedReasoning((shown) => !shown)}\n />\n ) : null;\n // When a host supplies `menuContainer`, the menu is portaled into it (e.g. the\n // host's own toolbar) and the inline header collapses to just its summary.\n const inlineMenu = menu && !menuContainer;\n\n const list =\n items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\">\n All actions are hidden by the active filters.\n </div>\n ) : (\n // In scrollable mode only the newest `startIndex..` slice is mounted; `last`\n // is measured against the full length so the timeline connector stays right.\n <ol className=\"relative\">\n {items.slice(startIndex).map((item, index) => {\n const last = startIndex + index === items.length - 1;\n return isSessionEventGroup(item) ? (\n <WaitGroupRow\n key={item.id}\n group={item}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ) : (\n <SessionRow\n key={item.id}\n event={item}\n initialPrompt={item.id === firstUserEventId}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n })}\n </ol>\n );\n\n return (\n <div\n className={cn(\n \"@container/session-viewer min-w-0 bg-background text-sm text-foreground data-[theme=dark]:bg-[var(--fs-bg-subtle)] [[data-theme=dark]_&]:bg-[var(--fs-bg-subtle)]\",\n scrollable && \"flex h-full min-h-0 flex-col\",\n className,\n )}\n {...dataAttrs}\n >\n <DensityValueProvider density={effectiveDensity}>\n {menu && menuContainer && createPortal(menu, menuContainer)}\n {(showHeader || headerActions || inlineMenu) && (\n <div\n data-session-viewer-header\n className={cn(\n \"flex min-w-0 flex-wrap items-center justify-between gap-x-density-3 gap-y-density-2\",\n scrollable\n ? \"shrink-0 border-b border-border px-density-3 py-density-2 @min-[48rem]/session-viewer:px-density-4\"\n : \"mb-density-3\",\n )}\n >\n {showHeader && (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {summary.model && (\n <span className=\"inline-flex items-center gap-1 font-medium text-foreground\">\n <Icon icon={UiRobotAi} className=\"size-3.5\" />\n {summary.model}\n </span>\n )}\n <span>{summary.toolCount} actions</span>\n <span>{summary.messageCount} messages</span>\n {metadata && (\n <SessionMetadataBadges\n metadata={metadata}\n showContextMeter={showContextMeter}\n />\n )}\n </div>\n )}\n {(headerActions || inlineMenu) && (\n <div\n role=\"group\"\n aria-label=\"Session viewer actions\"\n className=\"ml-auto flex min-w-0 shrink-0 items-center gap-density-2\"\n >\n {headerActions}\n {inlineMenu && menu}\n </div>\n )}\n </div>\n )}\n\n {scrollable ? (\n <div className=\"relative min-h-0 flex-1\">\n <div ref={scrollRef} className=\"h-full overflow-y-auto\">\n <div\n ref={contentRef}\n data-session-viewer-content\n className=\"p-density-3 @min-[48rem]/session-viewer:p-density-4\"\n >\n {list}\n </div>\n </div>\n {!following && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={resumeFollowing}\n className=\"absolute bottom-density-3 left-1/2 -translate-x-1/2 shadow-md\"\n >\n <Icon icon={UiArrowDown} className=\"size-4\" />\n Scroll to bottom\n </Button>\n )}\n </div>\n ) : (\n list\n )}\n </DensityValueProvider>\n </div>\n );\n}\n\nfunction mergePendingTools(\n events: SessionEvent[],\n pendingTools: readonly SessionPendingTool[],\n): SessionEvent[] {\n const merged = [...events];\n for (const [index, pending] of pendingTools.entries()) {\n const matches = merged.filter(\n (event) =>\n event.kind === \"tool\" &&\n ((pending.toolCallId && event.toolCallId === pending.toolCallId) ||\n (pending.approvalId && event.approvalId === pending.approvalId) ||\n (pending.sessionId &&\n event.sessionId === pending.sessionId &&\n event.tool === pending.tool)),\n );\n const match = matches.length === 1 ? matches[0] : undefined;\n if (match) {\n Object.assign(match, {\n pending: true,\n toolInput: pending.input ?? match.toolInput,\n toolCallId: pending.toolCallId ?? match.toolCallId,\n approvalId: pending.approvalId ?? match.approvalId,\n sessionId: pending.sessionId ?? match.sessionId,\n ...approvalFields(pending),\n });\n } else {\n merged.push({\n id: `pending-${\n pending.approvalId ?? pending.toolCallId ?? `${pending.tool}-${index}`\n }`,\n kind: \"tool\",\n tool: pending.tool,\n ...(pending.input ? { toolInput: pending.input } : {}),\n ...(pending.toolCallId ? { toolCallId: pending.toolCallId } : {}),\n ...(pending.approvalId ? { approvalId: pending.approvalId } : {}),\n ...(pending.sessionId ? { sessionId: pending.sessionId } : {}),\n ...approvalFields(pending),\n pending: true,\n });\n }\n }\n return merged;\n}\n\nfunction approvalFields(\n pending: SessionPendingTool,\n): Pick<SessionEvent, \"approvalKind\" | \"approvalRequest\"> {\n const kind = pending.kind ?? pending.request?.kind;\n return {\n ...(kind ? { approvalKind: kind } : {}),\n ...(pending.request ? { approvalRequest: pending.request } : {}),\n };\n}\n"],"names":["useMemo","normalizeSession","collapseWaitRuns","getSessionMetadata","useDensityValue","useState","collectSessionFilters","isEncryptedReasoning","isSessionEventGroup","isEventVisible","useSessionScroll","jsx","cn","summarizeSession","SessionViewerMenu","WaitGroupRow","SessionRow","jsxs","DensityValueProvider","createPortal","Icon","UiRobotAi","SessionMetadataBadges","Button","UiArrowDown"],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.cjs","sources":["../../../src/data/ai/SessionViewer.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"../../lib/utils\";\nimport { Icon } from \"../Icon\";\nimport { Button } from \"../../components/button\";\nimport { useDensityValue, type Density } from \"../../hooks/use-density\";\nimport { DensityValueProvider } from \"../../hooks/density-provider\";\nimport { UiArrowDown, UiRobotAi } from \"../../icons\";\nimport {\n getSessionMetadata,\n normalizeSession,\n summarizeSession,\n type SessionEvent,\n type SessionInput,\n} from \"./SessionViewer.model\";\nimport {\n collapseWaitRuns,\n isSessionEventGroup,\n} from \"./SessionViewer.grouping\";\nimport { SessionRow, WaitGroupRow } from \"./SessionViewer.rows\";\nimport { SessionMetadataBadges } from \"./SessionViewer.header\";\nimport {\n collectSessionFilters,\n isEncryptedReasoning,\n isEventVisible,\n type SessionCategory,\n} from \"./session-categories\";\nimport {\n SessionViewerMenu,\n type SessionThemeOverride,\n} from \"./SessionViewerMenu\";\nimport { useSessionScroll } from \"./use-session-scroll\";\nimport type {\n ApprovalDecisionFields,\n ApprovalKind,\n ApprovalRequest,\n} from \"./approval-request\";\nimport type { SessionTokenSizer } from \"./session-token-sizing\";\nimport { SessionTokenContext, useSessionTokenSizing } from \"./use-session-token-sizing\";\nexport type { SessionTokenSizer, SessionTokenSize, SessionTokenSizingRequest, SessionTokenSizingResult } from \"./session-token-sizing\";\n\nexport type {\n SessionEntry,\n SessionEvent,\n SessionInput,\n SessionActionMeta,\n} from \"./SessionViewer.model\";\nexport type { SessionThemeOverride } from \"./SessionViewerMenu\";\n\nexport interface SessionPendingTool {\n tool: string;\n input?: Record<string, unknown>;\n toolCallId?: string;\n approvalId?: string;\n sessionId?: string;\n /** What kind of approval this is. Absent means an untyped tool approval, which\n * renders as Allow / Reject. */\n kind?: ApprovalKind;\n /** The typed approval request; drives the per-kind controls. */\n request?: ApprovalRequest;\n}\n\n/** A decision on one pending tool. `allow`/`message`/`answers` are the original\n * fields; `interrupt`, `scope`, `grants` and `content` are set only for a typed\n * request that offers them. */\nexport interface SessionToolDecision extends ApprovalDecisionFields {\n event: SessionEvent;\n allow: boolean;\n message?: string;\n}\n\nexport interface SessionViewerProps {\n\n /** Explicit menu actions only; never invoked automatically when a transcript loads. */\n sizeTokens?: SessionTokenSizer;\n /** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */\n session: SessionInput;\n className?: string;\n /** Expand each tool call's input/output by default. Defaults to false. */\n defaultExpanded?: boolean;\n /** Render assistant reasoning (\"thinking\") blocks. Defaults to true. */\n showThinking?: boolean;\n /** Show the summary header (model + action counts). Defaults to true. */\n showHeader?: boolean;\n /** Show context usage in the summary header. Defaults to true. */\n showContextMeter?: boolean;\n /** Show the 3-dot menu (density + category/tool/source filters). Defaults to true. */\n showMenu?: boolean;\n /** Controls rendered beside the 3-dot menu in the summary header. */\n headerActions?: ReactNode;\n /** Host controls rendered at the top of the 3-dot menu. */\n menuHeader?: ReactNode;\n /** Portal the 3-dot menu into this element instead of rendering it inline in\n * the summary header — lets a host place the menu in its own toolbar while the\n * filter/density state stays owned by the viewer. Ignored when `showMenu` is\n * false; falls back to inline rendering when null/undefined. */\n menuContainer?: Element | null;\n /** Initial density override; undefined inherits the page/document density. */\n defaultDensity?: Density;\n /** Initial theme override; undefined inherits the page/document `data-theme`. */\n defaultTheme?: SessionThemeOverride;\n /** Own an internal scroll container that fills its parent's height: render only\n * the newest screenful, stay pinned to the bottom (most recent activity), and\n * backfill older rows as the reader scrolls up. Off by default, so inline\n * consumers keep rendering the whole log in normal page flow. Requires a\n * height-bounded parent. */\n scrollable?: boolean;\n /** Rows rendered on first paint in `scrollable` mode. Defaults to 60. */\n windowSize?: number;\n /** Rows added each time older content loads in `scrollable` mode. Defaults to 40. */\n batchSize?: number;\n /** Stable identity used to reset the transcript window when switching sessions. */\n scrollResetKey?: string;\n /** Show per-row timestamp/source/model/turn/agent metadata. Defaults to false. */\n showRowMetadata?: boolean;\n /** Show a per-row raw JSON payload expander when available. Defaults to false. */\n showRaw?: boolean;\n /** Render content before each assistant message body. */\n renderMessageBadge?: (event: SessionEvent) => ReactNode;\n pendingTools?: readonly SessionPendingTool[];\n onPendingToolDecision?:\n | ((decision: SessionToolDecision) => Promise<void> | void)\n | undefined;\n}\n\nfunction toggleInSet<T>(set: ReadonlySet<T>, value: T): Set<T> {\n const next = new Set(set);\n if (next.has(value)) next.delete(value);\n else next.add(value);\n return next;\n}\n\n/**\n * SessionViewer renders a recorded AI coding-agent session (the captain\n * `pkg/ai/history` JSON schema — Claude Code / Codex transcripts) as a vertical\n * action log. Each entry sits on a tone-colored icon disc from the Flanksource\n * \"Agent Action Icons\" set; user prompts/selections are right-aligned like a\n * chat. Shell commands render inline as bash blocks and file ops as their\n * cwd-relative path — the icon carries the verb. Tool responses expand behind\n * a chevron, rendered bare (no panel chrome). The \"3-dot\" menu mirrors\n * `captain history` filtering — toggle density and hide categories, tools or\n * sources.\n */\nexport function SessionViewer({\n session,\n className,\n defaultExpanded = false,\n showThinking = true,\n showHeader = true,\n showContextMeter = true,\n showMenu = true,\n headerActions,\n menuHeader,\n menuContainer,\n defaultDensity,\n defaultTheme,\n scrollable = false,\n windowSize = 60,\n batchSize = 40,\n scrollResetKey,\n showRowMetadata = false,\n showRaw = false,\n renderMessageBadge,\n pendingTools = [],\n onPendingToolDecision,\n sizeTokens,\n}: SessionViewerProps) {\n const allEvents = useMemo(\n () => mergePendingTools(normalizeSession(session), pendingTools),\n [session, pendingTools],\n );\n const displayItems = useMemo(() => collapseWaitRuns(allEvents), [allEvents]);\n const metadata = useMemo(() => getSessionMetadata(session), [session]);\n const tokenSizing = useSessionTokenSizing(session, allEvents, sizeTokens);\n\n const pageDensity = useDensityValue();\n const [densityOverride, setDensityOverride] = useState<Density | undefined>(\n defaultDensity,\n );\n const [themeOverride, setThemeOverride] = useState<\n SessionThemeOverride | undefined\n >(defaultTheme);\n const [hiddenCategories, setHiddenCategories] = useState<\n ReadonlySet<SessionCategory>\n >(() => new Set());\n const [hiddenTools, setHiddenTools] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n const [hiddenSources, setHiddenSources] = useState<ReadonlySet<string>>(\n () => new Set(),\n );\n // Undefined = follow the `showThinking` prop; the menu toggle sets an override.\n const [showThinkingOverride, setShowThinkingOverride] = useState<\n boolean | undefined\n >(undefined);\n const effectiveShowThinking = showThinkingOverride ?? showThinking;\n const [showEncryptedReasoning, setShowEncryptedReasoning] = useState(false);\n const [showEstimatedToolCost, setShowEstimatedToolCost] = useState(false);\n\n const filters = useMemo(() => collectSessionFilters(allEvents), [allEvents]);\n const hasThinking = useMemo(\n () => allEvents.some((e) => e.kind === \"thinking\"),\n [allEvents],\n );\n const hasEncryptedReasoning = useMemo(\n () => allEvents.some(isEncryptedReasoning),\n [allEvents],\n );\n\n const visibility = {\n hiddenCategories,\n hiddenTools,\n hiddenSources,\n showThinking: effectiveShowThinking,\n };\n const items = displayItems.filter((item) => {\n const event = isSessionEventGroup(item) ? item.representative : item;\n return (showEncryptedReasoning || !isEncryptedReasoning(event)) && isEventVisible(event, visibility);\n });\n const firstUserEventId = allEvents.find((event) => event.kind === \"user\")?.id;\n\n // Reset the window when the underlying session changes, not on filter toggles —\n // so hiding a category doesn't yank the reader back to the bottom.\n const resetKey = scrollResetKey ?? allEvents[0]?.id ?? \"\";\n const { scrollRef, contentRef, startIndex, following, resumeFollowing } = useSessionScroll({\n total: items.length,\n enabled: scrollable,\n windowSize,\n batchSize,\n resetKey,\n });\n\n if (allEvents.length === 0) {\n return (\n <div\n className={cn(\n \"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\",\n className,\n )}\n >\n No session activity.\n </div>\n );\n }\n\n const summary = summarizeSession(allEvents);\n const effectiveDensity = densityOverride ?? pageDensity;\n const dataAttrs: Record<string, string> = {\n ...(densityOverride ? { \"data-density\": densityOverride } : {}),\n ...(themeOverride ? { \"data-theme\": themeOverride } : {}),\n };\n\n const menu = showMenu ? (\n <SessionViewerMenu\n menuHeader={menuHeader}\n density={densityOverride}\n onDensityChange={setDensityOverride}\n theme={themeOverride}\n onThemeChange={setThemeOverride}\n filters={filters}\n hiddenCategories={hiddenCategories}\n hiddenTools={hiddenTools}\n hiddenSources={hiddenSources}\n onToggleCategory={(category) =>\n setHiddenCategories((set) => toggleInSet(set, category))\n }\n onToggleTool={(tool) => setHiddenTools((set) => toggleInSet(set, tool))}\n onToggleSource={(source) =>\n setHiddenSources((set) => toggleInSet(set, source))\n }\n showThinking={effectiveShowThinking}\n onToggleThinking={() => setShowThinkingOverride(!effectiveShowThinking)}\n hasThinking={hasThinking}\n hasEncryptedReasoning={hasEncryptedReasoning}\n showEncryptedReasoning={showEncryptedReasoning}\n onToggleEncryptedReasoning={() => setShowEncryptedReasoning((shown) => !shown)}\n showEstimatedToolCost={showEstimatedToolCost}\n onToggleEstimatedToolCost={() => setShowEstimatedToolCost((shown) => !shown)}\n {...(tokenSizing.estimateAll ? { onEstimateTokens: tokenSizing.estimateAll, onCalculateMissingTokens: tokenSizing.calculateMissing, estimatingTokens: tokenSizing.pending } : {})}\n />\n ) : null;\n // When a host supplies `menuContainer`, the menu is portaled into it (e.g. the\n // host's own toolbar) and the inline header collapses to just its summary.\n const inlineMenu = menu && !menuContainer;\n\n const list =\n items.length === 0 ? (\n <div className=\"rounded-md border border-dashed border-border p-density-4 text-center text-sm text-muted-foreground\">\n All actions are hidden by the active filters.\n </div>\n ) : (\n // In scrollable mode only the newest `startIndex..` slice is mounted; `last`\n // is measured against the full length so the timeline connector stays right.\n <ol className=\"relative\">\n {items.slice(startIndex).map((item, index) => {\n const last = startIndex + index === items.length - 1;\n return isSessionEventGroup(item) ? (\n <WaitGroupRow\n key={item.id}\n group={item}\n last={last}\n showEstimatedToolCost={showEstimatedToolCost}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n ) : (\n <SessionRow\n key={item.id}\n event={item}\n initialPrompt={item.id === firstUserEventId}\n showEstimatedToolCost={showEstimatedToolCost}\n last={last}\n defaultExpanded={defaultExpanded}\n showRowMetadata={showRowMetadata}\n showRaw={showRaw}\n renderMessageBadge={renderMessageBadge}\n onPendingToolDecision={onPendingToolDecision}\n />\n );\n })}\n </ol>\n );\n\n return (\n <div\n className={cn(\n \"@container/session-viewer min-w-0 bg-background text-sm text-foreground data-[theme=dark]:bg-[var(--fs-bg-subtle)] [[data-theme=dark]_&]:bg-[var(--fs-bg-subtle)]\",\n scrollable && \"flex h-full min-h-0 flex-col\",\n className,\n )}\n {...dataAttrs}\n >\n <SessionTokenContext.Provider value={tokenSizing.context}>\n <DensityValueProvider density={effectiveDensity}>\n {menu && menuContainer && createPortal(menu, menuContainer)}\n {(showHeader || headerActions || inlineMenu) && (\n <div\n data-session-viewer-header\n className={cn(\n \"flex min-w-0 flex-wrap items-center justify-between gap-x-density-3 gap-y-density-2\",\n scrollable\n ? \"shrink-0 border-b border-border px-density-3 py-density-2 @min-[48rem]/session-viewer:px-density-4\"\n : \"mb-density-3\",\n )}\n >\n {showHeader && (\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-x-density-3 gap-y-1 text-xs text-muted-foreground\">\n {summary.model && (\n <span className=\"inline-flex items-center gap-1 font-medium text-foreground\">\n <Icon icon={UiRobotAi} className=\"size-3.5\" />\n {summary.model}\n </span>\n )}\n <span>{summary.toolCount} actions</span>\n <span>{summary.messageCount} messages</span>\n {metadata && (\n <SessionMetadataBadges\n metadata={metadata}\n showContextMeter={showContextMeter}\n />\n )}\n </div>\n )}\n {(headerActions || inlineMenu) && (\n <div\n role=\"group\"\n aria-label=\"Session viewer actions\"\n className=\"ml-auto flex min-w-0 shrink-0 items-center gap-density-2\"\n >\n {headerActions}\n {inlineMenu && menu}\n </div>\n )}\n </div>\n )}\n\n {scrollable ? (\n <div className=\"relative min-h-0 flex-1\">\n <div ref={scrollRef} className=\"h-full overflow-y-auto\">\n <div\n ref={contentRef}\n data-session-viewer-content\n className=\"p-density-3 @min-[48rem]/session-viewer:p-density-4\"\n >\n {list}\n </div>\n </div>\n {!following && (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={resumeFollowing}\n className=\"absolute bottom-density-3 left-1/2 -translate-x-1/2 shadow-md\"\n >\n <Icon icon={UiArrowDown} className=\"size-4\" />\n Scroll to bottom\n </Button>\n )}\n </div>\n ) : (\n list\n )}\n </DensityValueProvider>\n </SessionTokenContext.Provider>\n </div>\n );\n}\n\nfunction mergePendingTools(\n events: SessionEvent[],\n pendingTools: readonly SessionPendingTool[],\n): SessionEvent[] {\n const merged = [...events];\n for (const [index, pending] of pendingTools.entries()) {\n const matches = merged.filter(\n (event) =>\n event.kind === \"tool\" &&\n ((pending.toolCallId && event.toolCallId === pending.toolCallId) ||\n (pending.approvalId && event.approvalId === pending.approvalId) ||\n (pending.sessionId &&\n event.sessionId === pending.sessionId &&\n event.tool === pending.tool)),\n );\n const match = matches.length === 1 ? matches[0] : undefined;\n if (match) {\n Object.assign(match, {\n pending: true,\n toolInput: pending.input ?? match.toolInput,\n toolCallId: pending.toolCallId ?? match.toolCallId,\n approvalId: pending.approvalId ?? match.approvalId,\n sessionId: pending.sessionId ?? match.sessionId,\n ...approvalFields(pending),\n });\n } else {\n merged.push({\n id: `pending-${\n pending.approvalId ?? pending.toolCallId ?? `${pending.tool}-${index}`\n }`,\n kind: \"tool\",\n tool: pending.tool,\n ...(pending.input ? { toolInput: pending.input } : {}),\n ...(pending.toolCallId ? { toolCallId: pending.toolCallId } : {}),\n ...(pending.approvalId ? { approvalId: pending.approvalId } : {}),\n ...(pending.sessionId ? { sessionId: pending.sessionId } : {}),\n ...approvalFields(pending),\n pending: true,\n });\n }\n }\n return merged;\n}\n\nfunction approvalFields(\n pending: SessionPendingTool,\n): Pick<SessionEvent, \"approvalKind\" | \"approvalRequest\"> {\n const kind = pending.kind ?? pending.request?.kind;\n return {\n ...(kind ? { approvalKind: kind } : {}),\n ...(pending.request ? { approvalRequest: pending.request } : {}),\n };\n}\n"],"names":["useMemo","normalizeSession","collapseWaitRuns","getSessionMetadata","useSessionTokenSizing","useDensityValue","useState","collectSessionFilters","isEncryptedReasoning","isSessionEventGroup","isEventVisible","useSessionScroll","jsx","cn","summarizeSession","SessionViewerMenu","WaitGroupRow","SessionRow","SessionTokenContext","jsxs","DensityValueProvider","createPortal","Icon","UiRobotAi","SessionMetadataBadges","Button","UiArrowDown"],"mappings":"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"}
@@ -3,6 +3,8 @@ import { Density } from '../../hooks/use-density.js';
3
3
  import { SessionEvent, SessionInput } from './SessionViewer.model.js';
4
4
  import { SessionThemeOverride } from './SessionViewerMenu.js';
5
5
  import { ApprovalDecisionFields, ApprovalKind, ApprovalRequest } from './approval-request.js';
6
+ import { SessionTokenSizer } from './session-token-sizing.js';
7
+ export type { SessionTokenSizer, SessionTokenSize, SessionTokenSizingRequest, SessionTokenSizingResult } from './session-token-sizing.js';
6
8
  export type { SessionEntry, SessionEvent, SessionInput, SessionActionMeta, } from './SessionViewer.model.js';
7
9
  export type { SessionThemeOverride } from './SessionViewerMenu.js';
8
10
  export interface SessionPendingTool {
@@ -26,6 +28,8 @@ export interface SessionToolDecision extends ApprovalDecisionFields {
26
28
  message?: string;
27
29
  }
28
30
  export interface SessionViewerProps {
31
+ /** Explicit menu actions only; never invoked automatically when a transcript loads. */
32
+ sizeTokens?: SessionTokenSizer;
29
33
  /** A captain session: parsed `SessionEntry[]` or raw log text (JSON / JSONL). */
30
34
  session: SessionInput;
31
35
  className?: string;
@@ -84,5 +88,5 @@ export interface SessionViewerProps {
84
88
  * `captain history` filtering — toggle density and hide categories, tools or
85
89
  * sources.
86
90
  */
87
- export declare function SessionViewer({ session, className, defaultExpanded, showThinking, showHeader, showContextMeter, showMenu, headerActions, menuHeader, menuContainer, defaultDensity, defaultTheme, scrollable, windowSize, batchSize, scrollResetKey, showRowMetadata, showRaw, renderMessageBadge, pendingTools, onPendingToolDecision, }: SessionViewerProps): import("react").JSX.Element;
91
+ export declare function SessionViewer({ session, className, defaultExpanded, showThinking, showHeader, showContextMeter, showMenu, headerActions, menuHeader, menuContainer, defaultDensity, defaultTheme, scrollable, windowSize, batchSize, scrollResetKey, showRowMetadata, showRaw, renderMessageBadge, pendingTools, onPendingToolDecision, sizeTokens, }: SessionViewerProps): import("react").JSX.Element;
88
92
  //# sourceMappingURL=SessionViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionViewer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SessionViewer.d.ts","sourceRoot":"","sources":["../../../src/data/ai/SessionViewer.tsx"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ function SessionContextMeter({
22
22
  ContextMeter.ContextMeter,
23
23
  {
24
24
  mode,
25
- usedPercent: context ? 100 - context.freePercent : 0,
25
+ usedPercent: context ? 100 - context.freePercent : void 0,
26
26
  ...context ? {
27
27
  usedTokens: context.usedTokens,
28
28
  windowTokens: context.windowTokens