@flanksource/clicky-ui 0.3.45 → 0.3.47

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 (505) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +22 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/components/ErrorWrapper.cjs +2 -3
  8. package/dist/components/ErrorWrapper.cjs.map +1 -1
  9. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  10. package/dist/components/ErrorWrapper.js +3 -4
  11. package/dist/components/ErrorWrapper.js.map +1 -1
  12. package/dist/data/AccessMark.cjs +23 -0
  13. package/dist/data/AccessMark.cjs.map +1 -0
  14. package/dist/data/AccessMark.d.ts +11 -0
  15. package/dist/data/AccessMark.d.ts.map +1 -0
  16. package/dist/data/AccessMark.js +23 -0
  17. package/dist/data/AccessMark.js.map +1 -0
  18. package/dist/data/Clicky.cjs +3 -0
  19. package/dist/data/Clicky.cjs.map +1 -1
  20. package/dist/data/Clicky.js +3 -0
  21. package/dist/data/Clicky.js.map +1 -1
  22. package/dist/data/CodeDiff.cjs +116 -23
  23. package/dist/data/CodeDiff.cjs.map +1 -1
  24. package/dist/data/CodeDiff.d.ts +26 -0
  25. package/dist/data/CodeDiff.d.ts.map +1 -1
  26. package/dist/data/CodeDiff.js +116 -23
  27. package/dist/data/CodeDiff.js.map +1 -1
  28. package/dist/data/FilterPill.cjs +15 -2
  29. package/dist/data/FilterPill.cjs.map +1 -1
  30. package/dist/data/FilterPill.d.ts +1 -1
  31. package/dist/data/FilterPill.d.ts.map +1 -1
  32. package/dist/data/FilterPill.js +15 -2
  33. package/dist/data/FilterPill.js.map +1 -1
  34. package/dist/data/GraphDiagram.cjs +65 -13
  35. package/dist/data/GraphDiagram.cjs.map +1 -1
  36. package/dist/data/GraphDiagram.d.ts +9 -2
  37. package/dist/data/GraphDiagram.d.ts.map +1 -1
  38. package/dist/data/GraphDiagram.js +66 -14
  39. package/dist/data/GraphDiagram.js.map +1 -1
  40. package/dist/data/GraphDiagramGroups.cjs +100 -0
  41. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  42. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  43. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  44. package/dist/data/GraphDiagramGroups.js +100 -0
  45. package/dist/data/GraphDiagramGroups.js.map +1 -0
  46. package/dist/data/GraphDiagramNodes.cjs +17 -31
  47. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  48. package/dist/data/GraphDiagramNodes.d.ts +6 -13
  49. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  50. package/dist/data/GraphDiagramNodes.js +17 -31
  51. package/dist/data/GraphDiagramNodes.js.map +1 -1
  52. package/dist/data/LogViewer.cjs +27 -8
  53. package/dist/data/LogViewer.cjs.map +1 -1
  54. package/dist/data/LogViewer.d.ts +11 -3
  55. package/dist/data/LogViewer.d.ts.map +1 -1
  56. package/dist/data/LogViewer.js +27 -8
  57. package/dist/data/LogViewer.js.map +1 -1
  58. package/dist/data/Properties.cjs +2 -15
  59. package/dist/data/Properties.cjs.map +1 -1
  60. package/dist/data/Properties.d.ts +4 -0
  61. package/dist/data/Properties.d.ts.map +1 -1
  62. package/dist/data/Properties.js +2 -15
  63. package/dist/data/Properties.js.map +1 -1
  64. package/dist/data/PropertyValue.cjs +37 -0
  65. package/dist/data/PropertyValue.cjs.map +1 -0
  66. package/dist/data/PropertyValue.d.ts +6 -0
  67. package/dist/data/PropertyValue.d.ts.map +1 -0
  68. package/dist/data/PropertyValue.js +37 -0
  69. package/dist/data/PropertyValue.js.map +1 -0
  70. package/dist/data/Tree.cjs +4 -3
  71. package/dist/data/Tree.cjs.map +1 -1
  72. package/dist/data/Tree.d.ts +3 -1
  73. package/dist/data/Tree.d.ts.map +1 -1
  74. package/dist/data/Tree.js +4 -3
  75. package/dist/data/Tree.js.map +1 -1
  76. package/dist/data/TreeNode.cjs +1 -1
  77. package/dist/data/TreeNode.cjs.map +1 -1
  78. package/dist/data/TreeNode.d.ts.map +1 -1
  79. package/dist/data/TreeNode.js +1 -1
  80. package/dist/data/TreeNode.js.map +1 -1
  81. package/dist/data/ai/ChatFab.cjs +1 -1
  82. package/dist/data/ai/ChatFab.cjs.map +1 -1
  83. package/dist/data/ai/ChatFab.js +1 -1
  84. package/dist/data/ai/ChatFab.js.map +1 -1
  85. package/dist/data/ai/ChatWindow.cjs +106 -171
  86. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  87. package/dist/data/ai/ChatWindow.d.ts +6 -2
  88. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  89. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  90. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  91. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  92. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  93. package/dist/data/ai/ChatWindow.header.js +104 -0
  94. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  95. package/dist/data/ai/ChatWindow.js +107 -172
  96. package/dist/data/ai/ChatWindow.js.map +1 -1
  97. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  98. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  99. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  100. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  101. package/dist/data/ai/ChatWindow.placement.js +95 -0
  102. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  103. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  104. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  105. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  106. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  107. package/dist/data/ai/SessionChatComposer.js +3 -1
  108. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  109. package/dist/data/ai/SessionInspector.cjs +68 -72
  110. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  111. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  112. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  113. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  114. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  115. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  116. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  117. package/dist/data/ai/SessionInspector.d.ts +6 -1
  118. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  119. package/dist/data/ai/SessionInspector.js +69 -73
  120. package/dist/data/ai/SessionInspector.js.map +1 -1
  121. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  122. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  123. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  125. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  127. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  129. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  131. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  133. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  135. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  136. package/dist/data/ai/SessionInspector.remote.js +86 -18
  137. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  138. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  139. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  140. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  141. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  142. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  143. package/dist/data/ai/SessionTail.cjs +63 -0
  144. package/dist/data/ai/SessionTail.cjs.map +1 -0
  145. package/dist/data/ai/SessionTail.d.ts +14 -0
  146. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  147. package/dist/data/ai/SessionTail.js +63 -0
  148. package/dist/data/ai/SessionTail.js.map +1 -0
  149. package/dist/data/ai/SessionViewer.cjs +10 -3
  150. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  151. package/dist/data/ai/SessionViewer.d.ts +7 -1
  152. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  153. package/dist/data/ai/SessionViewer.js +10 -3
  154. package/dist/data/ai/SessionViewer.js.map +1 -1
  155. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  156. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  157. package/dist/data/ai/index.d.ts +4 -3
  158. package/dist/data/ai/index.d.ts.map +1 -1
  159. package/dist/data/ai/use-session-scroll.cjs +30 -6
  160. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  161. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  162. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  163. package/dist/data/ai/use-session-scroll.js +30 -6
  164. package/dist/data/ai/use-session-scroll.js.map +1 -1
  165. package/dist/data/call-graph/CallGraph.cjs +50 -31
  166. package/dist/data/call-graph/CallGraph.cjs.map +1 -1
  167. package/dist/data/call-graph/CallGraph.d.ts +10 -1
  168. package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
  169. package/dist/data/call-graph/CallGraph.js +52 -33
  170. package/dist/data/call-graph/CallGraph.js.map +1 -1
  171. package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
  172. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
  173. package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
  174. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
  175. package/dist/data/call-graph/CallGraphMembers.js +5 -4
  176. package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
  177. package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
  178. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
  179. package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
  180. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
  181. package/dist/data/call-graph/CallGraphToolbar.js +18 -6
  182. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
  183. package/dist/data/call-graph/call-graph-model.cjs +169 -18
  184. package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
  185. package/dist/data/call-graph/call-graph-model.d.ts +40 -4
  186. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
  187. package/dist/data/call-graph/call-graph-model.js +170 -19
  188. package/dist/data/call-graph/call-graph-model.js.map +1 -1
  189. package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
  190. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
  191. package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
  192. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
  193. package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
  194. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
  195. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
  196. package/dist/data/call-graph/index.d.ts +2 -2
  197. package/dist/data/call-graph/index.d.ts.map +1 -1
  198. package/dist/data/call-graph/types.cjs.map +1 -1
  199. package/dist/data/call-graph/types.d.ts +7 -2
  200. package/dist/data/call-graph/types.d.ts.map +1 -1
  201. package/dist/data/call-graph/types.js.map +1 -1
  202. package/dist/data/chat/Chat.cjs +1 -1
  203. package/dist/data/chat/Chat.cjs.map +1 -1
  204. package/dist/data/chat/Chat.js +1 -1
  205. package/dist/data/chat/Chat.js.map +1 -1
  206. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  207. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  208. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  209. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  210. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  211. package/dist/data/chat/PromptInput.cjs +4 -2
  212. package/dist/data/chat/PromptInput.cjs.map +1 -1
  213. package/dist/data/chat/PromptInput.d.ts +5 -1
  214. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  215. package/dist/data/chat/PromptInput.js +4 -2
  216. package/dist/data/chat/PromptInput.js.map +1 -1
  217. package/dist/data/data-access.cjs +8 -0
  218. package/dist/data/data-access.cjs.map +1 -0
  219. package/dist/data/data-access.d.ts +5 -0
  220. package/dist/data/data-access.d.ts.map +1 -0
  221. package/dist/data/data-access.js +8 -0
  222. package/dist/data/data-access.js.map +1 -0
  223. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  224. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  225. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  226. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  227. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  228. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  229. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  230. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  231. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  232. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  233. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  234. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  235. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  236. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  237. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  238. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  239. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  240. package/dist/data/git/GitChangeList.cjs +6 -2
  241. package/dist/data/git/GitChangeList.cjs.map +1 -1
  242. package/dist/data/git/GitChangeList.d.ts +6 -1
  243. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  244. package/dist/data/git/GitChangeList.js +6 -2
  245. package/dist/data/git/GitChangeList.js.map +1 -1
  246. package/dist/data/graph-columns-layout.cjs +47 -16
  247. package/dist/data/graph-columns-layout.cjs.map +1 -1
  248. package/dist/data/graph-columns-layout.d.ts +34 -0
  249. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  250. package/dist/data/graph-columns-layout.js +47 -16
  251. package/dist/data/graph-columns-layout.js.map +1 -1
  252. package/dist/data/graph-diagram-model.cjs +5 -0
  253. package/dist/data/graph-diagram-model.cjs.map +1 -1
  254. package/dist/data/graph-diagram-model.d.ts +19 -0
  255. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  256. package/dist/data/graph-diagram-model.js +5 -0
  257. package/dist/data/graph-diagram-model.js.map +1 -1
  258. package/dist/data/graph-group-window.cjs +60 -0
  259. package/dist/data/graph-group-window.cjs.map +1 -0
  260. package/dist/data/graph-group-window.d.ts +33 -0
  261. package/dist/data/graph-group-window.d.ts.map +1 -0
  262. package/dist/data/graph-group-window.js +60 -0
  263. package/dist/data/graph-group-window.js.map +1 -0
  264. package/dist/data/har/HarPanel.cjs +3 -1
  265. package/dist/data/har/HarPanel.cjs.map +1 -1
  266. package/dist/data/har/HarPanel.d.ts +4 -1
  267. package/dist/data/har/HarPanel.d.ts.map +1 -1
  268. package/dist/data/har/HarPanel.js +3 -1
  269. package/dist/data/har/HarPanel.js.map +1 -1
  270. package/dist/data/test-runner/Expectation.cjs +57 -0
  271. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  272. package/dist/data/test-runner/Expectation.d.ts +19 -0
  273. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  274. package/dist/data/test-runner/Expectation.js +57 -0
  275. package/dist/data/test-runner/Expectation.js.map +1 -0
  276. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  277. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  278. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  279. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  280. package/dist/data/test-runner/MarkIcons.js +38 -0
  281. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  282. package/dist/data/test-runner/TestDetailPanel.cjs +74 -42
  283. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  284. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  285. package/dist/data/test-runner/TestDetailPanel.js +76 -44
  286. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  287. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  288. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  289. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  290. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  291. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  292. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  293. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  294. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  295. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  296. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  297. package/dist/data/test-runner/TestFilterBar.js +89 -95
  298. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  299. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  300. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  301. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  302. package/dist/data/test-runner/TestRunSummary.js +35 -21
  303. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  304. package/dist/data/test-runner/TestRunner.cjs +52 -30
  305. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  306. package/dist/data/test-runner/TestRunner.d.ts +3 -2
  307. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  308. package/dist/data/test-runner/TestRunner.js +52 -30
  309. package/dist/data/test-runner/TestRunner.js.map +1 -1
  310. package/dist/data/test-runner/TestTree.cjs +5 -2
  311. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  312. package/dist/data/test-runner/TestTree.d.ts +5 -2
  313. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  314. package/dist/data/test-runner/TestTree.js +5 -2
  315. package/dist/data/test-runner/TestTree.js.map +1 -1
  316. package/dist/data/test-runner/TestTreeNode.cjs +27 -19
  317. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  318. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  319. package/dist/data/test-runner/TestTreeNode.js +28 -20
  320. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  321. package/dist/data/test-runner/adapter.cjs +11 -0
  322. package/dist/data/test-runner/adapter.cjs.map +1 -1
  323. package/dist/data/test-runner/adapter.d.ts +18 -7
  324. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  325. package/dist/data/test-runner/adapter.js +11 -0
  326. package/dist/data/test-runner/adapter.js.map +1 -1
  327. package/dist/data/test-runner/copy.cjs +114 -0
  328. package/dist/data/test-runner/copy.cjs.map +1 -0
  329. package/dist/data/test-runner/copy.d.ts +47 -0
  330. package/dist/data/test-runner/copy.d.ts.map +1 -0
  331. package/dist/data/test-runner/copy.js +114 -0
  332. package/dist/data/test-runner/copy.js.map +1 -0
  333. package/dist/data/test-runner/index.d.ts +5 -2
  334. package/dist/data/test-runner/index.d.ts.map +1 -1
  335. package/dist/data/test-runner/marks.cjs +143 -0
  336. package/dist/data/test-runner/marks.cjs.map +1 -0
  337. package/dist/data/test-runner/marks.d.ts +30 -0
  338. package/dist/data/test-runner/marks.d.ts.map +1 -0
  339. package/dist/data/test-runner/marks.js +143 -0
  340. package/dist/data/test-runner/marks.js.map +1 -0
  341. package/dist/data/test-runner/status.cjs +27 -44
  342. package/dist/data/test-runner/status.cjs.map +1 -1
  343. package/dist/data/test-runner/status.d.ts +12 -3
  344. package/dist/data/test-runner/status.d.ts.map +1 -1
  345. package/dist/data/test-runner/status.js +27 -44
  346. package/dist/data/test-runner/status.js.map +1 -1
  347. package/dist/data/use-group-windows.cjs +50 -0
  348. package/dist/data/use-group-windows.cjs.map +1 -0
  349. package/dist/data/use-group-windows.d.ts +27 -0
  350. package/dist/data/use-group-windows.d.ts.map +1 -0
  351. package/dist/data/use-group-windows.js +50 -0
  352. package/dist/data/use-group-windows.js.map +1 -0
  353. package/dist/data/verification/adapterViews.cjs +16 -41
  354. package/dist/data/verification/adapterViews.cjs.map +1 -1
  355. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  356. package/dist/data/verification/adapterViews.js +16 -41
  357. package/dist/data/verification/adapterViews.js.map +1 -1
  358. package/dist/data/verification/adapters.cjs +115 -3
  359. package/dist/data/verification/adapters.cjs.map +1 -1
  360. package/dist/data/verification/adapters.d.ts.map +1 -1
  361. package/dist/data/verification/adapters.js +115 -3
  362. package/dist/data/verification/adapters.js.map +1 -1
  363. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  364. package/dist/data/verification/verifyReportTests.js.map +1 -1
  365. package/dist/data/version-info.cjs +3 -3
  366. package/dist/data/version-info.js +3 -3
  367. package/dist/data.cjs +54 -3
  368. package/dist/data.cjs.map +1 -1
  369. package/dist/data.d.ts +6 -2
  370. package/dist/data.d.ts.map +1 -1
  371. package/dist/data.js +58 -7
  372. package/dist/data.js.map +1 -1
  373. package/dist/hooks/event-hub.cjs +229 -0
  374. package/dist/hooks/event-hub.cjs.map +1 -0
  375. package/dist/hooks/event-hub.d.ts +26 -0
  376. package/dist/hooks/event-hub.d.ts.map +1 -0
  377. package/dist/hooks/event-hub.js +229 -0
  378. package/dist/hooks/event-hub.js.map +1 -0
  379. package/dist/hooks.cjs +2 -0
  380. package/dist/hooks.cjs.map +1 -1
  381. package/dist/hooks.d.ts +1 -0
  382. package/dist/hooks.d.ts.map +1 -1
  383. package/dist/hooks.js +2 -0
  384. package/dist/hooks.js.map +1 -1
  385. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  386. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  387. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  388. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  389. package/dist/icons/components/UiLogoEslint.js +10 -0
  390. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  391. package/dist/icons/components/UiLogoGo.cjs +10 -0
  392. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  393. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  394. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  395. package/dist/icons/components/UiLogoGo.js +10 -0
  396. package/dist/icons/components/UiLogoGo.js.map +1 -0
  397. package/dist/icons/components/UiLogoJest.cjs +10 -0
  398. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  399. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  400. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  401. package/dist/icons/components/UiLogoJest.js +10 -0
  402. package/dist/icons/components/UiLogoJest.js.map +1 -0
  403. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  404. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  405. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  406. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  407. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  408. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  409. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  410. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  411. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  412. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  413. package/dist/icons/components/UiLogoOxc.js +10 -0
  414. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  415. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  416. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  417. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  418. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  419. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  420. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  421. package/dist/icons/components/UiLogoPython.cjs +10 -0
  422. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  423. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  424. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  425. package/dist/icons/components/UiLogoPython.js +10 -0
  426. package/dist/icons/components/UiLogoPython.js.map +1 -0
  427. package/dist/icons/components/UiLogoReact.cjs +10 -0
  428. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  429. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  430. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  431. package/dist/icons/components/UiLogoReact.js +10 -0
  432. package/dist/icons/components/UiLogoReact.js.map +1 -0
  433. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  434. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  435. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  436. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  437. package/dist/icons/components/UiLogoRuff.js +10 -0
  438. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  439. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  440. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  441. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  442. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  443. package/dist/icons/components/UiLogoTypescript.js +10 -0
  444. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  445. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  446. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  447. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  448. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  449. package/dist/icons/components/UiLogoVitest.js +10 -0
  450. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  451. package/dist/icons/index.d.ts +11 -0
  452. package/dist/icons/index.d.ts.map +1 -1
  453. package/dist/icons/registry.cjs +22 -0
  454. package/dist/icons/registry.cjs.map +1 -1
  455. package/dist/icons/registry.d.ts.map +1 -1
  456. package/dist/icons/registry.js +22 -0
  457. package/dist/icons/registry.js.map +1 -1
  458. package/dist/icons.cjs +22 -0
  459. package/dist/icons.cjs.map +1 -1
  460. package/dist/icons.js +22 -0
  461. package/dist/icons.js.map +1 -1
  462. package/dist/index.cjs +56 -3
  463. package/dist/index.cjs.map +1 -1
  464. package/dist/index.js +60 -7
  465. package/dist/index.js.map +1 -1
  466. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  467. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  468. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  469. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  470. package/dist/overlay/modalStack.cjs +13 -6
  471. package/dist/overlay/modalStack.cjs.map +1 -1
  472. package/dist/overlay/modalStack.d.ts.map +1 -1
  473. package/dist/overlay/modalStack.js +13 -6
  474. package/dist/overlay/modalStack.js.map +1 -1
  475. package/dist/rpc/InlineError.cjs +12 -43
  476. package/dist/rpc/InlineError.cjs.map +1 -1
  477. package/dist/rpc/InlineError.d.ts.map +1 -1
  478. package/dist/rpc/InlineError.js +13 -44
  479. package/dist/rpc/InlineError.js.map +1 -1
  480. package/dist/rpc/OperationScheduleDialog.cjs +63 -10
  481. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  482. package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
  483. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  484. package/dist/rpc/OperationScheduleDialog.js +63 -10
  485. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  486. package/dist/rpc/OperationSchedules.cjs +12 -2
  487. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  488. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  489. package/dist/rpc/OperationSchedules.js +12 -2
  490. package/dist/rpc/OperationSchedules.js.map +1 -1
  491. package/dist/rpc/operation-schedule-model.cjs +2 -0
  492. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  493. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  494. package/dist/rpc/operation-schedule-model.js +2 -0
  495. package/dist/rpc/operation-schedule-model.js.map +1 -1
  496. package/dist/rpc/operation-schedule-types.d.ts +7 -1
  497. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  498. package/dist/styles.css +1 -1
  499. package/package.json +1 -1
  500. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  501. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  502. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  503. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  504. package/dist/data/test-runner/frameworkIcon.js +0 -27
  505. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { UiSqlTable } from "../../icons/components/UiSqlTable.js";
