@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-session-token-sizing.d.ts","sourceRoot":"","sources":["../../../src/data/ai/use-session-token-sizing.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,WAAW,aAAc,SAAQ,qBAAqB;IAAG,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;AAClF,UAAU,kBAAkB;IAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,aAAa,GAAG,SAAS,CAAC;IAC1D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,GAAG,UAAU,KAAK,IAAI,CAAC;CACxE;AACD,eAAO,MAAM,mBAAmB,yDAA2D,CAAC;AAE5F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,EAAE,iBAAiB;;uBAuD3E,YAAY;4BAlCX,MAAM,EAAE,UAAU,UAAU,GAAG,UAAU;;;;;EAuCjF"}
@@ -0,0 +1,73 @@
1
+ import { useMemo, useState, useRef, useEffect, useCallback, createContext } from "react";
2
+ const SessionTokenContext = createContext(void 0);
3
+ function useSessionTokenSizing(session, events, sizeTokens) {
4
+ const identity = typeof session === "object" && !Array.isArray(session) && session !== null && "id" in session ? session : void 0;
5
+ const sessionId = identity == null ? void 0 : identity.id;
6
+ const revision = identity == null ? void 0 : identity.revision;
7
+ const scope = JSON.stringify([sessionId, revision, identity == null ? void 0 : identity.model, identity == null ? void 0 : identity.modelMode]);
8
+ const keys = useMemo(() => new Map(events.map((event) => [event.id, JSON.stringify([scope, event.id, event.model, event.text, event.toolInput, event.toolResponse, event.file, event.raw])])), [events, scope]);
9
+ const [values, setValues] = useState({});
10
+ const current = useRef({ scope, keys });
11
+ current.current = { scope, keys };
12
+ const inFlight = useRef(/* @__PURE__ */ new Map());
13
+ const controllers = useRef(/* @__PURE__ */ new Set());
14
+ useEffect(() => {
15
+ const valid = new Set(keys.values());
16
+ for (const [key, controller] of inFlight.current) {
17
+ if (!valid.has(key)) {
18
+ controller.abort();
19
+ inFlight.current.delete(key);
20
+ }
21
+ }
22
+ setValues((old) => Object.keys(old).every((key) => valid.has(key)) ? old : Object.fromEntries(Object.entries(old).filter(([key]) => valid.has(key))));
23
+ }, [keys]);
24
+ useEffect(() => () => {
25
+ for (const controller of controllers.current) controller.abort();
26
+ }, []);
27
+ const calculate = useCallback((rowIds, method) => {
28
+ if (!sizeTokens || !sessionId) return;
29
+ const requested = rowIds.flatMap((rowId) => {
30
+ const key = keys.get(rowId);
31
+ if (!key || inFlight.current.has(key)) return [];
32
+ const value = values[key];
33
+ if ((value == null ? void 0 : value.size) && (method === "estimate" || value.size.source !== "local-estimate")) return [];
34
+ return [{ rowId, key }];
35
+ });
36
+ if (requested.length === 0) return;
37
+ const controller = new AbortController();
38
+ controllers.current.add(controller);
39
+ for (const { key } of requested) inFlight.current.set(key, controller);
40
+ setValues((old) => ({ ...old, ...Object.fromEntries(requested.map(({ rowId, key }) => [key, { ...old[key], rowId, attributed: false, pending: true }])) }));
41
+ void (async () => {
42
+ try {
43
+ const result = await sizeTokens({ sessionId, ...revision !== void 0 ? { revision } : {}, rowIds: requested.map(({ rowId }) => rowId), method }, controller.signal);
44
+ if (controller.signal.aborted || current.current.scope !== scope) return;
45
+ if (result.sessionId !== sessionId || revision !== void 0 && result.revision !== revision) throw new Error("Session changed while calculating tokens; retry on the current transcript.");
46
+ const returned = new Map(result.rows.map((row) => [row.rowId, row]));
47
+ setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, returned.get(rowId) ?? { rowId, attributed: false, error: "No token sizing result returned for this row." }])) }));
48
+ } catch (error) {
49
+ if (controller.signal.aborted || current.current.scope !== scope) return;
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, { rowId, attributed: false, error: message }])) }));
52
+ } finally {
53
+ controllers.current.delete(controller);
54
+ for (const { key } of requested) if (inFlight.current.get(key) === controller) inFlight.current.delete(key);
55
+ }
56
+ })();
57
+ }, [keys, revision, scope, sessionId, sizeTokens, values]);
58
+ const enabled = Boolean(sizeTokens && sessionId);
59
+ return {
60
+ context: enabled ? { state: (event) => {
61
+ const key = keys.get(event.id);
62
+ return key ? values[key] : void 0;
63
+ }, calculate } : void 0,
64
+ estimateAll: enabled ? () => calculate(events.filter((event) => !event.pending).map((event) => event.id), "estimate") : void 0,
65
+ calculateMissing: enabled ? () => calculate(events.filter((event) => !event.estimatedCost && !event.pending).map((event) => event.id), "provider") : void 0,
66
+ pending: Object.values(values).some((value) => value.pending)
67
+ };
68
+ }
69
+ export {
70
+ SessionTokenContext,
71
+ useSessionTokenSizing
72
+ };
73
+ //# sourceMappingURL=use-session-token-sizing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-session-token-sizing.js","sources":["../../../src/data/ai/use-session-token-sizing.ts"],"sourcesContent":["import { createContext, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { SessionEvent, SessionInput } from \"./SessionViewer.model\";\nimport type { SessionTokenRowResult, SessionTokenSizer } from \"./session-token-sizing\";\n\nexport interface RowTokenState extends SessionTokenRowResult { pending?: boolean }\ninterface TokenSizingContext {\n state: (event: SessionEvent) => RowTokenState | undefined;\n calculate: (rowIds: string[], method: \"estimate\" | \"provider\") => void;\n}\nexport const SessionTokenContext = createContext<TokenSizingContext | undefined>(undefined);\n\nexport function useSessionTokenSizing(session: SessionInput, events: SessionEvent[], sizeTokens?: SessionTokenSizer) {\n const identity = typeof session === \"object\" && !Array.isArray(session) && session !== null && \"id\" in session ? session : undefined;\n const sessionId = identity?.id;\n const revision = identity?.revision;\n const scope = JSON.stringify([sessionId, revision, identity?.model, identity?.modelMode]);\n const keys = useMemo(() => new Map(events.map((event) => [event.id, JSON.stringify([scope, event.id, event.model, event.text, event.toolInput, event.toolResponse, event.file, event.raw])])), [events, scope]);\n const [values, setValues] = useState<Record<string, RowTokenState>>({});\n const current = useRef({ scope, keys });\n current.current = { scope, keys };\n const inFlight = useRef(new Map<string, AbortController>());\n const controllers = useRef(new Set<AbortController>());\n\n useEffect(() => {\n const valid = new Set(keys.values());\n for (const [key, controller] of inFlight.current) {\n if (!valid.has(key)) { controller.abort(); inFlight.current.delete(key); }\n }\n setValues((old) => Object.keys(old).every((key) => valid.has(key)) ? old : Object.fromEntries(Object.entries(old).filter(([key]) => valid.has(key))));\n }, [keys]);\n useEffect(() => () => { for (const controller of controllers.current) controller.abort(); }, []);\n\n const calculate = useCallback((rowIds: string[], method: \"estimate\" | \"provider\") => {\n if (!sizeTokens || !sessionId) return;\n const requested = rowIds.flatMap((rowId) => {\n const key = keys.get(rowId);\n if (!key || inFlight.current.has(key)) return [];\n const value = values[key];\n if (value?.size && (method === \"estimate\" || value.size.source !== \"local-estimate\")) return [];\n return [{ rowId, key }];\n });\n if (requested.length === 0) return;\n const controller = new AbortController();\n controllers.current.add(controller);\n for (const { key } of requested) inFlight.current.set(key, controller);\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.map(({ rowId, key }) => [key, { ...old[key], rowId, attributed: false, pending: true }])) }));\n void (async () => {\n try {\n const result = await sizeTokens({ sessionId, ...(revision !== undefined ? { revision } : {}), rowIds: requested.map(({ rowId }) => rowId), method }, controller.signal);\n if (controller.signal.aborted || current.current.scope !== scope) return;\n if (result.sessionId !== sessionId || (revision !== undefined && result.revision !== revision)) throw new Error(\"Session changed while calculating tokens; retry on the current transcript.\");\n const returned = new Map(result.rows.map((row) => [row.rowId, row]));\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, returned.get(rowId) ?? { rowId, attributed: false, error: \"No token sizing result returned for this row.\" }])) }));\n } catch (error) {\n if (controller.signal.aborted || current.current.scope !== scope) return;\n const message = error instanceof Error ? error.message : String(error);\n setValues((old) => ({ ...old, ...Object.fromEntries(requested.filter(({ rowId, key }) => current.current.keys.get(rowId) === key).map(({ rowId, key }) => [key, { rowId, attributed: false, error: message }])) }));\n } finally {\n controllers.current.delete(controller);\n for (const { key } of requested) if (inFlight.current.get(key) === controller) inFlight.current.delete(key);\n }\n })();\n }, [keys, revision, scope, sessionId, sizeTokens, values]);\n\n const enabled = Boolean(sizeTokens && sessionId);\n return {\n context: enabled ? { state: (event: SessionEvent) => { const key = keys.get(event.id); return key ? values[key] : undefined; }, calculate } : undefined,\n estimateAll: enabled ? () => calculate(events.filter((event) => !event.pending).map((event) => event.id), \"estimate\") : undefined,\n calculateMissing: enabled ? () => calculate(events.filter((event) => !event.estimatedCost && !event.pending).map((event) => event.id), \"provider\") : undefined,\n pending: Object.values(values).some((value) => value.pending),\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const button = require("../../components/button.cjs");
6
+ const utils = require("../../lib/utils.cjs");
7
+ const AccessMark = require("../AccessMark.cjs");
8
+ const GraphDiagram = require("../GraphDiagram.cjs");
9
+ const callGraphExclude = require("./call-graph-exclude.cjs");
10
+ const callGraphModel = require("./call-graph-model.cjs");
11
+ const callGraphVocabulary = require("./call-graph-vocabulary.cjs");
12
+ const CallGraphGlyphs = require("./CallGraphGlyphs.cjs");
13
+ const CallGraphParts = require("./CallGraphParts.cjs");
14
+ const CallGraphToolbar = require("./CallGraphToolbar.cjs");
15
+ const types = require("./types.cjs");
16
+ const useCallGraph = require("./use-call-graph.cjs");
17
+ const NODE_WIDTH = 188;
18
+ const NODE_HEIGHT = 32;
19
+ const COMPACT_NODE_HEIGHT = 22;
20
+ const ROW_GAP = 14;
21
+ const READABLE_SCALE = 0.6;
22
+ const OPTIONS = { truncateAt: 32, grouped: true };
23
+ function Notice({ children }) {
24
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center p-6 text-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children }) });
25
+ }
26
+ function Alert({ message }) {
27
+ if (!message) return null;
28
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "alert", className: "whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive", children: message });
29
+ }
30
+ const ACCESS_WORDS = { call: "Calls", read: "Reads", write: "Writes", variable: "Variables" };
31
+ function accessWords(access) {
32
+ return access.map((type) => ACCESS_WORDS[type]).join(" and ");
33
+ }
34
+ function action(href, onSelect) {
35
+ if (href === void 0 && onSelect === void 0) return void 0;
36
+ return { ...href !== void 0 ? { href } : {}, ...onSelect ? { onSelect } : {} };
37
+ }
38
+ function CallGraph(props) {
39
+ var _a, _b;
40
+ const { root, fetchGraph, vocabulary = callGraphVocabulary.UIR_CALL_GRAPH_VOCABULARY, maxDepth = callGraphModel.CALL_GRAPH_MAX_DEPTH } = props;
41
+ const labels = { ...callGraphModel.DEFAULT_EDGE_LABELS, ...props.edgeLabels };
42
+ const [direction, setDirection] = useCallGraph.useHeld(props.direction ?? "both", props.onDirectionChange);
43
+ const [depth, setDepth] = useCallGraph.useHeld(props.depth ?? callGraphModel.CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);
44
+ const [exclude, setExclude] = useCallGraph.useHeld(props.exclude, props.onExcludeChange);
45
+ const [access, setAccess] = useCallGraph.useHeld(props.access ?? [...types.CALL_GRAPH_ACCESS], props.onAccessChange);
46
+ const [columns, setColumns] = useCallGraph.useHeld(props.columns ?? false, props.onColumnsChange);
47
+ const [collapsedGroups, setCollapsedGroups] = useCallGraph.useHeld(props.collapsedGroups ?? [], props.onCollapsedGroupsChange);
48
+ if (callGraphModel.baseAccess(access).length === 0) throw new Error("call graph: access must name at least one of call, read and write");
49
+ if (access.includes("variable") && !(props.dataAccess && props.variableAccess)) {
50
+ throw new Error("call graph: access names variable, but the host does not offer variableAccess");
51
+ }
52
+ const [ownSelection, setOwnSelection] = react.useState();
53
+ const request = root === void 0 ? void 0 : { root, direction, depth, exclude, access, columns, purpose: "load" };
54
+ const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;
55
+ const load = useCallGraph.useGraphLoad(fetchGraph, request, key);
56
+ const [expanded, setExpanded] = react.useState();
57
+ const [expanding, setExpanding] = react.useState();
58
+ const pendingExpansion = react.useRef(void 0);
59
+ const activeKey = react.useRef(key);
60
+ activeKey.current = key;
61
+ react.useEffect(() => {
62
+ setExpanding((current) => (current == null ? void 0 : current.request.key) === key && !current.request.controller.signal.aborted ? current : void 0);
63
+ return () => {
64
+ var _a2;
65
+ if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === key) {
66
+ pendingExpansion.current.controller.abort();
67
+ pendingExpansion.current = void 0;
68
+ }
69
+ };
70
+ }, [key]);
71
+ const [opening, setOpening] = react.useState({ nonce: 0, fit: false });
72
+ const fresh = react.useMemo(
73
+ () => load.fresh && ((expanded == null ? void 0 : expanded.key) === key ? expanded : { key, graph: load.fresh, revealed: [] }),
74
+ [load.fresh, expanded, key]
75
+ );
76
+ const [last, setLast] = react.useState();
77
+ if (fresh && fresh !== last) setLast(fresh);
78
+ const shown = root === void 0 ? void 0 : fresh ?? last;
79
+ const graph = shown == null ? void 0 : shown.graph;
80
+ const visible = react.useMemo(() => shown && callGraphModel.visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);
81
+ const glyphs = react.useMemo(() => ({
82
+ node: (glyph, words) => /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.NodeGlyphIcon, { vocabulary, glyph, title: words }),
83
+ edge: (type) => type === "call" ? void 0 : /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.EdgeTypeGlyph, { type, title: labels[type] }),
84
+ group: (caption, glyph) => /* @__PURE__ */ jsxRuntime.jsx(CallGraphGlyphs.GroupCaption, { icon: glyph === void 0 ? vocabulary.group.icon : callGraphVocabulary.requireGlyph(vocabulary, glyph).icon, caption }),
85
+ access: (access2) => /* @__PURE__ */ jsxRuntime.jsx(AccessMark.AccessMark, { access: access2 })
86
+ }), [vocabulary, labels.dispatch, labels.read, labels.write]);
87
+ const guardLabel = props.guardLabel ?? "innermost";
88
+ const diagram = react.useMemo(
89
+ () => graph && visible && callGraphModel.toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels, collapsed: collapsedGroups }),
90
+ [graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write, collapsedGroups]
91
+ );
92
+ const drawn = diagram == null ? void 0 : diagram.drawn;
93
+ const collapsible = react.useMemo(() => graph && visible ? callGraphModel.collapsibleGroups(graph, visible) : [], [graph, visible]);
94
+ const toggleGroup = (id) => setCollapsedGroups(collapsedGroups.includes(id) ? collapsedGroups.filter((entry) => entry !== id) : [...collapsedGroups, id]);
95
+ const rootId = graph == null ? void 0 : graph.roots[0];
96
+ const selection = props.onSelectedChange ? props.selected : (ownSelection == null ? void 0 : ownSelection.key) === (shown == null ? void 0 : shown.key) ? ownSelection == null ? void 0 : ownSelection.selected : void 0;
97
+ const select = (next) => {
98
+ if (props.onSelectedChange) props.onSelectedChange(next);
99
+ else setOwnSelection(next && shown ? { key: shown.key, selected: next } : void 0);
100
+ };
101
+ const openAction = (node, drawn2) => {
102
+ var _a2;
103
+ const { onOpenNode, canOpenNode } = props;
104
+ const accepted = onOpenNode && ((canOpenNode == null ? void 0 : canOpenNode(node, drawn2)) ?? true) ? () => onOpenNode(node, drawn2) : void 0;
105
+ return action((_a2 = props.nodeHref) == null ? void 0 : _a2.call(props, node, drawn2), accepted);
106
+ };
107
+ const selectedNode = (selection == null ? void 0 : selection.kind) === "node" ? drawn == null ? void 0 : drawn.visible.nodes.find((node) => node.id === selection.id) : void 0;
108
+ const selectedEdge = (selection == null ? void 0 : selection.kind) === "edge" ? drawn == null ? void 0 : drawn.visible.edges.find((edge) => edge.id === selection.id) : void 0;
109
+ const mergedEdge = selectedEdge !== void 0 && (drawn == null ? void 0 : drawn.merged.has(selectedEdge.id)) === true;
110
+ const standIn = selectedNode !== void 0 && (drawn == null ? void 0 : drawn.folds.has(selectedNode.id)) === true;
111
+ const guards = useCallGraph.useSiteGuards(props.loadSiteGuards, shown == null ? void 0 : shown.key, mergedEdge ? void 0 : selectedEdge, graph);
112
+ const expansion = (expanding == null ? void 0 : expanding.request.key) === key ? expanding : void 0;
113
+ const expand = async (drawn2, id) => {
114
+ var _a2, _b2;
115
+ if (drawn2.key !== activeKey.current) return;
116
+ if (((_a2 = pendingExpansion.current) == null ? void 0 : _a2.key) === drawn2.key && pendingExpansion.current.nodeId === id) return;
117
+ (_b2 = pendingExpansion.current) == null ? void 0 : _b2.controller.abort();
118
+ const node = callGraphModel.requireNode(drawn2.graph, id);
119
+ const request2 = { key: drawn2.key, nodeId: id, label: node.label, controller: new AbortController() };
120
+ pendingExpansion.current = request2;
121
+ setExpanding({ request: request2 });
122
+ try {
123
+ const data = await fetchGraph({
124
+ root: id,
125
+ direction: callGraphModel.expansionDirection(node),
126
+ depth: 1,
127
+ exclude,
128
+ access,
129
+ columns,
130
+ purpose: "expand",
131
+ signal: request2.controller.signal
132
+ });
133
+ if (request2.controller.signal.aborted || activeKey.current !== drawn2.key || pendingExpansion.current !== request2) return;
134
+ setExpanded((held) => {
135
+ if (request2.controller.signal.aborted || activeKey.current !== drawn2.key) return held;
136
+ const base = (held == null ? void 0 : held.key) === drawn2.key ? held : drawn2;
137
+ return { key: drawn2.key, graph: callGraphModel.mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };
138
+ });
139
+ setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? void 0 : current);
140
+ } catch (error) {
141
+ if (request2.controller.signal.aborted || activeKey.current !== drawn2.key || pendingExpansion.current !== request2) return;
142
+ setExpanding((current) => (current == null ? void 0 : current.request) === request2 ? { request: request2, error: `Cannot expand ${node.label}: ${useCallGraph.errorMessage(error)}` } : current);
143
+ } finally {
144
+ if (pendingExpansion.current === request2) pendingExpansion.current = void 0;
145
+ }
146
+ };
147
+ const groups = graph && ((_a = props.groupFacts) == null ? void 0 : _a.call(props, graph));
148
+ const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);
149
+ const { onPinnedChange } = props;
150
+ const toolbar = /* @__PURE__ */ jsxRuntime.jsx(
151
+ CallGraphToolbar.CallGraphToolbar,
152
+ {
153
+ direction,
154
+ depth,
155
+ maxDepth,
156
+ omitted: graph == null ? void 0 : graph.omitted,
157
+ end: props.toolbarEnd,
158
+ vocabulary,
159
+ ...onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== void 0, onPin: (pinned) => onPinnedChange(pinned, rootId) } } : {},
160
+ ...groups ? { exclusions: {
161
+ exclude: effectiveExclude,
162
+ groups,
163
+ matches: props.excludeMatcher ?? callGraphExclude.matchesExclude,
164
+ busy: load.loading,
165
+ vocabulary,
166
+ onExclude: (patterns) => setExclude(patterns),
167
+ onDefaults: () => setExclude(void 0)
168
+ } } : {},
169
+ ...props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns, variables: props.variableAccess ?? false } } : {},
170
+ ...collapsible.length > 0 ? { groupCollapse: {
171
+ anyCollapsed: collapsedGroups.some((id) => collapsible.includes(id)),
172
+ anyExpanded: collapsible.some((id) => !collapsedGroups.includes(id)),
173
+ onExpandAll: () => setCollapsedGroups([]),
174
+ onCollapseAll: () => setCollapsedGroups(collapsible)
175
+ } } : {},
176
+ onDirection: setDirection,
177
+ onDepth: setDepth,
178
+ onFit: () => setOpening({ nonce: opening.nonce + 1, fit: true }),
179
+ onReset: () => setOpening({ nonce: opening.nonce + 1, fit: false })
180
+ }
181
+ );
182
+ const frame = utils.cn("flex h-full min-h-0 flex-col gap-2 p-2", props.className);
183
+ if (root === void 0) {
184
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: frame, children: [
185
+ toolbar,
186
+ /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: props.emptyMessage ?? "Select a node to draw its call graph." })
187
+ ] });
188
+ }
189
+ const loadError = load.error && `Cannot draw the call graph: ${load.error}`;
190
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: frame, "aria-busy": load.loading, children: [
191
+ toolbar,
192
+ /* @__PURE__ */ jsxRuntime.jsx(Alert, { message: loadError }),
193
+ graph && ((_b = props.renderHeader) == null ? void 0 : _b.call(props, graph)),
194
+ !shown && load.loading && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: "Loading call graph…" }),
195
+ graph && !rootId && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: "The root resolved to no node in this scope." }),
196
+ graph && rootId && graph.edges.length === 0 && callGraphModel.baseAccess(access).length < types.CALL_GRAPH_ACCESS.length && /* @__PURE__ */ jsxRuntime.jsx(Notice, { children: `Nothing is reachable with ${accessWords(callGraphModel.baseAccess(access))} only.` }),
197
+ graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Select an edge to list its sites, or a node to see its details." }),
198
+ shown && graph && rootId && diagram && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 gap-3", children: [
199
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background", load.loading && "opacity-60"), children: /* @__PURE__ */ jsxRuntime.jsx(
200
+ GraphDiagram.GraphDiagram,
201
+ {
202
+ nodes: diagram.nodes,
203
+ edges: diagram.edges,
204
+ groups: diagram.groups,
205
+ layout: "columns",
206
+ zoomable: true,
207
+ wheelZoom: "zoom",
208
+ edgeFocus: "auto",
209
+ focusId: rootId,
210
+ ...opening.fit ? {} : { fitMinScale: READABLE_SCALE },
211
+ nodeWidth: NODE_WIDTH,
212
+ nodeHeight: NODE_HEIGHT,
213
+ compactNodeHeight: COMPACT_NODE_HEIGHT,
214
+ recordHeaderHeight: 24,
215
+ columnGap: callGraphModel.columnGap(diagram),
216
+ rowGap: ROW_GAP,
217
+ className: "h-full",
218
+ ariaLabel: `Call graph of ${callGraphModel.requireNode(graph, rootId).label}`,
219
+ onGroupToggle: toggleGroup,
220
+ onNodeSelect: (id) => select({ kind: "node", id }),
221
+ onEdgeSelect: (id) => select({ kind: "edge", id }),
222
+ ...fresh ? { onNodeExpand: (id) => void expand(fresh, id) } : {},
223
+ ...selectedNode ? { selectedId: selectedNode.id } : {},
224
+ ...selectedEdge ? { selectedEdgeId: selectedEdge.id } : {}
225
+ },
226
+ `${shown.key}:${opening.nonce}`
227
+ ) }),
228
+ (selectedEdge || selectedNode || expansion) && /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3", "aria-label": "Selection", children: [
229
+ expansion && /* @__PURE__ */ jsxRuntime.jsx("p", { role: "status", className: "mb-2 text-xs text-muted-foreground", children: expansion.error ?? `Loading more around ${expansion.request.label}…` }),
230
+ (selectedEdge || selectedNode) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 flex justify-end", children: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", "aria-label": "Close selection", onClick: () => select(void 0), children: "×" }) }),
231
+ selectedEdge && drawn ? /* @__PURE__ */ jsxRuntime.jsx(
232
+ CallGraphParts.EdgeSites,
233
+ {
234
+ edge: selectedEdge,
235
+ graph: drawn.graph,
236
+ labels,
237
+ guards,
238
+ lazyGuards: props.loadSiteGuards !== void 0,
239
+ siteAction: (props.siteHref || props.onRevealSite) && !drawn.folds.has(selectedEdge.from) && vocabulary.hasSource(callGraphModel.requireNode(graph, selectedEdge.from)) ? (site) => {
240
+ var _a2;
241
+ return action((_a2 = props.siteHref) == null ? void 0 : _a2.call(props, site, selectedEdge, graph), props.onRevealSite && (() => {
242
+ var _a3;
243
+ return (_a3 = props.onRevealSite) == null ? void 0 : _a3.call(props, site, selectedEdge, graph);
244
+ })) ?? {};
245
+ } : void 0
246
+ }
247
+ ) : selectedNode && drawn && /* @__PURE__ */ jsxRuntime.jsx(
248
+ CallGraphParts.NodeDetails,
249
+ {
250
+ node: selectedNode,
251
+ graph: drawn.graph,
252
+ vocabulary,
253
+ isRoot: selectedNode.id === rootId,
254
+ openLabel: props.openLabel ?? "Open",
255
+ opens: !standIn && (props.nodeHref !== void 0 || props.onOpenNode !== void 0),
256
+ open: standIn ? void 0 : openAction(selectedNode, graph),
257
+ onFocus: standIn ? void 0 : props.onFocusNode && ((id) => {
258
+ var _a2;
259
+ return (_a2 = props.onFocusNode) == null ? void 0 : _a2.call(props, id, graph);
260
+ })
261
+ }
262
+ )
263
+ ] })
264
+ ] }),
265
+ graph && rootId && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(CallGraphParts.Legend, { graph, vocabulary, labels }) })
266
+ ] });
267
+ }
268
+ exports.CallGraph = CallGraph;
269
+ //# sourceMappingURL=CallGraph.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallGraph.cjs","sources":["../../../src/data/call-graph/CallGraph.tsx"],"sourcesContent":["// A call graph around one root: fetched through the host, with `+N` expansions merged in, the call\n// sites of a selected edge (guards fetched on selection when the host's graph leaves them out) and the\n// details of a selected node. It knows no language: the host's vocabulary names and draws node kinds,\n// and the host's callbacks open nodes and sites.\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { cn } from \"../../lib/utils\";\nimport { AccessMark } from \"../AccessMark\";\nimport { GraphDiagram } from \"../GraphDiagram\";\nimport { matchesExclude, type ExcludeMatcher } from \"./call-graph-exclude\";\nimport type { GuardLabel } from \"./call-graph-labels\";\nimport {\n baseAccess,\n CALL_GRAPH_DEFAULT_DEPTH,\n CALL_GRAPH_MAX_DEPTH,\n collapsibleGroups,\n columnGap,\n DEFAULT_EDGE_LABELS,\n expansionDirection,\n mergeGraph,\n requireNode,\n toDiagram,\n visibleGraph,\n type DiagramGlyphs,\n type DiagramOptions,\n} from \"./call-graph-model\";\nimport { requireGlyph, UIR_CALL_GRAPH_VOCABULARY, type CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { EdgeTypeGlyph, GroupCaption, NodeGlyphIcon } from \"./CallGraphGlyphs\";\nimport { EdgeSites, Legend, NodeDetails, type CallGraphAction } from \"./CallGraphParts\";\nimport { CallGraphToolbar } from \"./CallGraphToolbar\";\nimport {\n CALL_GRAPH_ACCESS,\n type CallGraph as Graph,\n type CallGraphAccess,\n type CallGraphDirection,\n type CallGraphEdge,\n type CallGraphEdgeLabels,\n type CallGraphFetchParams,\n type CallGraphGroupFact,\n type CallGraphNode,\n type CallGraphSelection,\n type CallGraphSite,\n} from \"./types\";\nimport { errorMessage, useGraphLoad, useHeld, useSiteGuards, type GraphRequest } from \"./use-call-graph\";\n\nexport interface CallGraphProps<G extends Graph = Graph> {\n /** What the graph is drawn around, in the host's terms. Undefined shows `emptyMessage`. */\n root: string | undefined;\n /** Loads the graph around `params.root`, and one hop around a node for its `+N`. */\n fetchGraph: (params: CallGraphFetchParams) => Promise<G>;\n /** What else `fetchGraph` reads, such as the host's scope: part of the request's key, so a change refetches. */\n fetchKey?: string;\n /** Pass `onDirectionChange` to control it; without one the component holds it, starting here. */\n direction?: CallGraphDirection;\n onDirectionChange?: (direction: CallGraphDirection) => void;\n depth?: number;\n onDepthChange?: (depth: number) => void;\n /** The exclusion patterns; undefined takes the host's defaults. Controlled with `onExcludeChange`. */\n exclude?: string[] | undefined;\n onExcludeChange?: (exclude: string[] | undefined) => void;\n selected?: CallGraphSelection | undefined;\n onSelectedChange?: (selected: CallGraphSelection | undefined) => void;\n /** The source reports reads and writes of data: shows the Access toggles and the Columns switch. */\n dataAccess?: boolean;\n /** The source can follow the variables a body reads and writes: shows a Variables toggle beside the Access ones. Needs `dataAccess`. */\n variableAccess?: boolean;\n /** The edge types the host follows, at least one of call, read and write; all three by default. Controlled with `onAccessChange`. */\n access?: CallGraphAccess[];\n onAccessChange?: (access: CallGraphAccess[]) => void;\n /** Columns and fields as nodes of their own; collapsed into tables and entities by default. */\n columns?: boolean;\n onColumnsChange?: (columns: boolean) => void;\n /**\n * The groups drawn as their header alone, by `graph.groups` id: each folds into one node, and its\n * members' edges merge onto it, counting the members. The root's group never folds. Controlled with\n * `onCollapsedGroupsChange`; without one the component holds it, starting here, none by default.\n */\n collapsedGroups?: string[];\n onCollapsedGroupsChange?: (ids: string[]) => void;\n /** The groups the graph reached, drawn or excluded. Without it the graph offers no exclusions. */\n groupFacts?: (graph: G) => CallGraphGroupFact[];\n /** The patterns in force when `exclude` is undefined: the host's defaults, as its response reports them. */\n defaultExclude?: (graph: G) => string[];\n /** How a pattern matches a group, for a host with keywords of its own. */\n excludeMatcher?: ExcludeMatcher;\n /**\n * Where a node opens. A node the vocabulary gives no source is never opened, and Open is disabled on\n * a node with no href that `onOpenNode` does not accept.\n */\n nodeHref?: (node: CallGraphNode, graph: G) => string | undefined;\n /** Opens a node; with `nodeHref` it handles a plain click on the link. */\n onOpenNode?: (node: CallGraphNode, graph: G) => void;\n /** Whether `onOpenNode` opens a node; every node by default. */\n canOpenNode?: (node: CallGraphNode, graph: G) => boolean;\n openLabel?: string;\n /** Re-roots the graph on a node, by id: a drawn node the vocabulary can root, or the column behind a field. */\n onFocusNode?: (nodeId: string, graph: G) => void;\n /** Where a call site opens; a site opens only when its caller has a source. */\n siteHref?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => string | undefined;\n onRevealSite?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => void;\n /** Fetches the guards of a selected edge's sites, for a host whose graph leaves them out. */\n loadSiteGuards?: (edge: CallGraphEdge, graph: G, signal: AbortSignal) => Promise<CallGraphSite[]>;\n edgeLabels?: Partial<CallGraphEdgeLabels>;\n /** What a conditional edge's pill says of its guards; \"innermost\" by default. The edge's tooltip always lists them. */\n guardLabel?: GuardLabel;\n vocabulary?: CallGraphVocabulary;\n /** Shows a Pin root toggle; the host keeps `root` while pinned. */\n pinned?: boolean;\n onPinnedChange?: (pinned: boolean, rootId: string | undefined) => void;\n /** Host facts above the diagram, such as how the root was resolved. */\n renderHeader?: (graph: G) => ReactNode;\n toolbarEnd?: ReactNode;\n emptyMessage?: ReactNode;\n maxDepth?: number;\n className?: string;\n}\n\ntype Held<G> = { key: string; graph: G; revealed: string[] };\ntype PendingExpansion = { key: string; nodeId: string; label: string; controller: AbortController };\n\nconst NODE_WIDTH = 188;\nconst NODE_HEIGHT = 32;\nconst COMPACT_NODE_HEIGHT = 22;\nconst ROW_GAP = 14;\n/** Node labels are 12px: at this scale they are 7.2px, the smallest that still reads. */\nconst READABLE_SCALE = 0.6;\nconst OPTIONS: Omit<DiagramOptions, \"guardLabel\"> = { truncateAt: 32, grouped: true };\n\nfunction Notice({ children }: { children: ReactNode }) {\n return (\n <div className=\"flex h-full items-center justify-center p-6 text-center\">\n <span className=\"text-sm text-muted-foreground\">{children}</span>\n </div>\n );\n}\n\nfunction Alert({ message }: { message: string | undefined }) {\n if (!message) return null;\n return <div role=\"alert\" className=\"whitespace-pre-wrap rounded-md border border-destructive p-3 text-sm text-destructive\">{message}</div>;\n}\n\nconst ACCESS_WORDS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\", variable: \"Variables\" };\n\nfunction accessWords(access: readonly CallGraphAccess[]): string {\n return access.map((type) => ACCESS_WORDS[type]).join(\" and \");\n}\n\nfunction action(href: string | undefined, onSelect: (() => void) | undefined): CallGraphAction | undefined {\n if (href === undefined && onSelect === undefined) return undefined;\n return { ...(href !== undefined ? { href } : {}), ...(onSelect ? { onSelect } : {}) };\n}\n\nexport function CallGraph<G extends Graph = Graph>(props: CallGraphProps<G>) {\n const { root, fetchGraph, vocabulary = UIR_CALL_GRAPH_VOCABULARY, maxDepth = CALL_GRAPH_MAX_DEPTH } = props;\n const labels: CallGraphEdgeLabels = { ...DEFAULT_EDGE_LABELS, ...props.edgeLabels };\n const [direction, setDirection] = useHeld(props.direction ?? \"both\", props.onDirectionChange);\n const [depth, setDepth] = useHeld(props.depth ?? CALL_GRAPH_DEFAULT_DEPTH, props.onDepthChange);\n const [exclude, setExclude] = useHeld(props.exclude, props.onExcludeChange);\n const [access, setAccess] = useHeld(props.access ?? [...CALL_GRAPH_ACCESS], props.onAccessChange);\n const [columns, setColumns] = useHeld(props.columns ?? false, props.onColumnsChange);\n const [collapsedGroups, setCollapsedGroups] = useHeld(props.collapsedGroups ?? [], props.onCollapsedGroupsChange);\n if (baseAccess(access).length === 0) throw new Error(\"call graph: access must name at least one of call, read and write\");\n if (access.includes(\"variable\") && !(props.dataAccess && props.variableAccess)) {\n throw new Error(\"call graph: access names variable, but the host does not offer variableAccess\");\n }\n const [ownSelection, setOwnSelection] = useState<{ key: string; selected: CallGraphSelection }>();\n\n const request: GraphRequest | undefined = root === undefined ? undefined : { root, direction, depth, exclude, access, columns, purpose: \"load\" };\n const key = `call-graph:${JSON.stringify([request ?? null, props.fetchKey ?? null])}`;\n const load = useGraphLoad(fetchGraph, request, key);\n\n const [expanded, setExpanded] = useState<Held<G>>();\n const [expanding, setExpanding] = useState<{ request: PendingExpansion; error?: string }>();\n const pendingExpansion = useRef<PendingExpansion | undefined>(undefined);\n const activeKey = useRef(key);\n activeKey.current = key;\n useEffect(() => {\n setExpanding((current) => current?.request.key === key && !current.request.controller.signal.aborted ? current : undefined);\n return () => {\n if (pendingExpansion.current?.key === key) {\n pendingExpansion.current.controller.abort();\n pendingExpansion.current = undefined;\n }\n };\n }, [key]);\n const [opening, setOpening] = useState({ nonce: 0, fit: false });\n const fresh = useMemo<Held<G> | undefined>(\n () => load.fresh && (expanded?.key === key ? expanded : { key, graph: load.fresh, revealed: [] }),\n [load.fresh, expanded, key],\n );\n const [last, setLast] = useState<Held<G>>();\n if (fresh && fresh !== last) setLast(fresh);\n const shown = root === undefined ? undefined : (fresh ?? last);\n const graph = shown?.graph;\n\n const visible = useMemo(() => shown && visibleGraph(shown.graph, { direction, depth, revealed: shown.revealed }), [shown, direction, depth]);\n const glyphs = useMemo<DiagramGlyphs>(() => ({\n node: (glyph, words) => <NodeGlyphIcon vocabulary={vocabulary} glyph={glyph} title={words} />,\n edge: (type) => (type === \"call\" ? undefined : <EdgeTypeGlyph type={type} title={labels[type]} />),\n group: (caption, glyph) => <GroupCaption icon={glyph === undefined ? vocabulary.group.icon : requireGlyph(vocabulary, glyph).icon} caption={caption} />,\n access: (access) => <AccessMark access={access} />,\n }), [vocabulary, labels.dispatch, labels.read, labels.write]);\n const guardLabel = props.guardLabel ?? \"innermost\";\n const diagram = useMemo(\n () => graph && visible && toDiagram({ graph, visible, direction, options: { ...OPTIONS, guardLabel }, glyphs, vocabulary, edgeLabels: labels, collapsed: collapsedGroups }),\n [graph, visible, direction, guardLabel, glyphs, vocabulary, labels.call, labels.dispatch, labels.read, labels.write, collapsedGroups],\n );\n // What a selection is looked up in: the graph as drawn, collapsed groups folded into their stand-ins.\n const drawn = diagram?.drawn;\n const collapsible = useMemo(() => (graph && visible ? collapsibleGroups(graph, visible) : []), [graph, visible]);\n const toggleGroup = (id: string) => setCollapsedGroups(collapsedGroups.includes(id) ? collapsedGroups.filter((entry) => entry !== id) : [...collapsedGroups, id]);\n\n const rootId = graph?.roots[0];\n const selection = props.onSelectedChange ? props.selected : ownSelection?.key === shown?.key ? ownSelection?.selected : undefined;\n const select = (next: CallGraphSelection | undefined) => {\n if (props.onSelectedChange) props.onSelectedChange(next);\n else setOwnSelection(next && shown ? { key: shown.key, selected: next } : undefined);\n };\n const openAction = (node: CallGraphNode, drawn: G) => {\n const { onOpenNode, canOpenNode } = props;\n const accepted = onOpenNode && (canOpenNode?.(node, drawn) ?? true) ? () => onOpenNode(node, drawn) : undefined;\n return action(props.nodeHref?.(node, drawn), accepted);\n };\n const selectedNode = selection?.kind === \"node\" ? drawn?.visible.nodes.find((node) => node.id === selection.id) : undefined;\n const selectedEdge = selection?.kind === \"edge\" ? drawn?.visible.edges.find((edge) => edge.id === selection.id) : undefined;\n // A merged edge stands for several the host knows: it has no guards of its own to load.\n const mergedEdge = selectedEdge !== undefined && drawn?.merged.has(selectedEdge.id) === true;\n const standIn = selectedNode !== undefined && drawn?.folds.has(selectedNode.id) === true;\n const guards = useSiteGuards(props.loadSiteGuards, shown?.key, mergedEdge ? undefined : selectedEdge, graph);\n const expansion = expanding?.request.key === key ? expanding : undefined;\n\n // A `+N` loads one more hop on the node's outer side and merges it into the graph this request drew.\n const expand = async (drawn: Held<G>, id: string) => {\n if (drawn.key !== activeKey.current) return;\n if (pendingExpansion.current?.key === drawn.key && pendingExpansion.current.nodeId === id) return;\n pendingExpansion.current?.controller.abort();\n const node = requireNode(drawn.graph, id);\n const request: PendingExpansion = { key: drawn.key, nodeId: id, label: node.label, controller: new AbortController() };\n pendingExpansion.current = request;\n setExpanding({ request });\n try {\n const data = await fetchGraph({\n root: id, direction: expansionDirection(node), depth: 1, exclude, access, columns, purpose: \"expand\", signal: request.controller.signal,\n });\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanded((held) => {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key) return held;\n const base = held?.key === drawn.key ? held : drawn;\n return { key: drawn.key, graph: mergeGraph(base.graph, data), revealed: [...base.revealed, ...data.nodes.map((entry) => entry.id)] };\n });\n setExpanding((current) => current?.request === request ? undefined : current);\n } catch (error) {\n if (request.controller.signal.aborted || activeKey.current !== drawn.key || pendingExpansion.current !== request) return;\n setExpanding((current) => current?.request === request\n ? { request, error: `Cannot expand ${node.label}: ${errorMessage(error)}` } : current);\n } finally {\n if (pendingExpansion.current === request) pendingExpansion.current = undefined;\n }\n };\n\n const groups = graph && props.groupFacts?.(graph);\n const effectiveExclude = exclude ?? (graph && props.defaultExclude ? props.defaultExclude(graph) : []);\n const { onPinnedChange } = props;\n const toolbar = (\n <CallGraphToolbar direction={direction} depth={depth} maxDepth={maxDepth} omitted={graph?.omitted} end={props.toolbarEnd} vocabulary={vocabulary}\n {...(onPinnedChange ? { pin: { pinned: props.pinned ?? false, canPin: rootId !== undefined, onPin: (pinned: boolean) => onPinnedChange(pinned, rootId) } } : {})}\n {...(groups ? { exclusions: { exclude: effectiveExclude, groups, matches: props.excludeMatcher ?? matchesExclude, busy: load.loading, vocabulary,\n onExclude: (patterns: string[]) => setExclude(patterns), onDefaults: () => setExclude(undefined) } } : {})}\n {...(props.dataAccess ? { data: { access, onAccess: setAccess, columns, onColumns: setColumns, variables: props.variableAccess ?? false } } : {})}\n {...(collapsible.length > 0 ? { groupCollapse: {\n anyCollapsed: collapsedGroups.some((id) => collapsible.includes(id)),\n anyExpanded: collapsible.some((id) => !collapsedGroups.includes(id)),\n onExpandAll: () => setCollapsedGroups([]),\n onCollapseAll: () => setCollapsedGroups(collapsible),\n } } : {})}\n onDirection={setDirection} onDepth={setDepth}\n onFit={() => setOpening({ nonce: opening.nonce + 1, fit: true })} onReset={() => setOpening({ nonce: opening.nonce + 1, fit: false })} />\n );\n\n const frame = cn(\"flex h-full min-h-0 flex-col gap-2 p-2\", props.className);\n if (root === undefined) {\n return <div className={frame}>{toolbar}<Notice>{props.emptyMessage ?? \"Select a node to draw its call graph.\"}</Notice></div>;\n }\n const loadError = load.error && `Cannot draw the call graph: ${load.error}`;\n return (\n <div className={frame} aria-busy={load.loading}>\n {toolbar}\n <Alert message={loadError} />\n {graph && props.renderHeader?.(graph)}\n {!shown && load.loading && <Notice>Loading call graph…</Notice>}\n {graph && !rootId && <Notice>The root resolved to no node in this scope.</Notice>}\n {graph && rootId && graph.edges.length === 0 && baseAccess(access).length < CALL_GRAPH_ACCESS.length && (\n <Notice>{`Nothing is reachable with ${accessWords(baseAccess(access))} only.`}</Notice>\n )}\n {graph && rootId && graph.edges.length > 0 && !selectedEdge && !selectedNode && (\n <p className=\"text-xs text-muted-foreground\">Select an edge to list its sites, or a node to see its details.</p>\n )}\n {shown && graph && rootId && diagram && (\n <div className=\"flex min-h-0 flex-1 gap-3\">\n <div className={cn(\"relative min-h-64 min-w-0 flex-1 rounded-lg border border-border bg-background\", load.loading && \"opacity-60\")}>\n <GraphDiagram key={`${shown.key}:${opening.nonce}`} nodes={diagram.nodes} edges={diagram.edges} groups={diagram.groups} layout=\"columns\" zoomable wheelZoom=\"zoom\" edgeFocus=\"auto\"\n focusId={rootId} {...(opening.fit ? {} : { fitMinScale: READABLE_SCALE })} nodeWidth={NODE_WIDTH} nodeHeight={NODE_HEIGHT} compactNodeHeight={COMPACT_NODE_HEIGHT} recordHeaderHeight={24} columnGap={columnGap(diagram)} rowGap={ROW_GAP}\n className=\"h-full\" ariaLabel={`Call graph of ${requireNode(graph, rootId).label}`} onGroupToggle={toggleGroup}\n onNodeSelect={(id: string) => select({ kind: \"node\", id })} onEdgeSelect={(id: string) => select({ kind: \"edge\", id })}\n {...(fresh ? { onNodeExpand: (id: string) => void expand(fresh, id) } : {})}\n {...(selectedNode ? { selectedId: selectedNode.id } : {})} {...(selectedEdge ? { selectedEdgeId: selectedEdge.id } : {})} />\n </div>\n {(selectedEdge || selectedNode || expansion) && (\n <aside className=\"w-80 max-w-[45%] shrink-0 overflow-y-auto rounded-lg border border-border bg-card p-3\" aria-label=\"Selection\">\n {expansion && <p role=\"status\" className=\"mb-2 text-xs text-muted-foreground\">{expansion.error ?? `Loading more around ${expansion.request.label}…`}</p>}\n {(selectedEdge || selectedNode) && (\n <div className=\"mb-1 flex justify-end\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" aria-label=\"Close selection\" onClick={() => select(undefined)}>×</Button>\n </div>\n )}\n {selectedEdge && drawn ? (\n <EdgeSites edge={selectedEdge} graph={drawn.graph} labels={labels} guards={guards} lazyGuards={props.loadSiteGuards !== undefined}\n siteAction={(props.siteHref || props.onRevealSite) && !drawn.folds.has(selectedEdge.from) && vocabulary.hasSource(requireNode(graph, selectedEdge.from))\n ? (site) => action(props.siteHref?.(site, selectedEdge, graph), props.onRevealSite && (() => props.onRevealSite?.(site, selectedEdge, graph))) ?? {}\n : undefined} />\n ) : selectedNode && drawn && (\n <NodeDetails node={selectedNode} graph={drawn.graph} vocabulary={vocabulary} isRoot={selectedNode.id === rootId} openLabel={props.openLabel ?? \"Open\"}\n opens={!standIn && (props.nodeHref !== undefined || props.onOpenNode !== undefined)} open={standIn ? undefined : openAction(selectedNode, graph)}\n onFocus={standIn ? undefined : props.onFocusNode && ((id: string) => props.onFocusNode?.(id, graph))} />\n )}\n </aside>\n )}\n </div>\n )}\n {graph && rootId && <div className=\"shrink-0\"><Legend graph={graph} vocabulary={vocabulary} labels={labels} /></div>}\n </div>\n );\n}\n"],"names":["jsx","UIR_CALL_GRAPH_VOCABULARY","CALL_GRAPH_MAX_DEPTH","DEFAULT_EDGE_LABELS","useHeld","CALL_GRAPH_DEFAULT_DEPTH","CALL_GRAPH_ACCESS","baseAccess","useState","useGraphLoad","useRef","useEffect","_a","useMemo","visibleGraph","NodeGlyphIcon","EdgeTypeGlyph","GroupCaption","requireGlyph","access","AccessMark","toDiagram","collapsibleGroups","drawn","useSiteGuards","_b","requireNode","request","expansionDirection","mergeGraph","errorMessage","CallGraphToolbar","matchesExclude","cn","jsxs","GraphDiagram","columnGap","Button","EdgeSites","NodeDetails","Legend"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { ReactNode } from 'react';
2
+ import { ExcludeMatcher } from './call-graph-exclude.js';
3
+ import { GuardLabel } from './call-graph-labels.js';
4
+ import { CallGraphVocabulary } from './call-graph-vocabulary.js';
5
+ import { CallGraph as Graph, CallGraphAccess, CallGraphDirection, CallGraphEdge, CallGraphEdgeLabels, CallGraphFetchParams, CallGraphGroupFact, CallGraphNode, CallGraphSelection, CallGraphSite } from './types.js';
6
+ export interface CallGraphProps<G extends Graph = Graph> {
7
+ /** What the graph is drawn around, in the host's terms. Undefined shows `emptyMessage`. */
8
+ root: string | undefined;
9
+ /** Loads the graph around `params.root`, and one hop around a node for its `+N`. */
10
+ fetchGraph: (params: CallGraphFetchParams) => Promise<G>;
11
+ /** What else `fetchGraph` reads, such as the host's scope: part of the request's key, so a change refetches. */
12
+ fetchKey?: string;
13
+ /** Pass `onDirectionChange` to control it; without one the component holds it, starting here. */
14
+ direction?: CallGraphDirection;
15
+ onDirectionChange?: (direction: CallGraphDirection) => void;
16
+ depth?: number;
17
+ onDepthChange?: (depth: number) => void;
18
+ /** The exclusion patterns; undefined takes the host's defaults. Controlled with `onExcludeChange`. */
19
+ exclude?: string[] | undefined;
20
+ onExcludeChange?: (exclude: string[] | undefined) => void;
21
+ selected?: CallGraphSelection | undefined;
22
+ onSelectedChange?: (selected: CallGraphSelection | undefined) => void;
23
+ /** The source reports reads and writes of data: shows the Access toggles and the Columns switch. */
24
+ dataAccess?: boolean;
25
+ /** The source can follow the variables a body reads and writes: shows a Variables toggle beside the Access ones. Needs `dataAccess`. */
26
+ variableAccess?: boolean;
27
+ /** The edge types the host follows, at least one of call, read and write; all three by default. Controlled with `onAccessChange`. */
28
+ access?: CallGraphAccess[];
29
+ onAccessChange?: (access: CallGraphAccess[]) => void;
30
+ /** Columns and fields as nodes of their own; collapsed into tables and entities by default. */
31
+ columns?: boolean;
32
+ onColumnsChange?: (columns: boolean) => void;
33
+ /**
34
+ * The groups drawn as their header alone, by `graph.groups` id: each folds into one node, and its
35
+ * members' edges merge onto it, counting the members. The root's group never folds. Controlled with
36
+ * `onCollapsedGroupsChange`; without one the component holds it, starting here, none by default.
37
+ */
38
+ collapsedGroups?: string[];
39
+ onCollapsedGroupsChange?: (ids: string[]) => void;
40
+ /** The groups the graph reached, drawn or excluded. Without it the graph offers no exclusions. */
41
+ groupFacts?: (graph: G) => CallGraphGroupFact[];
42
+ /** The patterns in force when `exclude` is undefined: the host's defaults, as its response reports them. */
43
+ defaultExclude?: (graph: G) => string[];
44
+ /** How a pattern matches a group, for a host with keywords of its own. */
45
+ excludeMatcher?: ExcludeMatcher;
46
+ /**
47
+ * Where a node opens. A node the vocabulary gives no source is never opened, and Open is disabled on
48
+ * a node with no href that `onOpenNode` does not accept.
49
+ */
50
+ nodeHref?: (node: CallGraphNode, graph: G) => string | undefined;
51
+ /** Opens a node; with `nodeHref` it handles a plain click on the link. */
52
+ onOpenNode?: (node: CallGraphNode, graph: G) => void;
53
+ /** Whether `onOpenNode` opens a node; every node by default. */
54
+ canOpenNode?: (node: CallGraphNode, graph: G) => boolean;
55
+ openLabel?: string;
56
+ /** Re-roots the graph on a node, by id: a drawn node the vocabulary can root, or the column behind a field. */
57
+ onFocusNode?: (nodeId: string, graph: G) => void;
58
+ /** Where a call site opens; a site opens only when its caller has a source. */
59
+ siteHref?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => string | undefined;
60
+ onRevealSite?: (site: CallGraphSite, edge: CallGraphEdge, graph: G) => void;
61
+ /** Fetches the guards of a selected edge's sites, for a host whose graph leaves them out. */
62
+ loadSiteGuards?: (edge: CallGraphEdge, graph: G, signal: AbortSignal) => Promise<CallGraphSite[]>;
63
+ edgeLabels?: Partial<CallGraphEdgeLabels>;
64
+ /** What a conditional edge's pill says of its guards; "innermost" by default. The edge's tooltip always lists them. */
65
+ guardLabel?: GuardLabel;
66
+ vocabulary?: CallGraphVocabulary;
67
+ /** Shows a Pin root toggle; the host keeps `root` while pinned. */
68
+ pinned?: boolean;
69
+ onPinnedChange?: (pinned: boolean, rootId: string | undefined) => void;
70
+ /** Host facts above the diagram, such as how the root was resolved. */
71
+ renderHeader?: (graph: G) => ReactNode;
72
+ toolbarEnd?: ReactNode;
73
+ emptyMessage?: ReactNode;
74
+ maxDepth?: number;
75
+ className?: string;
76
+ }
77
+ export declare function CallGraph<G extends Graph = Graph>(props: CallGraphProps<G>): import("react").JSX.Element;
78
+ //# sourceMappingURL=CallGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallGraph.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraph.tsx"],"names":[],"mappings":"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"}