@forgeax/interface 0.4.1

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 (963) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +111 -0
  4. package/dist/package/browser/App.css +192 -0
  5. package/dist/package/browser/App.d.ts +11 -0
  6. package/dist/package/browser/App.js +11 -0
  7. package/dist/package/browser/ApplicationDetachedShell.d.ts +13 -0
  8. package/dist/package/browser/ApplicationDetachedShell.js +10 -0
  9. package/dist/package/browser/ApplicationShell.d.ts +19 -0
  10. package/dist/package/browser/ApplicationShell.js +62 -0
  11. package/dist/package/browser/app-kit.d.ts +1 -0
  12. package/dist/package/browser/app-kit.js +4 -0
  13. package/dist/package/browser/appHostBootstrap.d.ts +16 -0
  14. package/dist/package/browser/appHostBootstrap.js +145 -0
  15. package/dist/package/browser/application.d.ts +35 -0
  16. package/dist/package/browser/application.js +64 -0
  17. package/dist/package/browser/assets/icons/agent-icon.png +0 -0
  18. package/dist/package/browser/assets/icons/at.svg +3 -0
  19. package/dist/package/browser/assets/icons/chevron-collapse.svg +3 -0
  20. package/dist/package/browser/assets/icons/chevron-expand.svg +3 -0
  21. package/dist/package/browser/assets/icons/chevron-up.svg +3 -0
  22. package/dist/package/browser/assets/icons/close-x.svg +3 -0
  23. package/dist/package/browser/assets/icons/close.svg +3 -0
  24. package/dist/package/browser/assets/icons/copy.svg +4 -0
  25. package/dist/package/browser/assets/icons/edit.svg +3 -0
  26. package/dist/package/browser/assets/icons/fullscreen.svg +3 -0
  27. package/dist/package/browser/assets/icons/pause.svg +4 -0
  28. package/dist/package/browser/assets/icons/play.svg +3 -0
  29. package/dist/package/browser/assets/icons/select.svg +3 -0
  30. package/dist/package/browser/assets/icons/sendMessage-enable.svg +4 -0
  31. package/dist/package/browser/assets/icons/sendMessage.svg +4 -0
  32. package/dist/package/browser/assets/icons/status-done.svg +11 -0
  33. package/dist/package/browser/assets/icons/status-running.svg +10 -0
  34. package/dist/package/browser/assets/icons/status-waiting.svg +10 -0
  35. package/dist/package/browser/assets/icons/tool-execute-script.svg +3 -0
  36. package/dist/package/browser/assets/icons/tool-other.svg +10 -0
  37. package/dist/package/browser/assets/icons/tool-read-file.svg +3 -0
  38. package/dist/package/browser/assets/icons/tool-resource-search.svg +3 -0
  39. package/dist/package/browser/assets/icons/tool-task-todo.svg +4 -0
  40. package/dist/package/browser/assets/icons/tool-write-file.svg +3 -0
  41. package/dist/package/browser/boot/SettingsSection.d.ts +14 -0
  42. package/dist/package/browser/boot/SettingsSection.js +82 -0
  43. package/dist/package/browser/boot/broadcast.d.ts +2 -0
  44. package/dist/package/browser/boot/broadcast.js +32 -0
  45. package/dist/package/browser/boot/driver.d.ts +22 -0
  46. package/dist/package/browser/boot/driver.js +47 -0
  47. package/dist/package/browser/boot/store.d.ts +29 -0
  48. package/dist/package/browser/boot/store.js +114 -0
  49. package/dist/package/browser/boot/themes.d.ts +19 -0
  50. package/dist/package/browser/boot/themes.js +21 -0
  51. package/dist/package/browser/boot/types.d.ts +22 -0
  52. package/dist/package/browser/boot/types.js +30 -0
  53. package/dist/package/browser/brand/BrandProvider.d.ts +19 -0
  54. package/dist/package/browser/brand/BrandProvider.js +35 -0
  55. package/dist/package/browser/brand/index.d.ts +4 -0
  56. package/dist/package/browser/brand/index.js +3 -0
  57. package/dist/package/browser/brand/runtime.d.ts +17 -0
  58. package/dist/package/browser/brand/runtime.js +71 -0
  59. package/dist/package/browser/brand/types.d.ts +77 -0
  60. package/dist/package/browser/brand/types.js +9 -0
  61. package/dist/package/browser/components/ActivityRail/ActivityRail.css +294 -0
  62. package/dist/package/browser/components/ActivityRail/ActivityRail.d.ts +2 -0
  63. package/dist/package/browser/components/ActivityRail/ActivityRail.js +164 -0
  64. package/dist/package/browser/components/ActivityRail/activity-rail-model.d.ts +18 -0
  65. package/dist/package/browser/components/ActivityRail/activity-rail-model.js +144 -0
  66. package/dist/package/browser/components/AgentAvatar/AgentAvatar.d.ts +17 -0
  67. package/dist/package/browser/components/AgentAvatar/AgentAvatar.js +50 -0
  68. package/dist/package/browser/components/BuildBadge/BuildBadge.d.ts +1 -0
  69. package/dist/package/browser/components/BuildBadge/BuildBadge.js +279 -0
  70. package/dist/package/browser/components/Bus/BusAdminPanel.css +2425 -0
  71. package/dist/package/browser/components/Bus/BusAdminPanel.d.ts +2 -0
  72. package/dist/package/browser/components/Bus/BusAdminPanel.js +1385 -0
  73. package/dist/package/browser/components/Bus/CapabilityOverview.d.ts +3 -0
  74. package/dist/package/browser/components/Bus/CapabilityOverview.js +50 -0
  75. package/dist/package/browser/components/ChatColumn/ChatColumn.d.ts +2 -0
  76. package/dist/package/browser/components/ChatColumn/ChatColumn.js +18 -0
  77. package/dist/package/browser/components/ChatColumn/SessionTabStrip.d.ts +1 -0
  78. package/dist/package/browser/components/ChatColumn/SessionTabStrip.js +103 -0
  79. package/dist/package/browser/components/ChatColumn/useChatWidth.d.ts +5 -0
  80. package/dist/package/browser/components/ChatColumn/useChatWidth.js +13 -0
  81. package/dist/package/browser/components/CommandPalette/CommandPalette.css +199 -0
  82. package/dist/package/browser/components/CommandPalette/CommandPalette.d.ts +2 -0
  83. package/dist/package/browser/components/CommandPalette/CommandPalette.js +242 -0
  84. package/dist/package/browser/components/Confirm/ConfirmDialog.d.ts +2 -0
  85. package/dist/package/browser/components/Confirm/ConfirmDialog.js +113 -0
  86. package/dist/package/browser/components/ContextMenu/ContextMenu.d.ts +10 -0
  87. package/dist/package/browser/components/ContextMenu/ContextMenu.js +218 -0
  88. package/dist/package/browser/components/ContextMenu/menuRegistry.d.ts +18 -0
  89. package/dist/package/browser/components/ContextMenu/menuRegistry.js +152 -0
  90. package/dist/package/browser/components/DetachedSurface.d.ts +20 -0
  91. package/dist/package/browser/components/DetachedSurface.js +102 -0
  92. package/dist/package/browser/components/DockShell/DockPanelHost.d.ts +4 -0
  93. package/dist/package/browser/components/DockShell/DockPanelHost.js +7 -0
  94. package/dist/package/browser/components/DockShell/DockRegion.d.ts +7 -0
  95. package/dist/package/browser/components/DockShell/DockRegion.js +315 -0
  96. package/dist/package/browser/components/DockShell/DockShell.css +1018 -0
  97. package/dist/package/browser/components/DockShell/DockTab.d.ts +3 -0
  98. package/dist/package/browser/components/DockShell/DockTab.js +139 -0
  99. package/dist/package/browser/components/DockShell/ExtensionHostPanel.d.ts +9 -0
  100. package/dist/package/browser/components/DockShell/ExtensionHostPanel.js +68 -0
  101. package/dist/package/browser/components/DockShell/ExtensionRuntimeFrame.d.ts +14 -0
  102. package/dist/package/browser/components/DockShell/ExtensionRuntimeFrame.js +56 -0
  103. package/dist/package/browser/components/DockShell/PanelWindowingBoundary.d.ts +6 -0
  104. package/dist/package/browser/components/DockShell/PanelWindowingBoundary.js +9 -0
  105. package/dist/package/browser/components/DockShell/chatDockAnimation.d.ts +45 -0
  106. package/dist/package/browser/components/DockShell/chatDockAnimation.js +101 -0
  107. package/dist/package/browser/components/DockShell/chatDockFullscreen.d.ts +17 -0
  108. package/dist/package/browser/components/DockShell/chatDockFullscreen.js +22 -0
  109. package/dist/package/browser/components/DockShell/chatDockLayout.d.ts +10 -0
  110. package/dist/package/browser/components/DockShell/chatDockLayout.js +11 -0
  111. package/dist/package/browser/components/DockShell/compact-empty-dock-groups.d.ts +16 -0
  112. package/dist/package/browser/components/DockShell/compact-empty-dock-groups.js +28 -0
  113. package/dist/package/browser/components/DockShell/crossInstanceDrop.d.ts +1 -0
  114. package/dist/package/browser/components/DockShell/crossInstanceDrop.js +1 -0
  115. package/dist/package/browser/components/DockShell/dockResetEpoch.d.ts +2 -0
  116. package/dist/package/browser/components/DockShell/dockResetEpoch.js +13 -0
  117. package/dist/package/browser/components/DockShell/dockTitle.d.ts +12 -0
  118. package/dist/package/browser/components/DockShell/dockTitle.js +36 -0
  119. package/dist/package/browser/components/DockShell/dockviewRegistry.d.ts +1 -0
  120. package/dist/package/browser/components/DockShell/dockviewRegistry.js +1 -0
  121. package/dist/package/browser/components/DockShell/edgeDrawer.d.ts +24 -0
  122. package/dist/package/browser/components/DockShell/edgeDrawer.js +1144 -0
  123. package/dist/package/browser/components/DockShell/edgePinStore.d.ts +12 -0
  124. package/dist/package/browser/components/DockShell/edgePinStore.js +37 -0
  125. package/dist/package/browser/components/DockShell/extension-editor-bridge.d.ts +13 -0
  126. package/dist/package/browser/components/DockShell/extension-editor-bridge.js +100 -0
  127. package/dist/package/browser/components/DockShell/extension-runtime-selection.d.ts +8 -0
  128. package/dist/package/browser/components/DockShell/extension-runtime-selection.js +6 -0
  129. package/dist/package/browser/components/DockShell/extensionRuntime.d.ts +17 -0
  130. package/dist/package/browser/components/DockShell/extensionRuntime.js +84 -0
  131. package/dist/package/browser/components/DockShell/footer-panel-visibility.d.ts +7 -0
  132. package/dist/package/browser/components/DockShell/footer-panel-visibility.js +43 -0
  133. package/dist/package/browser/components/DockShell/footer-panels.d.ts +2 -0
  134. package/dist/package/browser/components/DockShell/footer-panels.js +7 -0
  135. package/dist/package/browser/components/DockShell/panelRegistry.d.ts +37 -0
  136. package/dist/package/browser/components/DockShell/panelRegistry.js +126 -0
  137. package/dist/package/browser/components/DockShell/panelRenderers.d.ts +325 -0
  138. package/dist/package/browser/components/DockShell/panelRenderers.js +25 -0
  139. package/dist/package/browser/components/DockShell/panelTabCommands.d.ts +18 -0
  140. package/dist/package/browser/components/DockShell/panelTabCommands.js +133 -0
  141. package/dist/package/browser/components/DockShell/panelWindowing.d.ts +32 -0
  142. package/dist/package/browser/components/DockShell/panelWindowing.js +42 -0
  143. package/dist/package/browser/components/DockShell/regions.d.ts +1 -0
  144. package/dist/package/browser/components/DockShell/regions.js +1 -0
  145. package/dist/package/browser/components/DockShell/resolveRegion.d.ts +1 -0
  146. package/dist/package/browser/components/DockShell/resolveRegion.js +1 -0
  147. package/dist/package/browser/components/DockShell/sanitizeDockLayout.d.ts +3 -0
  148. package/dist/package/browser/components/DockShell/sanitizeDockLayout.js +46 -0
  149. package/dist/package/browser/components/DockShell/sideEdgeMove.d.ts +1 -0
  150. package/dist/package/browser/components/DockShell/sideEdgeMove.js +1 -0
  151. package/dist/package/browser/components/DockShell/studioTabMenuProvider.d.ts +13 -0
  152. package/dist/package/browser/components/DockShell/studioTabMenuProvider.js +39 -0
  153. package/dist/package/browser/components/DockShell/tabContextMenu.d.ts +29 -0
  154. package/dist/package/browser/components/DockShell/tabContextMenu.js +68 -0
  155. package/dist/package/browser/components/DockShell/ueDrag/controller.d.ts +80 -0
  156. package/dist/package/browser/components/DockShell/ueDrag/controller.js +785 -0
  157. package/dist/package/browser/components/DockShell/ueDrag/geometry.d.ts +94 -0
  158. package/dist/package/browser/components/DockShell/ueDrag/geometry.js +217 -0
  159. package/dist/package/browser/components/DockShell/ueDrag/overlay.d.ts +32 -0
  160. package/dist/package/browser/components/DockShell/ueDrag/overlay.js +206 -0
  161. package/dist/package/browser/components/DockShell/ueDrag/ueDrag.css +199 -0
  162. package/dist/package/browser/components/DockShell/useAuxBarWidth.d.ts +5 -0
  163. package/dist/package/browser/components/DockShell/useAuxBarWidth.js +13 -0
  164. package/dist/package/browser/components/Drawer/DrawerHostView.css +143 -0
  165. package/dist/package/browser/components/Drawer/DrawerHostView.d.ts +19 -0
  166. package/dist/package/browser/components/Drawer/DrawerHostView.js +93 -0
  167. package/dist/package/browser/components/Drawer/DrawerLauncher.d.ts +12 -0
  168. package/dist/package/browser/components/Drawer/DrawerLauncher.js +22 -0
  169. package/dist/package/browser/components/Drawer/useDrawerStore.d.ts +15 -0
  170. package/dist/package/browser/components/Drawer/useDrawerStore.js +80 -0
  171. package/dist/package/browser/components/ErrorBoundary.d.ts +55 -0
  172. package/dist/package/browser/components/ErrorBoundary.js +131 -0
  173. package/dist/package/browser/components/ExtensionHost/ExtensionIframeHost.d.ts +28 -0
  174. package/dist/package/browser/components/ExtensionHost/ExtensionIframeHost.js +179 -0
  175. package/dist/package/browser/components/ExtensionHost/NativeExtensionHost.d.ts +14 -0
  176. package/dist/package/browser/components/ExtensionHost/NativeExtensionHost.js +152 -0
  177. package/dist/package/browser/components/Feedback/FeedbackPanel.css +640 -0
  178. package/dist/package/browser/components/Feedback/FeedbackPanel.d.ts +8 -0
  179. package/dist/package/browser/components/Feedback/FeedbackPanel.js +118 -0
  180. package/dist/package/browser/components/Feedback/PassiveFeedback.css +179 -0
  181. package/dist/package/browser/components/Feedback/PassiveFeedback.d.ts +2 -0
  182. package/dist/package/browser/components/Feedback/PassiveFeedback.js +218 -0
  183. package/dist/package/browser/components/Feedback/collect.d.ts +15 -0
  184. package/dist/package/browser/components/Feedback/collect.js +80 -0
  185. package/dist/package/browser/components/Feedback/store.d.ts +61 -0
  186. package/dist/package/browser/components/Feedback/store.js +174 -0
  187. package/dist/package/browser/components/LangSwitcher/LangSwitcher.css +78 -0
  188. package/dist/package/browser/components/LangSwitcher/LangSwitcher.d.ts +14 -0
  189. package/dist/package/browser/components/LangSwitcher/LangSwitcher.js +44 -0
  190. package/dist/package/browser/components/MainArea/ConsolePanel.d.ts +1 -0
  191. package/dist/package/browser/components/MainArea/ConsolePanel.js +16 -0
  192. package/dist/package/browser/components/MainArea/MainArea.css +2130 -0
  193. package/dist/package/browser/components/MainArea/MainArea.d.ts +2 -0
  194. package/dist/package/browser/components/MainArea/MainArea.js +20 -0
  195. package/dist/package/browser/components/MainArea/StandaloneExtensionIframe.d.ts +25 -0
  196. package/dist/package/browser/components/MainArea/StandaloneExtensionIframe.js +155 -0
  197. package/dist/package/browser/components/MainArea/SurfacePanels.d.ts +3 -0
  198. package/dist/package/browser/components/MainArea/SurfacePanels.js +27 -0
  199. package/dist/package/browser/components/MainArea/TelemetryViewer.css +122 -0
  200. package/dist/package/browser/components/MainArea/TelemetryViewer.d.ts +36 -0
  201. package/dist/package/browser/components/MainArea/TelemetryViewer.js +116 -0
  202. package/dist/package/browser/components/MenuBar/MenuBar.css +186 -0
  203. package/dist/package/browser/components/MenuBar/MenuBar.d.ts +27 -0
  204. package/dist/package/browser/components/MenuBar/MenuBar.js +286 -0
  205. package/dist/package/browser/components/MenuBar/index.d.ts +1 -0
  206. package/dist/package/browser/components/MenuBar/index.js +1 -0
  207. package/dist/package/browser/components/MenuBar/menubar-open-state.d.ts +8 -0
  208. package/dist/package/browser/components/MenuBar/menubar-open-state.js +11 -0
  209. package/dist/package/browser/components/MenuBar/menubar-surface.d.ts +30 -0
  210. package/dist/package/browser/components/MenuBar/menubar-surface.js +201 -0
  211. package/dist/package/browser/components/ModelPicker/index.d.ts +1 -0
  212. package/dist/package/browser/components/ModelPicker/index.js +1 -0
  213. package/dist/package/browser/components/ModelPicker/useModelCatalog.d.ts +22 -0
  214. package/dist/package/browser/components/ModelPicker/useModelCatalog.js +100 -0
  215. package/dist/package/browser/components/Onboarding/ConnectModelPrompt.d.ts +2 -0
  216. package/dist/package/browser/components/Onboarding/ConnectModelPrompt.js +40 -0
  217. package/dist/package/browser/components/Onboarding/Onboarding.css +232 -0
  218. package/dist/package/browser/components/Onboarding/OnboardingController.d.ts +10 -0
  219. package/dist/package/browser/components/Onboarding/OnboardingController.js +549 -0
  220. package/dist/package/browser/components/Onboarding/connect-selection.d.ts +17 -0
  221. package/dist/package/browser/components/Onboarding/connect-selection.js +18 -0
  222. package/dist/package/browser/components/Onboarding/home-transition.d.ts +9 -0
  223. package/dist/package/browser/components/Onboarding/home-transition.js +20 -0
  224. package/dist/package/browser/components/Onboarding/index.d.ts +4 -0
  225. package/dist/package/browser/components/Onboarding/index.js +3 -0
  226. package/dist/package/browser/components/Onboarding/prepareTourShell.d.ts +5 -0
  227. package/dist/package/browser/components/Onboarding/prepareTourShell.js +11 -0
  228. package/dist/package/browser/components/Onboarding/project-name.d.ts +17 -0
  229. package/dist/package/browser/components/Onboarding/project-name.js +29 -0
  230. package/dist/package/browser/components/Onboarding/types.d.ts +31 -0
  231. package/dist/package/browser/components/Onboarding/types.js +77 -0
  232. package/dist/package/browser/components/PageTabs/PageTabStrip.css +221 -0
  233. package/dist/package/browser/components/PageTabs/PageTabStrip.d.ts +3 -0
  234. package/dist/package/browser/components/PageTabs/PageTabStrip.js +214 -0
  235. package/dist/package/browser/components/PageTabs/openablePageTypes.d.ts +9 -0
  236. package/dist/package/browser/components/PageTabs/openablePageTypes.js +13 -0
  237. package/dist/package/browser/components/PanelShell/PanelShell.css +517 -0
  238. package/dist/package/browser/components/PanelShell/PanelShell.d.ts +7 -0
  239. package/dist/package/browser/components/PanelShell/PanelShell.js +459 -0
  240. package/dist/package/browser/components/Resize/ResizeHandle.d.ts +1 -0
  241. package/dist/package/browser/components/Resize/ResizeHandle.js +1 -0
  242. package/dist/package/browser/components/SceneBackground/SceneBackground.d.ts +2 -0
  243. package/dist/package/browser/components/SceneBackground/SceneBackground.js +5 -0
  244. package/dist/package/browser/components/SchemaForm/SchemaForm.css +138 -0
  245. package/dist/package/browser/components/SchemaForm/SchemaForm.d.ts +17 -0
  246. package/dist/package/browser/components/SchemaForm/SchemaForm.js +86 -0
  247. package/dist/package/browser/components/SchemaForm/schema-form-utils.d.ts +30 -0
  248. package/dist/package/browser/components/SchemaForm/schema-form-utils.js +51 -0
  249. package/dist/package/browser/components/SettingsPrimitives.d.ts +24 -0
  250. package/dist/package/browser/components/SettingsPrimitives.js +145 -0
  251. package/dist/package/browser/components/Sidebar/BusHealthLamp.d.ts +1 -0
  252. package/dist/package/browser/components/Sidebar/BusHealthLamp.js +72 -0
  253. package/dist/package/browser/components/Sidebar/FilesPanel.d.ts +1 -0
  254. package/dist/package/browser/components/Sidebar/FilesPanel.js +234 -0
  255. package/dist/package/browser/components/Sidebar/Sidebar.css +1393 -0
  256. package/dist/package/browser/components/Sidebar/Sidebar.d.ts +3 -0
  257. package/dist/package/browser/components/Sidebar/Sidebar.js +8 -0
  258. package/dist/package/browser/components/Sidebar/sidebar-types.d.ts +18 -0
  259. package/dist/package/browser/components/Sidebar/sidebar-types.js +1 -0
  260. package/dist/package/browser/components/SlotDebugOverlay/SlotDebugOverlay.d.ts +1 -0
  261. package/dist/package/browser/components/SlotDebugOverlay/SlotDebugOverlay.js +1 -0
  262. package/dist/package/browser/components/SlotDebugOverlay/hashHue.d.ts +1 -0
  263. package/dist/package/browser/components/SlotDebugOverlay/hashHue.js +1 -0
  264. package/dist/package/browser/components/SlotDebugOverlay/index.d.ts +1 -0
  265. package/dist/package/browser/components/SlotDebugOverlay/index.js +1 -0
  266. package/dist/package/browser/components/SlotDebugOverlay/isSlotDebugEnabled.d.ts +1 -0
  267. package/dist/package/browser/components/SlotDebugOverlay/isSlotDebugEnabled.js +1 -0
  268. package/dist/package/browser/components/StatusBar/FatalBanner.d.ts +25 -0
  269. package/dist/package/browser/components/StatusBar/FatalBanner.js +52 -0
  270. package/dist/package/browser/components/StatusBar/GlobalStatusBar.css +304 -0
  271. package/dist/package/browser/components/StatusBar/InfoPanel.css +174 -0
  272. package/dist/package/browser/components/StatusBar/InfoPanel.d.ts +19 -0
  273. package/dist/package/browser/components/StatusBar/InfoPanel.js +128 -0
  274. package/dist/package/browser/components/StatusBar/StatusChip.css +52 -0
  275. package/dist/package/browser/components/StatusBar/StatusChip.d.ts +40 -0
  276. package/dist/package/browser/components/StatusBar/StatusChip.js +13 -0
  277. package/dist/package/browser/components/StatusBar/StripHostView.d.ts +2 -0
  278. package/dist/package/browser/components/StatusBar/StripHostView.js +91 -0
  279. package/dist/package/browser/components/StatusBar/StripPopover.css +58 -0
  280. package/dist/package/browser/components/StatusBar/StripPopover.d.ts +16 -0
  281. package/dist/package/browser/components/StatusBar/StripPopover.js +15 -0
  282. package/dist/package/browser/components/StatusBar/feeds/PulseFeeds.d.ts +16 -0
  283. package/dist/package/browser/components/StatusBar/feeds/PulseFeeds.js +88 -0
  284. package/dist/package/browser/components/StatusBar/footer/CheckpointsDrawer.d.ts +4 -0
  285. package/dist/package/browser/components/StatusBar/footer/CheckpointsDrawer.js +77 -0
  286. package/dist/package/browser/components/StatusBar/footer/DiagnosticsPopover.d.ts +4 -0
  287. package/dist/package/browser/components/StatusBar/footer/DiagnosticsPopover.js +108 -0
  288. package/dist/package/browser/components/StatusBar/footer/EventsDrawer.d.ts +14 -0
  289. package/dist/package/browser/components/StatusBar/footer/EventsDrawer.js +25 -0
  290. package/dist/package/browser/components/StatusBar/footer/ForgeaxBuildPopover.d.ts +4 -0
  291. package/dist/package/browser/components/StatusBar/footer/ForgeaxBuildPopover.js +62 -0
  292. package/dist/package/browser/components/StatusBar/footer/footer.css +178 -0
  293. package/dist/package/browser/components/StatusBar/healthBridge.d.ts +38 -0
  294. package/dist/package/browser/components/StatusBar/healthBridge.js +245 -0
  295. package/dist/package/browser/components/StatusBar/healthStore.d.ts +80 -0
  296. package/dist/package/browser/components/StatusBar/healthStore.js +129 -0
  297. package/dist/package/browser/components/StatusBar/useStatusItem.d.ts +10 -0
  298. package/dist/package/browser/components/StatusBar/useStatusItem.js +35 -0
  299. package/dist/package/browser/components/Surfaces/SurfaceKeepAlive.css +34 -0
  300. package/dist/package/browser/components/Surfaces/SurfaceKeepAliveLayer.d.ts +3 -0
  301. package/dist/package/browser/components/Surfaces/SurfaceKeepAliveLayer.js +218 -0
  302. package/dist/package/browser/components/Surfaces/SurfaceOverlay.css +160 -0
  303. package/dist/package/browser/components/Surfaces/SurfaceOverlay.d.ts +9 -0
  304. package/dist/package/browser/components/Surfaces/SurfaceOverlay.js +144 -0
  305. package/dist/package/browser/components/TopBar/AndroidPackageDialog.d.ts +23 -0
  306. package/dist/package/browser/components/TopBar/AndroidPackageDialog.js +115 -0
  307. package/dist/package/browser/components/TopBar/FsBrowser.css +156 -0
  308. package/dist/package/browser/components/TopBar/FsBrowser.d.ts +8 -0
  309. package/dist/package/browser/components/TopBar/FsBrowser.js +93 -0
  310. package/dist/package/browser/components/TopBar/GameSwitcher.d.ts +29 -0
  311. package/dist/package/browser/components/TopBar/GameSwitcher.js +157 -0
  312. package/dist/package/browser/components/TopBar/IosPackageDialog.d.ts +23 -0
  313. package/dist/package/browser/components/TopBar/IosPackageDialog.js +115 -0
  314. package/dist/package/browser/components/TopBar/ProjectSwitcher.d.ts +3 -0
  315. package/dist/package/browser/components/TopBar/ProjectSwitcher.js +41 -0
  316. package/dist/package/browser/components/TopBar/PublishOnboarding.css +133 -0
  317. package/dist/package/browser/components/TopBar/PublishOnboarding.d.ts +10 -0
  318. package/dist/package/browser/components/TopBar/PublishOnboarding.js +144 -0
  319. package/dist/package/browser/components/TopBar/SessionSwitcher.d.ts +2 -0
  320. package/dist/package/browser/components/TopBar/SessionSwitcher.js +124 -0
  321. package/dist/package/browser/components/TopBar/TopBar.css +1672 -0
  322. package/dist/package/browser/components/TopBar/TopBar.d.ts +2 -0
  323. package/dist/package/browser/components/TopBar/TopBar.js +606 -0
  324. package/dist/package/browser/components/TopBar/publish-options.d.ts +20 -0
  325. package/dist/package/browser/components/TopBar/publish-options.js +28 -0
  326. package/dist/package/browser/components/TourOverlay/TourOverlay.css +122 -0
  327. package/dist/package/browser/components/TourOverlay/TourOverlay.d.ts +26 -0
  328. package/dist/package/browser/components/TourOverlay/TourOverlay.js +233 -0
  329. package/dist/package/browser/components/TourOverlay/index.d.ts +2 -0
  330. package/dist/package/browser/components/TourOverlay/index.js +1 -0
  331. package/dist/package/browser/components/ownership.d.ts +7 -0
  332. package/dist/package/browser/components/ownership.js +7 -0
  333. package/dist/package/browser/components/ui/SearchableMenu.css +143 -0
  334. package/dist/package/browser/components/ui/SearchableMenu.d.ts +30 -0
  335. package/dist/package/browser/components/ui/SearchableMenu.js +40 -0
  336. package/dist/package/browser/components/ui/alert-dialog.d.ts +20 -0
  337. package/dist/package/browser/components/ui/alert-dialog.js +38 -0
  338. package/dist/package/browser/components/ui/button.d.ts +11 -0
  339. package/dist/package/browser/components/ui/button.js +33 -0
  340. package/dist/package/browser/components/ui/checkbox.d.ts +4 -0
  341. package/dist/package/browser/components/ui/checkbox.js +8 -0
  342. package/dist/package/browser/components/ui/command.d.ts +74 -0
  343. package/dist/package/browser/components/ui/command.js +20 -0
  344. package/dist/package/browser/components/ui/dialog.d.ts +21 -0
  345. package/dist/package/browser/components/ui/dialog.js +34 -0
  346. package/dist/package/browser/components/ui/dropdown-menu.d.ts +18 -0
  347. package/dist/package/browser/components/ui/dropdown-menu.js +30 -0
  348. package/dist/package/browser/components/ui/input.d.ts +3 -0
  349. package/dist/package/browser/components/ui/input.js +8 -0
  350. package/dist/package/browser/components/ui/label.d.ts +4 -0
  351. package/dist/package/browser/components/ui/label.js +7 -0
  352. package/dist/package/browser/components/ui/popover.d.ts +7 -0
  353. package/dist/package/browser/components/ui/popover.js +10 -0
  354. package/dist/package/browser/components/ui/select.d.ts +11 -0
  355. package/dist/package/browser/components/ui/select.js +31 -0
  356. package/dist/package/browser/components/ui/tabs.d.ts +7 -0
  357. package/dist/package/browser/components/ui/tabs.js +12 -0
  358. package/dist/package/browser/components/ui/textarea.d.ts +3 -0
  359. package/dist/package/browser/components/ui/textarea.js +8 -0
  360. package/dist/package/browser/components/ui/tooltip.d.ts +7 -0
  361. package/dist/package/browser/components/ui/tooltip.js +10 -0
  362. package/dist/package/browser/core/app-shell/catalog-page-extensions.d.ts +28 -0
  363. package/dist/package/browser/core/app-shell/catalog-page-extensions.js +234 -0
  364. package/dist/package/browser/core/app-shell/derive-panel-renderers.d.ts +2 -0
  365. package/dist/package/browser/core/app-shell/derive-panel-renderers.js +17 -0
  366. package/dist/package/browser/core/app-shell/host.d.ts +31 -0
  367. package/dist/package/browser/core/app-shell/host.js +188 -0
  368. package/dist/package/browser/core/app-shell/index.d.ts +7 -0
  369. package/dist/package/browser/core/app-shell/index.js +8 -0
  370. package/dist/package/browser/core/app-shell/logger.d.ts +2 -0
  371. package/dist/package/browser/core/app-shell/logger.js +6 -0
  372. package/dist/package/browser/core/app-shell/ownership.d.ts +7 -0
  373. package/dist/package/browser/core/app-shell/ownership.js +7 -0
  374. package/dist/package/browser/core/app-shell/react/HostProvider.d.ts +10 -0
  375. package/dist/package/browser/core/app-shell/react/HostProvider.js +35 -0
  376. package/dist/package/browser/core/app-shell/surface-extension.d.ts +17 -0
  377. package/dist/package/browser/core/app-shell/surface-extension.js +33 -0
  378. package/dist/package/browser/core/app-shell/types.d.ts +176 -0
  379. package/dist/package/browser/core/app-shell/types.js +1 -0
  380. package/dist/package/browser/core/contextual-keybindings.d.ts +71 -0
  381. package/dist/package/browser/core/contextual-keybindings.js +198 -0
  382. package/dist/package/browser/core/extension-foundation/bus.d.ts +2 -0
  383. package/dist/package/browser/core/extension-foundation/bus.js +3 -0
  384. package/dist/package/browser/core/extension-foundation/capabilities.d.ts +2 -0
  385. package/dist/package/browser/core/extension-foundation/capabilities.js +3 -0
  386. package/dist/package/browser/core/extension-foundation/commands.d.ts +2 -0
  387. package/dist/package/browser/core/extension-foundation/commands.js +3 -0
  388. package/dist/package/browser/core/extension-foundation/context-keys.d.ts +2 -0
  389. package/dist/package/browser/core/extension-foundation/context-keys.js +3 -0
  390. package/dist/package/browser/core/extension-foundation/contribution-registry.d.ts +2 -0
  391. package/dist/package/browser/core/extension-foundation/contribution-registry.js +3 -0
  392. package/dist/package/browser/core/extension-foundation/errors.d.ts +2 -0
  393. package/dist/package/browser/core/extension-foundation/errors.js +3 -0
  394. package/dist/package/browser/core/extension-foundation/index.d.ts +8 -0
  395. package/dist/package/browser/core/extension-foundation/index.js +9 -0
  396. package/dist/package/browser/core/extension-foundation/loader.d.ts +2 -0
  397. package/dist/package/browser/core/extension-foundation/loader.js +3 -0
  398. package/dist/package/browser/core/extension-foundation/storage.d.ts +2 -0
  399. package/dist/package/browser/core/extension-foundation/storage.js +3 -0
  400. package/dist/package/browser/core/extension-foundation/types.d.ts +2 -0
  401. package/dist/package/browser/core/extension-foundation/types.js +1 -0
  402. package/dist/package/browser/core/extensions/builtin-commands.d.ts +2 -0
  403. package/dist/package/browser/core/extensions/builtin-commands.js +256 -0
  404. package/dist/package/browser/core/extensions/builtin-menus.d.ts +2 -0
  405. package/dist/package/browser/core/extensions/builtin-menus.js +252 -0
  406. package/dist/package/browser/core/extensions/chrome-drawer.d.ts +3 -0
  407. package/dist/package/browser/core/extensions/chrome-drawer.js +45 -0
  408. package/dist/package/browser/core/extensions/chrome-statusbar.d.ts +6 -0
  409. package/dist/package/browser/core/extensions/chrome-statusbar.js +26 -0
  410. package/dist/package/browser/core/extensions/detached-agents-browser.d.ts +3 -0
  411. package/dist/package/browser/core/extensions/detached-agents-browser.js +9 -0
  412. package/dist/package/browser/core/extensions/detached-files-browser.d.ts +3 -0
  413. package/dist/package/browser/core/extensions/detached-files-browser.js +6 -0
  414. package/dist/package/browser/core/extensions/editor-commands.d.ts +2 -0
  415. package/dist/package/browser/core/extensions/editor-commands.js +182 -0
  416. package/dist/package/browser/core/extensions/foundation-bus.d.ts +2 -0
  417. package/dist/package/browser/core/extensions/foundation-bus.js +3 -0
  418. package/dist/package/browser/core/extensions/foundation-commands.d.ts +2 -0
  419. package/dist/package/browser/core/extensions/foundation-commands.js +6 -0
  420. package/dist/package/browser/core/extensions/foundation-storage.d.ts +2 -0
  421. package/dist/package/browser/core/extensions/foundation-storage.js +3 -0
  422. package/dist/package/browser/core/extensions/host-commands.d.ts +18 -0
  423. package/dist/package/browser/core/extensions/host-commands.js +52 -0
  424. package/dist/package/browser/core/extensions/observability.d.ts +14 -0
  425. package/dist/package/browser/core/extensions/observability.js +18 -0
  426. package/dist/package/browser/core/extensions/panels-chat.d.ts +2 -0
  427. package/dist/package/browser/core/extensions/panels-chat.js +41 -0
  428. package/dist/package/browser/core/extensions/panels-editor.d.ts +8 -0
  429. package/dist/package/browser/core/extensions/panels-editor.js +26 -0
  430. package/dist/package/browser/core/extensions/panels-viewport.d.ts +2 -0
  431. package/dist/package/browser/core/extensions/panels-viewport.js +20 -0
  432. package/dist/package/browser/core/extensions/session-client.d.ts +29 -0
  433. package/dist/package/browser/core/extensions/session-client.js +42 -0
  434. package/dist/package/browser/core/extensions/slots-corner-agent-picker.d.ts +5 -0
  435. package/dist/package/browser/core/extensions/slots-corner-agent-picker.js +6 -0
  436. package/dist/package/browser/core/extensions/slots-main-area-body.d.ts +3 -0
  437. package/dist/package/browser/core/extensions/slots-main-area-body.js +6 -0
  438. package/dist/package/browser/core/extensions/slots-sidebar-agents.d.ts +3 -0
  439. package/dist/package/browser/core/extensions/slots-sidebar-agents.js +6 -0
  440. package/dist/package/browser/core/extensions/studio-domain-clients.d.ts +12 -0
  441. package/dist/package/browser/core/extensions/studio-domain-clients.js +15 -0
  442. package/dist/package/browser/core/extensions/surfaces-scene-editor.d.ts +3 -0
  443. package/dist/package/browser/core/extensions/surfaces-scene-editor.js +6 -0
  444. package/dist/package/browser/core/extensions/trajectory.d.ts +2 -0
  445. package/dist/package/browser/core/extensions/trajectory.js +50 -0
  446. package/dist/package/browser/core/page-navigation.d.ts +1 -0
  447. package/dist/package/browser/core/page-navigation.js +1 -0
  448. package/dist/package/browser/core/page-platform/activity.d.ts +4 -0
  449. package/dist/package/browser/core/page-platform/activity.js +46 -0
  450. package/dist/package/browser/core/page-platform/dockview-layout.d.ts +7 -0
  451. package/dist/package/browser/core/page-platform/dockview-layout.js +63 -0
  452. package/dist/package/browser/core/page-platform/index.d.ts +8 -0
  453. package/dist/package/browser/core/page-platform/index.js +8 -0
  454. package/dist/package/browser/core/page-platform/layout-store.d.ts +18 -0
  455. package/dist/package/browser/core/page-platform/layout-store.js +54 -0
  456. package/dist/package/browser/core/page-platform/page-dirty-probe.d.ts +1 -0
  457. package/dist/package/browser/core/page-platform/page-dirty-probe.js +4 -0
  458. package/dist/package/browser/core/page-platform/registry.d.ts +3 -0
  459. package/dist/package/browser/core/page-platform/registry.js +194 -0
  460. package/dist/package/browser/core/page-platform/resource-editor.d.ts +3 -0
  461. package/dist/package/browser/core/page-platform/resource-editor.js +74 -0
  462. package/dist/package/browser/core/page-platform/session.d.ts +10 -0
  463. package/dist/package/browser/core/page-platform/session.js +327 -0
  464. package/dist/package/browser/core/page-platform/types.d.ts +242 -0
  465. package/dist/package/browser/core/page-platform/types.js +10 -0
  466. package/dist/package/browser/core/panels/context-expression.d.ts +1 -0
  467. package/dist/package/browser/core/panels/context-expression.js +1 -0
  468. package/dist/package/browser/core/panels/drawer.d.ts +23 -0
  469. package/dist/package/browser/core/panels/drawer.js +1 -0
  470. package/dist/package/browser/core/panels/index.d.ts +7 -0
  471. package/dist/package/browser/core/panels/index.js +7 -0
  472. package/dist/package/browser/core/panels/panel-action-registry.d.ts +6 -0
  473. package/dist/package/browser/core/panels/panel-action-registry.js +62 -0
  474. package/dist/package/browser/core/panels/panel-control-registry.d.ts +6 -0
  475. package/dist/package/browser/core/panels/panel-control-registry.js +54 -0
  476. package/dist/package/browser/core/panels/resolve-panel-action-state.d.ts +10 -0
  477. package/dist/package/browser/core/panels/resolve-panel-action-state.js +9 -0
  478. package/dist/package/browser/core/panels/strip.d.ts +40 -0
  479. package/dist/package/browser/core/panels/strip.js +1 -0
  480. package/dist/package/browser/core/panels/types.d.ts +143 -0
  481. package/dist/package/browser/core/panels/types.js +1 -0
  482. package/dist/package/browser/i18n/index.d.ts +50 -0
  483. package/dist/package/browser/i18n/index.js +207 -0
  484. package/dist/package/browser/i18n/locales/en.json +1959 -0
  485. package/dist/package/browser/i18n/locales/zh.json +1959 -0
  486. package/dist/package/browser/index.d.ts +2 -0
  487. package/dist/package/browser/index.js +2 -0
  488. package/dist/package/browser/lib/a11y-summary.d.ts +17 -0
  489. package/dist/package/browser/lib/a11y-summary.js +66 -0
  490. package/dist/package/browser/lib/action-dom-discovery.d.ts +2 -0
  491. package/dist/package/browser/lib/action-dom-discovery.js +84 -0
  492. package/dist/package/browser/lib/action-registry.d.ts +94 -0
  493. package/dist/package/browser/lib/action-registry.js +210 -0
  494. package/dist/package/browser/lib/aegis.d.ts +40 -0
  495. package/dist/package/browser/lib/aegis.js +230 -0
  496. package/dist/package/browser/lib/agent-catalog-url.d.ts +9 -0
  497. package/dist/package/browser/lib/agent-catalog-url.js +24 -0
  498. package/dist/package/browser/lib/agent-cli-provider.d.ts +10 -0
  499. package/dist/package/browser/lib/agent-cli-provider.js +81 -0
  500. package/dist/package/browser/lib/ai-intents.d.ts +30 -0
  501. package/dist/package/browser/lib/ai-intents.js +52 -0
  502. package/dist/package/browser/lib/broadcast-stream.d.ts +17 -0
  503. package/dist/package/browser/lib/broadcast-stream.js +163 -0
  504. package/dist/package/browser/lib/browser-prefs-sync.d.ts +16 -0
  505. package/dist/package/browser/lib/browser-prefs-sync.js +151 -0
  506. package/dist/package/browser/lib/builtin-actions.d.ts +2 -0
  507. package/dist/package/browser/lib/builtin-actions.js +558 -0
  508. package/dist/package/browser/lib/bus.d.ts +25 -0
  509. package/dist/package/browser/lib/bus.js +71 -0
  510. package/dist/package/browser/lib/checkpoint-api.d.ts +54 -0
  511. package/dist/package/browser/lib/checkpoint-api.js +41 -0
  512. package/dist/package/browser/lib/cli-providers.d.ts +33 -0
  513. package/dist/package/browser/lib/cli-providers.js +61 -0
  514. package/dist/package/browser/lib/command-palette-store.d.ts +5 -0
  515. package/dist/package/browser/lib/command-palette-store.js +22 -0
  516. package/dist/package/browser/lib/composer-bridge.d.ts +103 -0
  517. package/dist/package/browser/lib/composer-bridge.js +448 -0
  518. package/dist/package/browser/lib/dashboard-api.d.ts +104 -0
  519. package/dist/package/browser/lib/dashboard-api.js +125 -0
  520. package/dist/package/browser/lib/deep-link-bus.d.ts +10 -0
  521. package/dist/package/browser/lib/deep-link-bus.js +35 -0
  522. package/dist/package/browser/lib/dialog.d.ts +40 -0
  523. package/dist/package/browser/lib/dialog.js +103 -0
  524. package/dist/package/browser/lib/editor-facts-bus.d.ts +27 -0
  525. package/dist/package/browser/lib/editor-facts-bus.js +25 -0
  526. package/dist/package/browser/lib/extension-api.d.ts +140 -0
  527. package/dist/package/browser/lib/extension-api.js +90 -0
  528. package/dist/package/browser/lib/file-activity-stream.d.ts +54 -0
  529. package/dist/package/browser/lib/file-activity-stream.js +123 -0
  530. package/dist/package/browser/lib/file-family.d.ts +15 -0
  531. package/dist/package/browser/lib/file-family.js +25 -0
  532. package/dist/package/browser/lib/game-templates.d.ts +7 -0
  533. package/dist/package/browser/lib/game-templates.js +15 -0
  534. package/dist/package/browser/lib/global-shortcuts.d.ts +121 -0
  535. package/dist/package/browser/lib/global-shortcuts.js +551 -0
  536. package/dist/package/browser/lib/logSink.d.ts +16 -0
  537. package/dist/package/browser/lib/logSink.js +128 -0
  538. package/dist/package/browser/lib/lucide-icon.d.ts +5 -0
  539. package/dist/package/browser/lib/lucide-icon.js +20 -0
  540. package/dist/package/browser/lib/menu-registry.d.ts +113 -0
  541. package/dist/package/browser/lib/menu-registry.js +197 -0
  542. package/dist/package/browser/lib/model-config.d.ts +89 -0
  543. package/dist/package/browser/lib/model-config.js +72 -0
  544. package/dist/package/browser/lib/model-prefs.d.ts +5 -0
  545. package/dist/package/browser/lib/model-prefs.js +53 -0
  546. package/dist/package/browser/lib/model-route/index.d.ts +81 -0
  547. package/dist/package/browser/lib/model-route/index.js +175 -0
  548. package/dist/package/browser/lib/narrative-copilot.d.ts +20 -0
  549. package/dist/package/browser/lib/narrative-copilot.js +105 -0
  550. package/dist/package/browser/lib/native-menu-bridge.d.ts +37 -0
  551. package/dist/package/browser/lib/native-menu-bridge.js +151 -0
  552. package/dist/package/browser/lib/page-tab-icons.d.ts +21 -0
  553. package/dist/package/browser/lib/page-tab-icons.js +64 -0
  554. package/dist/package/browser/lib/panel-tab-icons.d.ts +21 -0
  555. package/dist/package/browser/lib/panel-tab-icons.js +49 -0
  556. package/dist/package/browser/lib/passive-feedback.d.ts +50 -0
  557. package/dist/package/browser/lib/passive-feedback.js +171 -0
  558. package/dist/package/browser/lib/perception-stream.d.ts +27 -0
  559. package/dist/package/browser/lib/perception-stream.js +42 -0
  560. package/dist/package/browser/lib/platform/index.d.ts +14 -0
  561. package/dist/package/browser/lib/platform/index.js +13 -0
  562. package/dist/package/browser/lib/platform/runtime.d.ts +22 -0
  563. package/dist/package/browser/lib/platform/runtime.js +42 -0
  564. package/dist/package/browser/lib/platform/shell-adapter.d.ts +24 -0
  565. package/dist/package/browser/lib/platform/shell-adapter.js +74 -0
  566. package/dist/package/browser/lib/platform/surface-windowing.d.ts +4 -0
  567. package/dist/package/browser/lib/platform/surface-windowing.js +16 -0
  568. package/dist/package/browser/lib/platform/surface.d.ts +13 -0
  569. package/dist/package/browser/lib/platform/surface.js +27 -0
  570. package/dist/package/browser/lib/platform/use-surface-windowing.d.ts +1 -0
  571. package/dist/package/browser/lib/platform/use-surface-windowing.js +6 -0
  572. package/dist/package/browser/lib/platform/window-manager.d.ts +2 -0
  573. package/dist/package/browser/lib/platform/window-manager.js +82 -0
  574. package/dist/package/browser/lib/project-context.d.ts +4 -0
  575. package/dist/package/browser/lib/project-context.js +42 -0
  576. package/dist/package/browser/lib/project.d.ts +5 -0
  577. package/dist/package/browser/lib/project.js +8 -0
  578. package/dist/package/browser/lib/recent-games.d.ts +24 -0
  579. package/dist/package/browser/lib/recent-games.js +50 -0
  580. package/dist/package/browser/lib/repair-builtin-menus.d.ts +6 -0
  581. package/dist/package/browser/lib/repair-builtin-menus.js +18 -0
  582. package/dist/package/browser/lib/reply-language.d.ts +9 -0
  583. package/dist/package/browser/lib/reply-language.js +11 -0
  584. package/dist/package/browser/lib/resilient-polling.d.ts +9 -0
  585. package/dist/package/browser/lib/resilient-polling.js +16 -0
  586. package/dist/package/browser/lib/session-time.d.ts +8 -0
  587. package/dist/package/browser/lib/session-time.js +40 -0
  588. package/dist/package/browser/lib/shell-live-data.d.ts +12 -0
  589. package/dist/package/browser/lib/shell-live-data.js +66 -0
  590. package/dist/package/browser/lib/sse.d.ts +5 -0
  591. package/dist/package/browser/lib/sse.js +42 -0
  592. package/dist/package/browser/lib/storageKeys.d.ts +70 -0
  593. package/dist/package/browser/lib/storageKeys.js +89 -0
  594. package/dist/package/browser/lib/surface-store.d.ts +38 -0
  595. package/dist/package/browser/lib/surface-store.js +62 -0
  596. package/dist/package/browser/lib/surface.d.ts +56 -0
  597. package/dist/package/browser/lib/surface.js +225 -0
  598. package/dist/package/browser/lib/surfaceAnchors.d.ts +16 -0
  599. package/dist/package/browser/lib/surfaceAnchors.js +76 -0
  600. package/dist/package/browser/lib/surfaceKeepAliveLayout.d.ts +7 -0
  601. package/dist/package/browser/lib/surfaceKeepAliveLayout.js +12 -0
  602. package/dist/package/browser/lib/telemetry-test-prelude.d.ts +0 -0
  603. package/dist/package/browser/lib/telemetry-test-prelude.js +14 -0
  604. package/dist/package/browser/lib/text-edit-actions.d.ts +14 -0
  605. package/dist/package/browser/lib/text-edit-actions.js +184 -0
  606. package/dist/package/browser/lib/trace.d.ts +34 -0
  607. package/dist/package/browser/lib/trace.js +273 -0
  608. package/dist/package/browser/lib/trustedOrigins.d.ts +4 -0
  609. package/dist/package/browser/lib/trustedOrigins.js +36 -0
  610. package/dist/package/browser/lib/ui-action-highlight.d.ts +2 -0
  611. package/dist/package/browser/lib/ui-action-highlight.js +93 -0
  612. package/dist/package/browser/lib/ui-bridge.d.ts +2 -0
  613. package/dist/package/browser/lib/ui-bridge.js +224 -0
  614. package/dist/package/browser/lib/ui-screenshot.d.ts +31 -0
  615. package/dist/package/browser/lib/ui-screenshot.js +155 -0
  616. package/dist/package/browser/lib/ui-trajectory.d.ts +47 -0
  617. package/dist/package/browser/lib/ui-trajectory.js +99 -0
  618. package/dist/package/browser/lib/use-bus-snapshot.d.ts +3 -0
  619. package/dist/package/browser/lib/use-bus-snapshot.js +13 -0
  620. package/dist/package/browser/lib/use-extension-manifest.d.ts +19 -0
  621. package/dist/package/browser/lib/use-extension-manifest.js +67 -0
  622. package/dist/package/browser/lib/useConfirmToast.d.ts +26 -0
  623. package/dist/package/browser/lib/useConfirmToast.js +120 -0
  624. package/dist/package/browser/lib/utils.d.ts +2 -0
  625. package/dist/package/browser/lib/utils.js +5 -0
  626. package/dist/package/browser/lib/vag-action-bridge.d.ts +2 -0
  627. package/dist/package/browser/lib/vag-action-bridge.js +130 -0
  628. package/dist/package/browser/main.d.ts +1 -0
  629. package/dist/package/browser/main.js +157 -0
  630. package/dist/package/browser/store-parts/domain-clients.d.ts +149 -0
  631. package/dist/package/browser/store-parts/domain-clients.js +17 -0
  632. package/dist/package/browser/store-parts/observability.d.ts +4 -0
  633. package/dist/package/browser/store-parts/observability.js +35 -0
  634. package/dist/package/browser/store-parts/persistence.d.ts +40 -0
  635. package/dist/package/browser/store-parts/persistence.js +245 -0
  636. package/dist/package/browser/store-parts/session-client.d.ts +73 -0
  637. package/dist/package/browser/store-parts/session-client.js +17 -0
  638. package/dist/package/browser/store-parts/session-pick.d.ts +8 -0
  639. package/dist/package/browser/store-parts/session-pick.js +21 -0
  640. package/dist/package/browser/store-parts/shell.d.ts +5 -0
  641. package/dist/package/browser/store-parts/shell.js +37 -0
  642. package/dist/package/browser/store.d.ts +455 -0
  643. package/dist/package/browser/store.js +890 -0
  644. package/dist/package/browser/styles/forgeax-preview/agent-avatar.css +69 -0
  645. package/dist/package/browser/styles/forgeax-preview/aliases.css +21 -0
  646. package/dist/package/browser/styles/forgeax-preview/chat-popover.css +141 -0
  647. package/dist/package/browser/styles/forgeax-preview/chat-session.css +896 -0
  648. package/dist/package/browser/styles/forgeax-preview/composer-port.css +531 -0
  649. package/dist/package/browser/styles/forgeax-preview/design-tokens.css +25 -0
  650. package/dist/package/browser/styles/forgeax-preview/index.css +9 -0
  651. package/dist/package/browser/styles/forgeax-preview/scene-fx.css +117 -0
  652. package/dist/package/browser/styles/forgeax-preview/shell-layout.css +280 -0
  653. package/dist/package/browser/styles/forgeax-preview/shell-skin.css +128 -0
  654. package/dist/package/browser/styles/foundation.tokens.json +2755 -0
  655. package/dist/package/browser/styles/global.css +196 -0
  656. package/dist/package/browser/styles/motion.css +558 -0
  657. package/dist/package/browser/styles/plugin-token-bridge.css +19 -0
  658. package/dist/package/browser/styles/primitive.css +197 -0
  659. package/dist/package/browser/styles/semantic.tokens.json +1524 -0
  660. package/dist/package/browser/styles/tokens.css +304 -0
  661. package/dist/package/node/App.js +11 -0
  662. package/dist/package/node/ApplicationDetachedShell.js +10 -0
  663. package/dist/package/node/ApplicationShell.js +62 -0
  664. package/dist/package/node/app-kit.js +4 -0
  665. package/dist/package/node/appHostBootstrap.js +145 -0
  666. package/dist/package/node/application.js +64 -0
  667. package/dist/package/node/boot/SettingsSection.js +82 -0
  668. package/dist/package/node/boot/broadcast.js +32 -0
  669. package/dist/package/node/boot/driver.js +47 -0
  670. package/dist/package/node/boot/store.js +114 -0
  671. package/dist/package/node/boot/themes.js +21 -0
  672. package/dist/package/node/boot/types.js +30 -0
  673. package/dist/package/node/brand/BrandProvider.js +35 -0
  674. package/dist/package/node/brand/index.js +3 -0
  675. package/dist/package/node/brand/runtime.js +71 -0
  676. package/dist/package/node/brand/types.js +9 -0
  677. package/dist/package/node/components/ActivityRail/ActivityRail.js +164 -0
  678. package/dist/package/node/components/ActivityRail/activity-rail-model.js +144 -0
  679. package/dist/package/node/components/AgentAvatar/AgentAvatar.js +50 -0
  680. package/dist/package/node/components/BuildBadge/BuildBadge.js +279 -0
  681. package/dist/package/node/components/Bus/BusAdminPanel.js +1385 -0
  682. package/dist/package/node/components/Bus/CapabilityOverview.js +50 -0
  683. package/dist/package/node/components/ChatColumn/ChatColumn.js +18 -0
  684. package/dist/package/node/components/ChatColumn/SessionTabStrip.js +103 -0
  685. package/dist/package/node/components/ChatColumn/useChatWidth.js +13 -0
  686. package/dist/package/node/components/CommandPalette/CommandPalette.js +242 -0
  687. package/dist/package/node/components/Confirm/ConfirmDialog.js +113 -0
  688. package/dist/package/node/components/ContextMenu/ContextMenu.js +218 -0
  689. package/dist/package/node/components/ContextMenu/menuRegistry.js +152 -0
  690. package/dist/package/node/components/DetachedSurface.js +102 -0
  691. package/dist/package/node/components/DockShell/DockPanelHost.js +7 -0
  692. package/dist/package/node/components/DockShell/DockRegion.js +315 -0
  693. package/dist/package/node/components/DockShell/DockTab.js +139 -0
  694. package/dist/package/node/components/DockShell/ExtensionHostPanel.js +68 -0
  695. package/dist/package/node/components/DockShell/ExtensionRuntimeFrame.js +56 -0
  696. package/dist/package/node/components/DockShell/PanelWindowingBoundary.js +9 -0
  697. package/dist/package/node/components/DockShell/chatDockAnimation.js +101 -0
  698. package/dist/package/node/components/DockShell/chatDockFullscreen.js +22 -0
  699. package/dist/package/node/components/DockShell/chatDockLayout.js +11 -0
  700. package/dist/package/node/components/DockShell/compact-empty-dock-groups.js +28 -0
  701. package/dist/package/node/components/DockShell/crossInstanceDrop.js +1 -0
  702. package/dist/package/node/components/DockShell/dockResetEpoch.js +13 -0
  703. package/dist/package/node/components/DockShell/dockTitle.js +36 -0
  704. package/dist/package/node/components/DockShell/dockviewRegistry.js +1 -0
  705. package/dist/package/node/components/DockShell/edgeDrawer.js +1144 -0
  706. package/dist/package/node/components/DockShell/edgePinStore.js +37 -0
  707. package/dist/package/node/components/DockShell/extension-editor-bridge.js +100 -0
  708. package/dist/package/node/components/DockShell/extension-runtime-selection.js +6 -0
  709. package/dist/package/node/components/DockShell/extensionRuntime.js +84 -0
  710. package/dist/package/node/components/DockShell/footer-panel-visibility.js +43 -0
  711. package/dist/package/node/components/DockShell/footer-panels.js +7 -0
  712. package/dist/package/node/components/DockShell/panelRegistry.js +126 -0
  713. package/dist/package/node/components/DockShell/panelRenderers.js +25 -0
  714. package/dist/package/node/components/DockShell/panelTabCommands.js +133 -0
  715. package/dist/package/node/components/DockShell/panelWindowing.js +42 -0
  716. package/dist/package/node/components/DockShell/regions.js +1 -0
  717. package/dist/package/node/components/DockShell/resolveRegion.js +1 -0
  718. package/dist/package/node/components/DockShell/sanitizeDockLayout.js +46 -0
  719. package/dist/package/node/components/DockShell/sideEdgeMove.js +1 -0
  720. package/dist/package/node/components/DockShell/studioTabMenuProvider.js +39 -0
  721. package/dist/package/node/components/DockShell/tabContextMenu.js +68 -0
  722. package/dist/package/node/components/DockShell/ueDrag/controller.js +785 -0
  723. package/dist/package/node/components/DockShell/ueDrag/geometry.js +217 -0
  724. package/dist/package/node/components/DockShell/ueDrag/overlay.js +206 -0
  725. package/dist/package/node/components/DockShell/useAuxBarWidth.js +13 -0
  726. package/dist/package/node/components/Drawer/DrawerHostView.js +93 -0
  727. package/dist/package/node/components/Drawer/DrawerLauncher.js +22 -0
  728. package/dist/package/node/components/Drawer/useDrawerStore.js +80 -0
  729. package/dist/package/node/components/ErrorBoundary.js +131 -0
  730. package/dist/package/node/components/ExtensionHost/ExtensionIframeHost.js +179 -0
  731. package/dist/package/node/components/ExtensionHost/NativeExtensionHost.js +152 -0
  732. package/dist/package/node/components/Feedback/FeedbackPanel.js +118 -0
  733. package/dist/package/node/components/Feedback/PassiveFeedback.js +218 -0
  734. package/dist/package/node/components/Feedback/collect.js +80 -0
  735. package/dist/package/node/components/Feedback/store.js +174 -0
  736. package/dist/package/node/components/LangSwitcher/LangSwitcher.js +44 -0
  737. package/dist/package/node/components/MainArea/ConsolePanel.js +16 -0
  738. package/dist/package/node/components/MainArea/MainArea.js +20 -0
  739. package/dist/package/node/components/MainArea/StandaloneExtensionIframe.js +155 -0
  740. package/dist/package/node/components/MainArea/SurfacePanels.js +27 -0
  741. package/dist/package/node/components/MainArea/TelemetryViewer.js +116 -0
  742. package/dist/package/node/components/MenuBar/MenuBar.js +286 -0
  743. package/dist/package/node/components/MenuBar/index.js +1 -0
  744. package/dist/package/node/components/MenuBar/menubar-open-state.js +11 -0
  745. package/dist/package/node/components/MenuBar/menubar-surface.js +201 -0
  746. package/dist/package/node/components/ModelPicker/index.js +1 -0
  747. package/dist/package/node/components/ModelPicker/useModelCatalog.js +100 -0
  748. package/dist/package/node/components/Onboarding/ConnectModelPrompt.js +40 -0
  749. package/dist/package/node/components/Onboarding/OnboardingController.js +549 -0
  750. package/dist/package/node/components/Onboarding/connect-selection.js +18 -0
  751. package/dist/package/node/components/Onboarding/home-transition.js +20 -0
  752. package/dist/package/node/components/Onboarding/index.js +3 -0
  753. package/dist/package/node/components/Onboarding/prepareTourShell.js +11 -0
  754. package/dist/package/node/components/Onboarding/project-name.js +29 -0
  755. package/dist/package/node/components/Onboarding/types.js +77 -0
  756. package/dist/package/node/components/PageTabs/PageTabStrip.js +214 -0
  757. package/dist/package/node/components/PageTabs/openablePageTypes.js +13 -0
  758. package/dist/package/node/components/PanelShell/PanelShell.js +459 -0
  759. package/dist/package/node/components/Resize/ResizeHandle.js +1 -0
  760. package/dist/package/node/components/SceneBackground/SceneBackground.js +5 -0
  761. package/dist/package/node/components/SchemaForm/SchemaForm.js +86 -0
  762. package/dist/package/node/components/SchemaForm/schema-form-utils.js +51 -0
  763. package/dist/package/node/components/SettingsPrimitives.js +145 -0
  764. package/dist/package/node/components/Sidebar/BusHealthLamp.js +72 -0
  765. package/dist/package/node/components/Sidebar/FilesPanel.js +234 -0
  766. package/dist/package/node/components/Sidebar/Sidebar.js +8 -0
  767. package/dist/package/node/components/Sidebar/sidebar-types.js +1 -0
  768. package/dist/package/node/components/SlotDebugOverlay/SlotDebugOverlay.js +1 -0
  769. package/dist/package/node/components/SlotDebugOverlay/hashHue.js +1 -0
  770. package/dist/package/node/components/SlotDebugOverlay/index.js +1 -0
  771. package/dist/package/node/components/SlotDebugOverlay/isSlotDebugEnabled.js +1 -0
  772. package/dist/package/node/components/StatusBar/FatalBanner.js +52 -0
  773. package/dist/package/node/components/StatusBar/InfoPanel.js +128 -0
  774. package/dist/package/node/components/StatusBar/StatusChip.js +13 -0
  775. package/dist/package/node/components/StatusBar/StripHostView.js +91 -0
  776. package/dist/package/node/components/StatusBar/StripPopover.js +15 -0
  777. package/dist/package/node/components/StatusBar/feeds/PulseFeeds.js +88 -0
  778. package/dist/package/node/components/StatusBar/footer/CheckpointsDrawer.js +77 -0
  779. package/dist/package/node/components/StatusBar/footer/DiagnosticsPopover.js +108 -0
  780. package/dist/package/node/components/StatusBar/footer/EventsDrawer.js +25 -0
  781. package/dist/package/node/components/StatusBar/footer/ForgeaxBuildPopover.js +62 -0
  782. package/dist/package/node/components/StatusBar/healthBridge.js +245 -0
  783. package/dist/package/node/components/StatusBar/healthStore.js +129 -0
  784. package/dist/package/node/components/StatusBar/useStatusItem.js +35 -0
  785. package/dist/package/node/components/Surfaces/SurfaceKeepAliveLayer.js +218 -0
  786. package/dist/package/node/components/Surfaces/SurfaceOverlay.js +144 -0
  787. package/dist/package/node/components/TopBar/AndroidPackageDialog.js +115 -0
  788. package/dist/package/node/components/TopBar/FsBrowser.js +93 -0
  789. package/dist/package/node/components/TopBar/GameSwitcher.js +157 -0
  790. package/dist/package/node/components/TopBar/IosPackageDialog.js +115 -0
  791. package/dist/package/node/components/TopBar/ProjectSwitcher.js +41 -0
  792. package/dist/package/node/components/TopBar/PublishOnboarding.js +144 -0
  793. package/dist/package/node/components/TopBar/SessionSwitcher.js +124 -0
  794. package/dist/package/node/components/TopBar/TopBar.js +606 -0
  795. package/dist/package/node/components/TopBar/publish-options.js +28 -0
  796. package/dist/package/node/components/TourOverlay/TourOverlay.js +233 -0
  797. package/dist/package/node/components/TourOverlay/index.js +1 -0
  798. package/dist/package/node/components/ownership.js +7 -0
  799. package/dist/package/node/components/ui/SearchableMenu.js +40 -0
  800. package/dist/package/node/components/ui/alert-dialog.js +38 -0
  801. package/dist/package/node/components/ui/button.js +33 -0
  802. package/dist/package/node/components/ui/checkbox.js +8 -0
  803. package/dist/package/node/components/ui/command.js +20 -0
  804. package/dist/package/node/components/ui/dialog.js +34 -0
  805. package/dist/package/node/components/ui/dropdown-menu.js +30 -0
  806. package/dist/package/node/components/ui/input.js +8 -0
  807. package/dist/package/node/components/ui/label.js +7 -0
  808. package/dist/package/node/components/ui/popover.js +10 -0
  809. package/dist/package/node/components/ui/select.js +31 -0
  810. package/dist/package/node/components/ui/tabs.js +12 -0
  811. package/dist/package/node/components/ui/textarea.js +8 -0
  812. package/dist/package/node/components/ui/tooltip.js +10 -0
  813. package/dist/package/node/core/app-shell/catalog-page-extensions.js +234 -0
  814. package/dist/package/node/core/app-shell/derive-panel-renderers.js +17 -0
  815. package/dist/package/node/core/app-shell/host.js +188 -0
  816. package/dist/package/node/core/app-shell/index.js +8 -0
  817. package/dist/package/node/core/app-shell/logger.js +6 -0
  818. package/dist/package/node/core/app-shell/ownership.js +7 -0
  819. package/dist/package/node/core/app-shell/react/HostProvider.js +35 -0
  820. package/dist/package/node/core/app-shell/surface-extension.js +33 -0
  821. package/dist/package/node/core/app-shell/types.js +1 -0
  822. package/dist/package/node/core/contextual-keybindings.js +198 -0
  823. package/dist/package/node/core/extension-foundation/bus.js +3 -0
  824. package/dist/package/node/core/extension-foundation/capabilities.js +3 -0
  825. package/dist/package/node/core/extension-foundation/commands.js +3 -0
  826. package/dist/package/node/core/extension-foundation/context-keys.js +3 -0
  827. package/dist/package/node/core/extension-foundation/contribution-registry.js +3 -0
  828. package/dist/package/node/core/extension-foundation/errors.js +3 -0
  829. package/dist/package/node/core/extension-foundation/index.js +9 -0
  830. package/dist/package/node/core/extension-foundation/loader.js +3 -0
  831. package/dist/package/node/core/extension-foundation/storage.js +3 -0
  832. package/dist/package/node/core/extension-foundation/types.js +1 -0
  833. package/dist/package/node/core/extensions/builtin-commands.js +256 -0
  834. package/dist/package/node/core/extensions/builtin-menus.js +252 -0
  835. package/dist/package/node/core/extensions/chrome-drawer.js +45 -0
  836. package/dist/package/node/core/extensions/chrome-statusbar.js +26 -0
  837. package/dist/package/node/core/extensions/detached-agents-browser.js +9 -0
  838. package/dist/package/node/core/extensions/detached-files-browser.js +6 -0
  839. package/dist/package/node/core/extensions/editor-commands.js +182 -0
  840. package/dist/package/node/core/extensions/foundation-bus.js +3 -0
  841. package/dist/package/node/core/extensions/foundation-commands.js +6 -0
  842. package/dist/package/node/core/extensions/foundation-storage.js +3 -0
  843. package/dist/package/node/core/extensions/host-commands.js +52 -0
  844. package/dist/package/node/core/extensions/observability.js +18 -0
  845. package/dist/package/node/core/extensions/panels-chat.js +41 -0
  846. package/dist/package/node/core/extensions/panels-editor.js +26 -0
  847. package/dist/package/node/core/extensions/panels-viewport.js +20 -0
  848. package/dist/package/node/core/extensions/session-client.js +42 -0
  849. package/dist/package/node/core/extensions/slots-corner-agent-picker.js +6 -0
  850. package/dist/package/node/core/extensions/slots-main-area-body.js +6 -0
  851. package/dist/package/node/core/extensions/slots-sidebar-agents.js +6 -0
  852. package/dist/package/node/core/extensions/studio-domain-clients.js +15 -0
  853. package/dist/package/node/core/extensions/surfaces-scene-editor.js +6 -0
  854. package/dist/package/node/core/extensions/trajectory.js +50 -0
  855. package/dist/package/node/core/page-navigation.js +1 -0
  856. package/dist/package/node/core/page-platform/activity.js +46 -0
  857. package/dist/package/node/core/page-platform/dockview-layout.js +63 -0
  858. package/dist/package/node/core/page-platform/index.js +8 -0
  859. package/dist/package/node/core/page-platform/layout-store.js +54 -0
  860. package/dist/package/node/core/page-platform/page-dirty-probe.js +4 -0
  861. package/dist/package/node/core/page-platform/registry.js +194 -0
  862. package/dist/package/node/core/page-platform/resource-editor.js +74 -0
  863. package/dist/package/node/core/page-platform/session.js +327 -0
  864. package/dist/package/node/core/page-platform/types.js +10 -0
  865. package/dist/package/node/core/panels/context-expression.js +1 -0
  866. package/dist/package/node/core/panels/drawer.js +1 -0
  867. package/dist/package/node/core/panels/index.js +7 -0
  868. package/dist/package/node/core/panels/panel-action-registry.js +62 -0
  869. package/dist/package/node/core/panels/panel-control-registry.js +54 -0
  870. package/dist/package/node/core/panels/resolve-panel-action-state.js +9 -0
  871. package/dist/package/node/core/panels/strip.js +1 -0
  872. package/dist/package/node/core/panels/types.js +1 -0
  873. package/dist/package/node/i18n/index.js +207 -0
  874. package/dist/package/node/i18n/locales/en.json +1959 -0
  875. package/dist/package/node/i18n/locales/zh.json +1959 -0
  876. package/dist/package/node/index.js +2 -0
  877. package/dist/package/node/lib/a11y-summary.js +66 -0
  878. package/dist/package/node/lib/action-dom-discovery.js +84 -0
  879. package/dist/package/node/lib/action-registry.js +210 -0
  880. package/dist/package/node/lib/aegis.js +230 -0
  881. package/dist/package/node/lib/agent-catalog-url.js +24 -0
  882. package/dist/package/node/lib/agent-cli-provider.js +81 -0
  883. package/dist/package/node/lib/ai-intents.js +52 -0
  884. package/dist/package/node/lib/broadcast-stream.js +163 -0
  885. package/dist/package/node/lib/browser-prefs-sync.js +151 -0
  886. package/dist/package/node/lib/builtin-actions.js +558 -0
  887. package/dist/package/node/lib/bus.js +71 -0
  888. package/dist/package/node/lib/checkpoint-api.js +41 -0
  889. package/dist/package/node/lib/cli-providers.js +61 -0
  890. package/dist/package/node/lib/command-palette-store.js +22 -0
  891. package/dist/package/node/lib/composer-bridge.js +448 -0
  892. package/dist/package/node/lib/dashboard-api.js +125 -0
  893. package/dist/package/node/lib/deep-link-bus.js +35 -0
  894. package/dist/package/node/lib/dialog.js +103 -0
  895. package/dist/package/node/lib/editor-facts-bus.js +25 -0
  896. package/dist/package/node/lib/extension-api.js +90 -0
  897. package/dist/package/node/lib/file-activity-stream.js +123 -0
  898. package/dist/package/node/lib/file-family.js +25 -0
  899. package/dist/package/node/lib/game-templates.js +15 -0
  900. package/dist/package/node/lib/global-shortcuts.js +551 -0
  901. package/dist/package/node/lib/logSink.js +128 -0
  902. package/dist/package/node/lib/lucide-icon.js +20 -0
  903. package/dist/package/node/lib/menu-registry.js +197 -0
  904. package/dist/package/node/lib/model-config.js +72 -0
  905. package/dist/package/node/lib/model-prefs.js +53 -0
  906. package/dist/package/node/lib/model-route/index.js +175 -0
  907. package/dist/package/node/lib/narrative-copilot.js +105 -0
  908. package/dist/package/node/lib/native-menu-bridge.js +151 -0
  909. package/dist/package/node/lib/page-tab-icons.js +64 -0
  910. package/dist/package/node/lib/panel-tab-icons.js +49 -0
  911. package/dist/package/node/lib/passive-feedback.js +171 -0
  912. package/dist/package/node/lib/perception-stream.js +42 -0
  913. package/dist/package/node/lib/platform/index.js +13 -0
  914. package/dist/package/node/lib/platform/runtime.js +42 -0
  915. package/dist/package/node/lib/platform/shell-adapter.js +74 -0
  916. package/dist/package/node/lib/platform/surface-windowing.js +16 -0
  917. package/dist/package/node/lib/platform/surface.js +27 -0
  918. package/dist/package/node/lib/platform/use-surface-windowing.js +6 -0
  919. package/dist/package/node/lib/platform/window-manager.js +82 -0
  920. package/dist/package/node/lib/project-context.js +42 -0
  921. package/dist/package/node/lib/project.js +8 -0
  922. package/dist/package/node/lib/recent-games.js +50 -0
  923. package/dist/package/node/lib/repair-builtin-menus.js +18 -0
  924. package/dist/package/node/lib/reply-language.js +11 -0
  925. package/dist/package/node/lib/resilient-polling.js +16 -0
  926. package/dist/package/node/lib/session-time.js +40 -0
  927. package/dist/package/node/lib/shell-live-data.js +66 -0
  928. package/dist/package/node/lib/sse.js +42 -0
  929. package/dist/package/node/lib/storageKeys.js +89 -0
  930. package/dist/package/node/lib/surface-store.js +62 -0
  931. package/dist/package/node/lib/surface.js +225 -0
  932. package/dist/package/node/lib/surfaceAnchors.js +76 -0
  933. package/dist/package/node/lib/surfaceKeepAliveLayout.js +12 -0
  934. package/dist/package/node/lib/telemetry-test-prelude.js +14 -0
  935. package/dist/package/node/lib/text-edit-actions.js +184 -0
  936. package/dist/package/node/lib/trace.js +273 -0
  937. package/dist/package/node/lib/trustedOrigins.js +36 -0
  938. package/dist/package/node/lib/ui-action-highlight.js +93 -0
  939. package/dist/package/node/lib/ui-bridge.js +224 -0
  940. package/dist/package/node/lib/ui-screenshot.js +155 -0
  941. package/dist/package/node/lib/ui-trajectory.js +99 -0
  942. package/dist/package/node/lib/use-bus-snapshot.js +13 -0
  943. package/dist/package/node/lib/use-extension-manifest.js +67 -0
  944. package/dist/package/node/lib/useConfirmToast.js +120 -0
  945. package/dist/package/node/lib/utils.js +5 -0
  946. package/dist/package/node/lib/vag-action-bridge.js +130 -0
  947. package/dist/package/node/main.js +157 -0
  948. package/dist/package/node/store-parts/domain-clients.js +17 -0
  949. package/dist/package/node/store-parts/observability.js +35 -0
  950. package/dist/package/node/store-parts/persistence.js +245 -0
  951. package/dist/package/node/store-parts/session-client.js +17 -0
  952. package/dist/package/node/store-parts/session-pick.js +21 -0
  953. package/dist/package/node/store-parts/shell.js +37 -0
  954. package/dist/package/node/store.js +890 -0
  955. package/dist/package/node/styles/foundation.tokens.json +2755 -0
  956. package/dist/package/node/styles/semantic.tokens.json +1524 -0
  957. package/dist/package/packages/design/styles/fx-bridge.css +25 -0
  958. package/dist/package/packages/design/styles/primitive.css +199 -0
  959. package/dist/package/packages/design/styles/semantic.css +262 -0
  960. package/dist/package/packages/design/theme.d.ts +15 -0
  961. package/dist/package/packages/design/theme.js +31 -0
  962. package/dist/package/packages/design/tokens.css +14 -0
  963. package/package.json +145 -0
