@xenosystem/agent-interface-ui 0.1.3

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 (384) hide show
  1. package/LICENSE +67 -0
  2. package/dist/adapters/agentHostPlatformBridge.d.ts +24 -0
  3. package/dist/adapters/agentHostPlatformBridge.d.ts.map +1 -0
  4. package/dist/adapters/agentHostPlatformBridge.js +1244 -0
  5. package/dist/adapters/agentHostPlatformBridge.js.map +1 -0
  6. package/dist/adapters/hubAgentPlatformBridge.d.ts +17 -0
  7. package/dist/adapters/hubAgentPlatformBridge.d.ts.map +1 -0
  8. package/dist/adapters/hubAgentPlatformBridge.js +109 -0
  9. package/dist/adapters/hubAgentPlatformBridge.js.map +1 -0
  10. package/dist/adapters/xenoAgentCompatibilityBridge.d.ts +14 -0
  11. package/dist/adapters/xenoAgentCompatibilityBridge.d.ts.map +1 -0
  12. package/dist/adapters/xenoAgentCompatibilityBridge.js +237 -0
  13. package/dist/adapters/xenoAgentCompatibilityBridge.js.map +1 -0
  14. package/dist/adapters/xenoAgentHostCatalog.d.ts +40 -0
  15. package/dist/adapters/xenoAgentHostCatalog.d.ts.map +1 -0
  16. package/dist/adapters/xenoAgentHostCatalog.js +228 -0
  17. package/dist/adapters/xenoAgentHostCatalog.js.map +1 -0
  18. package/dist/components/agent/AIStatusIndicator.d.ts +25 -0
  19. package/dist/components/agent/AIStatusIndicator.d.ts.map +1 -0
  20. package/dist/components/agent/AIStatusIndicator.js +85 -0
  21. package/dist/components/agent/AIStatusIndicator.js.map +1 -0
  22. package/dist/components/agent/AgentInterface.d.ts +21 -0
  23. package/dist/components/agent/AgentInterface.d.ts.map +1 -0
  24. package/dist/components/agent/AgentInterface.js +7586 -0
  25. package/dist/components/agent/AgentInterface.js.map +1 -0
  26. package/dist/components/agent/AgentOnboarding.d.ts +16 -0
  27. package/dist/components/agent/AgentOnboarding.d.ts.map +1 -0
  28. package/dist/components/agent/AgentOnboarding.js +423 -0
  29. package/dist/components/agent/AgentOnboarding.js.map +1 -0
  30. package/dist/components/agent/AgentPtyTerminalPanel.d.ts +13 -0
  31. package/dist/components/agent/AgentPtyTerminalPanel.d.ts.map +1 -0
  32. package/dist/components/agent/AgentPtyTerminalPanel.js +129 -0
  33. package/dist/components/agent/AgentPtyTerminalPanel.js.map +1 -0
  34. package/dist/components/agent/AgentView.d.ts +143 -0
  35. package/dist/components/agent/AgentView.d.ts.map +1 -0
  36. package/dist/components/agent/AgentView.js +7250 -0
  37. package/dist/components/agent/AgentView.js.map +1 -0
  38. package/dist/components/agent/AgentWorkbenchCliPanel.d.ts +15 -0
  39. package/dist/components/agent/AgentWorkbenchCliPanel.d.ts.map +1 -0
  40. package/dist/components/agent/AgentWorkbenchCliPanel.js +275 -0
  41. package/dist/components/agent/AgentWorkbenchCliPanel.js.map +1 -0
  42. package/dist/components/agent/AgentWorkbenchPanel.d.ts +791 -0
  43. package/dist/components/agent/AgentWorkbenchPanel.d.ts.map +1 -0
  44. package/dist/components/agent/AgentWorkbenchPanel.js +584 -0
  45. package/dist/components/agent/AgentWorkbenchPanel.js.map +1 -0
  46. package/dist/components/agent/AgentWorkspaceBrowserPanel.d.ts +11 -0
  47. package/dist/components/agent/AgentWorkspaceBrowserPanel.d.ts.map +1 -0
  48. package/dist/components/agent/AgentWorkspaceBrowserPanel.js +198 -0
  49. package/dist/components/agent/AgentWorkspaceBrowserPanel.js.map +1 -0
  50. package/dist/components/agent/AssistantTurnStatusNotice.d.ts +16 -0
  51. package/dist/components/agent/AssistantTurnStatusNotice.d.ts.map +1 -0
  52. package/dist/components/agent/AssistantTurnStatusNotice.js +54 -0
  53. package/dist/components/agent/AssistantTurnStatusNotice.js.map +1 -0
  54. package/dist/components/agent/CommandToolCard.d.ts +11 -0
  55. package/dist/components/agent/CommandToolCard.d.ts.map +1 -0
  56. package/dist/components/agent/CommandToolCard.js +29 -0
  57. package/dist/components/agent/CommandToolCard.js.map +1 -0
  58. package/dist/components/agent/FleetPanel.d.ts +28 -0
  59. package/dist/components/agent/FleetPanel.d.ts.map +1 -0
  60. package/dist/components/agent/FleetPanel.js +175 -0
  61. package/dist/components/agent/FleetPanel.js.map +1 -0
  62. package/dist/components/agent/GhostTextArea.d.ts +13 -0
  63. package/dist/components/agent/GhostTextArea.d.ts.map +1 -0
  64. package/dist/components/agent/GhostTextArea.js +21 -0
  65. package/dist/components/agent/GhostTextArea.js.map +1 -0
  66. package/dist/components/agent/IntakePanel.d.ts +29 -0
  67. package/dist/components/agent/IntakePanel.d.ts.map +1 -0
  68. package/dist/components/agent/IntakePanel.js +81 -0
  69. package/dist/components/agent/IntakePanel.js.map +1 -0
  70. package/dist/components/agent/KnowledgePanel.d.ts +25 -0
  71. package/dist/components/agent/KnowledgePanel.d.ts.map +1 -0
  72. package/dist/components/agent/KnowledgePanel.js +99 -0
  73. package/dist/components/agent/KnowledgePanel.js.map +1 -0
  74. package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts +9 -0
  75. package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts.map +1 -0
  76. package/dist/components/agent/MonacoDiffWorkbenchEditor.js +204 -0
  77. package/dist/components/agent/MonacoDiffWorkbenchEditor.js.map +1 -0
  78. package/dist/components/agent/MonacoWorkbenchEditor.d.ts +15 -0
  79. package/dist/components/agent/MonacoWorkbenchEditor.d.ts.map +1 -0
  80. package/dist/components/agent/MonacoWorkbenchEditor.js +380 -0
  81. package/dist/components/agent/MonacoWorkbenchEditor.js.map +1 -0
  82. package/dist/components/agent/PermissionDialog.d.ts +34 -0
  83. package/dist/components/agent/PermissionDialog.d.ts.map +1 -0
  84. package/dist/components/agent/PermissionDialog.js +67 -0
  85. package/dist/components/agent/PermissionDialog.js.map +1 -0
  86. package/dist/components/agent/PluginManager.d.ts +20 -0
  87. package/dist/components/agent/PluginManager.d.ts.map +1 -0
  88. package/dist/components/agent/PluginManager.js +506 -0
  89. package/dist/components/agent/PluginManager.js.map +1 -0
  90. package/dist/components/agent/RunReviewPanel.d.ts +52 -0
  91. package/dist/components/agent/RunReviewPanel.d.ts.map +1 -0
  92. package/dist/components/agent/RunReviewPanel.js +236 -0
  93. package/dist/components/agent/RunReviewPanel.js.map +1 -0
  94. package/dist/components/agent/SessionsPanel.d.ts +30 -0
  95. package/dist/components/agent/SessionsPanel.d.ts.map +1 -0
  96. package/dist/components/agent/SessionsPanel.js +247 -0
  97. package/dist/components/agent/SessionsPanel.js.map +1 -0
  98. package/dist/components/agent/acp/AcpAgentConfigForm.d.ts +19 -0
  99. package/dist/components/agent/acp/AcpAgentConfigForm.d.ts.map +1 -0
  100. package/dist/components/agent/acp/AcpAgentConfigForm.js +85 -0
  101. package/dist/components/agent/acp/AcpAgentConfigForm.js.map +1 -0
  102. package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts +10 -0
  103. package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts.map +1 -0
  104. package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.js +80 -0
  105. package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.js.map +1 -0
  106. package/dist/components/agent/acp/AcpAgentManager.d.ts +3 -0
  107. package/dist/components/agent/acp/AcpAgentManager.d.ts.map +1 -0
  108. package/dist/components/agent/acp/AcpAgentManager.js +152 -0
  109. package/dist/components/agent/acp/AcpAgentManager.js.map +1 -0
  110. package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts +9 -0
  111. package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts.map +1 -0
  112. package/dist/components/agent/acp/AcpAgentTestResultPanel.js +24 -0
  113. package/dist/components/agent/acp/AcpAgentTestResultPanel.js.map +1 -0
  114. package/dist/components/agent/acp/AcpApprovalPanel.d.ts +29 -0
  115. package/dist/components/agent/acp/AcpApprovalPanel.d.ts.map +1 -0
  116. package/dist/components/agent/acp/AcpApprovalPanel.js +37 -0
  117. package/dist/components/agent/acp/AcpApprovalPanel.js.map +1 -0
  118. package/dist/components/agent/acp/AcpCertificationPanel.d.ts +10 -0
  119. package/dist/components/agent/acp/AcpCertificationPanel.d.ts.map +1 -0
  120. package/dist/components/agent/acp/AcpCertificationPanel.js +41 -0
  121. package/dist/components/agent/acp/AcpCertificationPanel.js.map +1 -0
  122. package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts +11 -0
  123. package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts.map +1 -0
  124. package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.js +32 -0
  125. package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.js.map +1 -0
  126. package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts +7 -0
  127. package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts.map +1 -0
  128. package/dist/components/agent/acp/AcpProviderManagerPanel.js +69 -0
  129. package/dist/components/agent/acp/AcpProviderManagerPanel.js.map +1 -0
  130. package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts +7 -0
  131. package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts.map +1 -0
  132. package/dist/components/agent/acp/AcpProviderModelsPanel.js +108 -0
  133. package/dist/components/agent/acp/AcpProviderModelsPanel.js.map +1 -0
  134. package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts +8 -0
  135. package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts.map +1 -0
  136. package/dist/components/agent/acp/AcpSupportBundlePanel.js +56 -0
  137. package/dist/components/agent/acp/AcpSupportBundlePanel.js.map +1 -0
  138. package/dist/components/agent/compactionSummary.d.ts +28 -0
  139. package/dist/components/agent/compactionSummary.d.ts.map +1 -0
  140. package/dist/components/agent/compactionSummary.js +41 -0
  141. package/dist/components/agent/compactionSummary.js.map +1 -0
  142. package/dist/components/agent/monacoWorkbenchShared.d.ts +13 -0
  143. package/dist/components/agent/monacoWorkbenchShared.d.ts.map +1 -0
  144. package/dist/components/agent/monacoWorkbenchShared.js +226 -0
  145. package/dist/components/agent/monacoWorkbenchShared.js.map +1 -0
  146. package/dist/components/agent/settings/EntitySettingsLayout.d.ts +61 -0
  147. package/dist/components/agent/settings/EntitySettingsLayout.d.ts.map +1 -0
  148. package/dist/components/agent/settings/EntitySettingsLayout.js +72 -0
  149. package/dist/components/agent/settings/EntitySettingsLayout.js.map +1 -0
  150. package/dist/components/agent/settings/SettingsNavigation.d.ts +8 -0
  151. package/dist/components/agent/settings/SettingsNavigation.d.ts.map +1 -0
  152. package/dist/components/agent/settings/SettingsNavigation.js +39 -0
  153. package/dist/components/agent/settings/SettingsNavigation.js.map +1 -0
  154. package/dist/components/agent/settings/sections/AccessMembersSection.d.ts +3 -0
  155. package/dist/components/agent/settings/sections/AccessMembersSection.d.ts.map +1 -0
  156. package/dist/components/agent/settings/sections/AccessMembersSection.js +31 -0
  157. package/dist/components/agent/settings/sections/AccessMembersSection.js.map +1 -0
  158. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.d.ts +25 -0
  159. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.d.ts.map +1 -0
  160. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js +56 -0
  161. package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js.map +1 -0
  162. package/dist/components/agent/settings/sections/DangerZoneSection.d.ts +3 -0
  163. package/dist/components/agent/settings/sections/DangerZoneSection.d.ts.map +1 -0
  164. package/dist/components/agent/settings/sections/DangerZoneSection.js +19 -0
  165. package/dist/components/agent/settings/sections/DangerZoneSection.js.map +1 -0
  166. package/dist/components/agent/settings/sections/DefaultAgentConfigSection.d.ts +3 -0
  167. package/dist/components/agent/settings/sections/DefaultAgentConfigSection.d.ts.map +1 -0
  168. package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js +66 -0
  169. package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js.map +1 -0
  170. package/dist/components/agent/settings/sections/EnvironmentSecretsSection.d.ts +3 -0
  171. package/dist/components/agent/settings/sections/EnvironmentSecretsSection.d.ts.map +1 -0
  172. package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js +87 -0
  173. package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js.map +1 -0
  174. package/dist/components/agent/settings/sections/ExportBackupSection.d.ts +3 -0
  175. package/dist/components/agent/settings/sections/ExportBackupSection.d.ts.map +1 -0
  176. package/dist/components/agent/settings/sections/ExportBackupSection.js +23 -0
  177. package/dist/components/agent/settings/sections/ExportBackupSection.js.map +1 -0
  178. package/dist/components/agent/settings/sections/GeneralSection.d.ts +3 -0
  179. package/dist/components/agent/settings/sections/GeneralSection.d.ts.map +1 -0
  180. package/dist/components/agent/settings/sections/GeneralSection.js +15 -0
  181. package/dist/components/agent/settings/sections/GeneralSection.js.map +1 -0
  182. package/dist/components/agent/settings/sections/IntegrationsSection.d.ts +3 -0
  183. package/dist/components/agent/settings/sections/IntegrationsSection.d.ts.map +1 -0
  184. package/dist/components/agent/settings/sections/IntegrationsSection.js +40 -0
  185. package/dist/components/agent/settings/sections/IntegrationsSection.js.map +1 -0
  186. package/dist/components/agent/settings/sections/NotificationsSection.d.ts +3 -0
  187. package/dist/components/agent/settings/sections/NotificationsSection.d.ts.map +1 -0
  188. package/dist/components/agent/settings/sections/NotificationsSection.js +28 -0
  189. package/dist/components/agent/settings/sections/NotificationsSection.js.map +1 -0
  190. package/dist/components/agent/settings/sections/ResourceLimitsSection.d.ts +3 -0
  191. package/dist/components/agent/settings/sections/ResourceLimitsSection.d.ts.map +1 -0
  192. package/dist/components/agent/settings/sections/ResourceLimitsSection.js +17 -0
  193. package/dist/components/agent/settings/sections/ResourceLimitsSection.js.map +1 -0
  194. package/dist/components/agent/settings/sections/SecurityComplianceSection.d.ts +3 -0
  195. package/dist/components/agent/settings/sections/SecurityComplianceSection.d.ts.map +1 -0
  196. package/dist/components/agent/settings/sections/SecurityComplianceSection.js +28 -0
  197. package/dist/components/agent/settings/sections/SecurityComplianceSection.js.map +1 -0
  198. package/dist/components/agent/settings/sections/UsageAnalyticsSection.d.ts +3 -0
  199. package/dist/components/agent/settings/sections/UsageAnalyticsSection.d.ts.map +1 -0
  200. package/dist/components/agent/settings/sections/UsageAnalyticsSection.js +17 -0
  201. package/dist/components/agent/settings/sections/UsageAnalyticsSection.js.map +1 -0
  202. package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts +54 -0
  203. package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts.map +1 -0
  204. package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js +333 -0
  205. package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js.map +1 -0
  206. package/dist/components/agent/settings/shared/CheckboxField.d.ts +13 -0
  207. package/dist/components/agent/settings/shared/CheckboxField.d.ts.map +1 -0
  208. package/dist/components/agent/settings/shared/CheckboxField.js +8 -0
  209. package/dist/components/agent/settings/shared/CheckboxField.js.map +1 -0
  210. package/dist/components/agent/settings/shared/InputField.d.ts +15 -0
  211. package/dist/components/agent/settings/shared/InputField.d.ts.map +1 -0
  212. package/dist/components/agent/settings/shared/InputField.js +7 -0
  213. package/dist/components/agent/settings/shared/InputField.js.map +1 -0
  214. package/dist/components/agent/settings/shared/MembersTable.d.ts +11 -0
  215. package/dist/components/agent/settings/shared/MembersTable.d.ts.map +1 -0
  216. package/dist/components/agent/settings/shared/MembersTable.js +7 -0
  217. package/dist/components/agent/settings/shared/MembersTable.js.map +1 -0
  218. package/dist/components/agent/settings/shared/SettingRow.d.ts +11 -0
  219. package/dist/components/agent/settings/shared/SettingRow.d.ts.map +1 -0
  220. package/dist/components/agent/settings/shared/SettingRow.js +6 -0
  221. package/dist/components/agent/settings/shared/SettingRow.js.map +1 -0
  222. package/dist/components/agent/settings/shared/SettingsCard.d.ts +11 -0
  223. package/dist/components/agent/settings/shared/SettingsCard.d.ts.map +1 -0
  224. package/dist/components/agent/settings/shared/SettingsCard.js +8 -0
  225. package/dist/components/agent/settings/shared/SettingsCard.js.map +1 -0
  226. package/dist/components/agent/settings/shared/ToggleSwitch.d.ts +8 -0
  227. package/dist/components/agent/settings/shared/ToggleSwitch.d.ts.map +1 -0
  228. package/dist/components/agent/settings/shared/ToggleSwitch.js +6 -0
  229. package/dist/components/agent/settings/shared/ToggleSwitch.js.map +1 -0
  230. package/dist/components/agent/settings/shared/UsageChart.d.ts +12 -0
  231. package/dist/components/agent/settings/shared/UsageChart.d.ts.map +1 -0
  232. package/dist/components/agent/settings/shared/UsageChart.js +16 -0
  233. package/dist/components/agent/settings/shared/UsageChart.js.map +1 -0
  234. package/dist/components/agent/toolCardDisplay.d.ts +24 -0
  235. package/dist/components/agent/toolCardDisplay.d.ts.map +1 -0
  236. package/dist/components/agent/toolCardDisplay.js +85 -0
  237. package/dist/components/agent/toolCardDisplay.js.map +1 -0
  238. package/dist/components/product/XenoAgentProductHeader.d.ts +18 -0
  239. package/dist/components/product/XenoAgentProductHeader.d.ts.map +1 -0
  240. package/dist/components/product/XenoAgentProductHeader.js +25 -0
  241. package/dist/components/product/XenoAgentProductHeader.js.map +1 -0
  242. package/dist/components/product/XenoAgentSessionTabs.d.ts +18 -0
  243. package/dist/components/product/XenoAgentSessionTabs.d.ts.map +1 -0
  244. package/dist/components/product/XenoAgentSessionTabs.js +103 -0
  245. package/dist/components/product/XenoAgentSessionTabs.js.map +1 -0
  246. package/dist/components/ui/CodeBlock.d.ts +8 -0
  247. package/dist/components/ui/CodeBlock.d.ts.map +1 -0
  248. package/dist/components/ui/CodeBlock.js +89 -0
  249. package/dist/components/ui/CodeBlock.js.map +1 -0
  250. package/dist/components/ui/XenoLogo.d.ts +11 -0
  251. package/dist/components/ui/XenoLogo.d.ts.map +1 -0
  252. package/dist/components/ui/XenoLogo.js +9 -0
  253. package/dist/components/ui/XenoLogo.js.map +1 -0
  254. package/dist/index.d.ts +50 -0
  255. package/dist/index.d.ts.map +1 -0
  256. package/dist/index.js +127 -0
  257. package/dist/index.js.map +1 -0
  258. package/dist/platformApiTypes.d.ts +3992 -0
  259. package/dist/platformApiTypes.d.ts.map +1 -0
  260. package/dist/platformApiTypes.js +2 -0
  261. package/dist/platformApiTypes.js.map +1 -0
  262. package/dist/platformBridge.d.ts +9 -0
  263. package/dist/platformBridge.d.ts.map +1 -0
  264. package/dist/platformBridge.js +19 -0
  265. package/dist/platformBridge.js.map +1 -0
  266. package/dist/providerSelector.d.ts +28 -0
  267. package/dist/providerSelector.d.ts.map +1 -0
  268. package/dist/providerSelector.js +104 -0
  269. package/dist/providerSelector.js.map +1 -0
  270. package/dist/services/connectionMode.d.ts +13 -0
  271. package/dist/services/connectionMode.d.ts.map +1 -0
  272. package/dist/services/connectionMode.js +31 -0
  273. package/dist/services/connectionMode.js.map +1 -0
  274. package/dist/sessionTabs.d.ts +48 -0
  275. package/dist/sessionTabs.d.ts.map +1 -0
  276. package/dist/sessionTabs.js +106 -0
  277. package/dist/sessionTabs.js.map +1 -0
  278. package/dist/stores/acpAgentStore.d.ts +264 -0
  279. package/dist/stores/acpAgentStore.d.ts.map +1 -0
  280. package/dist/stores/acpAgentStore.js +825 -0
  281. package/dist/stores/acpAgentStore.js.map +1 -0
  282. package/dist/stores/agentChatStore.d.ts +529 -0
  283. package/dist/stores/agentChatStore.d.ts.map +1 -0
  284. package/dist/stores/agentChatStore.js +5309 -0
  285. package/dist/stores/agentChatStore.js.map +1 -0
  286. package/dist/stores/agentIdeStore.d.ts +9 -0
  287. package/dist/stores/agentIdeStore.d.ts.map +1 -0
  288. package/dist/stores/agentIdeStore.js +8 -0
  289. package/dist/stores/agentIdeStore.js.map +1 -0
  290. package/dist/stores/agentSearchStore.d.ts +174 -0
  291. package/dist/stores/agentSearchStore.d.ts.map +1 -0
  292. package/dist/stores/agentSearchStore.js +305 -0
  293. package/dist/stores/agentSearchStore.js.map +1 -0
  294. package/dist/stores/authStore.d.ts +26 -0
  295. package/dist/stores/authStore.d.ts.map +1 -0
  296. package/dist/stores/authStore.js +163 -0
  297. package/dist/stores/authStore.js.map +1 -0
  298. package/dist/stores/entitySettingsStore.d.ts +236 -0
  299. package/dist/stores/entitySettingsStore.d.ts.map +1 -0
  300. package/dist/stores/entitySettingsStore.js +916 -0
  301. package/dist/stores/entitySettingsStore.js.map +1 -0
  302. package/dist/stores/permissionStore.d.ts +25 -0
  303. package/dist/stores/permissionStore.d.ts.map +1 -0
  304. package/dist/stores/permissionStore.js +58 -0
  305. package/dist/stores/permissionStore.js.map +1 -0
  306. package/dist/stores/suggestionStore.d.ts +29 -0
  307. package/dist/stores/suggestionStore.d.ts.map +1 -0
  308. package/dist/stores/suggestionStore.js +160 -0
  309. package/dist/stores/suggestionStore.js.map +1 -0
  310. package/dist/stores/tabStore.d.ts +30 -0
  311. package/dist/stores/tabStore.d.ts.map +1 -0
  312. package/dist/stores/tabStore.js +252 -0
  313. package/dist/stores/tabStore.js.map +1 -0
  314. package/dist/stores/themeStore.d.ts +13 -0
  315. package/dist/stores/themeStore.d.ts.map +1 -0
  316. package/dist/stores/themeStore.js +77 -0
  317. package/dist/stores/themeStore.js.map +1 -0
  318. package/dist/stores/workspaceStore.d.ts +175 -0
  319. package/dist/stores/workspaceStore.d.ts.map +1 -0
  320. package/dist/stores/workspaceStore.js +694 -0
  321. package/dist/stores/workspaceStore.js.map +1 -0
  322. package/dist/stores/xenoChatStore.d.ts +88 -0
  323. package/dist/stores/xenoChatStore.d.ts.map +1 -0
  324. package/dist/stores/xenoChatStore.js +572 -0
  325. package/dist/stores/xenoChatStore.js.map +1 -0
  326. package/dist/toolCardProjection.d.ts +33 -0
  327. package/dist/toolCardProjection.d.ts.map +1 -0
  328. package/dist/toolCardProjection.js +62 -0
  329. package/dist/toolCardProjection.js.map +1 -0
  330. package/dist/types/agentEditor.d.ts +39 -0
  331. package/dist/types/agentEditor.d.ts.map +1 -0
  332. package/dist/types/agentEditor.js +2 -0
  333. package/dist/types/agentEditor.js.map +1 -0
  334. package/dist/types/agentRuntimeProvider.d.ts +2 -0
  335. package/dist/types/agentRuntimeProvider.d.ts.map +1 -0
  336. package/dist/types/agentRuntimeProvider.js +2 -0
  337. package/dist/types/agentRuntimeProvider.js.map +1 -0
  338. package/dist/utils/acpExecutionAuthority.d.ts +18 -0
  339. package/dist/utils/acpExecutionAuthority.d.ts.map +1 -0
  340. package/dist/utils/acpExecutionAuthority.js +22 -0
  341. package/dist/utils/acpExecutionAuthority.js.map +1 -0
  342. package/dist/utils/agentAttachedContextPrompt.d.ts +2 -0
  343. package/dist/utils/agentAttachedContextPrompt.d.ts.map +1 -0
  344. package/dist/utils/agentAttachedContextPrompt.js +2 -0
  345. package/dist/utils/agentAttachedContextPrompt.js.map +1 -0
  346. package/dist/utils/agentModelContext.d.ts +2 -0
  347. package/dist/utils/agentModelContext.d.ts.map +1 -0
  348. package/dist/utils/agentModelContext.js +2 -0
  349. package/dist/utils/agentModelContext.js.map +1 -0
  350. package/dist/utils/agentReasoningEffort.d.ts +3 -0
  351. package/dist/utils/agentReasoningEffort.d.ts.map +1 -0
  352. package/dist/utils/agentReasoningEffort.js +2 -0
  353. package/dist/utils/agentReasoningEffort.js.map +1 -0
  354. package/dist/utils/agentRuntimeProvider.d.ts +3 -0
  355. package/dist/utils/agentRuntimeProvider.d.ts.map +1 -0
  356. package/dist/utils/agentRuntimeProvider.js +2 -0
  357. package/dist/utils/agentRuntimeProvider.js.map +1 -0
  358. package/dist/utils/cloudModels.d.ts +3 -0
  359. package/dist/utils/cloudModels.d.ts.map +1 -0
  360. package/dist/utils/cloudModels.js +181 -0
  361. package/dist/utils/cloudModels.js.map +1 -0
  362. package/dist/utils/conversationRuntime.d.ts +3 -0
  363. package/dist/utils/conversationRuntime.d.ts.map +1 -0
  364. package/dist/utils/conversationRuntime.js +2 -0
  365. package/dist/utils/conversationRuntime.js.map +1 -0
  366. package/dist/utils/fileCreateIntent.d.ts +16 -0
  367. package/dist/utils/fileCreateIntent.d.ts.map +1 -0
  368. package/dist/utils/fileCreateIntent.js +123 -0
  369. package/dist/utils/fileCreateIntent.js.map +1 -0
  370. package/dist/utils/legacyAgentRuntimeEvents.d.ts +2 -0
  371. package/dist/utils/legacyAgentRuntimeEvents.d.ts.map +1 -0
  372. package/dist/utils/legacyAgentRuntimeEvents.js +2 -0
  373. package/dist/utils/legacyAgentRuntimeEvents.js.map +1 -0
  374. package/dist/utils/markdownWindowsPaths.d.ts +2 -0
  375. package/dist/utils/markdownWindowsPaths.d.ts.map +1 -0
  376. package/dist/utils/markdownWindowsPaths.js +2 -0
  377. package/dist/utils/markdownWindowsPaths.js.map +1 -0
  378. package/dist/utils/workspaceSelectionContinuation.d.ts +2 -0
  379. package/dist/utils/workspaceSelectionContinuation.d.ts.map +1 -0
  380. package/dist/utils/workspaceSelectionContinuation.js +2 -0
  381. package/dist/utils/workspaceSelectionContinuation.js.map +1 -0
  382. package/package.json +53 -0
  383. package/src/agent.css +1156 -0
  384. package/src/foundation.css +62 -0