2
2
  import { UiSqlColumn } from "../../icons/components/UiSqlColumn.js";
3
+ import { UiKey } from "../../icons/components/UiKey.js";
3
4
  import { UiSqlStoredProc } from "../../icons/components/UiSqlStoredProc.js";
4
5
  import { UiTableProperties } from "../../icons/components/UiTableProperties.js";
5
6
  import { UiField } from "../../icons/components/UiField.js";
@@ -55,6 +56,7 @@ const DATA_KIND_WORDS = {
55
56
  const CALL_GRAPH_DATA_GLYPHS = [
56
57
  { id: "table", name: "table", icon: UiSqlTable },
57
58
  { id: "column", name: "column", icon: UiSqlColumn },
59
+ { id: "primary_key", name: "primary key column", icon: UiKey },
58
60
  { id: "procedure", name: "stored procedure", icon: UiSqlStoredProc },
59
61
  { id: "entity", name: "entity", icon: UiTableProperties },
60
62
  { id: "field", name: "field", icon: UiField }
@@ -62,6 +64,18 @@ const CALL_GRAPH_DATA_GLYPHS = [
62
64
  function isDataNode(node) {
63
65
  return Object.hasOwn(DATA_KIND_WORDS, node.kind);
64
66
  }
67
+ const DATA_MEMBER_OWNER = { column: "table", field: "entity" };
68
+ function isDataMember(node) {
69
+ return isDataNode(node) && Object.hasOwn(DATA_MEMBER_OWNER, node.kind);
70
+ }
71
+ function dataNodeGlyph(node) {
72
+ var _a;
73
+ return node.kind === "column" && ((_a = node.properties) == null ? void 0 : _a.primaryKey) === "true" ? "primary_key" : node.kind;
74
+ }
75
+ function dataMemberAside(node) {
76
+ var _a;
77
+ return node.kind === "column" ? (_a = node.properties) == null ? void 0 : _a.sqlType : void 0;
78
+ }
65
79
  function dataName(node) {
66
80
  const prefix = `${node.kind}:`;
67
81
  return node.id.startsWith(prefix) ? node.id.slice(prefix.length) : node.label;
@@ -111,7 +125,7 @@ function uirGlyph(graph, node) {
111
125
  if (node.unresolved) return "unresolved";
112
126
  if (isBuiltin(node)) return "builtin";
113
127
  if (isPackageScope(node)) return "package";
114
- if (isDataNode(node)) return node.kind;
128
+ if (isDataNode(node)) return dataNodeGlyph(node);
115
129
  if (callsItself(graph, node)) return "recursive";
116
130
  if (isExternal(node) && node.kind === "func") return "external_func";
117
131
  if (interfaceMethods(graph).has(node.id)) return "interface_method";
@@ -161,12 +175,16 @@ const UIR_CALL_GRAPH_VOCABULARY = {
161
175
  export {
162
176
  CALL_GRAPH_DATA_GLYPHS,
163
177
  DATA_KIND_WORDS,
178
+ DATA_MEMBER_OWNER,
164
179
  UIR_CALL_GRAPH_VOCABULARY,
165
180
  callsItself,
181
+ dataMemberAside,
166
182
  dataNodeBacking,
183
+ dataNodeGlyph,
167
184
  dataNodeStatus,
168
185
  interfaceMethods,
169
186
  isBuiltin,
187
+ isDataMember,
170
188
  isDataNode,
171
189
  isExternal,
172
190
  nodeTitle,
@@ -1 +1 @@
1
- {"version":3,"file":"call-graph-vocabulary.js","sources":["../../../src/data/call-graph/call-graph-vocabulary.ts"],"sourcesContent":["// What a node kind means and how it is drawn. A host whose source names its own kinds (OIPA's\n// transactions, copybooks and functions) passes its own vocabulary; the default is the one uir's\n// `graph.Build` reports without a Theme: uir node types, a builtin, a package scope and an index\n// location for every node with a source.\nimport {\n UiConstant,\n UiField,\n UiFunction,\n UiFunction1,\n UiFunction1Dark,\n UiFunctionSquare,\n UiInterface,\n UiMethod,\n UiMethod11,\n UiMethod11Dark,\n UiPackage,\n UiSqlColumn,\n UiSqlStoredProc,\n UiSqlTable,\n UiSymbol,\n UiSymbolDark,\n UiTableProperties,\n UiTypeParameter,\n UiUnknown,\n UiVariable,\n type IconComponent,\n} from \"../../icons\";\nimport type { CallGraph, CallGraphNode } from \"./types\";\n\nexport interface CallGraphGlyph {\n id: string;\n /** The legend's name for it. */\n name: string;\n icon: IconComponent;\n /** Drawn instead of `icon` in the dark theme, for coloured artwork. */\n darkIcon?: IconComponent;\n}\n\nexport interface CallGraphVocabulary {\n /** Every glyph the vocabulary draws, in legend order. */\n glyphs: readonly CallGraphGlyph[];\n /** The id of the one glyph a node shows. */\n glyphOf(graph: CallGraph, node: CallGraphNode): string;\n /** What the node is, in words: `method`, `external function`, `copybook`. */\n kindOf(graph: CallGraph, node: CallGraphNode): string;\n /** The node has a body the source walks: it can be expanded and opened. */\n hasSource(node: CallGraphNode): boolean;\n /** The graph can be drawn around the node: Focus is offered for it, with or without a source. */\n canRoot(node: CallGraphNode): boolean;\n /** A table, column, procedure, entity or field: its details count readers and writers. */\n isData(node: CallGraphNode): boolean;\n /** Drawn dimmed: the node leads nowhere further. */\n muted(node: CallGraphNode): boolean;\n /** The node's status line in its details. */\n status(node: CallGraphNode): string;\n /** The node a data node stands for, such as the column behind a field, offered as a Focus link. */\n backing?(node: CallGraphNode): { id: string; label: string } | undefined;\n /** What a group is, and the icon its box caption shows. */\n group: { noun: string; plural: string; icon: IconComponent; patternHint: string };\n}\n\n/** The glyph with that id, failing on one the vocabulary does not list. */\nexport function requireGlyph(vocabulary: CallGraphVocabulary, id: string): CallGraphGlyph {\n const glyph = vocabulary.glyphs.find((candidate) => candidate.id === id);\n if (!glyph) throw new Error(`call graph: the vocabulary has no glyph \"${id}\"`);\n return glyph;\n}\n\n/** The glyphs the graph's nodes use, once each, in legend order. */\nexport function usedGlyphs(graph: CallGraph, vocabulary: CallGraphVocabulary): CallGraphGlyph[] {\n const used = new Set(graph.nodes.map((node) => vocabulary.glyphOf(graph, node)));\n return vocabulary.glyphs.filter((glyph) => used.has(glyph.id));\n}\n\n/** The node's tooltip: its kind, its label and its group's full label. */\nexport function nodeTitle(graph: CallGraph, node: CallGraphNode, vocabulary: CallGraphVocabulary): string {\n const group = graph.groups?.find((candidate) => candidate.id === node.group)?.label ?? node.group;\n return `${vocabulary.kindOf(graph, node)} ${node.label}${group ? ` in ${group}` : \"\"}`;\n}\n\nexport function callsItself(graph: CallGraph, node: CallGraphNode): boolean {\n return graph.edges.some((edge) => edge.from === node.id && edge.to === node.id);\n}\n\nexport function siteKey(site: { path?: string; line?: number; column?: number }): string {\n return `${site.path}:${site.line}:${site.column}`;\n}\n\n// uir node types that have a glyph of their own, and the words for each.\nconst UIR_KINDS = new Map<string, { glyph: string; words: string }>([\n [\"func\", { glyph: \"func\", words: \"function\" }],\n [\"method\", { glyph: \"method\", words: \"method\" }],\n [\"builtin\", { glyph: \"builtin\", words: \"builtin\" }],\n [\"type\", { glyph: \"type\", words: \"type\" }],\n [\"field\", { glyph: \"field\", words: \"field\" }],\n [\"var\", { glyph: \"var\", words: \"variable\" }],\n [\"const\", { glyph: \"const\", words: \"constant\" }],\n [\"package\", { glyph: \"package\", words: \"package scope\" }],\n]);\n\n// Data access, as the graph's data model names it: `table:AsPolicy`, `column:AsPolicy.STATUSCODE`,\n// `procedure:Update_ClassGroup`, `entity:Policy` and `field:Policy.StatusCode`, a field carrying\n// `column` (its `x-oipa-column`) or `storage` (the table a dynamic field is kept in).\n\nexport const DATA_KIND_WORDS: Readonly<Record<string, string>> = {\n table: \"table\",\n column: \"column\",\n procedure: \"stored procedure\",\n entity: \"entity\",\n field: \"field\",\n};\n\nexport const CALL_GRAPH_DATA_GLYPHS: readonly CallGraphGlyph[] = [\n { id: \"table\", name: \"table\", icon: UiSqlTable },\n { id: \"column\", name: \"column\", icon: UiSqlColumn },\n { id: \"procedure\", name: \"stored procedure\", icon: UiSqlStoredProc },\n { id: \"entity\", name: \"entity\", icon: UiTableProperties },\n { id: \"field\", name: \"field\", icon: UiField },\n];\n\nexport function isDataNode(node: CallGraphNode): boolean {\n return Object.hasOwn(DATA_KIND_WORDS, node.kind);\n}\n\n/** The data node's name: its id after `<kind>:`, else its label. */\nfunction dataName(node: CallGraphNode): string {\n const prefix = `${node.kind}:`;\n return node.id.startsWith(prefix) ? node.id.slice(prefix.length) : node.label;\n}\n\nexport function dataNodeStatus(node: CallGraphNode): string {\n const name = dataName(node);\n switch (node.kind) {\n case \"table\": return `Table ${name}`;\n case \"column\": return `Column ${name}`;\n case \"procedure\": return `Stored procedure ${name}`;\n case \"entity\": return `${name} fields`;\n }\n const entity = name.includes(\".\") ? name.slice(0, name.indexOf(\".\")) : (node.group ?? \"\");\n const { column, storage } = node.properties ?? {};\n if (column) return `${entity} field → ${column}`;\n if (storage) return `${entity} field, dynamic, stored in ${storage}`;\n return `${entity} field`;\n}\n\n/** The column behind a field, by its `column` property. */\nexport function dataNodeBacking(node: CallGraphNode): { id: string; label: string } | undefined {\n const column = node.kind === \"field\" ? node.properties?.column : undefined;\n return column ? { id: `column:${column}`, label: column } : undefined;\n}\n\nexport function isBuiltin(node: CallGraphNode): boolean {\n return node.kind === \"builtin\";\n}\n\n/** The node standing for the calls a package makes outside any declaration. */\nfunction isPackageScope(node: CallGraphNode): boolean {\n return node.kind === \"package\";\n}\n\n/** A symbol declared outside the indexed snapshots: it has no source, so it cannot be opened or expanded. */\nexport function isExternal(node: CallGraphNode): boolean {\n return !node.location && !node.unresolved && !isBuiltin(node) && !isPackageScope(node) && !isDataNode(node);\n}\n\n/**\n * The index has no kind for an interface method: it is a `method`. It shows in the graph as the target\n * of a call whose site also carries a dispatch edge from the same caller, because the source adds that\n * dispatch edge to each implementation of the interface method called there.\n */\nexport function interfaceMethods(graph: CallGraph): Set<string> {\n const dispatched = new Set(\n graph.edges.filter((edge) => edge.type === \"dispatch\").flatMap((edge) => edge.sites.map((site) => `${edge.from} ${siteKey(site)}`)),\n );\n return new Set(\n graph.edges\n .filter((edge) => edge.type === \"call\" && edge.sites.some((site) => dispatched.has(`${edge.from} ${siteKey(site)}`)))\n .map((edge) => edge.to),\n );\n}\n\n/**\n * The one glyph a node shows. An unresolved call, a builtin and a package scope are what they are;\n * after those, a symbol that calls itself, an external function and an interface method outrank the\n * plain kind. An external method keeps the method glyph: its dimmed box already says it has no source.\n */\nfunction uirGlyph(graph: CallGraph, node: CallGraphNode): string {\n if (node.unresolved) return \"unresolved\";\n if (isBuiltin(node)) return \"builtin\";\n if (isPackageScope(node)) return \"package\";\n if (isDataNode(node)) return node.kind;\n if (callsItself(graph, node)) return \"recursive\";\n if (isExternal(node) && node.kind === \"func\") return \"external_func\";\n if (interfaceMethods(graph).has(node.id)) return \"interface_method\";\n return UIR_KINDS.get(node.kind)?.glyph ?? \"symbol\";\n}\n\nfunction uirKind(graph: CallGraph, node: CallGraphNode): string {\n if (node.unresolved) return \"unresolved call\";\n const kind = interfaceMethods(graph).has(node.id) ? \"interface method\" : (UIR_KINDS.get(node.kind)?.words ?? DATA_KIND_WORDS[node.kind] ?? node.kind.replaceAll(\"_\", \" \"));\n return [isExternal(node) ? \"external\" : \"\", callsItself(graph, node) ? \"recursive\" : \"\", kind].filter(Boolean).join(\" \");\n}\n\nfunction uirStatus(node: CallGraphNode): string {\n if (node.unresolved) return \"Unresolved: the index has no target for this call\";\n if (isBuiltin(node)) return \"Builtin: no source\";\n if (isExternal(node)) return \"External: declared outside the indexed snapshots\";\n if (node.location) return \"Indexed\";\n return isDataNode(node) ? dataNodeStatus(node) : \"Package scope: calls made outside any declaration\";\n}\n\nexport const UIR_CALL_GRAPH_VOCABULARY: CallGraphVocabulary = {\n glyphs: [\n { id: \"func\", name: \"function\", icon: UiFunction },\n { id: \"method\", name: \"method\", icon: UiMethod },\n { id: \"interface_method\", name: \"interface method\", icon: UiInterface },\n { id: \"recursive\", name: \"calls itself\", icon: UiMethod11, darkIcon: UiMethod11Dark },\n { id: \"external_func\", name: \"external function\", icon: UiFunction1, darkIcon: UiFunction1Dark },\n { id: \"builtin\", name: \"builtin\", icon: UiFunctionSquare },\n { id: \"type\", name: \"type\", icon: UiTypeParameter },\n { id: \"field\", name: \"field\", icon: UiField },\n { id: \"var\", name: \"variable\", icon: UiVariable },\n { id: \"const\", name: \"constant\", icon: UiConstant },\n { id: \"package\", name: \"package scope\", icon: UiPackage },\n // uir's `field` is already a glyph of its own: a struct field is data too.\n ...CALL_GRAPH_DATA_GLYPHS.filter((glyph) => glyph.id !== \"field\"),\n { id: \"unresolved\", name: \"unresolved call\", icon: UiUnknown },\n { id: \"symbol\", name: \"other symbol\", icon: UiSymbol, darkIcon: UiSymbolDark },\n ],\n glyphOf: uirGlyph,\n kindOf: uirKind,\n hasSource: (node) => Boolean(node.location),\n canRoot: (node) => Boolean(node.location) || isDataNode(node),\n isData: isDataNode,\n muted: (node) => Boolean(node.unresolved) || isBuiltin(node) || isExternal(node),\n status: uirStatus,\n backing: dataNodeBacking,\n group: { noun: \"package\", plural: \"packages\", icon: UiPackage, patternHint: \"example.com/module/...\" },\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"call-graph-vocabulary.js","sources":["../../../src/data/call-graph/call-graph-vocabulary.ts"],"sourcesContent":["// What a node kind means and how it is drawn. A host whose source names its own kinds (OIPA's\n// transactions, copybooks and functions) passes its own vocabulary; the default is the one uir's\n// `graph.Build` reports without a Theme: uir node types, a builtin, a package scope and an index\n// location for every node with a source.\nimport {\n UiConstant,\n UiField,\n UiFunction,\n UiFunction1,\n UiFunction1Dark,\n UiFunctionSquare,\n UiInterface,\n UiKey,\n UiMethod,\n UiMethod11,\n UiMethod11Dark,\n UiPackage,\n UiSqlColumn,\n UiSqlStoredProc,\n UiSqlTable,\n UiSymbol,\n UiSymbolDark,\n UiTableProperties,\n UiTypeParameter,\n UiUnknown,\n UiVariable,\n type IconComponent,\n} from \"../../icons\";\nimport type { CallGraph, CallGraphNode } from \"./types\";\n\nexport interface CallGraphGlyph {\n id: string;\n /** The legend's name for it. */\n name: string;\n icon: IconComponent;\n /** Drawn instead of `icon` in the dark theme, for coloured artwork. */\n darkIcon?: IconComponent;\n}\n\nexport interface CallGraphVocabulary {\n /** Every glyph the vocabulary draws, in legend order. */\n glyphs: readonly CallGraphGlyph[];\n /** The id of the one glyph a node shows. */\n glyphOf(graph: CallGraph, node: CallGraphNode): string;\n /** What the node is, in words: `method`, `external function`, `copybook`. */\n kindOf(graph: CallGraph, node: CallGraphNode): string;\n /** The node has a body the source walks: it can be expanded and opened. */\n hasSource(node: CallGraphNode): boolean;\n /** The graph can be drawn around the node: Focus is offered for it, with or without a source. */\n canRoot(node: CallGraphNode): boolean;\n /** A table, column, procedure, entity or field: its details count readers and writers. */\n isData(node: CallGraphNode): boolean;\n /** Drawn dimmed: the node leads nowhere further. */\n muted(node: CallGraphNode): boolean;\n /** The node's status line in its details. */\n status(node: CallGraphNode): string;\n /** The node a data node stands for, such as the column behind a field, offered as a Focus link. */\n backing?(node: CallGraphNode): { id: string; label: string } | undefined;\n /** What a group is, and the icon its box caption shows. */\n group: { noun: string; plural: string; icon: IconComponent; patternHint: string };\n}\n\n/** The glyph with that id, failing on one the vocabulary does not list. */\nexport function requireGlyph(vocabulary: CallGraphVocabulary, id: string): CallGraphGlyph {\n const glyph = vocabulary.glyphs.find((candidate) => candidate.id === id);\n if (!glyph) throw new Error(`call graph: the vocabulary has no glyph \"${id}\"`);\n return glyph;\n}\n\n/** The glyphs the graph's nodes use, once each, in legend order. */\nexport function usedGlyphs(graph: CallGraph, vocabulary: CallGraphVocabulary): CallGraphGlyph[] {\n const used = new Set(graph.nodes.map((node) => vocabulary.glyphOf(graph, node)));\n return vocabulary.glyphs.filter((glyph) => used.has(glyph.id));\n}\n\n/** The node's tooltip: its kind, its label and its group's full label. */\nexport function nodeTitle(graph: CallGraph, node: CallGraphNode, vocabulary: CallGraphVocabulary): string {\n const group = graph.groups?.find((candidate) => candidate.id === node.group)?.label ?? node.group;\n return `${vocabulary.kindOf(graph, node)} ${node.label}${group ? ` in ${group}` : \"\"}`;\n}\n\nexport function callsItself(graph: CallGraph, node: CallGraphNode): boolean {\n return graph.edges.some((edge) => edge.from === node.id && edge.to === node.id);\n}\n\nexport function siteKey(site: { path?: string; line?: number; column?: number }): string {\n return `${site.path}:${site.line}:${site.column}`;\n}\n\n// uir node types that have a glyph of their own, and the words for each.\nconst UIR_KINDS = new Map<string, { glyph: string; words: string }>([\n [\"func\", { glyph: \"func\", words: \"function\" }],\n [\"method\", { glyph: \"method\", words: \"method\" }],\n [\"builtin\", { glyph: \"builtin\", words: \"builtin\" }],\n [\"type\", { glyph: \"type\", words: \"type\" }],\n [\"field\", { glyph: \"field\", words: \"field\" }],\n [\"var\", { glyph: \"var\", words: \"variable\" }],\n [\"const\", { glyph: \"const\", words: \"constant\" }],\n [\"package\", { glyph: \"package\", words: \"package scope\" }],\n]);\n\n// Data access, as the graph's data model names it: `table:AsPolicy`, `column:AsPolicy.STATUSCODE`,\n// `procedure:Update_ClassGroup`, `entity:Policy` and `field:Policy.StatusCode`, a field carrying\n// `column` (its `x-oipa-column`) or `storage` (the table a dynamic field is kept in).\n\nexport const DATA_KIND_WORDS: Readonly<Record<string, string>> = {\n table: \"table\",\n column: \"column\",\n procedure: \"stored procedure\",\n entity: \"entity\",\n field: \"field\",\n};\n\nexport const CALL_GRAPH_DATA_GLYPHS: readonly CallGraphGlyph[] = [\n { id: \"table\", name: \"table\", icon: UiSqlTable },\n { id: \"column\", name: \"column\", icon: UiSqlColumn },\n { id: \"primary_key\", name: \"primary key column\", icon: UiKey },\n { id: \"procedure\", name: \"stored procedure\", icon: UiSqlStoredProc },\n { id: \"entity\", name: \"entity\", icon: UiTableProperties },\n { id: \"field\", name: \"field\", icon: UiField },\n];\n\nexport function isDataNode(node: CallGraphNode): boolean {\n return Object.hasOwn(DATA_KIND_WORDS, node.kind);\n}\n\nexport const DATA_MEMBER_OWNER: Readonly<Record<string, string>> = { column: \"table\", field: \"entity\" };\n\nexport function isDataMember(node: CallGraphNode): boolean {\n return isDataNode(node) && Object.hasOwn(DATA_MEMBER_OWNER, node.kind);\n}\n\nexport function dataNodeGlyph(node: CallGraphNode): string {\n return node.kind === \"column\" && node.properties?.primaryKey === \"true\" ? \"primary_key\" : node.kind;\n}\n\nexport function dataMemberAside(node: CallGraphNode): string | undefined {\n return node.kind === \"column\" ? node.properties?.sqlType : undefined;\n}\n\n/** The data node's name: its id after `<kind>:`, else its label. */\nfunction dataName(node: CallGraphNode): string {\n const prefix = `${node.kind}:`;\n return node.id.startsWith(prefix) ? node.id.slice(prefix.length) : node.label;\n}\n\nexport function dataNodeStatus(node: CallGraphNode): string {\n const name = dataName(node);\n switch (node.kind) {\n case \"table\": return `Table ${name}`;\n case \"column\": return `Column ${name}`;\n case \"procedure\": return `Stored procedure ${name}`;\n case \"entity\": return `${name} fields`;\n }\n const entity = name.includes(\".\") ? name.slice(0, name.indexOf(\".\")) : (node.group ?? \"\");\n const { column, storage } = node.properties ?? {};\n if (column) return `${entity} field → ${column}`;\n if (storage) return `${entity} field, dynamic, stored in ${storage}`;\n return `${entity} field`;\n}\n\n/** The column behind a field, by its `column` property. */\nexport function dataNodeBacking(node: CallGraphNode): { id: string; label: string } | undefined {\n const column = node.kind === \"field\" ? node.properties?.column : undefined;\n return column ? { id: `column:${column}`, label: column } : undefined;\n}\n\nexport function isBuiltin(node: CallGraphNode): boolean {\n return node.kind === \"builtin\";\n}\n\n/** The node standing for the calls a package makes outside any declaration. */\nfunction isPackageScope(node: CallGraphNode): boolean {\n return node.kind === \"package\";\n}\n\n/** A symbol declared outside the indexed snapshots: it has no source, so it cannot be opened or expanded. */\nexport function isExternal(node: CallGraphNode): boolean {\n return !node.location && !node.unresolved && !isBuiltin(node) && !isPackageScope(node) && !isDataNode(node);\n}\n\n/**\n * The index has no kind for an interface method: it is a `method`. It shows in the graph as the target\n * of a call whose site also carries a dispatch edge from the same caller, because the source adds that\n * dispatch edge to each implementation of the interface method called there.\n */\nexport function interfaceMethods(graph: CallGraph): Set<string> {\n const dispatched = new Set(\n graph.edges.filter((edge) => edge.type === \"dispatch\").flatMap((edge) => edge.sites.map((site) => `${edge.from} ${siteKey(site)}`)),\n );\n return new Set(\n graph.edges\n .filter((edge) => edge.type === \"call\" && edge.sites.some((site) => dispatched.has(`${edge.from} ${siteKey(site)}`)))\n .map((edge) => edge.to),\n );\n}\n\n/**\n * The one glyph a node shows. An unresolved call, a builtin and a package scope are what they are;\n * after those, a symbol that calls itself, an external function and an interface method outrank the\n * plain kind. An external method keeps the method glyph: its dimmed box already says it has no source.\n */\nfunction uirGlyph(graph: CallGraph, node: CallGraphNode): string {\n if (node.unresolved) return \"unresolved\";\n if (isBuiltin(node)) return \"builtin\";\n if (isPackageScope(node)) return \"package\";\n if (isDataNode(node)) return dataNodeGlyph(node);\n if (callsItself(graph, node)) return \"recursive\";\n if (isExternal(node) && node.kind === \"func\") return \"external_func\";\n if (interfaceMethods(graph).has(node.id)) return \"interface_method\";\n return UIR_KINDS.get(node.kind)?.glyph ?? \"symbol\";\n}\n\nfunction uirKind(graph: CallGraph, node: CallGraphNode): string {\n if (node.unresolved) return \"unresolved call\";\n const kind = interfaceMethods(graph).has(node.id) ? \"interface method\" : (UIR_KINDS.get(node.kind)?.words ?? DATA_KIND_WORDS[node.kind] ?? node.kind.replaceAll(\"_\", \" \"));\n return [isExternal(node) ? \"external\" : \"\", callsItself(graph, node) ? \"recursive\" : \"\", kind].filter(Boolean).join(\" \");\n}\n\nfunction uirStatus(node: CallGraphNode): string {\n if (node.unresolved) return \"Unresolved: the index has no target for this call\";\n if (isBuiltin(node)) return \"Builtin: no source\";\n if (isExternal(node)) return \"External: declared outside the indexed snapshots\";\n if (node.location) return \"Indexed\";\n return isDataNode(node) ? dataNodeStatus(node) : \"Package scope: calls made outside any declaration\";\n}\n\nexport const UIR_CALL_GRAPH_VOCABULARY: CallGraphVocabulary = {\n glyphs: [\n { id: \"func\", name: \"function\", icon: UiFunction },\n { id: \"method\", name: \"method\", icon: UiMethod },\n { id: \"interface_method\", name: \"interface method\", icon: UiInterface },\n { id: \"recursive\", name: \"calls itself\", icon: UiMethod11, darkIcon: UiMethod11Dark },\n { id: \"external_func\", name: \"external function\", icon: UiFunction1, darkIcon: UiFunction1Dark },\n { id: \"builtin\", name: \"builtin\", icon: UiFunctionSquare },\n { id: \"type\", name: \"type\", icon: UiTypeParameter },\n { id: \"field\", name: \"field\", icon: UiField },\n { id: \"var\", name: \"variable\", icon: UiVariable },\n { id: \"const\", name: \"constant\", icon: UiConstant },\n { id: \"package\", name: \"package scope\", icon: UiPackage },\n // uir's `field` is already a glyph of its own: a struct field is data too.\n ...CALL_GRAPH_DATA_GLYPHS.filter((glyph) => glyph.id !== \"field\"),\n { id: \"unresolved\", name: \"unresolved call\", icon: UiUnknown },\n { id: \"symbol\", name: \"other symbol\", icon: UiSymbol, darkIcon: UiSymbolDark },\n ],\n glyphOf: uirGlyph,\n kindOf: uirKind,\n hasSource: (node) => Boolean(node.location),\n canRoot: (node) => Boolean(node.location) || isDataNode(node),\n isData: isDataNode,\n muted: (node) => Boolean(node.unresolved) || isBuiltin(node) || isExternal(node),\n status: uirStatus,\n backing: dataNodeBacking,\n group: { noun: \"package\", plural: \"packages\", icon: UiPackage, patternHint: \"example.com/module/...\" },\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"call-graph.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/call-graph.fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,EAOL,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAiB,kBAAkB,EAAiB,aAAa,EAAE,MAAM,SAAS,CAAC;AAqC3H,4FAA4F;AAC5F,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC;AAExF,eAAO,MAAM,kBAAkB,UAAoC,CAAC;AACpE,eAAO,MAAM,OAAO,QAAyB,CAAC;AAC9C,eAAO,MAAM,aAAa;;;;;;;;;CAA2B,CAAC;AAEtD,wBAAgB,OAAO,CAAC,OAAO,GAAE,MAAM,EAAuB,GAAG,OAAO,CAwBvE;AAED,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,MAAM,EAAuB,GAAG,OAAO,CAgBvF;AAiBD,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAKX,kGAAkG;AAClG,wBAAgB,SAAS,IAAI,SAAS,CAqBrC;AAED,mDAAmD;AACnD,wBAAgB,yBAAyB,IAAI,SAAS,CAerD;AAUD,6FAA6F;AAC7F,eAAO,MAAM,eAAe,EAAE,mBA0B7B,CAAC;AAIF,eAAO,MAAM,QAAQ;;;;;;;;;;;CAWX,CAAC;AAEX,mGAAmG;AACnG,eAAO,MAAM,mBAAmB,UAAoI,CAAC;AA0CrK;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAAE,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAuBtH;AAED,uGAAuG;AACvG,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAEvD,CAAC"}
1
+ {"version":3,"file":"call-graph.fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/call-graph.fixtures.ts"],"names":[],"mappings":"AAKA,OAAO,EAQL,KAAK,mBAAmB,EACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAiB,kBAAkB,EAAiB,aAAa,EAAE,MAAM,SAAS,CAAC;AAqC3H,4FAA4F;AAC5F,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAA;CAAE,CAAC;AAExF,eAAO,MAAM,kBAAkB,UAAoC,CAAC;AACpE,eAAO,MAAM,OAAO,QAAyB,CAAC;AAC9C,eAAO,MAAM,aAAa;;;;;;;;;CAA2B,CAAC;AAEtD,wBAAgB,OAAO,CAAC,OAAO,GAAE,MAAM,EAAuB,GAAG,OAAO,CAwBvE;AAED,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,MAAM,EAAuB,GAAG,OAAO,CAgBvF;AAiBD,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAKX,kGAAkG;AAClG,wBAAgB,SAAS,IAAI,SAAS,CAqBrC;AAED,mDAAmD;AACnD,wBAAgB,yBAAyB,IAAI,SAAS,CAerD;AAUD,6FAA6F;AAC7F,eAAO,MAAM,eAAe,EAAE,mBA0B7B,CAAC;AAIF,eAAO,MAAM,QAAQ;;;;;;;;;;;CAWX,CAAC;AAEX,mGAAmG;AACnG,eAAO,MAAM,mBAAmB,UAAoI,CAAC;AA2DrK;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;IAAE,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAuBtH;AAED,uGAAuG;AACvG,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAEvD,CAAC"}
@@ -1,7 +1,7 @@
1
1
  export { CallGraph, type CallGraphProps } from './CallGraph.js';
2
2
  export { CALL_GRAPH_ACCESS } from './types.js';
3
3
  export type { CallGraph as CallGraphData, CallGraphAccess, CallGraphDirection, CallGraphEdge, CallGraphEdgeLabels, CallGraphEdgeType, CallGraphFetchParams, CallGraphGroup, CallGraphGroupFact, CallGraphIdentifier, CallGraphLocation, CallGraphNode, CallGraphOmitted, CallGraphSelection, CallGraphSite, } from './types.js';
4
- export { CALL_GRAPH_DATA_GLYPHS, callsItself, DATA_KIND_WORDS as CALL_GRAPH_DATA_KIND_WORDS, dataNodeBacking, dataNodeStatus, interfaceMethods, isDataNode, UIR_CALL_GRAPH_VOCABULARY, type CallGraphGlyph, type CallGraphVocabulary, } from './call-graph-vocabulary.js';
4
+ export { CALL_GRAPH_DATA_GLYPHS, callsItself, DATA_KIND_WORDS as CALL_GRAPH_DATA_KIND_WORDS, dataNodeBacking, DATA_MEMBER_OWNER, dataMemberAside, dataNodeGlyph, dataNodeStatus, interfaceMethods, isDataNode, isDataMember, UIR_CALL_GRAPH_VOCABULARY, type CallGraphGlyph, type CallGraphVocabulary, } from './call-graph-vocabulary.js';
5
5
  export { callGraphGroupFacts, EXCLUDE_EXTERNAL as CALL_GRAPH_EXCLUDE_EXTERNAL, formatExclude as formatCallGraphExclude, matchesExclude as matchesCallGraphExclude, parseExclude as parseCallGraphExclude, type ExcludeMatcher as CallGraphExcludeMatcher, } from './call-graph-exclude.js';
6
- export { CALL_GRAPH_DEFAULT_DEPTH, CALL_GRAPH_MAX_DEPTH, mergeGraph as mergeCallGraph, toggleAccess as toggleCallGraphAccess, } from './call-graph-model.js';
6
+ export { CALL_GRAPH_DEFAULT_DEPTH, CALL_GRAPH_MAX_DEPTH, baseAccess as baseCallGraphAccess, mergeGraph as mergeCallGraph, toggleAccess as toggleCallGraphAccess, } from './call-graph-model.js';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,SAAS,IAAI,aAAa,EAC1B,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,eAAe,IAAI,0BAA0B,EAC7C,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,IAAI,2BAA2B,EAC/C,aAAa,IAAI,sBAAsB,EACvC,cAAc,IAAI,uBAAuB,EACzC,YAAY,IAAI,qBAAqB,EACrC,KAAK,cAAc,IAAI,uBAAuB,GAC/C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,IAAI,cAAc,EAC5B,YAAY,IAAI,qBAAqB,GACtC,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,YAAY,EACV,SAAS,IAAI,aAAa,EAC1B,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,sBAAsB,EACtB,WAAW,EACX,eAAe,IAAI,0BAA0B,EAC7C,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,mBAAmB,EACnB,gBAAgB,IAAI,2BAA2B,EAC/C,aAAa,IAAI,sBAAsB,EACvC,cAAc,IAAI,uBAAuB,EACzC,YAAY,IAAI,qBAAqB,EACrC,KAAK,cAAc,IAAI,uBAAuB,GAC/C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,IAAI,mBAAmB,EACjC,UAAU,IAAI,cAAc,EAC5B,YAAY,IAAI,qBAAqB,GACtC,MAAM,oBAAoB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sources":["../../../src/data/call-graph/types.ts"],"sourcesContent":["// The call graph as uir's `graph.Graph` serialises it (github.com/flanksource/uir/graph, model.go). The\n// field names are its JSON tags, so a host hands a response straight in. Nothing here is specific to a\n// language: what a node kind means and how it is drawn comes from a CallGraphVocabulary.\n\n/** Which side of the root a graph walks. */\nexport type CallGraphDirection = \"callees\" | \"callers\" | \"both\";\n\n/** A call site behind an edge. `guards` are the conditions that must hold to reach it, outermost first. */\nexport interface CallGraphSite {\n path?: string;\n line?: number;\n column?: number;\n /** The call as written. */\n text?: string;\n guards?: string[];\n}\n\n/** uir.Identifier: where a node sits in a module, package, type and method. */\nexport interface CallGraphIdentifier {\n id?: string;\n module?: string;\n package?: string;\n type?: string;\n method?: string;\n field?: string;\n signature?: string;\n node_type?: string;\n}\n\n/** Where a node is declared, in the terms an index addresses it by. */\nexport interface CallGraphLocation {\n root_key?: string;\n checkout_path?: string;\n snapshot_id?: string;\n source_id?: string;\n path?: string;\n identity_key?: string;\n line?: number;\n column?: number;\n}\n\nexport interface CallGraphNode {\n id: string;\n identifier: CallGraphIdentifier;\n kind: string;\n label: string;\n /** A `CallGraphGroup` id. */\n group?: string;\n /** 0 for a root, negative for its callers and positive for its callees. */\n depth: number;\n /** Incoming edges: a total on the side the walk asked about, else the edges drawn. */\n in: number;\n /** Outgoing edges: a total on the side the walk asked about, else the edges drawn. */\n out: number;\n /** A target the source could not place; drawn as a leaf. */\n unresolved?: boolean;\n location?: CallGraphLocation;\n tone?: string;\n icon?: string;\n properties?: Record<string, string>;\n}\n\n/** A call, a call one of several targets is chosen for at run time, or a read or write of data. */\nexport type CallGraphEdgeType = \"call\" | \"dispatch\" | \"read\" | \"write\";\n\n/** What `fetchGraph` asks the graph to follow: `call` covers dispatch too. */\nexport type CallGraphAccess = \"call\" | \"read\" | \"write\";\n\nexport const CALL_GRAPH_ACCESS: readonly CallGraphAccess[] = [\"call\", \"read\", \"write\"];\n\nexport interface CallGraphEdge {\n /** `from|to|type`. */\n id: string;\n from: string;\n to: string;\n type: CallGraphEdgeType;\n /** The construct behind the edge, such as `copybook`, `attached`, `sql` or `copyto`. */\n kind?: string;\n sites: CallGraphSite[];\n /**\n * Facts about the edge, such as the plans that select a dispatch target, or `columns`/`fields`: the\n * members a read or write of a collapsed table or entity touches, comma separated.\n */\n properties?: Record<string, string>;\n}\n\nexport interface CallGraphGroup {\n id: string;\n label: string;\n parent?: string;\n}\n\n/** What the graph leaves out. */\nexport interface CallGraphOmitted {\n node_limit?: boolean;\n beyond_depth?: number;\n unresolved?: number;\n unreadable_source?: string[];\n /** Distinct nodes the exclusions left out, per group. */\n excluded?: Record<string, number>;\n}\n\nexport interface CallGraph {\n roots: string[];\n nodes: CallGraphNode[];\n edges: CallGraphEdge[];\n groups?: CallGraphGroup[];\n omitted: CallGraphOmitted;\n}\n\n/** What `fetchGraph` is asked for. `exclude` undefined takes the host's defaults; `[]` excludes nothing. */\nexport interface CallGraphFetchParams {\n root: string;\n direction: CallGraphDirection;\n depth: number;\n exclude: string[] | undefined;\n /** The edge types to follow, never empty. Filtered by the host, so the `+N` counts agree. */\n access: CallGraphAccess[];\n /** Columns and fields as nodes of their own, rather than collapsed into their table or entity. */\n columns: boolean;\n /** `load` draws the graph around `root`; `expand` loads one more hop around a drawn node, to merge in. */\n purpose: \"load\" | \"expand\";\n signal: AbortSignal;\n}\n\n/** A group the graph reached, drawn or excluded; `nodes` counts both. */\nexport interface CallGraphGroupFact {\n name: string;\n /** Shown instead of `name`. */\n label?: string;\n /** Outside the indexed scope: \"Hide all external\" covers it. */\n external?: boolean;\n nodes: number;\n excluded: boolean;\n}\n\nexport interface CallGraphSelection {\n kind: \"node\" | \"edge\";\n id: string;\n}\n\n/** The guards fetched for a selected edge whose response came without them. */\nexport type SiteGuardsState = { status: \"loading\" } | { status: \"loaded\"; sites: CallGraphSite[] } | { status: \"failed\"; error: string };\n\n/** The words an edge's type is drawn with: its pill's accessible name, its tooltip and its legend entry. */\nexport type CallGraphEdgeLabels = Record<CallGraphEdgeType, string>;\n"],"names":[],"mappings":";;AAoEO,MAAM,oBAAgD,CAAC,QAAQ,QAAQ,OAAO;;"}
1
+ {"version":3,"file":"types.cjs","sources":["../../../src/data/call-graph/types.ts"],"sourcesContent":["// The call graph as uir's `graph.Graph` serialises it (github.com/flanksource/uir/graph, model.go). The\n// field names are its JSON tags, so a host hands a response straight in. Nothing here is specific to a\n// language: what a node kind means and how it is drawn comes from a CallGraphVocabulary.\n\n/** Which side of the root a graph walks. */\nexport type CallGraphDirection = \"callees\" | \"callers\" | \"both\";\n\n/** A call site behind an edge. `guards` are the conditions that must hold to reach it, outermost first. */\nexport interface CallGraphSite {\n path?: string;\n line?: number;\n column?: number;\n /** The call as written. */\n text?: string;\n guards?: string[];\n}\n\n/** uir.Identifier: where a node sits in a module, package, type and method. */\nexport interface CallGraphIdentifier {\n id?: string;\n module?: string;\n package?: string;\n type?: string;\n method?: string;\n field?: string;\n signature?: string;\n node_type?: string;\n}\n\n/** Where a node is declared, in the terms an index addresses it by. */\nexport interface CallGraphLocation {\n root_key?: string;\n checkout_path?: string;\n snapshot_id?: string;\n source_id?: string;\n path?: string;\n identity_key?: string;\n line?: number;\n column?: number;\n}\n\nexport interface CallGraphNode {\n id: string;\n identifier: CallGraphIdentifier;\n kind: string;\n label: string;\n /** A `CallGraphGroup` id. */\n group?: string;\n /** 0 for a root, negative for its callers and positive for its callees. */\n depth: number;\n /** Incoming edges: a total on the side the walk asked about, else the edges drawn. */\n in: number;\n /** Outgoing edges: a total on the side the walk asked about, else the edges drawn. */\n out: number;\n /** A target the source could not place; drawn as a leaf. */\n unresolved?: boolean;\n location?: CallGraphLocation;\n tone?: string;\n icon?: string;\n properties?: Record<string, string>;\n}\n\n/** A call, a call one of several targets is chosen for at run time, or a read or write of data. */\nexport type CallGraphEdgeType = \"call\" | \"dispatch\" | \"read\" | \"write\";\n\n/**\n * What `fetchGraph` asks the graph to follow: `call` covers dispatch too.\n * `variable` follows the variables a body reads and writes, on top of the\n * others, for a host that offers it (`variableAccess`).\n */\nexport type CallGraphAccess = \"call\" | \"read\" | \"write\" | \"variable\";\n\n/** The access types a graph follows by default; at least one of them stays on. */\nexport const CALL_GRAPH_ACCESS: readonly CallGraphAccess[] = [\"call\", \"read\", \"write\"];\n\nexport interface CallGraphEdge {\n /** `from|to|type`. */\n id: string;\n from: string;\n to: string;\n type: CallGraphEdgeType;\n /** The construct behind the edge, such as `copybook`, `attached`, `sql` or `copyto`. */\n kind?: string;\n sites: CallGraphSite[];\n /**\n * Facts about the edge, such as the plans that select a dispatch target, or `columns`/`fields`: the\n * members a read or write of a collapsed table or entity touches, comma separated.\n */\n properties?: Record<string, string>;\n}\n\nexport interface CallGraphGroup {\n id: string;\n label: string;\n parent?: string;\n}\n\n/** What the graph leaves out. */\nexport interface CallGraphOmitted {\n node_limit?: boolean;\n beyond_depth?: number;\n unresolved?: number;\n unreadable_source?: string[];\n /** Distinct nodes the exclusions left out, per group. */\n excluded?: Record<string, number>;\n}\n\nexport interface CallGraph {\n roots: string[];\n nodes: CallGraphNode[];\n edges: CallGraphEdge[];\n groups?: CallGraphGroup[];\n omitted: CallGraphOmitted;\n}\n\n/** What `fetchGraph` is asked for. `exclude` undefined takes the host's defaults; `[]` excludes nothing. */\nexport interface CallGraphFetchParams {\n root: string;\n direction: CallGraphDirection;\n depth: number;\n exclude: string[] | undefined;\n /** The edge types to follow, never empty. Filtered by the host, so the `+N` counts agree. */\n access: CallGraphAccess[];\n /** Columns and fields as nodes of their own, rather than collapsed into their table or entity. */\n columns: boolean;\n /** `load` draws the graph around `root`; `expand` loads one more hop around a drawn node, to merge in. */\n purpose: \"load\" | \"expand\";\n signal: AbortSignal;\n}\n\n/** A group the graph reached, drawn or excluded; `nodes` counts both. */\nexport interface CallGraphGroupFact {\n name: string;\n /** Shown instead of `name`. */\n label?: string;\n /** Outside the indexed scope: \"Hide all external\" covers it. */\n external?: boolean;\n nodes: number;\n excluded: boolean;\n}\n\nexport interface CallGraphSelection {\n kind: \"node\" | \"edge\";\n id: string;\n}\n\n/** The guards fetched for a selected edge whose response came without them. */\nexport type SiteGuardsState = { status: \"loading\" } | { status: \"loaded\"; sites: CallGraphSite[] } | { status: \"failed\"; error: string };\n\n/** The words an edge's type is drawn with: its pill's accessible name, its tooltip and its legend entry. */\nexport type CallGraphEdgeLabels = Record<CallGraphEdgeType, string>;\n"],"names":[],"mappings":";;AAyEO,MAAM,oBAAgD,CAAC,QAAQ,QAAQ,OAAO;;"}
@@ -53,8 +53,13 @@ export interface CallGraphNode {
53
53
  }
54
54
  /** A call, a call one of several targets is chosen for at run time, or a read or write of data. */
55
55
  export type CallGraphEdgeType = "call" | "dispatch" | "read" | "write";
56
- /** What `fetchGraph` asks the graph to follow: `call` covers dispatch too. */
57
- export type CallGraphAccess = "call" | "read" | "write";
56
+ /**
57
+ * What `fetchGraph` asks the graph to follow: `call` covers dispatch too.
58
+ * `variable` follows the variables a body reads and writes, on top of the
59
+ * others, for a host that offers it (`variableAccess`).
60
+ */
61
+ export type CallGraphAccess = "call" | "read" | "write" | "variable";
62
+ /** The access types a graph follows by default; at least one of them stays on. */
58
63
  export declare const CALL_GRAPH_ACCESS: readonly CallGraphAccess[];
59
64
  export interface CallGraphEdge {
60
65
  /** `from|to|type`. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../src/data/call-graph/types.ts"],"sourcesContent":["// The call graph as uir's `graph.Graph` serialises it (github.com/flanksource/uir/graph, model.go). The\n// field names are its JSON tags, so a host hands a response straight in. Nothing here is specific to a\n// language: what a node kind means and how it is drawn comes from a CallGraphVocabulary.\n\n/** Which side of the root a graph walks. */\nexport type CallGraphDirection = \"callees\" | \"callers\" | \"both\";\n\n/** A call site behind an edge. `guards` are the conditions that must hold to reach it, outermost first. */\nexport interface CallGraphSite {\n path?: string;\n line?: number;\n column?: number;\n /** The call as written. */\n text?: string;\n guards?: string[];\n}\n\n/** uir.Identifier: where a node sits in a module, package, type and method. */\nexport interface CallGraphIdentifier {\n id?: string;\n module?: string;\n package?: string;\n type?: string;\n method?: string;\n field?: string;\n signature?: string;\n node_type?: string;\n}\n\n/** Where a node is declared, in the terms an index addresses it by. */\nexport interface CallGraphLocation {\n root_key?: string;\n checkout_path?: string;\n snapshot_id?: string;\n source_id?: string;\n path?: string;\n identity_key?: string;\n line?: number;\n column?: number;\n}\n\nexport interface CallGraphNode {\n id: string;\n identifier: CallGraphIdentifier;\n kind: string;\n label: string;\n /** A `CallGraphGroup` id. */\n group?: string;\n /** 0 for a root, negative for its callers and positive for its callees. */\n depth: number;\n /** Incoming edges: a total on the side the walk asked about, else the edges drawn. */\n in: number;\n /** Outgoing edges: a total on the side the walk asked about, else the edges drawn. */\n out: number;\n /** A target the source could not place; drawn as a leaf. */\n unresolved?: boolean;\n location?: CallGraphLocation;\n tone?: string;\n icon?: string;\n properties?: Record<string, string>;\n}\n\n/** A call, a call one of several targets is chosen for at run time, or a read or write of data. */\nexport type CallGraphEdgeType = \"call\" | \"dispatch\" | \"read\" | \"write\";\n\n/** What `fetchGraph` asks the graph to follow: `call` covers dispatch too. */\nexport type CallGraphAccess = \"call\" | \"read\" | \"write\";\n\nexport const CALL_GRAPH_ACCESS: readonly CallGraphAccess[] = [\"call\", \"read\", \"write\"];\n\nexport interface CallGraphEdge {\n /** `from|to|type`. */\n id: string;\n from: string;\n to: string;\n type: CallGraphEdgeType;\n /** The construct behind the edge, such as `copybook`, `attached`, `sql` or `copyto`. */\n kind?: string;\n sites: CallGraphSite[];\n /**\n * Facts about the edge, such as the plans that select a dispatch target, or `columns`/`fields`: the\n * members a read or write of a collapsed table or entity touches, comma separated.\n */\n properties?: Record<string, string>;\n}\n\nexport interface CallGraphGroup {\n id: string;\n label: string;\n parent?: string;\n}\n\n/** What the graph leaves out. */\nexport interface CallGraphOmitted {\n node_limit?: boolean;\n beyond_depth?: number;\n unresolved?: number;\n unreadable_source?: string[];\n /** Distinct nodes the exclusions left out, per group. */\n excluded?: Record<string, number>;\n}\n\nexport interface CallGraph {\n roots: string[];\n nodes: CallGraphNode[];\n edges: CallGraphEdge[];\n groups?: CallGraphGroup[];\n omitted: CallGraphOmitted;\n}\n\n/** What `fetchGraph` is asked for. `exclude` undefined takes the host's defaults; `[]` excludes nothing. */\nexport interface CallGraphFetchParams {\n root: string;\n direction: CallGraphDirection;\n depth: number;\n exclude: string[] | undefined;\n /** The edge types to follow, never empty. Filtered by the host, so the `+N` counts agree. */\n access: CallGraphAccess[];\n /** Columns and fields as nodes of their own, rather than collapsed into their table or entity. */\n columns: boolean;\n /** `load` draws the graph around `root`; `expand` loads one more hop around a drawn node, to merge in. */\n purpose: \"load\" | \"expand\";\n signal: AbortSignal;\n}\n\n/** A group the graph reached, drawn or excluded; `nodes` counts both. */\nexport interface CallGraphGroupFact {\n name: string;\n /** Shown instead of `name`. */\n label?: string;\n /** Outside the indexed scope: \"Hide all external\" covers it. */\n external?: boolean;\n nodes: number;\n excluded: boolean;\n}\n\nexport interface CallGraphSelection {\n kind: \"node\" | \"edge\";\n id: string;\n}\n\n/** The guards fetched for a selected edge whose response came without them. */\nexport type SiteGuardsState = { status: \"loading\" } | { status: \"loaded\"; sites: CallGraphSite[] } | { status: \"failed\"; error: string };\n\n/** The words an edge's type is drawn with: its pill's accessible name, its tooltip and its legend entry. */\nexport type CallGraphEdgeLabels = Record<CallGraphEdgeType, string>;\n"],"names":[],"mappings":"AAoEO,MAAM,oBAAgD,CAAC,QAAQ,QAAQ,OAAO;"}
1
+ {"version":3,"file":"types.js","sources":["../../../src/data/call-graph/types.ts"],"sourcesContent":["// The call graph as uir's `graph.Graph` serialises it (github.com/flanksource/uir/graph, model.go). The\n// field names are its JSON tags, so a host hands a response straight in. Nothing here is specific to a\n// language: what a node kind means and how it is drawn comes from a CallGraphVocabulary.\n\n/** Which side of the root a graph walks. */\nexport type CallGraphDirection = \"callees\" | \"callers\" | \"both\";\n\n/** A call site behind an edge. `guards` are the conditions that must hold to reach it, outermost first. */\nexport interface CallGraphSite {\n path?: string;\n line?: number;\n column?: number;\n /** The call as written. */\n text?: string;\n guards?: string[];\n}\n\n/** uir.Identifier: where a node sits in a module, package, type and method. */\nexport interface CallGraphIdentifier {\n id?: string;\n module?: string;\n package?: string;\n type?: string;\n method?: string;\n field?: string;\n signature?: string;\n node_type?: string;\n}\n\n/** Where a node is declared, in the terms an index addresses it by. */\nexport interface CallGraphLocation {\n root_key?: string;\n checkout_path?: string;\n snapshot_id?: string;\n source_id?: string;\n path?: string;\n identity_key?: string;\n line?: number;\n column?: number;\n}\n\nexport interface CallGraphNode {\n id: string;\n identifier: CallGraphIdentifier;\n kind: string;\n label: string;\n /** A `CallGraphGroup` id. */\n group?: string;\n /** 0 for a root, negative for its callers and positive for its callees. */\n depth: number;\n /** Incoming edges: a total on the side the walk asked about, else the edges drawn. */\n in: number;\n /** Outgoing edges: a total on the side the walk asked about, else the edges drawn. */\n out: number;\n /** A target the source could not place; drawn as a leaf. */\n unresolved?: boolean;\n location?: CallGraphLocation;\n tone?: string;\n icon?: string;\n properties?: Record<string, string>;\n}\n\n/** A call, a call one of several targets is chosen for at run time, or a read or write of data. */\nexport type CallGraphEdgeType = \"call\" | \"dispatch\" | \"read\" | \"write\";\n\n/**\n * What `fetchGraph` asks the graph to follow: `call` covers dispatch too.\n * `variable` follows the variables a body reads and writes, on top of the\n * others, for a host that offers it (`variableAccess`).\n */\nexport type CallGraphAccess = \"call\" | \"read\" | \"write\" | \"variable\";\n\n/** The access types a graph follows by default; at least one of them stays on. */\nexport const CALL_GRAPH_ACCESS: readonly CallGraphAccess[] = [\"call\", \"read\", \"write\"];\n\nexport interface CallGraphEdge {\n /** `from|to|type`. */\n id: string;\n from: string;\n to: string;\n type: CallGraphEdgeType;\n /** The construct behind the edge, such as `copybook`, `attached`, `sql` or `copyto`. */\n kind?: string;\n sites: CallGraphSite[];\n /**\n * Facts about the edge, such as the plans that select a dispatch target, or `columns`/`fields`: the\n * members a read or write of a collapsed table or entity touches, comma separated.\n */\n properties?: Record<string, string>;\n}\n\nexport interface CallGraphGroup {\n id: string;\n label: string;\n parent?: string;\n}\n\n/** What the graph leaves out. */\nexport interface CallGraphOmitted {\n node_limit?: boolean;\n beyond_depth?: number;\n unresolved?: number;\n unreadable_source?: string[];\n /** Distinct nodes the exclusions left out, per group. */\n excluded?: Record<string, number>;\n}\n\nexport interface CallGraph {\n roots: string[];\n nodes: CallGraphNode[];\n edges: CallGraphEdge[];\n groups?: CallGraphGroup[];\n omitted: CallGraphOmitted;\n}\n\n/** What `fetchGraph` is asked for. `exclude` undefined takes the host's defaults; `[]` excludes nothing. */\nexport interface CallGraphFetchParams {\n root: string;\n direction: CallGraphDirection;\n depth: number;\n exclude: string[] | undefined;\n /** The edge types to follow, never empty. Filtered by the host, so the `+N` counts agree. */\n access: CallGraphAccess[];\n /** Columns and fields as nodes of their own, rather than collapsed into their table or entity. */\n columns: boolean;\n /** `load` draws the graph around `root`; `expand` loads one more hop around a drawn node, to merge in. */\n purpose: \"load\" | \"expand\";\n signal: AbortSignal;\n}\n\n/** A group the graph reached, drawn or excluded; `nodes` counts both. */\nexport interface CallGraphGroupFact {\n name: string;\n /** Shown instead of `name`. */\n label?: string;\n /** Outside the indexed scope: \"Hide all external\" covers it. */\n external?: boolean;\n nodes: number;\n excluded: boolean;\n}\n\nexport interface CallGraphSelection {\n kind: \"node\" | \"edge\";\n id: string;\n}\n\n/** The guards fetched for a selected edge whose response came without them. */\nexport type SiteGuardsState = { status: \"loading\" } | { status: \"loaded\"; sites: CallGraphSite[] } | { status: \"failed\"; error: string };\n\n/** The words an edge's type is drawn with: its pill's accessible name, its tooltip and its legend entry. */\nexport type CallGraphEdgeLabels = Record<CallGraphEdgeType, string>;\n"],"names":[],"mappings":"AAyEO,MAAM,oBAAgD,CAAC,QAAQ,QAAQ,OAAO;"}
@@ -352,7 +352,7 @@ function Chat({
352
352
  ...renderToolResult ? { renderToolResult } : {}
353
353
  }
354
354
  ),
355
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2 p-4 pt-0", children: [
355
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 flex-col gap-2 p-4 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))]", children: [
356
356
  chips && chips.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(Suggestion.Suggestions, { suggestions: chips, onSelect: pickSuggestion }),
357
357
  /* @__PURE__ */ jsxRuntime.jsx(
358
358
  PromptInput.PromptInput,
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n getChatSession,\n postToolApproval,\n type CaptainChatSession,\n} from \"./approval\";\nimport { isForkSeedMessage } from \"./fork-seed\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport {\n usageSnapshotFromMetadata,\n usageSnapshotFromSession,\n} from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\n// Composer seeds are keyed by a monotonic id so re-seeding the same text works.\n// Minted here rather than reusing a caller's `initialPrompt.id` so a host's id\n// space can never collide with one a suggestion pick produced.\nlet _draftId = 0;\nconst nextDraftId = () => ++_draftId;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts offered while the conversation is still empty. */\n suggestions?: Suggestion[];\n /** Prompts proposed for this particular open — e.g. the opener a host's \"Ask\n * AI\" button rendered for the thing being asked about. Shown in place of\n * `suggestions`, and unlike them they stay offered once the conversation has\n * started, because a host may propose them into a chat that is already\n * running. Cleared through `onProposedPromptsConsumed`. */\n proposedPrompts?: Suggestion[] | null;\n /** Called once the proposed prompts have been acted on — one was picked, or\n * the user sent a message of their own. */\n onProposedPromptsConsumed?: () => void;\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Prevents changing model/backend for an existing Captain session. Effort\n * and other per-turn generation settings remain editable. */\n runtimeLocked?: boolean;\n /** Reports the number of real (non-fork-seed) persisted/UI messages. */\n onMessageCountChange?: (count: number) => void;\n /** Reports the authoritative Captain session after detail hydration. */\n onSessionHydrated?: (session: CaptainChatSession) => void;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to prefill the composer with once. It is never submitted on the\n * user's behalf — they read it, edit it if they want, and press send. A new\n * `id` re-seeds even when the text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been placed in the composer. */\n onInitialPromptConsumed?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n proposedPrompts,\n onProposedPromptsConsumed,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n runtimeLocked = false,\n onMessageCountChange,\n onSessionHydrated,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptConsumed,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const [approvalsInFlight, setApprovalsInFlight] = useState(\n () => new Map<string | undefined, number>(),\n );\n const lastDefaultModel = useRef(defaultModel);\n const [draft, setDraft] = useState<{ id: number; text: string } | null>(null);\n const seededInitialPromptId = useRef<number | null>(null);\n const hadProposals = useRef(false);\n if (proposedPrompts?.length) hadProposals.current = true;\n const activeThreadRef = useRef(threadId);\n const onMessageCountChangeRef = useRef(onMessageCountChange);\n const onSessionHydratedRef = useRef(onSessionHydrated);\n activeThreadRef.current = threadId;\n onMessageCountChangeRef.current = onMessageCountChange;\n onSessionHydratedRef.current = onSessionHydrated;\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n const hydratedUsageRef = useRef<ChatUsageSummary | null>(null);\n const hydratedAssistantRef = useRef<ChatUIMessage | undefined>(undefined);\n\n const applySession = useCallback((session: CaptainChatSession) => {\n const snapshot = usageSnapshotFromSession(session);\n hydratedUsageRef.current = snapshot;\n hydratedAssistantRef.current = [...session.messages].reverse().find((message) => message.role === \"assistant\") as ChatUIMessage | undefined;\n setUsage(snapshot);\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n }, []);\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setApprovalError(undefined);\n hydratedUsageRef.current = null;\n hydratedAssistantRef.current = undefined;\n setUsage(null);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n applySession(session);\n onSessionHydratedRef.current?.(session);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [applySession, sessionsApi, threadId]);\n\n useEffect(() => {\n onMessageCountChangeRef.current?.(\n messages.filter((message) => !isForkSeedMessage(message)).length,\n );\n }, [messages]);\n\n // An initial prompt is a draft, not a turn: it lands in the composer and\n // waits for the user to send it. Unlike a send it needs no live transport and\n // no hydrated session, so it seeds immediately.\n useEffect(() => {\n if (!initialPrompt) return;\n if (seededInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n seededInitialPromptId.current = initialPrompt.id;\n setDraft({ id: nextDraftId(), text });\n onInitialPromptConsumed?.();\n }, [initialPrompt, onInitialPromptConsumed]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message, preserving provider context independently of billing.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n if (hydratedUsageRef.current && last?.id === hydratedAssistantRef.current?.id && last?.metadata === hydratedAssistantRef.current?.metadata) {\n setUsage(hydratedUsageRef.current);\n onUsageRef.current?.(hydratedUsageRef.current);\n return;\n }\n const meta = last?.metadata;\n if (!meta) {\n setUsage(null);\n return;\n }\n const settledModel = meta.model\n ? selectedChatModel(models, { id: meta.model, model: meta.model })\n : undefined;\n const snapshot = usageSnapshotFromMetadata(meta, {\n modelLabel: settledModel?.label,\n messageCount: messages.length,\n });\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, models, status]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n const currentModelId = selectedModel?.id ?? runtime.id ?? runtime.model ?? \"\";\n const nextModelId = nextModel?.id ?? next.id ?? next.model ?? \"\";\n if (nextModelId !== currentModelId) {\n onModelChange?.(nextModelId);\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n const approvalThreadId = threadId;\n setApprovalError(undefined);\n setApprovalsInFlight((counts) =>\n new Map(counts).set(approvalThreadId, (counts.get(approvalThreadId) ?? 0) + 1),\n );\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: approvalThreadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (activeThreadRef.current !== approvalThreadId) return;\n if (session.id !== approvalThreadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${approvalThreadId ?? \"\"}\".`,\n );\n }\n applySession(session);\n } catch (cause) {\n if (activeThreadRef.current !== approvalThreadId) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n } finally {\n setApprovalsInFlight((counts) => {\n const count = counts.get(approvalThreadId);\n if (count === undefined || count < 1) {\n throw new Error(\"Tool approval completed without a pending request.\");\n }\n const next = new Map(counts);\n if (count === 1) next.delete(approvalThreadId);\n else next.set(approvalThreadId, count - 1);\n return next;\n });\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n locked={runtimeLocked}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && emptyState ? (\n <div className=\"flex flex-col items-center gap-4\">{emptyState}</div>\n ) : undefined;\n\n // Prompts proposed for this open outrank the static suggestions and survive a\n // running conversation — a host can propose into a chat that already has one.\n // The static list is an empty-state affordance and retires once a turn exists;\n // it also never comes back after proposals were consumed, because falling back\n // to the application's generic prompts under a chat opened about one cell\n // reads as an unrelated non-sequitur.\n const chips = proposedPrompts?.length\n ? proposedPrompts\n : messages.length === 0 && !hadProposals.current\n ? suggestions\n : undefined;\n\n const pickSuggestion = (text: string) => {\n setDraft({ id: nextDraftId(), text });\n onProposedPromptsConsumed?.();\n };\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n suppressWaiting={(approvalsInFlight.get(threadId) ?? 0) > 0}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={resolveToolApproval}\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"flex flex-col gap-2 p-4 pt-0\">\n {chips && chips.length > 0 && (\n <Suggestions suggestions={chips} onSelect={pickSuggestion} />\n )}\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n draft={draft}\n toolbar={toolbar}\n onSubmit={(text, files) => {\n onProposedPromptsConsumed?.();\n void sendMessage({ text, files });\n }}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","attachmentUpload","models","useState","resolveChatRuntime","defaultChatModelId","useRef","useMemo","toToolRenderRegistry","useEffect","selectedChatModel","hasStructuredRuntime","createAttachmentUploadAdapter","DefaultChatTransport","useChat","useCallback","usageSnapshotFromSession","getChatSession","isForkSeedMessage","usageSnapshotFromMetadata","postToolApproval","jsx","ChatRuntimeToolbar","ToolRenderRegistryProvider","jsxs","cn","Conversation","Suggestions","PromptInput"],"mappings":"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"}
1
+ {"version":3,"file":"Chat.cjs","sources":["../../../src/data/chat/Chat.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport, type ChatTransport, type UIMessage } from \"ai\";\nimport { cn } from \"../../lib/utils\";\nimport { Conversation } from \"./Conversation\";\nimport { PromptInput } from \"./PromptInput\";\nimport { Suggestions } from \"./Suggestion\";\nimport { DEFAULT_REASONING_EFFORTS } from \"./effort-icons\";\nimport { defaultChatModelId } from \"./models\";\nimport {\n getChatSession,\n postToolApproval,\n type CaptainChatSession,\n} from \"./approval\";\nimport { isForkSeedMessage } from \"./fork-seed\";\nimport {\n hasStructuredRuntime,\n resolveChatRuntime,\n selectedChatModel,\n} from \"./Chat.runtime\";\nimport {\n createAttachmentUploadAdapter,\n type AttachmentLimits,\n type AttachmentUploadAdapter,\n} from \"./attachment-upload\";\nimport { toToolRenderRegistry } from \"./tool-render/registry\";\nimport { ToolRenderRegistryProvider } from \"./tool-render/context\";\nimport { ChatRuntimeToolbar } from \"./ChatRuntimeToolbar\";\nimport type { SpecRuntimeFamily } from \"../runtime/runtime-mode\";\nimport type {\n ToolRenderAdapter,\n ToolRenderRegistry,\n} from \"./tool-render/adapter\";\nimport type {\n ChatBudgetConfig,\n ChatModel,\n ChatMessageMetadata,\n ChatModelRuntime,\n ChatUsageSummary,\n ClaudePermissionMode,\n Suggestion,\n ToolMeta,\n ToolResultRenderer,\n} from \"./types\";\nimport {\n usageSnapshotFromMetadata,\n usageSnapshotFromSession,\n} from \"./usage-snapshot\";\n\n/** Assistant messages carry token usage + cost the backend rode on the finish\n * part's `messageMetadata`. */\ntype ChatUIMessage = UIMessage<ChatMessageMetadata>;\n\n// Composer seeds are keyed by a monotonic id so re-seeding the same text works.\n// Minted here rather than reusing a caller's `initialPrompt.id` so a host's id\n// space can never collide with one a suggestion pick produced.\nlet _draftId = 0;\nconst nextDraftId = () => ++_draftId;\n\nexport type ChatProps = {\n /** Endpoint that speaks the AI SDK v6 UI Message Stream protocol.\n * Ignored when `transport` is supplied. Defaults to \"/api/chat\". */\n api?: string;\n /** Model menu. When omitted and `modelsApi` is set, it is fetched. */\n models?: ChatModel[];\n /** Endpoint returning the model menu (ModelInfo[]). Defaults to\n * \"/api/chat/models\". Set to null to disable fetching. */\n modelsApi?: string | null;\n /** Initially selected model id; otherwise the first configured model. */\n defaultModel?: string;\n /** Controlled selected model id. */\n model?: string;\n /** Initially selected structured runtime. */\n defaultRuntime?: ChatModelRuntime;\n /** Controlled structured runtime. */\n runtime?: ChatModelRuntime;\n /** Runtime families and their host availability. */\n runtimeFamilies?: SpecRuntimeFamily[];\n /** Reasoning-effort options for capable models. */\n reasoningEfforts?: string[];\n /** Initially selected reasoning effort (\"\" = none). */\n defaultReasoningEffort?: string;\n /** Controlled selected reasoning effort (\"\" = none). */\n reasoningEffort?: string;\n /** Sampling temperature forwarded to the backend when set. */\n temperature?: number;\n /** Per-request budget forwarded to the backend when set. */\n budget?: ChatBudgetConfig;\n /** Claude Agent SDK permission mode forwarded to the backend when set. */\n permissionMode?: ClaudePermissionMode;\n /** Notified when the user changes the model. */\n onModelChange?: (id: string) => void;\n /** Notified when the user changes any runtime field. */\n onRuntimeChange?: (runtime: ChatModelRuntime) => void;\n /** Notified when the user changes reasoning effort. */\n onReasoningEffortChange?: (effort: string) => void;\n /** Notified when the user changes Claude permission mode. */\n onPermissionModeChange?: (mode: ClaudePermissionMode) => void;\n /** Notified after each assistant turn with a usage snapshot (tokens used out\n * of the model's context window + cumulative cost), for a usage gauge. */\n onUsage?: (usage: ChatUsageSummary) => void;\n /** Suggested prompts offered while the conversation is still empty. */\n suggestions?: Suggestion[];\n /** Prompts proposed for this particular open — e.g. the opener a host's \"Ask\n * AI\" button rendered for the thing being asked about. Shown in place of\n * `suggestions`, and unlike them they stay offered once the conversation has\n * started, because a host may propose them into a chat that is already\n * running. Cleared through `onProposedPromptsConsumed`. */\n proposedPrompts?: Suggestion[] | null;\n /** Called once the proposed prompts have been acted on — one was picked, or\n * the user sent a message of their own. */\n onProposedPromptsConsumed?: () => void;\n /** Enables file/image attachments. */\n enableAttachments?: boolean;\n /** Upload endpoint used before an attachment is added to a chat message. */\n attachmentsApi?: string;\n /** Custom durable upload adapter; overrides attachmentsApi. */\n attachmentUpload?: AttachmentUploadAdapter;\n attachmentLimits?: AttachmentLimits;\n /** Captain thread id used as the AI SDK chat id and forwarded in the body. */\n threadId?: string;\n /** Canonical Captain session endpoint used to hydrate messages and resolve\n * approvals. The session and approval ids are appended to this URL. */\n sessionsApi?: string | null;\n /** Prevents changing model/backend for an existing Captain session. Effort\n * and other per-turn generation settings remain editable. */\n runtimeLocked?: boolean;\n /** Reports the number of real (non-fork-seed) persisted/UI messages. */\n onMessageCountChange?: (count: number) => void;\n /** Reports the authoritative Captain session after detail hydration. */\n onSessionHydrated?: (session: CaptainChatSession) => void;\n /** Optional host renderer for recognized completed tool outputs. Takes\n * priority over `toolRenderers` on the output surface. */\n renderToolResult?: ToolResultRenderer;\n /** Tool catalog, used to resolve each call's input/output JSON Schema so\n * params and results render with real labels instead of raw JSON. */\n tools?: ToolMeta[];\n /** Domain tool renderers. Host adapters are matched before the built-in\n * heuristics, which stay as the floor. */\n toolRenderers?: ToolRenderAdapter[] | ToolRenderRegistry;\n /** Extra fields merged into every request body. */\n body?: Record<string, unknown>;\n /** Pre-built transport (e.g. a mock for stories/tests). */\n transport?: ChatTransport<UIMessage>;\n /** Initial messages to seed the conversation. */\n initialMessages?: UIMessage[];\n /** Prompt to prefill the composer with once. It is never submitted on the\n * user's behalf — they read it, edit it if they want, and press send. A new\n * `id` re-seeds even when the text repeats. */\n initialPrompt?: { id: number; text: string } | null;\n /** Called after `initialPrompt` has been placed in the composer. */\n onInitialPromptConsumed?: () => void;\n placeholder?: string;\n emptyState?: React.ReactNode;\n className?: string;\n};\n\n/** Self-contained AI chat over a v6-compatible `/api/chat`: a streaming\n * conversation with model/effort selectors, suggestions, attachments,\n * per-message copy/regenerate, and human-in-the-loop tool approvals. The\n * backend owns model selection and tool execution; the selected model,\n * effort, permission mode and thread id are forwarded in the request body. */\nexport function Chat({\n api = \"/api/chat\",\n models: modelsProp,\n modelsApi = \"/api/chat/models\",\n defaultModel,\n model: controlledModel,\n defaultRuntime,\n runtime: controlledRuntime,\n runtimeFamilies,\n reasoningEfforts = DEFAULT_REASONING_EFFORTS,\n defaultReasoningEffort,\n reasoningEffort: controlledEffort,\n temperature,\n budget,\n permissionMode,\n onModelChange,\n onRuntimeChange,\n onReasoningEffortChange,\n onUsage,\n suggestions,\n proposedPrompts,\n onProposedPromptsConsumed,\n enableAttachments = false,\n attachmentsApi = \"/api/attachments\",\n attachmentUpload,\n attachmentLimits,\n threadId,\n sessionsApi = null,\n runtimeLocked = false,\n onMessageCountChange,\n onSessionHydrated,\n renderToolResult,\n tools,\n toolRenderers,\n body,\n transport,\n initialMessages,\n initialPrompt,\n onInitialPromptConsumed,\n placeholder,\n emptyState,\n className,\n}: ChatProps) {\n const [models, setModels] = useState<ChatModel[]>(modelsProp ?? []);\n const [internalRuntime, setInternalRuntime] = useState<ChatModelRuntime>(\n () =>\n controlledRuntime ??\n resolveChatRuntime({\n models: modelsProp ?? [],\n current: defaultRuntime,\n preferredModel:\n controlledModel ??\n (defaultRuntime\n ? undefined\n : (defaultModel ?? defaultChatModelId(modelsProp ?? []))),\n effort: controlledEffort ?? defaultReasoningEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n const [usage, setUsage] = useState<ChatUsageSummary | null>(null);\n const [approvalError, setApprovalError] = useState<Error | undefined>();\n const [approvalsInFlight, setApprovalsInFlight] = useState(\n () => new Map<string | undefined, number>(),\n );\n const lastDefaultModel = useRef(defaultModel);\n const [draft, setDraft] = useState<{ id: number; text: string } | null>(null);\n const seededInitialPromptId = useRef<number | null>(null);\n const hadProposals = useRef(false);\n if (proposedPrompts?.length) hadProposals.current = true;\n const activeThreadRef = useRef(threadId);\n const onMessageCountChangeRef = useRef(onMessageCountChange);\n const onSessionHydratedRef = useRef(onSessionHydrated);\n activeThreadRef.current = threadId;\n onMessageCountChangeRef.current = onMessageCountChange;\n onSessionHydratedRef.current = onSessionHydrated;\n const runtime = controlledRuntime ?? internalRuntime;\n\n // Provided once here; <ToolCall> reads it from context, so no tool-render\n // props thread through Conversation/Message.\n const toolRegistry = useMemo(\n () => toToolRenderRegistry(toolRenderers, tools ? { tools } : {}),\n [toolRenderers, tools],\n );\n\n useEffect(() => {\n if (!modelsProp) return;\n setModels(modelsProp);\n }, [modelsProp]);\n\n // Fetch the model menu unless one was supplied or fetching is disabled.\n useEffect(() => {\n if (modelsProp || !modelsApi) return;\n let cancelled = false;\n fetch(modelsApi)\n .then((r) =>\n r.ok ? r.json() : Promise.reject(new Error(`models ${r.status}`)),\n )\n .then((data: ChatModel[]) => {\n if (cancelled) return;\n setModels(data);\n })\n .catch((err) =>\n console.warn(\"clicky-ui: failed to load chat models\", err),\n );\n return () => {\n cancelled = true;\n };\n }, [modelsProp, modelsApi]);\n\n useEffect(() => {\n if (controlledRuntime !== undefined) return;\n const defaultChanged =\n Boolean(defaultModel) && defaultModel !== lastDefaultModel.current;\n lastDefaultModel.current = defaultModel;\n setInternalRuntime((current) =>\n resolveChatRuntime({\n models,\n current,\n preferredModel:\n controlledModel ??\n (defaultChanged\n ? defaultModel\n : (selectedChatModel(models, current)?.id ??\n defaultModel ??\n defaultChatModelId(models))),\n effort: controlledEffort,\n temperature,\n reasoningEfforts,\n }),\n );\n }, [\n controlledEffort,\n controlledModel,\n controlledRuntime,\n defaultModel,\n models,\n reasoningEfforts,\n temperature,\n ]);\n\n const selectedModel = selectedChatModel(models, runtime);\n const structuredRuntime = hasStructuredRuntime(runtime, selectedModel);\n const resolvedAttachmentUpload = useMemo(\n () =>\n attachmentUpload ??\n createAttachmentUploadAdapter({ endpoint: attachmentsApi }),\n [attachmentUpload, attachmentsApi],\n );\n\n // A function body keeps the transport stable while always sending the latest\n // model/effort/runtime selections.\n const bodyRef = useRef<Record<string, unknown>>({});\n bodyRef.current = {\n ...body,\n ...(structuredRuntime\n ? { runtime }\n : {\n ...(runtime.model ? { model: runtime.model } : {}),\n ...(runtime.effort ? { reasoningEffort: runtime.effort } : {}),\n ...(runtime.temperature !== undefined\n ? { temperature: runtime.temperature }\n : {}),\n }),\n ...(budget && (budget.cost !== undefined || budget.maxTokens !== undefined)\n ? { budget }\n : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(threadId ? { threadId } : {}),\n };\n\n const resolvedTransport = useMemo<ChatTransport<UIMessage>>(\n () =>\n transport ??\n new DefaultChatTransport({ api, body: () => bodyRef.current }),\n [transport, api],\n );\n\n const {\n messages,\n setMessages,\n sendMessage,\n regenerate,\n status,\n error,\n clearError,\n stop,\n } = useChat<ChatUIMessage>({\n transport: resolvedTransport,\n ...(threadId ? { id: threadId } : {}),\n ...(initialMessages\n ? { messages: initialMessages as ChatUIMessage[] }\n : {}),\n });\n const setMessagesRef = useRef(setMessages);\n setMessagesRef.current = setMessages;\n const hydratedUsageRef = useRef<ChatUsageSummary | null>(null);\n const hydratedAssistantRef = useRef<ChatUIMessage | undefined>(undefined);\n\n const applySession = useCallback((session: CaptainChatSession) => {\n const snapshot = usageSnapshotFromSession(session);\n hydratedUsageRef.current = snapshot;\n hydratedAssistantRef.current = [...session.messages].reverse().find((message) => message.role === \"assistant\") as ChatUIMessage | undefined;\n setUsage(snapshot);\n setMessagesRef.current(session.messages as ChatUIMessage[]);\n }, []);\n\n useEffect(() => {\n if (!sessionsApi || !threadId) return;\n let cancelled = false;\n setApprovalError(undefined);\n hydratedUsageRef.current = null;\n hydratedAssistantRef.current = undefined;\n setUsage(null);\n setMessagesRef.current([]);\n void getChatSession(sessionsApi, threadId)\n .then((session) => {\n if (cancelled) return;\n if (session.id !== threadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match requested session \"${threadId}\".`,\n );\n }\n applySession(session);\n onSessionHydratedRef.current?.(session);\n })\n .catch((cause) => {\n if (cancelled) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n });\n return () => {\n cancelled = true;\n };\n }, [applySession, sessionsApi, threadId]);\n\n useEffect(() => {\n onMessageCountChangeRef.current?.(\n messages.filter((message) => !isForkSeedMessage(message)).length,\n );\n }, [messages]);\n\n // An initial prompt is a draft, not a turn: it lands in the composer and\n // waits for the user to send it. Unlike a send it needs no live transport and\n // no hydrated session, so it seeds immediately.\n useEffect(() => {\n if (!initialPrompt) return;\n if (seededInitialPromptId.current === initialPrompt.id) return;\n const text = initialPrompt.text.trim();\n if (!text) return;\n seededInitialPromptId.current = initialPrompt.id;\n setDraft({ id: nextDraftId(), text });\n onInitialPromptConsumed?.();\n }, [initialPrompt, onInitialPromptConsumed]);\n\n // Surface a usage snapshot after each settled assistant turn. The backend\n // rides usage/cost on the finish part's messageMetadata; we read it off the\n // last assistant message, preserving provider context independently of billing.\n const onUsageRef = useRef(onUsage);\n onUsageRef.current = onUsage;\n useEffect(() => {\n if (status !== \"ready\") return;\n const last = [...messages].reverse().find((m) => m.role === \"assistant\");\n if (hydratedUsageRef.current && last?.id === hydratedAssistantRef.current?.id && last?.metadata === hydratedAssistantRef.current?.metadata) {\n setUsage(hydratedUsageRef.current);\n onUsageRef.current?.(hydratedUsageRef.current);\n return;\n }\n const meta = last?.metadata;\n if (!meta) {\n setUsage(null);\n return;\n }\n const settledModel = meta.model\n ? selectedChatModel(models, { id: meta.model, model: meta.model })\n : undefined;\n const snapshot = usageSnapshotFromMetadata(meta, {\n modelLabel: settledModel?.label,\n messageCount: messages.length,\n });\n setUsage(snapshot);\n onUsageRef.current?.(snapshot);\n }, [messages, models, status]);\n\n const handleRuntimeChange = (next: ChatModelRuntime) => {\n if (controlledRuntime === undefined) setInternalRuntime(next);\n onRuntimeChange?.(next);\n const nextModel = selectedChatModel(models, next);\n const currentModelId = selectedModel?.id ?? runtime.id ?? runtime.model ?? \"\";\n const nextModelId = nextModel?.id ?? next.id ?? next.model ?? \"\";\n if (nextModelId !== currentModelId) {\n onModelChange?.(nextModelId);\n }\n if ((next.effort ?? \"\") !== (runtime.effort ?? \"\")) {\n onReasoningEffortChange?.(next.effort ?? \"\");\n }\n };\n\n const resolveToolApproval = async (\n id: string,\n approved: boolean,\n reason?: string,\n ) => {\n const approvalThreadId = threadId;\n setApprovalError(undefined);\n setApprovalsInFlight((counts) =>\n new Map(counts).set(approvalThreadId, (counts.get(approvalThreadId) ?? 0) + 1),\n );\n try {\n if (!sessionsApi) {\n throw new Error(\n \"A Captain sessions API is required to resolve tool approvals.\",\n );\n }\n const session = await postToolApproval({\n sessionsApi,\n sessionId: approvalThreadId ?? \"\",\n approvalId: id,\n approved,\n ...(reason ? { reason } : {}),\n });\n if (activeThreadRef.current !== approvalThreadId) return;\n if (session.id !== approvalThreadId) {\n throw new Error(\n `Captain chat session response ID \"${session.id}\" does not match active session \"${approvalThreadId ?? \"\"}\".`,\n );\n }\n applySession(session);\n } catch (cause) {\n if (activeThreadRef.current !== approvalThreadId) return;\n setApprovalError(\n cause instanceof Error ? cause : new Error(String(cause)),\n );\n } finally {\n setApprovalsInFlight((counts) => {\n const count = counts.get(approvalThreadId);\n if (count === undefined || count < 1) {\n throw new Error(\"Tool approval completed without a pending request.\");\n }\n const next = new Map(counts);\n if (count === 1) next.delete(approvalThreadId);\n else next.set(approvalThreadId, count - 1);\n return next;\n });\n }\n };\n\n const toolbar = (\n <ChatRuntimeToolbar\n models={models}\n runtime={runtime}\n runtimeFamilies={runtimeFamilies}\n reasoningEfforts={reasoningEfforts}\n selectedModel={selectedModel}\n usage={usage}\n threadId={threadId}\n locked={runtimeLocked}\n onRuntimeChange={handleRuntimeChange}\n />\n );\n\n const empty =\n messages.length === 0 && emptyState ? (\n <div className=\"flex flex-col items-center gap-4\">{emptyState}</div>\n ) : undefined;\n\n // Prompts proposed for this open outrank the static suggestions and survive a\n // running conversation — a host can propose into a chat that already has one.\n // The static list is an empty-state affordance and retires once a turn exists;\n // it also never comes back after proposals were consumed, because falling back\n // to the application's generic prompts under a chat opened about one cell\n // reads as an unrelated non-sequitur.\n const chips = proposedPrompts?.length\n ? proposedPrompts\n : messages.length === 0 && !hadProposals.current\n ? suggestions\n : undefined;\n\n const pickSuggestion = (text: string) => {\n setDraft({ id: nextDraftId(), text });\n onProposedPromptsConsumed?.();\n };\n\n return (\n <ToolRenderRegistryProvider value={toolRegistry}>\n <div className={cn(\"flex h-full flex-col\", className)}>\n <Conversation\n messages={messages}\n status={status}\n error={approvalError ?? error}\n onClearError={() => {\n setApprovalError(undefined);\n clearError();\n }}\n {...(threadId ? { sessionId: threadId } : {})}\n {...(selectedModel?.id\n ? { model: selectedModel.id }\n : runtime.model\n ? { model: runtime.model }\n : {})}\n suppressWaiting={(approvalsInFlight.get(threadId) ?? 0) > 0}\n emptyState={empty}\n onRegenerate={(messageId) => void regenerate({ messageId })}\n onApprove={resolveToolApproval}\n {...(renderToolResult ? { renderToolResult } : {})}\n />\n <div className=\"flex shrink-0 flex-col gap-2 p-4 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))]\">\n {chips && chips.length > 0 && (\n <Suggestions suggestions={chips} onSelect={pickSuggestion} />\n )}\n <PromptInput\n status={status}\n onStop={() => void stop()}\n placeholder={placeholder}\n enableAttachments={enableAttachments}\n attachmentUpload={resolvedAttachmentUpload}\n {...(selectedModel?.inputMediaTypes\n ? { acceptedMediaTypes: selectedModel.inputMediaTypes }\n : {})}\n {...(attachmentLimits ? { attachmentLimits } : {})}\n draft={draft}\n toolbar={toolbar}\n onSubmit={(text, files) => {\n onProposedPromptsConsumed?.();\n void sendMessage({ text, files });\n }}\n />\n </div>\n </div>\n </ToolRenderRegistryProvider>\n );\n}\n"],"names":["DEFAULT_REASONING_EFFORTS","attachmentUpload","models","useState","resolveChatRuntime","defaultChatModelId","useRef","useMemo","toToolRenderRegistry","useEffect","selectedChatModel","hasStructuredRuntime","createAttachmentUploadAdapter","DefaultChatTransport","useChat","useCallback","usageSnapshotFromSession","getChatSession","isForkSeedMessage","usageSnapshotFromMetadata","postToolApproval","jsx","ChatRuntimeToolbar","ToolRenderRegistryProvider","jsxs","cn","Conversation","Suggestions","PromptInput"],"mappings":"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"}
@@ -350,7 +350,7 @@ function Chat({
350
350
  ...renderToolResult ? { renderToolResult } : {}
351
351
  }
352
352
  ),
353
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 p-4 pt-0", children: [
353
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 flex-col gap-2 p-4 pt-0 pb-[max(1rem,env(safe-area-inset-bottom))]", children: [
354
354
  chips && chips.length > 0 && /* @__PURE__ */ jsx(Suggestions, { suggestions: chips, onSelect: pickSuggestion }),
355
355
  /* @__PURE__ */ jsx(
356
356
  PromptInput,