@@ -0,0 +1,1385 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // P2.6d — Bus admin panel: full visibility into what the bus actually loaded.
3
+ // Top-level mode, mounted by MainArea when store.mode === 'bus'. Lists every
4
+ // plugin returned by GET /api/extensions/list, grouped by `kind`, with one row per
5
+ // plugin: id / displayName.zh / version / extension info (icon + panelSize +
6
+ // position) when applicable, plus an experimental flag chip.
7
+ //
8
+ // P2.6e — adds a filter bar above the groups: one colored chip per kind (with
9
+ // count) acting as a toggle (first click solos that kind, repeat-click brings
10
+ // "all on" back), and a substring search input matching id + displayName.
11
+ // Reset button collapses both back to the initial "show everything" state.
12
+ //
13
+ // P2.6f — row click expands an inline detail panel: chevron column toggles
14
+ // between ▸ (collapsed) and ▾ (expanded); expanded rows insert a colSpan row
15
+ // below with full zh + en descriptions (no line-clamp), the canonical manifest
16
+ // id rendered as plugins-dir hint, full extension manifest dump, and a note
17
+ // about provides[]/broken[] still being P3 territory. Expanded ids persist
18
+ // across filter/search changes so the player can "search → expand → narrow
19
+ // further" without losing place.
20
+ //
21
+ // P2.6g — when the slim shape exposes `provides.{skills,tools,events,
22
+ // cliProvider}` (server side projects file-path-stripped subsets), render a
23
+ // "provides" section in the detail row: skills → `id · trigger` rows, tools
24
+ // → `id [exposedToAI]` rows, events → `name` rows, cliProvider → models +
25
+ // 5 boolean capability chips. The note about provides[] no longer being
26
+ // exposed now applies only to broken[].
27
+ //
28
+ // P4.34 — for the agent KindSection, render a violet (#c4a3ff — agent
29
+ // tribe color matching ts-agent / cp-agent / tb-agent family) health LED
30
+ // between .ba-kind-count and .ba-kind-desc, reading `N reg · M/K run`.
31
+ // Driven by polling listExtensions('agent') + dashApi.daemons.list() in
32
+ // lockstep every 10s; tone is ok (≥1 daemon running) / warn (registered
33
+ // but 0 running) / down (registered = 0 or fetch failed) / loading. This
34
+ // is the 3rd Bus admin section LED (after cli-provider P4.14 +
35
+ // extension P4.33), bringing section LED coverage to 3/5 kinds.
36
+ //
37
+ // P3.21 — for the cli-provider KindSection only, render a sticky compact
38
+ // capability matrix between the kind header and the table. 4 cli × 5
39
+ // capability grid (streaming/thinking/toolCalls/subAgents/sessions) lets the
40
+ // player compare row-by-row without expanding every detail row. Column
41
+ // headers carry per-cap coverage badges ("4/4 ●"), row headers carry the cli
42
+ // displayName + provider id mono code. ●=on (#d4ff48 lime · sky-blue fill on
43
+ // header) / ○=off (dim gray). When all caps for all cli are on, the bottom
44
+ // summary turns lime "5 cap · 100% coverage"; partial coverage shifts to
45
+ // amber for visual alarm. This is the first matrix-style data viz in the
46
+ // Bus panel (provides block is per-cli vertical) — 4×5 dense grid is a new
47
+ // visual primitive for the panel.
48
+ //
49
+ // P4.38 — Bus kind mini-dashboard (ba-mini-dashboard). Inserted just under the
50
+ // `.ba-head` title row (above `.ba-ui-surfaces` and `.ba-filterbar`) so the
51
+ // player landing on ⌘3 Bus admin sees a one-row, zero-scroll snapshot of all
52
+ // 6 bus kinds before any group rolls into view: 6 colored mini-LED pills
53
+ // (extension lime · agent violet · cli-provider sky-blue / amber when not all
54
+ // ok · model-binding teal · skill gold · tool orange) each reading `<dot>
55
+ // <KIND> <ok/total>`. Tones reuse the 6 section-LED snapshots already polled
56
+ // at panel level (cliProv / pageSurfaces / agentSnap / mbSnap / skillSnap /
57
+ // toolSnap from P4.14/33/34/35/36/37) — no new endpoint, no extra poll, no
58
+ // new store key. Click a pill → solo that kind (same semantics as ba-chip
59
+ // solo: first click solos, repeat click resets to all); also fires
60
+ // setPendingSidebarKindFlash(kind) so the Sidebar BUS KINDS chip flashes in
61
+ // sympathy (P3.38 reverse-echo channel). Hover title surfaces the same
62
+ // multi-line breakdown each section LED already exposes, so the player can
63
+ // read "which extension panels are mounted / which providers are healthy /
64
+ // which agent daemons are running / which skills/tools are experimental"
65
+ // without scrolling to that section's header. Completes the BusAdminPanel
66
+ // section-LED 6/6 collection (P4.14 → P4.37 across 23 phases) by giving
67
+ // those LEDs a unified header dashboard surface.
68
+ //
69
+ // P4.40 — Bus kind mini-dashboard tail "aggregate summary pill"
70
+ // (`.ba-md-summary`). Sits to the right of the 6 LEDs and reads the same
71
+ // `leds` descriptor list to bucket each LED into one of four tones:
72
+ // `loading / ok / warn / down`. Renders `N ✓ · M ⚠ · K ✗` (loading-only
73
+ // state falls back to `…`) with the same per-tone color grammar the 6 LEDs
74
+ // already use (ok lime · warn amber · down red), and gives the player a
75
+ // 0-scroll, no-hover answer to "how is the bus overall?" without having to
76
+ // scan all 6 LEDs. Outer ring color reflects the worst tone present —
77
+ // down > warn > loading > ok — so degraded bus state visually alarms.
78
+ // Click → resetFilters() (clears kind solo + clears the search query), so
79
+ // the pill also doubles as a one-tap "back to everything" escape hatch
80
+ // after the player has soloed a kind via any of the 6 LEDs / ba-chip /
81
+ // Sidebar BUS KINDS / TabStrip ts-*-chip / TopBar tb-* / PreviewToolbar
82
+ // pt-* / ChatPanel cp-* deep-links. When `enabledKinds` is non-null (i.e.
83
+ // player currently has at least one kind soloed), the trailing arrow
84
+ // glyph swaps `↺ → ⤺` to signal "this click will UNDO that filter" rather
85
+ // than just refresh. 0 server / 0 store / 0 marketplace changes · 0 new
86
+ // endpoint · 0 new poll — fully derived from the 6 snapshots already at
87
+ // panel scope (cliProv / pageSurfaces / agentSnap / mbSnap / skillSnap /
88
+ // toolSnap).
89
+ import { useEffect, useMemo, useRef, useState } from 'react';
90
+ import { createIntervalTaskLifecycle, createRestartableTimeoutTaskLifecycle, } from '@forgeax/app-shell/react';
91
+ import { useTranslation } from '../../i18n';
92
+ import { extensionManifestSourceLabel, listExtensions, pickLang } from '../../lib/extension-api';
93
+ import { dashApi } from '../../lib/dashboard-api';
94
+ import { emitDeepLink, useDeepLink } from '../../lib/deep-link-bus';
95
+ import { openExtensionPage } from '../../core/page-navigation';
96
+ import { CapabilityOverview } from './CapabilityOverview';
97
+ import './BusAdminPanel.css';
98
+ // Static vendor → cli-provider id map used by the model-binding section LED.
99
+ // Kept inline (not exported) because the mapping is a UI-side rendering hint,
100
+ // not a runtime contract. New vendors fall through to providerId=null which
101
+ // the LED reports as "unmapped" without claiming health.
102
+ const VENDOR_TO_PROVIDER = {
103
+ anthropic: 'claude-code',
104
+ openai: 'codex',
105
+ cursor: 'cursor-agent',
106
+ forgeax: 'forgeax',
107
+ };
108
+ // Stable kind ordering — extension first (the player's most-edited surface),
109
+ // then agent (next most-touched), then everything else alphabetical. Unknown
110
+ // kinds bucket to the end via the +1000 fallback.
111
+ const KIND_ORDER = {
112
+ extension: 10,
113
+ agent: 20,
114
+ 'cli-provider': 30,
115
+ 'model-binding': 40,
116
+ skill: 50,
117
+ tool: 60,
118
+ };
119
+ function groupByKind(items) {
120
+ const m = new Map();
121
+ for (const it of items) {
122
+ const list = m.get(it.kind) ?? [];
123
+ list.push(it);
124
+ m.set(it.kind, list);
125
+ }
126
+ const groups = [];
127
+ for (const [kind, list] of m) {
128
+ list.sort((a, b) => a.id.localeCompare(b.id));
129
+ groups.push({ kind, items: list });
130
+ }
131
+ groups.sort((a, b) => {
132
+ const oa = KIND_ORDER[a.kind] ?? 1000;
133
+ const ob = KIND_ORDER[b.kind] ?? 1000;
134
+ if (oa !== ob)
135
+ return oa - ob;
136
+ return a.kind.localeCompare(b.kind);
137
+ });
138
+ return groups;
139
+ }
140
+ // P2.6e — substring match against id + displayName.zh + displayName.en. Case
141
+ // insensitive, '' = match all. Keeps the table dense so the player can type
142
+ // 'wb' to see extensions, 'cli' to see cli-providers, 'anim' to jump to one.
143
+ function matchesQuery(p, q) {
144
+ if (!q)
145
+ return true;
146
+ const hay = [
147
+ p.id,
148
+ pickLang(p.displayName, 'zh', ''),
149
+ pickLang(p.displayName, 'en', ''),
150
+ ]
151
+ .join(' ')
152
+ .toLowerCase();
153
+ return hay.includes(q.toLowerCase());
154
+ }
155
+ export function BusAdminPanel() {
156
+ const { t } = useTranslation();
157
+ const [items, setItems] = useState([]);
158
+ const [loading, setLoading] = useState(true);
159
+ const [err, setErr] = useState(null);
160
+ const [refreshTs, setRefreshTs] = useState(Date.now());
161
+ const [query, setQuery] = useState('');
162
+ // null = "all kinds on"; Set = explicit kinds enabled. Toggling the first
163
+ // chip switches into explicit mode with that single kind enabled (single
164
+ // click = focus that kind), then further clicks add/remove.
165
+ const [enabledKinds, setEnabledKinds] = useState(null);
166
+ // P2.6f — which plugin ids are currently expanded. Persisted across filter
167
+ // changes (re-typing search shouldn't collapse what you opened). Refresh
168
+ // (re-fetch) clears it so stale rows can't linger expanded.
169
+ const [expandedIds, setExpandedIds] = useState(new Set());
170
+ // P-UI-SURFACES — read-only view of /api/bus/ui/surfaces. The P9 dual-modality
171
+ // work has the server registering UI surfaces (host.sidebar + plugin-layer
172
+ // surfaces like character-forge.editor) with `actions[]` exposed to AI. No
173
+ // existing panel surfaces this registry, so the player can't see what AI
174
+ // can actually drive at runtime. We render a compact strip between the head
175
+ // and the kind filter bar listing each surface + its action count.
176
+ const [uiSurfaces, setUiSurfaces] = useState(null);
177
+ // P4.14 — cli-provider health snapshot. Inlines the same 10s poll that
178
+ // TopBar tb-providers and PreviewToolbar pt-prov already run; the LED ends
179
+ // up in the cli-provider KindSection header so the player reading the bus
180
+ // panel sees the same ok/warn/down signal without leaving the section.
181
+ const [cliProv, setCliProv] = useState({
182
+ tone: 'loading',
183
+ ok: 0,
184
+ total: 0,
185
+ rows: [],
186
+ });
187
+ // P4.33 — extension section LED snapshot. Refilled by polling
188
+ // /api/bus/ui/surfaces every 10s; the `total` field is overlaid with the
189
+ // current `group.items.length` of the extension section at render time, so
190
+ // the header always reads `mounted/total` against the live registry rather
191
+ // than a snapshot total taken once at fetch time.
192
+ const [pageSurfaces, setPageSurfaces] = useState({
193
+ tone: 'loading',
194
+ mounted: 0,
195
+ total: 0,
196
+ mountedPageIds: new Set(),
197
+ });
198
+ // P4.34 — agent section LED snapshot. After daemon retirement, only the
199
+ // registered plugin count drives this LED. Tone: ok (violet) when ≥1
200
+ // agent plugin is registered, down (red) on fetch failure or 0 plugins.
201
+ const [agentSnap, setAgentSnap] = useState({
202
+ tone: 'loading',
203
+ registered: 0,
204
+ agentIds: [],
205
+ });
206
+ // P4.35 — model-binding section LED snapshot. Refilled by polling 2 endpoints
207
+ // in lockstep every 10s: listExtensions('model-binding') gives the registered
208
+ // bindings + vendor/channel/models; dashApi.providers() gives per-provider
209
+ // health.ok. We join via VENDOR_TO_PROVIDER (anthropic → claude-code etc).
210
+ // Tone classification mirrors P4.34 agent: live ≥ 1 ⇒ ok-teal; registered ≥ 1
211
+ // but live = 0 ⇒ warn-amber (registry has bindings but no underlying CLI is
212
+ // healthy); registered = 0 or fetch failure ⇒ down-red.
213
+ const [mbSnap, setMbSnap] = useState({
214
+ tone: 'loading',
215
+ registered: 0,
216
+ live: 0,
217
+ bindings: [],
218
+ });
219
+ // P4.36 — skill section LED snapshot. Refilled by polling
220
+ // listExtensions('skill') every 10s. Unlike mb/agent this LED has no
221
+ // second channel — "ready" is derived intra-plugin from skills.length≥1;
222
+ // "experimental" from manifest experimental:true. Lockstep cadence with
223
+ // the other 4 LEDs so all 5 visibly update in the same tick.
224
+ const [skillSnap, setSkillSnap] = useState({
225
+ tone: 'loading',
226
+ registered: 0,
227
+ ready: 0,
228
+ experimental: 0,
229
+ skills: [],
230
+ });
231
+ // P4.37 — tool section LED snapshot. Same shape as skillSnap (single
232
+ // channel — tool plugins have no per-binding runtime health). Refilled by
233
+ // polling listExtensions('tool') every 10s, lockstep with the other 5
234
+ // section LEDs so 6/6 LEDs visibly update in the same tick.
235
+ const [toolSnap, setToolSnap] = useState({
236
+ tone: 'loading',
237
+ registered: 0,
238
+ ready: 0,
239
+ exposedAi: 0,
240
+ experimental: 0,
241
+ tools: [],
242
+ });
243
+ // P3.57 — roving tabindex focus head for the `.ba-chips` filter row.
244
+ // Arrow keys move this index; Enter/Space (button native) toggle the kind.
245
+ // We pick manual-activate (not auto) because chip click has filter side
246
+ // effect (would surprise keyboard scrubbing). Mirrors P3.50 footer chip
247
+ // manual-Enter mode rather than P3.51/53/54 auto-activate.
248
+ const [chipFocusIdx, setChipFocusIdx] = useState(0);
249
+ const chipRefs = useRef([]);
250
+ // P3.58 — roving tabindex focus head for the table rows (`.ba-table tr`).
251
+ // Flat ordering across all KindSection tables — player presses ↑/↓ to walk
252
+ // the 19 plugins as one stream, transparently crossing kind-section
253
+ // boundaries. Enter/Space toggles expand. Manual-activate (Enter required)
254
+ // — arrow keys only move focus, never toggle, because expand mutates
255
+ // expandedIds + fires P3.40 ChatPanel TabStrip flash (side effects).
256
+ const [focusedRowId, setFocusedRowId] = useState(null);
257
+ // P2.7f — deep-link target from Sidebar's ExtensionPlaceholder "在 Bus 详情
258
+ //查看 →" button. Consumed once on mount + whenever it flips non-null, then
259
+ // cleared so a back-and-forth between Sidebar/Bus tab doesn't re-expand
260
+ // (player may have manually collapsed it since).
261
+ // R5/P2 — deep-links moved off the interface store onto the bus (retain semantics).
262
+ const [pendingBusExpandId, clearBusExpandId] = useDeepLink('bus:expand-plugin');
263
+ // P3.37 — sister deep-link to bus:expand-plugin: Sidebar BUS KINDS footer
264
+ // chips emit this + setMode('bus'); consume it here once items have loaded by
265
+ // soloing that kind in the filter row (enabledKinds = {kind}), then clear.
266
+ const [pendingBusKindFilter, clearBusKindFilter] = useDeepLink('bus:filter-kind');
267
+ const rowRefs = useRef(new Map());
268
+ useEffect(() => {
269
+ let cancel = false;
270
+ setLoading(true);
271
+ listExtensions()
272
+ .then((r) => {
273
+ if (cancel)
274
+ return;
275
+ setItems(r.items);
276
+ setErr(null);
277
+ })
278
+ .catch((e) => {
279
+ if (cancel)
280
+ return;
281
+ setErr(e.message);
282
+ })
283
+ .finally(() => {
284
+ if (!cancel)
285
+ setLoading(false);
286
+ });
287
+ return () => {
288
+ cancel = true;
289
+ };
290
+ }, [refreshTs]);
291
+ // P2.6f — clear expanded rows whenever the player explicitly refreshes; a
292
+ // re-fetch may renumber/replace rows so leaving stale expansion is confusing.
293
+ useEffect(() => {
294
+ setExpandedIds(new Set());
295
+ }, [refreshTs]);
296
+ // P-UI-SURFACES — fetch /api/bus/ui/surfaces. Independent endpoint from the
297
+ // plugin list. Null until first fetch resolves; [] when endpoint is 404
298
+ // (server hasn't shipped P9 yet); populated rows otherwise. Silent failure
299
+ // — the strip just stays hidden, the rest of the panel keeps working.
300
+ useEffect(() => {
301
+ let cancel = false;
302
+ fetch('/api/bus/ui/surfaces')
303
+ .then((r) => (r.ok ? r.json() : { count: 0, items: [] }))
304
+ .then((j) => {
305
+ if (cancel)
306
+ return;
307
+ setUiSurfaces(j.items ?? []);
308
+ })
309
+ .catch(() => {
310
+ if (!cancel)
311
+ setUiSurfaces([]);
312
+ });
313
+ return () => {
314
+ cancel = true;
315
+ };
316
+ }, [refreshTs]);
317
+ // P4.14 — poll /api/cli-providers for the cli-provider section LED.
318
+ useEffect(() => {
319
+ let cancelled = false;
320
+ const tick = async () => {
321
+ try {
322
+ const r = await dashApi.providers();
323
+ if (cancelled)
324
+ return;
325
+ const rows = r.providers ?? [];
326
+ const ok = rows.filter((p) => p.health?.ok).length;
327
+ const total = rows.length;
328
+ const tone = total === 0 ? 'down' : ok === total ? 'ok' : ok === 0 ? 'down' : 'warn';
329
+ setCliProv({ tone, ok, total, rows });
330
+ }
331
+ catch {
332
+ if (!cancelled)
333
+ setCliProv({ tone: 'down', ok: 0, total: 0, rows: [] });
334
+ }
335
+ };
336
+ void tick();
337
+ const poll = createIntervalTaskLifecycle({
338
+ task: () => { void tick(); },
339
+ intervalMs: 10_000,
340
+ });
341
+ poll.start();
342
+ return () => {
343
+ cancelled = true;
344
+ poll.dispose();
345
+ };
346
+ }, [refreshTs]);
347
+ // P4.33 — poll /api/bus/ui/surfaces for the extension section LED. Counts
348
+ // plugin-layer surfaces (layer === 'plugin'); each surface id `<pageId>.<x>`
349
+ // contributes its `pageId` prefix. `mountedPageIds` is the join key against the
350
+ // extension KindSection items array at render time. Tone classification
351
+ // happens in KindSection (needs the live total from `group.items.length`).
352
+ useEffect(() => {
353
+ let cancelled = false;
354
+ const tick = async () => {
355
+ try {
356
+ const r = await fetch('/api/bus/ui/surfaces');
357
+ if (!r.ok)
358
+ throw new Error(`HTTP ${r.status}`);
359
+ const body = (await r.json());
360
+ if (cancelled)
361
+ return;
362
+ const mounted = new Set();
363
+ for (const s of body.items ?? []) {
364
+ if (s.layer !== 'plugin')
365
+ continue;
366
+ const dot = s.id.indexOf('.');
367
+ const pageId = dot > 0 ? s.id.slice(0, dot) : s.id;
368
+ if (pageId)
369
+ mounted.add(pageId);
370
+ }
371
+ setPageSurfaces({
372
+ tone: 'loading', // tone reclassified in KindSection vs live total
373
+ mounted: mounted.size,
374
+ total: 0,
375
+ mountedPageIds: mounted,
376
+ });
377
+ }
378
+ catch {
379
+ if (!cancelled)
380
+ setPageSurfaces({ tone: 'down', mounted: 0, total: 0, mountedPageIds: new Set() });
381
+ }
382
+ };
383
+ void tick();
384
+ const poll = createIntervalTaskLifecycle({
385
+ task: () => { void tick(); },
386
+ intervalMs: 10_000,
387
+ });
388
+ poll.start();
389
+ return () => {
390
+ cancelled = true;
391
+ poll.dispose();
392
+ };
393
+ }, [refreshTs]);
394
+ // P4.34 — poll registered agent plugins for the agent section LED.
395
+ // Daemon channel deleted (R3 — no more daemon processes); tone reads
396
+ // only `registered ≥ 1` now.
397
+ useEffect(() => {
398
+ let cancelled = false;
399
+ const tick = async () => {
400
+ try {
401
+ const plugins = await listExtensions('agent');
402
+ if (cancelled)
403
+ return;
404
+ const agentIds = plugins.items.map((p) => p.id);
405
+ const tone = agentIds.length === 0 ? 'down' : 'ok';
406
+ setAgentSnap({
407
+ tone,
408
+ registered: agentIds.length,
409
+ agentIds,
410
+ });
411
+ }
412
+ catch {
413
+ if (!cancelled)
414
+ setAgentSnap({
415
+ tone: 'down',
416
+ registered: 0,
417
+ agentIds: [],
418
+ });
419
+ }
420
+ };
421
+ void tick();
422
+ const poll = createIntervalTaskLifecycle({
423
+ task: () => { void tick(); },
424
+ intervalMs: 10_000,
425
+ });
426
+ poll.start();
427
+ return () => {
428
+ cancelled = true;
429
+ poll.dispose();
430
+ };
431
+ }, [refreshTs]);
432
+ // P4.35 — poll registered model-binding plugins + cli-provider health in
433
+ // lockstep for the model-binding section LED. Mirrors P4.34 agent poll
434
+ // shape: a single Promise.all keeps the snapshot atomic; either fetch
435
+ // failure ⇒ tone='down'. Join key is VENDOR_TO_PROVIDER[binding.vendor];
436
+ // unmapped vendors render as `live=false` but still count toward registered.
437
+ useEffect(() => {
438
+ let cancelled = false;
439
+ const tick = async () => {
440
+ try {
441
+ const [plugins, providers] = await Promise.all([
442
+ listExtensions('model-binding'),
443
+ dashApi.providers(),
444
+ ]);
445
+ if (cancelled)
446
+ return;
447
+ const provRows = providers.providers ?? [];
448
+ const healthById = new Map();
449
+ for (const p of provRows) {
450
+ healthById.set(p.id, { ok: !!p.health?.ok, detail: p.health?.detail });
451
+ }
452
+ const bindings = plugins.items.map((p) => {
453
+ const vendor = p.modelBinding?.vendor ?? '';
454
+ const channel = p.modelBinding?.channel ?? '';
455
+ const providerId = vendor ? (VENDOR_TO_PROVIDER[vendor] ?? null) : null;
456
+ const h = providerId ? healthById.get(providerId) : undefined;
457
+ return {
458
+ id: p.id,
459
+ vendor,
460
+ channel,
461
+ providerId,
462
+ healthy: !!h?.ok,
463
+ detail: h?.detail,
464
+ };
465
+ });
466
+ const live = bindings.filter((b) => b.healthy).length;
467
+ const tone = bindings.length === 0 ? 'down' : live >= 1 ? 'ok' : 'warn';
468
+ setMbSnap({ tone, registered: bindings.length, live, bindings });
469
+ }
470
+ catch {
471
+ if (!cancelled)
472
+ setMbSnap({ tone: 'down', registered: 0, live: 0, bindings: [] });
473
+ }
474
+ };
475
+ void tick();
476
+ const poll = createIntervalTaskLifecycle({
477
+ task: () => { void tick(); },
478
+ intervalMs: 10_000,
479
+ });
480
+ poll.start();
481
+ return () => {
482
+ cancelled = true;
483
+ poll.dispose();
484
+ };
485
+ }, [refreshTs]);
486
+ // P4.36 — poll registered skill plugins every 10s for the skill section
487
+ // LED. Single-channel (no cli-provider / daemon join — skills have no
488
+ // runtime health channel today), but classifies each plugin into
489
+ // ready/experimental buckets so tone amber surfaces "registry has skill
490
+ // plugins but they're all placeholders" without forcing the player to
491
+ // open each row to read the experimental flag.
492
+ useEffect(() => {
493
+ let cancelled = false;
494
+ const tick = async () => {
495
+ try {
496
+ const r = await listExtensions('skill');
497
+ if (cancelled)
498
+ return;
499
+ const skills = r.items.map((p) => {
500
+ const triggers = (p.skills ?? []).map((s) => s.trigger);
501
+ return {
502
+ id: p.id,
503
+ triggers,
504
+ experimental: p.experimental === true,
505
+ ready: triggers.length >= 1,
506
+ };
507
+ });
508
+ const registered = skills.length;
509
+ const ready = skills.filter((s) => s.ready).length;
510
+ const experimental = skills.filter((s) => s.experimental).length;
511
+ const tone = registered === 0
512
+ ? 'down'
513
+ : ready < registered || experimental === registered
514
+ ? 'warn'
515
+ : 'ok';
516
+ setSkillSnap({ tone, registered, ready, experimental, skills });
517
+ }
518
+ catch {
519
+ if (!cancelled)
520
+ setSkillSnap({
521
+ tone: 'down',
522
+ registered: 0,
523
+ ready: 0,
524
+ experimental: 0,
525
+ skills: [],
526
+ });
527
+ }
528
+ };
529
+ void tick();
530
+ const poll = createIntervalTaskLifecycle({
531
+ task: () => { void tick(); },
532
+ intervalMs: 10_000,
533
+ });
534
+ poll.start();
535
+ return () => {
536
+ cancelled = true;
537
+ poll.dispose();
538
+ };
539
+ }, [refreshTs]);
540
+ // P4.37 — poll registered tool plugins every 10s for the tool section LED.
541
+ // Mirrors P4.36 skill poll shape: single-channel (no provider join · tools
542
+ // have no per-binding runtime health today), but classifies each plugin
543
+ // into ready/experimental + counts AI-exposed tools so tone amber surfaces
544
+ // "registry has tools but they're all experimental placeholders" without
545
+ // forcing the player to open each row to read the experimental flag.
546
+ useEffect(() => {
547
+ let cancelled = false;
548
+ const tick = async () => {
549
+ try {
550
+ const r = await listExtensions('tool');
551
+ if (cancelled)
552
+ return;
553
+ const tools = r.items.map((p) => {
554
+ const toolList = p.tools ?? [];
555
+ const eventList = p.events ?? [];
556
+ const aiExposed = toolList.filter((t) => t.exposedToAI !== false).length;
557
+ return {
558
+ id: p.id,
559
+ toolIds: toolList.map((t) => t.id),
560
+ eventNames: eventList.map((e) => e.name),
561
+ aiExposed,
562
+ experimental: p.experimental === true,
563
+ ready: toolList.length >= 1,
564
+ };
565
+ });
566
+ const registered = tools.length;
567
+ const ready = tools.filter((t) => t.ready).length;
568
+ const exposedAi = tools.reduce((n, t) => n + t.aiExposed, 0);
569
+ const experimental = tools.filter((t) => t.experimental).length;
570
+ const tone = registered === 0
571
+ ? 'down'
572
+ : ready < registered || experimental === registered
573
+ ? 'warn'
574
+ : 'ok';
575
+ setToolSnap({ tone, registered, ready, exposedAi, experimental, tools });
576
+ }
577
+ catch {
578
+ if (!cancelled)
579
+ setToolSnap({
580
+ tone: 'down',
581
+ registered: 0,
582
+ ready: 0,
583
+ exposedAi: 0,
584
+ experimental: 0,
585
+ tools: [],
586
+ });
587
+ }
588
+ };
589
+ void tick();
590
+ const poll = createIntervalTaskLifecycle({
591
+ task: () => { void tick(); },
592
+ intervalMs: 10_000,
593
+ });
594
+ poll.start();
595
+ return () => {
596
+ cancelled = true;
597
+ poll.dispose();
598
+ };
599
+ }, [refreshTs]);
600
+ // P2.7f — apply deep-link request once items have loaded.
601
+ // so the expand attempt waits for the fetch to resolve (otherwise we'd open
602
+ // an id that isn't in the table yet, and the scroll target ref wouldn't exist).
603
+ useEffect(() => {
604
+ if (!pendingBusExpandId)
605
+ return;
606
+ if (items.length === 0)
607
+ return;
608
+ const target = pendingBusExpandId;
609
+ setExpandedIds((prev) => {
610
+ const next = new Set(prev);
611
+ next.add(target);
612
+ return next;
613
+ });
614
+ // Defer scroll one frame so the new row + detail row render before we
615
+ // measure their position.
616
+ requestAnimationFrame(() => {
617
+ const row = rowRefs.current.get(target);
618
+ if (row) {
619
+ row.scrollIntoView({ behavior: 'smooth', block: 'center' });
620
+ }
621
+ });
622
+ clearBusExpandId();
623
+ }, [pendingBusExpandId, items.length, clearBusExpandId]);
624
+ // P3.37 — consume Sidebar footer chip click. Wait until items load so the
625
+ // kind set is non-empty (and the chip filter row is mounted). Soloing a kind
626
+ // mirrors what clicking a chip in the local filter row would do — so the
627
+ // player lands in the same state, with one kind visible across all groups.
628
+ useEffect(() => {
629
+ if (!pendingBusKindFilter)
630
+ return;
631
+ if (items.length === 0)
632
+ return;
633
+ const target = pendingBusKindFilter;
634
+ setEnabledKinds(new Set([target]));
635
+ clearBusKindFilter();
636
+ }, [pendingBusKindFilter, items.length, clearBusKindFilter]);
637
+ const toggleExpand = (id) => {
638
+ // P3.40 — fire the ChatPanel TabStrip bus-chip flash on every toggle
639
+ // (expand AND collapse). Both directions are "I just touched a bus row";
640
+ // TabStrip dedupes via its own timer reset, so spam-clicking the same row
641
+ // doesn't compound — each click starts a fresh 0.8s pulse from peak.
642
+ emitDeepLink('chat:flash-bus-chip', id);
643
+ setExpandedIds((prev) => {
644
+ const next = new Set(prev);
645
+ if (next.has(id))
646
+ next.delete(id);
647
+ else
648
+ next.add(id);
649
+ return next;
650
+ });
651
+ };
652
+ const allGroups = useMemo(() => groupByKind(items), [items]);
653
+ // Kind chip metadata is derived from the unfiltered groups so the chip row
654
+ // remains stable as the user types / toggles — counts always reflect "what
655
+ // bus actually loaded", not "what's currently visible".
656
+ const kindStats = useMemo(() => allGroups.map((g) => ({ kind: g.kind, count: g.items.length })), [allGroups]);
657
+ const groups = useMemo(() => {
658
+ return allGroups
659
+ .filter((g) => enabledKinds === null || enabledKinds.has(g.kind))
660
+ .map((g) => ({ kind: g.kind, items: g.items.filter((p) => matchesQuery(p, query)) }))
661
+ .filter((g) => g.items.length > 0);
662
+ }, [allGroups, query, enabledKinds]);
663
+ const visibleCount = useMemo(() => groups.reduce((sum, g) => sum + g.items.length, 0), [groups]);
664
+ const filtered = enabledKinds !== null || query.length > 0;
665
+ // P3.58 — flat ordering of currently-visible plugin ids across all kind
666
+ // sections. Crucial that this is derived from `groups` (filtered view), not
667
+ // `allGroups`, so ↑↓ only walks rows the player can actually see.
668
+ const orderedRowIds = useMemo(() => groups.flatMap((g) => g.items.map((p) => p.id)), [groups]);
669
+ // P3.58 — keep focused row valid as filter/search/refresh churn the visible
670
+ // set. If the previously-focused id was filtered out (or items just loaded),
671
+ // snap to the first visible row so Tab-into-table lands somewhere sensible.
672
+ useEffect(() => {
673
+ if (orderedRowIds.length === 0) {
674
+ if (focusedRowId !== null)
675
+ setFocusedRowId(null);
676
+ return;
677
+ }
678
+ if (focusedRowId === null || !orderedRowIds.includes(focusedRowId)) {
679
+ setFocusedRowId(orderedRowIds[0]);
680
+ }
681
+ }, [orderedRowIds, focusedRowId]);
682
+ // P3.58 — moveRowFocus is bound per-row in ExtensionRow.onKeyDown. Cycles via
683
+ // mod-N so ↓ from last wraps to first and ↑ from first wraps to last.
684
+ const moveRowFocus = (currentId, key) => {
685
+ const n = orderedRowIds.length;
686
+ if (n === 0)
687
+ return;
688
+ const idx = orderedRowIds.indexOf(currentId);
689
+ if (idx < 0)
690
+ return;
691
+ let next = idx;
692
+ if (key === 'ArrowDown' || key === 'ArrowRight')
693
+ next = (idx + 1) % n;
694
+ else if (key === 'ArrowUp' || key === 'ArrowLeft')
695
+ next = (idx - 1 + n) % n;
696
+ else if (key === 'Home')
697
+ next = 0;
698
+ else if (key === 'End')
699
+ next = n - 1;
700
+ else
701
+ return;
702
+ const nextId = orderedRowIds[next];
703
+ setFocusedRowId(nextId);
704
+ requestAnimationFrame(() => {
705
+ rowRefs.current.get(nextId)?.focus();
706
+ });
707
+ };
708
+ const toggleKind = (kind) => {
709
+ // P3.38 — fire the reverse deep-link on every click (not just on solo-in),
710
+ // because the player's mental model is "I touched THIS kind, confirm it
711
+ // over in the Sidebar". Sidebar will reset its own timer if the same chip
712
+ // is clicked rapidly, so spamming doesn't break the animation.
713
+ emitDeepLink('sidebar:flash-kind', kind);
714
+ setEnabledKinds((prev) => {
715
+ // First click from "all on" → solo that kind (most common UX: "show me
716
+ // just extension"). Re-click solo'd kind → back to "all on".
717
+ if (prev === null)
718
+ return new Set([kind]);
719
+ const next = new Set(prev);
720
+ if (next.has(kind))
721
+ next.delete(kind);
722
+ else
723
+ next.add(kind);
724
+ // If user toggled all kinds back on, snap to null sentinel so the chip
725
+ // row renders the same as initial mount.
726
+ if (next.size === kindStats.length)
727
+ return null;
728
+ // If user turned every chip off, also snap back to null — empty filter
729
+ // is confusing ("nothing to show"); treat it as "reset".
730
+ if (next.size === 0)
731
+ return null;
732
+ return next;
733
+ });
734
+ };
735
+ const resetFilters = () => {
736
+ setEnabledKinds(null);
737
+ setQuery('');
738
+ };
739
+ // P4.39 — derive 4-state tone (loading / ok / warn / down) per kind at panel
740
+ // scope so both the mini-dashboard (P4.38 ba-mini-dashboard) and the kind
741
+ // filter chip row (`.ba-chip`) can read from one source of truth. Same logic
742
+ // the IIFE already uses for the mini-dashboard: extension gets re-derived off
743
+ // mounted-vs-registered (panel-scope pageSurfaces.tone stays 'loading' by
744
+ // design); the other five mirror their snapshot.tone directly. Players see
745
+ // the chip dot + the dashboard LED light up in the same 10s tick.
746
+ const kindTones = (() => {
747
+ const pageRegistered = allGroups.find((g) => g.kind === 'extension')?.items.length ?? 0;
748
+ const pageTone = pageSurfaces.tone === 'down'
749
+ ? 'down'
750
+ : pageRegistered === 0
751
+ ? 'down'
752
+ : pageSurfaces.mounted >= 1
753
+ ? 'ok'
754
+ : 'warn';
755
+ return {
756
+ extension: pageTone,
757
+ agent: agentSnap.tone,
758
+ 'cli-provider': cliProv.tone,
759
+ 'model-binding': mbSnap.tone,
760
+ skill: skillSnap.tone,
761
+ tool: toolSnap.tone,
762
+ };
763
+ })();
764
+ return (_jsxs("div", { className: "bus-admin", "data-presentation": "full", children: [_jsxs("div", { className: "ba-head", children: [_jsxs("div", { className: "ba-title", children: [_jsx("span", { className: "ba-title-text", children: t('bus.title') }), _jsx("span", { className: "ba-title-meta", children: loading
765
+ ? t('common.loading')
766
+ : filtered
767
+ ? `${visibleCount} / ${items.length} plugin · ${groups.length} kind`
768
+ : `${items.length} plugin · ${allGroups.length} kind` })] }), _jsxs("button", { className: "ba-refresh", onClick: () => setRefreshTs(Date.now()), title: t('bus.refreshTitle'), children: ["\u21BB ", t('bus.refresh')] })] }), !loading && items.length > 0 && (() => {
769
+ // P4.38 — mini-dashboard row. Builds one descriptor per kind reading
770
+ // the 6 snapshots already populated at panel scope. Order matches
771
+ // KIND_ORDER (extension → agent → cli-provider → model-binding →
772
+ // skill → tool) so it lines up with the section sequence below.
773
+ // Page tone reclass — panel-level pageSurfaces.tone stays 'loading'
774
+ // by design (KindSection re-derives against live group total), so the
775
+ // mini-dashboard recomputes here off mounted vs registered counts:
776
+ // fetch failed → down · registered=0 → down · mounted≥1 → ok ·
777
+ // registered≥1 but mounted=0 → warn (lazy-load state, no tab opened
778
+ // yet). Brief first-paint flash shows warn (mounted=0) before the
779
+ // first poll completes — acceptable, since the section LED has the
780
+ // same property.
781
+ const pageRegistered = allGroups.find((g) => g.kind === 'extension')?.items.length ?? 0;
782
+ const pageTone = pageSurfaces.tone === 'down'
783
+ ? 'down'
784
+ : pageRegistered === 0
785
+ ? 'down'
786
+ : pageSurfaces.mounted >= 1
787
+ ? 'ok'
788
+ : 'warn';
789
+ const pageCount = `${pageSurfaces.mounted}/${Math.max(pageSurfaces.mounted, pageRegistered)}`;
790
+ const pageTitle = pageTone === 'down' && pageSurfaces.tone === 'down'
791
+ ? 'Page — fetch failed (/api/bus/ui/surfaces)'
792
+ : `Page — ${pageSurfaces.mounted}/${Math.max(pageSurfaces.mounted, pageRegistered)} panels mounted · ${pageRegistered} registered · ${t('bus.mdFocusKind', { kind: 'extension' })}`;
793
+ const agentCount = agentSnap.tone === 'loading'
794
+ ? '…'
795
+ : `${agentSnap.registered}`;
796
+ const agentTitle = agentSnap.tone === 'loading'
797
+ ? 'Agent — checking /api/extensions/list?kind=agent …'
798
+ : `Agent — ${agentSnap.registered} plugin${agentSnap.registered === 1 ? '' : 's'} registered · ${t('bus.mdFocusKind', { kind: 'agent' })}`;
799
+ const provCount = cliProv.tone === 'loading' ? '…/…' : `${cliProv.ok}/${cliProv.total}`;
800
+ const provTitle = cliProv.tone === 'loading'
801
+ ? 'CLI Providers — checking /api/cli-providers …'
802
+ : `CLI Providers — ${cliProv.ok}/${cliProv.total} healthy · ${t('bus.mdFocusKind', { kind: 'cli-provider' })}`;
803
+ const mbCount = mbSnap.tone === 'loading' ? '…/…' : `${mbSnap.live}/${mbSnap.registered}`;
804
+ const mbTitle = mbSnap.tone === 'loading'
805
+ ? 'Model Binding — checking …'
806
+ : `Model Binding — ${mbSnap.live}/${mbSnap.registered} live · ${t('bus.mdFocusKind', { kind: 'model-binding' })}`;
807
+ const skillCount = skillSnap.tone === 'loading' ? '…/…' : `${skillSnap.ready}/${skillSnap.registered}`;
808
+ const skillTitle = skillSnap.tone === 'loading'
809
+ ? 'Skill — checking …'
810
+ : `Skill — ${skillSnap.ready}/${skillSnap.registered} ready · ${skillSnap.experimental} experimental · ${t('bus.mdFocusKind', { kind: 'skill' })}`;
811
+ const toolCount = toolSnap.tone === 'loading' ? '…/…' : `${toolSnap.ready}/${toolSnap.registered}`;
812
+ const toolTitle = toolSnap.tone === 'loading'
813
+ ? 'Tool — checking …'
814
+ : `Tool — ${toolSnap.ready}/${toolSnap.registered} ready · ${toolSnap.experimental} experimental · ${t('bus.mdFocusKind', { kind: 'tool' })}`;
815
+ const leds = [
816
+ { kind: 'extension', label: 'PAGE', tone: pageTone, count: pageCount, title: pageTitle, aria: `Page ${pageSurfaces.mounted} of ${Math.max(pageSurfaces.mounted, pageRegistered)} panels mounted` },
817
+ { kind: 'agent', label: 'AGENT', tone: agentSnap.tone, count: agentCount, title: agentTitle, aria: `Agent ${agentSnap.registered} plugins registered` },
818
+ { kind: 'cli-provider', label: 'PROV', tone: cliProv.tone, count: provCount, title: provTitle, aria: `CLI Providers ${cliProv.ok} of ${cliProv.total} healthy` },
819
+ { kind: 'model-binding', label: 'MB', tone: mbSnap.tone, count: mbCount, title: mbTitle, aria: `Model Binding ${mbSnap.live} of ${mbSnap.registered} live` },
820
+ { kind: 'skill', label: 'SKILL', tone: skillSnap.tone, count: skillCount, title: skillTitle, aria: `Skill ${skillSnap.ready} of ${skillSnap.registered} ready` },
821
+ { kind: 'tool', label: 'TOOL', tone: toolSnap.tone, count: toolCount, title: toolTitle, aria: `Tool ${toolSnap.ready} of ${toolSnap.registered} ready` },
822
+ ];
823
+ return (_jsxs("div", { className: "ba-mini-dashboard", role: "toolbar", "aria-label": "Bus kind health overview", children: [_jsx("span", { className: "ba-md-label", "aria-hidden": true, children: t('bus.healthOverview') }), leds.map((led) => {
824
+ const soloed = enabledKinds !== null && enabledKinds.size === 1 && enabledKinds.has(led.kind);
825
+ return (_jsxs("button", { type: "button", className: `ba-md-led ba-md-k-${led.kind} is-${led.tone}${soloed ? ' is-soloed' : ''}`, title: led.title, "aria-label": led.aria, "aria-pressed": soloed, onClick: () => {
826
+ emitDeepLink('sidebar:flash-kind', led.kind);
827
+ setEnabledKinds((prev) => prev !== null && prev.size === 1 && prev.has(led.kind)
828
+ ? null
829
+ : new Set([led.kind]));
830
+ }, children: [_jsx("span", { className: "ba-md-dot", "aria-hidden": true }), _jsx("span", { className: "ba-md-kind", children: led.label }), _jsx("span", { className: "ba-md-count", children: led.count })] }, led.kind));
831
+ }), (() => {
832
+ // P4.40 — aggregate health summary pill at the tail of the
833
+ // mini-dashboard. Counts the four tone buckets across the 6
834
+ // kinds (loading / ok / warn / down) and renders `N ✓ · M ⚠ · K ✗`
835
+ // with same color grammar as the LEDs. Outer ring color reflects
836
+ // worst-state: any down → red, else any warn → amber, else any
837
+ // loading → dim, else lime. Click → resetFilters() (clear kind
838
+ // solo + clear query) so the pill doubles as a one-tap "show
839
+ // everything" escape hatch when players have soloed a kind. When
840
+ // all 6 are loading, hides ✓/⚠/✗ counts and shows `…` instead.
841
+ //
842
+ // P4.42 — prepend a `.ba-md-sum-total` cell `Σ{items.length}`
843
+ // before the tone cells. Reads the total registered plugin
844
+ // count straight off `items` (already in scope, same number the
845
+ // panel header `Plugins {items.length}` reads), then a vertical
846
+ // separator `.ba-md-sum-vsep` cleanly splits the «total» band
847
+ // from the «tone bucket» band. Player gets a single hop
848
+ // «Σ20 · 2·4·0 · ↺» summary in the bus dashboard head: 20
849
+ // plugins total, split across 2 ok / 4 warn / 0 down kinds, ↺
850
+ // to reset filters. The Σ cell uses neutral 0.72 white (same
851
+ // as base pill foreground) so it doesn't compete with the
852
+ // colored tone cells visually — it's a quiet «context tag»,
853
+ // not a 4th tone bucket.
854
+ let okN = 0, warnN = 0, downN = 0, loadingN = 0;
855
+ for (const led of leds) {
856
+ if (led.tone === 'ok')
857
+ okN++;
858
+ else if (led.tone === 'warn')
859
+ warnN++;
860
+ else if (led.tone === 'down')
861
+ downN++;
862
+ else
863
+ loadingN++;
864
+ }
865
+ const worst = downN > 0 ? 'down' : warnN > 0 ? 'warn' : loadingN === leds.length ? 'loading' : 'ok';
866
+ const hasSolo = enabledKinds !== null && enabledKinds.size < leds.length;
867
+ const totalExtensions = items.length;
868
+ const ariaLbl = loadingN === leds.length
869
+ ? `Bus kind health — loading · ${totalExtensions} plugins total`
870
+ : `Bus kind health — ${totalExtensions} plugins total · ${okN} ok, ${warnN} warn, ${downN} down of ${leds.length} kinds`;
871
+ const titleStr = loadingN === leds.length
872
+ ? `Σ ${totalExtensions} plugin · ${t('bus.mdSummaryLoading')}`
873
+ : `Σ ${totalExtensions} plugin ${t('bus.registered')} · ${okN}/${leds.length} kind ok · ${warnN} warn · ${downN} down · ${t('bus.mdClearFilter')}`;
874
+ return (_jsxs("button", { type: "button", className: `ba-md-summary is-${worst}${hasSolo ? ' has-solo' : ''}`, title: titleStr, "aria-label": ariaLbl, onClick: () => resetFilters(), children: [_jsxs("span", { className: "ba-md-sum-cell ba-md-sum-total", "aria-hidden": true, children: [_jsx("span", { className: "ba-md-sum-sigma", children: "\u03A3" }), totalExtensions] }), _jsx("span", { className: "ba-md-sum-vsep", "aria-hidden": true }), loadingN === leds.length ? (_jsx("span", { className: "ba-md-sum-loading", children: "\u2026" })) : (_jsxs(_Fragment, { children: [_jsxs("span", { className: "ba-md-sum-cell ba-md-sum-ok", "aria-hidden": true, children: [_jsx("span", { className: "ba-md-sum-dot" }), okN] }), _jsx("span", { className: "ba-md-sum-sep", "aria-hidden": true, children: "\u00B7" }), _jsxs("span", { className: "ba-md-sum-cell ba-md-sum-warn", "aria-hidden": true, children: [_jsx("span", { className: "ba-md-sum-dot" }), warnN] }), _jsx("span", { className: "ba-md-sum-sep", "aria-hidden": true, children: "\u00B7" }), _jsxs("span", { className: "ba-md-sum-cell ba-md-sum-down", "aria-hidden": true, children: [_jsx("span", { className: "ba-md-sum-dot" }), downN] })] })), _jsx("span", { className: "ba-md-sum-arrow", "aria-hidden": true, children: hasSolo ? '⤺' : '↺' })] }));
875
+ })()] }));
876
+ })(), uiSurfaces && uiSurfaces.length > 0 && (_jsxs("div", { className: "ba-ui-surfaces", "aria-label": "UI surfaces registered with bus.ui", children: [_jsxs("div", { className: "ba-uis-head", children: [_jsx("span", { className: "ba-uis-dot", "aria-hidden": true }), _jsx("span", { className: "ba-uis-label", children: "UI Surfaces" }), _jsx("span", { className: "ba-uis-count", title: "surfaces currently registered with bus.ui", children: uiSurfaces.length }), _jsxs("span", { className: "ba-uis-sub", children: ["registered \u00B7", ' ', uiSurfaces.reduce((n, s) => n + (s.exposedToAI ? s.actions.filter((a) => a.exposedToAI !== false).length : 0), 0), ' ', "actions exposed to AI \u00B7 ", _jsx("code", { children: "/api/bus/ui/surfaces" })] })] }), _jsx("div", { className: "ba-uis-row", children: uiSurfaces.map((s) => {
877
+ const aiActions = s.exposedToAI
878
+ ? s.actions.filter((a) => a.exposedToAI !== false).length
879
+ : 0;
880
+ const totalActions = s.actions.length;
881
+ return (_jsxs("div", { className: `ba-uis-chip layer-${s.layer}${s.exposedToAI ? '' : ' is-dim'}`, title: `${s.layer} surface · ${totalActions} action${totalActions === 1 ? '' : 's'} · ${aiActions} exposed to AI${s.extensionId ? ` · plugin: ${s.extensionId}` : ''}`, children: [_jsx("span", { className: "ba-uis-layer", children: s.layer }), _jsx("span", { className: "ba-uis-id", children: s.id }), _jsxs("span", { className: "ba-uis-actions", children: [_jsx("span", { className: "ba-uis-ai", children: aiActions }), _jsx("span", { className: "ba-uis-sep", children: "/" }), _jsx("span", { className: "ba-uis-total", children: totalActions }), _jsx("span", { className: "ba-uis-actions-lbl", children: "actions" })] })] }, s.id));
882
+ }) })] })), _jsx(CapabilityOverview, { refreshKey: refreshTs }), !loading && items.length > 0 && (_jsxs("div", { className: "ba-filterbar", children: [_jsxs("div", { className: "ba-chips", role: "tablist", "aria-orientation": "horizontal", "aria-label": t('bus.filterByKind'), children: [_jsx("span", { className: "ba-kbd", "aria-hidden": "true", title: t('bus.kbdNavChips'), children: "\u2190\u2192" }), kindStats.map((k, i) => {
883
+ const active = enabledKinds === null || enabledKinds.has(k.kind);
884
+ return (_jsxs("button", { ref: (el) => {
885
+ chipRefs.current[i] = el;
886
+ }, type: "button", role: "tab", "aria-selected": active, tabIndex: i === chipFocusIdx ? 0 : -1, className: `ba-chip k-${k.kind} ${active ? 'is-on' : 'is-off'}`, onClick: () => {
887
+ setChipFocusIdx(i);
888
+ toggleKind(k.kind);
889
+ }, onKeyDown: (e) => {
890
+ const n = kindStats.length;
891
+ if (n === 0)
892
+ return;
893
+ let next = i;
894
+ if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
895
+ next = (i + 1) % n;
896
+ }
897
+ else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
898
+ next = (i - 1 + n) % n;
899
+ }
900
+ else if (e.key === 'Home') {
901
+ next = 0;
902
+ }
903
+ else if (e.key === 'End') {
904
+ next = n - 1;
905
+ }
906
+ else {
907
+ return;
908
+ }
909
+ e.preventDefault();
910
+ setChipFocusIdx(next);
911
+ requestAnimationFrame(() => {
912
+ chipRefs.current[next]?.focus();
913
+ });
914
+ }, title: (enabledKinds === null
915
+ ? t('bus.chipSolo', { kind: k.kind, count: k.count })
916
+ : active
917
+ ? t('bus.chipHide', { kind: k.kind })
918
+ : t('bus.chipShow', { kind: k.kind })) +
919
+ ' · ' +
920
+ t('bus.chipToggleHint'), children: [_jsx("span", { className: `ba-chip-dot is-${kindTones[k.kind] ?? 'loading'}`, "aria-hidden": "true" }), _jsx("span", { className: "ba-chip-name", children: k.kind }), _jsx("span", { className: "ba-chip-count", children: k.count })] }, k.kind));
921
+ })] }), _jsx("input", { type: "text", className: "ba-search", placeholder: t('bus.searchPlaceholder'), value: query, onChange: (e) => setQuery(e.target.value), spellCheck: false }), filtered && (_jsxs("button", { type: "button", className: "ba-reset", onClick: resetFilters, title: t('bus.resetTitle'), children: ["\u2715 ", t('bus.reset')] }))] })), err && (_jsx("div", { className: "ba-error", children: t('bus.requestFailed', { err }) })), !err && !loading && items.length === 0 && (_jsx("div", { className: "ba-empty", children: t('bus.emptyNoExtensions') })), !err && !loading && items.length > 0 && groups.length === 0 && (_jsx("div", { className: "ba-empty", children: t('bus.emptyNoMatch') })), !loading && orderedRowIds.length > 0 && (_jsxs("div", { className: "ba-row-kbd-bar", "aria-hidden": "true", children: [_jsx("span", { className: "ba-kbd", title: t('bus.rowKbdTitle'), children: "\u2191\u2193" }), _jsx("span", { className: "ba-row-kbd-label", children: t('bus.rowKbdLabel', { n: orderedRowIds.length }) })] })), !loading && items.length > 0 && (_jsxs("div", { className: "ba-glyph-legend", "data-legend": "kind-alphabet", style: {
922
+ display: 'flex',
923
+ alignItems: 'center',
924
+ gap: 12,
925
+ padding: '4px 12px 8px',
926
+ fontSize: 10,
927
+ fontFamily: 'var(--mono, var(--font-mono))',
928
+ color: 'rgba(220,228,235,0.55)',
929
+ letterSpacing: 0.4,
930
+ flexWrap: 'wrap',
931
+ }, children: [_jsx("span", { style: {
932
+ color: 'rgba(255,255,255,0.30)',
933
+ fontSize: 9,
934
+ textTransform: 'uppercase',
935
+ letterSpacing: 0.7,
936
+ fontWeight: 600,
937
+ }, children: "kind glyph alphabet" }), [
938
+ { g: '▦', c: 'rgba(212,255,72,0.95)', n: 'extension' },
939
+ { g: '◆', c: 'rgba(196,163,255,0.95)', n: 'agent' },
940
+ { g: '⌘', c: 'rgba(125,211,252,0.95)', n: 'cli-provider' },
941
+ { g: '◈', c: 'rgba(123,231,196,0.95)', n: 'model-binding' },
942
+ { g: '★', c: 'rgba(255,200,120,0.95)', n: 'skill' },
943
+ { g: '✦', c: 'rgba(255,140,66,0.95)', n: 'tool' },
944
+ ].map((e) => (_jsxs("span", { "data-kind": e.n, style: { display: 'inline-flex', alignItems: 'baseline', gap: 4 }, title: `${e.g} = ${e.n}`, children: [_jsx("span", { "aria-hidden": true, style: { color: e.c, fontWeight: 700, fontSize: 13, lineHeight: 1 }, children: e.g }), _jsx("span", { style: { color: 'rgba(220,228,235,0.78)' }, children: e.n })] }, e.n)))] })), _jsx("div", { className: "ba-groups", children: groups.map((g) => (_jsx(KindSection, { group: g, expandedIds: expandedIds, onToggle: toggleExpand, rowRefs: rowRefs, onFlashKind: (k) => emitDeepLink('sidebar:flash-kind', k), onSoloKind: (k) => setEnabledKinds(new Set([k])), focusedRowId: focusedRowId, onSetFocusedRowId: setFocusedRowId, onMoveRowFocus: moveRowFocus, cliProv: cliProv, pageSurfaces: pageSurfaces, agentSnap: agentSnap, mbSnap: mbSnap, skillSnap: skillSnap, toolSnap: toolSnap }, g.kind))) }), _jsxs("div", { className: "ba-footnote", children: [t('bus.footnoteSource'), _jsx("code", { children: "GET /api/extensions/list" }), " \u00B7 slim shape \u00B7 provides.", '{', "extension / modelBinding / skills / tools / events / cliProvider", '}', " ", t('bus.footnoteExpanded'), " \u00B7 ", t('bus.footnoteBroken'), " \u00B7", ' ', t('bus.footnoteRowHint')] })] }));
945
+ }
946
+ function KindSection({ group, expandedIds, onToggle, rowRefs, onFlashKind, onSoloKind, focusedRowId, onSetFocusedRowId, onMoveRowFocus, cliProv, pageSurfaces, agentSnap, mbSnap, skillSnap, toolSnap, }) {
947
+ const { t } = useTranslation();
948
+ const showProvLed = group.kind === 'cli-provider';
949
+ const provTitle = showProvLed
950
+ ? cliProv.tone === 'loading'
951
+ ? 'CLI Providers — checking /api/cli-providers …'
952
+ : cliProv.total === 0
953
+ ? 'CLI Providers — none registered'
954
+ : [
955
+ `CLI Providers — ${cliProv.ok}/${cliProv.total} ok`,
956
+ ...cliProv.rows.map((p) => `${p.health?.ok ? '✓' : '✗'} ${p.id}${p.health?.detail ? ' — ' + p.health.detail : ''}`),
957
+ ].join('\n')
958
+ : undefined;
959
+ const provDisplay = showProvLed
960
+ ? cliProv.tone === 'loading'
961
+ ? '…/…'
962
+ : `${cliProv.ok}/${cliProv.total} ok`
963
+ : '';
964
+ // P4.33 — extension section LED. Mirrors the cli-provider LED above but
965
+ // joins the polled /api/bus/ui/surfaces mountedPageIds set against the live
966
+ // extension plugin list (`group.items`). The total `M` is always derived
967
+ // from `group.items.length` so the LED count tracks live bus registry, not
968
+ // the snapshot taken at fetch time. Tone: ok (lime) when ≥1 wb panel is
969
+ // mounted, warn (amber) when 0 mounted with ≥1 registered, down (red)
970
+ // when the fetch failed (state.tone === 'down'), loading otherwise.
971
+ const showPageLed = group.items.some((item) => (item.contributes?.pages?.length ?? 0) > 0);
972
+ const pageTotal = showPageLed ? group.items.length : 0;
973
+ const pageMounted = showPageLed
974
+ ? group.items.reduce((n, p) => {
975
+ const pageId = p.contributes?.pages?.[0]?.id;
976
+ return pageId && pageSurfaces.mountedPageIds.has(pageId) ? n + 1 : n;
977
+ }, 0)
978
+ : 0;
979
+ const pageTone = !showPageLed
980
+ ? 'loading'
981
+ : pageSurfaces.tone === 'down'
982
+ ? 'down'
983
+ : pageSurfaces.tone === 'loading' && pageSurfaces.mountedPageIds.size === 0
984
+ ? 'loading'
985
+ : pageMounted >= 1
986
+ ? 'ok'
987
+ : pageTotal > 0
988
+ ? 'warn'
989
+ : 'loading';
990
+ const pageTitle = showPageLed
991
+ ? pageTone === 'loading'
992
+ ? 'Page — checking /api/bus/ui/surfaces …'
993
+ : pageTone === 'down'
994
+ ? 'Page — /api/bus/ui/surfaces fetch failed'
995
+ : [
996
+ `Page — ${pageMounted}/${pageTotal} panel surfaces mounted`,
997
+ ...group.items.map((p) => {
998
+ const pageId = p.contributes?.pages?.[0]?.id ?? '?';
999
+ const live = pageSurfaces.mountedPageIds.has(pageId);
1000
+ return `${live ? '✓' : '·'} ${pageId} (${p.id})`;
1001
+ }),
1002
+ ].join('\n')
1003
+ : undefined;
1004
+ const pageDisplay = showPageLed
1005
+ ? pageTone === 'loading'
1006
+ ? '…/…'
1007
+ : `${pageMounted}/${pageTotal} mounted`
1008
+ : '';
1009
+ // P4.34 — agent section LED. After daemon retirement (R3), driven only by
1010
+ // listExtensions('agent') every 10s. Tone is `agentSnap.tone` (ok-violet
1011
+ // when ≥1 plugin registered, down-red on 0 or fetch failure).
1012
+ const showAgentLed = group.kind === 'agent';
1013
+ const agentTitle = showAgentLed
1014
+ ? agentSnap.tone === 'loading'
1015
+ ? 'Agent — checking /api/extensions/list?kind=agent …'
1016
+ : agentSnap.tone === 'down' && agentSnap.registered === 0
1017
+ ? 'Agent — bus fetch failed or no agent plugins registered'
1018
+ : [
1019
+ `Agent — ${agentSnap.registered} plugin${agentSnap.registered === 1 ? '' : 's'} registered`,
1020
+ ...agentSnap.agentIds.map((id) => `✓ ${id}`),
1021
+ ].join('\n')
1022
+ : undefined;
1023
+ const agentDisplay = showAgentLed
1024
+ ? agentSnap.tone === 'loading'
1025
+ ? '…'
1026
+ : `${agentSnap.registered} reg`
1027
+ : '';
1028
+ // P4.35 — model-binding section LED. Driven by parent BusAdminPanel polling
1029
+ // listExtensions('model-binding') + dashApi.providers() in lockstep. Tone /
1030
+ // counts read directly from mbSnap (computed at fetch time via the
1031
+ // vendor→provider map join). Tooltip lists each binding's vendor/channel +
1032
+ // mapped provider + health detail so the player can see *why* a binding is
1033
+ // warn (e.g. "anthropic→claude-code: cli not installed").
1034
+ const showMbLed = group.kind === 'model-binding';
1035
+ const mbTitle = showMbLed
1036
+ ? mbSnap.tone === 'loading'
1037
+ ? 'Model Binding — checking /api/extensions/list?kind=model-binding + /api/cli-providers …'
1038
+ : mbSnap.tone === 'down' && mbSnap.registered === 0
1039
+ ? 'Model Binding — none registered (or bus/cli-providers fetch failed)'
1040
+ : [
1041
+ `Model Binding — ${mbSnap.registered} registered · ${mbSnap.live}/${mbSnap.registered} live`,
1042
+ ...mbSnap.bindings.map((b) => {
1043
+ const mark = b.healthy ? '✓' : b.providerId ? '·' : '?';
1044
+ const route = b.providerId
1045
+ ? `${b.vendor}→${b.providerId}`
1046
+ : `${b.vendor}→(unmapped)`;
1047
+ const tail = b.healthy
1048
+ ? ' [live]'
1049
+ : b.providerId
1050
+ ? ` [down${b.detail ? ' — ' + b.detail : ''}]`
1051
+ : ' [no provider mapping]';
1052
+ return `${mark} ${b.id} (${route}/${b.channel || '?'})${tail}`;
1053
+ }),
1054
+ ].join('\n')
1055
+ : undefined;
1056
+ const mbDisplay = showMbLed
1057
+ ? mbSnap.tone === 'loading'
1058
+ ? '…/…'
1059
+ : `${mbSnap.live}/${mbSnap.registered} live`
1060
+ : '';
1061
+ // P4.36 — skill section LED. Single-channel poll (listExtensions('skill'))
1062
+ // exposed via parent BusAdminPanel as skillSnap. Tooltip lists each skill
1063
+ // plugin's id + its registered trigger(s) + a [stable]/[experimental]/
1064
+ // [no triggers] tail so the player can see *why* a tone is warn (today
1065
+ // typically "1 experimental" because the lone skill plugin is the
1066
+ // make-game-design placeholder marked experimental:true) without
1067
+ // expanding the row.
1068
+ const showSkillLed = group.kind === 'skill';
1069
+ const skillTitle = showSkillLed
1070
+ ? skillSnap.tone === 'loading'
1071
+ ? 'Skill — checking /api/extensions/list?kind=skill …'
1072
+ : skillSnap.tone === 'down' && skillSnap.registered === 0
1073
+ ? 'Skill — none registered (or bus fetch failed)'
1074
+ : [
1075
+ `Skill — ${skillSnap.registered} registered · ${skillSnap.ready}/${skillSnap.registered} ready · ${skillSnap.experimental} experimental`,
1076
+ ...skillSnap.skills.map((s) => {
1077
+ const mark = !s.ready ? '✗' : s.experimental ? '⚠' : '✓';
1078
+ const trig = s.triggers.length > 0 ? s.triggers.join(' ') : '(no triggers)';
1079
+ const tail = !s.ready
1080
+ ? ' [no triggers]'
1081
+ : s.experimental
1082
+ ? ' [experimental]'
1083
+ : ' [stable]';
1084
+ return `${mark} ${s.id} (${trig})${tail}`;
1085
+ }),
1086
+ ].join('\n')
1087
+ : undefined;
1088
+ const skillDisplay = showSkillLed
1089
+ ? skillSnap.tone === 'loading'
1090
+ ? '…/…'
1091
+ : `${skillSnap.ready}/${skillSnap.registered} ready`
1092
+ : '';
1093
+ // P4.37 — tool section LED. Single-channel poll exposed via parent
1094
+ // BusAdminPanel as toolSnap. Tooltip lists each tool plugin's id, its
1095
+ // registered tool ids (e.g. `balance:resim`), event names emitted, and a
1096
+ // [stable]/[experimental]/[no tools] tail so the player can see *why* the
1097
+ // tone is warn (today typically "1 experimental" because the lone tool
1098
+ // plugin tool-balance-resim is the placeholder marked experimental:true)
1099
+ // without expanding the row. Closes the BusAdminPanel section-LED grid
1100
+ // at 6/6.
1101
+ const showToolLed = group.kind === 'tool';
1102
+ const toolTitle = showToolLed
1103
+ ? toolSnap.tone === 'loading'
1104
+ ? 'Tool — checking /api/extensions/list?kind=tool …'
1105
+ : toolSnap.tone === 'down' && toolSnap.registered === 0
1106
+ ? 'Tool — none registered (or bus fetch failed)'
1107
+ : [
1108
+ `Tool — ${toolSnap.registered} registered · ${toolSnap.ready}/${toolSnap.registered} ready · ${toolSnap.exposedAi} AI-exposed · ${toolSnap.experimental} experimental`,
1109
+ ...toolSnap.tools.map((t) => {
1110
+ const mark = !t.ready ? '✗' : t.experimental ? '⚠' : '✓';
1111
+ const ids = t.toolIds.length > 0 ? t.toolIds.join(' ') : '(no tools)';
1112
+ const evtTail = t.eventNames.length > 0 ? ` · emits: ${t.eventNames.join(' ')}` : '';
1113
+ const tail = !t.ready
1114
+ ? ' [no tools]'
1115
+ : t.experimental
1116
+ ? ' [experimental]'
1117
+ : ' [stable]';
1118
+ return `${mark} ${t.id} (${ids})${evtTail}${tail}`;
1119
+ }),
1120
+ ].join('\n')
1121
+ : undefined;
1122
+ const toolDisplay = showToolLed
1123
+ ? toolSnap.tone === 'loading'
1124
+ ? '…/…'
1125
+ : `${toolSnap.ready}/${toolSnap.registered} ready`
1126
+ : '';
1127
+ return (_jsxs("section", { className: "ba-kind", children: [_jsxs("header", { className: "ba-kind-head", children: [_jsx("button", { type: "button", className: `ba-kind-tag k-${group.kind} is-link`, onClick: () => onFlashKind(group.kind), title: t('bus.kindTagFlashTitle', { kind: group.kind }), children: group.kind }), _jsx("span", { className: "ba-kind-count", children: group.items.length }), showProvLed && (_jsxs("span", { className: `ba-kind-prov-led is-${cliProv.tone}`, title: provTitle, "aria-label": `CLI Providers ${cliProv.ok} of ${cliProv.total} ok`, children: [_jsx("span", { className: "ba-kind-prov-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-prov-count", children: provDisplay })] })), showPageLed && (_jsxs("span", { className: `ba-kind-page-led is-${pageTone}`, title: pageTitle, "aria-label": `Page panels ${pageMounted} of ${pageTotal} mounted`, children: [_jsx("span", { className: "ba-kind-page-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-page-count", children: pageDisplay })] })), showAgentLed && (_jsxs("span", { className: `ba-kind-agent-led is-${agentSnap.tone}`, title: agentTitle, "aria-label": `Agent — ${agentSnap.registered} plugin${agentSnap.registered === 1 ? '' : 's'} registered`, children: [_jsx("span", { className: "ba-kind-agent-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-agent-count", children: agentDisplay })] })), showMbLed && (_jsxs("span", { className: `ba-kind-mb-led is-${mbSnap.tone}`, title: mbTitle, "aria-label": `Model Binding — ${mbSnap.live} of ${mbSnap.registered} bindings live`, children: [_jsx("span", { className: "ba-kind-mb-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-mb-count", children: mbDisplay })] })), showSkillLed && (_jsxs("span", { className: `ba-kind-skill-led is-${skillSnap.tone}`, title: skillTitle, "aria-label": `Skill — ${skillSnap.ready} of ${skillSnap.registered} ready, ${skillSnap.experimental} experimental`, children: [_jsx("span", { className: "ba-kind-skill-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-skill-count", children: skillDisplay })] })), showToolLed && (_jsxs("span", { className: `ba-kind-tool-led is-${toolSnap.tone}`, title: toolTitle, "aria-label": `Tool — ${toolSnap.ready} of ${toolSnap.registered} ready, ${toolSnap.exposedAi} AI-exposed, ${toolSnap.experimental} experimental`, children: [_jsx("span", { className: "ba-kind-tool-dot", "aria-hidden": true }), _jsx("span", { className: "ba-kind-tool-count", children: toolDisplay })] })), _jsx("span", { className: "ba-kind-desc", children: kindDescription(group.kind, t) })] }), group.kind === 'cli-provider' && _jsx(CliCapabilityMatrix, { items: group.items }), _jsxs("table", { className: "ba-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "c-chev", "aria-label": t('bus.expand') }), _jsx("th", { className: "c-id", children: "id" }), _jsx("th", { className: "c-name", children: "displayName.zh" }), _jsxs("th", { className: "c-ver", children: ["version", _jsxs("span", { className: "ba-th-sub", title: t('bus.versionThSub'), "aria-hidden": true, children: ["0.0.x \u00B7 placeholder \u2194 0.1+ \u00B7 ", _jsx("em", { children: "bumped" })] })] }), _jsx("th", { className: "c-page", children: "extension" }), _jsx("th", { className: "c-flags", children: "flags" })] }) }), _jsx("tbody", { children: group.items.map((p) => (_jsx(ExtensionRow, { p: p, expanded: expandedIds.has(p.id), onToggle: onToggle, rowRefs: rowRefs, focused: focusedRowId === p.id, onSetFocusedRowId: onSetFocusedRowId, onMoveRowFocus: onMoveRowFocus, onSoloKind: onSoloKind }, p.id))) })] })] }));
1128
+ }
1129
+ function ExtensionRow({ p, expanded, onToggle, rowRefs, focused, onSetFocusedRowId, onMoveRowFocus, onSoloKind, }) {
1130
+ const { t } = useTranslation();
1131
+ // Agent 行用统一命名「中文职能·英文名」;其它插件仍用 displayName。
1132
+ const nameZh = p.naming?.title || pickLang(p.displayName, 'zh', p.id);
1133
+ const descZh = pickLang(p.description, 'zh', '');
1134
+ const descEn = pickLang(p.description, 'en', '');
1135
+ const page = p.contributes?.pages?.[0];
1136
+ // P4.63 — lift the P4.62 cell-level verBumped derivation to row scope so the
1137
+ // bumped purple language can be expressed at row depth too (whole-row tint +
1138
+ // left frame edge), giving Page tile-frame parity inside Bus admin.
1139
+ const ver = p.version ?? '0.0.0';
1140
+ const verBumped = !/^0\.0\./.test(ver);
1141
+ const handleClick = () => {
1142
+ // P3.58 — mouse click syncs the keyboard focus head so Tab-back into the
1143
+ // table later lands on the row the player last interacted with.
1144
+ onSetFocusedRowId(p.id);
1145
+ onToggle(p.id);
1146
+ };
1147
+ const rowClass = [
1148
+ p.experimental ? 'is-experimental' : '',
1149
+ expanded ? 'is-expanded' : '',
1150
+ verBumped ? 'is-bumped' : '',
1151
+ 'is-clickable',
1152
+ ]
1153
+ .filter(Boolean)
1154
+ .join(' ');
1155
+ const setRowRef = (el) => {
1156
+ if (el)
1157
+ rowRefs.current.set(p.id, el);
1158
+ else
1159
+ rowRefs.current.delete(p.id);
1160
+ };
1161
+ return (_jsxs(_Fragment, { children: [_jsxs("tr", { ref: setRowRef, className: rowClass, onClick: handleClick, role: "button", "aria-expanded": expanded, tabIndex: focused ? 0 : -1, onKeyDown: (e) => {
1162
+ if (e.key === 'ArrowUp' ||
1163
+ e.key === 'ArrowDown' ||
1164
+ e.key === 'ArrowLeft' ||
1165
+ e.key === 'ArrowRight' ||
1166
+ e.key === 'Home' ||
1167
+ e.key === 'End') {
1168
+ e.preventDefault();
1169
+ onMoveRowFocus(p.id, e.key);
1170
+ }
1171
+ else if (e.key === 'Enter' || e.key === ' ') {
1172
+ e.preventDefault();
1173
+ onToggle(p.id);
1174
+ }
1175
+ }, title: expanded ? t('bus.rowTitleCollapse') : t('bus.rowTitleExpand'), children: [_jsx("td", { className: "c-chev", children: _jsx("span", { className: `ba-chev ${expanded ? 'is-open' : ''}`, "aria-hidden": true, children: expanded ? '▾' : '▸' }) }), _jsx("td", { className: "c-id", children: _jsx("code", { children: p.id }) }), _jsxs("td", { className: "c-name", children: [_jsx("div", { className: "ba-name-zh", children: nameZh }), descZh && (_jsx("div", { className: "ba-desc-zh", title: descZh, children: descZh }))] }), _jsx("td", { className: "c-ver", children: verBumped ? (_jsx("span", { className: "ba-ver-pill bumped", title: t('bus.verBumpedTitle', { ver }), "aria-label": `${ver} bumped`, children: ver })) : (_jsx("span", { className: "ba-ver-pill", children: ver })) }), _jsx("td", { className: "c-page", children: page ? (_jsxs("div", { className: "ba-page-info", children: [_jsx("span", { className: "ba-page-icon", children: page.icon ?? '·' }), _jsx("span", { className: "ba-page-id", children: page.id }), _jsx("span", { className: "ba-page-pill", children: page.cardinality })] })) : (_jsx("span", { className: "ba-dim", children: "\u2014" })) }), _jsx("td", { className: "c-flags", children: p.experimental && _jsx("span", { className: "ba-flag-pill exp", children: "experimental" }) })] }), expanded && (_jsx("tr", { className: "ba-detail-row", children: _jsx("td", { colSpan: 6, children: _jsx(ExtensionDetail, { p: p, descZh: descZh, descEn: descEn, onSoloKind: onSoloKind }) }) }))] }));
1176
+ }
1177
+ function ExtensionDetail({ p, descZh, descEn, onSoloKind, }) {
1178
+ const { t } = useTranslation();
1179
+ const page = p.contributes?.pages?.[0];
1180
+ // P3.33 — reverse deep-link wiring. kind=agent rows offer "← 在 Sidebar 高亮"
1181
+ // (sets store.pendingSidebarFocusExtensionId → AgentsPanel scrolls + flashes the
1182
+ // matching card). kind=extension rows offer "← 打开 extension-* tab" (setMode
1183
+ // Page rows open the extension-owned Page through the shell port.
1184
+ // Together with P3.32's forward AgentsPanel pill + P2.7f's extension-tab "在 Bus
1185
+ // 详情查看 →" button, this completes the Sidebar ⇄ Bus admin round-trip.
1186
+ // R5/P2 — reverse deep-links now emit bus intents (their consumers —
1187
+ // AgentsPanel scroll / Sidebar kind-flash — were lost in R4 and are re-added
1188
+ // in P4/P6 in the right app; publishing is harmless while unsubscribed).
1189
+ const onBackToSidebar = () => {
1190
+ emitDeepLink('sidebar:focus-plugin', p.id);
1191
+ // Stay on the bus tab — Sidebar is always visible. Player sees flash in
1192
+ // the Sidebar without losing the BusAdminPanel context they came from.
1193
+ };
1194
+ const onOpenPage = () => {
1195
+ void openExtensionPage(p.id);
1196
+ };
1197
+ const onFlashKindFooter = () => {
1198
+ emitDeepLink('sidebar:flash-kind', p.kind);
1199
+ // Stay on bus tab — Sidebar BUS KINDS footer is always rendered, so the
1200
+ // 1.5s pulse is visible in the player's peripheral vision (left edge).
1201
+ };
1202
+ const hasAgentLink = p.kind === 'agent';
1203
+ const hasPageLink = (p.contributes?.pages?.length ?? 0) > 0;
1204
+ const hasKindLink = !hasAgentLink && !hasPageLink;
1205
+ // Runtime origin descriptor: npm package identity or a browser-safe mutable
1206
+ // origin path. Never synthesize a Marketplace implementation path from id.
1207
+ const manifestHint = extensionManifestSourceLabel(p);
1208
+ const extensionRootHint = manifestHint.replace(/\/forgeax-extension\.json$/, '');
1209
+ // P4.95 — manifest hint pill becomes click-to-copy. Parallel move to P4.94
1210
+ // (entry.frontend lime pill → deep-link button): the cyan manifest path was
1211
+ // information-only for 4 weeks; now one click copies it to the clipboard so
1212
+ // the player can paste it into a terminal / editor without retyping. A
1213
+ // transient "✓ 已复制" hint span fades in for ~1.4s right after click as
1214
+ // tactile confirmation, then fades back to invisible (display:none would
1215
+ // jolt the grid; opacity transition keeps the cell layout stable).
1216
+ const [copiedAt, setCopiedAt] = useState(null);
1217
+ // P4.97 — version cell joins manifest as click-to-copy. Separate state slot
1218
+ // so the manifest copy flash and the version copy flash don't accidentally
1219
+ // sympathy-trigger each other when player clicks both in quick succession;
1220
+ // each cell has its own ✓ 已复制 hint.
1221
+ const [versionCopiedAt, setVersionCopiedAt] = useState(null);
1222
+ const copiedResetTaskRef = useRef(null);
1223
+ const versionCopiedResetTaskRef = useRef(null);
1224
+ useEffect(() => {
1225
+ const copiedTask = createRestartableTimeoutTaskLifecycle({
1226
+ delayMs: 1400,
1227
+ task: () => setCopiedAt(null),
1228
+ });
1229
+ const versionCopiedTask = createRestartableTimeoutTaskLifecycle({
1230
+ delayMs: 1400,
1231
+ task: () => setVersionCopiedAt(null),
1232
+ });
1233
+ copiedResetTaskRef.current = copiedTask;
1234
+ versionCopiedResetTaskRef.current = versionCopiedTask;
1235
+ return () => {
1236
+ copiedResetTaskRef.current = null;
1237
+ versionCopiedResetTaskRef.current = null;
1238
+ copiedTask.dispose();
1239
+ versionCopiedTask.dispose();
1240
+ };
1241
+ }, []);
1242
+ const copyToClipboard = (text, onDone) => {
1243
+ try {
1244
+ if (navigator.clipboard?.writeText) {
1245
+ navigator.clipboard.writeText(text).then(onDone).catch(onDone);
1246
+ }
1247
+ else {
1248
+ const ta = document.createElement('textarea');
1249
+ ta.value = text;
1250
+ ta.style.position = 'fixed';
1251
+ ta.style.opacity = '0';
1252
+ document.body.appendChild(ta);
1253
+ ta.select();
1254
+ try {
1255
+ document.execCommand('copy');
1256
+ }
1257
+ catch { }
1258
+ document.body.removeChild(ta);
1259
+ onDone();
1260
+ }
1261
+ }
1262
+ catch {
1263
+ onDone();
1264
+ }
1265
+ };
1266
+ const onCopyManifest = (e) => {
1267
+ e.stopPropagation();
1268
+ copyToClipboard(manifestHint, () => {
1269
+ setCopiedAt(Date.now());
1270
+ copiedResetTaskRef.current?.schedule();
1271
+ });
1272
+ };
1273
+ const onCopyVersion = (e) => {
1274
+ e.stopPropagation();
1275
+ copyToClipboard(p.version ?? '0.0.0', () => {
1276
+ setVersionCopiedAt(Date.now());
1277
+ versionCopiedResetTaskRef.current?.schedule();
1278
+ });
1279
+ };
1280
+ const copyFlashOn = copiedAt !== null;
1281
+ const versionCopyFlashOn = versionCopiedAt !== null;
1282
+ return (_jsxs("div", { className: "ba-detail", children: [descZh && (_jsxs("div", { className: "ba-detail-block", children: [_jsx("div", { className: "ba-detail-label", children: "description.zh" }), _jsx("div", { className: "ba-detail-body", children: descZh })] })), descEn && (_jsxs("div", { className: "ba-detail-block", children: [_jsx("div", { className: "ba-detail-label", children: "description.en" }), _jsx("div", { className: "ba-detail-body ba-detail-en", children: descEn })] })), _jsxs("div", { className: "ba-detail-grid", children: [_jsxs("div", { className: "ba-detail-cell", children: [_jsxs("div", { className: "ba-detail-label", children: ["manifest", _jsxs("span", { className: `ba-detail-copy-flash${copyFlashOn ? ' on' : ''}`, "aria-live": "polite", children: ["\u2713 ", t('bus.copied')] })] }), _jsx("button", { type: "button", className: `ba-detail-code ba-detail-manifest-link${copyFlashOn ? ' copied' : ''}`, onClick: onCopyManifest, title: copyFlashOn ? t('bus.manifestCopiedTitle') : t('bus.manifestCopyTitle'), children: manifestHint })] }), _jsxs("div", { className: "ba-detail-cell", children: [_jsx("div", { className: "ba-detail-label", children: "kind" }), _jsx("button", { type: "button", className: `ba-kind-tag k-${p.kind} is-link ba-detail-kind-link`, onClick: (e) => {
1283
+ e.stopPropagation();
1284
+ onSoloKind(p.kind);
1285
+ }, title: t('bus.detailKindSoloTitle', { kind: p.kind }), "aria-label": `solo filter kind ${p.kind}`, children: p.kind })] }), _jsxs("div", { className: "ba-detail-cell", children: [_jsxs("div", { className: "ba-detail-label", children: ["version", _jsxs("span", { className: `ba-detail-copy-flash${versionCopyFlashOn ? ' on' : ''}`, "aria-live": "polite", children: ["\u2713 ", t('bus.copied')] })] }), _jsx("button", { type: "button", className: `ba-detail-code ba-detail-version-link${versionCopyFlashOn ? ' copied' : ''}`, onClick: onCopyVersion, title: versionCopyFlashOn ? t('bus.versionCopiedTitle') : t('bus.versionCopyTitle'), children: p.version })] }), p.entry?.frontend && (_jsxs("div", { className: "ba-detail-cell", children: [_jsx("div", { className: "ba-detail-label", title: t('bus.uiFrontendTitle'), children: "ui (frontend)" }), page ? (_jsx("button", { type: "button", className: "ba-detail-code ba-detail-entry ba-detail-entry-link", onClick: (e) => { e.stopPropagation(); onOpenPage(); }, title: t('bus.entryOpenPageTitle', { pageId: page.id, path: `${extensionRootHint}/${p.entry.frontend.replace(/^\.\//, '')}` }), children: p.entry.frontend })) : (_jsx("code", { className: "ba-detail-code ba-detail-entry", title: `${extensionRootHint}/${p.entry.frontend.replace(/^\.\//, '')}`, children: p.entry.frontend }))] })), page && (_jsxs("div", { className: "ba-detail-cell ba-detail-cell-wide", children: [_jsx("div", { className: "ba-detail-label", children: "page contribution" }), _jsxs("div", { className: "ba-page-info", children: [_jsx("span", { className: "ba-page-icon", children: page.icon ?? '·' }), _jsx("code", { className: "ba-detail-code", children: page.id }), _jsx("span", { className: "ba-page-pill", children: page.cardinality })] })] }))] }), _jsx(ProvidesDetail, { p: p }), _jsxs("div", { className: "ba-backlinks", children: [hasAgentLink && (_jsxs("button", { type: "button", className: "ba-backlink ba-backlink-agent", onClick: onBackToSidebar, title: t('bus.backlinkAgentTitle', { id: p.id }), children: ["\u2190 ", t('bus.backlinkAgent')] })), hasPageLink && (_jsxs("button", { type: "button", className: "ba-backlink ba-backlink-page", onClick: onOpenPage, title: t('bus.backlinkPageTitle', { pageId: page?.id ?? p.id }), children: ["\u2190 ", t('bus.backlinkPage')] })), hasKindLink && (_jsxs("button", { type: "button", className: `ba-backlink ba-backlink-kind k-${p.kind}`, onClick: onFlashKindFooter, title: t('bus.backlinkKindTitle', { kind: p.kind }), children: [_jsx("span", { className: "ba-backlink-kind-dot", "aria-hidden": true, children: "\u25CF" }), "\u2190 ", t('bus.backlinkKind'), " \u00B7 ", p.kind] }))] }), _jsx("div", { className: "ba-detail-note", children: t('bus.detailNoteBroken') })] }));
1286
+ }
1287
+ // P2.6g — render the slim provides.{skills,tools,events,cliProvider} subsets
1288
+ // the server projects (file paths + runner cmd/args + httpAdapter.auth all
1289
+ // stripped). Returns null when the plugin advertises none of these — keeps
1290
+ // the detail row visually identical for plugins where only extension /
1291
+ // modelBinding apply (those have their own dedicated cells / strips upstream).
1292
+ function ProvidesDetail({ p }) {
1293
+ const { t } = useTranslation();
1294
+ const cp = p.cliProvider;
1295
+ const skills = p.skills ?? [];
1296
+ const tools = p.tools ?? [];
1297
+ const events = p.events ?? [];
1298
+ const cliCount = cp ? 1 : 0;
1299
+ const tally = [
1300
+ { kind: 'cli-provider', label: 'cli', count: cliCount, aiTitle: t('bus.tallyCliTitle') },
1301
+ { kind: 'skill', label: 'skill', count: skills.length, aiTitle: t('bus.tallySkillTitle') },
1302
+ { kind: 'tool', label: 'tool', count: tools.length, aiTitle: t('bus.tallyToolTitle') },
1303
+ { kind: 'event', label: 'event', count: events.length, aiTitle: t('bus.tallyEventTitle') },
1304
+ ];
1305
+ const totalProvides = cliCount + skills.length + tools.length + events.length;
1306
+ return (_jsxs("div", { className: "ba-provides", children: [_jsx("div", { className: "ba-provides-label", children: "provides" }), _jsxs("div", { className: "ba-provides-body", children: [_jsxs("div", { className: `ba-prov-tally${totalProvides === 0 ? ' empty' : ''}`, title: totalProvides === 0
1307
+ ? t('bus.provTallyEmptyTitle')
1308
+ : t('bus.provTallyTitle', { n: totalProvides }), children: [tally.map((t) => (_jsxs("span", { className: `ba-prov-tally-pill k-${t.kind}${t.count === 0 ? ' dim' : ''}`, title: t.aiTitle, children: [_jsx("span", { className: "ba-prov-tally-label", children: t.label }), _jsx("b", { className: "ba-prov-tally-count", children: t.count })] }, t.kind))), totalProvides === 0 && (_jsx("span", { className: "ba-prov-tally-note", children: t('bus.provTallyNote') }))] }), cp && (_jsxs("div", { className: "ba-prov-block ba-prov-cli", children: [_jsxs("div", { className: "ba-prov-head", children: [_jsx("span", { className: "ba-prov-tag k-cli-provider", children: "cliProvider" }), _jsx("code", { className: "ba-prov-id", children: cp.id }), _jsx("span", { className: "ba-prov-display", children: cp.displayName })] }), cp.models && cp.models.length > 0 && (_jsxs("div", { className: "ba-prov-row", children: [_jsx("span", { className: "ba-prov-rowlabel", children: "models" }), _jsx("div", { className: "ba-prov-pills", children: cp.models.map((m) => (_jsx("code", { className: "ba-prov-pill ba-prov-model", children: m }, m))) })] })), _jsxs("div", { className: "ba-prov-row", children: [_jsx("span", { className: "ba-prov-rowlabel", children: "capabilities" }), _jsx("div", { className: "ba-prov-pills", children: capabilityChips(cp.capabilities) })] })] })), skills.length > 0 && (_jsxs("div", { className: "ba-prov-block ba-prov-skills", children: [_jsxs("div", { className: "ba-prov-head", children: [_jsx("span", { className: "ba-prov-tag k-skill", children: "skills" }), _jsx("span", { className: "ba-prov-count", children: skills.length })] }), _jsx("ul", { className: "ba-prov-list", children: skills.map((s) => (_jsxs("li", { children: [_jsx("code", { className: "ba-prov-pill ba-prov-skill-id", children: s.id }), _jsx("span", { className: "ba-prov-sep", children: "\u00B7" }), _jsx("code", { className: "ba-prov-pill ba-prov-trigger", children: s.trigger })] }, s.id))) })] })), tools.length > 0 && (_jsxs("div", { className: "ba-prov-block ba-prov-tools", children: [_jsxs("div", { className: "ba-prov-head", children: [_jsx("span", { className: "ba-prov-tag k-tool", children: "tools" }), _jsx("span", { className: "ba-prov-count", children: tools.length })] }), _jsx("ul", { className: "ba-prov-list", children: tools.map((tool) => (_jsxs("li", { children: [_jsx("code", { className: "ba-prov-pill ba-prov-tool-id", children: tool.id }), tool.exposedToAI && (_jsx("span", { className: "ba-prov-flag", title: t('bus.provAiFlagTitle'), children: "AI" }))] }, tool.id))) })] })), events.length > 0 && (_jsxs("div", { className: "ba-prov-block ba-prov-events", children: [_jsxs("div", { className: "ba-prov-head", children: [_jsx("span", { className: "ba-prov-tag k-event", children: "events" }), _jsx("span", { className: "ba-prov-count", children: events.length })] }), _jsx("ul", { className: "ba-prov-list", children: events.map((e) => (_jsx("li", { children: _jsx("code", { className: "ba-prov-pill ba-prov-event-name", children: e.name }) }, e.name))) })] }))] })] }));
1309
+ }
1310
+ function capabilityChips(caps) {
1311
+ // 5 fixed keys per CliProviderCapability.capabilities in
1312
+ // packages/server/src/bus/types/registry.ts — pre-rendered in a stable order
1313
+ // so the player can compare two cli-providers row-by-row.
1314
+ const order = [
1315
+ 'streaming',
1316
+ 'thinking',
1317
+ 'toolCalls',
1318
+ 'subAgents',
1319
+ 'sessions',
1320
+ ];
1321
+ return order.map((k) => (_jsxs("span", { className: `ba-prov-cap ${caps[k] ? 'is-on' : 'is-off'}`, title: caps[k] ? `${k}=true` : `${k}=false`, children: [_jsx("span", { className: "ba-prov-cap-dot", "aria-hidden": true, children: caps[k] ? '●' : '○' }), k] }, k)));
1322
+ }
1323
+ // P3.21 — 5 capability keys, stable order matches the order in ProvidesDetail
1324
+ // `capabilityChips()` above so a player who learns the column order in either
1325
+ // surface reads the other at a glance. Short labels keep the compact matrix
1326
+ // dense (each cell ~26px tall) — full title in tooltip.
1327
+ const CLI_CAP_KEYS = ['streaming', 'thinking', 'toolCalls', 'subAgents', 'sessions'];
1328
+ const CLI_CAP_SHORT = {
1329
+ streaming: 'stream',
1330
+ thinking: 'think',
1331
+ toolCalls: 'tools',
1332
+ subAgents: 'sub-ag',
1333
+ sessions: 'sess',
1334
+ };
1335
+ function CliCapabilityMatrix({ items }) {
1336
+ // Defensive: only rows that actually expose cliProvider make it into the
1337
+ // matrix. Server never emits cli-provider kind without cliProvider, but the
1338
+ // filter keeps the matrix correct if that ever drifts.
1339
+ const rows = items.filter((p) => !!p.cliProvider);
1340
+ if (rows.length === 0)
1341
+ return null;
1342
+ const colTotals = CLI_CAP_KEYS.map((k) => rows.filter((r) => r.cliProvider.capabilities[k]).length);
1343
+ const totalCells = rows.length * CLI_CAP_KEYS.length;
1344
+ const onCells = colTotals.reduce((a, b) => a + b, 0);
1345
+ const fullCoverage = onCells === totalCells;
1346
+ const coveragePct = totalCells === 0 ? 0 : Math.round((onCells / totalCells) * 100);
1347
+ return (_jsxs("div", { className: "ba-cli-matrix", children: [_jsxs("div", { className: "ba-cli-matrix-head", children: [_jsx("span", { className: "ba-cli-matrix-label", children: "capability matrix" }), _jsxs("span", { className: "ba-cli-matrix-meta", children: [rows.length, " cli \u00B7 ", CLI_CAP_KEYS.length, " cap"] })] }), _jsxs("table", { className: "ba-cli-matrix-table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "ba-cli-matrix-corner", "aria-label": "cli provider name" }), CLI_CAP_KEYS.map((k, i) => {
1348
+ const total = colTotals[i];
1349
+ const full = total === rows.length;
1350
+ return (_jsxs("th", { className: "ba-cli-matrix-th", title: k, children: [_jsx("span", { className: "ba-cli-matrix-th-name", children: CLI_CAP_SHORT[k] }), _jsxs("span", { className: `ba-cli-matrix-coverage ${full ? 'is-full' : 'is-partial'}`, title: `${total} / ${rows.length} cli support ${k}`, children: [total, "/", rows.length] })] }, k));
1351
+ })] }) }), _jsx("tbody", { children: rows.map((p) => {
1352
+ const cp = p.cliProvider;
1353
+ const dn = pickLang(p.displayName, 'zh', cp.displayName);
1354
+ return (_jsxs("tr", { children: [_jsxs("td", { className: "ba-cli-matrix-rowname", children: [_jsx("span", { className: "ba-cli-matrix-rowname-zh", children: dn }), _jsx("code", { className: "ba-cli-matrix-rowname-id", title: p.id, children: shortCliId(p.id) })] }), CLI_CAP_KEYS.map((k) => {
1355
+ const on = cp.capabilities[k];
1356
+ return (_jsx("td", { className: `ba-cli-matrix-cell ${on ? 'is-on' : 'is-off'}`, title: `${dn} · ${k} = ${on}`, children: _jsx("span", { className: "ba-cli-matrix-dot", "aria-hidden": true, children: on ? '●' : '○' }) }, k));
1357
+ })] }, p.id));
1358
+ }) })] }), _jsxs("div", { className: `ba-cli-matrix-summary ${fullCoverage ? 'is-full' : 'is-partial'}`, title: `${onCells} of ${totalCells} capability cells active`, children: [_jsx("span", { className: "ba-cli-matrix-summary-dot", "aria-hidden": true, children: fullCoverage ? '●' : '◐' }), _jsx("span", { className: "ba-cli-matrix-summary-text", children: fullCoverage
1359
+ ? `${rows.length} cli × ${CLI_CAP_KEYS.length} cap · 100% coverage`
1360
+ : `${onCells} / ${totalCells} cap on · ${coveragePct}% coverage` })] })] }));
1361
+ }
1362
+ // Strip @forgeax-plugin/cli- prefix so row labels stay narrow (one of
1363
+ // "claude-code" / "codex" / "cursor-agent" / "forgeax") and the dense matrix
1364
+ // can fit on a typical viewport without truncation.
1365
+ function shortCliId(id) {
1366
+ return id.replace(/^@forgeax-plugin\/cli-/, '').replace(/^@forgeax-plugin\//, '');
1367
+ }
1368
+ function kindDescription(kind, t) {
1369
+ switch (kind) {
1370
+ case 'extension':
1371
+ return t('bus.kindDescExtension');
1372
+ case 'agent':
1373
+ return t('bus.kindDescAgent');
1374
+ case 'cli-provider':
1375
+ return t('bus.kindDescCliProvider');
1376
+ case 'model-binding':
1377
+ return t('bus.kindDescModelBinding');
1378
+ case 'skill':
1379
+ return t('bus.kindDescSkill');
1380
+ case 'tool':
1381
+ return t('bus.kindDescTool');
1382
+ default:
1383
+ return t('bus.kindDescUnknown');
1384
+ }
1385
+ }