@framers/agentos 0.1.113 → 0.1.114
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/README.md +39 -5
- package/dist/api/AgentOS.d.ts +45 -12
- package/dist/api/AgentOS.d.ts.map +1 -1
- package/dist/api/AgentOS.js +225 -78
- package/dist/api/AgentOS.js.map +1 -1
- package/dist/api/AgentOSOrchestrator.d.ts +8 -0
- package/dist/api/AgentOSOrchestrator.d.ts.map +1 -1
- package/dist/api/AgentOSOrchestrator.js +350 -59
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/api/StreamChunkEmitter.d.ts.map +1 -1
- package/dist/api/StreamChunkEmitter.js +2 -0
- package/dist/api/StreamChunkEmitter.js.map +1 -1
- package/dist/api/agency.d.ts.map +1 -1
- package/dist/api/agency.js +47 -1
- package/dist/api/agency.js.map +1 -1
- package/dist/api/agent.d.ts +18 -5
- package/dist/api/agent.d.ts.map +1 -1
- package/dist/api/agent.js +48 -9
- package/dist/api/agent.js.map +1 -1
- package/dist/api/agentExport.d.ts +202 -0
- package/dist/api/agentExport.d.ts.map +1 -0
- package/dist/api/agentExport.js +323 -0
- package/dist/api/agentExport.js.map +1 -0
- package/dist/api/editImage.d.ts +119 -0
- package/dist/api/editImage.d.ts.map +1 -0
- package/dist/api/editImage.js +150 -0
- package/dist/api/editImage.js.map +1 -0
- package/dist/api/embedText.d.ts +137 -0
- package/dist/api/embedText.d.ts.map +1 -0
- package/dist/api/embedText.js +229 -0
- package/dist/api/embedText.js.map +1 -0
- package/dist/api/externalToolRegistry.d.ts +44 -0
- package/dist/api/externalToolRegistry.d.ts.map +1 -0
- package/dist/api/externalToolRegistry.js +245 -0
- package/dist/api/externalToolRegistry.js.map +1 -0
- package/dist/api/generateImage.d.ts +1 -1
- package/dist/api/generateImage.d.ts.map +1 -1
- package/dist/api/generateImage.js +17 -13
- package/dist/api/generateImage.js.map +1 -1
- package/dist/api/generateObject.d.ts +185 -0
- package/dist/api/generateObject.d.ts.map +1 -0
- package/dist/api/generateObject.js +249 -0
- package/dist/api/generateObject.js.map +1 -0
- package/dist/api/generateText.d.ts +13 -3
- package/dist/api/generateText.d.ts.map +1 -1
- package/dist/api/generateText.js +20 -5
- package/dist/api/generateText.js.map +1 -1
- package/dist/api/interfaces/IAgentOS.d.ts +29 -1
- package/dist/api/interfaces/IAgentOS.d.ts.map +1 -1
- package/dist/api/model.d.ts +7 -7
- package/dist/api/model.d.ts.map +1 -1
- package/dist/api/model.js +22 -16
- package/dist/api/model.js.map +1 -1
- package/dist/api/processRequestWithExternalTools.d.ts +26 -0
- package/dist/api/processRequestWithExternalTools.d.ts.map +1 -0
- package/dist/api/processRequestWithExternalTools.js +52 -0
- package/dist/api/processRequestWithExternalTools.js.map +1 -0
- package/dist/api/processRequestWithRegisteredTools.d.ts +56 -0
- package/dist/api/processRequestWithRegisteredTools.d.ts.map +1 -0
- package/dist/api/processRequestWithRegisteredTools.js +125 -0
- package/dist/api/processRequestWithRegisteredTools.js.map +1 -0
- package/dist/api/provider-defaults.d.ts.map +1 -1
- package/dist/api/provider-defaults.js +28 -0
- package/dist/api/provider-defaults.js.map +1 -1
- package/dist/api/resumeExternalToolRequestWithRegisteredTools.d.ts +71 -0
- package/dist/api/resumeExternalToolRequestWithRegisteredTools.d.ts.map +1 -0
- package/dist/api/resumeExternalToolRequestWithRegisteredTools.js +159 -0
- package/dist/api/resumeExternalToolRequestWithRegisteredTools.js.map +1 -0
- package/dist/api/strategies/agentGraphBuilder.d.ts +170 -0
- package/dist/api/strategies/agentGraphBuilder.d.ts.map +1 -0
- package/dist/api/strategies/agentGraphBuilder.js +299 -0
- package/dist/api/strategies/agentGraphBuilder.js.map +1 -0
- package/dist/api/strategies/graphCompiler.d.ts +84 -0
- package/dist/api/strategies/graphCompiler.d.ts.map +1 -0
- package/dist/api/strategies/graphCompiler.js +617 -0
- package/dist/api/strategies/graphCompiler.js.map +1 -0
- package/dist/api/strategies/hierarchical.d.ts.map +1 -1
- package/dist/api/strategies/hierarchical.js +2 -1
- package/dist/api/strategies/hierarchical.js.map +1 -1
- package/dist/api/strategies/index.d.ts +3 -0
- package/dist/api/strategies/index.d.ts.map +1 -1
- package/dist/api/strategies/index.js +2 -0
- package/dist/api/strategies/index.js.map +1 -1
- package/dist/api/strategies/shared.d.ts +1 -1
- package/dist/api/strategies/shared.d.ts.map +1 -1
- package/dist/api/strategies/shared.js +3 -2
- package/dist/api/strategies/shared.js.map +1 -1
- package/dist/api/streamObject.d.ts +166 -0
- package/dist/api/streamObject.d.ts.map +1 -0
- package/dist/api/streamObject.js +268 -0
- package/dist/api/streamObject.js.map +1 -0
- package/dist/api/streamText.d.ts +1 -1
- package/dist/api/streamText.d.ts.map +1 -1
- package/dist/api/streamText.js +26 -8
- package/dist/api/streamText.js.map +1 -1
- package/dist/api/toolAdapter.d.ts +44 -8
- package/dist/api/toolAdapter.d.ts.map +1 -1
- package/dist/api/toolAdapter.js +224 -45
- package/dist/api/toolAdapter.js.map +1 -1
- package/dist/api/types/AgentOSExternalToolRequest.d.ts +35 -0
- package/dist/api/types/AgentOSExternalToolRequest.d.ts.map +1 -0
- package/dist/api/types/AgentOSExternalToolRequest.js +2 -0
- package/dist/api/types/AgentOSExternalToolRequest.js.map +1 -0
- package/dist/api/types/AgentOSResponse.d.ts +25 -0
- package/dist/api/types/AgentOSResponse.d.ts.map +1 -1
- package/dist/api/types/AgentOSResponse.js +20 -0
- package/dist/api/types/AgentOSResponse.js.map +1 -1
- package/dist/api/types/AgentOSToolResult.d.ts +11 -0
- package/dist/api/types/AgentOSToolResult.d.ts.map +1 -0
- package/dist/api/types/AgentOSToolResult.js +2 -0
- package/dist/api/types/AgentOSToolResult.js.map +1 -0
- package/dist/api/types.d.ts +28 -4
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/api/upscaleImage.d.ts +92 -0
- package/dist/api/upscaleImage.d.ts.map +1 -0
- package/dist/api/upscaleImage.js +133 -0
- package/dist/api/upscaleImage.js.map +1 -0
- package/dist/api/variateImage.d.ts +102 -0
- package/dist/api/variateImage.d.ts.map +1 -0
- package/dist/api/variateImage.js +154 -0
- package/dist/api/variateImage.js.map +1 -0
- package/dist/cognitive_substrate/GMI.d.ts +16 -2
- package/dist/cognitive_substrate/GMI.d.ts.map +1 -1
- package/dist/cognitive_substrate/GMI.js +188 -56
- package/dist/cognitive_substrate/GMI.js.map +1 -1
- package/dist/cognitive_substrate/IGMI.d.ts +10 -0
- package/dist/cognitive_substrate/IGMI.d.ts.map +1 -1
- package/dist/cognitive_substrate/IGMI.js.map +1 -1
- package/dist/config/AgentOSConfig.d.ts +19 -2
- package/dist/config/AgentOSConfig.d.ts.map +1 -1
- package/dist/config/AgentOSConfig.js +46 -29
- package/dist/config/AgentOSConfig.js.map +1 -1
- package/dist/core/guardrails/IGuardrailService.d.ts +1 -1
- package/dist/core/images/IImageProvider.d.ts +93 -0
- package/dist/core/images/IImageProvider.d.ts.map +1 -1
- package/dist/core/images/IImageProvider.js.map +1 -1
- package/dist/core/images/ImageOperationError.d.ts +52 -0
- package/dist/core/images/ImageOperationError.d.ts.map +1 -0
- package/dist/core/images/ImageOperationError.js +58 -0
- package/dist/core/images/ImageOperationError.js.map +1 -0
- package/dist/core/images/imageToBuffer.d.ts +41 -0
- package/dist/core/images/imageToBuffer.d.ts.map +1 -0
- package/dist/core/images/imageToBuffer.js +95 -0
- package/dist/core/images/imageToBuffer.js.map +1 -0
- package/dist/core/images/index.d.ts +4 -0
- package/dist/core/images/index.d.ts.map +1 -1
- package/dist/core/images/index.js +8 -0
- package/dist/core/images/index.js.map +1 -1
- package/dist/core/images/providers/FalImageProvider.d.ts +208 -0
- package/dist/core/images/providers/FalImageProvider.d.ts.map +1 -0
- package/dist/core/images/providers/FalImageProvider.js +301 -0
- package/dist/core/images/providers/FalImageProvider.js.map +1 -0
- package/dist/core/images/providers/FluxImageProvider.d.ts +197 -0
- package/dist/core/images/providers/FluxImageProvider.d.ts.map +1 -0
- package/dist/core/images/providers/FluxImageProvider.js +271 -0
- package/dist/core/images/providers/FluxImageProvider.js.map +1 -0
- package/dist/core/images/providers/OpenAIImageProvider.d.ts +33 -1
- package/dist/core/images/providers/OpenAIImageProvider.d.ts.map +1 -1
- package/dist/core/images/providers/OpenAIImageProvider.js +125 -0
- package/dist/core/images/providers/OpenAIImageProvider.js.map +1 -1
- package/dist/core/images/providers/ReplicateImageProvider.d.ts +26 -1
- package/dist/core/images/providers/ReplicateImageProvider.d.ts.map +1 -1
- package/dist/core/images/providers/ReplicateImageProvider.js +118 -0
- package/dist/core/images/providers/ReplicateImageProvider.js.map +1 -1
- package/dist/core/images/providers/StabilityImageProvider.d.ts +41 -1
- package/dist/core/images/providers/StabilityImageProvider.d.ts.map +1 -1
- package/dist/core/images/providers/StabilityImageProvider.js +180 -7
- package/dist/core/images/providers/StabilityImageProvider.js.map +1 -1
- package/dist/core/images/providers/StableDiffusionLocalProvider.d.ts +29 -1
- package/dist/core/images/providers/StableDiffusionLocalProvider.d.ts.map +1 -1
- package/dist/core/images/providers/StableDiffusionLocalProvider.js +124 -0
- package/dist/core/images/providers/StableDiffusionLocalProvider.js.map +1 -1
- package/dist/core/llm/IPromptEngine.d.ts +2 -2
- package/dist/core/llm/IPromptEngine.d.ts.map +1 -1
- package/dist/core/llm/IPromptEngine.js +2 -2
- package/dist/core/llm/IPromptEngine.js.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts +7 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.js +24 -0
- package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
- package/dist/core/llm/providers/errors/AnthropicProviderError.d.ts +42 -0
- package/dist/core/llm/providers/errors/AnthropicProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/AnthropicProviderError.js +45 -0
- package/dist/core/llm/providers/errors/AnthropicProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/GeminiProviderError.d.ts +45 -0
- package/dist/core/llm/providers/errors/GeminiProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/GeminiProviderError.js +46 -0
- package/dist/core/llm/providers/errors/GeminiProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/OllamaProviderError.d.ts +1 -1
- package/dist/core/llm/providers/errors/OllamaProviderError.d.ts.map +1 -1
- package/dist/core/llm/providers/errors/OllamaProviderError.js +1 -1
- package/dist/core/llm/providers/errors/OllamaProviderError.js.map +1 -1
- package/dist/core/llm/providers/errors/OpenAIProviderError.d.ts +1 -1
- package/dist/core/llm/providers/errors/OpenAIProviderError.js +1 -1
- package/dist/core/llm/providers/errors/OpenRouterProviderError.d.ts +1 -1
- package/dist/core/llm/providers/errors/OpenRouterProviderError.js +1 -1
- package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts +340 -0
- package/dist/core/llm/providers/implementations/AnthropicProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/AnthropicProvider.js +959 -0
- package/dist/core/llm/providers/implementations/AnthropicProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiProvider.d.ts +339 -0
- package/dist/core/llm/providers/implementations/GeminiProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiProvider.js +1004 -0
- package/dist/core/llm/providers/implementations/GeminiProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/GroqProvider.d.ts +105 -0
- package/dist/core/llm/providers/implementations/GroqProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GroqProvider.js +134 -0
- package/dist/core/llm/providers/implementations/GroqProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/MistralProvider.d.ts +105 -0
- package/dist/core/llm/providers/implementations/MistralProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/MistralProvider.js +146 -0
- package/dist/core/llm/providers/implementations/MistralProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/TogetherProvider.d.ts +107 -0
- package/dist/core/llm/providers/implementations/TogetherProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/TogetherProvider.js +138 -0
- package/dist/core/llm/providers/implementations/TogetherProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/XAIProvider.d.ts +102 -0
- package/dist/core/llm/providers/implementations/XAIProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/XAIProvider.js +123 -0
- package/dist/core/llm/providers/implementations/XAIProvider.js.map +1 -0
- package/dist/core/orchestration/AgentOrchestrator.d.ts.map +1 -1
- package/dist/core/orchestration/AgentOrchestrator.js +26 -5
- package/dist/core/orchestration/AgentOrchestrator.js.map +1 -1
- package/dist/core/tools/IToolOrchestrator.d.ts +2 -2
- package/dist/core/tools/IToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolExecutor.d.ts +3 -0
- package/dist/core/tools/ToolExecutor.d.ts.map +1 -1
- package/dist/core/tools/ToolExecutor.js +2 -1
- package/dist/core/tools/ToolExecutor.js.map +1 -1
- package/dist/core/tools/ToolOrchestrator.d.ts +7 -7
- package/dist/core/tools/ToolOrchestrator.d.ts.map +1 -1
- package/dist/core/tools/ToolOrchestrator.js +135 -36
- package/dist/core/tools/ToolOrchestrator.js.map +1 -1
- package/dist/core/tools/permissions/ToolPermissionManager.d.ts +6 -5
- package/dist/core/tools/permissions/ToolPermissionManager.d.ts.map +1 -1
- package/dist/core/tools/permissions/ToolPermissionManager.js +47 -21
- package/dist/core/tools/permissions/ToolPermissionManager.js.map +1 -1
- package/dist/core/vision/VisionPipeline.d.ts +437 -0
- package/dist/core/vision/VisionPipeline.d.ts.map +1 -0
- package/dist/core/vision/VisionPipeline.js +1113 -0
- package/dist/core/vision/VisionPipeline.js.map +1 -0
- package/dist/core/vision/index.d.ts +97 -0
- package/dist/core/vision/index.d.ts.map +1 -0
- package/dist/core/vision/index.js +182 -0
- package/dist/core/vision/index.js.map +1 -0
- package/dist/core/vision/providers/LLMVisionProvider.d.ts +135 -0
- package/dist/core/vision/providers/LLMVisionProvider.d.ts.map +1 -0
- package/dist/core/vision/providers/LLMVisionProvider.js +136 -0
- package/dist/core/vision/providers/LLMVisionProvider.js.map +1 -0
- package/dist/core/vision/providers/PipelineVisionProvider.d.ts +154 -0
- package/dist/core/vision/providers/PipelineVisionProvider.d.ts.map +1 -0
- package/dist/core/vision/providers/PipelineVisionProvider.js +160 -0
- package/dist/core/vision/providers/PipelineVisionProvider.js.map +1 -0
- package/dist/core/vision/types.d.ts +286 -0
- package/dist/core/vision/types.d.ts.map +1 -0
- package/dist/core/vision/types.js +24 -0
- package/dist/core/vision/types.js.map +1 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/emergent/ComposableToolBuilder.d.ts +15 -4
- package/dist/emergent/ComposableToolBuilder.d.ts.map +1 -1
- package/dist/emergent/ComposableToolBuilder.js +29 -14
- package/dist/emergent/ComposableToolBuilder.js.map +1 -1
- package/dist/emergent/EmergentCapabilityEngine.d.ts +3 -3
- package/dist/emergent/EmergentCapabilityEngine.d.ts.map +1 -1
- package/dist/emergent/EmergentCapabilityEngine.js +15 -12
- package/dist/emergent/EmergentCapabilityEngine.js.map +1 -1
- package/dist/emergent/EmergentJudge.d.ts +20 -0
- package/dist/emergent/EmergentJudge.d.ts.map +1 -1
- package/dist/emergent/EmergentJudge.js +121 -26
- package/dist/emergent/EmergentJudge.js.map +1 -1
- package/dist/emergent/EmergentToolRegistry.d.ts +17 -0
- package/dist/emergent/EmergentToolRegistry.d.ts.map +1 -1
- package/dist/emergent/EmergentToolRegistry.js +26 -0
- package/dist/emergent/EmergentToolRegistry.js.map +1 -1
- package/dist/emergent/ForgeToolMetaTool.d.ts +1 -1
- package/dist/emergent/ForgeToolMetaTool.d.ts.map +1 -1
- package/dist/emergent/ForgeToolMetaTool.js +15 -2
- package/dist/emergent/ForgeToolMetaTool.js.map +1 -1
- package/dist/emergent/SandboxedToolForge.d.ts +2 -2
- package/dist/emergent/SandboxedToolForge.d.ts.map +1 -1
- package/dist/emergent/SandboxedToolForge.js +13 -23
- package/dist/emergent/SandboxedToolForge.js.map +1 -1
- package/dist/emergent/SkillExporter.d.ts +119 -0
- package/dist/emergent/SkillExporter.d.ts.map +1 -0
- package/dist/emergent/SkillExporter.js +344 -0
- package/dist/emergent/SkillExporter.js.map +1 -0
- package/dist/emergent/index.d.ts +1 -0
- package/dist/emergent/index.d.ts.map +1 -1
- package/dist/emergent/index.js +1 -0
- package/dist/emergent/index.js.map +1 -1
- package/dist/emergent/types.d.ts +4 -4
- package/dist/index.d.ts +30 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +10 -8
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/ingestion/DoclingLoader.d.ts +3 -3
- package/dist/memory/ingestion/DoclingLoader.d.ts.map +1 -1
- package/dist/memory/ingestion/DoclingLoader.js +12 -8
- package/dist/memory/ingestion/DoclingLoader.js.map +1 -1
- package/dist/memory/ingestion/FolderScanner.d.ts +7 -7
- package/dist/memory/ingestion/FolderScanner.d.ts.map +1 -1
- package/dist/memory/ingestion/FolderScanner.js +6 -6
- package/dist/memory/ingestion/FolderScanner.js.map +1 -1
- package/dist/memory/ingestion/LoaderRegistry.d.ts +8 -8
- package/dist/memory/ingestion/LoaderRegistry.d.ts.map +1 -1
- package/dist/memory/ingestion/LoaderRegistry.js +9 -11
- package/dist/memory/ingestion/LoaderRegistry.js.map +1 -1
- package/dist/memory/ingestion/MultimodalAggregator.d.ts +1 -1
- package/dist/memory/ingestion/MultimodalAggregator.js +1 -1
- package/dist/memory/ingestion/OcrPdfLoader.d.ts +2 -2
- package/dist/memory/ingestion/OcrPdfLoader.d.ts.map +1 -1
- package/dist/memory/ingestion/OcrPdfLoader.js +12 -8
- package/dist/memory/ingestion/OcrPdfLoader.js.map +1 -1
- package/dist/memory/ingestion/PdfLoader.d.ts +8 -8
- package/dist/memory/ingestion/PdfLoader.d.ts.map +1 -1
- package/dist/memory/ingestion/PdfLoader.js +13 -10
- package/dist/memory/ingestion/PdfLoader.js.map +1 -1
- package/dist/memory/io/MarkdownExporter.d.ts +1 -1
- package/dist/memory/io/MarkdownExporter.d.ts.map +1 -1
- package/dist/memory/io/MarkdownExporter.js +1 -1
- package/dist/memory/io/MarkdownExporter.js.map +1 -1
- package/dist/memory/tools/MemoryAddTool.d.ts +2 -2
- package/dist/memory/tools/MemoryAddTool.d.ts.map +1 -1
- package/dist/memory/tools/MemoryAddTool.js +8 -3
- package/dist/memory/tools/MemoryAddTool.js.map +1 -1
- package/dist/memory/tools/MemorySearchTool.d.ts +3 -3
- package/dist/memory/tools/MemorySearchTool.d.ts.map +1 -1
- package/dist/memory/tools/MemorySearchTool.js +11 -9
- package/dist/memory/tools/MemorySearchTool.js.map +1 -1
- package/dist/memory/tools/scopeContext.d.ts +11 -0
- package/dist/memory/tools/scopeContext.d.ts.map +1 -0
- package/dist/memory/tools/scopeContext.js +46 -0
- package/dist/memory/tools/scopeContext.js.map +1 -0
- package/dist/orchestration/builders/AgentGraph.d.ts +12 -11
- package/dist/orchestration/builders/AgentGraph.d.ts.map +1 -1
- package/dist/orchestration/builders/AgentGraph.js +12 -11
- package/dist/orchestration/builders/AgentGraph.js.map +1 -1
- package/dist/orchestration/builders/VoiceNodeBuilder.d.ts +2 -2
- package/dist/orchestration/builders/VoiceNodeBuilder.d.ts.map +1 -1
- package/dist/orchestration/builders/VoiceNodeBuilder.js +2 -2
- package/dist/orchestration/builders/VoiceNodeBuilder.js.map +1 -1
- package/dist/orchestration/builders/WorkflowBuilder.d.ts +1 -1
- package/dist/orchestration/builders/WorkflowBuilder.d.ts.map +1 -1
- package/dist/orchestration/builders/WorkflowBuilder.js +1 -1
- package/dist/orchestration/builders/WorkflowBuilder.js.map +1 -1
- package/dist/orchestration/checkpoint/InMemoryCheckpointStore.d.ts +7 -54
- package/dist/orchestration/checkpoint/InMemoryCheckpointStore.d.ts.map +1 -1
- package/dist/orchestration/checkpoint/InMemoryCheckpointStore.js +8 -56
- package/dist/orchestration/checkpoint/InMemoryCheckpointStore.js.map +1 -1
- package/dist/orchestration/events/GraphEvent.d.ts +12 -12
- package/dist/orchestration/events/GraphEvent.d.ts.map +1 -1
- package/dist/orchestration/events/GraphEvent.js.map +1 -1
- package/dist/orchestration/runtime/GraphRuntime.d.ts.map +1 -1
- package/dist/orchestration/runtime/GraphRuntime.js +151 -1
- package/dist/orchestration/runtime/GraphRuntime.js.map +1 -1
- package/dist/orchestration/runtime/LoopController.d.ts +3 -3
- package/dist/orchestration/runtime/LoopController.d.ts.map +1 -1
- package/dist/orchestration/runtime/LoopController.js.map +1 -1
- package/dist/orchestration/runtime/StateManager.d.ts +3 -3
- package/dist/orchestration/runtime/StateManager.js +3 -3
- package/dist/orchestration/runtime/VoiceNodeExecutor.d.ts +6 -6
- package/dist/orchestration/runtime/VoiceNodeExecutor.d.ts.map +1 -1
- package/dist/orchestration/runtime/VoiceNodeExecutor.js +27 -10
- package/dist/orchestration/runtime/VoiceNodeExecutor.js.map +1 -1
- package/dist/orchestration/runtime/VoiceTransportAdapter.d.ts +5 -5
- package/dist/orchestration/runtime/VoiceTransportAdapter.js +5 -5
- package/dist/orchestration/runtime/VoiceTurnCollector.d.ts +2 -2
- package/dist/orchestration/runtime/VoiceTurnCollector.js +2 -2
- package/dist/query-router/KeywordFallback.d.ts +70 -0
- package/dist/query-router/KeywordFallback.d.ts.map +1 -0
- package/dist/query-router/KeywordFallback.js +132 -0
- package/dist/query-router/KeywordFallback.js.map +1 -0
- package/dist/query-router/QueryClassifier.d.ts +140 -0
- package/dist/query-router/QueryClassifier.d.ts.map +1 -0
- package/dist/query-router/QueryClassifier.js +223 -0
- package/dist/query-router/QueryClassifier.js.map +1 -0
- package/dist/query-router/QueryDispatcher.d.ts +139 -0
- package/dist/query-router/QueryDispatcher.d.ts.map +1 -0
- package/dist/query-router/QueryDispatcher.js +297 -0
- package/dist/query-router/QueryDispatcher.js.map +1 -0
- package/dist/query-router/QueryGenerator.d.ts +184 -0
- package/dist/query-router/QueryGenerator.d.ts.map +1 -0
- package/dist/query-router/QueryGenerator.js +241 -0
- package/dist/query-router/QueryGenerator.js.map +1 -0
- package/dist/query-router/QueryRouter.d.ts +292 -0
- package/dist/query-router/QueryRouter.d.ts.map +1 -0
- package/dist/query-router/QueryRouter.js +803 -0
- package/dist/query-router/QueryRouter.js.map +1 -0
- package/dist/query-router/TopicExtractor.d.ts +73 -0
- package/dist/query-router/TopicExtractor.d.ts.map +1 -0
- package/dist/query-router/TopicExtractor.js +95 -0
- package/dist/query-router/TopicExtractor.js.map +1 -0
- package/dist/query-router/index.d.ts +40 -0
- package/dist/query-router/index.d.ts.map +1 -0
- package/dist/query-router/index.js +46 -0
- package/dist/query-router/index.js.map +1 -0
- package/dist/query-router/types.d.ts +508 -0
- package/dist/query-router/types.d.ts.map +1 -0
- package/dist/query-router/types.js +39 -0
- package/dist/query-router/types.js.map +1 -0
- package/dist/rag/index.d.ts +5 -0
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +7 -0
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/multimodal/LLMVisionAdapter.d.ts +43 -0
- package/dist/rag/multimodal/LLMVisionAdapter.d.ts.map +1 -0
- package/dist/rag/multimodal/LLMVisionAdapter.js +46 -0
- package/dist/rag/multimodal/LLMVisionAdapter.js.map +1 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts +244 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts.map +1 -0
- package/dist/rag/multimodal/MultimodalIndexer.js +411 -0
- package/dist/rag/multimodal/MultimodalIndexer.js.map +1 -0
- package/dist/rag/multimodal/MultimodalMemoryBridge.d.ts +448 -0
- package/dist/rag/multimodal/MultimodalMemoryBridge.d.ts.map +1 -0
- package/dist/rag/multimodal/MultimodalMemoryBridge.js +941 -0
- package/dist/rag/multimodal/MultimodalMemoryBridge.js.map +1 -0
- package/dist/rag/multimodal/SpeechProviderAdapter.d.ts +139 -0
- package/dist/rag/multimodal/SpeechProviderAdapter.d.ts.map +1 -0
- package/dist/rag/multimodal/SpeechProviderAdapter.js +143 -0
- package/dist/rag/multimodal/SpeechProviderAdapter.js.map +1 -0
- package/dist/rag/multimodal/createMultimodalIndexerFromResolver.d.ts +172 -0
- package/dist/rag/multimodal/createMultimodalIndexerFromResolver.d.ts.map +1 -0
- package/dist/rag/multimodal/createMultimodalIndexerFromResolver.js +152 -0
- package/dist/rag/multimodal/createMultimodalIndexerFromResolver.js.map +1 -0
- package/dist/rag/multimodal/index.d.ts +44 -0
- package/dist/rag/multimodal/index.d.ts.map +1 -0
- package/dist/rag/multimodal/index.js +42 -0
- package/dist/rag/multimodal/index.js.map +1 -0
- package/dist/rag/multimodal/types.d.ts +276 -0
- package/dist/rag/multimodal/types.d.ts.map +1 -0
- package/dist/rag/multimodal/types.js +26 -0
- package/dist/rag/multimodal/types.js.map +1 -0
- package/dist/social-posting/SocialPostManager.d.ts +3 -3
- package/dist/social-posting/SocialPostManager.d.ts.map +1 -1
- package/dist/social-posting/SocialPostManager.js +3 -5
- package/dist/social-posting/SocialPostManager.js.map +1 -1
- package/dist/speech/FallbackProxy.d.ts +6 -6
- package/dist/speech/FallbackProxy.d.ts.map +1 -1
- package/dist/speech/FallbackProxy.js +3 -3
- package/dist/speech/FallbackProxy.js.map +1 -1
- package/dist/speech/SpeechProviderResolver.d.ts +8 -8
- package/dist/speech/SpeechProviderResolver.d.ts.map +1 -1
- package/dist/speech/SpeechProviderResolver.js +22 -11
- package/dist/speech/SpeechProviderResolver.js.map +1 -1
- package/dist/speech/SpeechRuntime.d.ts +1 -5
- package/dist/speech/SpeechRuntime.d.ts.map +1 -1
- package/dist/speech/SpeechRuntime.js +17 -9
- package/dist/speech/SpeechRuntime.js.map +1 -1
- package/dist/speech/providers/AssemblyAISTTProvider.d.ts +4 -4
- package/dist/speech/providers/AssemblyAISTTProvider.js +4 -4
- package/dist/speech/providers/AzureSpeechTTSProvider.d.ts +3 -3
- package/dist/speech/providers/AzureSpeechTTSProvider.js +2 -2
- package/dist/speech/providers/AzureSpeechTTSProvider.js.map +1 -1
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +9 -9
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts.map +1 -1
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.js +5 -5
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.js.map +1 -1
- package/dist/speech/providers/DeepgramBatchSTTProvider.d.ts +2 -2
- package/dist/speech/providers/DeepgramBatchSTTProvider.js +2 -2
- package/dist/speech/providers/OpenAITextToSpeechProvider.d.ts +3 -3
- package/dist/speech/providers/OpenAITextToSpeechProvider.js +2 -2
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts +1 -1
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.d.ts.map +1 -1
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js +1 -1
- package/dist/speech/providers/OpenAIWhisperSpeechToTextProvider.js.map +1 -1
- package/dist/voice/TelephonyStreamTransport.d.ts +6 -6
- package/dist/voice/TelephonyStreamTransport.d.ts.map +1 -1
- package/dist/voice/TelephonyStreamTransport.js +5 -5
- package/dist/voice/TelephonyStreamTransport.js.map +1 -1
- package/dist/voice-pipeline/AcousticEndpointDetector.d.ts +4 -4
- package/dist/voice-pipeline/AcousticEndpointDetector.d.ts.map +1 -1
- package/dist/voice-pipeline/AcousticEndpointDetector.js +4 -4
- package/dist/voice-pipeline/AcousticEndpointDetector.js.map +1 -1
- package/dist/voice-pipeline/HardCutBargeinHandler.d.ts +3 -3
- package/dist/voice-pipeline/HardCutBargeinHandler.js +3 -3
- package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts +3 -3
- package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts.map +1 -1
- package/dist/voice-pipeline/HeuristicEndpointDetector.js +3 -3
- package/dist/voice-pipeline/HeuristicEndpointDetector.js.map +1 -1
- package/dist/voice-pipeline/SoftFadeBargeinHandler.d.ts +5 -5
- package/dist/voice-pipeline/SoftFadeBargeinHandler.js +1 -1
- package/dist/voice-pipeline/VoiceInterruptError.d.ts +6 -6
- package/dist/voice-pipeline/VoiceInterruptError.d.ts.map +1 -1
- package/dist/voice-pipeline/VoiceInterruptError.js +4 -4
- package/dist/voice-pipeline/VoiceInterruptError.js.map +1 -1
- package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts +9 -9
- package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts.map +1 -1
- package/dist/voice-pipeline/VoicePipelineOrchestrator.js +8 -8
- package/dist/voice-pipeline/VoicePipelineOrchestrator.js.map +1 -1
- package/dist/voice-pipeline/WebRTCStreamTransport.d.ts +421 -0
- package/dist/voice-pipeline/WebRTCStreamTransport.d.ts.map +1 -0
- package/dist/voice-pipeline/WebRTCStreamTransport.js +573 -0
- package/dist/voice-pipeline/WebRTCStreamTransport.js.map +1 -0
- package/dist/voice-pipeline/WebSocketStreamTransport.d.ts +8 -8
- package/dist/voice-pipeline/WebSocketStreamTransport.js +5 -5
- package/dist/voice-pipeline/index.d.ts +1 -0
- package/dist/voice-pipeline/index.d.ts.map +1 -1
- package/dist/voice-pipeline/index.js +2 -0
- package/dist/voice-pipeline/index.js.map +1 -1
- package/dist/voice-pipeline/types.d.ts +43 -43
- package/dist/voice-pipeline/types.d.ts.map +1 -1
- package/package.json +19 -1
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module voice-pipeline/WebRTCStreamTransport
|
|
3
|
+
*
|
|
4
|
+
* A concrete {@link IStreamTransport} implementation that wraps a WebRTC
|
|
5
|
+
* `RTCPeerConnection` and its DataChannels for bidirectional audio/text
|
|
6
|
+
* streaming. Provides lower latency than WebSocket by using unreliable/
|
|
7
|
+
* unordered DataChannels (UDP-like semantics) for audio frames and a
|
|
8
|
+
* reliable/ordered channel for control messages.
|
|
9
|
+
*
|
|
10
|
+
* ## Channel architecture
|
|
11
|
+
*
|
|
12
|
+
* Two DataChannels are created on the connection:
|
|
13
|
+
*
|
|
14
|
+
* | Channel | Label | Ordered | Reliable | Purpose |
|
|
15
|
+
* |-----------|-------------|---------|----------|----------------------------------|
|
|
16
|
+
* | Audio | `'audio'` | No | No | Low-latency PCM frame transport |
|
|
17
|
+
* | Control | `'control'` | Yes | Yes | JSON control messages (lossless) |
|
|
18
|
+
*
|
|
19
|
+
* The audio channel uses `maxRetransmits: 0` (fire-and-forget) because
|
|
20
|
+
* real-time voice tolerates occasional packet loss better than added
|
|
21
|
+
* latency from retransmissions. The control channel uses default TCP-like
|
|
22
|
+
* reliability since protocol messages (mute/unmute/stop) must arrive.
|
|
23
|
+
*
|
|
24
|
+
* ## Wire protocol
|
|
25
|
+
*
|
|
26
|
+
* ### Audio channel (binary)
|
|
27
|
+
* Each message is a raw `ArrayBuffer` containing Float32Array PCM samples.
|
|
28
|
+
* The transport reconstructs the Float32Array and wraps it in an
|
|
29
|
+
* {@link AudioFrame} with the configured sample rate.
|
|
30
|
+
*
|
|
31
|
+
* ### Control channel (text)
|
|
32
|
+
* Each message is a JSON string conforming to {@link ClientTextMessage}
|
|
33
|
+
* (inbound) or {@link ServerTextMessage} (outbound). Malformed JSON
|
|
34
|
+
* emits an `'error'` event without crashing the transport.
|
|
35
|
+
*
|
|
36
|
+
* ## Native dependency
|
|
37
|
+
* Node.js does not ship a built-in WebRTC stack. This transport requires
|
|
38
|
+
* the `wrtc` npm package (or a compatible polyfill) as an optional peer
|
|
39
|
+
* dependency. A helpful error is thrown at construction time if the
|
|
40
|
+
* package is not installed.
|
|
41
|
+
*
|
|
42
|
+
* @see {@link IStreamTransport} for the interface contract.
|
|
43
|
+
* @see {@link WebSocketStreamTransport} for the WebSocket-based sibling.
|
|
44
|
+
* @see {@link VoicePipelineOrchestrator} which consumes this transport.
|
|
45
|
+
*/
|
|
46
|
+
import { EventEmitter } from 'node:events';
|
|
47
|
+
import { randomUUID } from 'node:crypto';
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Implementation
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
/**
|
|
52
|
+
* Bidirectional voice pipeline transport backed by WebRTC DataChannels.
|
|
53
|
+
*
|
|
54
|
+
* Uses two DataChannels for optimal voice streaming:
|
|
55
|
+
* - An **unreliable, unordered** `audio` channel for PCM frames (minimal
|
|
56
|
+
* latency, tolerates packet loss).
|
|
57
|
+
* - A **reliable, ordered** `control` channel for JSON control messages
|
|
58
|
+
* (mute/unmute/stop/config).
|
|
59
|
+
*
|
|
60
|
+
* ## Lifecycle
|
|
61
|
+
*
|
|
62
|
+
* 1. Construct with an existing {@link RTCPeerConnectionLike}.
|
|
63
|
+
* 2. Call `initialize` to create DataChannels and wire up handlers.
|
|
64
|
+
* 3. The transport is `'open'` once both DataChannels reach `'open'` state.
|
|
65
|
+
* 4. Call `close` to tear down channels and the peer connection.
|
|
66
|
+
*
|
|
67
|
+
* ## Events emitted
|
|
68
|
+
*
|
|
69
|
+
* | Event | Payload | Description |
|
|
70
|
+
* |------------------|------------------------------|---------------------------------------|
|
|
71
|
+
* | `'audio_frame'` | {@link AudioFrame} | Inbound audio from the remote peer. |
|
|
72
|
+
* | `'control'` | {@link ClientTextMessage} | Inbound JSON control message. |
|
|
73
|
+
* | `'connected'` | *(none)* | Both DataChannels are open. |
|
|
74
|
+
* | `'disconnected'` | *(none)* | Connection has been closed. |
|
|
75
|
+
* | `'error'` | `Error` | Transport-level error. |
|
|
76
|
+
* | `'ice_candidate'`| ICE candidate object | Local ICE candidate for signaling. |
|
|
77
|
+
*
|
|
78
|
+
* @fires audio_frame - `(frame: AudioFrame)` for every inbound audio message.
|
|
79
|
+
* @fires control - `(msg: ClientTextMessage)` for every inbound control message.
|
|
80
|
+
* @fires connected - Both DataChannels have reached 'open' state.
|
|
81
|
+
* @fires disconnected - Peer connection has been closed.
|
|
82
|
+
* @fires error - Transport-level error occurred.
|
|
83
|
+
* @fires ice_candidate - Local ICE candidate available for the signaling layer.
|
|
84
|
+
*
|
|
85
|
+
* @see {@link IStreamTransport} for the interface contract.
|
|
86
|
+
* @see {@link WebSocketStreamTransport} for the WebSocket-based sibling.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```typescript
|
|
90
|
+
* import { WebRTCStreamTransport } from '../voice-pipeline/index.js';
|
|
91
|
+
*
|
|
92
|
+
* // Receive RTCPeerConnection from your signaling server
|
|
93
|
+
* const transport = new WebRTCStreamTransport(peerConnection, { sampleRate: 16000 });
|
|
94
|
+
* await transport.initialize();
|
|
95
|
+
*
|
|
96
|
+
* transport.on('audio_frame', (frame) => sttSession.pushAudio(frame));
|
|
97
|
+
* transport.on('control', (msg) => handleClientMessage(msg));
|
|
98
|
+
* transport.on('ice_candidate', (candidate) => signalingChannel.send(candidate));
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
export class WebRTCStreamTransport extends EventEmitter {
|
|
102
|
+
// -------------------------------------------------------------------------
|
|
103
|
+
// Constructor
|
|
104
|
+
// -------------------------------------------------------------------------
|
|
105
|
+
/**
|
|
106
|
+
* Create a new WebRTC transport wrapping an existing peer connection.
|
|
107
|
+
*
|
|
108
|
+
* The transport starts in `'connecting'` state and transitions to
|
|
109
|
+
* `'open'` once both DataChannels are established and open.
|
|
110
|
+
*
|
|
111
|
+
* @param peerConnection - An existing RTCPeerConnection (from the `wrtc`
|
|
112
|
+
* package or a browser-compatible polyfill). The connection should be
|
|
113
|
+
* in `'new'` or `'connecting'` state — the transport will create
|
|
114
|
+
* DataChannels on it.
|
|
115
|
+
* @param config - Transport-level configuration (must include sampleRate).
|
|
116
|
+
*
|
|
117
|
+
* @throws {Error} If `peerConnection` is null/undefined.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```typescript
|
|
121
|
+
* const pc = new RTCPeerConnection({ iceServers: [...] });
|
|
122
|
+
* const transport = new WebRTCStreamTransport(pc, { sampleRate: 16000 });
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
constructor(peerConnection, config) {
|
|
126
|
+
super();
|
|
127
|
+
/**
|
|
128
|
+
* Unreliable/unordered DataChannel for audio frame transport.
|
|
129
|
+
* Created during `initialize`. `null` until then.
|
|
130
|
+
*/
|
|
131
|
+
this._audioChannel = null;
|
|
132
|
+
/**
|
|
133
|
+
* Reliable/ordered DataChannel for JSON control messages.
|
|
134
|
+
* Created during `initialize`. `null` until then.
|
|
135
|
+
*/
|
|
136
|
+
this._controlChannel = null;
|
|
137
|
+
if (!peerConnection) {
|
|
138
|
+
throw new Error('WebRTCStreamTransport: peerConnection is required. ' +
|
|
139
|
+
'Pass an RTCPeerConnection instance from the `wrtc` package or a compatible polyfill.');
|
|
140
|
+
}
|
|
141
|
+
this._pc = peerConnection;
|
|
142
|
+
this._sampleRate = config.sampleRate;
|
|
143
|
+
this._config = config;
|
|
144
|
+
this.id = randomUUID();
|
|
145
|
+
// Always start as connecting — we need both DataChannels to be open
|
|
146
|
+
// before the transport is usable.
|
|
147
|
+
this._state = 'connecting';
|
|
148
|
+
}
|
|
149
|
+
// -------------------------------------------------------------------------
|
|
150
|
+
// IStreamTransport -- public surface
|
|
151
|
+
// -------------------------------------------------------------------------
|
|
152
|
+
/**
|
|
153
|
+
* Current connection state of the WebRTC transport.
|
|
154
|
+
*
|
|
155
|
+
* The transport is `'open'` only when both DataChannels (audio + control)
|
|
156
|
+
* have reached their `'open'` readyState. Any earlier state maps to
|
|
157
|
+
* `'connecting'`, and any teardown maps to `'closing'` or `'closed'`.
|
|
158
|
+
*/
|
|
159
|
+
get state() {
|
|
160
|
+
return this._state;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create DataChannels and wire up all event handlers.
|
|
164
|
+
*
|
|
165
|
+
* This must be called after construction and before any send operations.
|
|
166
|
+
* It creates the `audio` (unreliable) and `control` (reliable)
|
|
167
|
+
* DataChannels on the peer connection and sets up message handlers.
|
|
168
|
+
*
|
|
169
|
+
* The transport transitions to `'open'` once both channels report
|
|
170
|
+
* readyState `'open'`.
|
|
171
|
+
*
|
|
172
|
+
* @returns Resolves when DataChannels are created (not necessarily open yet).
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const transport = new WebRTCStreamTransport(pc, { sampleRate: 16000 });
|
|
177
|
+
* await transport.initialize();
|
|
178
|
+
* // transport.state may still be 'connecting' until ICE completes
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
async initialize() {
|
|
182
|
+
// Create the unreliable audio channel — unordered + no retransmits
|
|
183
|
+
// gives UDP-like semantics ideal for real-time audio where latency
|
|
184
|
+
// matters more than guaranteed delivery.
|
|
185
|
+
this._audioChannel = this._pc.createDataChannel('audio', {
|
|
186
|
+
ordered: false,
|
|
187
|
+
maxRetransmits: 0,
|
|
188
|
+
});
|
|
189
|
+
this._audioChannel.binaryType = 'arraybuffer';
|
|
190
|
+
// Create the reliable control channel — ordered + reliable (defaults)
|
|
191
|
+
// ensures JSON protocol messages arrive in sequence and without loss.
|
|
192
|
+
this._controlChannel = this._pc.createDataChannel('control', {
|
|
193
|
+
ordered: true,
|
|
194
|
+
});
|
|
195
|
+
this._attachAudioChannelHandlers(this._audioChannel);
|
|
196
|
+
this._attachControlChannelHandlers(this._controlChannel);
|
|
197
|
+
this._attachPeerConnectionHandlers();
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Send a synthesised audio chunk to the remote peer for playback.
|
|
201
|
+
*
|
|
202
|
+
* If the payload is an {@link EncodedAudioChunk} (has an `audio` Buffer
|
|
203
|
+
* property), that buffer's underlying ArrayBuffer is sent. If it is an
|
|
204
|
+
* {@link AudioFrame} (has a `samples` Float32Array), the samples'
|
|
205
|
+
* underlying ArrayBuffer is sent.
|
|
206
|
+
*
|
|
207
|
+
* @param chunk - Encoded audio chunk or raw PCM frame to deliver.
|
|
208
|
+
* @returns Resolves once the data has been handed to the DataChannel.
|
|
209
|
+
*
|
|
210
|
+
* @throws {Error} If the audio channel is not open or not initialized.
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* await transport.sendAudio({
|
|
215
|
+
* audio: Buffer.from(opusBytes),
|
|
216
|
+
* format: 'opus',
|
|
217
|
+
* sampleRate: 24000,
|
|
218
|
+
* durationMs: 20,
|
|
219
|
+
* text: 'Hello!',
|
|
220
|
+
* });
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
sendAudio(chunk) {
|
|
224
|
+
return new Promise((resolve, reject) => {
|
|
225
|
+
if (!this._audioChannel) {
|
|
226
|
+
reject(new Error('WebRTCStreamTransport: audio channel not initialized. Call initialize() first.'));
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (this._audioChannel.readyState !== 'open') {
|
|
230
|
+
reject(new Error(`WebRTCStreamTransport: audio channel is "${this._audioChannel.readyState}", not "open".`));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
let arrayBuffer;
|
|
235
|
+
if ('audio' in chunk) {
|
|
236
|
+
// EncodedAudioChunk path: extract the ArrayBuffer from the Buffer.
|
|
237
|
+
// Buffer.buffer may be a shared pool allocation, so we slice to get
|
|
238
|
+
// only the relevant portion.
|
|
239
|
+
const buf = chunk.audio;
|
|
240
|
+
arrayBuffer = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
// AudioFrame path: send the Float32Array's backing ArrayBuffer.
|
|
244
|
+
// Same slicing concern as above — the Float32Array may be a view
|
|
245
|
+
// into a larger buffer.
|
|
246
|
+
const frame = chunk;
|
|
247
|
+
arrayBuffer = frame.samples.buffer.slice(frame.samples.byteOffset, frame.samples.byteOffset + frame.samples.byteLength);
|
|
248
|
+
}
|
|
249
|
+
this._audioChannel.send(arrayBuffer);
|
|
250
|
+
resolve();
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
reject(err);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Send a JSON control message to the remote peer.
|
|
259
|
+
*
|
|
260
|
+
* The message is JSON-stringified before transmission on the reliable
|
|
261
|
+
* control channel. Both {@link TransportControlMessage} and
|
|
262
|
+
* {@link ServerTextMessage} are accepted since they share the same
|
|
263
|
+
* serialisation path.
|
|
264
|
+
*
|
|
265
|
+
* @param msg - Server-side protocol message.
|
|
266
|
+
* @returns Resolves once the message has been handed to the DataChannel.
|
|
267
|
+
*
|
|
268
|
+
* @throws {Error} If the control channel is not open or not initialized.
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* ```typescript
|
|
272
|
+
* await transport.sendControl({ type: 'mute' });
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
sendControl(msg) {
|
|
276
|
+
return new Promise((resolve, reject) => {
|
|
277
|
+
if (!this._controlChannel) {
|
|
278
|
+
reject(new Error('WebRTCStreamTransport: control channel not initialized. Call initialize() first.'));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (this._controlChannel.readyState !== 'open') {
|
|
282
|
+
reject(new Error(`WebRTCStreamTransport: control channel is "${this._controlChannel.readyState}", not "open".`));
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
this._controlChannel.send(JSON.stringify(msg));
|
|
287
|
+
resolve();
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
reject(err);
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Initiate a graceful close of the transport.
|
|
296
|
+
*
|
|
297
|
+
* Closes both DataChannels and the underlying peer connection.
|
|
298
|
+
* The `'disconnected'` event fires once the connection has fully closed.
|
|
299
|
+
*
|
|
300
|
+
* @param _code - Ignored for WebRTC (included for IStreamTransport compat).
|
|
301
|
+
* @param _reason - Ignored for WebRTC (included for IStreamTransport compat).
|
|
302
|
+
*/
|
|
303
|
+
close(_code, _reason) {
|
|
304
|
+
this._state = 'closing';
|
|
305
|
+
// Close DataChannels first — this triggers their onclose handlers
|
|
306
|
+
// which will check whether the transport should transition to 'closed'.
|
|
307
|
+
if (this._audioChannel && this._audioChannel.readyState !== 'closed') {
|
|
308
|
+
this._audioChannel.close();
|
|
309
|
+
}
|
|
310
|
+
if (this._controlChannel && this._controlChannel.readyState !== 'closed') {
|
|
311
|
+
this._controlChannel.close();
|
|
312
|
+
}
|
|
313
|
+
// Close the peer connection, which releases all network resources.
|
|
314
|
+
if (this._pc.connectionState !== 'closed') {
|
|
315
|
+
this._pc.close();
|
|
316
|
+
}
|
|
317
|
+
this._state = 'closed';
|
|
318
|
+
this.emit('disconnected');
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Add a remote ICE candidate received through the signaling channel.
|
|
322
|
+
*
|
|
323
|
+
* WebRTC requires ICE candidate exchange for NAT traversal. The signaling
|
|
324
|
+
* server should forward remote candidates to this method.
|
|
325
|
+
*
|
|
326
|
+
* @param candidate - The ICE candidate object from the remote peer, or
|
|
327
|
+
* `null` to signal end-of-candidates.
|
|
328
|
+
* @returns Resolves when the candidate has been added to the connection.
|
|
329
|
+
*
|
|
330
|
+
* @throws {Error} If the candidate is invalid or the connection is closed.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* signalingChannel.on('ice_candidate', async (candidate) => {
|
|
335
|
+
* await transport.addIceCandidate(candidate);
|
|
336
|
+
* });
|
|
337
|
+
* ```
|
|
338
|
+
*/
|
|
339
|
+
async addIceCandidate(candidate) {
|
|
340
|
+
await this._pc.addIceCandidate(candidate);
|
|
341
|
+
}
|
|
342
|
+
// -------------------------------------------------------------------------
|
|
343
|
+
// Private helpers
|
|
344
|
+
// -------------------------------------------------------------------------
|
|
345
|
+
/**
|
|
346
|
+
* Attach message and lifecycle handlers to the audio DataChannel.
|
|
347
|
+
*
|
|
348
|
+
* Inbound binary messages are decoded as Float32Array PCM samples and
|
|
349
|
+
* emitted as `'audio_frame'` events. This channel uses arraybuffer
|
|
350
|
+
* binary type for efficient binary transfer.
|
|
351
|
+
*
|
|
352
|
+
* @param channel - The audio DataChannel to attach handlers to.
|
|
353
|
+
*/
|
|
354
|
+
_attachAudioChannelHandlers(channel) {
|
|
355
|
+
channel.onmessage = (event) => {
|
|
356
|
+
try {
|
|
357
|
+
// DataChannel messages arrive as ArrayBuffer when binaryType is set.
|
|
358
|
+
// Guard against unexpected string messages on the audio channel.
|
|
359
|
+
const raw = event.data;
|
|
360
|
+
if (!(raw instanceof ArrayBuffer)) {
|
|
361
|
+
this.emit('error', new Error('WebRTCStreamTransport: received non-binary message on audio channel'));
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
// Create a Float32Array view over the received ArrayBuffer.
|
|
365
|
+
// Each float is 4 bytes, so byteLength / 4 gives the sample count.
|
|
366
|
+
const samples = new Float32Array(raw);
|
|
367
|
+
const frame = {
|
|
368
|
+
samples,
|
|
369
|
+
sampleRate: this._sampleRate,
|
|
370
|
+
timestamp: Date.now(),
|
|
371
|
+
};
|
|
372
|
+
this.emit('audio_frame', frame);
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
this.emit('error', new Error(`WebRTCStreamTransport: error processing audio message: ${String(err)}`));
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
channel.onopen = () => {
|
|
379
|
+
// Check if both channels are now open to transition the transport
|
|
380
|
+
this._checkBothChannelsOpen();
|
|
381
|
+
};
|
|
382
|
+
channel.onclose = () => {
|
|
383
|
+
// If the audio channel closes unexpectedly, surface the disconnection
|
|
384
|
+
if (this._state === 'open') {
|
|
385
|
+
this._state = 'closed';
|
|
386
|
+
this.emit('disconnected');
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
channel.onerror = (event) => {
|
|
390
|
+
this.emit('error', new Error(`WebRTCStreamTransport: audio channel error: ${String(event)}`));
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Attach message and lifecycle handlers to the control DataChannel.
|
|
395
|
+
*
|
|
396
|
+
* Inbound text messages are JSON-parsed as {@link ClientTextMessage}
|
|
397
|
+
* and emitted as `'control'` events. Malformed JSON triggers an
|
|
398
|
+
* `'error'` event without crashing the transport.
|
|
399
|
+
*
|
|
400
|
+
* @param channel - The control DataChannel to attach handlers to.
|
|
401
|
+
*/
|
|
402
|
+
_attachControlChannelHandlers(channel) {
|
|
403
|
+
channel.onmessage = (event) => {
|
|
404
|
+
try {
|
|
405
|
+
const text = typeof event.data === 'string' ? event.data : String(event.data);
|
|
406
|
+
const msg = JSON.parse(text);
|
|
407
|
+
this.emit('control', msg);
|
|
408
|
+
}
|
|
409
|
+
catch (err) {
|
|
410
|
+
// Malformed JSON should not crash the transport — emit an error
|
|
411
|
+
// and let the session continue processing valid messages.
|
|
412
|
+
this.emit('error', new Error(`WebRTCStreamTransport: failed to parse control message as JSON: ${String(err)}`));
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
channel.onopen = () => {
|
|
416
|
+
// Check if both channels are now open to transition the transport
|
|
417
|
+
this._checkBothChannelsOpen();
|
|
418
|
+
};
|
|
419
|
+
channel.onclose = () => {
|
|
420
|
+
// If the control channel closes unexpectedly, surface the disconnection
|
|
421
|
+
if (this._state === 'open') {
|
|
422
|
+
this._state = 'closed';
|
|
423
|
+
this.emit('disconnected');
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
channel.onerror = (event) => {
|
|
427
|
+
this.emit('error', new Error(`WebRTCStreamTransport: control channel error: ${String(event)}`));
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Attach handlers to the peer connection for ICE candidate exchange
|
|
432
|
+
* and connection state monitoring.
|
|
433
|
+
*
|
|
434
|
+
* ICE candidates are re-emitted as `'ice_candidate'` events so the
|
|
435
|
+
* consumer can relay them to the remote peer via a signaling channel.
|
|
436
|
+
* Connection state changes are mapped to transport state transitions.
|
|
437
|
+
*/
|
|
438
|
+
_attachPeerConnectionHandlers() {
|
|
439
|
+
// Forward local ICE candidates to the consumer for signaling.
|
|
440
|
+
// Without this, NAT traversal cannot complete because the remote
|
|
441
|
+
// peer won't know how to reach us.
|
|
442
|
+
this._pc.onicecandidate = (event) => {
|
|
443
|
+
if (event.candidate) {
|
|
444
|
+
this.emit('ice_candidate', event.candidate);
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
// Map peer connection state changes to transport lifecycle events.
|
|
448
|
+
// The connectionState property aggregates ICE + DTLS state into a
|
|
449
|
+
// single human-readable enum.
|
|
450
|
+
this._pc.onconnectionstatechange = () => {
|
|
451
|
+
const pcState = this._pc.connectionState;
|
|
452
|
+
switch (pcState) {
|
|
453
|
+
case 'connected':
|
|
454
|
+
// Peer connection is fully established. DataChannel open events
|
|
455
|
+
// may fire before or after this — _checkBothChannelsOpen handles
|
|
456
|
+
// the actual 'open' transition.
|
|
457
|
+
break;
|
|
458
|
+
case 'disconnected':
|
|
459
|
+
// Transient network disruption — ICE may recover automatically.
|
|
460
|
+
// We don't transition to 'closed' yet, but surface the event.
|
|
461
|
+
if (this._state === 'open') {
|
|
462
|
+
this.emit('error', new Error('WebRTCStreamTransport: peer connection disconnected (may recover)'));
|
|
463
|
+
}
|
|
464
|
+
break;
|
|
465
|
+
case 'failed':
|
|
466
|
+
// ICE/DTLS negotiation failed permanently. Tear down the transport.
|
|
467
|
+
this._state = 'closed';
|
|
468
|
+
this.emit('error', new Error('WebRTCStreamTransport: peer connection failed'));
|
|
469
|
+
this.emit('disconnected');
|
|
470
|
+
break;
|
|
471
|
+
case 'closed':
|
|
472
|
+
// Connection was closed (by us or the remote peer).
|
|
473
|
+
if (this._state !== 'closed') {
|
|
474
|
+
this._state = 'closed';
|
|
475
|
+
this.emit('disconnected');
|
|
476
|
+
}
|
|
477
|
+
break;
|
|
478
|
+
default:
|
|
479
|
+
// 'new' | 'connecting' — no action needed
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
// Handle DataChannels created by the remote peer (e.g. if the remote
|
|
484
|
+
// side creates channels instead of us). This supports both offerer
|
|
485
|
+
// and answerer roles.
|
|
486
|
+
this._pc.ondatachannel = (event) => {
|
|
487
|
+
const channel = event.channel;
|
|
488
|
+
if (channel.label === 'audio') {
|
|
489
|
+
channel.binaryType = 'arraybuffer';
|
|
490
|
+
this._audioChannel = channel;
|
|
491
|
+
this._attachAudioChannelHandlers(channel);
|
|
492
|
+
}
|
|
493
|
+
else if (channel.label === 'control') {
|
|
494
|
+
this._controlChannel = channel;
|
|
495
|
+
this._attachControlChannelHandlers(channel);
|
|
496
|
+
}
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Check if both DataChannels are in the `'open'` readyState.
|
|
501
|
+
*
|
|
502
|
+
* Called from each channel's `onopen` handler. Only transitions the
|
|
503
|
+
* transport to `'open'` state once BOTH channels are ready, since
|
|
504
|
+
* sending on a non-open channel would throw.
|
|
505
|
+
*/
|
|
506
|
+
_checkBothChannelsOpen() {
|
|
507
|
+
const audioOpen = this._audioChannel?.readyState === 'open';
|
|
508
|
+
const controlOpen = this._controlChannel?.readyState === 'open';
|
|
509
|
+
if (audioOpen && controlOpen && this._state === 'connecting') {
|
|
510
|
+
this._state = 'open';
|
|
511
|
+
this.emit('connected');
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
// ---------------------------------------------------------------------------
|
|
516
|
+
// Factory helper for creating a transport with a new RTCPeerConnection
|
|
517
|
+
// ---------------------------------------------------------------------------
|
|
518
|
+
/**
|
|
519
|
+
* Create a WebRTC transport with a fresh RTCPeerConnection from the `wrtc`
|
|
520
|
+
* package. This is a convenience factory for server-side usage where a
|
|
521
|
+
* pre-existing connection is not available.
|
|
522
|
+
*
|
|
523
|
+
* The `wrtc` package is loaded via dynamic import to keep it as an
|
|
524
|
+
* optional peer dependency. If the package is not installed, a descriptive
|
|
525
|
+
* error is thrown.
|
|
526
|
+
*
|
|
527
|
+
* @param config - Transport configuration including sample rate and ICE servers.
|
|
528
|
+
* @returns A new {@link WebRTCStreamTransport} wrapping a fresh peer connection.
|
|
529
|
+
*
|
|
530
|
+
* @throws {Error} If the `wrtc` package is not installed or importable.
|
|
531
|
+
*
|
|
532
|
+
* @example
|
|
533
|
+
* ```typescript
|
|
534
|
+
* const transport = await createWebRTCTransport({
|
|
535
|
+
* sampleRate: 16000,
|
|
536
|
+
* iceServers: [{ urls: 'stun:stun.l.google.com:19302' }],
|
|
537
|
+
* });
|
|
538
|
+
* await transport.initialize();
|
|
539
|
+
* ```
|
|
540
|
+
*/
|
|
541
|
+
export async function createWebRTCTransport(config) {
|
|
542
|
+
// Dynamic import so that `wrtc` is only loaded when actually needed.
|
|
543
|
+
// This keeps the package as an optional peer dependency — users who
|
|
544
|
+
// only use WebSocket transport never need to install the heavy native
|
|
545
|
+
// addon.
|
|
546
|
+
let RTCPeerConnection;
|
|
547
|
+
try {
|
|
548
|
+
// @ts-ignore — optional peer dependency; only needed for server-side WebRTC
|
|
549
|
+
const wrtcModule = await import('wrtc');
|
|
550
|
+
RTCPeerConnection =
|
|
551
|
+
wrtcModule.RTCPeerConnection ?? wrtcModule.default?.RTCPeerConnection;
|
|
552
|
+
}
|
|
553
|
+
catch {
|
|
554
|
+
throw new Error('WebRTCStreamTransport requires the `wrtc` package for server-side WebRTC. ' +
|
|
555
|
+
'Install it with: npm install wrtc\n\n' +
|
|
556
|
+
'Note: `wrtc` is a native addon and may require build tools (Python, C++ compiler). ' +
|
|
557
|
+
'See https://github.com/nicktomlin/wrtc for platform-specific instructions.');
|
|
558
|
+
}
|
|
559
|
+
if (!RTCPeerConnection) {
|
|
560
|
+
throw new Error('WebRTCStreamTransport: `wrtc` package was imported but RTCPeerConnection was not found. ' +
|
|
561
|
+
'Ensure you have a compatible version of the `wrtc` package installed.');
|
|
562
|
+
}
|
|
563
|
+
const pc = new RTCPeerConnection({
|
|
564
|
+
iceServers: config.iceServers ?? [
|
|
565
|
+
// Default to Google's public STUN server for basic NAT traversal.
|
|
566
|
+
// Production deployments should provide their own TURN servers for
|
|
567
|
+
// symmetric NAT scenarios.
|
|
568
|
+
{ urls: 'stun:stun.l.google.com:19302' },
|
|
569
|
+
],
|
|
570
|
+
});
|
|
571
|
+
return new WebRTCStreamTransport(pc, config);
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=WebRTCStreamTransport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebRTCStreamTransport.js","sourceRoot":"","sources":["../../src/voice-pipeline/WebRTCStreamTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
* not crash the transport, allowing the session to continue.
|
|
22
22
|
*
|
|
23
23
|
* ### Binary frames (outbound)
|
|
24
|
-
*
|
|
24
|
+
* `sendAudio()` sends the raw `Buffer` from an {@link EncodedAudioChunk}
|
|
25
25
|
* (or converts a `Float32Array` to a `Buffer` for raw {@link AudioFrame}s).
|
|
26
26
|
*
|
|
27
27
|
* ### Text frames (outbound)
|
|
28
|
-
*
|
|
28
|
+
* `sendControl()` JSON-stringifies a {@link ServerTextMessage} and sends
|
|
29
29
|
* it as a text frame.
|
|
30
30
|
*
|
|
31
31
|
* ## Reconnection behaviour
|
|
@@ -100,7 +100,7 @@ export interface WebSocketLike extends NodeJS.EventEmitter {
|
|
|
100
100
|
*/
|
|
101
101
|
export interface WebSocketStreamTransportConfig {
|
|
102
102
|
/**
|
|
103
|
-
* Sample rate (in Hz) used to populate
|
|
103
|
+
* Sample rate (in Hz) used to populate `AudioFrame.sampleRate` on
|
|
104
104
|
* inbound binary messages. Must match the rate the remote client is sending.
|
|
105
105
|
*
|
|
106
106
|
* Common values: 16000 (telephony/STT), 24000 (TTS output), 48000 (high-fidelity).
|
|
@@ -123,8 +123,8 @@ export interface WebSocketStreamTransportConfig {
|
|
|
123
123
|
*
|
|
124
124
|
* | Method | Behaviour |
|
|
125
125
|
* |-----------------|--------------------------------------------------------|
|
|
126
|
-
* |
|
|
127
|
-
* |
|
|
126
|
+
* | `sendAudio()` | Serialises audio to a binary `Buffer` and calls `ws.send()`. |
|
|
127
|
+
* | `sendControl()` | JSON-stringifies the message and calls `ws.send()`. |
|
|
128
128
|
*
|
|
129
129
|
* ## Lifecycle events (re-emitted on `this`)
|
|
130
130
|
*
|
|
@@ -161,13 +161,13 @@ export declare class WebSocketStreamTransport extends EventEmitter implements IS
|
|
|
161
161
|
readonly id: string;
|
|
162
162
|
/**
|
|
163
163
|
* Current connection state. Updated internally by WebSocket event handlers.
|
|
164
|
-
* Read externally via the
|
|
164
|
+
* Read externally via the `state` getter.
|
|
165
165
|
*/
|
|
166
166
|
private _state;
|
|
167
167
|
/** The underlying WebSocket connection. */
|
|
168
168
|
private readonly _ws;
|
|
169
169
|
/**
|
|
170
|
-
* Audio sample rate propagated into every decoded
|
|
170
|
+
* Audio sample rate propagated into every decoded `AudioFrame`.
|
|
171
171
|
* Configured once at construction and never changed.
|
|
172
172
|
*/
|
|
173
173
|
private readonly _sampleRate;
|
|
@@ -175,7 +175,7 @@ export declare class WebSocketStreamTransport extends EventEmitter implements IS
|
|
|
175
175
|
* Create a new transport wrapping an existing WebSocket connection.
|
|
176
176
|
*
|
|
177
177
|
* The constructor inspects `ws.readyState` to determine the initial
|
|
178
|
-
*
|
|
178
|
+
* `state`: if the socket is already OPEN (readyState === 1) the state
|
|
179
179
|
* is set to `'open'`; otherwise it is set to `'connecting'` and will
|
|
180
180
|
* transition to `'open'` when the `'open'` event fires.
|
|
181
181
|
*
|