@agimon-ai/po-web-dashboard 0.0.0-alpha.0

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 (924) hide show
  1. package/LICENSE +29 -0
  2. package/README.md +10 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/core.cjs +222 -0
  5. package/dist/core.d.mts +21 -0
  6. package/dist/core.mjs +21 -0
  7. package/dist/index.cjs +546 -0
  8. package/dist/index.d.mts +81 -0
  9. package/dist/index.mjs +81 -0
  10. package/dist/testing.cjs +18 -0
  11. package/dist/testing.d.mts +6 -0
  12. package/dist/testing.mjs +6 -0
  13. package/dist/types/auth.cjs +20 -0
  14. package/dist/types/auth.cjs.map +1 -0
  15. package/dist/types/auth.d.mts +160 -0
  16. package/dist/types/auth.d.mts.map +1 -0
  17. package/dist/types/auth.mjs +19 -0
  18. package/dist/types/auth.mjs.map +1 -0
  19. package/dist/types/bridge.d.mts +18 -0
  20. package/dist/types/bridge.d.mts.map +1 -0
  21. package/dist/types/devProxy.cjs +41 -0
  22. package/dist/types/devProxy.cjs.map +1 -0
  23. package/dist/types/devProxy.d.mts +54 -0
  24. package/dist/types/devProxy.d.mts.map +1 -0
  25. package/dist/types/devProxy.mjs +39 -0
  26. package/dist/types/devProxy.mjs.map +1 -0
  27. package/dist/types/hub.cjs +220 -0
  28. package/dist/types/hub.cjs.map +1 -0
  29. package/dist/types/hub.d.mts +447 -0
  30. package/dist/types/hub.d.mts.map +1 -0
  31. package/dist/types/hub.mjs +179 -0
  32. package/dist/types/hub.mjs.map +1 -0
  33. package/dist/types/media.cjs +75 -0
  34. package/dist/types/media.cjs.map +1 -0
  35. package/dist/types/media.d.mts +22 -0
  36. package/dist/types/media.d.mts.map +1 -0
  37. package/dist/types/media.mjs +70 -0
  38. package/dist/types/media.mjs.map +1 -0
  39. package/dist/types/notification.cjs +19 -0
  40. package/dist/types/notification.cjs.map +1 -0
  41. package/dist/types/notification.d.mts +10 -0
  42. package/dist/types/notification.d.mts.map +1 -0
  43. package/dist/types/notification.mjs +19 -0
  44. package/dist/types/notification.mjs.map +1 -0
  45. package/dist/types/remoteAccess.cjs +92 -0
  46. package/dist/types/remoteAccess.cjs.map +1 -0
  47. package/dist/types/remoteAccess.d.mts +214 -0
  48. package/dist/types/remoteAccess.d.mts.map +1 -0
  49. package/dist/types/remoteAccess.mjs +68 -0
  50. package/dist/types/remoteAccess.mjs.map +1 -0
  51. package/dist/types/session.cjs +23 -0
  52. package/dist/types/session.cjs.map +1 -0
  53. package/dist/types/session.d.mts +29 -0
  54. package/dist/types/session.d.mts.map +1 -0
  55. package/dist/types/session.mjs +18 -0
  56. package/dist/types/session.mjs.map +1 -0
  57. package/dist/types/sessionMcp.d.mts +56 -0
  58. package/dist/types/sessionMcp.d.mts.map +1 -0
  59. package/dist/types/settings.cjs +18 -0
  60. package/dist/types/settings.cjs.map +1 -0
  61. package/dist/types/settings.d.mts +126 -0
  62. package/dist/types/settings.d.mts.map +1 -0
  63. package/dist/types/settings.mjs +12 -0
  64. package/dist/types/settings.mjs.map +1 -0
  65. package/dist/types.cjs +101 -0
  66. package/dist/types.d.mts +11 -0
  67. package/dist/types.mjs +9 -0
  68. package/dist/views.cjs +120 -0
  69. package/dist/views.d.mts +56 -0
  70. package/dist/views.mjs +56 -0
  71. package/dist/web/components/MascotMark.cjs +18 -0
  72. package/dist/web/components/MascotMark.cjs.map +1 -0
  73. package/dist/web/components/MascotMark.d.mts +9 -0
  74. package/dist/web/components/MascotMark.d.mts.map +1 -0
  75. package/dist/web/components/MascotMark.mjs +18 -0
  76. package/dist/web/components/MascotMark.mjs.map +1 -0
  77. package/dist/web/components/PluginSurface.cjs +15 -0
  78. package/dist/web/components/PluginSurface.cjs.map +1 -0
  79. package/dist/web/components/PluginSurface.d.mts +13 -0
  80. package/dist/web/components/PluginSurface.d.mts.map +1 -0
  81. package/dist/web/components/PluginSurface.mjs +15 -0
  82. package/dist/web/components/PluginSurface.mjs.map +1 -0
  83. package/dist/web/components/QrCode.cjs +37 -0
  84. package/dist/web/components/QrCode.cjs.map +1 -0
  85. package/dist/web/components/QrCode.d.mts +22 -0
  86. package/dist/web/components/QrCode.d.mts.map +1 -0
  87. package/dist/web/components/QrCode.mjs +37 -0
  88. package/dist/web/components/QrCode.mjs.map +1 -0
  89. package/dist/web/components/Remote.fixture.cjs +73 -0
  90. package/dist/web/components/Remote.fixture.cjs.map +1 -0
  91. package/dist/web/components/Remote.fixture.mjs +72 -0
  92. package/dist/web/components/Remote.fixture.mjs.map +1 -0
  93. package/dist/web/components/SessionMcp.cjs +279 -0
  94. package/dist/web/components/SessionMcp.cjs.map +1 -0
  95. package/dist/web/components/SessionMcp.d.mts +12 -0
  96. package/dist/web/components/SessionMcp.d.mts.map +1 -0
  97. package/dist/web/components/SessionMcp.mjs +278 -0
  98. package/dist/web/components/SessionMcp.mjs.map +1 -0
  99. package/dist/web/components/Story.fixture.cjs +124 -0
  100. package/dist/web/components/Story.fixture.cjs.map +1 -0
  101. package/dist/web/components/Story.fixture.d.mts +19 -0
  102. package/dist/web/components/Story.fixture.d.mts.map +1 -0
  103. package/dist/web/components/Story.fixture.mjs +119 -0
  104. package/dist/web/components/Story.fixture.mjs.map +1 -0
  105. package/dist/web/components/Template.fixture.cjs +67 -0
  106. package/dist/web/components/Template.fixture.cjs.map +1 -0
  107. package/dist/web/components/Template.fixture.d.mts +7 -0
  108. package/dist/web/components/Template.fixture.d.mts.map +1 -0
  109. package/dist/web/components/Template.fixture.mjs +65 -0
  110. package/dist/web/components/Template.fixture.mjs.map +1 -0
  111. package/dist/web/components/ToolRendererBoundary.cjs +23 -0
  112. package/dist/web/components/ToolRendererBoundary.cjs.map +1 -0
  113. package/dist/web/components/ToolRendererBoundary.d.mts +23 -0
  114. package/dist/web/components/ToolRendererBoundary.d.mts.map +1 -0
  115. package/dist/web/components/ToolRendererBoundary.mjs +23 -0
  116. package/dist/web/components/ToolRendererBoundary.mjs.map +1 -0
  117. package/dist/web/features/activity/ActivityDock.cjs +271 -0
  118. package/dist/web/features/activity/ActivityDock.cjs.map +1 -0
  119. package/dist/web/features/activity/ActivityDock.d.mts +22 -0
  120. package/dist/web/features/activity/ActivityDock.d.mts.map +1 -0
  121. package/dist/web/features/activity/ActivityDock.mjs +271 -0
  122. package/dist/web/features/activity/ActivityDock.mjs.map +1 -0
  123. package/dist/web/features/activity/ContextItemDialog.cjs +276 -0
  124. package/dist/web/features/activity/ContextItemDialog.cjs.map +1 -0
  125. package/dist/web/features/activity/ContextItemDialog.d.mts +16 -0
  126. package/dist/web/features/activity/ContextItemDialog.d.mts.map +1 -0
  127. package/dist/web/features/activity/ContextItemDialog.mjs +276 -0
  128. package/dist/web/features/activity/ContextItemDialog.mjs.map +1 -0
  129. package/dist/web/features/activity/ContextPanel.cjs +248 -0
  130. package/dist/web/features/activity/ContextPanel.cjs.map +1 -0
  131. package/dist/web/features/activity/ContextPanel.d.mts +4 -0
  132. package/dist/web/features/activity/ContextPanel.d.mts.map +1 -0
  133. package/dist/web/features/activity/ContextPanel.mjs +248 -0
  134. package/dist/web/features/activity/ContextPanel.mjs.map +1 -0
  135. package/dist/web/features/activity/DockTabs.cjs +47 -0
  136. package/dist/web/features/activity/DockTabs.cjs.map +1 -0
  137. package/dist/web/features/activity/DockTabs.d.mts +9 -0
  138. package/dist/web/features/activity/DockTabs.d.mts.map +1 -0
  139. package/dist/web/features/activity/DockTabs.mjs +47 -0
  140. package/dist/web/features/activity/DockTabs.mjs.map +1 -0
  141. package/dist/web/features/connection/RefusedCard.cjs +76 -0
  142. package/dist/web/features/connection/RefusedCard.cjs.map +1 -0
  143. package/dist/web/features/connection/RefusedCard.d.mts +5 -0
  144. package/dist/web/features/connection/RefusedCard.d.mts.map +1 -0
  145. package/dist/web/features/connection/RefusedCard.mjs +76 -0
  146. package/dist/web/features/connection/RefusedCard.mjs.map +1 -0
  147. package/dist/web/features/dialogs/DialogOverlay.cjs +164 -0
  148. package/dist/web/features/dialogs/DialogOverlay.cjs.map +1 -0
  149. package/dist/web/features/dialogs/DialogOverlay.d.mts +15 -0
  150. package/dist/web/features/dialogs/DialogOverlay.d.mts.map +1 -0
  151. package/dist/web/features/dialogs/DialogOverlay.mjs +164 -0
  152. package/dist/web/features/dialogs/DialogOverlay.mjs.map +1 -0
  153. package/dist/web/features/leader/CommandPalette.cjs +390 -0
  154. package/dist/web/features/leader/CommandPalette.cjs.map +1 -0
  155. package/dist/web/features/leader/CommandPalette.d.mts +14 -0
  156. package/dist/web/features/leader/CommandPalette.d.mts.map +1 -0
  157. package/dist/web/features/leader/CommandPalette.mjs +390 -0
  158. package/dist/web/features/leader/CommandPalette.mjs.map +1 -0
  159. package/dist/web/features/remote/DevProxyTargets.cjs +122 -0
  160. package/dist/web/features/remote/DevProxyTargets.cjs.map +1 -0
  161. package/dist/web/features/remote/DevProxyTargets.d.mts +15 -0
  162. package/dist/web/features/remote/DevProxyTargets.d.mts.map +1 -0
  163. package/dist/web/features/remote/DevProxyTargets.mjs +122 -0
  164. package/dist/web/features/remote/DevProxyTargets.mjs.map +1 -0
  165. package/dist/web/features/remote/HandoverProgress.cjs +28 -0
  166. package/dist/web/features/remote/HandoverProgress.cjs.map +1 -0
  167. package/dist/web/features/remote/HandoverProgress.d.mts +12 -0
  168. package/dist/web/features/remote/HandoverProgress.d.mts.map +1 -0
  169. package/dist/web/features/remote/HandoverProgress.mjs +28 -0
  170. package/dist/web/features/remote/HandoverProgress.mjs.map +1 -0
  171. package/dist/web/features/remote/PairedDeviceList.cjs +37 -0
  172. package/dist/web/features/remote/PairedDeviceList.cjs.map +1 -0
  173. package/dist/web/features/remote/PairedDeviceList.d.mts +5 -0
  174. package/dist/web/features/remote/PairedDeviceList.d.mts.map +1 -0
  175. package/dist/web/features/remote/PairedDeviceList.mjs +37 -0
  176. package/dist/web/features/remote/PairedDeviceList.mjs.map +1 -0
  177. package/dist/web/features/remote/PairingApprovalDialog.cjs +65 -0
  178. package/dist/web/features/remote/PairingApprovalDialog.cjs.map +1 -0
  179. package/dist/web/features/remote/PairingApprovalDialog.d.mts +11 -0
  180. package/dist/web/features/remote/PairingApprovalDialog.d.mts.map +1 -0
  181. package/dist/web/features/remote/PairingApprovalDialog.mjs +65 -0
  182. package/dist/web/features/remote/PairingApprovalDialog.mjs.map +1 -0
  183. package/dist/web/features/remote/RemoteAccessDialog.cjs +83 -0
  184. package/dist/web/features/remote/RemoteAccessDialog.cjs.map +1 -0
  185. package/dist/web/features/remote/RemoteAccessDialog.d.mts +11 -0
  186. package/dist/web/features/remote/RemoteAccessDialog.d.mts.map +1 -0
  187. package/dist/web/features/remote/RemoteAccessDialog.mjs +83 -0
  188. package/dist/web/features/remote/RemoteAccessDialog.mjs.map +1 -0
  189. package/dist/web/features/remote/RemoteAccessOptions.cjs +154 -0
  190. package/dist/web/features/remote/RemoteAccessOptions.cjs.map +1 -0
  191. package/dist/web/features/remote/RemoteAccessOptions.d.mts +11 -0
  192. package/dist/web/features/remote/RemoteAccessOptions.d.mts.map +1 -0
  193. package/dist/web/features/remote/RemoteAccessOptions.mjs +154 -0
  194. package/dist/web/features/remote/RemoteAccessOptions.mjs.map +1 -0
  195. package/dist/web/features/remote/RemoteAccessPairing.cjs +93 -0
  196. package/dist/web/features/remote/RemoteAccessPairing.cjs.map +1 -0
  197. package/dist/web/features/remote/RemoteAccessPairing.d.mts +5 -0
  198. package/dist/web/features/remote/RemoteAccessPairing.d.mts.map +1 -0
  199. package/dist/web/features/remote/RemoteAccessPairing.mjs +93 -0
  200. package/dist/web/features/remote/RemoteAccessPairing.mjs.map +1 -0
  201. package/dist/web/features/remote/SandboxWorkspaces.cjs +87 -0
  202. package/dist/web/features/remote/SandboxWorkspaces.cjs.map +1 -0
  203. package/dist/web/features/remote/SandboxWorkspaces.d.mts +7 -0
  204. package/dist/web/features/remote/SandboxWorkspaces.d.mts.map +1 -0
  205. package/dist/web/features/remote/SandboxWorkspaces.mjs +87 -0
  206. package/dist/web/features/remote/SandboxWorkspaces.mjs.map +1 -0
  207. package/dist/web/features/remote/TrustedDeviceList.cjs +65 -0
  208. package/dist/web/features/remote/TrustedDeviceList.cjs.map +1 -0
  209. package/dist/web/features/remote/TrustedDeviceList.d.mts +13 -0
  210. package/dist/web/features/remote/TrustedDeviceList.d.mts.map +1 -0
  211. package/dist/web/features/remote/TrustedDeviceList.mjs +64 -0
  212. package/dist/web/features/remote/TrustedDeviceList.mjs.map +1 -0
  213. package/dist/web/features/selection/SelectionBar.cjs +401 -0
  214. package/dist/web/features/selection/SelectionBar.cjs.map +1 -0
  215. package/dist/web/features/selection/SelectionBar.d.mts +14 -0
  216. package/dist/web/features/selection/SelectionBar.d.mts.map +1 -0
  217. package/dist/web/features/selection/SelectionBar.mjs +400 -0
  218. package/dist/web/features/selection/SelectionBar.mjs.map +1 -0
  219. package/dist/web/features/session/AgentLockPanel.cjs +31 -0
  220. package/dist/web/features/session/AgentLockPanel.cjs.map +1 -0
  221. package/dist/web/features/session/AgentLockPanel.mjs +31 -0
  222. package/dist/web/features/session/AgentLockPanel.mjs.map +1 -0
  223. package/dist/web/features/session/Composer.cjs +808 -0
  224. package/dist/web/features/session/Composer.cjs.map +1 -0
  225. package/dist/web/features/session/Composer.d.mts +21 -0
  226. package/dist/web/features/session/Composer.d.mts.map +1 -0
  227. package/dist/web/features/session/Composer.mjs +806 -0
  228. package/dist/web/features/session/Composer.mjs.map +1 -0
  229. package/dist/web/features/session/ComposerPrompt.cjs +47 -0
  230. package/dist/web/features/session/ComposerPrompt.cjs.map +1 -0
  231. package/dist/web/features/session/ComposerPrompt.d.mts +16 -0
  232. package/dist/web/features/session/ComposerPrompt.d.mts.map +1 -0
  233. package/dist/web/features/session/ComposerPrompt.mjs +47 -0
  234. package/dist/web/features/session/ComposerPrompt.mjs.map +1 -0
  235. package/dist/web/features/session/DormantPanel.cjs +61 -0
  236. package/dist/web/features/session/DormantPanel.cjs.map +1 -0
  237. package/dist/web/features/session/DormantPanel.d.mts +8 -0
  238. package/dist/web/features/session/DormantPanel.d.mts.map +1 -0
  239. package/dist/web/features/session/DormantPanel.mjs +61 -0
  240. package/dist/web/features/session/DormantPanel.mjs.map +1 -0
  241. package/dist/web/features/session/MentionPreviews.cjs +128 -0
  242. package/dist/web/features/session/MentionPreviews.cjs.map +1 -0
  243. package/dist/web/features/session/MentionPreviews.d.mts +17 -0
  244. package/dist/web/features/session/MentionPreviews.d.mts.map +1 -0
  245. package/dist/web/features/session/MentionPreviews.mjs +127 -0
  246. package/dist/web/features/session/MentionPreviews.mjs.map +1 -0
  247. package/dist/web/features/session/MessageMarkdown.cjs +20 -0
  248. package/dist/web/features/session/MessageMarkdown.cjs.map +1 -0
  249. package/dist/web/features/session/MessageMarkdown.d.mts +19 -0
  250. package/dist/web/features/session/MessageMarkdown.d.mts.map +1 -0
  251. package/dist/web/features/session/MessageMarkdown.mjs +20 -0
  252. package/dist/web/features/session/MessageMarkdown.mjs.map +1 -0
  253. package/dist/web/features/session/QueueSheet.cjs +189 -0
  254. package/dist/web/features/session/QueueSheet.cjs.map +1 -0
  255. package/dist/web/features/session/QueueSheet.d.mts +16 -0
  256. package/dist/web/features/session/QueueSheet.d.mts.map +1 -0
  257. package/dist/web/features/session/QueueSheet.mjs +189 -0
  258. package/dist/web/features/session/QueueSheet.mjs.map +1 -0
  259. package/dist/web/features/session/SessionActivity.cjs +88 -0
  260. package/dist/web/features/session/SessionActivity.cjs.map +1 -0
  261. package/dist/web/features/session/SessionActivity.d.mts +16 -0
  262. package/dist/web/features/session/SessionActivity.d.mts.map +1 -0
  263. package/dist/web/features/session/SessionActivity.mjs +87 -0
  264. package/dist/web/features/session/SessionActivity.mjs.map +1 -0
  265. package/dist/web/features/session/SessionTranscriptView.cjs +34 -0
  266. package/dist/web/features/session/SessionTranscriptView.cjs.map +1 -0
  267. package/dist/web/features/session/SessionTranscriptView.d.mts +16 -0
  268. package/dist/web/features/session/SessionTranscriptView.d.mts.map +1 -0
  269. package/dist/web/features/session/SessionTranscriptView.mjs +34 -0
  270. package/dist/web/features/session/SessionTranscriptView.mjs.map +1 -0
  271. package/dist/web/features/session/ThreadView.cjs +40 -0
  272. package/dist/web/features/session/ThreadView.cjs.map +1 -0
  273. package/dist/web/features/session/ThreadView.d.mts +18 -0
  274. package/dist/web/features/session/ThreadView.d.mts.map +1 -0
  275. package/dist/web/features/session/ThreadView.mjs +40 -0
  276. package/dist/web/features/session/ThreadView.mjs.map +1 -0
  277. package/dist/web/features/session/Timeline.cjs +620 -0
  278. package/dist/web/features/session/Timeline.cjs.map +1 -0
  279. package/dist/web/features/session/Timeline.d.mts +28 -0
  280. package/dist/web/features/session/Timeline.d.mts.map +1 -0
  281. package/dist/web/features/session/Timeline.mjs +619 -0
  282. package/dist/web/features/session/Timeline.mjs.map +1 -0
  283. package/dist/web/features/session/ToolCard.cjs +210 -0
  284. package/dist/web/features/session/ToolCard.cjs.map +1 -0
  285. package/dist/web/features/session/ToolCard.d.mts +16 -0
  286. package/dist/web/features/session/ToolCard.d.mts.map +1 -0
  287. package/dist/web/features/session/ToolCard.mjs +210 -0
  288. package/dist/web/features/session/ToolCard.mjs.map +1 -0
  289. package/dist/web/features/session/session.fixture.cjs +76 -0
  290. package/dist/web/features/session/session.fixture.cjs.map +1 -0
  291. package/dist/web/features/session/session.fixture.d.mts +6 -0
  292. package/dist/web/features/session/session.fixture.d.mts.map +1 -0
  293. package/dist/web/features/session/session.fixture.mjs +74 -0
  294. package/dist/web/features/session/session.fixture.mjs.map +1 -0
  295. package/dist/web/features/sessions/NewSessionDialog.cjs +70 -0
  296. package/dist/web/features/sessions/NewSessionDialog.cjs.map +1 -0
  297. package/dist/web/features/sessions/NewSessionDialog.d.mts +9 -0
  298. package/dist/web/features/sessions/NewSessionDialog.d.mts.map +1 -0
  299. package/dist/web/features/sessions/NewSessionDialog.mjs +70 -0
  300. package/dist/web/features/sessions/NewSessionDialog.mjs.map +1 -0
  301. package/dist/web/features/sessions/ResumeSessionDialog.cjs +131 -0
  302. package/dist/web/features/sessions/ResumeSessionDialog.cjs.map +1 -0
  303. package/dist/web/features/sessions/ResumeSessionDialog.d.mts +14 -0
  304. package/dist/web/features/sessions/ResumeSessionDialog.d.mts.map +1 -0
  305. package/dist/web/features/sessions/ResumeSessionDialog.mjs +131 -0
  306. package/dist/web/features/sessions/ResumeSessionDialog.mjs.map +1 -0
  307. package/dist/web/features/sessions/SessionRailDialogs.cjs +62 -0
  308. package/dist/web/features/sessions/SessionRailDialogs.cjs.map +1 -0
  309. package/dist/web/features/sessions/SessionRailDialogs.d.mts +10 -0
  310. package/dist/web/features/sessions/SessionRailDialogs.d.mts.map +1 -0
  311. package/dist/web/features/sessions/SessionRailDialogs.mjs +62 -0
  312. package/dist/web/features/sessions/SessionRailDialogs.mjs.map +1 -0
  313. package/dist/web/features/sessions/WelcomePanel.cjs +42 -0
  314. package/dist/web/features/sessions/WelcomePanel.cjs.map +1 -0
  315. package/dist/web/features/sessions/WelcomePanel.d.mts +16 -0
  316. package/dist/web/features/sessions/WelcomePanel.d.mts.map +1 -0
  317. package/dist/web/features/sessions/WelcomePanel.mjs +42 -0
  318. package/dist/web/features/sessions/WelcomePanel.mjs.map +1 -0
  319. package/dist/web/features/sessions/useNewSessionActions.cjs +38 -0
  320. package/dist/web/features/sessions/useNewSessionActions.cjs.map +1 -0
  321. package/dist/web/features/sessions/useNewSessionActions.d.mts +12 -0
  322. package/dist/web/features/sessions/useNewSessionActions.d.mts.map +1 -0
  323. package/dist/web/features/sessions/useNewSessionActions.mjs +38 -0
  324. package/dist/web/features/sessions/useNewSessionActions.mjs.map +1 -0
  325. package/dist/web/features/sessions/useSessionRail.cjs +302 -0
  326. package/dist/web/features/sessions/useSessionRail.cjs.map +1 -0
  327. package/dist/web/features/sessions/useSessionRail.d.mts +14 -0
  328. package/dist/web/features/sessions/useSessionRail.d.mts.map +1 -0
  329. package/dist/web/features/sessions/useSessionRail.mjs +302 -0
  330. package/dist/web/features/sessions/useSessionRail.mjs.map +1 -0
  331. package/dist/web/features/settings/AppearanceSettings.cjs +126 -0
  332. package/dist/web/features/settings/AppearanceSettings.cjs.map +1 -0
  333. package/dist/web/features/settings/AppearanceSettings.d.mts +12 -0
  334. package/dist/web/features/settings/AppearanceSettings.d.mts.map +1 -0
  335. package/dist/web/features/settings/AppearanceSettings.mjs +126 -0
  336. package/dist/web/features/settings/AppearanceSettings.mjs.map +1 -0
  337. package/dist/web/features/settings/ContributedSettings.cjs +257 -0
  338. package/dist/web/features/settings/ContributedSettings.cjs.map +1 -0
  339. package/dist/web/features/settings/ContributedSettings.d.mts +14 -0
  340. package/dist/web/features/settings/ContributedSettings.d.mts.map +1 -0
  341. package/dist/web/features/settings/ContributedSettings.mjs +257 -0
  342. package/dist/web/features/settings/ContributedSettings.mjs.map +1 -0
  343. package/dist/web/features/settings/ImageSettings.cjs +146 -0
  344. package/dist/web/features/settings/ImageSettings.cjs.map +1 -0
  345. package/dist/web/features/settings/ImageSettings.d.mts +12 -0
  346. package/dist/web/features/settings/ImageSettings.d.mts.map +1 -0
  347. package/dist/web/features/settings/ImageSettings.mjs +146 -0
  348. package/dist/web/features/settings/ImageSettings.mjs.map +1 -0
  349. package/dist/web/features/settings/LoginFlowDialog.cjs +226 -0
  350. package/dist/web/features/settings/LoginFlowDialog.cjs.map +1 -0
  351. package/dist/web/features/settings/LoginFlowDialog.d.mts +15 -0
  352. package/dist/web/features/settings/LoginFlowDialog.d.mts.map +1 -0
  353. package/dist/web/features/settings/LoginFlowDialog.mjs +225 -0
  354. package/dist/web/features/settings/LoginFlowDialog.mjs.map +1 -0
  355. package/dist/web/features/settings/NotificationSettings.cjs +69 -0
  356. package/dist/web/features/settings/NotificationSettings.cjs.map +1 -0
  357. package/dist/web/features/settings/NotificationSettings.d.mts +5 -0
  358. package/dist/web/features/settings/NotificationSettings.d.mts.map +1 -0
  359. package/dist/web/features/settings/NotificationSettings.mjs +69 -0
  360. package/dist/web/features/settings/NotificationSettings.mjs.map +1 -0
  361. package/dist/web/features/settings/PluginSettings.cjs +106 -0
  362. package/dist/web/features/settings/PluginSettings.cjs.map +1 -0
  363. package/dist/web/features/settings/PluginSettings.d.mts +10 -0
  364. package/dist/web/features/settings/PluginSettings.d.mts.map +1 -0
  365. package/dist/web/features/settings/PluginSettings.mjs +106 -0
  366. package/dist/web/features/settings/PluginSettings.mjs.map +1 -0
  367. package/dist/web/features/settings/ProviderSettings.cjs +323 -0
  368. package/dist/web/features/settings/ProviderSettings.cjs.map +1 -0
  369. package/dist/web/features/settings/ProviderSettings.d.mts +9 -0
  370. package/dist/web/features/settings/ProviderSettings.d.mts.map +1 -0
  371. package/dist/web/features/settings/ProviderSettings.mjs +323 -0
  372. package/dist/web/features/settings/ProviderSettings.mjs.map +1 -0
  373. package/dist/web/features/settings/RemoteControlSettings.cjs +50 -0
  374. package/dist/web/features/settings/RemoteControlSettings.cjs.map +1 -0
  375. package/dist/web/features/settings/RemoteControlSettings.d.mts +5 -0
  376. package/dist/web/features/settings/RemoteControlSettings.d.mts.map +1 -0
  377. package/dist/web/features/settings/RemoteControlSettings.mjs +50 -0
  378. package/dist/web/features/settings/RemoteControlSettings.mjs.map +1 -0
  379. package/dist/web/features/settings/RepositorySettings.cjs +318 -0
  380. package/dist/web/features/settings/RepositorySettings.cjs.map +1 -0
  381. package/dist/web/features/settings/RepositorySettings.d.mts +7 -0
  382. package/dist/web/features/settings/RepositorySettings.d.mts.map +1 -0
  383. package/dist/web/features/settings/RepositorySettings.mjs +318 -0
  384. package/dist/web/features/settings/RepositorySettings.mjs.map +1 -0
  385. package/dist/web/features/settings/RepositoryWorkspace.cjs +160 -0
  386. package/dist/web/features/settings/RepositoryWorkspace.cjs.map +1 -0
  387. package/dist/web/features/settings/RepositoryWorkspace.d.mts +10 -0
  388. package/dist/web/features/settings/RepositoryWorkspace.d.mts.map +1 -0
  389. package/dist/web/features/settings/RepositoryWorkspace.mjs +160 -0
  390. package/dist/web/features/settings/RepositoryWorkspace.mjs.map +1 -0
  391. package/dist/web/features/settings/SessionMcpSettings.cjs +488 -0
  392. package/dist/web/features/settings/SessionMcpSettings.cjs.map +1 -0
  393. package/dist/web/features/settings/SessionMcpSettings.d.mts +5 -0
  394. package/dist/web/features/settings/SessionMcpSettings.d.mts.map +1 -0
  395. package/dist/web/features/settings/SessionMcpSettings.mjs +488 -0
  396. package/dist/web/features/settings/SessionMcpSettings.mjs.map +1 -0
  397. package/dist/web/features/settings/SettingsMenu.cjs +135 -0
  398. package/dist/web/features/settings/SettingsMenu.cjs.map +1 -0
  399. package/dist/web/features/settings/SettingsMenu.d.mts +9 -0
  400. package/dist/web/features/settings/SettingsMenu.d.mts.map +1 -0
  401. package/dist/web/features/settings/SettingsMenu.mjs +135 -0
  402. package/dist/web/features/settings/SettingsMenu.mjs.map +1 -0
  403. package/dist/web/features/settings/SettingsPanelHost.cjs +32 -0
  404. package/dist/web/features/settings/SettingsPanelHost.cjs.map +1 -0
  405. package/dist/web/features/settings/SettingsPanelHost.d.mts +8 -0
  406. package/dist/web/features/settings/SettingsPanelHost.d.mts.map +1 -0
  407. package/dist/web/features/settings/SettingsPanelHost.mjs +32 -0
  408. package/dist/web/features/settings/SettingsPanelHost.mjs.map +1 -0
  409. package/dist/web/features/settings/TemplateSettings.cjs +177 -0
  410. package/dist/web/features/settings/TemplateSettings.cjs.map +1 -0
  411. package/dist/web/features/settings/TemplateSettings.d.mts +8 -0
  412. package/dist/web/features/settings/TemplateSettings.d.mts.map +1 -0
  413. package/dist/web/features/settings/TemplateSettings.mjs +177 -0
  414. package/dist/web/features/settings/TemplateSettings.mjs.map +1 -0
  415. package/dist/web/features/settings/TunnelSettings.cjs +182 -0
  416. package/dist/web/features/settings/TunnelSettings.cjs.map +1 -0
  417. package/dist/web/features/settings/TunnelSettings.d.mts +8 -0
  418. package/dist/web/features/settings/TunnelSettings.d.mts.map +1 -0
  419. package/dist/web/features/settings/TunnelSettings.mjs +182 -0
  420. package/dist/web/features/settings/TunnelSettings.mjs.map +1 -0
  421. package/dist/web/features/settings/settings.fixture.cjs +230 -0
  422. package/dist/web/features/settings/settings.fixture.cjs.map +1 -0
  423. package/dist/web/features/settings/settings.fixture.d.mts +6 -0
  424. package/dist/web/features/settings/settings.fixture.d.mts.map +1 -0
  425. package/dist/web/features/settings/settings.fixture.mjs +223 -0
  426. package/dist/web/features/settings/settings.fixture.mjs.map +1 -0
  427. package/dist/web/features/status/TopBar.cjs +200 -0
  428. package/dist/web/features/status/TopBar.cjs.map +1 -0
  429. package/dist/web/features/status/TopBar.d.mts +11 -0
  430. package/dist/web/features/status/TopBar.d.mts.map +1 -0
  431. package/dist/web/features/status/TopBar.mjs +200 -0
  432. package/dist/web/features/status/TopBar.mjs.map +1 -0
  433. package/dist/web/lib/authApi.cjs +77 -0
  434. package/dist/web/lib/authApi.cjs.map +1 -0
  435. package/dist/web/lib/authApi.d.mts +28 -0
  436. package/dist/web/lib/authApi.d.mts.map +1 -0
  437. package/dist/web/lib/authApi.mjs +72 -0
  438. package/dist/web/lib/authApi.mjs.map +1 -0
  439. package/dist/web/lib/browserNotifications.cjs +37 -0
  440. package/dist/web/lib/browserNotifications.cjs.map +1 -0
  441. package/dist/web/lib/browserNotifications.d.mts +12 -0
  442. package/dist/web/lib/browserNotifications.d.mts.map +1 -0
  443. package/dist/web/lib/browserNotifications.mjs +35 -0
  444. package/dist/web/lib/browserNotifications.mjs.map +1 -0
  445. package/dist/web/lib/browserTelemetry.cjs +158 -0
  446. package/dist/web/lib/browserTelemetry.cjs.map +1 -0
  447. package/dist/web/lib/browserTelemetry.d.mts +28 -0
  448. package/dist/web/lib/browserTelemetry.d.mts.map +1 -0
  449. package/dist/web/lib/browserTelemetry.mjs +154 -0
  450. package/dist/web/lib/browserTelemetry.mjs.map +1 -0
  451. package/dist/web/lib/commands.cjs +176 -0
  452. package/dist/web/lib/commands.cjs.map +1 -0
  453. package/dist/web/lib/commands.d.mts +53 -0
  454. package/dist/web/lib/commands.d.mts.map +1 -0
  455. package/dist/web/lib/commands.mjs +153 -0
  456. package/dist/web/lib/commands.mjs.map +1 -0
  457. package/dist/web/lib/composerSubmissions.cjs +20 -0
  458. package/dist/web/lib/composerSubmissions.cjs.map +1 -0
  459. package/dist/web/lib/composerSubmissions.d.mts +7 -0
  460. package/dist/web/lib/composerSubmissions.d.mts.map +1 -0
  461. package/dist/web/lib/composerSubmissions.mjs +19 -0
  462. package/dist/web/lib/composerSubmissions.mjs.map +1 -0
  463. package/dist/web/lib/composition.cjs +403 -0
  464. package/dist/web/lib/composition.cjs.map +1 -0
  465. package/dist/web/lib/composition.d.mts +137 -0
  466. package/dist/web/lib/composition.d.mts.map +1 -0
  467. package/dist/web/lib/composition.mjs +392 -0
  468. package/dist/web/lib/composition.mjs.map +1 -0
  469. package/dist/web/lib/contextComposition.cjs +132 -0
  470. package/dist/web/lib/contextComposition.cjs.map +1 -0
  471. package/dist/web/lib/contextComposition.d.mts +75 -0
  472. package/dist/web/lib/contextComposition.d.mts.map +1 -0
  473. package/dist/web/lib/contextComposition.mjs +127 -0
  474. package/dist/web/lib/contextComposition.mjs.map +1 -0
  475. package/dist/web/lib/contextDetailApi.cjs +61 -0
  476. package/dist/web/lib/contextDetailApi.cjs.map +1 -0
  477. package/dist/web/lib/contextDetailApi.d.mts +12 -0
  478. package/dist/web/lib/contextDetailApi.d.mts.map +1 -0
  479. package/dist/web/lib/contextDetailApi.mjs +61 -0
  480. package/dist/web/lib/contextDetailApi.mjs.map +1 -0
  481. package/dist/web/lib/dashboardRenderers.cjs +9 -0
  482. package/dist/web/lib/dashboardRenderers.cjs.map +1 -0
  483. package/dist/web/lib/dashboardRenderers.d.mts +12 -0
  484. package/dist/web/lib/dashboardRenderers.d.mts.map +1 -0
  485. package/dist/web/lib/dashboardRenderers.mjs +9 -0
  486. package/dist/web/lib/dashboardRenderers.mjs.map +1 -0
  487. package/dist/web/lib/dashboardRoute.cjs +27 -0
  488. package/dist/web/lib/dashboardRoute.cjs.map +1 -0
  489. package/dist/web/lib/dashboardRoute.d.mts +29 -0
  490. package/dist/web/lib/dashboardRoute.d.mts.map +1 -0
  491. package/dist/web/lib/dashboardRoute.mjs +26 -0
  492. package/dist/web/lib/dashboardRoute.mjs.map +1 -0
  493. package/dist/web/lib/dashboardTranscript.cjs +15 -0
  494. package/dist/web/lib/dashboardTranscript.cjs.map +1 -0
  495. package/dist/web/lib/dashboardTranscript.d.mts +6 -0
  496. package/dist/web/lib/dashboardTranscript.d.mts.map +1 -0
  497. package/dist/web/lib/dashboardTranscript.mjs +14 -0
  498. package/dist/web/lib/dashboardTranscript.mjs.map +1 -0
  499. package/dist/web/lib/devProxyApi.cjs +74 -0
  500. package/dist/web/lib/devProxyApi.cjs.map +1 -0
  501. package/dist/web/lib/devProxyApi.d.mts +21 -0
  502. package/dist/web/lib/devProxyApi.d.mts.map +1 -0
  503. package/dist/web/lib/devProxyApi.mjs +72 -0
  504. package/dist/web/lib/devProxyApi.mjs.map +1 -0
  505. package/dist/web/lib/fileMentions.cjs +30 -0
  506. package/dist/web/lib/fileMentions.cjs.map +1 -0
  507. package/dist/web/lib/fileMentions.d.mts +13 -0
  508. package/dist/web/lib/fileMentions.d.mts.map +1 -0
  509. package/dist/web/lib/fileMentions.mjs +29 -0
  510. package/dist/web/lib/fileMentions.mjs.map +1 -0
  511. package/dist/web/lib/hubApi.cjs +283 -0
  512. package/dist/web/lib/hubApi.cjs.map +1 -0
  513. package/dist/web/lib/hubApi.d.mts +109 -0
  514. package/dist/web/lib/hubApi.d.mts.map +1 -0
  515. package/dist/web/lib/hubApi.mjs +268 -0
  516. package/dist/web/lib/hubApi.mjs.map +1 -0
  517. package/dist/web/lib/leaderTree.cjs +150 -0
  518. package/dist/web/lib/leaderTree.cjs.map +1 -0
  519. package/dist/web/lib/leaderTree.d.mts +41 -0
  520. package/dist/web/lib/leaderTree.d.mts.map +1 -0
  521. package/dist/web/lib/leaderTree.mjs +149 -0
  522. package/dist/web/lib/leaderTree.mjs.map +1 -0
  523. package/dist/web/lib/livePush.cjs +97 -0
  524. package/dist/web/lib/livePush.cjs.map +1 -0
  525. package/dist/web/lib/livePush.d.mts +10 -0
  526. package/dist/web/lib/livePush.d.mts.map +1 -0
  527. package/dist/web/lib/livePush.mjs +94 -0
  528. package/dist/web/lib/livePush.mjs.map +1 -0
  529. package/dist/web/lib/modelContextAdapter.cjs +63 -0
  530. package/dist/web/lib/modelContextAdapter.cjs.map +1 -0
  531. package/dist/web/lib/modelContextAdapter.d.mts +11 -0
  532. package/dist/web/lib/modelContextAdapter.d.mts.map +1 -0
  533. package/dist/web/lib/modelContextAdapter.mjs +62 -0
  534. package/dist/web/lib/modelContextAdapter.mjs.map +1 -0
  535. package/dist/web/lib/piTransport.cjs +103 -0
  536. package/dist/web/lib/piTransport.cjs.map +1 -0
  537. package/dist/web/lib/piTransport.d.mts +8 -0
  538. package/dist/web/lib/piTransport.d.mts.map +1 -0
  539. package/dist/web/lib/piTransport.mjs +102 -0
  540. package/dist/web/lib/piTransport.mjs.map +1 -0
  541. package/dist/web/lib/pluginCompositions.cjs +57 -0
  542. package/dist/web/lib/pluginCompositions.cjs.map +1 -0
  543. package/dist/web/lib/pluginCompositions.d.mts +37 -0
  544. package/dist/web/lib/pluginCompositions.d.mts.map +1 -0
  545. package/dist/web/lib/pluginCompositions.mjs +52 -0
  546. package/dist/web/lib/pluginCompositions.mjs.map +1 -0
  547. package/dist/web/lib/pluginRegistry.cjs +675 -0
  548. package/dist/web/lib/pluginRegistry.cjs.map +1 -0
  549. package/dist/web/lib/pluginRegistry.d.mts +155 -0
  550. package/dist/web/lib/pluginRegistry.d.mts.map +1 -0
  551. package/dist/web/lib/pluginRegistry.mjs +633 -0
  552. package/dist/web/lib/pluginRegistry.mjs.map +1 -0
  553. package/dist/web/lib/pluginScopes.cjs +48 -0
  554. package/dist/web/lib/pluginScopes.cjs.map +1 -0
  555. package/dist/web/lib/pluginScopes.d.mts +8 -0
  556. package/dist/web/lib/pluginScopes.d.mts.map +1 -0
  557. package/dist/web/lib/pluginScopes.mjs +47 -0
  558. package/dist/web/lib/pluginScopes.mjs.map +1 -0
  559. package/dist/web/lib/pluginSlotProps.cjs +83 -0
  560. package/dist/web/lib/pluginSlotProps.cjs.map +1 -0
  561. package/dist/web/lib/pluginSlotProps.d.mts +21 -0
  562. package/dist/web/lib/pluginSlotProps.d.mts.map +1 -0
  563. package/dist/web/lib/pluginSlotProps.mjs +82 -0
  564. package/dist/web/lib/pluginSlotProps.mjs.map +1 -0
  565. package/dist/web/lib/promptFocus.cjs +30 -0
  566. package/dist/web/lib/promptFocus.cjs.map +1 -0
  567. package/dist/web/lib/promptFocus.d.mts +7 -0
  568. package/dist/web/lib/promptFocus.d.mts.map +1 -0
  569. package/dist/web/lib/promptFocus.mjs +29 -0
  570. package/dist/web/lib/promptFocus.mjs.map +1 -0
  571. package/dist/web/lib/protocolHubSocket.cjs +107 -0
  572. package/dist/web/lib/protocolHubSocket.cjs.map +1 -0
  573. package/dist/web/lib/protocolHubSocket.d.mts +18 -0
  574. package/dist/web/lib/protocolHubSocket.d.mts.map +1 -0
  575. package/dist/web/lib/protocolHubSocket.mjs +107 -0
  576. package/dist/web/lib/protocolHubSocket.mjs.map +1 -0
  577. package/dist/web/lib/protocolTimeline.cjs +86 -0
  578. package/dist/web/lib/protocolTimeline.cjs.map +1 -0
  579. package/dist/web/lib/protocolTimeline.d.mts +9 -0
  580. package/dist/web/lib/protocolTimeline.d.mts.map +1 -0
  581. package/dist/web/lib/protocolTimeline.mjs +85 -0
  582. package/dist/web/lib/protocolTimeline.mjs.map +1 -0
  583. package/dist/web/lib/qrMatrix.cjs +37 -0
  584. package/dist/web/lib/qrMatrix.cjs.map +1 -0
  585. package/dist/web/lib/qrMatrix.d.mts +5 -0
  586. package/dist/web/lib/qrMatrix.d.mts.map +1 -0
  587. package/dist/web/lib/qrMatrix.mjs +35 -0
  588. package/dist/web/lib/qrMatrix.mjs.map +1 -0
  589. package/dist/web/lib/remoteApi.cjs +100 -0
  590. package/dist/web/lib/remoteApi.cjs.map +1 -0
  591. package/dist/web/lib/remoteApi.d.mts +45 -0
  592. package/dist/web/lib/remoteApi.d.mts.map +1 -0
  593. package/dist/web/lib/remoteApi.mjs +92 -0
  594. package/dist/web/lib/remoteApi.mjs.map +1 -0
  595. package/dist/web/lib/sealedSession.cjs +81 -0
  596. package/dist/web/lib/sealedSession.cjs.map +1 -0
  597. package/dist/web/lib/sealedSession.d.mts +24 -0
  598. package/dist/web/lib/sealedSession.d.mts.map +1 -0
  599. package/dist/web/lib/sealedSession.mjs +75 -0
  600. package/dist/web/lib/sealedSession.mjs.map +1 -0
  601. package/dist/web/lib/sessionActivityRenderer.cjs +19 -0
  602. package/dist/web/lib/sessionActivityRenderer.cjs.map +1 -0
  603. package/dist/web/lib/sessionActivityRenderer.d.mts +10 -0
  604. package/dist/web/lib/sessionActivityRenderer.d.mts.map +1 -0
  605. package/dist/web/lib/sessionActivityRenderer.mjs +17 -0
  606. package/dist/web/lib/sessionActivityRenderer.mjs.map +1 -0
  607. package/dist/web/lib/sessionAsset.cjs +45 -0
  608. package/dist/web/lib/sessionAsset.cjs.map +1 -0
  609. package/dist/web/lib/sessionAsset.d.mts +17 -0
  610. package/dist/web/lib/sessionAsset.d.mts.map +1 -0
  611. package/dist/web/lib/sessionAsset.mjs +44 -0
  612. package/dist/web/lib/sessionAsset.mjs.map +1 -0
  613. package/dist/web/lib/sessionAvatar.cjs +18 -0
  614. package/dist/web/lib/sessionAvatar.cjs.map +1 -0
  615. package/dist/web/lib/sessionAvatar.d.mts +10 -0
  616. package/dist/web/lib/sessionAvatar.d.mts.map +1 -0
  617. package/dist/web/lib/sessionAvatar.mjs +18 -0
  618. package/dist/web/lib/sessionAvatar.mjs.map +1 -0
  619. package/dist/web/lib/sessionMcpApi.cjs +120 -0
  620. package/dist/web/lib/sessionMcpApi.cjs.map +1 -0
  621. package/dist/web/lib/sessionMcpApi.d.mts +27 -0
  622. package/dist/web/lib/sessionMcpApi.d.mts.map +1 -0
  623. package/dist/web/lib/sessionMcpApi.mjs +114 -0
  624. package/dist/web/lib/sessionMcpApi.mjs.map +1 -0
  625. package/dist/web/lib/sessionMcpPrompt.cjs +24 -0
  626. package/dist/web/lib/sessionMcpPrompt.cjs.map +1 -0
  627. package/dist/web/lib/sessionMcpPrompt.mjs +23 -0
  628. package/dist/web/lib/sessionMcpPrompt.mjs.map +1 -0
  629. package/dist/web/lib/sessionModel.cjs +970 -0
  630. package/dist/web/lib/sessionModel.cjs.map +1 -0
  631. package/dist/web/lib/sessionModel.d.mts +254 -0
  632. package/dist/web/lib/sessionModel.d.mts.map +1 -0
  633. package/dist/web/lib/sessionModel.mjs +958 -0
  634. package/dist/web/lib/sessionModel.mjs.map +1 -0
  635. package/dist/web/lib/sessionProtocolCommands.cjs +196 -0
  636. package/dist/web/lib/sessionProtocolCommands.cjs.map +1 -0
  637. package/dist/web/lib/sessionProtocolCommands.d.mts +15 -0
  638. package/dist/web/lib/sessionProtocolCommands.d.mts.map +1 -0
  639. package/dist/web/lib/sessionProtocolCommands.mjs +193 -0
  640. package/dist/web/lib/sessionProtocolCommands.mjs.map +1 -0
  641. package/dist/web/lib/sessionRailModel.cjs +107 -0
  642. package/dist/web/lib/sessionRailModel.cjs.map +1 -0
  643. package/dist/web/lib/sessionRailModel.d.mts +38 -0
  644. package/dist/web/lib/sessionRailModel.d.mts.map +1 -0
  645. package/dist/web/lib/sessionRailModel.mjs +104 -0
  646. package/dist/web/lib/sessionRailModel.mjs.map +1 -0
  647. package/dist/web/lib/sessionSummary.cjs +58 -0
  648. package/dist/web/lib/sessionSummary.cjs.map +1 -0
  649. package/dist/web/lib/sessionSummary.d.mts +39 -0
  650. package/dist/web/lib/sessionSummary.d.mts.map +1 -0
  651. package/dist/web/lib/sessionSummary.mjs +54 -0
  652. package/dist/web/lib/sessionSummary.mjs.map +1 -0
  653. package/dist/web/lib/sessionTranscriptRenderer.cjs +19 -0
  654. package/dist/web/lib/sessionTranscriptRenderer.cjs.map +1 -0
  655. package/dist/web/lib/sessionTranscriptRenderer.d.mts +11 -0
  656. package/dist/web/lib/sessionTranscriptRenderer.d.mts.map +1 -0
  657. package/dist/web/lib/sessionTranscriptRenderer.mjs +17 -0
  658. package/dist/web/lib/sessionTranscriptRenderer.mjs.map +1 -0
  659. package/dist/web/lib/settingsApi.cjs +237 -0
  660. package/dist/web/lib/settingsApi.cjs.map +1 -0
  661. package/dist/web/lib/settingsApi.d.mts +57 -0
  662. package/dist/web/lib/settingsApi.d.mts.map +1 -0
  663. package/dist/web/lib/settingsApi.mjs +230 -0
  664. package/dist/web/lib/settingsApi.mjs.map +1 -0
  665. package/dist/web/lib/settingsDraft.cjs +48 -0
  666. package/dist/web/lib/settingsDraft.cjs.map +1 -0
  667. package/dist/web/lib/settingsDraft.d.mts +28 -0
  668. package/dist/web/lib/settingsDraft.d.mts.map +1 -0
  669. package/dist/web/lib/settingsDraft.mjs +45 -0
  670. package/dist/web/lib/settingsDraft.mjs.map +1 -0
  671. package/dist/web/lib/settingsSections.cjs +108 -0
  672. package/dist/web/lib/settingsSections.cjs.map +1 -0
  673. package/dist/web/lib/settingsSections.d.mts +36 -0
  674. package/dist/web/lib/settingsSections.d.mts.map +1 -0
  675. package/dist/web/lib/settingsSections.mjs +105 -0
  676. package/dist/web/lib/settingsSections.mjs.map +1 -0
  677. package/dist/web/lib/statusLine.cjs +82 -0
  678. package/dist/web/lib/statusLine.cjs.map +1 -0
  679. package/dist/web/lib/statusLine.d.mts +27 -0
  680. package/dist/web/lib/statusLine.d.mts.map +1 -0
  681. package/dist/web/lib/statusLine.mjs +79 -0
  682. package/dist/web/lib/statusLine.mjs.map +1 -0
  683. package/dist/web/lib/stepUp.cjs +41 -0
  684. package/dist/web/lib/stepUp.cjs.map +1 -0
  685. package/dist/web/lib/stepUp.d.mts +18 -0
  686. package/dist/web/lib/stepUp.d.mts.map +1 -0
  687. package/dist/web/lib/stepUp.mjs +41 -0
  688. package/dist/web/lib/stepUp.mjs.map +1 -0
  689. package/dist/web/lib/templateCatalog.cjs +123 -0
  690. package/dist/web/lib/templateCatalog.cjs.map +1 -0
  691. package/dist/web/lib/templateCatalog.d.mts +38 -0
  692. package/dist/web/lib/templateCatalog.d.mts.map +1 -0
  693. package/dist/web/lib/templateCatalog.mjs +118 -0
  694. package/dist/web/lib/templateCatalog.mjs.map +1 -0
  695. package/dist/web/lib/threadRenderer.cjs +25 -0
  696. package/dist/web/lib/threadRenderer.cjs.map +1 -0
  697. package/dist/web/lib/threadRenderer.d.mts +17 -0
  698. package/dist/web/lib/threadRenderer.d.mts.map +1 -0
  699. package/dist/web/lib/threadRenderer.mjs +23 -0
  700. package/dist/web/lib/threadRenderer.mjs.map +1 -0
  701. package/dist/web/lib/timelineGroups.cjs +83 -0
  702. package/dist/web/lib/timelineGroups.cjs.map +1 -0
  703. package/dist/web/lib/timelineGroups.d.mts +36 -0
  704. package/dist/web/lib/timelineGroups.d.mts.map +1 -0
  705. package/dist/web/lib/timelineGroups.mjs +81 -0
  706. package/dist/web/lib/timelineGroups.mjs.map +1 -0
  707. package/dist/web/lib/toolCompletionTabs.cjs +98 -0
  708. package/dist/web/lib/toolCompletionTabs.cjs.map +1 -0
  709. package/dist/web/lib/toolCompletionTabs.d.mts +14 -0
  710. package/dist/web/lib/toolCompletionTabs.d.mts.map +1 -0
  711. package/dist/web/lib/toolCompletionTabs.mjs +98 -0
  712. package/dist/web/lib/toolCompletionTabs.mjs.map +1 -0
  713. package/dist/web/lib/toolMessageProps.cjs +19 -0
  714. package/dist/web/lib/toolMessageProps.cjs.map +1 -0
  715. package/dist/web/lib/toolMessageProps.d.mts +7 -0
  716. package/dist/web/lib/toolMessageProps.d.mts.map +1 -0
  717. package/dist/web/lib/toolMessageProps.mjs +19 -0
  718. package/dist/web/lib/toolMessageProps.mjs.map +1 -0
  719. package/dist/web/lib/toolPrompt.cjs +44 -0
  720. package/dist/web/lib/toolPrompt.cjs.map +1 -0
  721. package/dist/web/lib/toolPrompt.d.mts +34 -0
  722. package/dist/web/lib/toolPrompt.d.mts.map +1 -0
  723. package/dist/web/lib/toolPrompt.mjs +44 -0
  724. package/dist/web/lib/toolPrompt.mjs.map +1 -0
  725. package/dist/web/lib/transport.cjs +57 -0
  726. package/dist/web/lib/transport.cjs.map +1 -0
  727. package/dist/web/lib/transport.d.mts +40 -0
  728. package/dist/web/lib/transport.d.mts.map +1 -0
  729. package/dist/web/lib/transport.mjs +50 -0
  730. package/dist/web/lib/transport.mjs.map +1 -0
  731. package/dist/web/lib/useSessionMcp.cjs +65 -0
  732. package/dist/web/lib/useSessionMcp.cjs.map +1 -0
  733. package/dist/web/lib/useSessionMcp.d.mts +15 -0
  734. package/dist/web/lib/useSessionMcp.d.mts.map +1 -0
  735. package/dist/web/lib/useSessionMcp.mjs +65 -0
  736. package/dist/web/lib/useSessionMcp.mjs.map +1 -0
  737. package/dist/web/lib/webauthnClient.cjs +110 -0
  738. package/dist/web/lib/webauthnClient.cjs.map +1 -0
  739. package/dist/web/lib/webauthnClient.d.mts +32 -0
  740. package/dist/web/lib/webauthnClient.d.mts.map +1 -0
  741. package/dist/web/lib/webauthnClient.mjs +106 -0
  742. package/dist/web/lib/webauthnClient.mjs.map +1 -0
  743. package/dist/web/lib/webmcpSimulator.cjs +105 -0
  744. package/dist/web/lib/webmcpSimulator.cjs.map +1 -0
  745. package/dist/web/lib/webmcpSimulator.mjs +105 -0
  746. package/dist/web/lib/webmcpSimulator.mjs.map +1 -0
  747. package/dist/web/stores/captureStore.cjs +137 -0
  748. package/dist/web/stores/captureStore.cjs.map +1 -0
  749. package/dist/web/stores/captureStore.d.mts +13 -0
  750. package/dist/web/stores/captureStore.d.mts.map +1 -0
  751. package/dist/web/stores/captureStore.mjs +133 -0
  752. package/dist/web/stores/captureStore.mjs.map +1 -0
  753. package/dist/web/stores/composerStore.cjs +390 -0
  754. package/dist/web/stores/composerStore.cjs.map +1 -0
  755. package/dist/web/stores/composerStore.d.mts +101 -0
  756. package/dist/web/stores/composerStore.d.mts.map +1 -0
  757. package/dist/web/stores/composerStore.mjs +370 -0
  758. package/dist/web/stores/composerStore.mjs.map +1 -0
  759. package/dist/web/stores/composerSubmissionStore.cjs +88 -0
  760. package/dist/web/stores/composerSubmissionStore.cjs.map +1 -0
  761. package/dist/web/stores/composerSubmissionStore.d.mts +11 -0
  762. package/dist/web/stores/composerSubmissionStore.d.mts.map +1 -0
  763. package/dist/web/stores/composerSubmissionStore.mjs +87 -0
  764. package/dist/web/stores/composerSubmissionStore.mjs.map +1 -0
  765. package/dist/web/stores/dashboardStateStore.cjs +35 -0
  766. package/dist/web/stores/dashboardStateStore.cjs.map +1 -0
  767. package/dist/web/stores/dashboardStateStore.d.mts +11 -0
  768. package/dist/web/stores/dashboardStateStore.d.mts.map +1 -0
  769. package/dist/web/stores/dashboardStateStore.mjs +33 -0
  770. package/dist/web/stores/dashboardStateStore.mjs.map +1 -0
  771. package/dist/web/stores/devProxyStore.cjs +76 -0
  772. package/dist/web/stores/devProxyStore.cjs.map +1 -0
  773. package/dist/web/stores/devProxyStore.d.mts +25 -0
  774. package/dist/web/stores/devProxyStore.d.mts.map +1 -0
  775. package/dist/web/stores/devProxyStore.mjs +73 -0
  776. package/dist/web/stores/devProxyStore.mjs.map +1 -0
  777. package/dist/web/stores/dialogDraftStore.cjs +38 -0
  778. package/dist/web/stores/dialogDraftStore.cjs.map +1 -0
  779. package/dist/web/stores/dialogDraftStore.d.mts +13 -0
  780. package/dist/web/stores/dialogDraftStore.d.mts.map +1 -0
  781. package/dist/web/stores/dialogDraftStore.mjs +36 -0
  782. package/dist/web/stores/dialogDraftStore.mjs.map +1 -0
  783. package/dist/web/stores/fileLinkModesStore.cjs +20 -0
  784. package/dist/web/stores/fileLinkModesStore.cjs.map +1 -0
  785. package/dist/web/stores/fileLinkModesStore.d.mts +5 -0
  786. package/dist/web/stores/fileLinkModesStore.d.mts.map +1 -0
  787. package/dist/web/stores/fileLinkModesStore.mjs +20 -0
  788. package/dist/web/stores/fileLinkModesStore.mjs.map +1 -0
  789. package/dist/web/stores/menuStore.cjs +85 -0
  790. package/dist/web/stores/menuStore.cjs.map +1 -0
  791. package/dist/web/stores/menuStore.d.mts +42 -0
  792. package/dist/web/stores/menuStore.d.mts.map +1 -0
  793. package/dist/web/stores/menuStore.mjs +79 -0
  794. package/dist/web/stores/menuStore.mjs.map +1 -0
  795. package/dist/web/stores/newSessionStore.cjs +93 -0
  796. package/dist/web/stores/newSessionStore.cjs.map +1 -0
  797. package/dist/web/stores/newSessionStore.d.mts +30 -0
  798. package/dist/web/stores/newSessionStore.d.mts.map +1 -0
  799. package/dist/web/stores/newSessionStore.mjs +86 -0
  800. package/dist/web/stores/newSessionStore.mjs.map +1 -0
  801. package/dist/web/stores/pagedTranscriptStore.cjs +235 -0
  802. package/dist/web/stores/pagedTranscriptStore.cjs.map +1 -0
  803. package/dist/web/stores/pagedTranscriptStore.d.mts +12 -0
  804. package/dist/web/stores/pagedTranscriptStore.d.mts.map +1 -0
  805. package/dist/web/stores/pagedTranscriptStore.mjs +235 -0
  806. package/dist/web/stores/pagedTranscriptStore.mjs.map +1 -0
  807. package/dist/web/stores/paletteStore.cjs +37 -0
  808. package/dist/web/stores/paletteStore.cjs.map +1 -0
  809. package/dist/web/stores/paletteStore.d.mts +14 -0
  810. package/dist/web/stores/paletteStore.d.mts.map +1 -0
  811. package/dist/web/stores/paletteStore.mjs +34 -0
  812. package/dist/web/stores/paletteStore.mjs.map +1 -0
  813. package/dist/web/stores/railDialogStore.cjs +105 -0
  814. package/dist/web/stores/railDialogStore.cjs.map +1 -0
  815. package/dist/web/stores/railDialogStore.d.mts +32 -0
  816. package/dist/web/stores/railDialogStore.d.mts.map +1 -0
  817. package/dist/web/stores/railDialogStore.mjs +97 -0
  818. package/dist/web/stores/railDialogStore.mjs.map +1 -0
  819. package/dist/web/stores/remoteAccessStore.cjs +216 -0
  820. package/dist/web/stores/remoteAccessStore.cjs.map +1 -0
  821. package/dist/web/stores/remoteAccessStore.d.mts +48 -0
  822. package/dist/web/stores/remoteAccessStore.d.mts.map +1 -0
  823. package/dist/web/stores/remoteAccessStore.mjs +202 -0
  824. package/dist/web/stores/remoteAccessStore.mjs.map +1 -0
  825. package/dist/web/stores/sessionChannelHoldsStore.cjs +43 -0
  826. package/dist/web/stores/sessionChannelHoldsStore.cjs.map +1 -0
  827. package/dist/web/stores/sessionChannelHoldsStore.d.mts +9 -0
  828. package/dist/web/stores/sessionChannelHoldsStore.d.mts.map +1 -0
  829. package/dist/web/stores/sessionChannelHoldsStore.mjs +42 -0
  830. package/dist/web/stores/sessionChannelHoldsStore.mjs.map +1 -0
  831. package/dist/web/stores/sessionStore.cjs +610 -0
  832. package/dist/web/stores/sessionStore.cjs.map +1 -0
  833. package/dist/web/stores/sessionStore.d.mts +116 -0
  834. package/dist/web/stores/sessionStore.d.mts.map +1 -0
  835. package/dist/web/stores/sessionStore.mjs +568 -0
  836. package/dist/web/stores/sessionStore.mjs.map +1 -0
  837. package/dist/web/stores/sessionsStore.cjs +272 -0
  838. package/dist/web/stores/sessionsStore.cjs.map +1 -0
  839. package/dist/web/stores/sessionsStore.d.mts +74 -0
  840. package/dist/web/stores/sessionsStore.d.mts.map +1 -0
  841. package/dist/web/stores/sessionsStore.mjs +257 -0
  842. package/dist/web/stores/sessionsStore.mjs.map +1 -0
  843. package/dist/web/stores/settingsDraftStore.cjs +138 -0
  844. package/dist/web/stores/settingsDraftStore.cjs.map +1 -0
  845. package/dist/web/stores/settingsDraftStore.d.mts +27 -0
  846. package/dist/web/stores/settingsDraftStore.d.mts.map +1 -0
  847. package/dist/web/stores/settingsDraftStore.mjs +132 -0
  848. package/dist/web/stores/settingsDraftStore.mjs.map +1 -0
  849. package/dist/web/stores/templateStore.cjs +136 -0
  850. package/dist/web/stores/templateStore.cjs.map +1 -0
  851. package/dist/web/stores/templateStore.d.mts +20 -0
  852. package/dist/web/stores/templateStore.d.mts.map +1 -0
  853. package/dist/web/stores/templateStore.mjs +131 -0
  854. package/dist/web/stores/templateStore.mjs.map +1 -0
  855. package/dist/web/stores/themeStore.cjs +42 -0
  856. package/dist/web/stores/themeStore.cjs.map +1 -0
  857. package/dist/web/stores/themeStore.d.mts +20 -0
  858. package/dist/web/stores/themeStore.d.mts.map +1 -0
  859. package/dist/web/stores/themeStore.mjs +39 -0
  860. package/dist/web/stores/themeStore.mjs.map +1 -0
  861. package/dist/web/stores/threadStore.cjs +122 -0
  862. package/dist/web/stores/threadStore.cjs.map +1 -0
  863. package/dist/web/stores/threadStore.d.mts +24 -0
  864. package/dist/web/stores/threadStore.d.mts.map +1 -0
  865. package/dist/web/stores/threadStore.mjs +114 -0
  866. package/dist/web/stores/threadStore.mjs.map +1 -0
  867. package/dist/web/stores/toolPromptStore.cjs +15 -0
  868. package/dist/web/stores/toolPromptStore.cjs.map +1 -0
  869. package/dist/web/stores/toolPromptStore.d.mts +23 -0
  870. package/dist/web/stores/toolPromptStore.d.mts.map +1 -0
  871. package/dist/web/stores/toolPromptStore.mjs +14 -0
  872. package/dist/web/stores/toolPromptStore.mjs.map +1 -0
  873. package/dist/web/stores/transientTabsStore.cjs +66 -0
  874. package/dist/web/stores/transientTabsStore.cjs.map +1 -0
  875. package/dist/web/stores/transientTabsStore.d.mts +21 -0
  876. package/dist/web/stores/transientTabsStore.d.mts.map +1 -0
  877. package/dist/web/stores/transientTabsStore.mjs +59 -0
  878. package/dist/web/stores/transientTabsStore.mjs.map +1 -0
  879. package/dist/web/stores/uiStore.cjs +47 -0
  880. package/dist/web/stores/uiStore.cjs.map +1 -0
  881. package/dist/web/stores/uiStore.d.mts +18 -0
  882. package/dist/web/stores/uiStore.d.mts.map +1 -0
  883. package/dist/web/stores/uiStore.mjs +45 -0
  884. package/dist/web/stores/uiStore.mjs.map +1 -0
  885. package/dist/web/stores/useOpenTab.cjs +31 -0
  886. package/dist/web/stores/useOpenTab.cjs.map +1 -0
  887. package/dist/web/stores/useOpenTab.d.mts +9 -0
  888. package/dist/web/stores/useOpenTab.d.mts.map +1 -0
  889. package/dist/web/stores/useOpenTab.mjs +31 -0
  890. package/dist/web/stores/useOpenTab.mjs.map +1 -0
  891. package/dist/web/stores/usePluginSlotProps.cjs +115 -0
  892. package/dist/web/stores/usePluginSlotProps.cjs.map +1 -0
  893. package/dist/web/stores/usePluginSlotProps.d.mts +6 -0
  894. package/dist/web/stores/usePluginSlotProps.d.mts.map +1 -0
  895. package/dist/web/stores/usePluginSlotProps.mjs +115 -0
  896. package/dist/web/stores/usePluginSlotProps.mjs.map +1 -0
  897. package/dist/web/stores/useToolPrompt.cjs +42 -0
  898. package/dist/web/stores/useToolPrompt.cjs.map +1 -0
  899. package/dist/web/stores/useToolPrompt.d.mts +14 -0
  900. package/dist/web/stores/useToolPrompt.d.mts.map +1 -0
  901. package/dist/web/stores/useToolPrompt.mjs +42 -0
  902. package/dist/web/stores/useToolPrompt.mjs.map +1 -0
  903. package/dist/web/stores/useWebPluginRegistry.cjs +11 -0
  904. package/dist/web/stores/useWebPluginRegistry.cjs.map +1 -0
  905. package/dist/web/stores/useWebPluginRegistry.d.mts +5 -0
  906. package/dist/web/stores/useWebPluginRegistry.d.mts.map +1 -0
  907. package/dist/web/stores/useWebPluginRegistry.mjs +11 -0
  908. package/dist/web/stores/useWebPluginRegistry.mjs.map +1 -0
  909. package/dist/web/stores/workspaceAdmissionStore.cjs +67 -0
  910. package/dist/web/stores/workspaceAdmissionStore.cjs.map +1 -0
  911. package/dist/web/stores/workspaceAdmissionStore.d.mts +24 -0
  912. package/dist/web/stores/workspaceAdmissionStore.d.mts.map +1 -0
  913. package/dist/web/stores/workspaceAdmissionStore.mjs +64 -0
  914. package/dist/web/stores/workspaceAdmissionStore.mjs.map +1 -0
  915. package/dist/web/stores/workspacesStore.cjs +83 -0
  916. package/dist/web/stores/workspacesStore.cjs.map +1 -0
  917. package/dist/web/stores/workspacesStore.d.mts +17 -0
  918. package/dist/web/stores/workspacesStore.d.mts.map +1 -0
  919. package/dist/web/stores/workspacesStore.mjs +78 -0
  920. package/dist/web/stores/workspacesStore.mjs.map +1 -0
  921. package/llms.txt +3 -0
  922. package/package.json +107 -0
  923. package/styles/dashboard.css +2 -0
  924. package/styles/preview.css +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timeline.mjs","names":[],"sources":["../../../../src/web/features/session/Timeline.tsx"],"sourcesContent":["import type { UserMessageActionRunContext, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport {\n AlertIcon,\n Avatar,\n AvatarFallback,\n AvatarImage,\n Button,\n ChevronDownIcon,\n EmptyState,\n ExternalLinkIcon,\n MessageItemGroup,\n QuoteIcon,\n RewindIcon,\n Separator,\n SparklesIcon,\n StreamCursor,\n UserIcon,\n} from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport type { Store } from '@tanstack/store';\nimport { Fragment, memo, type ReactNode, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { fileTabForPath, useActivityGroups, useFileLinks } from '../../lib/composition';\nimport { parseFileMentions } from '../../lib/fileMentions';\nimport { pluginToolRenderer, pluginUserMessageActions } from '../../lib/pluginRegistry';\nimport { focusPrompt } from '../../lib/promptFocus';\nimport {\n isSupportedImageMimeType,\n type ProfileIdentity,\n type SessionState,\n type TimelineEntry,\n type ToolEntry,\n} from '../../lib/sessionModel';\nimport { personaInitials } from '../../lib/sessionSummary';\nimport { groupSummary, groupTone, timelineUnits } from '../../lib/timelineGroups';\nimport { appendComposerQuote } from '../../stores/composerStore';\nimport { sessionsStore } from '../../stores/sessionsStore';\nimport {\n requestOlderHistory,\n requestNewerHistory,\n requestLatestHistory,\n rewindToMessage,\n sessionStoreFor,\n submitMessageWithAck,\n useActiveSession,\n} from '../../stores/sessionStore';\nimport { openTransientTab } from '../../stores/transientTabsStore';\nimport { useOpenTab } from '../../stores/useOpenTab';\nimport { usePluginSlotProps } from '../../stores/usePluginSlotProps';\nimport { useWebPluginRegistry } from '../../stores/useWebPluginRegistry';\nimport { MentionPreviews } from './MentionPreviews';\nimport { MessageMarkdown, type MessageFileLinkHandler } from './MessageMarkdown';\nimport { ToolCard } from './ToolCard';\n\nconst SUGGESTIONS = [\n 'Review the working tree and summarise the diff',\n 'Run the affected nx targets and report failures',\n 'Explain how the session socket handshake works',\n];\n\n/** Closer than this to the end counts as reading the latest, so new frames keep the view pinned. */\nconst PINNED_THRESHOLD_PX = 200;\n/** Closer than this to the top asks for the window above, before the reader hits the edge. */\nconst PAGE_BACK_THRESHOLD_PX = 400;\n/**\n * Entries at the end that are never skipped.\n *\n * Containment makes a skipped entry report its placeholder height, so a\n * transcript whose tail is contained has a scroll height that is only an\n * estimate, and following the newest line lands short of it. The tail is also\n * the part a reader is nearly always looking at, so there is nothing to skip\n * there; everything above it is what makes a long session slow.\n */\n\nfunction noticeHref(line: string): string | null {\n if (/\\s/u.test(line) || !/^https?:\\/\\//i.test(line)) return null;\n\n try {\n const url = new URL(line);\n if ((url.protocol !== 'http:' && url.protocol !== 'https:') || !url.host || url.username || url.password) {\n return null;\n }\n return url.href;\n } catch {\n return null;\n }\n}\n\n/** Two letters from a persona name, so a profile without an icon is still distinct. */\nfunction SpeakerAvatar({ speaker, identity }: { speaker: 'assistant' | 'user'; identity?: ProfileIdentity | null }) {\n if (speaker === 'assistant') {\n // The icon arrives as a bounded data URL on the journalled identity entry,\n // so a persona without one, or with one that failed to load, still renders.\n const label = identity?.name ?? identity?.profile ?? 'Po';\n const fallback = identity ? personaInitials(label) : 'PO';\n return (\n <Avatar aria-label={label} className=\"size-9 shrink-0 border border-doom-border-soft bg-doom-deep p-1\">\n <AvatarImage src={identity?.icon ?? '/favicon.svg'} alt=\"\" />\n <AvatarFallback className=\"text-doom-magenta\">{fallback}</AvatarFallback>\n </Avatar>\n );\n }\n\n return (\n <Avatar aria-label=\"You\" className=\"size-9 shrink-0 border border-doom-border bg-doom-panel\">\n <AvatarFallback className=\"bg-doom-panel text-doom-dim\">\n <UserIcon aria-hidden=\"true\" className=\"size-4\" />\n </AvatarFallback>\n </Avatar>\n );\n}\n\ntype UserMessageActions = ReturnType<typeof pluginUserMessageActions>;\n\nfunction MessageActions({\n actions,\n disabled,\n actionsDisabled,\n onQuote,\n onRewind,\n userMessage,\n}: {\n actions: UserMessageActions;\n disabled: boolean;\n actionsDisabled: boolean;\n onQuote: () => void;\n onRewind: () => void;\n userMessage?: UserMessageActionRunContext;\n}) {\n return (\n <div\n data-testid=\"entry-actions\"\n className=\"pointer-events-none absolute right-1 bottom-0 z-10 flex max-w-[calc(100%-0.5rem)] translate-y-1/2 flex-wrap justify-end gap-1 rounded-md border border-doom-border-soft bg-doom-panel p-0.5 opacity-0 shadow-sm transition-opacity group-hover/message:pointer-events-auto group-hover/message:opacity-100 group-focus-within/message:pointer-events-auto group-focus-within/message:opacity-100 [@media(hover:none)]:pointer-events-auto [@media(hover:none)]:opacity-100\"\n >\n {userMessage\n ? actions.map((action) => {\n const ActionIcon = action.icon;\n return (\n <Button\n key={`${action.pluginId}.${action.id}`}\n variant=\"subtle\"\n size={ActionIcon ? 'icon' : 'sm'}\n data-testid=\"entry-plugin-action\"\n aria-label={action.label}\n title={action.label}\n disabled={actionsDisabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => action.run(userMessage)}\n className={ActionIcon ? 'border-0 shadow-none' : 'h-6 border-0 px-2 shadow-none'}\n >\n {ActionIcon ? <ActionIcon aria-hidden={true} className=\"h-3 w-3\" /> : action.label}\n </Button>\n );\n })\n : null}\n <Button\n variant=\"subtle\"\n size=\"icon\"\n data-testid=\"entry-rewind\"\n aria-label=\"Rewind to message\"\n title={disabled ? 'Wait for the current response before rewinding' : 'Rewind to message'}\n disabled={disabled || actionsDisabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onRewind}\n className=\"border-0 shadow-none\"\n >\n <RewindIcon aria-hidden=\"true\" className=\"h-3 w-3\" />\n </Button>\n <Button\n variant=\"subtle\"\n size=\"icon\"\n data-testid=\"entry-quote\"\n aria-label=\"Quote message\"\n title=\"Quote message\"\n disabled={actionsDisabled}\n onMouseDown={(event) => event.preventDefault()}\n onClick={onQuote}\n className=\"border-0 shadow-none\"\n >\n <QuoteIcon aria-hidden=\"true\" className=\"h-3 w-3\" />\n </Button>\n </div>\n );\n}\n\n/** The message's wall-clock time, quiet at the end of its first line; nothing when the entry carries none. */\nfunction MessageTime({ timestamp }: { timestamp: number | undefined }) {\n if (timestamp === undefined) return null;\n const at = new Date(timestamp);\n return (\n <time\n data-testid=\"entry-time\"\n dateTime={at.toISOString()}\n className=\"shrink-0 pt-0.5 text-sm text-doom-dim tabular-nums\"\n >\n {at.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' })}\n </time>\n );\n}\nfunction ToolEntryRow({\n entry,\n slotProps,\n statuses,\n}: {\n entry: Extract<TimelineEntry, { kind: 'tool' }>;\n slotProps: WebPluginSlotProps;\n statuses: Readonly<Record<string, string>>;\n}) {\n const presentation = pluginToolRenderer(entry.name, statuses)?.timelinePresentation ?? 'tool';\n return (\n <div\n data-testid=\"entry-tool-row\"\n data-tool-presentation={presentation}\n className={presentation === 'tool' ? 'min-w-0 sm:pl-12' : 'min-w-0'}\n >\n <ToolCard entry={entry} slotProps={slotProps} statuses={statuses} />\n </div>\n );\n}\n\n/**\n * A run of calls to one tool, under one frame, indented to the message column. The rows\n * inside are the same cards the tool renders on its own; the group only takes\n * their border, so each call still opens and closes by itself.\n */\nfunction ToolGroupRow({\n name,\n entries,\n slotProps,\n statuses,\n}: {\n name: string;\n entries: readonly ToolEntry[];\n slotProps: WebPluginSlotProps;\n statuses: Readonly<Record<string, string>>;\n}) {\n return (\n <div data-testid=\"entry-tool-row\" data-tool-presentation=\"tool\" className=\"min-w-0 sm:pl-12\">\n <MessageItemGroup\n data-testid=\"entry-tool-group\"\n data-tool-name={name}\n data-tool-count={entries.length}\n tone={groupTone(entries)}\n title={name}\n summary={`· ${groupSummary(entries)}`}\n className=\"min-w-0\"\n >\n {entries.map((entry) => (\n <ToolCard key={entry.id} entry={entry} slotProps={slotProps} statuses={statuses} />\n ))}\n </MessageItemGroup>\n </div>\n );\n}\ninterface EntryProps {\n entry: TimelineEntry;\n onFileLink: MessageFileLinkHandler;\n pluginActions: UserMessageActions;\n sessionId: string | null;\n sessionIdentity: ProfileIdentity | null;\n sessionStreaming: boolean;\n runtimeActionsDisabled: boolean;\n slotProps: WebPluginSlotProps;\n toolStatuses: Readonly<Record<string, string>>;\n /** A grid card or thread fold: prose drops from the conversation's 15px to 13px. */\n compact: boolean;\n}\n\nconst Entry = memo(function Entry({\n entry,\n onFileLink,\n pluginActions,\n sessionId,\n sessionIdentity,\n sessionStreaming,\n runtimeActionsDisabled,\n slotProps,\n toolStatuses,\n compact,\n}: EntryProps) {\n const quoteSource = useRef<HTMLDivElement>(null);\n const quoteMessage = (text: string): void => {\n const selection = window.getSelection();\n const source = quoteSource.current;\n const selected =\n source !== null &&\n selection !== null &&\n !selection.isCollapsed &&\n selection.anchorNode !== null &&\n selection.focusNode !== null &&\n source.contains(selection.anchorNode) &&\n source.contains(selection.focusNode)\n ? selection.toString()\n : text;\n const caret = appendComposerQuote(sessionId, selected);\n if (caret !== null) requestAnimationFrame(() => focusPrompt(caret));\n };\n\n if (entry.kind === 'user') {\n return (\n <div data-testid=\"entry-user\" className=\"group/message flex flex-row-reverse items-start gap-3\">\n <SpeakerAvatar speaker=\"user\" />\n {/* Mirrored and shrink-wrapped, so who spoke reads at a glance. */}\n <div className=\"relative min-w-0 max-w-4/5\">\n <div\n ref={quoteSource}\n className={`flex flex-col gap-2 rounded-lg bg-doom-rail px-4 py-3 leading-relaxed break-words text-doom-hi ${compact ? 'text-base' : 'text-lg'}`}\n >\n <div className=\"flex items-start gap-4\">\n <div className=\"min-w-0 flex-1\">\n <MessageMarkdown sessionId={sessionId} onFileLink={onFileLink} text={entry.text} />\n </div>\n <MessageTime timestamp={entry.timestamp} />\n </div>\n {entry.images && entry.images.length > 0 ? (\n <div data-testid=\"user-attachments\" className=\"flex flex-wrap gap-2\">\n {entry.images\n .filter((image) => isSupportedImageMimeType(image.mimeType))\n .map((image, index) => (\n <img\n key={`${image.mimeType}:${image.data.slice(0, 24)}:${String(index)}`}\n src={`data:${image.mimeType};base64,${image.data}`}\n alt={`Attachment ${String(index + 1)}`}\n data-testid=\"user-attached-image\"\n className=\"h-auto max-h-80 max-w-full rounded-md object-contain\"\n />\n ))}\n </div>\n ) : null}\n {sessionId ? (\n <MentionPreviews sessionId={sessionId} mentions={parseFileMentions(entry.text)} onFileLink={onFileLink} />\n ) : null}\n </div>\n <MessageActions\n actions={pluginActions}\n disabled={sessionStreaming}\n actionsDisabled={runtimeActionsDisabled}\n onQuote={() => quoteMessage(entry.text)}\n onRewind={() => rewindToMessage(entry.id, sessionId)}\n userMessage={\n sessionId !== null && entry.text.trim().length > 0\n ? { sessionId, messageId: entry.id, text: entry.text }\n : undefined\n }\n />\n </div>\n </div>\n );\n }\n\n if (entry.kind === 'assistant') {\n return (\n <div\n data-testid=\"entry-assistant\"\n data-streaming={entry.streaming}\n className=\"group/message flex items-start gap-3\"\n >\n <SpeakerAvatar speaker=\"assistant\" identity={entry.identity ?? sessionIdentity} />\n <div className=\"relative min-w-0 flex-1\">\n <div className=\"flex items-start gap-4 px-1 pt-1.5\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n {entry.thinking ? (\n <div\n data-testid=\"entry-thinking\"\n // Thinking stays quiet and neutral, even when its Markdown source\n // uses strong emphasis for status updates.\n className={`font-normal text-doom-dim [&_p]:whitespace-pre-wrap [&_strong]:font-normal [&_strong]:text-doom-dim ${compact ? 'text-sm' : 'text-base'}`}\n >\n <MessageMarkdown sessionId={sessionId} onFileLink={onFileLink} text={entry.thinking} />\n </div>\n ) : null}\n <div\n ref={quoteSource}\n data-testid=\"entry-text\"\n className={`leading-relaxed break-words text-doom-text ${compact ? 'text-base' : 'text-lg'}`}\n >\n <MessageMarkdown sessionId={sessionId} onFileLink={onFileLink} text={entry.text} />\n {entry.streaming ? <StreamCursor /> : null}\n </div>\n </div>\n {entry.streaming ? null : <MessageTime timestamp={entry.timestamp} />}\n </div>\n <MessageActions\n actions={pluginActions}\n disabled={sessionStreaming}\n actionsDisabled={runtimeActionsDisabled}\n onQuote={() => quoteMessage(entry.text)}\n onRewind={() => rewindToMessage(entry.id, sessionId)}\n />\n </div>\n </div>\n );\n }\n\n if (entry.kind === 'tool') return <ToolEntryRow entry={entry} slotProps={slotProps} statuses={toolStatuses} />;\n\n if (entry.kind === 'settled') {\n return (\n <div data-testid=\"entry-settled\" className=\"flex items-center gap-3 sm:pl-12\">\n <Separator className=\"flex-1\" />\n <span className=\"text-sm text-doom-dim\">\n Agent settled{entry.tools > 0 ? ` · ${entry.tools} tool${entry.tools === 1 ? '' : 's'}` : ''}\n </span>\n <Separator className=\"flex-1\" />\n </div>\n );\n }\n\n if (entry.kind === 'queued') return null;\n // A notice: the agent's own aside (a mode switch, a refusal). Only an error\n // shouts; an informational one reads as a quiet line in Po's voice.\n const isError = entry.tone === 'error';\n return (\n <div data-testid=\"entry-notice\" data-tone={entry.tone} className=\"flex items-start gap-2.5\">\n <span\n aria-hidden\n className={`grid size-5 shrink-0 place-items-center rounded-full ${\n isError ? 'bg-doom-tint-red text-doom-red' : 'bg-doom-tint-green text-doom-green'\n }`}\n >\n {isError ? <AlertIcon className=\"size-3.5\" /> : <SparklesIcon className=\"size-3\" />}\n </span>\n <p\n className={`min-w-0 flex-1 whitespace-pre-wrap break-words text-base ${isError ? 'text-doom-red' : 'text-doom-dim'}`}\n >\n {entry.text.split(/(\\s+)/u).map((part, index) => {\n const href = noticeHref(part);\n return (\n <Fragment key={index}>\n {href === null ? (\n part\n ) : (\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className=\"underline underline-offset-2\">\n {part}\n </a>\n )}\n </Fragment>\n );\n })}\n </p>\n </div>\n );\n}, entriesEqual);\n\nfunction entriesEqual(previous: EntryProps, next: EntryProps): boolean {\n if (previous.entry !== next.entry || previous.sessionId !== next.sessionId || previous.compact !== next.compact)\n return false;\n if (next.entry.kind === 'tool') {\n return previous.slotProps === next.slotProps && previous.toolStatuses === next.toolStatuses;\n }\n if (next.entry.kind === 'user') {\n return (\n previous.onFileLink === next.onFileLink &&\n previous.pluginActions === next.pluginActions &&\n previous.sessionStreaming === next.sessionStreaming &&\n previous.runtimeActionsDisabled === next.runtimeActionsDisabled\n );\n }\n if (next.entry.kind === 'assistant') {\n return (\n previous.onFileLink === next.onFileLink &&\n previous.sessionIdentity === next.sessionIdentity &&\n previous.sessionStreaming === next.sessionStreaming &&\n previous.runtimeActionsDisabled === next.runtimeActionsDisabled\n );\n }\n return true;\n}\n\nfunction BackgroundWorkNotice() {\n return (\n <output data-testid=\"background-work-notice\" className=\"mt-auto flex shrink-0 justify-center px-3 pt-2 pb-3\">\n <span className=\"max-w-lg rounded-md border border-doom-yellow/40 bg-doom-panel px-3 py-2 text-center text-sm leading-relaxed text-doom-yellow\">\n Background work is still running. The agent will resume when results are ready.\n </span>\n </output>\n );\n}\n\n/**\n * One transcript, whichever fold it reads: the focused session's own, or a\n * thread of it. Owns the scroll pinning; the caller owns the empty state and\n * the session the entries' tool cards act on.\n *\n * `limit` and `compact` are for a fold that is not a whole surface, such as a\n * grid card: only the newest entries, drawn tighter, with no history paging\n * and no jump control, because a card is a glance and not a place to read.\n */\nexport function Transcript({\n store,\n sessionId,\n historyKey = sessionId,\n empty,\n testId = 'timeline',\n backgroundWorkActive = false,\n runtimeActionsDisabled = false,\n limit,\n compact = false,\n}: {\n store: Store<SessionState>;\n sessionId: string | null;\n historyKey?: string | null;\n empty: ReactNode;\n testId?: string;\n backgroundWorkActive?: boolean;\n runtimeActionsDisabled?: boolean;\n limit?: number;\n compact?: boolean;\n}) {\n 'use no memo';\n const entries = useStore(store, (state) => state.entries);\n const hasNewerHistory = useStore(store, (state) => state.hasNewerHistory);\n // Pi's protocol transcript carries no persona, and a history window taken from\n // the middle of a session carries no identity entry either, so an entry from\n // those paths has no stamp of its own. The fold's current persona is the honest\n // answer for one of them, and it corrects itself when the identity lands late,\n // which a stamp written at merge time cannot do.\n const sessionIdentity = useStore(store, (state) => state.profileIdentity);\n const sessionStreaming = useActiveSession((state) => state.streaming);\n const toolStatuses = useActiveSession((state) => state.statuses);\n const resolveFileLink = useFileLinks(sessionId);\n const openTab = useOpenTab();\n const registryRevision = useWebPluginRegistry();\n const slotProps = usePluginSlotProps(sessionId);\n const pluginActions = useMemo(() => {\n void registryRevision;\n return pluginUserMessageActions();\n }, [registryRevision]);\n const onFileLink = useCallback<MessageFileLinkHandler>(\n (label, explicit = false) => {\n if (sessionId === null) return undefined;\n const tab = explicit ? fileTabForPath(sessionId, label) : resolveFileLink(label);\n if (tab === undefined) return undefined;\n return () => {\n openTransientTab(sessionId, tab);\n openTab(tab.id);\n };\n },\n [openTab, resolveFileLink, sessionId],\n );\n const visibleEntries = useMemo(() => {\n const shown = entries.filter((entry) => entry.kind !== 'queued');\n return limit === undefined ? shown : shown.slice(-limit);\n }, [entries, limit]);\n // A tool that presents itself as a message has no frame to share, so only\n // the card-shaped ones are gathered into runs.\n const units = useMemo(() => {\n void registryRevision;\n return timelineUnits(\n visibleEntries,\n (name) => (pluginToolRenderer(name, toolStatuses)?.timelinePresentation ?? 'tool') === 'tool',\n );\n }, [registryRevision, toolStatuses, visibleEntries]);\n const scroller = useRef<HTMLDivElement>(null);\n const unitKey = useCallback(\n (index: number): string => {\n const unit = units[index]!;\n return unit.kind === 'group' ? `group-${unit.entries[0]?.id ?? ''}` : unit.entry.id;\n },\n [units],\n );\n // This component opts out of compiler memoization because the virtualizer is mutable.\n // oxlint-disable-next-line react/incompatible-library\n const virtualizer = useVirtualizer({\n count: units.length,\n getScrollElement: () => scroller.current,\n estimateSize: () => 80,\n overscan: 8,\n getItemKey: unitKey,\n initialRect: { width: 0, height: 800 },\n });\n // Rows start at the 80px estimate and grow once measured. The layout effect\n // watches this so a measured row is followed like a new one.\n const totalSize = virtualizer.getTotalSize();\n // The transcript's height as of the last entry. Whether to follow the newest\n // line is decided against this rather than against a scroll event, because\n // an event fires after the fact and a fast run can grow the transcript\n // before the browser has reported the reader's scroll.\n const lastHeight = useRef(0);\n const lastLayoutEntries = useRef(visibleEntries);\n const following = useRef(true);\n const [unread, setUnread] = useState(false);\n // Where the bottom of the transcript sat before a window was prepended.\n // Restoring against this is what keeps the reader's place: prepending grows\n // the scroll height above them, and the browser would otherwise leave the\n // viewport where it was and the content would appear to jump.\n const anchor = useRef<{ key: string; offset: number } | null>(null);\n // The first entry's key. A window prepended above the reader changes it, and\n // nothing else does: an entry arriving at the bottom, or the streaming one\n // growing, leaves the top of the transcript alone. That is the difference\n // between holding the reader's place and refusing to follow a live run.\n const firstId = useRef<string | null>(null);\n\n const atBottom = (element: HTMLDivElement, height: number): boolean =>\n element.scrollTop + element.clientHeight >= height - PINNED_THRESHOLD_PX;\n\n const followLatest = (): void => {\n const element = scroller.current;\n if (!element || !following.current) return;\n element.scrollTop = Math.max(0, element.scrollHeight - element.clientHeight);\n setUnread(false);\n };\n\n const jumpToLatest = (): void => {\n following.current = true;\n setUnread(false);\n if (!requestLatestHistory(historyKey)) followLatest();\n };\n\n /** Reaching the bottom by hand is the same as never having left it. */\n const onScroll = (): void => {\n const element = scroller.current;\n if (!element) return;\n const bottom = atBottom(element, element.scrollHeight);\n following.current = bottom;\n if (bottom) setUnread(false);\n // A compact fold shows a fixed tail of a live thread; asking for the\n // window above it would page history nobody can read there.\n if (\n !compact &&\n ((element.scrollTop <= PAGE_BACK_THRESHOLD_PX && requestOlderHistory(historyKey)) ||\n (bottom && requestNewerHistory(historyKey)))\n ) {\n following.current = false;\n const item = virtualizer.getVirtualItems().find((candidate) => candidate.end > element.scrollTop);\n if (item) anchor.current = { key: String(item.key), offset: element.scrollTop - item.start };\n }\n };\n\n /** Wheel input is explicit intent to leave the live tail. */\n const onWheel = (): void => {\n following.current = false;\n };\n\n // A different fold starts at the bottom of its transcript. The unread badge\n // is cleared during render so the new fold never paints the old fold's badge;\n // the scroll bookkeeping stays in the layout effect, where refs belong.\n const [shownStore, setShownStore] = useState(store);\n if (shownStore !== store) {\n setShownStore(store);\n setUnread(false);\n }\n useLayoutEffect(() => {\n lastHeight.current = 0;\n firstId.current = null;\n anchor.current = null;\n following.current = true;\n }, [store]);\n\n useLayoutEffect(() => {\n const element = scroller.current;\n if (!element) return;\n const entriesChanged = lastLayoutEntries.current !== visibleEntries;\n lastLayoutEntries.current = visibleEntries;\n // Registry/status regrouping can resize unchanged entries. A no-op regroup\n // must not manufacture unread activity for someone reading older content.\n if (!entriesChanged && element.scrollHeight === lastHeight.current) return;\n // A prepended window grew the transcript upwards; hold the reader where\n // they were by moving down by exactly what appeared above them.\n const held = anchor.current;\n const prepended =\n visibleEntries.length > 0 && firstId.current !== null && visibleEntries[0]?.id !== firstId.current;\n firstId.current = visibleEntries[0]?.id ?? null;\n if (held !== null && prepended) {\n anchor.current = null;\n const index = units.findIndex((_unit, position) => unitKey(position) === held.key);\n if (index >= 0) {\n const offset = virtualizer.getOffsetForIndex(index, 'start')?.[0];\n if (offset !== undefined) element.scrollTop = offset + held.offset;\n lastHeight.current = element.scrollHeight;\n return;\n }\n }\n // The first layout and later streaming growth pin directly to the live tail.\n // Repeated easing fights the changing target and makes token streaming jitter.\n if (lastHeight.current === 0) {\n element.scrollTop = element.scrollHeight;\n lastHeight.current = element.scrollHeight;\n following.current = true;\n setUnread(false);\n return;\n }\n // Measuring a row the estimate got wrong grows the transcript with nothing\n // new in it. A reader sitting on the old bottom stays on the bottom, and\n // nobody else is told there is new activity, because there is none.\n if (!entriesChanged) {\n const pinned = element.scrollTop + element.clientHeight >= lastHeight.current - 1;\n lastHeight.current = element.scrollHeight;\n if (pinned) {\n following.current = true;\n followLatest();\n }\n return;\n }\n const shouldFollow = following.current || atBottom(element, lastHeight.current);\n lastHeight.current = element.scrollHeight;\n if (shouldFollow) {\n following.current = true;\n setUnread(false);\n followLatest();\n return;\n }\n setUnread(true);\n }, [units, visibleEntries, virtualizer, unitKey, totalSize]);\n\n if (visibleEntries.length === 0) {\n return (\n <div className=\"relative flex min-h-0 flex-1 flex-col overflow-y-auto\">\n {empty}\n {backgroundWorkActive ? <BackgroundWorkNotice /> : null}\n </div>\n );\n }\n\n return (\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <div\n ref={scroller}\n onScroll={onScroll}\n onWheel={onWheel}\n data-testid={testId}\n className={compact ? 'flex-1 overflow-y-auto px-2.5 py-2' : 'flex-1 overflow-y-auto px-2 py-4 sm:py-5'}\n >\n <div style={{ height: totalSize, position: 'relative', width: '100%' }}>\n {virtualizer.getVirtualItems().map((row) => {\n const unit = units[row.index]!;\n return (\n <div\n key={row.key}\n data-index={row.index}\n ref={virtualizer.measureElement}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n transform: `translateY(${row.start}px)`,\n paddingBottom: compact ? 8 : 20,\n }}\n >\n {unit.kind === 'group' ? (\n <ToolGroupRow name={unit.name} entries={unit.entries} slotProps={slotProps} statuses={toolStatuses} />\n ) : (\n <Entry\n entry={unit.entry}\n onFileLink={onFileLink}\n pluginActions={pluginActions}\n sessionId={sessionId}\n sessionIdentity={sessionIdentity}\n sessionStreaming={sessionStreaming}\n runtimeActionsDisabled={runtimeActionsDisabled}\n slotProps={slotProps}\n toolStatuses={toolStatuses}\n compact={compact}\n />\n )}\n </div>\n );\n })}\n </div>\n {backgroundWorkActive ? <BackgroundWorkNotice /> : null}\n </div>\n {(unread || hasNewerHistory) && !compact ? (\n <Button\n variant=\"subtle\"\n size=\"sm\"\n data-testid=\"timeline-jump\"\n onClick={jumpToLatest}\n className=\"absolute bottom-3 left-1/2 -translate-x-1/2 border border-doom-border shadow-lg animate-doom-rise\"\n >\n <ChevronDownIcon className=\"h-3 w-3\" />\n New activity below\n </Button>\n ) : null}\n </div>\n );\n}\n\n/** The focused session's conversation, with saved history readable before wake. */\nexport function Timeline() {\n const activeId = useStore(sessionsStore, (state) => state.activeId);\n const dormant = useStore(\n sessionsStore,\n (state) => state.activeId !== null && state.byId[state.activeId]?.summary.dormant === true,\n );\n const idle = useStore(\n sessionsStore,\n (state) => state.activeId !== null && state.byId[state.activeId]?.summary.phase === 'idle',\n );\n const statuses = useActiveSession((state) => state.statuses);\n const widgets = useActiveSession((state) => state.widgets);\n const settled = useActiveSession((state) => state.settled);\n // Only worth saying once the agent has stopped: while it is still running the\n // transcript already shows the work, and the notice would just be noise.\n const hasActiveWork = useActivityGroups(statuses, widgets, activeId).some((group) => group.active);\n const backgroundWorkActive = idle && settled && hasActiveWork;\n return (\n <Transcript\n store={sessionStoreFor(activeId)}\n sessionId={activeId}\n runtimeActionsDisabled={dormant}\n backgroundWorkActive={backgroundWorkActive}\n empty={\n <EmptyState\n data-testid=\"timeline\"\n title={<span className=\"text-xl\">No messages yet</span>}\n description={\n dormant\n ? 'There is no saved conversation to show yet. Waking starts the agent again when you are ready.'\n : 'This session is attached and waiting. Anything you send goes straight to the supervised agent.'\n }\n >\n {dormant ? null : (\n <div data-testid=\"timeline-empty\" className=\"mt-2 flex w-full flex-col gap-1.5\">\n {SUGGESTIONS.map((suggestion, index) => (\n <Button\n key={suggestion}\n variant=\"outline\"\n size=\"lg\"\n data-testid={`suggestion-${index}`}\n onClick={() => {\n void submitMessageWithAck(suggestion);\n }}\n className=\"h-auto justify-between bg-doom-panel px-3 py-2 text-left font-normal text-doom-text\"\n >\n <span className=\"flex-1 truncate\">{suggestion}</span>\n <ExternalLinkIcon className=\"h-3 w-3 shrink-0 text-doom-faint\" />\n </Button>\n ))}\n </div>\n )}\n </EmptyState>\n }\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,210 @@
1
+ const require_pluginRegistry = require("../../lib/pluginRegistry.cjs");
2
+ const require_sessionModel = require("../../lib/sessionModel.cjs");
3
+ const require_toolMessageProps = require("../../lib/toolMessageProps.cjs");
4
+ const require_ToolRendererBoundary = require("../../components/ToolRendererBoundary.cjs");
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let _agimon_ai_po_web_components = require("@agimon-ai/po-web-components");
8
+ //#region src/web/features/session/ToolCard.tsx
9
+ const MAX_PREVIEW_LINES = 12;
10
+ function isRecord(value) {
11
+ return typeof value === "object" && value !== null && !Array.isArray(value);
12
+ }
13
+ function attachmentKind(mimeType) {
14
+ if (mimeType.startsWith("image/")) return "image";
15
+ if (mimeType.startsWith("audio/")) return "audio";
16
+ if (mimeType.startsWith("video/")) return "video";
17
+ if (mimeType === "application/pdf") return "pdf";
18
+ if (mimeType.startsWith("text/")) return "text";
19
+ return "file";
20
+ }
21
+ function attachmentName(block, index) {
22
+ for (const key of [
23
+ "title",
24
+ "name",
25
+ "filename",
26
+ "fileName"
27
+ ]) if (typeof block[key] === "string" && block[key].length > 0) return block[key];
28
+ if (typeof block.uri === "string" && block.uri.length > 0) return block.uri.split("/").at(-1) || block.uri;
29
+ return `attachment-${String(index + 1)}`;
30
+ }
31
+ /** Binary and linked result blocks a tool returned outside its ordinary text. */
32
+ function hostAttachments(entry) {
33
+ const content = entry.result?.content ?? [];
34
+ const images = require_sessionModel.imagesFromContent(content).map((image, index) => ({
35
+ kind: "image",
36
+ mimeType: image.mimeType,
37
+ name: `${entry.name}-result-${String(index + 1)}`,
38
+ data: image.data
39
+ }));
40
+ const details = isRecord(entry.result?.details) ? entry.result.details : void 0;
41
+ const other = [...content, ...Array.isArray(details?.blocks) ? details.blocks : []].flatMap((candidate, index) => {
42
+ if (!isRecord(candidate) || candidate.type === "text" || candidate.type === "image") return [];
43
+ const resource = candidate.type === "resource" && isRecord(candidate.resource) ? candidate.resource : candidate;
44
+ const mimeType = typeof resource.mimeType === "string" ? resource.mimeType : "application/octet-stream";
45
+ const data = typeof resource.data === "string" ? resource.data : typeof resource.blob === "string" ? resource.blob : void 0;
46
+ const text = typeof resource.text === "string" ? resource.text : void 0;
47
+ const uri = typeof resource.uri === "string" ? resource.uri : void 0;
48
+ if (data === void 0 && text === void 0 && uri === void 0) return [];
49
+ return [{
50
+ kind: attachmentKind(mimeType),
51
+ mimeType,
52
+ name: attachmentName(resource, index),
53
+ data,
54
+ text,
55
+ uri
56
+ }];
57
+ });
58
+ return [...images, ...other];
59
+ }
60
+ function attachmentUrl(attachment) {
61
+ if (attachment.data !== void 0) return `data:${attachment.mimeType};base64,${attachment.data}`;
62
+ if (attachment.uri === void 0) return void 0;
63
+ return /^(?:https?):\/\//u.test(attachment.uri) ? attachment.uri : void 0;
64
+ }
65
+ function HostAttachmentView({ attachment, index }) {
66
+ const url = attachmentUrl(attachment);
67
+ if (attachment.kind === "text" && attachment.text !== void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
68
+ "data-testid": "tool-output-text-file",
69
+ className: "max-h-96 overflow-auto whitespace-pre-wrap break-words rounded-md border border-doom-border-soft p-2",
70
+ children: attachment.text
71
+ });
72
+ if (url !== void 0 && attachment.kind === "image") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
73
+ href: url,
74
+ target: "_blank",
75
+ rel: "noreferrer",
76
+ className: "self-start",
77
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
78
+ src: url,
79
+ alt: attachment.name,
80
+ "data-testid": "tool-output-image",
81
+ className: "h-auto max-h-96 max-w-full rounded-md border border-doom-border-soft object-contain"
82
+ })
83
+ });
84
+ if (url !== void 0 && attachment.kind === "video") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("video", {
85
+ src: url,
86
+ controls: true,
87
+ preload: "metadata",
88
+ "data-testid": "tool-output-video",
89
+ className: "max-h-96 max-w-full self-start rounded-md border border-doom-border-soft",
90
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("track", { kind: "captions" })
91
+ });
92
+ if (url !== void 0 && attachment.kind === "audio") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("audio", {
93
+ src: url,
94
+ controls: true,
95
+ preload: "metadata",
96
+ "data-testid": "tool-output-audio",
97
+ className: "w-full",
98
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("track", { kind: "captions" })
99
+ });
100
+ if (url !== void 0 && attachment.kind === "pdf") return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("iframe", {
101
+ src: url,
102
+ title: attachment.name,
103
+ "data-testid": "tool-output-pdf",
104
+ className: "h-[480px] w-full rounded-md border border-doom-border-soft bg-doom-deep"
105
+ });
106
+ return url !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
107
+ href: url,
108
+ download: attachment.name,
109
+ target: "_blank",
110
+ rel: "noreferrer",
111
+ "data-testid": "tool-output-file",
112
+ className: "self-start rounded-md border border-doom-border px-3 py-2 text-doom-blue hover:border-doom-blue/60",
113
+ children: [
114
+ attachment.name,
115
+ " · ",
116
+ attachment.mimeType
117
+ ]
118
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
119
+ "data-testid": "tool-output-file",
120
+ className: "self-start rounded-md border border-doom-border px-3 py-2 text-base text-doom-dim",
121
+ children: [
122
+ attachment.name,
123
+ " · ",
124
+ attachment.mimeType
125
+ ]
126
+ }, index);
127
+ }
128
+ function toneOf(entry) {
129
+ return entry.running ? "running" : entry.isError ? "error" : "ok";
130
+ }
131
+ /**
132
+ * The host's own item for a tool no plugin claims: the argument summary in
133
+ * the header and the result's text and safe browser previews, with long text
134
+ * clipped until expanded, on the same shell every plugin message is built from.
135
+ */
136
+ function HostToolMessage({ entry }) {
137
+ const lines = entry.output.length > 0 ? entry.output.split("\n") : [];
138
+ const attachments = hostAttachments(entry);
139
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_agimon_ai_po_web_components.MessageItem, {
140
+ tone: toneOf(entry),
141
+ expandable: lines.length > MAX_PREVIEW_LINES,
142
+ children: ({ expanded }) => {
143
+ const { shown, hidden } = (0, _agimon_ai_po_web_components.collapseLines)(lines, MAX_PREVIEW_LINES, expanded);
144
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_agimon_ai_po_web_components.MessageItemHeader, {
145
+ title: entry.name,
146
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
147
+ className: "min-w-0 flex-1 truncate",
148
+ children: entry.argSummary
149
+ })
150
+ }), shown.length > 0 || attachments.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_agimon_ai_po_web_components.MessageItemBody, {
151
+ className: "flex flex-col gap-2",
152
+ children: [
153
+ shown.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
154
+ "data-testid": "tool-output",
155
+ className: "whitespace-pre-wrap break-words",
156
+ children: shown.join("\n")
157
+ }) : null,
158
+ attachments.map((attachment, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostAttachmentView, {
159
+ attachment,
160
+ index
161
+ }, `${attachment.mimeType}:${attachment.name}:${String(index)}`)),
162
+ hidden > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_agimon_ai_po_web_components.MessageItemStatus, {
163
+ expands: true,
164
+ children: [
165
+ "show ",
166
+ hidden,
167
+ " more line(s)"
168
+ ]
169
+ }) : null
170
+ ]
171
+ }) : null] });
172
+ }
173
+ });
174
+ }
175
+ /**
176
+ * One tool call in the timeline. The plugin that registered the tool owns
177
+ * the whole item through its `message` renderer, the web half of the TUI's
178
+ * renderShell 'self'; the host only marks the row, catches a renderer that
179
+ * throws, and stands in for a tool nobody claims.
180
+ */
181
+ const ToolCard = (0, react.memo)(function ToolCard({ entry, slotProps, statuses }) {
182
+ const renderer = require_pluginRegistry.pluginToolRenderer(entry.name, statuses, entry.result?.details);
183
+ const state = toneOf(entry);
184
+ const props = require_toolMessageProps.toolMessageProps(slotProps, entry, statuses);
185
+ const hookStatus = statuses[`repository-hooks:${entry.toolCallId}:post`]?.trim();
186
+ const hookBadge = hookStatus ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_agimon_ai_po_web_components.StatusBadge, {
187
+ tone: "running",
188
+ title: hookStatus,
189
+ "aria-label": hookStatus,
190
+ "data-testid": "tool-hook-status",
191
+ children: "HOOK"
192
+ }) : null;
193
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_ToolRendererBoundary.ToolRendererBoundary, {
194
+ toolName: entry.name,
195
+ children: (failed) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
196
+ "data-testid": "entry-tool",
197
+ "data-tool-name": entry.name,
198
+ "data-tool-state": state,
199
+ "data-tool-renderer": failed ? "failed" : renderer ? "plugin" : "host",
200
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_agimon_ai_po_web_components.MessageItemHeaderAccessoryContext, {
201
+ value: hookBadge,
202
+ children: renderer && !failed ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(renderer.message, { ...props }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostToolMessage, { entry })
203
+ })
204
+ })
205
+ }, entry.toolCallId);
206
+ });
207
+ //#endregion
208
+ exports.ToolCard = ToolCard;
209
+
210
+ //# sourceMappingURL=ToolCard.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCard.cjs","names":["imagesFromContent","MessageItem","collapseLines","MessageItemHeader","MessageItemBody","MessageItemStatus","memo","pluginToolRenderer","toolMessageProps","StatusBadge","ToolRendererBoundary","MessageItemHeaderAccessoryContext"],"sources":["../../../../src/web/features/session/ToolCard.tsx"],"sourcesContent":["import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemHeaderAccessoryContext,\n StatusBadge,\n MessageItemStatus,\n type StatusTone,\n} from '@agimon-ai/po-web-components';\nimport { memo } from 'react';\n\nimport { ToolRendererBoundary } from '../../components/ToolRendererBoundary';\nimport { pluginToolRenderer } from '../../lib/pluginRegistry';\nimport { imagesFromContent, type ToolEntry } from '../../lib/sessionModel';\nimport { toolMessageProps } from '../../lib/toolMessageProps';\n\nconst MAX_PREVIEW_LINES = 12;\n\ntype AttachmentKind = 'image' | 'audio' | 'video' | 'pdf' | 'text' | 'file';\n\ninterface HostAttachment {\n kind: AttachmentKind;\n mimeType: string;\n name: string;\n data?: string;\n text?: string;\n uri?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction attachmentKind(mimeType: string): AttachmentKind {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType === 'application/pdf') return 'pdf';\n if (mimeType.startsWith('text/')) return 'text';\n return 'file';\n}\n\nfunction attachmentName(block: Record<string, unknown>, index: number): string {\n for (const key of ['title', 'name', 'filename', 'fileName']) {\n if (typeof block[key] === 'string' && block[key].length > 0) return block[key];\n }\n if (typeof block.uri === 'string' && block.uri.length > 0) return block.uri.split('/').at(-1) || block.uri;\n return `attachment-${String(index + 1)}`;\n}\n\n/** Binary and linked result blocks a tool returned outside its ordinary text. */\nfunction hostAttachments(entry: ToolEntry): HostAttachment[] {\n const content = entry.result?.content ?? [];\n const images: HostAttachment[] = imagesFromContent(content).map((image, index) => ({\n kind: 'image',\n mimeType: image.mimeType,\n name: `${entry.name}-result-${String(index + 1)}`,\n data: image.data,\n }));\n const details = isRecord(entry.result?.details) ? entry.result.details : undefined;\n const blocks = [...content, ...(Array.isArray(details?.blocks) ? details.blocks : [])];\n const other = blocks.flatMap((candidate, index): HostAttachment[] => {\n if (!isRecord(candidate) || candidate.type === 'text' || candidate.type === 'image') return [];\n const resource = candidate.type === 'resource' && isRecord(candidate.resource) ? candidate.resource : candidate;\n const mimeType = typeof resource.mimeType === 'string' ? resource.mimeType : 'application/octet-stream';\n const data =\n typeof resource.data === 'string' ? resource.data : typeof resource.blob === 'string' ? resource.blob : undefined;\n const text = typeof resource.text === 'string' ? resource.text : undefined;\n const uri = typeof resource.uri === 'string' ? resource.uri : undefined;\n if (data === undefined && text === undefined && uri === undefined) return [];\n return [{ kind: attachmentKind(mimeType), mimeType, name: attachmentName(resource, index), data, text, uri }];\n });\n return [...images, ...other];\n}\n\nfunction attachmentUrl(attachment: HostAttachment): string | undefined {\n if (attachment.data !== undefined) return `data:${attachment.mimeType};base64,${attachment.data}`;\n if (attachment.uri === undefined) return undefined;\n return /^(?:https?):\\/\\//u.test(attachment.uri) ? attachment.uri : undefined;\n}\n\nfunction HostAttachmentView({ attachment, index }: { attachment: HostAttachment; index: number }) {\n const url = attachmentUrl(attachment);\n if (attachment.kind === 'text' && attachment.text !== undefined) {\n return (\n <pre\n data-testid=\"tool-output-text-file\"\n className=\"max-h-96 overflow-auto whitespace-pre-wrap break-words rounded-md border border-doom-border-soft p-2\"\n >\n {attachment.text}\n </pre>\n );\n }\n if (url !== undefined && attachment.kind === 'image') {\n return (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className=\"self-start\">\n <img\n src={url}\n alt={attachment.name}\n data-testid=\"tool-output-image\"\n className=\"h-auto max-h-96 max-w-full rounded-md border border-doom-border-soft object-contain\"\n />\n </a>\n );\n }\n if (url !== undefined && attachment.kind === 'video') {\n return (\n <video\n src={url}\n controls\n preload=\"metadata\"\n data-testid=\"tool-output-video\"\n className=\"max-h-96 max-w-full self-start rounded-md border border-doom-border-soft\"\n >\n <track kind=\"captions\" />\n </video>\n );\n }\n if (url !== undefined && attachment.kind === 'audio') {\n return (\n <audio src={url} controls preload=\"metadata\" data-testid=\"tool-output-audio\" className=\"w-full\">\n <track kind=\"captions\" />\n </audio>\n );\n }\n if (url !== undefined && attachment.kind === 'pdf') {\n return (\n <iframe\n src={url}\n title={attachment.name}\n data-testid=\"tool-output-pdf\"\n className=\"h-[480px] w-full rounded-md border border-doom-border-soft bg-doom-deep\"\n />\n );\n }\n return url !== undefined ? (\n <a\n href={url}\n download={attachment.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"tool-output-file\"\n className=\"self-start rounded-md border border-doom-border px-3 py-2 text-doom-blue hover:border-doom-blue/60\"\n >\n {attachment.name} · {attachment.mimeType}\n </a>\n ) : (\n <span\n key={index}\n data-testid=\"tool-output-file\"\n className=\"self-start rounded-md border border-doom-border px-3 py-2 text-base text-doom-dim\"\n >\n {attachment.name} · {attachment.mimeType}\n </span>\n );\n}\n\nfunction toneOf(entry: ToolEntry): StatusTone {\n return entry.running ? 'running' : entry.isError ? 'error' : 'ok';\n}\n\n/**\n * The host's own item for a tool no plugin claims: the argument summary in\n * the header and the result's text and safe browser previews, with long text\n * clipped until expanded, on the same shell every plugin message is built from.\n */\nfunction HostToolMessage({ entry }: { entry: ToolEntry }) {\n const lines = entry.output.length > 0 ? entry.output.split('\\n') : [];\n const attachments = hostAttachments(entry);\n return (\n <MessageItem tone={toneOf(entry)} expandable={lines.length > MAX_PREVIEW_LINES}>\n {({ expanded }) => {\n const { shown, hidden } = collapseLines(lines, MAX_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={entry.name}>\n <span className=\"min-w-0 flex-1 truncate\">{entry.argSummary}</span>\n </MessageItemHeader>\n {shown.length > 0 || attachments.length > 0 ? (\n <MessageItemBody className=\"flex flex-col gap-2\">\n {shown.length > 0 ? (\n <pre data-testid=\"tool-output\" className=\"whitespace-pre-wrap break-words\">\n {shown.join('\\n')}\n </pre>\n ) : null}\n {attachments.map((attachment, index) => (\n <HostAttachmentView\n key={`${attachment.mimeType}:${attachment.name}:${String(index)}`}\n attachment={attachment}\n index={index}\n />\n ))}\n {hidden > 0 ? <MessageItemStatus expands>show {hidden} more line(s)</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\n/**\n * One tool call in the timeline. The plugin that registered the tool owns\n * the whole item through its `message` renderer, the web half of the TUI's\n * renderShell 'self'; the host only marks the row, catches a renderer that\n * throws, and stands in for a tool nobody claims.\n */\nexport const ToolCard = memo(function ToolCard({\n entry,\n slotProps,\n statuses,\n}: {\n entry: ToolEntry;\n slotProps: WebPluginSlotProps;\n statuses: Readonly<Record<string, string>>;\n}) {\n const renderer = pluginToolRenderer(entry.name, statuses, entry.result?.details);\n const state = toneOf(entry);\n const props = toolMessageProps(slotProps, entry, statuses);\n // ponytail: mirrors po-hook's status key; share a constant if another consumer needs it.\n const hookStatus = statuses[`repository-hooks:${entry.toolCallId}:post`]?.trim();\n const hookBadge = hookStatus ? (\n <StatusBadge tone=\"running\" title={hookStatus} aria-label={hookStatus} data-testid=\"tool-hook-status\">\n HOOK\n </StatusBadge>\n ) : null;\n return (\n <ToolRendererBoundary key={entry.toolCallId} toolName={entry.name}>\n {(failed) => (\n <div\n data-testid=\"entry-tool\"\n data-tool-name={entry.name}\n data-tool-state={state}\n data-tool-renderer={failed ? 'failed' : renderer ? 'plugin' : 'host'}\n >\n <MessageItemHeaderAccessoryContext value={hookBadge}>\n {renderer && !failed ? <renderer.message {...props} /> : <HostToolMessage entry={entry} />}\n </MessageItemHeaderAccessoryContext>\n </div>\n )}\n </ToolRendererBoundary>\n );\n});\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ToolEntry } from "../../lib/sessionModel.mjs";
2
+ import { WebPluginSlotProps } from "@agimon-ai/po-core/web";
3
+ //#region src/web/features/session/ToolCard.d.ts
4
+ /**
5
+ * One tool call in the timeline. The plugin that registered the tool owns
6
+ * the whole item through its `message` renderer, the web half of the TUI's
7
+ * renderShell 'self'; the host only marks the row, catches a renderer that
8
+ * throws, and stands in for a tool nobody claims.
9
+ */
10
+ export declare const ToolCard: import("react").MemoExoticComponent<({ entry, slotProps, statuses }: {
11
+ entry: ToolEntry;
12
+ slotProps: WebPluginSlotProps;
13
+ statuses: Readonly<Record<string, string>>;
14
+ }) => import("react").JSX.Element>;
15
+ //#endregion
16
+ //# sourceMappingURL=ToolCard.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCard.d.mts","names":[],"sources":["../../../../src/web/features/session/ToolCard.tsx"],"mappings":";;;;;;;;;qBAkNa,0BAAQ,uBAAA,OAAA,WAAA;EAKnB,OAAO;EACP,WAAW;EACX,UAAU,SAAS;sBACpB,IAAA"}
@@ -0,0 +1,210 @@
1
+ import { pluginToolRenderer } from "../../lib/pluginRegistry.mjs";
2
+ import { imagesFromContent } from "../../lib/sessionModel.mjs";
3
+ import { toolMessageProps } from "../../lib/toolMessageProps.mjs";
4
+ import { ToolRendererBoundary } from "../../components/ToolRendererBoundary.mjs";
5
+ import { memo } from "react";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
+ import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemHeaderAccessoryContext, MessageItemStatus, StatusBadge, collapseLines } from "@agimon-ai/po-web-components";
8
+ //#region src/web/features/session/ToolCard.tsx
9
+ const MAX_PREVIEW_LINES = 12;
10
+ function isRecord(value) {
11
+ return typeof value === "object" && value !== null && !Array.isArray(value);
12
+ }
13
+ function attachmentKind(mimeType) {
14
+ if (mimeType.startsWith("image/")) return "image";
15
+ if (mimeType.startsWith("audio/")) return "audio";
16
+ if (mimeType.startsWith("video/")) return "video";
17
+ if (mimeType === "application/pdf") return "pdf";
18
+ if (mimeType.startsWith("text/")) return "text";
19
+ return "file";
20
+ }
21
+ function attachmentName(block, index) {
22
+ for (const key of [
23
+ "title",
24
+ "name",
25
+ "filename",
26
+ "fileName"
27
+ ]) if (typeof block[key] === "string" && block[key].length > 0) return block[key];
28
+ if (typeof block.uri === "string" && block.uri.length > 0) return block.uri.split("/").at(-1) || block.uri;
29
+ return `attachment-${String(index + 1)}`;
30
+ }
31
+ /** Binary and linked result blocks a tool returned outside its ordinary text. */
32
+ function hostAttachments(entry) {
33
+ const content = entry.result?.content ?? [];
34
+ const images = imagesFromContent(content).map((image, index) => ({
35
+ kind: "image",
36
+ mimeType: image.mimeType,
37
+ name: `${entry.name}-result-${String(index + 1)}`,
38
+ data: image.data
39
+ }));
40
+ const details = isRecord(entry.result?.details) ? entry.result.details : void 0;
41
+ const other = [...content, ...Array.isArray(details?.blocks) ? details.blocks : []].flatMap((candidate, index) => {
42
+ if (!isRecord(candidate) || candidate.type === "text" || candidate.type === "image") return [];
43
+ const resource = candidate.type === "resource" && isRecord(candidate.resource) ? candidate.resource : candidate;
44
+ const mimeType = typeof resource.mimeType === "string" ? resource.mimeType : "application/octet-stream";
45
+ const data = typeof resource.data === "string" ? resource.data : typeof resource.blob === "string" ? resource.blob : void 0;
46
+ const text = typeof resource.text === "string" ? resource.text : void 0;
47
+ const uri = typeof resource.uri === "string" ? resource.uri : void 0;
48
+ if (data === void 0 && text === void 0 && uri === void 0) return [];
49
+ return [{
50
+ kind: attachmentKind(mimeType),
51
+ mimeType,
52
+ name: attachmentName(resource, index),
53
+ data,
54
+ text,
55
+ uri
56
+ }];
57
+ });
58
+ return [...images, ...other];
59
+ }
60
+ function attachmentUrl(attachment) {
61
+ if (attachment.data !== void 0) return `data:${attachment.mimeType};base64,${attachment.data}`;
62
+ if (attachment.uri === void 0) return void 0;
63
+ return /^(?:https?):\/\//u.test(attachment.uri) ? attachment.uri : void 0;
64
+ }
65
+ function HostAttachmentView({ attachment, index }) {
66
+ const url = attachmentUrl(attachment);
67
+ if (attachment.kind === "text" && attachment.text !== void 0) return /* @__PURE__ */ jsx("pre", {
68
+ "data-testid": "tool-output-text-file",
69
+ className: "max-h-96 overflow-auto whitespace-pre-wrap break-words rounded-md border border-doom-border-soft p-2",
70
+ children: attachment.text
71
+ });
72
+ if (url !== void 0 && attachment.kind === "image") return /* @__PURE__ */ jsx("a", {
73
+ href: url,
74
+ target: "_blank",
75
+ rel: "noreferrer",
76
+ className: "self-start",
77
+ children: /* @__PURE__ */ jsx("img", {
78
+ src: url,
79
+ alt: attachment.name,
80
+ "data-testid": "tool-output-image",
81
+ className: "h-auto max-h-96 max-w-full rounded-md border border-doom-border-soft object-contain"
82
+ })
83
+ });
84
+ if (url !== void 0 && attachment.kind === "video") return /* @__PURE__ */ jsx("video", {
85
+ src: url,
86
+ controls: true,
87
+ preload: "metadata",
88
+ "data-testid": "tool-output-video",
89
+ className: "max-h-96 max-w-full self-start rounded-md border border-doom-border-soft",
90
+ children: /* @__PURE__ */ jsx("track", { kind: "captions" })
91
+ });
92
+ if (url !== void 0 && attachment.kind === "audio") return /* @__PURE__ */ jsx("audio", {
93
+ src: url,
94
+ controls: true,
95
+ preload: "metadata",
96
+ "data-testid": "tool-output-audio",
97
+ className: "w-full",
98
+ children: /* @__PURE__ */ jsx("track", { kind: "captions" })
99
+ });
100
+ if (url !== void 0 && attachment.kind === "pdf") return /* @__PURE__ */ jsx("iframe", {
101
+ src: url,
102
+ title: attachment.name,
103
+ "data-testid": "tool-output-pdf",
104
+ className: "h-[480px] w-full rounded-md border border-doom-border-soft bg-doom-deep"
105
+ });
106
+ return url !== void 0 ? /* @__PURE__ */ jsxs("a", {
107
+ href: url,
108
+ download: attachment.name,
109
+ target: "_blank",
110
+ rel: "noreferrer",
111
+ "data-testid": "tool-output-file",
112
+ className: "self-start rounded-md border border-doom-border px-3 py-2 text-doom-blue hover:border-doom-blue/60",
113
+ children: [
114
+ attachment.name,
115
+ " · ",
116
+ attachment.mimeType
117
+ ]
118
+ }) : /* @__PURE__ */ jsxs("span", {
119
+ "data-testid": "tool-output-file",
120
+ className: "self-start rounded-md border border-doom-border px-3 py-2 text-base text-doom-dim",
121
+ children: [
122
+ attachment.name,
123
+ " · ",
124
+ attachment.mimeType
125
+ ]
126
+ }, index);
127
+ }
128
+ function toneOf(entry) {
129
+ return entry.running ? "running" : entry.isError ? "error" : "ok";
130
+ }
131
+ /**
132
+ * The host's own item for a tool no plugin claims: the argument summary in
133
+ * the header and the result's text and safe browser previews, with long text
134
+ * clipped until expanded, on the same shell every plugin message is built from.
135
+ */
136
+ function HostToolMessage({ entry }) {
137
+ const lines = entry.output.length > 0 ? entry.output.split("\n") : [];
138
+ const attachments = hostAttachments(entry);
139
+ return /* @__PURE__ */ jsx(MessageItem, {
140
+ tone: toneOf(entry),
141
+ expandable: lines.length > MAX_PREVIEW_LINES,
142
+ children: ({ expanded }) => {
143
+ const { shown, hidden } = collapseLines(lines, MAX_PREVIEW_LINES, expanded);
144
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(MessageItemHeader, {
145
+ title: entry.name,
146
+ children: /* @__PURE__ */ jsx("span", {
147
+ className: "min-w-0 flex-1 truncate",
148
+ children: entry.argSummary
149
+ })
150
+ }), shown.length > 0 || attachments.length > 0 ? /* @__PURE__ */ jsxs(MessageItemBody, {
151
+ className: "flex flex-col gap-2",
152
+ children: [
153
+ shown.length > 0 ? /* @__PURE__ */ jsx("pre", {
154
+ "data-testid": "tool-output",
155
+ className: "whitespace-pre-wrap break-words",
156
+ children: shown.join("\n")
157
+ }) : null,
158
+ attachments.map((attachment, index) => /* @__PURE__ */ jsx(HostAttachmentView, {
159
+ attachment,
160
+ index
161
+ }, `${attachment.mimeType}:${attachment.name}:${String(index)}`)),
162
+ hidden > 0 ? /* @__PURE__ */ jsxs(MessageItemStatus, {
163
+ expands: true,
164
+ children: [
165
+ "show ",
166
+ hidden,
167
+ " more line(s)"
168
+ ]
169
+ }) : null
170
+ ]
171
+ }) : null] });
172
+ }
173
+ });
174
+ }
175
+ /**
176
+ * One tool call in the timeline. The plugin that registered the tool owns
177
+ * the whole item through its `message` renderer, the web half of the TUI's
178
+ * renderShell 'self'; the host only marks the row, catches a renderer that
179
+ * throws, and stands in for a tool nobody claims.
180
+ */
181
+ const ToolCard = memo(function ToolCard({ entry, slotProps, statuses }) {
182
+ const renderer = pluginToolRenderer(entry.name, statuses, entry.result?.details);
183
+ const state = toneOf(entry);
184
+ const props = toolMessageProps(slotProps, entry, statuses);
185
+ const hookStatus = statuses[`repository-hooks:${entry.toolCallId}:post`]?.trim();
186
+ const hookBadge = hookStatus ? /* @__PURE__ */ jsx(StatusBadge, {
187
+ tone: "running",
188
+ title: hookStatus,
189
+ "aria-label": hookStatus,
190
+ "data-testid": "tool-hook-status",
191
+ children: "HOOK"
192
+ }) : null;
193
+ return /* @__PURE__ */ jsx(ToolRendererBoundary, {
194
+ toolName: entry.name,
195
+ children: (failed) => /* @__PURE__ */ jsx("div", {
196
+ "data-testid": "entry-tool",
197
+ "data-tool-name": entry.name,
198
+ "data-tool-state": state,
199
+ "data-tool-renderer": failed ? "failed" : renderer ? "plugin" : "host",
200
+ children: /* @__PURE__ */ jsx(MessageItemHeaderAccessoryContext, {
201
+ value: hookBadge,
202
+ children: renderer && !failed ? /* @__PURE__ */ jsx(renderer.message, { ...props }) : /* @__PURE__ */ jsx(HostToolMessage, { entry })
203
+ })
204
+ })
205
+ }, entry.toolCallId);
206
+ });
207
+ //#endregion
208
+ export { ToolCard };
209
+
210
+ //# sourceMappingURL=ToolCard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCard.mjs","names":[],"sources":["../../../../src/web/features/session/ToolCard.tsx"],"sourcesContent":["import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemHeaderAccessoryContext,\n StatusBadge,\n MessageItemStatus,\n type StatusTone,\n} from '@agimon-ai/po-web-components';\nimport { memo } from 'react';\n\nimport { ToolRendererBoundary } from '../../components/ToolRendererBoundary';\nimport { pluginToolRenderer } from '../../lib/pluginRegistry';\nimport { imagesFromContent, type ToolEntry } from '../../lib/sessionModel';\nimport { toolMessageProps } from '../../lib/toolMessageProps';\n\nconst MAX_PREVIEW_LINES = 12;\n\ntype AttachmentKind = 'image' | 'audio' | 'video' | 'pdf' | 'text' | 'file';\n\ninterface HostAttachment {\n kind: AttachmentKind;\n mimeType: string;\n name: string;\n data?: string;\n text?: string;\n uri?: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction attachmentKind(mimeType: string): AttachmentKind {\n if (mimeType.startsWith('image/')) return 'image';\n if (mimeType.startsWith('audio/')) return 'audio';\n if (mimeType.startsWith('video/')) return 'video';\n if (mimeType === 'application/pdf') return 'pdf';\n if (mimeType.startsWith('text/')) return 'text';\n return 'file';\n}\n\nfunction attachmentName(block: Record<string, unknown>, index: number): string {\n for (const key of ['title', 'name', 'filename', 'fileName']) {\n if (typeof block[key] === 'string' && block[key].length > 0) return block[key];\n }\n if (typeof block.uri === 'string' && block.uri.length > 0) return block.uri.split('/').at(-1) || block.uri;\n return `attachment-${String(index + 1)}`;\n}\n\n/** Binary and linked result blocks a tool returned outside its ordinary text. */\nfunction hostAttachments(entry: ToolEntry): HostAttachment[] {\n const content = entry.result?.content ?? [];\n const images: HostAttachment[] = imagesFromContent(content).map((image, index) => ({\n kind: 'image',\n mimeType: image.mimeType,\n name: `${entry.name}-result-${String(index + 1)}`,\n data: image.data,\n }));\n const details = isRecord(entry.result?.details) ? entry.result.details : undefined;\n const blocks = [...content, ...(Array.isArray(details?.blocks) ? details.blocks : [])];\n const other = blocks.flatMap((candidate, index): HostAttachment[] => {\n if (!isRecord(candidate) || candidate.type === 'text' || candidate.type === 'image') return [];\n const resource = candidate.type === 'resource' && isRecord(candidate.resource) ? candidate.resource : candidate;\n const mimeType = typeof resource.mimeType === 'string' ? resource.mimeType : 'application/octet-stream';\n const data =\n typeof resource.data === 'string' ? resource.data : typeof resource.blob === 'string' ? resource.blob : undefined;\n const text = typeof resource.text === 'string' ? resource.text : undefined;\n const uri = typeof resource.uri === 'string' ? resource.uri : undefined;\n if (data === undefined && text === undefined && uri === undefined) return [];\n return [{ kind: attachmentKind(mimeType), mimeType, name: attachmentName(resource, index), data, text, uri }];\n });\n return [...images, ...other];\n}\n\nfunction attachmentUrl(attachment: HostAttachment): string | undefined {\n if (attachment.data !== undefined) return `data:${attachment.mimeType};base64,${attachment.data}`;\n if (attachment.uri === undefined) return undefined;\n return /^(?:https?):\\/\\//u.test(attachment.uri) ? attachment.uri : undefined;\n}\n\nfunction HostAttachmentView({ attachment, index }: { attachment: HostAttachment; index: number }) {\n const url = attachmentUrl(attachment);\n if (attachment.kind === 'text' && attachment.text !== undefined) {\n return (\n <pre\n data-testid=\"tool-output-text-file\"\n className=\"max-h-96 overflow-auto whitespace-pre-wrap break-words rounded-md border border-doom-border-soft p-2\"\n >\n {attachment.text}\n </pre>\n );\n }\n if (url !== undefined && attachment.kind === 'image') {\n return (\n <a href={url} target=\"_blank\" rel=\"noreferrer\" className=\"self-start\">\n <img\n src={url}\n alt={attachment.name}\n data-testid=\"tool-output-image\"\n className=\"h-auto max-h-96 max-w-full rounded-md border border-doom-border-soft object-contain\"\n />\n </a>\n );\n }\n if (url !== undefined && attachment.kind === 'video') {\n return (\n <video\n src={url}\n controls\n preload=\"metadata\"\n data-testid=\"tool-output-video\"\n className=\"max-h-96 max-w-full self-start rounded-md border border-doom-border-soft\"\n >\n <track kind=\"captions\" />\n </video>\n );\n }\n if (url !== undefined && attachment.kind === 'audio') {\n return (\n <audio src={url} controls preload=\"metadata\" data-testid=\"tool-output-audio\" className=\"w-full\">\n <track kind=\"captions\" />\n </audio>\n );\n }\n if (url !== undefined && attachment.kind === 'pdf') {\n return (\n <iframe\n src={url}\n title={attachment.name}\n data-testid=\"tool-output-pdf\"\n className=\"h-[480px] w-full rounded-md border border-doom-border-soft bg-doom-deep\"\n />\n );\n }\n return url !== undefined ? (\n <a\n href={url}\n download={attachment.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n data-testid=\"tool-output-file\"\n className=\"self-start rounded-md border border-doom-border px-3 py-2 text-doom-blue hover:border-doom-blue/60\"\n >\n {attachment.name} · {attachment.mimeType}\n </a>\n ) : (\n <span\n key={index}\n data-testid=\"tool-output-file\"\n className=\"self-start rounded-md border border-doom-border px-3 py-2 text-base text-doom-dim\"\n >\n {attachment.name} · {attachment.mimeType}\n </span>\n );\n}\n\nfunction toneOf(entry: ToolEntry): StatusTone {\n return entry.running ? 'running' : entry.isError ? 'error' : 'ok';\n}\n\n/**\n * The host's own item for a tool no plugin claims: the argument summary in\n * the header and the result's text and safe browser previews, with long text\n * clipped until expanded, on the same shell every plugin message is built from.\n */\nfunction HostToolMessage({ entry }: { entry: ToolEntry }) {\n const lines = entry.output.length > 0 ? entry.output.split('\\n') : [];\n const attachments = hostAttachments(entry);\n return (\n <MessageItem tone={toneOf(entry)} expandable={lines.length > MAX_PREVIEW_LINES}>\n {({ expanded }) => {\n const { shown, hidden } = collapseLines(lines, MAX_PREVIEW_LINES, expanded);\n return (\n <>\n <MessageItemHeader title={entry.name}>\n <span className=\"min-w-0 flex-1 truncate\">{entry.argSummary}</span>\n </MessageItemHeader>\n {shown.length > 0 || attachments.length > 0 ? (\n <MessageItemBody className=\"flex flex-col gap-2\">\n {shown.length > 0 ? (\n <pre data-testid=\"tool-output\" className=\"whitespace-pre-wrap break-words\">\n {shown.join('\\n')}\n </pre>\n ) : null}\n {attachments.map((attachment, index) => (\n <HostAttachmentView\n key={`${attachment.mimeType}:${attachment.name}:${String(index)}`}\n attachment={attachment}\n index={index}\n />\n ))}\n {hidden > 0 ? <MessageItemStatus expands>show {hidden} more line(s)</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n\n/**\n * One tool call in the timeline. The plugin that registered the tool owns\n * the whole item through its `message` renderer, the web half of the TUI's\n * renderShell 'self'; the host only marks the row, catches a renderer that\n * throws, and stands in for a tool nobody claims.\n */\nexport const ToolCard = memo(function ToolCard({\n entry,\n slotProps,\n statuses,\n}: {\n entry: ToolEntry;\n slotProps: WebPluginSlotProps;\n statuses: Readonly<Record<string, string>>;\n}) {\n const renderer = pluginToolRenderer(entry.name, statuses, entry.result?.details);\n const state = toneOf(entry);\n const props = toolMessageProps(slotProps, entry, statuses);\n // ponytail: mirrors po-hook's status key; share a constant if another consumer needs it.\n const hookStatus = statuses[`repository-hooks:${entry.toolCallId}:post`]?.trim();\n const hookBadge = hookStatus ? (\n <StatusBadge tone=\"running\" title={hookStatus} aria-label={hookStatus} data-testid=\"tool-hook-status\">\n HOOK\n </StatusBadge>\n ) : null;\n return (\n <ToolRendererBoundary key={entry.toolCallId} toolName={entry.name}>\n {(failed) => (\n <div\n data-testid=\"entry-tool\"\n data-tool-name={entry.name}\n data-tool-state={state}\n data-tool-renderer={failed ? 'failed' : renderer ? 'plugin' : 'host'}\n >\n <MessageItemHeaderAccessoryContext value={hookBadge}>\n {renderer && !failed ? <renderer.message {...props} /> : <HostToolMessage entry={entry} />}\n </MessageItemHeaderAccessoryContext>\n </div>\n )}\n </ToolRendererBoundary>\n );\n});\n"],"mappings":"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"}