@@ -0,0 +1,506 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { getAgentPlatformBridge } from '../../platformBridge';
3
+ /**
4
+ * PluginManager - SDK PluginHost + MCP manager surface.
5
+ *
6
+ * State is owned by the main-process PluginMcpManagerService under ~/.xeno.
7
+ * This renderer only manages UI state and sends scoped commands over IPC.
8
+ */
9
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
10
+ import { AlertTriangle, Check, Eye, Package, Pause, Play, PlugZap, Plus, RefreshCw, Search, Server, ShieldAlert, ShieldCheck, Trash2, Upload, Download, } from 'lucide-react';
11
+ function asStringArray(value) {
12
+ return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
13
+ }
14
+ function asRecord(value) {
15
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
16
+ }
17
+ function asPolicy(value) {
18
+ return value === 'none' || value === 'prompts' || value === 'resources' || value === 'context' || value === 'all' ? value : 'context';
19
+ }
20
+ function asTrust(value, fallback = {}) {
21
+ const record = asRecord(value);
22
+ const state = record.state === 'trusted' || record.state === 'blocked' || record.state === 'review-required' ? record.state : fallback.state || 'review-required';
23
+ const riskLevel = record.riskLevel === 'low' || record.riskLevel === 'medium' || record.riskLevel === 'high' ? record.riskLevel : fallback.riskLevel || 'medium';
24
+ const signatureStatus = record.signatureStatus === 'verified' || record.signatureStatus === 'unsigned' || record.signatureStatus === 'unknown' ? record.signatureStatus : fallback.signatureStatus || 'unknown';
25
+ return {
26
+ state,
27
+ riskLevel,
28
+ signatureStatus,
29
+ integrityHash: typeof record.integrityHash === 'string' ? record.integrityHash : fallback.integrityHash,
30
+ manifestHash: typeof record.manifestHash === 'string' ? record.manifestHash : fallback.manifestHash,
31
+ approvedConfigHash: typeof record.approvedConfigHash === 'string' ? record.approvedConfigHash : fallback.approvedConfigHash,
32
+ currentConfigHash: typeof record.currentConfigHash === 'string' ? record.currentConfigHash : fallback.currentConfigHash,
33
+ configDrift: typeof record.configDrift === 'boolean' ? record.configDrift : fallback.configDrift,
34
+ approvedAt: typeof record.approvedAt === 'number' ? record.approvedAt : fallback.approvedAt,
35
+ deniedAt: typeof record.deniedAt === 'number' ? record.deniedAt : fallback.deniedAt,
36
+ reasons: asStringArray(record.reasons),
37
+ requiresApproval: typeof record.requiresApproval === 'boolean' ? record.requiresApproval : fallback.requiresApproval ?? state !== 'trusted',
38
+ };
39
+ }
40
+ function asPlugin(value) {
41
+ const record = asRecord(value);
42
+ if (typeof record.name !== 'string')
43
+ return null;
44
+ return {
45
+ name: record.name,
46
+ version: typeof record.version === 'string' ? record.version : 'unknown',
47
+ description: typeof record.description === 'string' ? record.description : '',
48
+ status: ['installed', 'active', 'disabled', 'error', 'updating'].includes(String(record.status)) ? record.status : 'installed',
49
+ installedAt: typeof record.installedAt === 'string' ? record.installedAt : '',
50
+ path: typeof record.path === 'string' ? record.path : '',
51
+ capabilities: asStringArray(record.capabilities),
52
+ permissions: asStringArray(record.permissions),
53
+ tools: asStringArray(record.tools),
54
+ prompts: asStringArray(record.prompts),
55
+ commands: asStringArray(record.commands),
56
+ panels: asStringArray(record.panels),
57
+ keywords: asStringArray(record.keywords),
58
+ error: typeof record.error === 'string' ? record.error : undefined,
59
+ trust: asTrust(record.trust, { riskLevel: 'medium', requiresApproval: true }),
60
+ };
61
+ }
62
+ function asMcpTool(value, fallbackServer = '') {
63
+ const record = asRecord(value);
64
+ const name = typeof record.name === 'string' ? record.name : '';
65
+ if (!name)
66
+ return null;
67
+ return {
68
+ server: typeof record.server === 'string' ? record.server : fallbackServer,
69
+ name,
70
+ description: typeof record.description === 'string' ? record.description : '',
71
+ inputSchema: asRecord(record.inputSchema),
72
+ };
73
+ }
74
+ function asMcpPrompt(value, fallbackServer = '') {
75
+ const record = asRecord(value);
76
+ const name = typeof record.name === 'string' ? record.name : '';
77
+ if (!name)
78
+ return null;
79
+ return {
80
+ server: typeof record.server === 'string' ? record.server : fallbackServer,
81
+ name,
82
+ description: typeof record.description === 'string' ? record.description : '',
83
+ arguments: Array.isArray(record.arguments) ? record.arguments : [],
84
+ };
85
+ }
86
+ function asMcpResource(value, fallbackServer = '') {
87
+ const record = asRecord(value);
88
+ const uri = typeof record.uri === 'string' ? record.uri : '';
89
+ if (!uri)
90
+ return null;
91
+ return {
92
+ server: typeof record.server === 'string' ? record.server : fallbackServer,
93
+ uri,
94
+ name: typeof record.name === 'string' ? record.name : undefined,
95
+ description: typeof record.description === 'string' ? record.description : undefined,
96
+ mimeType: typeof record.mimeType === 'string' ? record.mimeType : undefined,
97
+ };
98
+ }
99
+ function asMcpServer(value) {
100
+ const record = asRecord(value);
101
+ if (typeof record.name !== 'string')
102
+ return null;
103
+ const serverName = record.name;
104
+ return {
105
+ name: serverName,
106
+ transport: record.transport === 'sse' ? 'sse' : 'stdio',
107
+ command: typeof record.command === 'string' ? record.command : undefined,
108
+ args: asStringArray(record.args),
109
+ cwd: typeof record.cwd === 'string' ? record.cwd : undefined,
110
+ url: typeof record.url === 'string' ? record.url : undefined,
111
+ approvalRequired: record.approvalRequired !== false,
112
+ approvalState: record.approvalState === 'approved' || record.approvalState === 'denied' ? record.approvalState : undefined,
113
+ disabled: !!record.disabled,
114
+ scope: typeof record.scope === 'string' ? record.scope : 'user',
115
+ source: record.source === 'sdk-config' ? 'sdk-config' : 'hub',
116
+ sourcePath: typeof record.sourcePath === 'string' ? record.sourcePath : '',
117
+ status: ['configured', 'connecting', 'ready', 'error', 'disconnected', 'skipped'].includes(String(record.status)) ? record.status : 'configured',
118
+ tools: Array.isArray(record.tools) ? record.tools.map((tool) => asMcpTool(tool, serverName)).filter((tool) => !!tool) : [],
119
+ prompts: Array.isArray(record.prompts) ? record.prompts.map((prompt) => asMcpPrompt(prompt, serverName)).filter((prompt) => !!prompt) : [],
120
+ resources: Array.isArray(record.resources) ? record.resources.map((resource) => asMcpResource(resource, serverName)).filter((resource) => !!resource) : [],
121
+ trust: asTrust(record.trust, { state: record.approvalState === 'approved' ? 'trusted' : 'review-required', riskLevel: record.transport === 'sse' ? 'medium' : 'high', requiresApproval: record.approvalState !== 'approved' }),
122
+ error: typeof record.error === 'string' ? record.error : undefined,
123
+ };
124
+ }
125
+ function asScopedPolicy(value) {
126
+ const record = asRecord(value);
127
+ const scopeRecord = asRecord(record.scope);
128
+ const type = scopeRecord.type === 'workspace' || scopeRecord.type === 'team' || scopeRecord.type === 'agent' || scopeRecord.type === 'global'
129
+ ? scopeRecord.type
130
+ : 'global';
131
+ if (typeof record.id !== 'string')
132
+ return null;
133
+ return {
134
+ id: record.id,
135
+ scope: {
136
+ type,
137
+ workspaceId: typeof scopeRecord.workspaceId === 'string' ? scopeRecord.workspaceId : undefined,
138
+ teamId: typeof scopeRecord.teamId === 'string' ? scopeRecord.teamId : undefined,
139
+ agentId: typeof scopeRecord.agentId === 'string' ? scopeRecord.agentId : undefined,
140
+ },
141
+ pluginAllowlist: asStringArray(record.pluginAllowlist),
142
+ pluginDenylist: asStringArray(record.pluginDenylist),
143
+ mcpServerAllowlist: asStringArray(record.mcpServerAllowlist),
144
+ mcpServerDenylist: asStringArray(record.mcpServerDenylist),
145
+ mcpRegistryPolicy: record.mcpRegistryPolicy ? asPolicy(record.mcpRegistryPolicy) : undefined,
146
+ enabled: record.enabled !== false,
147
+ updatedAt: typeof record.updatedAt === 'number' ? record.updatedAt : 0,
148
+ };
149
+ }
150
+ function asSnapshot(value) {
151
+ const record = asRecord(value);
152
+ const plugins = Array.isArray(record.plugins) ? record.plugins.map(asPlugin).filter((plugin) => !!plugin) : [];
153
+ const mcpServers = Array.isArray(record.mcpServers) ? record.mcpServers.map(asMcpServer).filter((server) => !!server) : [];
154
+ const mcpTools = Array.isArray(record.mcpTools) ? record.mcpTools.map((tool) => asMcpTool(tool)).filter((tool) => !!tool) : mcpServers.flatMap((server) => server.tools);
155
+ const mcpPrompts = Array.isArray(record.mcpPrompts) ? record.mcpPrompts.map((prompt) => asMcpPrompt(prompt)).filter((prompt) => !!prompt) : mcpServers.flatMap((server) => server.prompts);
156
+ const mcpResources = Array.isArray(record.mcpResources) ? record.mcpResources.map((resource) => asMcpResource(resource)).filter((resource) => !!resource) : mcpServers.flatMap((server) => server.resources);
157
+ const scopedPolicies = Array.isArray(record.scopedPolicies) ? record.scopedPolicies.map(asScopedPolicy).filter((policy) => !!policy) : [];
158
+ const effectiveRecord = asRecord(record.effectivePolicy);
159
+ return {
160
+ plugins,
161
+ activePluginTools: asStringArray(record.activePluginTools),
162
+ mcpServers,
163
+ mcpTools,
164
+ mcpPrompts,
165
+ mcpResources,
166
+ mcpRegistryPolicy: asPolicy(record.mcpRegistryPolicy),
167
+ scopedPolicies,
168
+ effectivePolicy: {
169
+ caller: asRecord(effectiveRecord.caller),
170
+ mcpRegistryPolicy: asPolicy(effectiveRecord.mcpRegistryPolicy || record.mcpRegistryPolicy),
171
+ pluginAllowlist: asStringArray(effectiveRecord.pluginAllowlist),
172
+ pluginDenylist: asStringArray(effectiveRecord.pluginDenylist),
173
+ mcpServerAllowlist: asStringArray(effectiveRecord.mcpServerAllowlist),
174
+ mcpServerDenylist: asStringArray(effectiveRecord.mcpServerDenylist),
175
+ matchedPolicyIds: asStringArray(effectiveRecord.matchedPolicyIds),
176
+ },
177
+ stats: {
178
+ pluginCount: plugins.length,
179
+ activePluginCount: plugins.filter((plugin) => plugin.status === 'active').length,
180
+ activePluginToolCount: asStringArray(record.activePluginTools).length,
181
+ mcpServerCount: mcpServers.length,
182
+ connectedMcpServerCount: mcpServers.filter((server) => server.status === 'ready').length,
183
+ mcpToolCount: mcpTools.length,
184
+ mcpPromptCount: mcpPrompts.length,
185
+ mcpResourceCount: mcpResources.length,
186
+ },
187
+ };
188
+ }
189
+ function asMarketplaceListing(value) {
190
+ const record = asRecord(value);
191
+ if (typeof record.name !== 'string')
192
+ return null;
193
+ return {
194
+ name: record.name,
195
+ version: typeof record.version === 'string' ? record.version : 'latest',
196
+ description: typeof record.description === 'string' ? record.description : '',
197
+ keywords: asStringArray(record.keywords),
198
+ verified: record.verified === true,
199
+ downloads: typeof record.downloads === 'number' ? record.downloads : undefined,
200
+ rating: typeof record.rating === 'number' ? record.rating : undefined,
201
+ };
202
+ }
203
+ function statusTone(status) {
204
+ if (status === 'active' || status === 'ready' || status === 'approved' || status === 'success' || status === 'trusted')
205
+ return 'text-emerald-300/80 bg-emerald-400/[0.08] border-emerald-300/[0.12]';
206
+ if (status === 'error' || status === 'denied' || status === 'blocked' || status === 'high')
207
+ return 'text-red-300/80 bg-red-400/[0.08] border-red-300/[0.12]';
208
+ if (status === 'connecting' || status === 'updating' || status === 'info' || status === 'review-required' || status === 'medium')
209
+ return 'text-amber-300/80 bg-amber-400/[0.08] border-amber-300/[0.12]';
210
+ return 'text-white/45 bg-white/[0.04] border-white/[0.08]';
211
+ }
212
+ function Pill({ children, tone }) {
213
+ return (_jsx("span", { className: `px-1.5 py-0.5 border rounded-sm text-[10px] font-mono ${tone || 'text-white/35 bg-white/[0.04] border-white/[0.07]'}`, children: children }));
214
+ }
215
+ function csvToList(value) {
216
+ return value.split(',').map((entry) => entry.trim()).filter(Boolean);
217
+ }
218
+ function listToCsv(value) {
219
+ return value.join(', ');
220
+ }
221
+ function formatJson(value) {
222
+ try {
223
+ return JSON.stringify(value, null, 2);
224
+ }
225
+ catch {
226
+ return String(value);
227
+ }
228
+ }
229
+ function formatMcpResponse(result) {
230
+ const preview = asRecord(result.preview);
231
+ const metadata = asRecord(preview.metadata);
232
+ const redactedFields = asStringArray(metadata.redactedFields);
233
+ const warnings = asStringArray(metadata.riskWarnings);
234
+ const previewText = typeof preview.textPreview === 'string' ? preview.textPreview : '';
235
+ const meta = [
236
+ `audit: ${result.auditId || 'not-recorded'}`,
237
+ `kind: ${typeof preview.kind === 'string' ? preview.kind : 'unknown'}`,
238
+ `source: ${typeof metadata.source === 'string' ? metadata.source : 'unknown'}`,
239
+ `content-types: ${asStringArray(metadata.contentTypes).join(', ') || 'unknown'}`,
240
+ `items: ${typeof preview.itemCount === 'number' ? preview.itemCount : 0}`,
241
+ `bytes: ${typeof preview.byteLength === 'number' ? preview.byteLength : 0}`,
242
+ `preview-bytes: ${typeof metadata.previewByteLength === 'number' ? metadata.previewByteLength : 0}`,
243
+ metadata.redacted === true ? `redacted: yes (${redactedFields.join(', ') || 'sensitive fields'})` : 'redacted: no',
244
+ preview.truncated === true ? 'truncated: yes' : 'truncated: no',
245
+ warnings.length > 0 ? `warnings: ${warnings.join(' | ')}` : 'warnings: none',
246
+ ].join('\n');
247
+ return `${meta}\n\n${previewText || formatJson(result.result)}`;
248
+ }
249
+ function formatMcpError(result, fallback) {
250
+ const denial = asRecord(result.denial);
251
+ const reasons = asStringArray(denial.reasons);
252
+ const remediation = Array.isArray(denial.remediation)
253
+ ? denial.remediation.map((item) => {
254
+ const record = asRecord(item);
255
+ return typeof record.label === 'string' && typeof record.description === 'string'
256
+ ? `${record.label}: ${record.description}`
257
+ : '';
258
+ }).filter(Boolean)
259
+ : [];
260
+ return [
261
+ result.error || (typeof denial.message === 'string' ? denial.message : fallback),
262
+ reasons.length > 0 ? `Reasons:\n${reasons.map((reason) => `- ${reason}`).join('\n')}` : '',
263
+ remediation.length > 0 ? `Remediation:\n${remediation.map((item) => `- ${item}`).join('\n')}` : '',
264
+ ].filter(Boolean).join('\n\n');
265
+ }
266
+ function parseJsonObject(value) {
267
+ const trimmed = value.trim();
268
+ if (!trimmed)
269
+ return {};
270
+ const parsed = JSON.parse(trimmed);
271
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
272
+ }
273
+ function scopeLabel(scope) {
274
+ if (scope.type === 'agent')
275
+ return `agent:${scope.workspaceId || '*'}:${scope.teamId || '*'}:${scope.agentId || '*'}`;
276
+ if (scope.type === 'team')
277
+ return `team:${scope.workspaceId || '*'}:${scope.teamId || '*'}`;
278
+ if (scope.type === 'workspace')
279
+ return `workspace:${scope.workspaceId || '*'}`;
280
+ return 'global';
281
+ }
282
+ export function PluginManager({ className = '', caller }) {
283
+ const [tab, setTab] = useState('plugins');
284
+ const [snapshot, setSnapshot] = useState(() => asSnapshot(null));
285
+ const [loading, setLoading] = useState(true);
286
+ const [busy, setBusy] = useState(null);
287
+ const [error, setError] = useState(null);
288
+ const [installInput, setInstallInput] = useState('');
289
+ const [marketplaceQuery, setMarketplaceQuery] = useState('');
290
+ const [marketplaceResults, setMarketplaceResults] = useState([]);
291
+ const [mcpName, setMcpName] = useState('');
292
+ const [mcpTransport, setMcpTransport] = useState('stdio');
293
+ const [mcpTarget, setMcpTarget] = useState('');
294
+ const [mcpArgs, setMcpArgs] = useState('');
295
+ const [scopeType, setScopeType] = useState('agent');
296
+ const [scopeWorkspaceId, setScopeWorkspaceId] = useState(caller?.workspaceId || '');
297
+ const [scopeTeamId, setScopeTeamId] = useState(caller?.teamId || '');
298
+ const [scopeAgentId, setScopeAgentId] = useState(caller?.agentId || '');
299
+ const [policyPluginAllow, setPolicyPluginAllow] = useState('');
300
+ const [policyPluginDeny, setPolicyPluginDeny] = useState('');
301
+ const [policyMcpAllow, setPolicyMcpAllow] = useState('');
302
+ const [policyMcpDeny, setPolicyMcpDeny] = useState('');
303
+ const [policyMcpExposure, setPolicyMcpExposure] = useState('context');
304
+ const [projectCwd, setProjectCwd] = useState(caller?.allowedDirectories?.[0] || '');
305
+ const [mcpInputJson, setMcpInputJson] = useState('{}');
306
+ const [resultPanel, setResultPanel] = useState(null);
307
+ useEffect(() => {
308
+ setScopeWorkspaceId(caller?.workspaceId || '');
309
+ setScopeTeamId(caller?.teamId || '');
310
+ setScopeAgentId(caller?.agentId || '');
311
+ setProjectCwd((current) => current || caller?.allowedDirectories?.[0] || '');
312
+ }, [caller?.agentId, caller?.allowedDirectories, caller?.teamId, caller?.workspaceId]);
313
+ const snapshotRequest = useMemo(() => ({
314
+ includeSdkConfigured: true,
315
+ cwd: caller?.allowedDirectories?.[0],
316
+ workspaceId: caller?.workspaceId,
317
+ teamId: caller?.teamId,
318
+ agentId: caller?.agentId,
319
+ allowedDirectories: caller?.allowedDirectories,
320
+ }), [caller?.agentId, caller?.allowedDirectories, caller?.teamId, caller?.workspaceId]);
321
+ const loadSnapshot = useCallback(async () => {
322
+ setLoading(true);
323
+ setError(null);
324
+ try {
325
+ const result = await getAgentPlatformBridge().pluginMcp.snapshot(snapshotRequest);
326
+ if (!result.success)
327
+ throw new Error('Failed to load plugin/MCP manager state.');
328
+ setSnapshot(asSnapshot(result.snapshot));
329
+ }
330
+ catch (err) {
331
+ setError(err instanceof Error ? err.message : 'Failed to load plugin/MCP manager state.');
332
+ }
333
+ finally {
334
+ setLoading(false);
335
+ }
336
+ }, [snapshotRequest]);
337
+ useEffect(() => {
338
+ void loadSnapshot();
339
+ }, [loadSnapshot]);
340
+ const runAction = useCallback(async (label, action) => {
341
+ setBusy(label);
342
+ setError(null);
343
+ try {
344
+ const result = await action();
345
+ if (!result.success)
346
+ throw new Error(result.error || `${label} failed.`);
347
+ if (result.snapshot)
348
+ setSnapshot(asSnapshot(result.snapshot));
349
+ else
350
+ await loadSnapshot();
351
+ }
352
+ catch (err) {
353
+ setError(err instanceof Error ? err.message : `${label} failed.`);
354
+ }
355
+ finally {
356
+ setBusy(null);
357
+ }
358
+ }, [loadSnapshot]);
359
+ const activePluginCount = useMemo(() => snapshot.plugins.filter((plugin) => plugin.status === 'active').length, [snapshot.plugins]);
360
+ const buildScope = useCallback(() => ({
361
+ type: scopeType,
362
+ workspaceId: scopeType === 'global' ? undefined : scopeWorkspaceId.trim() || undefined,
363
+ teamId: scopeType === 'team' || scopeType === 'agent' ? scopeTeamId.trim() || undefined : undefined,
364
+ agentId: scopeType === 'agent' ? scopeAgentId.trim() || undefined : undefined,
365
+ }), [scopeAgentId, scopeTeamId, scopeType, scopeWorkspaceId]);
366
+ const installPlugin = async (value = installInput) => {
367
+ const input = value.trim();
368
+ if (!input)
369
+ return;
370
+ const looksLocal = /^[a-zA-Z]:[\\/]/.test(input) || input.startsWith('\\\\') || input.startsWith('/') || input.includes('\\');
371
+ await runAction('install plugin', async () => looksLocal
372
+ ? getAgentPlatformBridge().pluginMcp.installLocalPlugin({ pluginPath: input, caller })
373
+ : getAgentPlatformBridge().pluginMcp.installPlugin({ packageName: input, caller }));
374
+ setInstallInput('');
375
+ };
376
+ const searchMarketplace = async () => {
377
+ setBusy('search marketplace');
378
+ setError(null);
379
+ try {
380
+ const result = await getAgentPlatformBridge().pluginMcp.searchMarketplace({ query: marketplaceQuery.trim(), limit: 24, caller });
381
+ if (!result.success)
382
+ throw new Error(result.error || 'Marketplace search failed.');
383
+ setMarketplaceResults((Array.isArray(result.listings) ? result.listings : []).map(asMarketplaceListing).filter((listing) => !!listing));
384
+ }
385
+ catch (err) {
386
+ setError(err instanceof Error ? err.message : 'Marketplace search failed.');
387
+ }
388
+ finally {
389
+ setBusy(null);
390
+ }
391
+ };
392
+ const addMcpServer = async () => {
393
+ const name = mcpName.trim();
394
+ const target = mcpTarget.trim();
395
+ if (!name || !target)
396
+ return;
397
+ await runAction('add MCP server', async () => getAgentPlatformBridge().pluginMcp.upsertMcpServer({
398
+ caller,
399
+ server: {
400
+ name,
401
+ transport: mcpTransport,
402
+ ...(mcpTransport === 'stdio'
403
+ ? { command: target, args: mcpArgs.trim().split(/\s+/).filter(Boolean) }
404
+ : { url: target }),
405
+ approvalRequired: true,
406
+ },
407
+ }));
408
+ setMcpName('');
409
+ setMcpTarget('');
410
+ setMcpArgs('');
411
+ };
412
+ const saveScopedPolicy = async () => {
413
+ await runAction('save scoped policy', async () => getAgentPlatformBridge().pluginMcp.setScopedPolicy({
414
+ caller,
415
+ policy: {
416
+ scope: buildScope(),
417
+ pluginAllowlist: csvToList(policyPluginAllow),
418
+ pluginDenylist: csvToList(policyPluginDeny),
419
+ mcpServerAllowlist: csvToList(policyMcpAllow),
420
+ mcpServerDenylist: csvToList(policyMcpDeny),
421
+ mcpRegistryPolicy: policyMcpExposure,
422
+ enabled: true,
423
+ },
424
+ }));
425
+ };
426
+ const syncProjectMcp = async (direction) => {
427
+ await runAction(`${direction} project MCP`, async () => getAgentPlatformBridge().pluginMcp.syncProjectMcp({
428
+ cwd: projectCwd,
429
+ direction,
430
+ caller,
431
+ }));
432
+ };
433
+ const previewTool = async (tool) => {
434
+ setBusy(`call ${tool.name}`);
435
+ setResultPanel(null);
436
+ setError(null);
437
+ try {
438
+ const input = parseJsonObject(mcpInputJson);
439
+ const result = await getAgentPlatformBridge().pluginMcp.callMcpTool({ serverName: tool.server, toolName: tool.name, input, caller });
440
+ if (!result.success) {
441
+ setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'error', body: formatMcpError(result, `MCP tool ${tool.name} failed.`) });
442
+ return;
443
+ }
444
+ setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'success', body: formatMcpResponse(result) });
445
+ }
446
+ catch (err) {
447
+ setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'error', body: err instanceof Error ? err.message : 'Tool call failed.' });
448
+ }
449
+ finally {
450
+ setBusy(null);
451
+ }
452
+ };
453
+ const previewPrompt = async (prompt) => {
454
+ setBusy(`prompt ${prompt.name}`);
455
+ setResultPanel(null);
456
+ setError(null);
457
+ try {
458
+ const input = parseJsonObject(mcpInputJson);
459
+ const result = await getAgentPlatformBridge().pluginMcp.getMcpPrompt({ serverName: prompt.server, promptName: prompt.name, input, caller });
460
+ if (!result.success) {
461
+ setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'error', body: formatMcpError(result, `MCP prompt ${prompt.name} failed.`) });
462
+ return;
463
+ }
464
+ setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'success', body: formatMcpResponse(result) });
465
+ }
466
+ catch (err) {
467
+ setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'error', body: err instanceof Error ? err.message : 'Prompt preview failed.' });
468
+ }
469
+ finally {
470
+ setBusy(null);
471
+ }
472
+ };
473
+ const previewResource = async (resource) => {
474
+ setBusy(`resource ${resource.name || resource.uri}`);
475
+ setResultPanel(null);
476
+ setError(null);
477
+ try {
478
+ const result = await getAgentPlatformBridge().pluginMcp.readMcpResource({ serverName: resource.server, uri: resource.uri, caller });
479
+ if (!result.success) {
480
+ setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'error', body: formatMcpError(result, `MCP resource ${resource.uri} failed.`) });
481
+ return;
482
+ }
483
+ setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'success', body: formatMcpResponse(result) });
484
+ }
485
+ catch (err) {
486
+ setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'error', body: err instanceof Error ? err.message : 'Resource preview failed.' });
487
+ }
488
+ finally {
489
+ setBusy(null);
490
+ }
491
+ };
492
+ return (_jsxs("div", { className: `flex flex-col h-full bg-[#151515] ${className}`, children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Package, { className: "w-4 h-4 text-white/45", strokeWidth: 1.5 }), _jsx("span", { className: "text-[13px] font-medium text-white/75", children: "PluginHost / MCP" }), _jsxs(Pill, { children: [snapshot.stats.pluginCount, " plugins"] }), _jsxs(Pill, { children: [snapshot.stats.mcpServerCount, " mcp"] }), _jsxs(Pill, { tone: statusTone('info'), children: [snapshot.effectivePolicy.matchedPolicyIds.length, " scoped policies"] })] }), _jsx("button", { onClick: () => void loadSnapshot(), disabled: loading || !!busy, className: "p-1 text-white/35 hover:text-white/70 disabled:opacity-30 transition-colors", "aria-label": "Refresh plugin and MCP state", children: _jsx(RefreshCw, { className: `w-3.5 h-3.5 ${loading ? 'animate-spin' : ''}`, strokeWidth: 1.5 }) })] }), _jsxs("div", { className: "px-4 py-2 border-b border-white/[0.06] flex items-center gap-2", children: [['marketplace', 'plugins', 'mcp'].map((item) => (_jsx("button", { onClick: () => setTab(item), className: `px-2 py-1 text-[11px] border rounded-sm transition-colors ${tab === item ? 'text-white/80 bg-white/[0.08] border-white/[0.14]' : 'text-white/35 border-white/[0.06] hover:text-white/60'}`, children: item === 'mcp' ? 'MCP Servers' : item[0].toUpperCase() + item.slice(1) }, item))), _jsx("span", { className: "ml-auto text-[10px] text-white/25", children: busy ? `Working: ${busy}` : `${activePluginCount} active plugins, ${snapshot.stats.connectedMcpServerCount} connected MCP servers` })] }), error && (_jsxs("div", { className: "mx-4 mt-3 px-3 py-2 border border-red-300/[0.12] bg-red-400/[0.06] text-[11px] text-red-200/80 flex items-center gap-2", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }), error] })), tab === 'marketplace' && (_jsxs("div", { className: "flex-1 min-h-0 flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] flex gap-2", children: [_jsx("input", { value: marketplaceQuery, onChange: (event) => setMarketplaceQuery(event.target.value), onKeyDown: (event) => { if (event.key === 'Enter')
493
+ void searchMarketplace(); }, placeholder: "Search SDK marketplace packages...", className: "flex-1 px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsxs("button", { onClick: () => void searchMarketplace(), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Search, { className: "w-3 h-3", strokeWidth: 1.5 }), "Search"] })] }), _jsx("div", { className: "flex-1 overflow-auto divide-y divide-white/[0.05]", children: marketplaceResults.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Package, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "Search the SDK marketplace" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Install verified or internal plugin packages into the durable Hub PluginHost." })] })) : marketplaceResults.map((listing) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(PlugZap, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: listing.name }), _jsxs(Pill, { children: ["v", listing.version] }), listing.verified && _jsx(Pill, { tone: statusTone('success'), children: "verified" })] }), _jsx("p", { className: "text-[11px] text-white/40 mt-1", children: listing.description || 'No description provided.' }), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [(listing.keywords || []).slice(0, 8).map((keyword) => _jsx(Pill, { children: keyword }, keyword)), typeof listing.downloads === 'number' && _jsxs(Pill, { children: [listing.downloads.toLocaleString(), " downloads"] })] })] }), _jsx("button", { onClick: () => void installPlugin(listing.name), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 shrink-0", children: "Install" })] }) }, listing.name))) })] })), tab === 'plugins' && (_jsxs("div", { className: "flex-1 min-h-0 flex flex-col", children: [_jsx("div", { className: "px-4 py-3 border-b border-white/[0.06]", children: _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { value: installInput, onChange: (event) => setInstallInput(event.target.value), onKeyDown: (event) => { if (event.key === 'Enter')
494
+ void installPlugin(); }, placeholder: "npm package or local plugin path...", className: "flex-1 px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]", disabled: !!busy }), _jsxs("button", { onClick: () => void installPlugin(), disabled: !!busy || !installInput.trim(), className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Plus, { className: "w-3 h-3", strokeWidth: 1.5 }), "Install"] })] }) }), _jsx("div", { className: "flex-1 overflow-auto", children: loading ? (_jsx("div", { className: "px-4 py-8 text-center text-[12px] text-white/30", children: "Loading PluginHost state..." })) : snapshot.plugins.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Package, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "No SDK plugins installed" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Install a local plugin path or npm package to extend agent capabilities." })] })) : (_jsx("div", { className: "divide-y divide-white/[0.05]", children: snapshot.plugins.map((plugin) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(PlugZap, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: plugin.name }), _jsxs(Pill, { children: ["v", plugin.version] }), _jsx(Pill, { tone: statusTone(plugin.status), children: plugin.status }), _jsx(Pill, { tone: statusTone(plugin.trust.state), children: plugin.trust.state }), _jsxs(Pill, { tone: statusTone(plugin.trust.riskLevel), children: ["risk:", plugin.trust.riskLevel] }), snapshot.effectivePolicy.pluginDenylist.includes(plugin.name) && _jsx(Pill, { tone: statusTone('error'), children: "denied in scope" })] }), _jsx("p", { className: "text-[11px] text-white/40 mt-1 truncate", children: plugin.description || plugin.path }), plugin.trust.reasons.length > 0 && (_jsx("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: plugin.trust.reasons.join(' ') })), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [plugin.capabilities.map((capability) => _jsx(Pill, { children: capability }, capability)), plugin.tools.slice(0, 8).map((tool) => _jsx(Pill, { tone: "text-cyan-200/70 bg-cyan-400/[0.07] border-cyan-300/[0.10]", children: tool }, tool))] }), plugin.error && _jsx("p", { className: "text-[11px] text-red-300/70 mt-2", children: plugin.error })] }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [plugin.trust.state !== 'trusted' && (_jsx("button", { onClick: () => void runAction(`trust ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.setPluginTrust({ name: plugin.name, decision: 'approved', caller })), className: "p-1.5 text-white/30 hover:text-emerald-200/80", "aria-label": `Trust ${plugin.name}`, children: _jsx(ShieldCheck, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), plugin.trust.state !== 'blocked' && (_jsx("button", { onClick: () => void runAction(`block ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.setPluginTrust({ name: plugin.name, decision: 'denied', caller })), className: "p-1.5 text-white/25 hover:text-amber-200/80", "aria-label": `Block ${plugin.name}`, children: _jsx(ShieldAlert, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), plugin.status === 'active' ? (_jsx("button", { onClick: () => void runAction(`deactivate ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.deactivatePlugin({ name: plugin.name, caller })), className: "p-1.5 text-white/35 hover:text-amber-200/80", "aria-label": `Deactivate ${plugin.name}`, children: _jsx(Pause, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })) : (_jsx("button", { onClick: () => void runAction(`activate ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.activatePlugin({ name: plugin.name, caller })), disabled: plugin.trust.state !== 'trusted', className: "p-1.5 text-white/35 hover:text-emerald-200/80 disabled:opacity-25 disabled:hover:text-white/35", "aria-label": `Activate ${plugin.name}`, children: _jsx(Play, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), _jsx("button", { onClick: () => void runAction(`remove ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.uninstallPlugin({ name: plugin.name, removeFiles: false, caller })), className: "p-1.5 text-white/25 hover:text-red-300/80", "aria-label": `Remove ${plugin.name}`, children: _jsx(Trash2, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })] })] }) }, plugin.name))) })) })] })), tab === 'mcp' && (_jsxs("div", { className: "flex-1 min-h-0 flex", children: [_jsxs("div", { className: "w-[58%] min-w-0 border-r border-white/[0.06] flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] grid grid-cols-[120px_95px_1fr_1fr_auto] gap-2", children: [_jsx("input", { value: mcpName, onChange: (event) => setMcpName(event.target.value), placeholder: "server-name", className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsxs("select", { value: mcpTransport, onChange: (event) => setMcpTransport(event.target.value === 'sse' ? 'sse' : 'stdio'), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: [_jsx("option", { value: "stdio", children: "stdio" }), _jsx("option", { value: "sse", children: "sse" })] }), _jsx("input", { value: mcpTarget, onChange: (event) => setMcpTarget(event.target.value), placeholder: mcpTransport === 'stdio' ? 'command, e.g. npx' : 'https://server/sse', className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsx("input", { value: mcpArgs, onChange: (event) => setMcpArgs(event.target.value), placeholder: "args for stdio...", disabled: mcpTransport === 'sse', className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18] disabled:opacity-30" }), _jsxs("button", { onClick: () => void addMcpServer(), disabled: !!busy || !mcpName.trim() || !mcpTarget.trim(), className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Plus, { className: "w-3 h-3", strokeWidth: 1.5 }), "Add"] })] }), _jsxs("div", { className: "px-4 py-2 border-b border-white/[0.06] flex items-center gap-2", children: [_jsx("span", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "Global exposure" }), ['none', 'prompts', 'resources', 'context', 'all'].map((policy) => (_jsx("button", { onClick: () => void runAction(`set MCP policy ${policy}`, () => getAgentPlatformBridge().pluginMcp.setMcpRegistryPolicy({ policy, caller })), className: `px-1.5 py-0.5 border rounded-sm text-[10px] ${snapshot.mcpRegistryPolicy === policy ? 'text-white/80 bg-white/[0.08] border-white/[0.14]' : 'text-white/35 border-white/[0.06]'}`, children: policy }, policy))), _jsx("button", { onClick: () => void runAction('reload MCP', () => getAgentPlatformBridge().pluginMcp.reloadMcp({ connect: true, ...snapshotRequest })), disabled: !!busy, className: "ml-auto px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30", children: "Reload approved" })] }), _jsx("div", { className: "flex-1 overflow-auto", children: loading ? (_jsx("div", { className: "px-4 py-8 text-center text-[12px] text-white/30", children: "Loading MCP registry..." })) : snapshot.mcpServers.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Server, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "No MCP servers configured" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Add a stdio or SSE server, approve it, then reload to discover tools." })] })) : (_jsx("div", { className: "divide-y divide-white/[0.05]", children: snapshot.mcpServers.map((server) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Server, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: server.name }), _jsx(Pill, { children: server.transport }), _jsx(Pill, { tone: statusTone(server.status), children: server.status }), _jsx(Pill, { tone: statusTone(server.approvalState || 'pending'), children: server.approvalState || 'pending' }), _jsx(Pill, { tone: statusTone(server.trust.state), children: server.trust.state }), _jsxs(Pill, { tone: statusTone(server.trust.riskLevel), children: ["risk:", server.trust.riskLevel] }), server.trust.configDrift && _jsx(Pill, { tone: statusTone('error'), children: "config drift" }), _jsx(Pill, { children: server.scope })] }), _jsx("p", { className: "text-[11px] text-white/38 mt-1 font-mono truncate", children: server.transport === 'stdio' ? [server.command, ...server.args].filter(Boolean).join(' ') : server.url }), server.trust.reasons.length > 0 && (_jsx("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: server.trust.reasons.join(' ') })), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [server.tools.slice(0, 8).map((tool) => (_jsx("button", { onClick: () => void previewTool(tool), className: "hover:opacity-80", children: _jsxs(Pill, { tone: "text-cyan-200/70 bg-cyan-400/[0.07] border-cyan-300/[0.10]", children: ["tool:", tool.name] }) }, `tool:${tool.name}`))), server.prompts.slice(0, 5).map((prompt) => (_jsx("button", { onClick: () => void previewPrompt(prompt), className: "hover:opacity-80", children: _jsxs(Pill, { children: ["prompt:", prompt.name] }) }, `prompt:${prompt.name}`))), server.resources.slice(0, 5).map((resource) => (_jsx("button", { onClick: () => void previewResource(resource), className: "hover:opacity-80", children: _jsxs(Pill, { children: ["resource:", resource.name || resource.uri] }) }, `resource:${resource.uri}`)))] }), server.error && _jsx("p", { className: "text-[11px] text-red-300/70 mt-2", children: server.error })] }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [_jsx("button", { onClick: () => void runAction(`approve ${server.name}`, () => getAgentPlatformBridge().pluginMcp.setMcpApproval({ name: server.name, decision: 'approved', caller })), className: "p-1.5 text-white/30 hover:text-emerald-200/80", "aria-label": `Approve ${server.name}`, children: _jsx(ShieldCheck, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), _jsx("button", { onClick: () => void runAction(`deny ${server.name}`, () => getAgentPlatformBridge().pluginMcp.setMcpApproval({ name: server.name, decision: 'denied', caller })), className: "p-1.5 text-white/30 hover:text-amber-200/80", "aria-label": `Deny ${server.name}`, children: _jsx(ShieldAlert, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), _jsx("button", { onClick: () => void runAction(`connect ${server.name}`, () => getAgentPlatformBridge().pluginMcp.reloadMcp({ connect: true, ...snapshotRequest })), className: "p-1.5 text-white/30 hover:text-cyan-200/80", "aria-label": `Connect ${server.name}`, children: _jsx(Check, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), server.source === 'hub' && (_jsx("button", { onClick: () => void runAction(`remove ${server.name}`, () => getAgentPlatformBridge().pluginMcp.removeMcpServer({ name: server.name, caller })), className: "p-1.5 text-white/25 hover:text-red-300/80", "aria-label": `Remove ${server.name}`, children: _jsx(Trash2, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }))] })] }) }, `${server.source}:${server.name}`))) })) })] }), _jsxs("div", { className: "flex-1 min-w-0 flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25 mb-2", children: "Scoped policy" }), _jsxs("div", { className: "grid grid-cols-4 gap-2", children: [_jsxs("select", { value: scopeType, onChange: (event) => setScopeType(event.target.value), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: [_jsx("option", { value: "global", children: "global" }), _jsx("option", { value: "workspace", children: "workspace" }), _jsx("option", { value: "team", children: "team" }), _jsx("option", { value: "agent", children: "agent" })] }), _jsx("input", { value: scopeWorkspaceId, onChange: (event) => setScopeWorkspaceId(event.target.value), placeholder: "workspace id", disabled: scopeType === 'global', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" }), _jsx("input", { value: scopeTeamId, onChange: (event) => setScopeTeamId(event.target.value), placeholder: "team id", disabled: scopeType === 'global' || scopeType === 'workspace', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" }), _jsx("input", { value: scopeAgentId, onChange: (event) => setScopeAgentId(event.target.value), placeholder: "agent id", disabled: scopeType !== 'agent', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx("input", { value: policyPluginAllow, onChange: (event) => setPolicyPluginAllow(event.target.value), placeholder: "plugin allowlist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyPluginDeny, onChange: (event) => setPolicyPluginDeny(event.target.value), placeholder: "plugin denylist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyMcpAllow, onChange: (event) => setPolicyMcpAllow(event.target.value), placeholder: "MCP allowlist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyMcpDeny, onChange: (event) => setPolicyMcpDeny(event.target.value), placeholder: "MCP denylist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" })] }), _jsxs("div", { className: "flex gap-2 items-center", children: [_jsx("select", { value: policyMcpExposure, onChange: (event) => setPolicyMcpExposure(asPolicy(event.target.value)), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: ['none', 'prompts', 'resources', 'context', 'all'].map((policy) => _jsx("option", { value: policy, children: policy }, policy)) }), _jsx("button", { onClick: () => void saveScopedPolicy(), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30", children: "Save scope" }), _jsx("button", { onClick: () => void runAction('delete scoped policy', () => getAgentPlatformBridge().pluginMcp.deleteScopedPolicy({ scope: buildScope(), caller })), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/45 border border-white/[0.08] rounded-sm hover:text-red-300/80 disabled:opacity-30", children: "Delete scope" })] }), _jsxs("div", { className: "text-[10px] text-white/30", children: ["Effective: ", snapshot.effectivePolicy.mcpRegistryPolicy, ". Matched: ", snapshot.effectivePolicy.matchedPolicyIds.join(', ') || 'global defaults', "."] })] }), _jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-2", children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "Project MCP sync" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { value: projectCwd, onChange: (event) => setProjectCwd(event.target.value), placeholder: "workspace root for .xeno/mcp.json", className: "flex-1 px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsxs("button", { onClick: () => void syncProjectMcp('import'), disabled: !!busy || !projectCwd.trim(), className: "px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Download, { className: "w-3 h-3", strokeWidth: 1.5 }), "Import"] }), _jsxs("button", { onClick: () => void syncProjectMcp('export'), disabled: !!busy || !projectCwd.trim(), className: "px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Upload, { className: "w-3 h-3", strokeWidth: 1.5 }), "Export"] })] })] }), _jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-2", children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "MCP preview input" }), _jsx("textarea", { value: mcpInputJson, onChange: (event) => setMcpInputJson(event.target.value), className: "w-full h-20 px-2 py-1.5 text-[11px] font-mono text-white/70 bg-[#111] border border-white/[0.08] rounded-sm focus:outline-none focus:border-white/[0.18]" }), _jsx("div", { className: "text-[10px] text-white/25", children: "Click a tool, prompt, or resource pill on the left. Tool/prompt calls use this JSON object as input." })] }), _jsx("div", { className: "flex-1 min-h-0 overflow-auto", children: resultPanel ? (_jsxs("div", { className: "p-4", children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx(Eye, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/75 font-mono", children: resultPanel.title }), _jsx(Pill, { tone: statusTone(resultPanel.status), children: resultPanel.status })] }), _jsx("pre", { className: "p-3 bg-[#0f0f0f] border border-white/[0.07] rounded-sm text-[11px] text-white/62 whitespace-pre-wrap break-words overflow-auto", children: resultPanel.body })] })) : (_jsx("div", { className: "p-4 space-y-3", children: _jsxs("div", { children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25 mb-2", children: "Configured scoped policies" }), snapshot.scopedPolicies.length === 0 ? (_jsx("p", { className: "text-[11px] text-white/30", children: "No workspace/team/agent plugin policies saved yet." })) : (_jsx("div", { className: "space-y-2", children: snapshot.scopedPolicies.map((policy) => (_jsxs("button", { onClick: () => {
495
+ setScopeType(policy.scope.type);
496
+ setScopeWorkspaceId(policy.scope.workspaceId || '');
497
+ setScopeTeamId(policy.scope.teamId || '');
498
+ setScopeAgentId(policy.scope.agentId || '');
499
+ setPolicyPluginAllow(listToCsv(policy.pluginAllowlist));
500
+ setPolicyPluginDeny(listToCsv(policy.pluginDenylist));
501
+ setPolicyMcpAllow(listToCsv(policy.mcpServerAllowlist));
502
+ setPolicyMcpDeny(listToCsv(policy.mcpServerDenylist));
503
+ setPolicyMcpExposure(policy.mcpRegistryPolicy || 'context');
504
+ }, className: "w-full text-left p-2 border border-white/[0.07] bg-white/[0.025] hover:bg-white/[0.05] rounded-sm", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-[11px] text-white/65 font-mono", children: scopeLabel(policy.scope) }), _jsx(Pill, { tone: policy.enabled ? statusTone('success') : undefined, children: policy.enabled ? 'enabled' : 'disabled' }), policy.mcpRegistryPolicy && _jsx(Pill, { children: policy.mcpRegistryPolicy })] }), _jsxs("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: ["plugins allow [", listToCsv(policy.pluginAllowlist) || '*', "], deny [", listToCsv(policy.pluginDenylist) || '-', "], mcp allow [", listToCsv(policy.mcpServerAllowlist) || '*', "], deny [", listToCsv(policy.mcpServerDenylist) || '-', "]"] })] }, policy.id))) }))] }) })) })] })] }))] }));
505
+ }
506
+ //# sourceMappingURL=PluginManager.js.map