@supernal/interface 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +165 -0
- package/dist/cjs/names/API.js +104 -0
- package/dist/cjs/names/API.js.map +1 -0
- package/dist/cjs/names/Components.js +104 -0
- package/dist/cjs/names/Components.js.map +1 -0
- package/dist/cjs/names/Containers.js +99 -0
- package/dist/cjs/names/Containers.js.map +1 -0
- package/dist/cjs/names/Functions.js +114 -0
- package/dist/cjs/names/Functions.js.map +1 -0
- package/dist/cjs/names/index.js +118 -0
- package/dist/cjs/names/index.js.map +1 -0
- package/dist/cjs/src/adapters/ChatUIProvider.js +176 -0
- package/dist/cjs/src/adapters/ChatUIProvider.js.map +1 -0
- package/dist/cjs/src/adapters/bridge.js +225 -0
- package/dist/cjs/src/adapters/bridge.js.map +1 -0
- package/dist/cjs/src/adapters/copilotkit/CopilotKitAdapter.js +289 -0
- package/dist/cjs/src/adapters/copilotkit/CopilotKitAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/copilotkit/index.js +10 -0
- package/dist/cjs/src/adapters/copilotkit/index.js.map +1 -0
- package/dist/cjs/src/adapters/index.js +63 -0
- package/dist/cjs/src/adapters/index.js.map +1 -0
- package/dist/cjs/src/adapters/native/NativeAdapter.js +268 -0
- package/dist/cjs/src/adapters/native/NativeAdapter.js.map +1 -0
- package/dist/cjs/src/adapters/native/index.js +10 -0
- package/dist/cjs/src/adapters/native/index.js.map +1 -0
- package/dist/cjs/src/adapters/types/index.js +9 -0
- package/dist/cjs/src/adapters/types/index.js.map +1 -0
- package/dist/cjs/src/ai/ToolExecutor.js +211 -0
- package/dist/cjs/src/ai/ToolExecutor.js.map +1 -0
- package/dist/cjs/src/ai/ToolMatcher.js +202 -0
- package/dist/cjs/src/ai/ToolMatcher.js.map +1 -0
- package/dist/cjs/src/ai/index.js +29 -0
- package/dist/cjs/src/ai/index.js.map +1 -0
- package/dist/cjs/src/architecture/createContainer.js +106 -0
- package/dist/cjs/src/architecture/createContainer.js.map +1 -0
- package/dist/cjs/src/architecture/initialize.js +125 -0
- package/dist/cjs/src/architecture/initialize.js.map +1 -0
- package/dist/cjs/src/architecture/registry.js +111 -0
- package/dist/cjs/src/architecture/registry.js.map +1 -0
- package/dist/cjs/src/background/architecture/ArchitectureInitializer.js +174 -0
- package/dist/cjs/src/background/architecture/ArchitectureInitializer.js.map +1 -0
- package/dist/cjs/src/background/architecture/Containers.js +46 -0
- package/dist/cjs/src/background/architecture/Containers.js.map +1 -0
- package/dist/cjs/src/background/architecture/DataContractTypes.js +28 -0
- package/dist/cjs/src/background/architecture/DataContractTypes.js.map +1 -0
- package/dist/cjs/src/background/architecture/index.js +24 -0
- package/dist/cjs/src/background/architecture/index.js.map +1 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js +71 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -0
- package/dist/cjs/src/background/navigation/RuntimeTreeBuilder.js +66 -0
- package/dist/cjs/src/background/navigation/RuntimeTreeBuilder.js.map +1 -0
- package/dist/cjs/src/background/navigation/useComponentTracking.js +20 -0
- package/dist/cjs/src/background/navigation/useComponentTracking.js.map +1 -0
- package/dist/cjs/src/background/registry/ComponentRegistry.js +340 -0
- package/dist/cjs/src/background/registry/ComponentRegistry.js.map +1 -0
- package/dist/cjs/src/background/registry/ToolRegistry.js +668 -0
- package/dist/cjs/src/background/registry/ToolRegistry.js.map +1 -0
- package/dist/cjs/src/browser.js +70 -0
- package/dist/cjs/src/browser.js.map +1 -0
- package/dist/cjs/src/components/ComponentScanner.js +362 -0
- package/dist/cjs/src/components/ComponentScanner.js.map +1 -0
- package/dist/cjs/src/components/index.js +24 -0
- package/dist/cjs/src/components/index.js.map +1 -0
- package/dist/cjs/src/data/TestDataManager.js +187 -0
- package/dist/cjs/src/data/TestDataManager.js.map +1 -0
- package/dist/cjs/src/data/index.js +23 -0
- package/dist/cjs/src/data/index.js.map +1 -0
- package/dist/cjs/src/decorators/Component.js +108 -0
- package/dist/cjs/src/decorators/Component.js.map +1 -0
- package/dist/cjs/src/decorators/ContainerHelpers.js +45 -0
- package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -0
- package/dist/cjs/src/decorators/SpecializedTools.js +386 -0
- package/dist/cjs/src/decorators/SpecializedTools.js.map +1 -0
- package/dist/cjs/src/decorators/Tool.js +700 -0
- package/dist/cjs/src/decorators/Tool.js.map +1 -0
- package/dist/cjs/src/decorators/ToolHelpers.js +261 -0
- package/dist/cjs/src/decorators/ToolHelpers.js.map +1 -0
- package/dist/cjs/src/decorators/ToolPreset.js +270 -0
- package/dist/cjs/src/decorators/ToolPreset.js.map +1 -0
- package/dist/cjs/src/decorators/ToolProvider.js +86 -0
- package/dist/cjs/src/decorators/ToolProvider.js.map +1 -0
- package/dist/cjs/src/decorators/index.js +44 -0
- package/dist/cjs/src/decorators/index.js.map +1 -0
- package/dist/cjs/src/execution/DOMExecutor.js +233 -0
- package/dist/cjs/src/execution/DOMExecutor.js.map +1 -0
- package/dist/cjs/src/execution/PlaywrightExecutor.js +196 -0
- package/dist/cjs/src/execution/PlaywrightExecutor.js.map +1 -0
- package/dist/cjs/src/exposure/ExposureCollector.js +358 -0
- package/dist/cjs/src/exposure/ExposureCollector.js.map +1 -0
- package/dist/cjs/src/exposure/index.js +26 -0
- package/dist/cjs/src/exposure/index.js.map +1 -0
- package/dist/cjs/src/index.js +187 -0
- package/dist/cjs/src/index.js.map +1 -0
- package/dist/cjs/src/interfaces/StatefulComponent.js +50 -0
- package/dist/cjs/src/interfaces/StatefulComponent.js.map +1 -0
- package/dist/cjs/src/name-contracts/ContractScanner.js +15 -0
- package/dist/cjs/src/name-contracts/ContractScanner.js.map +1 -0
- package/dist/cjs/src/name-contracts/RouteContractScanner.js +225 -0
- package/dist/cjs/src/name-contracts/RouteContractScanner.js.map +1 -0
- package/dist/cjs/src/name-contracts/index.js +15 -0
- package/dist/cjs/src/name-contracts/index.js.map +1 -0
- package/dist/cjs/src/names/createNames.js +86 -0
- package/dist/cjs/src/names/createNames.js.map +1 -0
- package/dist/cjs/src/react/hooks/useChatWithContext.js +221 -0
- package/dist/cjs/src/react/hooks/useChatWithContext.js.map +1 -0
- package/dist/cjs/src/react/index.js +28 -0
- package/dist/cjs/src/react/index.js.map +1 -0
- package/dist/cjs/src/react/useNavigationHandler.js +88 -0
- package/dist/cjs/src/react/useNavigationHandler.js.map +1 -0
- package/dist/cjs/src/react/usePersistedState.js +72 -0
- package/dist/cjs/src/react/usePersistedState.js.map +1 -0
- package/dist/cjs/src/react/useToolBinding.js +110 -0
- package/dist/cjs/src/react/useToolBinding.js.map +1 -0
- package/dist/cjs/src/routes/RouteContractGenerator.js +119 -0
- package/dist/cjs/src/routes/RouteContractGenerator.js.map +1 -0
- package/dist/cjs/src/routes/RouteContractsConfig.js +39 -0
- package/dist/cjs/src/routes/RouteContractsConfig.js.map +1 -0
- package/dist/cjs/src/routes/index.js +20 -0
- package/dist/cjs/src/routes/index.js.map +1 -0
- package/dist/cjs/src/routes/scanners/NameExtractor.js +193 -0
- package/dist/cjs/src/routes/scanners/NameExtractor.js.map +1 -0
- package/dist/cjs/src/routes/scanners/NextjsDynamicScanner.js +102 -0
- package/dist/cjs/src/routes/scanners/NextjsDynamicScanner.js.map +1 -0
- package/dist/cjs/src/routes/scanners/RouteScanner.js +13 -0
- package/dist/cjs/src/routes/scanners/RouteScanner.js.map +1 -0
- package/dist/cjs/src/storage/LocalStorageAdapter.js +87 -0
- package/dist/cjs/src/storage/LocalStorageAdapter.js.map +1 -0
- package/dist/cjs/src/storage/StateManager.js +299 -0
- package/dist/cjs/src/storage/StateManager.js.map +1 -0
- package/dist/cjs/src/storage/StorageAdapter.js +164 -0
- package/dist/cjs/src/storage/StorageAdapter.js.map +1 -0
- package/dist/cjs/src/storage/index.js +37 -0
- package/dist/cjs/src/storage/index.js.map +1 -0
- package/dist/cjs/src/testing/BrowserStateInjection.js +130 -0
- package/dist/cjs/src/testing/BrowserStateInjection.js.map +1 -0
- package/dist/cjs/src/testing/ComponentStateHelpers.js +200 -0
- package/dist/cjs/src/testing/ComponentStateHelpers.js.map +1 -0
- package/dist/cjs/src/testing/GherkinParser.js +252 -0
- package/dist/cjs/src/testing/GherkinParser.js.map +1 -0
- package/dist/cjs/src/testing/PlaywrightStateHelpers.js +254 -0
- package/dist/cjs/src/testing/PlaywrightStateHelpers.js.map +1 -0
- package/dist/cjs/src/testing/TestRunner.js +158 -0
- package/dist/cjs/src/testing/TestRunner.js.map +1 -0
- package/dist/cjs/src/testing/index.js +46 -0
- package/dist/cjs/src/testing/index.js.map +1 -0
- package/dist/cjs/src/testing/selectors.js +84 -0
- package/dist/cjs/src/testing/selectors.js.map +1 -0
- package/dist/cjs/src/tools/SystemTools.js +262 -0
- package/dist/cjs/src/tools/SystemTools.js.map +1 -0
- package/dist/cjs/src/types/ClassifiedTool.js +50 -0
- package/dist/cjs/src/types/ClassifiedTool.js.map +1 -0
- package/dist/cjs/src/types/ComponentState.js +30 -0
- package/dist/cjs/src/types/ComponentState.js.map +1 -0
- package/dist/cjs/src/types/DiscoverableToolProvider.js +9 -0
- package/dist/cjs/src/types/DiscoverableToolProvider.js.map +1 -0
- package/dist/cjs/src/types/ExposureState.js +25 -0
- package/dist/cjs/src/types/ExposureState.js.map +1 -0
- package/dist/cjs/src/types/NavigationGraph.js +8 -0
- package/dist/cjs/src/types/NavigationGraph.js.map +1 -0
- package/dist/cjs/src/types/OperationType.js +49 -0
- package/dist/cjs/src/types/OperationType.js.map +1 -0
- package/dist/cjs/src/types/StateManagers.js +39 -0
- package/dist/cjs/src/types/StateManagers.js.map +1 -0
- package/dist/cjs/src/types/Tool.js +41 -0
- package/dist/cjs/src/types/Tool.js.map +1 -0
- package/dist/cjs/src/types/ToolPermissions.js +54 -0
- package/dist/cjs/src/types/ToolPermissions.js.map +1 -0
- package/dist/cjs/src/types/ToolResult.js +25 -0
- package/dist/cjs/src/types/ToolResult.js.map +1 -0
- package/dist/cjs/src/types/index.js +59 -0
- package/dist/cjs/src/types/index.js.map +1 -0
- package/dist/cjs/src/ui/react/chat/ChatBubble.js +221 -0
- package/dist/cjs/src/ui/react/chat/ChatBubble.js.map +1 -0
- package/dist/esm/names/API.d.ts +77 -0
- package/dist/esm/names/API.d.ts.map +1 -0
- package/dist/esm/names/API.js +99 -0
- package/dist/esm/names/API.js.map +1 -0
- package/dist/esm/names/Components.d.ts +77 -0
- package/dist/esm/names/Components.d.ts.map +1 -0
- package/dist/esm/names/Components.js +99 -0
- package/dist/esm/names/Components.js.map +1 -0
- package/dist/esm/names/Containers.d.ts +84 -0
- package/dist/esm/names/Containers.d.ts.map +1 -0
- package/dist/esm/names/Containers.js +94 -0
- package/dist/esm/names/Containers.js.map +1 -0
- package/dist/esm/names/Functions.d.ts +87 -0
- package/dist/esm/names/Functions.d.ts.map +1 -0
- package/dist/esm/names/Functions.js +109 -0
- package/dist/esm/names/Functions.js.map +1 -0
- package/dist/esm/names/index.d.ts +187 -0
- package/dist/esm/names/index.d.ts.map +1 -0
- package/dist/esm/names/index.js +99 -0
- package/dist/esm/names/index.js.map +1 -0
- package/dist/esm/src/adapters/ChatUIProvider.d.ts +76 -0
- package/dist/esm/src/adapters/ChatUIProvider.d.ts.map +1 -0
- package/dist/esm/src/adapters/ChatUIProvider.js +136 -0
- package/dist/esm/src/adapters/ChatUIProvider.js.map +1 -0
- package/dist/esm/src/adapters/bridge.d.ts +145 -0
- package/dist/esm/src/adapters/bridge.d.ts.map +1 -0
- package/dist/esm/src/adapters/bridge.js +218 -0
- package/dist/esm/src/adapters/bridge.js.map +1 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.d.ts +49 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.d.ts.map +1 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.js +251 -0
- package/dist/esm/src/adapters/copilotkit/CopilotKitAdapter.js.map +1 -0
- package/dist/esm/src/adapters/copilotkit/index.d.ts +6 -0
- package/dist/esm/src/adapters/copilotkit/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/copilotkit/index.js +5 -0
- package/dist/esm/src/adapters/copilotkit/index.js.map +1 -0
- package/dist/esm/src/adapters/index.d.ts +31 -0
- package/dist/esm/src/adapters/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/index.js +32 -0
- package/dist/esm/src/adapters/index.js.map +1 -0
- package/dist/esm/src/adapters/native/NativeAdapter.d.ts +47 -0
- package/dist/esm/src/adapters/native/NativeAdapter.d.ts.map +1 -0
- package/dist/esm/src/adapters/native/NativeAdapter.js +230 -0
- package/dist/esm/src/adapters/native/NativeAdapter.js.map +1 -0
- package/dist/esm/src/adapters/native/index.d.ts +6 -0
- package/dist/esm/src/adapters/native/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/native/index.js +5 -0
- package/dist/esm/src/adapters/native/index.js.map +1 -0
- package/dist/esm/src/adapters/types/index.d.ts +155 -0
- package/dist/esm/src/adapters/types/index.d.ts.map +1 -0
- package/dist/esm/src/adapters/types/index.js +8 -0
- package/dist/esm/src/adapters/types/index.js.map +1 -0
- package/dist/esm/src/ai/ToolExecutor.d.ts +49 -0
- package/dist/esm/src/ai/ToolExecutor.d.ts.map +1 -0
- package/dist/esm/src/ai/ToolExecutor.js +174 -0
- package/dist/esm/src/ai/ToolExecutor.js.map +1 -0
- package/dist/esm/src/ai/ToolMatcher.d.ts +61 -0
- package/dist/esm/src/ai/ToolMatcher.d.ts.map +1 -0
- package/dist/esm/src/ai/ToolMatcher.js +198 -0
- package/dist/esm/src/ai/ToolMatcher.js.map +1 -0
- package/dist/esm/src/ai/index.d.ts +9 -0
- package/dist/esm/src/ai/index.d.ts.map +1 -0
- package/dist/esm/src/ai/index.js +13 -0
- package/dist/esm/src/ai/index.js.map +1 -0
- package/dist/esm/src/architecture/createContainer.d.ts +60 -0
- package/dist/esm/src/architecture/createContainer.d.ts.map +1 -0
- package/dist/esm/src/architecture/createContainer.js +102 -0
- package/dist/esm/src/architecture/createContainer.js.map +1 -0
- package/dist/esm/src/architecture/initialize.d.ts +81 -0
- package/dist/esm/src/architecture/initialize.d.ts.map +1 -0
- package/dist/esm/src/architecture/initialize.js +121 -0
- package/dist/esm/src/architecture/initialize.js.map +1 -0
- package/dist/esm/src/architecture/registry.d.ts +61 -0
- package/dist/esm/src/architecture/registry.d.ts.map +1 -0
- package/dist/esm/src/architecture/registry.js +107 -0
- package/dist/esm/src/architecture/registry.js.map +1 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.d.ts +95 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.js +170 -0
- package/dist/esm/src/background/architecture/ArchitectureInitializer.js.map +1 -0
- package/dist/esm/src/background/architecture/Containers.d.ts +52 -0
- package/dist/esm/src/background/architecture/Containers.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/Containers.js +40 -0
- package/dist/esm/src/background/architecture/Containers.js.map +1 -0
- package/dist/esm/src/background/architecture/DataContractTypes.d.ts +33 -0
- package/dist/esm/src/background/architecture/DataContractTypes.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/DataContractTypes.js +22 -0
- package/dist/esm/src/background/architecture/DataContractTypes.js.map +1 -0
- package/dist/esm/src/background/architecture/index.d.ts +12 -0
- package/dist/esm/src/background/architecture/index.d.ts.map +1 -0
- package/dist/esm/src/background/architecture/index.js +13 -0
- package/dist/esm/src/background/architecture/index.js.map +1 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts +48 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js +67 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.d.ts +30 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.js +60 -0
- package/dist/esm/src/background/navigation/RuntimeTreeBuilder.js.map +1 -0
- package/dist/esm/src/background/navigation/useComponentTracking.d.ts +10 -0
- package/dist/esm/src/background/navigation/useComponentTracking.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/useComponentTracking.js +17 -0
- package/dist/esm/src/background/navigation/useComponentTracking.js.map +1 -0
- package/dist/esm/src/background/registry/ComponentRegistry.d.ts +192 -0
- package/dist/esm/src/background/registry/ComponentRegistry.d.ts.map +1 -0
- package/dist/esm/src/background/registry/ComponentRegistry.js +336 -0
- package/dist/esm/src/background/registry/ComponentRegistry.js.map +1 -0
- package/dist/esm/src/background/registry/ToolRegistry.d.ts +232 -0
- package/dist/esm/src/background/registry/ToolRegistry.d.ts.map +1 -0
- package/dist/esm/src/background/registry/ToolRegistry.js +664 -0
- package/dist/esm/src/background/registry/ToolRegistry.js.map +1 -0
- package/dist/esm/src/browser.d.ts +21 -0
- package/dist/esm/src/browser.d.ts.map +1 -0
- package/dist/esm/src/browser.js +31 -0
- package/dist/esm/src/browser.js.map +1 -0
- package/dist/esm/src/components/ComponentScanner.d.ts +99 -0
- package/dist/esm/src/components/ComponentScanner.d.ts.map +1 -0
- package/dist/esm/src/components/ComponentScanner.js +325 -0
- package/dist/esm/src/components/ComponentScanner.js.map +1 -0
- package/dist/esm/src/components/index.d.ts +9 -0
- package/dist/esm/src/components/index.d.ts.map +1 -0
- package/dist/esm/src/components/index.js +8 -0
- package/dist/esm/src/components/index.js.map +1 -0
- package/dist/esm/src/data/TestDataManager.d.ts +125 -0
- package/dist/esm/src/data/TestDataManager.d.ts.map +1 -0
- package/dist/esm/src/data/TestDataManager.js +183 -0
- package/dist/esm/src/data/TestDataManager.js.map +1 -0
- package/dist/esm/src/data/index.d.ts +7 -0
- package/dist/esm/src/data/index.d.ts.map +1 -0
- package/dist/esm/src/data/index.js +7 -0
- package/dist/esm/src/data/index.js.map +1 -0
- package/dist/esm/src/decorators/Component.d.ts +59 -0
- package/dist/esm/src/decorators/Component.d.ts.map +1 -0
- package/dist/esm/src/decorators/Component.js +103 -0
- package/dist/esm/src/decorators/Component.js.map +1 -0
- package/dist/esm/src/decorators/ContainerHelpers.d.ts +26 -0
- package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -0
- package/dist/esm/src/decorators/ContainerHelpers.js +42 -0
- package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -0
- package/dist/esm/src/decorators/SpecializedTools.d.ts +218 -0
- package/dist/esm/src/decorators/SpecializedTools.d.ts.map +1 -0
- package/dist/esm/src/decorators/SpecializedTools.js +383 -0
- package/dist/esm/src/decorators/SpecializedTools.js.map +1 -0
- package/dist/esm/src/decorators/Tool.d.ts +210 -0
- package/dist/esm/src/decorators/Tool.d.ts.map +1 -0
- package/dist/esm/src/decorators/Tool.js +694 -0
- package/dist/esm/src/decorators/Tool.js.map +1 -0
- package/dist/esm/src/decorators/ToolHelpers.d.ts +74 -0
- package/dist/esm/src/decorators/ToolHelpers.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolHelpers.js +219 -0
- package/dist/esm/src/decorators/ToolHelpers.js.map +1 -0
- package/dist/esm/src/decorators/ToolPreset.d.ts +138 -0
- package/dist/esm/src/decorators/ToolPreset.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolPreset.js +259 -0
- package/dist/esm/src/decorators/ToolPreset.js.map +1 -0
- package/dist/esm/src/decorators/ToolProvider.d.ts +65 -0
- package/dist/esm/src/decorators/ToolProvider.d.ts.map +1 -0
- package/dist/esm/src/decorators/ToolProvider.js +81 -0
- package/dist/esm/src/decorators/ToolProvider.js.map +1 -0
- package/dist/esm/src/decorators/index.d.ts +13 -0
- package/dist/esm/src/decorators/index.d.ts.map +1 -0
- package/dist/esm/src/decorators/index.js +14 -0
- package/dist/esm/src/decorators/index.js.map +1 -0
- package/dist/esm/src/execution/DOMExecutor.d.ts +43 -0
- package/dist/esm/src/execution/DOMExecutor.d.ts.map +1 -0
- package/dist/esm/src/execution/DOMExecutor.js +229 -0
- package/dist/esm/src/execution/DOMExecutor.js.map +1 -0
- package/dist/esm/src/execution/PlaywrightExecutor.d.ts +38 -0
- package/dist/esm/src/execution/PlaywrightExecutor.d.ts.map +1 -0
- package/dist/esm/src/execution/PlaywrightExecutor.js +192 -0
- package/dist/esm/src/execution/PlaywrightExecutor.js.map +1 -0
- package/dist/esm/src/exposure/ExposureCollector.d.ts +88 -0
- package/dist/esm/src/exposure/ExposureCollector.d.ts.map +1 -0
- package/dist/esm/src/exposure/ExposureCollector.js +354 -0
- package/dist/esm/src/exposure/ExposureCollector.js.map +1 -0
- package/dist/esm/src/exposure/index.d.ts +8 -0
- package/dist/esm/src/exposure/index.d.ts.map +1 -0
- package/dist/esm/src/exposure/index.js +10 -0
- package/dist/esm/src/exposure/index.js.map +1 -0
- package/dist/esm/src/index.d.ts +49 -0
- package/dist/esm/src/index.d.ts.map +1 -0
- package/dist/esm/src/index.js +79 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/interfaces/StatefulComponent.d.ts +72 -0
- package/dist/esm/src/interfaces/StatefulComponent.d.ts.map +1 -0
- package/dist/esm/src/interfaces/StatefulComponent.js +47 -0
- package/dist/esm/src/interfaces/StatefulComponent.js.map +1 -0
- package/dist/esm/src/name-contracts/ContractScanner.d.ts +61 -0
- package/dist/esm/src/name-contracts/ContractScanner.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/ContractScanner.js +11 -0
- package/dist/esm/src/name-contracts/ContractScanner.js.map +1 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.d.ts +30 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.js +188 -0
- package/dist/esm/src/name-contracts/RouteContractScanner.js.map +1 -0
- package/dist/esm/src/name-contracts/index.d.ts +10 -0
- package/dist/esm/src/name-contracts/index.d.ts.map +1 -0
- package/dist/esm/src/name-contracts/index.js +10 -0
- package/dist/esm/src/name-contracts/index.js.map +1 -0
- package/dist/esm/src/names/createNames.d.ts +49 -0
- package/dist/esm/src/names/createNames.d.ts.map +1 -0
- package/dist/esm/src/names/createNames.js +81 -0
- package/dist/esm/src/names/createNames.js.map +1 -0
- package/dist/esm/src/react/hooks/useChatWithContext.d.ts +68 -0
- package/dist/esm/src/react/hooks/useChatWithContext.d.ts.map +1 -0
- package/dist/esm/src/react/hooks/useChatWithContext.js +218 -0
- package/dist/esm/src/react/hooks/useChatWithContext.js.map +1 -0
- package/dist/esm/src/react/index.d.ts +12 -0
- package/dist/esm/src/react/index.d.ts.map +1 -0
- package/dist/esm/src/react/index.js +21 -0
- package/dist/esm/src/react/index.js.map +1 -0
- package/dist/esm/src/react/useNavigationHandler.d.ts +42 -0
- package/dist/esm/src/react/useNavigationHandler.d.ts.map +1 -0
- package/dist/esm/src/react/useNavigationHandler.js +85 -0
- package/dist/esm/src/react/useNavigationHandler.js.map +1 -0
- package/dist/esm/src/react/usePersistedState.d.ts +13 -0
- package/dist/esm/src/react/usePersistedState.d.ts.map +1 -0
- package/dist/esm/src/react/usePersistedState.js +69 -0
- package/dist/esm/src/react/usePersistedState.js.map +1 -0
- package/dist/esm/src/react/useToolBinding.d.ts +8 -0
- package/dist/esm/src/react/useToolBinding.d.ts.map +1 -0
- package/dist/esm/src/react/useToolBinding.js +107 -0
- package/dist/esm/src/react/useToolBinding.js.map +1 -0
- package/dist/esm/src/routes/RouteContractGenerator.d.ts +37 -0
- package/dist/esm/src/routes/RouteContractGenerator.d.ts.map +1 -0
- package/dist/esm/src/routes/RouteContractGenerator.js +115 -0
- package/dist/esm/src/routes/RouteContractGenerator.js.map +1 -0
- package/dist/esm/src/routes/RouteContractsConfig.d.ts +93 -0
- package/dist/esm/src/routes/RouteContractsConfig.d.ts.map +1 -0
- package/dist/esm/src/routes/RouteContractsConfig.js +36 -0
- package/dist/esm/src/routes/RouteContractsConfig.js.map +1 -0
- package/dist/esm/src/routes/index.d.ts +13 -0
- package/dist/esm/src/routes/index.d.ts.map +1 -0
- package/dist/esm/src/routes/index.js +13 -0
- package/dist/esm/src/routes/index.js.map +1 -0
- package/dist/esm/src/routes/scanners/NameExtractor.d.ts +36 -0
- package/dist/esm/src/routes/scanners/NameExtractor.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/NameExtractor.js +156 -0
- package/dist/esm/src/routes/scanners/NameExtractor.js.map +1 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.d.ts +35 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.js +98 -0
- package/dist/esm/src/routes/scanners/NextjsDynamicScanner.js.map +1 -0
- package/dist/esm/src/routes/scanners/RouteScanner.d.ts +64 -0
- package/dist/esm/src/routes/scanners/RouteScanner.d.ts.map +1 -0
- package/dist/esm/src/routes/scanners/RouteScanner.js +9 -0
- package/dist/esm/src/routes/scanners/RouteScanner.js.map +1 -0
- package/dist/esm/src/storage/LocalStorageAdapter.d.ts +29 -0
- package/dist/esm/src/storage/LocalStorageAdapter.d.ts.map +1 -0
- package/dist/esm/src/storage/LocalStorageAdapter.js +83 -0
- package/dist/esm/src/storage/LocalStorageAdapter.js.map +1 -0
- package/dist/esm/src/storage/StateManager.d.ts +175 -0
- package/dist/esm/src/storage/StateManager.d.ts.map +1 -0
- package/dist/esm/src/storage/StateManager.js +295 -0
- package/dist/esm/src/storage/StateManager.js.map +1 -0
- package/dist/esm/src/storage/StorageAdapter.d.ts +94 -0
- package/dist/esm/src/storage/StorageAdapter.d.ts.map +1 -0
- package/dist/esm/src/storage/StorageAdapter.js +158 -0
- package/dist/esm/src/storage/StorageAdapter.js.map +1 -0
- package/dist/esm/src/storage/index.d.ts +12 -0
- package/dist/esm/src/storage/index.d.ts.map +1 -0
- package/dist/esm/src/storage/index.js +17 -0
- package/dist/esm/src/storage/index.js.map +1 -0
- package/dist/esm/src/testing/BrowserStateInjection.d.ts +74 -0
- package/dist/esm/src/testing/BrowserStateInjection.d.ts.map +1 -0
- package/dist/esm/src/testing/BrowserStateInjection.js +126 -0
- package/dist/esm/src/testing/BrowserStateInjection.js.map +1 -0
- package/dist/esm/src/testing/ComponentStateHelpers.d.ts +121 -0
- package/dist/esm/src/testing/ComponentStateHelpers.d.ts.map +1 -0
- package/dist/esm/src/testing/ComponentStateHelpers.js +190 -0
- package/dist/esm/src/testing/ComponentStateHelpers.js.map +1 -0
- package/dist/esm/src/testing/GherkinParser.d.ts +87 -0
- package/dist/esm/src/testing/GherkinParser.d.ts.map +1 -0
- package/dist/esm/src/testing/GherkinParser.js +248 -0
- package/dist/esm/src/testing/GherkinParser.js.map +1 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.d.ts +163 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.d.ts.map +1 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.js +242 -0
- package/dist/esm/src/testing/PlaywrightStateHelpers.js.map +1 -0
- package/dist/esm/src/testing/TestRunner.d.ts +50 -0
- package/dist/esm/src/testing/TestRunner.d.ts.map +1 -0
- package/dist/esm/src/testing/TestRunner.js +121 -0
- package/dist/esm/src/testing/TestRunner.js.map +1 -0
- package/dist/esm/src/testing/index.d.ts +12 -0
- package/dist/esm/src/testing/index.d.ts.map +1 -0
- package/dist/esm/src/testing/index.js +25 -0
- package/dist/esm/src/testing/index.js.map +1 -0
- package/dist/esm/src/testing/selectors.d.ts +65 -0
- package/dist/esm/src/testing/selectors.d.ts.map +1 -0
- package/dist/esm/src/testing/selectors.js +76 -0
- package/dist/esm/src/testing/selectors.js.map +1 -0
- package/dist/esm/src/tools/SystemTools.d.ts +139 -0
- package/dist/esm/src/tools/SystemTools.d.ts.map +1 -0
- package/dist/esm/src/tools/SystemTools.js +258 -0
- package/dist/esm/src/tools/SystemTools.js.map +1 -0
- package/dist/esm/src/types/ClassifiedTool.d.ts +61 -0
- package/dist/esm/src/types/ClassifiedTool.d.ts.map +1 -0
- package/dist/esm/src/types/ClassifiedTool.js +47 -0
- package/dist/esm/src/types/ClassifiedTool.js.map +1 -0
- package/dist/esm/src/types/ComponentState.d.ts +207 -0
- package/dist/esm/src/types/ComponentState.d.ts.map +1 -0
- package/dist/esm/src/types/ComponentState.js +25 -0
- package/dist/esm/src/types/ComponentState.js.map +1 -0
- package/dist/esm/src/types/DiscoverableToolProvider.d.ts +59 -0
- package/dist/esm/src/types/DiscoverableToolProvider.d.ts.map +1 -0
- package/dist/esm/src/types/DiscoverableToolProvider.js +8 -0
- package/dist/esm/src/types/DiscoverableToolProvider.js.map +1 -0
- package/dist/esm/src/types/ExposureState.d.ts +75 -0
- package/dist/esm/src/types/ExposureState.d.ts.map +1 -0
- package/dist/esm/src/types/ExposureState.js +22 -0
- package/dist/esm/src/types/ExposureState.js.map +1 -0
- package/dist/esm/src/types/NavigationGraph.d.ts +98 -0
- package/dist/esm/src/types/NavigationGraph.d.ts.map +1 -0
- package/dist/esm/src/types/NavigationGraph.js +7 -0
- package/dist/esm/src/types/NavigationGraph.js.map +1 -0
- package/dist/esm/src/types/OperationType.d.ts +45 -0
- package/dist/esm/src/types/OperationType.d.ts.map +1 -0
- package/dist/esm/src/types/OperationType.js +46 -0
- package/dist/esm/src/types/OperationType.js.map +1 -0
- package/dist/esm/src/types/StateManagers.d.ts +35 -0
- package/dist/esm/src/types/StateManagers.d.ts.map +1 -0
- package/dist/esm/src/types/StateManagers.js +36 -0
- package/dist/esm/src/types/StateManagers.js.map +1 -0
- package/dist/esm/src/types/Tool.d.ts +162 -0
- package/dist/esm/src/types/Tool.d.ts.map +1 -0
- package/dist/esm/src/types/Tool.js +38 -0
- package/dist/esm/src/types/Tool.js.map +1 -0
- package/dist/esm/src/types/ToolPermissions.d.ts +73 -0
- package/dist/esm/src/types/ToolPermissions.d.ts.map +1 -0
- package/dist/esm/src/types/ToolPermissions.js +51 -0
- package/dist/esm/src/types/ToolPermissions.js.map +1 -0
- package/dist/esm/src/types/ToolResult.d.ts +129 -0
- package/dist/esm/src/types/ToolResult.d.ts.map +1 -0
- package/dist/esm/src/types/ToolResult.js +22 -0
- package/dist/esm/src/types/ToolResult.js.map +1 -0
- package/dist/esm/src/types/index.d.ts +47 -0
- package/dist/esm/src/types/index.d.ts.map +1 -0
- package/dist/esm/src/types/index.js +42 -0
- package/dist/esm/src/types/index.js.map +1 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts +23 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts.map +1 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.js +184 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.js.map +1 -0
- package/package.json +118 -0
|
@@ -0,0 +1,668 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Registry - Simple registry for tool discovery and metadata
|
|
4
|
+
*
|
|
5
|
+
* This registry ONLY handles:
|
|
6
|
+
* - Tool registration
|
|
7
|
+
* - Tool discovery
|
|
8
|
+
* - Metadata management
|
|
9
|
+
*
|
|
10
|
+
* Execution is handled separately by:
|
|
11
|
+
* - PlaywrightExecutor (for testing)
|
|
12
|
+
* - DOMExecutor (for AI control)
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ToolRegistry = void 0;
|
|
16
|
+
// Use a global registry to avoid Jest module isolation issues
|
|
17
|
+
const globalRegistry = (typeof global !== 'undefined' ? global : globalThis);
|
|
18
|
+
if (!globalRegistry.__SUPERNAL_TOOL_REGISTRY__) {
|
|
19
|
+
globalRegistry.__SUPERNAL_TOOL_REGISTRY__ = new Map();
|
|
20
|
+
}
|
|
21
|
+
if (!globalRegistry.__SUPERNAL_ACTIVE_INSTANCES__) {
|
|
22
|
+
globalRegistry.__SUPERNAL_ACTIVE_INSTANCES__ = new Map();
|
|
23
|
+
}
|
|
24
|
+
class ToolRegistry {
|
|
25
|
+
static get tools() {
|
|
26
|
+
return globalRegistry.__SUPERNAL_TOOL_REGISTRY__;
|
|
27
|
+
}
|
|
28
|
+
static get activeInstances() {
|
|
29
|
+
return globalRegistry.__SUPERNAL_ACTIVE_INSTANCES__;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Register a tool
|
|
33
|
+
*/
|
|
34
|
+
static registerTool(providerName, methodName, metadata) {
|
|
35
|
+
const toolId = `${providerName}.${methodName}`;
|
|
36
|
+
this.tools.set(toolId, metadata);
|
|
37
|
+
if (typeof process !== 'undefined' && process.env?.NODE_ENV !== 'test') {
|
|
38
|
+
console.log(`🔧 Registered Tool: ${metadata.name} (${metadata.toolType}, AI: ${metadata.aiEnabled})`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get a specific tool by identifier
|
|
43
|
+
* Supports both class-based IDs (Counter.increment) and component-namespaced IDs (counter.increment)
|
|
44
|
+
*/
|
|
45
|
+
static getTool(toolIdentifier) {
|
|
46
|
+
// First, try direct lookup
|
|
47
|
+
let tool = this.tools.get(toolIdentifier);
|
|
48
|
+
if (tool)
|
|
49
|
+
return tool;
|
|
50
|
+
// If not found and identifier looks like component.method (lowercase start),
|
|
51
|
+
// search for a tool with matching componentName and methodName
|
|
52
|
+
if (toolIdentifier.includes('.')) {
|
|
53
|
+
const [possibleComponent, methodName] = toolIdentifier.split('.');
|
|
54
|
+
// Check if it looks like a component name (lowercase start)
|
|
55
|
+
if (possibleComponent[0] === possibleComponent[0].toLowerCase()) {
|
|
56
|
+
// Search for tool with this componentName and methodName
|
|
57
|
+
tool = Array.from(this.tools.values()).find(t => t.componentName === possibleComponent && t.methodName === methodName);
|
|
58
|
+
if (tool)
|
|
59
|
+
return tool;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all registered tools
|
|
66
|
+
*/
|
|
67
|
+
static getAllTools() {
|
|
68
|
+
return new Map(this.tools);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get all registered tools as array
|
|
72
|
+
*/
|
|
73
|
+
static getTools() {
|
|
74
|
+
return Array.from(this.tools.values());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Find tool by element ID (data-testid)
|
|
78
|
+
*/
|
|
79
|
+
static findToolByElementId(elementId) {
|
|
80
|
+
return Array.from(this.tools.values()).find((tool) => tool.elementId === elementId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register active component instance
|
|
84
|
+
*/
|
|
85
|
+
static registerInstance(storageKey, element) {
|
|
86
|
+
if (this.activeInstances.has(storageKey)) {
|
|
87
|
+
throw new Error(`Duplicate instance: ${storageKey} already registered`);
|
|
88
|
+
}
|
|
89
|
+
this.activeInstances.set(storageKey, element);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Unregister component instance on unmount
|
|
93
|
+
*/
|
|
94
|
+
static unregisterInstance(storageKey) {
|
|
95
|
+
this.activeInstances.delete(storageKey);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check if instance exists (for duplicate detection)
|
|
99
|
+
*/
|
|
100
|
+
static getActiveInstance(storageKey) {
|
|
101
|
+
return this.activeInstances.get(storageKey);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Bind a class instance to all its registered tool methods
|
|
105
|
+
*
|
|
106
|
+
* This allows @Tool decorated methods to be called by AI without needing
|
|
107
|
+
* the instance to be called once first (which sets tool.instance = this).
|
|
108
|
+
*
|
|
109
|
+
* @param instance The class instance with @Tool decorated methods
|
|
110
|
+
*/
|
|
111
|
+
static bindInstance(instance) {
|
|
112
|
+
const className = instance.constructor.name;
|
|
113
|
+
console.log(`🔗 [ToolRegistry] Binding instance for: ${className}`);
|
|
114
|
+
let boundCount = 0;
|
|
115
|
+
// Find all tools belonging to this class
|
|
116
|
+
for (const [toolId, tool] of this.tools.entries()) {
|
|
117
|
+
// Check if tool belongs to this class
|
|
118
|
+
if (toolId.startsWith(`${className}.`) && tool.methodName) {
|
|
119
|
+
const methodName = tool.methodName;
|
|
120
|
+
// Bind the method to this instance
|
|
121
|
+
if (typeof instance[methodName] === 'function') {
|
|
122
|
+
tool.method = instance[methodName].bind(instance);
|
|
123
|
+
tool.instance = instance;
|
|
124
|
+
boundCount++;
|
|
125
|
+
console.log(` ✓ Bound ${className}.${methodName}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
console.log(`🔗 [ToolRegistry] Bound ${boundCount} methods for ${className}`);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get AI-enabled tools only
|
|
133
|
+
*/
|
|
134
|
+
static getAIEnabledTools() {
|
|
135
|
+
return Array.from(this.tools.values()).filter((tool) => tool.aiEnabled);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get test-only tools
|
|
139
|
+
*/
|
|
140
|
+
static getTestOnlyTools() {
|
|
141
|
+
return Array.from(this.tools.values()).filter((tool) => !tool.aiEnabled);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get tools by category
|
|
145
|
+
*/
|
|
146
|
+
static getToolsByCategory(category) {
|
|
147
|
+
return Array.from(this.tools.values()).filter((tool) => tool.category === category);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Search tools by query
|
|
151
|
+
*/
|
|
152
|
+
static searchTools(query) {
|
|
153
|
+
if (!query || typeof query !== 'string') {
|
|
154
|
+
console.error('❌ [ToolRegistry] Invalid search query:', query);
|
|
155
|
+
return [];
|
|
156
|
+
}
|
|
157
|
+
const queryLower = query.toLowerCase();
|
|
158
|
+
console.log(`🔍 [ToolRegistry.searchTools] Searching for: "${queryLower}"`);
|
|
159
|
+
console.log(`🔍 [ToolRegistry.searchTools] Total tools in registry: ${this.tools.size}`);
|
|
160
|
+
return Array.from(this.tools.values()).filter((tool) => {
|
|
161
|
+
const searchFields = [
|
|
162
|
+
tool.name ? tool.name.toLowerCase() : '',
|
|
163
|
+
tool.description ? tool.description.toLowerCase() : '',
|
|
164
|
+
tool.category ? tool.category.toLowerCase() : '',
|
|
165
|
+
...(tool.examples || []).map((ex) => ex ? ex.toLowerCase() : ''),
|
|
166
|
+
...(tool.keywords || []).map((kw) => kw ? kw.toLowerCase() : ''),
|
|
167
|
+
].filter(f => f); // Remove empty strings
|
|
168
|
+
return searchFields.some((field) => field.includes(queryLower) || queryLower.includes(field));
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Search tools with container scoping
|
|
173
|
+
*
|
|
174
|
+
* Prioritizes tools in currentContainer, then global tools.
|
|
175
|
+
* This enables "local > global" resolution like lexical scope.
|
|
176
|
+
*
|
|
177
|
+
* @param query Search query
|
|
178
|
+
* @param currentContainer Current page/container context
|
|
179
|
+
* @returns Tools sorted by: local matches, global matches
|
|
180
|
+
*/
|
|
181
|
+
static searchScoped(query, currentContainer) {
|
|
182
|
+
if (!query || typeof query !== 'string') {
|
|
183
|
+
console.error('❌ [ToolRegistry] Invalid search query:', query);
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
const queryLower = query.toLowerCase();
|
|
187
|
+
console.log(`🔍 [ToolRegistry] Scoped search: "${query}" (container: ${currentContainer || 'none'})`);
|
|
188
|
+
const allTools = Array.from(this.tools.values());
|
|
189
|
+
// Search in tool metadata (including component names)
|
|
190
|
+
const matches = allTools.filter(tool => {
|
|
191
|
+
const searchFields = [
|
|
192
|
+
tool.name,
|
|
193
|
+
tool.description,
|
|
194
|
+
tool.componentName,
|
|
195
|
+
tool.methodName,
|
|
196
|
+
tool.category,
|
|
197
|
+
...(tool.examples || []),
|
|
198
|
+
...(tool.keywords || []),
|
|
199
|
+
]
|
|
200
|
+
.filter(Boolean)
|
|
201
|
+
.map(s => (s || '').toLowerCase()); // Ensure s is not undefined
|
|
202
|
+
return searchFields.some(field => field.includes(queryLower) || queryLower.includes(field));
|
|
203
|
+
});
|
|
204
|
+
if (!currentContainer) {
|
|
205
|
+
return matches;
|
|
206
|
+
}
|
|
207
|
+
// Split into local (current container) and global (no container or different)
|
|
208
|
+
const local = matches.filter(t => t.containerId === currentContainer);
|
|
209
|
+
const global = matches.filter(t => !t.containerId || t.containerId !== currentContainer);
|
|
210
|
+
console.log(`📊 [ToolRegistry] Found: ${local.length} local, ${global.length} global`);
|
|
211
|
+
// Prioritize local over global
|
|
212
|
+
return [...local, ...global];
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get tools by component name
|
|
216
|
+
*
|
|
217
|
+
* Returns all methods for a specific component.
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* getToolsByComponent('counter')
|
|
221
|
+
* // → [counter.increment, counter.decrement, counter.reset]
|
|
222
|
+
*/
|
|
223
|
+
static getToolsByComponent(componentName) {
|
|
224
|
+
return Array.from(this.tools.values()).filter(tool => tool.componentName === componentName);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get tools by container (page scope)
|
|
228
|
+
*/
|
|
229
|
+
static getToolsByContainer(containerId) {
|
|
230
|
+
return Array.from(this.tools.values()).filter(tool => tool.containerId === containerId);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get component names in a container
|
|
234
|
+
*
|
|
235
|
+
* @example
|
|
236
|
+
* getComponentsInContainer('Dashboard')
|
|
237
|
+
* // → ['counter', 'chart', 'settings']
|
|
238
|
+
*/
|
|
239
|
+
static getComponentsInContainer(containerId) {
|
|
240
|
+
const tools = this.getToolsByContainer(containerId);
|
|
241
|
+
const components = new Set(tools.map(t => t.componentName).filter((name) => !!name));
|
|
242
|
+
return Array.from(components);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Find tool by natural language query (alias for searchTools)
|
|
246
|
+
*/
|
|
247
|
+
static findToolsByQuery(query) {
|
|
248
|
+
return this.searchTools(query);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get registry statistics
|
|
252
|
+
*/
|
|
253
|
+
static getStats() {
|
|
254
|
+
const tools = Array.from(this.tools.values());
|
|
255
|
+
const byCategory = tools.reduce((acc, tool) => {
|
|
256
|
+
acc[tool.category] = (acc[tool.category] || 0) + 1;
|
|
257
|
+
return acc;
|
|
258
|
+
}, {});
|
|
259
|
+
const byDangerLevel = tools.reduce((acc, tool) => {
|
|
260
|
+
acc[tool.dangerLevel] = (acc[tool.dangerLevel] || 0) + 1;
|
|
261
|
+
return acc;
|
|
262
|
+
}, { safe: 0, moderate: 0, dangerous: 0, destructive: 0 });
|
|
263
|
+
return {
|
|
264
|
+
total: tools.length,
|
|
265
|
+
aiEnabled: tools.filter((t) => t.aiEnabled).length,
|
|
266
|
+
testOnly: tools.filter((t) => !t.aiEnabled).length,
|
|
267
|
+
byCategory,
|
|
268
|
+
byDangerLevel,
|
|
269
|
+
requiresApproval: tools.filter((t) => t.requiresApproval).length,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get tools by class/provider name
|
|
274
|
+
*/
|
|
275
|
+
static getToolsByProvider(providerName) {
|
|
276
|
+
return Array.from(this.tools.values()).filter((tool) => tool.providerClass === providerName || tool.providerName === providerName);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Get all unique provider names
|
|
280
|
+
*/
|
|
281
|
+
static getProviders() {
|
|
282
|
+
const providers = new Set();
|
|
283
|
+
Array.from(this.tools.values()).forEach((tool) => {
|
|
284
|
+
if (tool.providerClass)
|
|
285
|
+
providers.add(tool.providerClass);
|
|
286
|
+
if (tool.providerName)
|
|
287
|
+
providers.add(tool.providerName);
|
|
288
|
+
});
|
|
289
|
+
return Array.from(providers).sort();
|
|
290
|
+
}
|
|
291
|
+
// ===== CLI-LIKE METHODS =====
|
|
292
|
+
/**
|
|
293
|
+
* List all tools in a CLI-friendly format
|
|
294
|
+
* Similar to 'ls' command
|
|
295
|
+
*/
|
|
296
|
+
static list(options = {}) {
|
|
297
|
+
let tools = Array.from(this.tools.values());
|
|
298
|
+
// Apply filters
|
|
299
|
+
if (options.provider) {
|
|
300
|
+
tools = tools.filter((tool) => tool.providerClass === options.provider || tool.providerName === options.provider);
|
|
301
|
+
}
|
|
302
|
+
if (options.category) {
|
|
303
|
+
tools = tools.filter((tool) => tool.category === options.category);
|
|
304
|
+
}
|
|
305
|
+
if (options.aiEnabled !== undefined) {
|
|
306
|
+
tools = tools.filter((tool) => tool.aiEnabled === options.aiEnabled);
|
|
307
|
+
}
|
|
308
|
+
if (options.dangerLevel) {
|
|
309
|
+
tools = tools.filter((tool) => tool.dangerLevel === options.dangerLevel);
|
|
310
|
+
}
|
|
311
|
+
if (tools.length === 0) {
|
|
312
|
+
return 'No tools found matching criteria.';
|
|
313
|
+
}
|
|
314
|
+
// Sort by provider, then by name
|
|
315
|
+
tools.sort((a, b) => {
|
|
316
|
+
const providerA = a.providerClass || a.providerName || '';
|
|
317
|
+
const providerB = b.providerClass || b.providerName || '';
|
|
318
|
+
if (providerA !== providerB)
|
|
319
|
+
return providerA.localeCompare(providerB);
|
|
320
|
+
return a.name.localeCompare(b.name);
|
|
321
|
+
});
|
|
322
|
+
if (options.verbose) {
|
|
323
|
+
return this.formatVerboseList(tools);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
return this.formatCompactList(tools);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Show help for a specific tool
|
|
331
|
+
* Similar to 'man' or 'help' command
|
|
332
|
+
*/
|
|
333
|
+
static help(toolId) {
|
|
334
|
+
const tool = this.getTool(toolId);
|
|
335
|
+
if (!tool) {
|
|
336
|
+
// Try to find by name or partial match
|
|
337
|
+
const matches = Array.from(this.tools.values()).filter((t) => t.name.toLowerCase().includes(toolId.toLowerCase()) ||
|
|
338
|
+
t.toolId.toLowerCase().includes(toolId.toLowerCase()));
|
|
339
|
+
if (matches.length === 0) {
|
|
340
|
+
return `Tool '${toolId}' not found. Use ToolRegistry.list() to see available tools.`;
|
|
341
|
+
}
|
|
342
|
+
if (matches.length > 1) {
|
|
343
|
+
const matchList = matches.map((t) => ` ${t.toolId} - ${t.name}`).join('\n');
|
|
344
|
+
return `Multiple tools match '${toolId}':\n${matchList}\n\nUse the full toolId for specific help.`;
|
|
345
|
+
}
|
|
346
|
+
return this.formatToolHelp(matches[0]);
|
|
347
|
+
}
|
|
348
|
+
return this.formatToolHelp(tool);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Show overview of all tools and providers
|
|
352
|
+
* Similar to 'ls -la' or directory overview
|
|
353
|
+
*/
|
|
354
|
+
static overview() {
|
|
355
|
+
const stats = this.getStats();
|
|
356
|
+
const providers = this.getProviders();
|
|
357
|
+
let output = `🔧 Tool Registry Overview\n`;
|
|
358
|
+
output += `${'='.repeat(50)}\n\n`;
|
|
359
|
+
output += `📊 Statistics:\n`;
|
|
360
|
+
output += ` Total Tools: ${stats.total}\n`;
|
|
361
|
+
output += ` AI-Enabled: ${stats.aiEnabled}\n`;
|
|
362
|
+
output += ` Test-Only: ${stats.testOnly}\n\n`;
|
|
363
|
+
output += `🏭 Providers (${providers.length}):\n`;
|
|
364
|
+
providers.forEach((provider) => {
|
|
365
|
+
const toolCount = this.getToolsByProvider(provider).length;
|
|
366
|
+
output += ` ${provider} (${toolCount} tools)\n`;
|
|
367
|
+
});
|
|
368
|
+
output += `\n📂 Categories:\n`;
|
|
369
|
+
Object.entries(stats.byCategory).forEach(([category, count]) => {
|
|
370
|
+
output += ` ${category}: ${count} tools\n`;
|
|
371
|
+
});
|
|
372
|
+
output += `\n⚠️ Danger Levels:\n`;
|
|
373
|
+
Object.entries(stats.byDangerLevel).forEach(([level, count]) => {
|
|
374
|
+
const emoji = level === 'safe' ? '✅' : level === 'moderate' ? '⚠️' : level === 'dangerous' ? '🔶' : '🚨';
|
|
375
|
+
output += ` ${emoji} ${level}: ${count} tools\n`;
|
|
376
|
+
});
|
|
377
|
+
output += `\n💡 Usage:\n`;
|
|
378
|
+
output += ` ToolRegistry.list() - List all tools\n`;
|
|
379
|
+
output += ` ToolRegistry.list({ provider: 'X' }) - List tools by provider\n`;
|
|
380
|
+
output += ` ToolRegistry.help('toolId') - Get help for specific tool\n`;
|
|
381
|
+
output += ` ToolRegistry.searchTools('query') - Search tools\n`;
|
|
382
|
+
return output;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Search and display tools matching query
|
|
386
|
+
*/
|
|
387
|
+
static find(query) {
|
|
388
|
+
const matches = this.searchTools(query);
|
|
389
|
+
if (matches.length === 0) {
|
|
390
|
+
return `No tools found matching '${query}'.`;
|
|
391
|
+
}
|
|
392
|
+
let output = `🔍 Found ${matches.length} tool(s) matching '${query}':\n\n`;
|
|
393
|
+
matches.forEach((tool) => {
|
|
394
|
+
const provider = tool.providerClass || tool.providerName || 'Unknown';
|
|
395
|
+
const aiStatus = tool.aiEnabled ? '🤖' : '🧪';
|
|
396
|
+
const dangerEmoji = tool.dangerLevel === 'safe'
|
|
397
|
+
? '✅'
|
|
398
|
+
: tool.dangerLevel === 'moderate'
|
|
399
|
+
? '⚠️'
|
|
400
|
+
: tool.dangerLevel === 'dangerous'
|
|
401
|
+
? '🔶'
|
|
402
|
+
: '🚨';
|
|
403
|
+
output += ` ${aiStatus}${dangerEmoji} ${tool.toolId}\n`;
|
|
404
|
+
output += ` ${tool.description}\n`;
|
|
405
|
+
output += ` Provider: ${provider} | Category: ${tool.category}\n`;
|
|
406
|
+
if (tool.examples && tool.examples.length > 0) {
|
|
407
|
+
output += ` Examples: ${tool.examples.slice(0, 2).join(', ')}\n`;
|
|
408
|
+
}
|
|
409
|
+
output += `\n`;
|
|
410
|
+
});
|
|
411
|
+
output += `💡 Use ToolRegistry.help('toolId') for detailed information.\n`;
|
|
412
|
+
return output;
|
|
413
|
+
}
|
|
414
|
+
// ===== PRIVATE FORMATTING METHODS =====
|
|
415
|
+
static formatCompactList(tools) {
|
|
416
|
+
let output = `📋 Tools (${tools.length}):\n\n`;
|
|
417
|
+
let currentProvider = '';
|
|
418
|
+
tools.forEach((tool) => {
|
|
419
|
+
const provider = tool.providerClass || tool.providerName || 'Unknown';
|
|
420
|
+
if (provider !== currentProvider) {
|
|
421
|
+
currentProvider = provider;
|
|
422
|
+
output += `\n🏭 ${provider}:\n`;
|
|
423
|
+
}
|
|
424
|
+
const aiStatus = tool.aiEnabled ? '🤖' : '🧪';
|
|
425
|
+
const dangerEmoji = tool.dangerLevel === 'safe'
|
|
426
|
+
? '✅'
|
|
427
|
+
: tool.dangerLevel === 'moderate'
|
|
428
|
+
? '⚠️'
|
|
429
|
+
: tool.dangerLevel === 'dangerous'
|
|
430
|
+
? '🔶'
|
|
431
|
+
: '🚨';
|
|
432
|
+
output += ` ${aiStatus}${dangerEmoji} ${tool.toolId.padEnd(25)} ${tool.description}\n`;
|
|
433
|
+
});
|
|
434
|
+
return output;
|
|
435
|
+
}
|
|
436
|
+
static formatVerboseList(tools) {
|
|
437
|
+
let output = `📋 Tools (${tools.length}) - Verbose:\n\n`;
|
|
438
|
+
tools.forEach((tool) => {
|
|
439
|
+
output += this.formatToolSummary(tool) + '\n';
|
|
440
|
+
});
|
|
441
|
+
return output;
|
|
442
|
+
}
|
|
443
|
+
static formatToolSummary(tool) {
|
|
444
|
+
const provider = tool.providerClass || tool.providerName || 'Unknown';
|
|
445
|
+
const aiStatus = tool.aiEnabled ? '🤖 AI-Enabled' : '🧪 Test-Only';
|
|
446
|
+
const dangerEmoji = tool.dangerLevel === 'safe'
|
|
447
|
+
? '✅'
|
|
448
|
+
: tool.dangerLevel === 'moderate'
|
|
449
|
+
? '⚠️'
|
|
450
|
+
: tool.dangerLevel === 'dangerous'
|
|
451
|
+
? '🔶'
|
|
452
|
+
: '🚨';
|
|
453
|
+
let output = `🔧 ${tool.toolId}\n`;
|
|
454
|
+
output += ` Name: ${tool.name}\n`;
|
|
455
|
+
output += ` Description: ${tool.description}\n`;
|
|
456
|
+
output += ` Provider: ${provider}\n`;
|
|
457
|
+
output += ` Category: ${tool.category}\n`;
|
|
458
|
+
output += ` Status: ${aiStatus}\n`;
|
|
459
|
+
output += ` Danger: ${dangerEmoji} ${tool.dangerLevel}\n`;
|
|
460
|
+
if (tool.examples && tool.examples.length > 0) {
|
|
461
|
+
output += ` Examples: ${tool.examples.join(', ')}\n`;
|
|
462
|
+
}
|
|
463
|
+
if (tool.origin) {
|
|
464
|
+
output += ` Origin: ${tool.origin.path || 'N/A'}`;
|
|
465
|
+
if (tool.origin.elements) {
|
|
466
|
+
output += ` (${tool.origin.elements.join(', ')})`;
|
|
467
|
+
}
|
|
468
|
+
output += `\n`;
|
|
469
|
+
}
|
|
470
|
+
return output;
|
|
471
|
+
}
|
|
472
|
+
static formatToolHelp(tool) {
|
|
473
|
+
const provider = tool.providerClass || tool.providerName || 'Unknown';
|
|
474
|
+
const aiStatus = tool.aiEnabled ? '🤖 AI-Enabled' : '🧪 Test-Only';
|
|
475
|
+
const dangerEmoji = tool.dangerLevel === 'safe'
|
|
476
|
+
? '✅'
|
|
477
|
+
: tool.dangerLevel === 'moderate'
|
|
478
|
+
? '⚠️'
|
|
479
|
+
: tool.dangerLevel === 'dangerous'
|
|
480
|
+
? '🔶'
|
|
481
|
+
: '🚨';
|
|
482
|
+
let output = `📖 Help: ${tool.toolId}\n`;
|
|
483
|
+
output += `${'='.repeat(50)}\n\n`;
|
|
484
|
+
output += `📝 Description:\n`;
|
|
485
|
+
output += ` ${tool.description}\n\n`;
|
|
486
|
+
output += `ℹ️ Details:\n`;
|
|
487
|
+
output += ` Name: ${tool.name}\n`;
|
|
488
|
+
output += ` Provider: ${provider}\n`;
|
|
489
|
+
output += ` Category: ${tool.category}\n`;
|
|
490
|
+
output += ` Status: ${aiStatus}\n`;
|
|
491
|
+
output += ` Danger Level: ${dangerEmoji} ${tool.dangerLevel}\n`;
|
|
492
|
+
output += ` Requires Approval: ${tool.requiresApproval ? 'Yes' : 'No'}\n\n`;
|
|
493
|
+
if (tool.examples && tool.examples.length > 0) {
|
|
494
|
+
output += `💡 Usage Examples:\n`;
|
|
495
|
+
tool.examples.forEach((example) => {
|
|
496
|
+
output += ` "${example}"\n`;
|
|
497
|
+
});
|
|
498
|
+
output += `\n`;
|
|
499
|
+
}
|
|
500
|
+
if (tool.origin) {
|
|
501
|
+
output += `📍 Availability:\n`;
|
|
502
|
+
if (tool.origin.path) {
|
|
503
|
+
output += ` Path: ${tool.origin.path}\n`;
|
|
504
|
+
}
|
|
505
|
+
if (tool.origin.elements && tool.origin.elements.length > 0) {
|
|
506
|
+
output += ` Elements: ${tool.origin.elements.join(', ')}\n`;
|
|
507
|
+
}
|
|
508
|
+
if (tool.origin.modal) {
|
|
509
|
+
output += ` Modal: ${tool.origin.modal}\n`;
|
|
510
|
+
}
|
|
511
|
+
output += `\n`;
|
|
512
|
+
}
|
|
513
|
+
if (tool.keywords && tool.keywords.length > 0) {
|
|
514
|
+
output += `🏷️ Keywords: ${tool.keywords.join(', ')}\n\n`;
|
|
515
|
+
}
|
|
516
|
+
if (tool.useCases && tool.useCases.length > 0) {
|
|
517
|
+
output += `🎯 Use Cases:\n`;
|
|
518
|
+
tool.useCases.forEach((useCase) => {
|
|
519
|
+
output += ` • ${useCase}\n`;
|
|
520
|
+
});
|
|
521
|
+
output += `\n`;
|
|
522
|
+
}
|
|
523
|
+
output += `🔧 Technical Details:\n`;
|
|
524
|
+
output += ` Method: ${tool.methodName}\n`;
|
|
525
|
+
output += ` Return Type: ${tool.returnType}\n`;
|
|
526
|
+
output += ` Execution Context: ${tool.executionContext}\n`;
|
|
527
|
+
output += ` Complexity: ${tool.complexity}\n`;
|
|
528
|
+
output += ` Frequency: ${tool.frequency}\n`;
|
|
529
|
+
return output;
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Execute a tool for AI (only if AI-enabled)
|
|
533
|
+
*/
|
|
534
|
+
static async executeForAI(toolIdentifier, parameters = {}) {
|
|
535
|
+
const tool = this.tools.get(toolIdentifier);
|
|
536
|
+
if (!tool) {
|
|
537
|
+
return {
|
|
538
|
+
success: false,
|
|
539
|
+
error: `Tool ${toolIdentifier} not found`,
|
|
540
|
+
tool: toolIdentifier,
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
if (!tool.aiEnabled) {
|
|
544
|
+
return {
|
|
545
|
+
success: false,
|
|
546
|
+
error: `Tool ${toolIdentifier} is not AI-enabled. Use executeForTesting() instead.`,
|
|
547
|
+
tool: toolIdentifier,
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
if (tool.requiresApproval) {
|
|
551
|
+
return {
|
|
552
|
+
success: false,
|
|
553
|
+
error: `Tool ${toolIdentifier} requires approval.`,
|
|
554
|
+
tool: toolIdentifier,
|
|
555
|
+
requiresApproval: true,
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
// For now, just return success - actual execution would need provider instances
|
|
559
|
+
return {
|
|
560
|
+
success: true,
|
|
561
|
+
data: { message: 'Tool executed successfully' },
|
|
562
|
+
tool: toolIdentifier,
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Request approval for a dangerous operation
|
|
567
|
+
*/
|
|
568
|
+
static async requestApproval(toolIdentifier, parameters = {}) {
|
|
569
|
+
// For now, return a mock approval request
|
|
570
|
+
return {
|
|
571
|
+
id: `approval-${Date.now()}`,
|
|
572
|
+
approved: false, // Requires manual approval
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Generate tool documentation
|
|
577
|
+
*/
|
|
578
|
+
static generateDocumentation() {
|
|
579
|
+
const tools = Array.from(this.tools.values());
|
|
580
|
+
const aiEnabledTools = tools.filter((t) => t.aiEnabled);
|
|
581
|
+
const testOnlyTools = tools.filter((t) => !t.aiEnabled);
|
|
582
|
+
let doc = `# Supernal Interface Tools\n\n`;
|
|
583
|
+
doc += `**Total Tools**: ${tools.length}\n`;
|
|
584
|
+
doc += `**AI-Enabled**: ${aiEnabledTools.length}\n`;
|
|
585
|
+
doc += `**Test-Only**: ${testOnlyTools.length}\n\n`;
|
|
586
|
+
doc += `## AI-Enabled Tools\n\n`;
|
|
587
|
+
aiEnabledTools.forEach((tool) => {
|
|
588
|
+
doc += `### ${tool.name}\n`;
|
|
589
|
+
doc += `- **Description**: ${tool.aiDescription || tool.description}\n`;
|
|
590
|
+
doc += `- **Danger Level**: ${tool.dangerLevel}\n`;
|
|
591
|
+
doc += `- **Requires Approval**: ${tool.requiresApproval ? 'Yes' : 'No'}\n`;
|
|
592
|
+
doc += `- **Examples**: ${tool.examples.join(', ')}\n\n`;
|
|
593
|
+
});
|
|
594
|
+
doc += `## Test-Only Tools\n\n`;
|
|
595
|
+
testOnlyTools.forEach((tool) => {
|
|
596
|
+
doc += `### ${tool.name}\n`;
|
|
597
|
+
doc += `- **Description**: ${tool.description}\n`;
|
|
598
|
+
doc += `- **Danger Level**: ${tool.dangerLevel}\n\n`;
|
|
599
|
+
});
|
|
600
|
+
return doc;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Clear all tools (for testing)
|
|
604
|
+
*/
|
|
605
|
+
static clear() {
|
|
606
|
+
this.tools.clear();
|
|
607
|
+
console.log('🧹 ToolRegistry: Cleared all tools');
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Get tools grouped by container for MCP/AI consumption
|
|
611
|
+
*
|
|
612
|
+
* Returns a hierarchical structure:
|
|
613
|
+
* {
|
|
614
|
+
* global: [...tools without containerId...],
|
|
615
|
+
* DemoSimple: [...tools with containerId='DemoSimple'...],
|
|
616
|
+
* Examples: [...tools with containerId='Examples'...],
|
|
617
|
+
* ...
|
|
618
|
+
* }
|
|
619
|
+
*
|
|
620
|
+
* This helps AI agents understand tool organization and prioritize
|
|
621
|
+
* contextually relevant tools.
|
|
622
|
+
*/
|
|
623
|
+
static getToolsGroupedByContainer() {
|
|
624
|
+
const grouped = {
|
|
625
|
+
global: [],
|
|
626
|
+
};
|
|
627
|
+
for (const tool of this.tools.values()) {
|
|
628
|
+
const container = tool.containerId || 'global';
|
|
629
|
+
if (!grouped[container]) {
|
|
630
|
+
grouped[container] = [];
|
|
631
|
+
}
|
|
632
|
+
grouped[container].push(tool);
|
|
633
|
+
}
|
|
634
|
+
return grouped;
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Get tools grouped by component within a container
|
|
638
|
+
*
|
|
639
|
+
* Returns a hierarchical structure:
|
|
640
|
+
* {
|
|
641
|
+
* DemoSimple: {
|
|
642
|
+
* counter: [...counter tools...],
|
|
643
|
+
* timer: [...timer tools...],
|
|
644
|
+
* },
|
|
645
|
+
* global: {
|
|
646
|
+
* navigation: [...navigation tools...],
|
|
647
|
+
* theme: [...theme tools...],
|
|
648
|
+
* }
|
|
649
|
+
* }
|
|
650
|
+
*/
|
|
651
|
+
static getToolsGroupedByComponentAndContainer() {
|
|
652
|
+
const grouped = {};
|
|
653
|
+
for (const tool of this.tools.values()) {
|
|
654
|
+
const container = tool.containerId || 'global';
|
|
655
|
+
const component = tool.componentName || 'ungrouped';
|
|
656
|
+
if (!grouped[container]) {
|
|
657
|
+
grouped[container] = {};
|
|
658
|
+
}
|
|
659
|
+
if (!grouped[container][component]) {
|
|
660
|
+
grouped[container][component] = [];
|
|
661
|
+
}
|
|
662
|
+
grouped[container][component].push(tool);
|
|
663
|
+
}
|
|
664
|
+
return grouped;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
exports.ToolRegistry = ToolRegistry;
|
|
668
|
+
//# sourceMappingURL=ToolRegistry.js.map
|