@framers/agentos 0.1.120 → 0.1.122
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 +21 -0
- package/dist/api/agency.d.ts.map +1 -1
- package/dist/api/agency.js +227 -84
- package/dist/api/agency.js.map +1 -1
- package/dist/api/analyzeVideo.d.ts +127 -0
- package/dist/api/analyzeVideo.d.ts.map +1 -0
- package/dist/api/analyzeVideo.js +136 -0
- package/dist/api/analyzeVideo.js.map +1 -0
- package/dist/api/detectScenes.d.ts +82 -0
- package/dist/api/detectScenes.d.ts.map +1 -0
- package/dist/api/detectScenes.js +67 -0
- package/dist/api/detectScenes.js.map +1 -0
- package/dist/api/generateImage.d.ts +7 -0
- package/dist/api/generateImage.d.ts.map +1 -1
- package/dist/api/generateImage.js +133 -9
- package/dist/api/generateImage.js.map +1 -1
- package/dist/api/generateMusic.d.ts +98 -0
- package/dist/api/generateMusic.d.ts.map +1 -0
- package/dist/api/generateMusic.js +319 -0
- package/dist/api/generateMusic.js.map +1 -0
- package/dist/api/generateSFX.d.ts +96 -0
- package/dist/api/generateSFX.d.ts.map +1 -0
- package/dist/api/generateSFX.js +317 -0
- package/dist/api/generateSFX.js.map +1 -0
- package/dist/api/generateVideo.d.ts +113 -0
- package/dist/api/generateVideo.d.ts.map +1 -0
- package/dist/api/generateVideo.js +342 -0
- package/dist/api/generateVideo.js.map +1 -0
- package/dist/api/model.d.ts.map +1 -1
- package/dist/api/model.js +8 -4
- package/dist/api/model.js.map +1 -1
- package/dist/api/performOCR.d.ts +169 -0
- package/dist/api/performOCR.d.ts.map +1 -0
- package/dist/api/performOCR.js +198 -0
- package/dist/api/performOCR.js.map +1 -0
- package/dist/api/provider-defaults.d.ts +7 -5
- package/dist/api/provider-defaults.d.ts.map +1 -1
- package/dist/api/provider-defaults.js +32 -10
- package/dist/api/provider-defaults.js.map +1 -1
- package/dist/api/strategies/debate.d.ts.map +1 -1
- package/dist/api/strategies/debate.js +1 -0
- package/dist/api/strategies/debate.js.map +1 -1
- package/dist/api/strategies/graph.d.ts.map +1 -1
- package/dist/api/strategies/graph.js +69 -13
- package/dist/api/strategies/graph.js.map +1 -1
- package/dist/api/strategies/hierarchical.d.ts.map +1 -1
- package/dist/api/strategies/hierarchical.js +1 -0
- package/dist/api/strategies/hierarchical.js.map +1 -1
- package/dist/api/strategies/parallel.d.ts.map +1 -1
- package/dist/api/strategies/parallel.js +1 -0
- package/dist/api/strategies/parallel.js.map +1 -1
- package/dist/api/strategies/review-loop.d.ts.map +1 -1
- package/dist/api/strategies/review-loop.js +1 -0
- package/dist/api/strategies/review-loop.js.map +1 -1
- package/dist/api/strategies/sequential.d.ts.map +1 -1
- package/dist/api/strategies/sequential.js +54 -48
- package/dist/api/strategies/sequential.js.map +1 -1
- package/dist/api/streamBuffer.d.ts +20 -0
- package/dist/api/streamBuffer.d.ts.map +1 -0
- package/dist/api/streamBuffer.js +81 -0
- package/dist/api/streamBuffer.js.map +1 -0
- package/dist/api/types.d.ts +145 -5
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -1
- package/dist/core/audio/AudioProcessor.d.ts.map +1 -1
- package/dist/core/audio/AudioProcessor.js +1 -0
- package/dist/core/audio/AudioProcessor.js.map +1 -1
- package/dist/core/audio/EnvironmentalCalibrator.d.ts.map +1 -1
- package/dist/core/audio/EnvironmentalCalibrator.js +1 -0
- package/dist/core/audio/EnvironmentalCalibrator.js.map +1 -1
- package/dist/core/audio/FallbackAudioProxy.d.ts +169 -0
- package/dist/core/audio/FallbackAudioProxy.d.ts.map +1 -0
- package/dist/core/audio/FallbackAudioProxy.js +236 -0
- package/dist/core/audio/FallbackAudioProxy.js.map +1 -0
- package/dist/core/audio/IAudioGenerator.d.ts +103 -0
- package/dist/core/audio/IAudioGenerator.d.ts.map +1 -0
- package/dist/core/audio/IAudioGenerator.js +24 -0
- package/dist/core/audio/IAudioGenerator.js.map +1 -0
- package/dist/core/audio/index.d.ts +54 -0
- package/dist/core/audio/index.d.ts.map +1 -1
- package/dist/core/audio/index.js +93 -0
- package/dist/core/audio/index.js.map +1 -1
- package/dist/core/audio/providers/AudioGenLocalProvider.d.ts +136 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.js +235 -0
- package/dist/core/audio/providers/AudioGenLocalProvider.js.map +1 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts +107 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.js +154 -0
- package/dist/core/audio/providers/ElevenLabsSFXProvider.js.map +1 -0
- package/dist/core/audio/providers/FalAudioProvider.d.ts +207 -0
- package/dist/core/audio/providers/FalAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/FalAudioProvider.js +315 -0
- package/dist/core/audio/providers/FalAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.d.ts +136 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.js +235 -0
- package/dist/core/audio/providers/MusicGenLocalProvider.js.map +1 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.d.ts +200 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.js +346 -0
- package/dist/core/audio/providers/ReplicateAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/StableAudioProvider.d.ts +138 -0
- package/dist/core/audio/providers/StableAudioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/StableAudioProvider.js +192 -0
- package/dist/core/audio/providers/StableAudioProvider.js.map +1 -0
- package/dist/core/audio/providers/SunoProvider.d.ts +182 -0
- package/dist/core/audio/providers/SunoProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/SunoProvider.js +312 -0
- package/dist/core/audio/providers/SunoProvider.js.map +1 -0
- package/dist/core/audio/providers/UdioProvider.d.ts +177 -0
- package/dist/core/audio/providers/UdioProvider.d.ts.map +1 -0
- package/dist/core/audio/providers/UdioProvider.js +305 -0
- package/dist/core/audio/providers/UdioProvider.js.map +1 -0
- package/dist/core/audio/types.d.ts +257 -0
- package/dist/core/audio/types.d.ts.map +1 -0
- package/dist/core/audio/types.js +21 -0
- package/dist/core/audio/types.js.map +1 -0
- package/dist/core/images/FallbackImageProxy.d.ts +183 -0
- package/dist/core/images/FallbackImageProxy.d.ts.map +1 -0
- package/dist/core/images/FallbackImageProxy.js +283 -0
- package/dist/core/images/FallbackImageProxy.js.map +1 -0
- package/dist/core/images/IImageProvider.d.ts +1 -1
- package/dist/core/images/IImageProvider.d.ts.map +1 -1
- package/dist/core/images/index.d.ts +1 -0
- package/dist/core/images/index.d.ts.map +1 -1
- package/dist/core/images/index.js +1 -0
- package/dist/core/images/index.js.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts +3 -1
- package/dist/core/llm/providers/AIModelProviderManager.d.ts.map +1 -1
- package/dist/core/llm/providers/AIModelProviderManager.js +8 -0
- package/dist/core/llm/providers/AIModelProviderManager.js.map +1 -1
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts +52 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js +36 -0
- package/dist/core/llm/providers/errors/ClaudeCodeProviderError.js.map +1 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts +32 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.d.ts.map +1 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.js +27 -0
- package/dist/core/llm/providers/errors/GeminiCLIProviderError.js.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts +38 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js +128 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeCLIBridge.js.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts +107 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js +504 -0
- package/dist/core/llm/providers/implementations/ClaudeCodeProvider.js.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts +60 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.js +177 -0
- package/dist/core/llm/providers/implementations/GeminiCLIBridge.js.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts +55 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.d.ts.map +1 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.js +447 -0
- package/dist/core/llm/providers/implementations/GeminiCLIProvider.js.map +1 -0
- package/dist/core/media/ProviderPreferences.d.ts +158 -0
- package/dist/core/media/ProviderPreferences.d.ts.map +1 -0
- package/dist/core/media/ProviderPreferences.js +183 -0
- package/dist/core/media/ProviderPreferences.js.map +1 -0
- package/dist/core/subprocess/CLIRegistry.d.ts +71 -0
- package/dist/core/subprocess/CLIRegistry.d.ts.map +1 -0
- package/dist/core/subprocess/CLIRegistry.js +210 -0
- package/dist/core/subprocess/CLIRegistry.js.map +1 -0
- package/dist/core/subprocess/CLISubprocessBridge.d.ts +117 -0
- package/dist/core/subprocess/CLISubprocessBridge.d.ts.map +1 -0
- package/dist/core/subprocess/CLISubprocessBridge.js +199 -0
- package/dist/core/subprocess/CLISubprocessBridge.js.map +1 -0
- package/dist/core/subprocess/errors.d.ts +76 -0
- package/dist/core/subprocess/errors.d.ts.map +1 -0
- package/dist/core/subprocess/errors.js +75 -0
- package/dist/core/subprocess/errors.js.map +1 -0
- package/dist/core/subprocess/index.d.ts +11 -0
- package/dist/core/subprocess/index.d.ts.map +1 -0
- package/dist/core/subprocess/index.js +10 -0
- package/dist/core/subprocess/index.js.map +1 -0
- package/dist/core/subprocess/types.d.ts +100 -0
- package/dist/core/subprocess/types.d.ts.map +1 -0
- package/dist/core/subprocess/types.js +9 -0
- package/dist/core/subprocess/types.js.map +1 -0
- package/dist/core/video/FallbackVideoProxy.d.ts +166 -0
- package/dist/core/video/FallbackVideoProxy.d.ts.map +1 -0
- package/dist/core/video/FallbackVideoProxy.js +228 -0
- package/dist/core/video/FallbackVideoProxy.js.map +1 -0
- package/dist/core/video/IVideoAnalyzer.d.ts +29 -0
- package/dist/core/video/IVideoAnalyzer.d.ts.map +1 -0
- package/dist/core/video/IVideoAnalyzer.js +12 -0
- package/dist/core/video/IVideoAnalyzer.js.map +1 -0
- package/dist/core/video/IVideoGenerator.d.ts +76 -0
- package/dist/core/video/IVideoGenerator.d.ts.map +1 -0
- package/dist/core/video/IVideoGenerator.js +13 -0
- package/dist/core/video/IVideoGenerator.js.map +1 -0
- package/dist/core/video/VideoAnalyzer.d.ts +278 -0
- package/dist/core/video/VideoAnalyzer.d.ts.map +1 -0
- package/dist/core/video/VideoAnalyzer.js +648 -0
- package/dist/core/video/VideoAnalyzer.js.map +1 -0
- package/dist/core/video/index.d.ts +55 -0
- package/dist/core/video/index.d.ts.map +1 -0
- package/dist/core/video/index.js +78 -0
- package/dist/core/video/index.js.map +1 -0
- package/dist/core/video/providers/FalVideoProvider.d.ts +195 -0
- package/dist/core/video/providers/FalVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/FalVideoProvider.js +322 -0
- package/dist/core/video/providers/FalVideoProvider.js.map +1 -0
- package/dist/core/video/providers/ReplicateVideoProvider.d.ts +194 -0
- package/dist/core/video/providers/ReplicateVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/ReplicateVideoProvider.js +356 -0
- package/dist/core/video/providers/ReplicateVideoProvider.js.map +1 -0
- package/dist/core/video/providers/RunwayVideoProvider.d.ts +175 -0
- package/dist/core/video/providers/RunwayVideoProvider.d.ts.map +1 -0
- package/dist/core/video/providers/RunwayVideoProvider.js +293 -0
- package/dist/core/video/providers/RunwayVideoProvider.js.map +1 -0
- package/dist/core/video/types.d.ts +441 -0
- package/dist/core/video/types.d.ts.map +1 -0
- package/dist/core/video/types.js +10 -0
- package/dist/core/video/types.js.map +1 -0
- package/dist/core/vision/SceneDetector.d.ts +180 -0
- package/dist/core/vision/SceneDetector.d.ts.map +1 -0
- package/dist/core/vision/SceneDetector.js +366 -0
- package/dist/core/vision/SceneDetector.js.map +1 -0
- package/dist/core/vision/index.d.ts +2 -1
- package/dist/core/vision/index.d.ts.map +1 -1
- package/dist/core/vision/index.js +1 -0
- package/dist/core/vision/index.js.map +1 -1
- package/dist/core/vision/types.d.ts +125 -0
- package/dist/core/vision/types.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts +32 -0
- package/dist/discovery/CapabilityDiscoveryEngine.d.ts.map +1 -1
- package/dist/discovery/CapabilityDiscoveryEngine.js +46 -0
- package/dist/discovery/CapabilityDiscoveryEngine.js.map +1 -1
- package/dist/emergent/AdaptPersonalityTool.d.ts +158 -0
- package/dist/emergent/AdaptPersonalityTool.d.ts.map +1 -0
- package/dist/emergent/AdaptPersonalityTool.js +190 -0
- package/dist/emergent/AdaptPersonalityTool.js.map +1 -0
- package/dist/emergent/CreateWorkflowTool.d.ts +181 -0
- package/dist/emergent/CreateWorkflowTool.d.ts.map +1 -0
- package/dist/emergent/CreateWorkflowTool.js +307 -0
- package/dist/emergent/CreateWorkflowTool.js.map +1 -0
- package/dist/emergent/ManageSkillsTool.d.ts +154 -0
- package/dist/emergent/ManageSkillsTool.d.ts.map +1 -0
- package/dist/emergent/ManageSkillsTool.js +241 -0
- package/dist/emergent/ManageSkillsTool.js.map +1 -0
- package/dist/emergent/PersonalityMutationStore.d.ts +183 -0
- package/dist/emergent/PersonalityMutationStore.d.ts.map +1 -0
- package/dist/emergent/PersonalityMutationStore.js +222 -0
- package/dist/emergent/PersonalityMutationStore.js.map +1 -0
- package/dist/emergent/SelfEvaluateTool.d.ts +189 -0
- package/dist/emergent/SelfEvaluateTool.d.ts.map +1 -0
- package/dist/emergent/SelfEvaluateTool.js +353 -0
- package/dist/emergent/SelfEvaluateTool.js.map +1 -0
- package/dist/emergent/SelfImprovementConfig.d.ts +166 -0
- package/dist/emergent/SelfImprovementConfig.d.ts.map +1 -0
- package/dist/emergent/SelfImprovementConfig.js +43 -0
- package/dist/emergent/SelfImprovementConfig.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 +9 -0
- package/dist/emergent/types.d.ts.map +1 -1
- package/dist/emergent/types.js.map +1 -1
- package/dist/extensions/MultiRegistryLoader.js.map +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/CognitiveMemoryManager.d.ts +40 -0
- package/dist/memory/CognitiveMemoryManager.d.ts.map +1 -1
- package/dist/memory/CognitiveMemoryManager.js +54 -1
- package/dist/memory/CognitiveMemoryManager.js.map +1 -1
- package/dist/memory/facade/Memory.d.ts +4 -0
- package/dist/memory/facade/Memory.d.ts.map +1 -1
- package/dist/memory/facade/Memory.js +140 -4
- package/dist/memory/facade/Memory.js.map +1 -1
- package/dist/memory/facade/types.d.ts +30 -2
- package/dist/memory/facade/types.d.ts.map +1 -1
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.d.ts.map +1 -1
- package/dist/memory/index.js +1 -0
- package/dist/memory/index.js.map +1 -1
- package/dist/memory/types.d.ts +15 -0
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/query-router/QueryClassifier.d.ts +192 -21
- package/dist/query-router/QueryClassifier.d.ts.map +1 -1
- package/dist/query-router/QueryClassifier.js +604 -23
- package/dist/query-router/QueryClassifier.js.map +1 -1
- package/dist/query-router/QueryDispatcher.d.ts +106 -8
- package/dist/query-router/QueryDispatcher.d.ts.map +1 -1
- package/dist/query-router/QueryDispatcher.js +387 -8
- package/dist/query-router/QueryDispatcher.js.map +1 -1
- package/dist/query-router/QueryRouter.d.ts +198 -14
- package/dist/query-router/QueryRouter.d.ts.map +1 -1
- package/dist/query-router/QueryRouter.js +738 -50
- package/dist/query-router/QueryRouter.js.map +1 -1
- package/dist/query-router/index.d.ts +1 -1
- package/dist/query-router/index.d.ts.map +1 -1
- package/dist/query-router/index.js +1 -1
- package/dist/query-router/index.js.map +1 -1
- package/dist/query-router/types.d.ts +396 -3
- package/dist/query-router/types.d.ts.map +1 -1
- package/dist/query-router/types.js +35 -0
- package/dist/query-router/types.js.map +1 -1
- package/dist/rag/HydeRetriever.d.ts +108 -0
- package/dist/rag/HydeRetriever.d.ts.map +1 -1
- package/dist/rag/HydeRetriever.js +184 -0
- package/dist/rag/HydeRetriever.js.map +1 -1
- package/dist/rag/IRetrievalAugmentor.d.ts +15 -0
- package/dist/rag/IRetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.d.ts +58 -0
- package/dist/rag/RetrievalAugmentor.d.ts.map +1 -1
- package/dist/rag/RetrievalAugmentor.js +200 -32
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- package/dist/rag/VectorStoreManager.js +1 -1
- package/dist/rag/audit/RAGAuditCollector.d.ts +7 -0
- package/dist/rag/audit/RAGAuditCollector.d.ts.map +1 -1
- package/dist/rag/audit/RAGAuditCollector.js +10 -0
- package/dist/rag/audit/RAGAuditCollector.js.map +1 -1
- package/dist/rag/audit/RAGAuditTypes.d.ts +10 -1
- package/dist/rag/audit/RAGAuditTypes.d.ts.map +1 -1
- package/dist/rag/chunking/SemanticChunker.d.ts +210 -0
- package/dist/rag/chunking/SemanticChunker.d.ts.map +1 -0
- package/dist/rag/chunking/SemanticChunker.js +460 -0
- package/dist/rag/chunking/SemanticChunker.js.map +1 -0
- package/dist/rag/chunking/index.d.ts +10 -0
- package/dist/rag/chunking/index.d.ts.map +1 -0
- package/dist/rag/chunking/index.js +10 -0
- package/dist/rag/chunking/index.js.map +1 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts +103 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.js +315 -0
- package/dist/rag/implementations/vector_stores/PineconeVectorStore.js.map +1 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts +107 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.d.ts.map +1 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.js +438 -0
- package/dist/rag/implementations/vector_stores/PostgresVectorStore.js.map +1 -0
- package/dist/rag/index.d.ts +15 -1
- package/dist/rag/index.d.ts.map +1 -1
- package/dist/rag/index.js +32 -0
- package/dist/rag/index.js.map +1 -1
- package/dist/rag/migration/MigrationEngine.d.ts +47 -0
- package/dist/rag/migration/MigrationEngine.d.ts.map +1 -0
- package/dist/rag/migration/MigrationEngine.js +168 -0
- package/dist/rag/migration/MigrationEngine.js.map +1 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts +23 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.js +63 -0
- package/dist/rag/migration/adapters/PineconeSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts +30 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.js +71 -0
- package/dist/rag/migration/adapters/PostgresSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts +38 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.js +114 -0
- package/dist/rag/migration/adapters/PostgresTargetAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts +36 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.js +109 -0
- package/dist/rag/migration/adapters/QdrantSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts +35 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.js +110 -0
- package/dist/rag/migration/adapters/QdrantTargetAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts +37 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.js +72 -0
- package/dist/rag/migration/adapters/SqliteSourceAdapter.js.map +1 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts +47 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.d.ts.map +1 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.js +93 -0
- package/dist/rag/migration/adapters/SqliteTargetAdapter.js.map +1 -0
- package/dist/rag/migration/types.d.ts +108 -0
- package/dist/rag/migration/types.d.ts.map +1 -0
- package/dist/rag/migration/types.js +11 -0
- package/dist/rag/migration/types.js.map +1 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts +35 -0
- package/dist/rag/multimodal/MultimodalIndexer.d.ts.map +1 -1
- package/dist/rag/multimodal/MultimodalIndexer.js +66 -1
- package/dist/rag/multimodal/MultimodalIndexer.js.map +1 -1
- package/dist/rag/multimodal/types.d.ts +24 -0
- package/dist/rag/multimodal/types.d.ts.map +1 -1
- package/dist/rag/raptor/RaptorTree.d.ts +268 -0
- package/dist/rag/raptor/RaptorTree.d.ts.map +1 -0
- package/dist/rag/raptor/RaptorTree.js +443 -0
- package/dist/rag/raptor/RaptorTree.js.map +1 -0
- package/dist/rag/raptor/index.d.ts +11 -0
- package/dist/rag/raptor/index.d.ts.map +1 -0
- package/dist/rag/raptor/index.js +11 -0
- package/dist/rag/raptor/index.js.map +1 -0
- package/dist/rag/reranking/providers/CohereReranker.js.map +1 -1
- package/dist/rag/search/BM25Index.d.ts +282 -0
- package/dist/rag/search/BM25Index.d.ts.map +1 -0
- package/dist/rag/search/BM25Index.js +344 -0
- package/dist/rag/search/BM25Index.js.map +1 -0
- package/dist/rag/search/HybridSearcher.d.ts +198 -0
- package/dist/rag/search/HybridSearcher.d.ts.map +1 -0
- package/dist/rag/search/HybridSearcher.js +316 -0
- package/dist/rag/search/HybridSearcher.js.map +1 -0
- package/dist/rag/search/index.d.ts +12 -0
- package/dist/rag/search/index.d.ts.map +1 -0
- package/dist/rag/search/index.js +12 -0
- package/dist/rag/search/index.js.map +1 -0
- package/dist/rag/setup/DockerDetector.d.ts +67 -0
- package/dist/rag/setup/DockerDetector.d.ts.map +1 -0
- package/dist/rag/setup/DockerDetector.js +125 -0
- package/dist/rag/setup/DockerDetector.js.map +1 -0
- package/dist/rag/setup/PostgresSetup.d.ts +20 -0
- package/dist/rag/setup/PostgresSetup.d.ts.map +1 -0
- package/dist/rag/setup/PostgresSetup.js +133 -0
- package/dist/rag/setup/PostgresSetup.js.map +1 -0
- package/dist/rag/setup/QdrantSetup.d.ts +26 -0
- package/dist/rag/setup/QdrantSetup.d.ts.map +1 -0
- package/dist/rag/setup/QdrantSetup.js +96 -0
- package/dist/rag/setup/QdrantSetup.js.map +1 -0
- package/dist/rag/setup/types.d.ts +55 -0
- package/dist/rag/setup/types.d.ts.map +1 -0
- package/dist/rag/setup/types.js +6 -0
- package/dist/rag/setup/types.js.map +1 -0
- package/dist/rag/unified/UnifiedRetriever.d.ts +472 -0
- package/dist/rag/unified/UnifiedRetriever.d.ts.map +1 -0
- package/dist/rag/unified/UnifiedRetriever.js +887 -0
- package/dist/rag/unified/UnifiedRetriever.js.map +1 -0
- package/dist/rag/unified/index.d.ts +24 -0
- package/dist/rag/unified/index.d.ts.map +1 -0
- package/dist/rag/unified/index.js +23 -0
- package/dist/rag/unified/index.js.map +1 -0
- package/dist/rag/unified/types.d.ts +546 -0
- package/dist/rag/unified/types.d.ts.map +1 -0
- package/dist/rag/unified/types.js +177 -0
- package/dist/rag/unified/types.js.map +1 -0
- package/dist/speech/providers/AssemblyAISTTProvider.js.map +1 -1
- package/dist/speech/providers/AzureSpeechSTTProvider.js.map +1 -1
- package/dist/speech/providers/BuiltInAdaptiveVadProvider.d.ts +1 -1
- package/dist/speech/providers/DeepgramBatchSTTProvider.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module core/video/VideoAnalyzer
|
|
3
|
+
*
|
|
4
|
+
* Wires {@link SceneDetector}, {@link VisionPipeline}, and an optional
|
|
5
|
+
* {@link SpeechToTextProvider} into a structured video analysis pipeline.
|
|
6
|
+
*
|
|
7
|
+
* The analyzer replaces the monolithic `ingestVideo()` approach in
|
|
8
|
+
* {@link MultimodalMemoryBridge} with a composable, progress-reporting
|
|
9
|
+
* pipeline that produces rich scene descriptions, summaries, and optional
|
|
10
|
+
* RAG-indexed chunks.
|
|
11
|
+
*
|
|
12
|
+
* ## Pipeline stages
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* Video Buffer
|
|
16
|
+
* ↓
|
|
17
|
+
* 1. Write to temp file
|
|
18
|
+
* 2. ffprobe → duration
|
|
19
|
+
* 3. ffmpeg → 1fps PNG frames
|
|
20
|
+
* 4. SceneDetector.detectScenes(frames)
|
|
21
|
+
* 5. Per-scene: VisionPipeline.process(keyFrame)
|
|
22
|
+
* 6. (optional) ffmpeg → WAV audio → STT → transcript segments
|
|
23
|
+
* 7. generateText() LLM → overall summary
|
|
24
|
+
* 8. (optional) RAG chunk indexing
|
|
25
|
+
* 9. Clean up temp files
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* ## Usage
|
|
29
|
+
*
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { VideoAnalyzer } from '../../core/video/index.js';
|
|
32
|
+
*
|
|
33
|
+
* const analyzer = new VideoAnalyzer();
|
|
34
|
+
* const result = await analyzer.analyzeVideo({
|
|
35
|
+
* video: videoBuffer,
|
|
36
|
+
* transcribeAudio: true,
|
|
37
|
+
* onProgress: (evt) => console.log(`${evt.phase}: ${evt.progress}%`),
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* for (const scene of result.scenes) {
|
|
41
|
+
* console.log(`[${scene.startSec}-${scene.endSec}s] ${scene.description}`);
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @see {@link IVideoAnalyzer} for the base interface.
|
|
46
|
+
* @see {@link SceneDetector} for scene boundary detection.
|
|
47
|
+
* @see {@link VisionPipeline} for frame description.
|
|
48
|
+
* @see {@link SpeechToTextProvider} for audio transcription.
|
|
49
|
+
*/
|
|
50
|
+
import { execFile as execFileCb } from 'node:child_process';
|
|
51
|
+
import { promisify } from 'node:util';
|
|
52
|
+
import { randomUUID } from 'node:crypto';
|
|
53
|
+
import { tmpdir } from 'node:os';
|
|
54
|
+
import { join } from 'node:path';
|
|
55
|
+
import { writeFile, readFile, readdir, mkdir, rm, } from 'node:fs/promises';
|
|
56
|
+
import { SceneDetector } from '../vision/SceneDetector.js';
|
|
57
|
+
const execFile = promisify(execFileCb);
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// VideoAnalyzer
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
/**
|
|
62
|
+
* Structured video analysis pipeline that wires together scene detection,
|
|
63
|
+
* vision description, audio transcription, and LLM summarization.
|
|
64
|
+
*
|
|
65
|
+
* Implements the base {@link IVideoAnalyzer} interface for simple analysis
|
|
66
|
+
* requests, and exposes an `analyze()` method for rich analysis with
|
|
67
|
+
* progress reporting, configurable detail levels, and optional RAG indexing.
|
|
68
|
+
*
|
|
69
|
+
* All ffmpeg/ffprobe invocations use `execFile` (not `exec`) for safety —
|
|
70
|
+
* arguments are passed as arrays, preventing shell injection.
|
|
71
|
+
*/
|
|
72
|
+
export class VideoAnalyzer {
|
|
73
|
+
// -------------------------------------------------------------------------
|
|
74
|
+
// Constructor
|
|
75
|
+
// -------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Create a new VideoAnalyzer with optional injected dependencies.
|
|
78
|
+
*
|
|
79
|
+
* Missing dependencies are auto-created with sensible defaults:
|
|
80
|
+
* - **VisionPipeline**: created lazily via `createVisionPipeline()` on first use
|
|
81
|
+
* - **SceneDetector**: created immediately with default thresholds
|
|
82
|
+
* - **SpeechToTextProvider**: left undefined — transcription skipped when missing
|
|
83
|
+
*
|
|
84
|
+
* @param deps - Optional dependency overrides.
|
|
85
|
+
*/
|
|
86
|
+
constructor(deps) {
|
|
87
|
+
this._visionPipeline = deps?.visionPipeline;
|
|
88
|
+
this._sttProvider = deps?.sttProvider;
|
|
89
|
+
this._sceneDetector = deps?.sceneDetector ?? new SceneDetector();
|
|
90
|
+
this._userSuppliedVision = !!deps?.visionPipeline;
|
|
91
|
+
}
|
|
92
|
+
// -------------------------------------------------------------------------
|
|
93
|
+
// IVideoAnalyzer — simple analysis
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Analyse a video and return structured understanding results.
|
|
97
|
+
*
|
|
98
|
+
* This is the simple {@link IVideoAnalyzer} interface method. For richer
|
|
99
|
+
* analysis with progress reporting and scene descriptions, use
|
|
100
|
+
* {@link analyze} instead.
|
|
101
|
+
*
|
|
102
|
+
* @param request - The analysis parameters (video source + optional prompt).
|
|
103
|
+
* @returns Structured analysis including description, scenes, and duration.
|
|
104
|
+
*/
|
|
105
|
+
async analyzeVideo(request) {
|
|
106
|
+
// Resolve video buffer from URL or direct buffer
|
|
107
|
+
let videoBuffer;
|
|
108
|
+
if (request.videoBuffer) {
|
|
109
|
+
videoBuffer = request.videoBuffer;
|
|
110
|
+
}
|
|
111
|
+
else if (request.videoUrl) {
|
|
112
|
+
const response = await fetch(request.videoUrl);
|
|
113
|
+
videoBuffer = Buffer.from(await response.arrayBuffer());
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
throw new Error('VideoAnalyzer.analyzeVideo: either videoUrl or videoBuffer must be provided.');
|
|
117
|
+
}
|
|
118
|
+
const rich = await this.analyze({
|
|
119
|
+
video: videoBuffer,
|
|
120
|
+
prompt: request.prompt,
|
|
121
|
+
transcribeAudio: false,
|
|
122
|
+
descriptionDetail: 'brief',
|
|
123
|
+
maxFrames: request.maxFrames,
|
|
124
|
+
});
|
|
125
|
+
return {
|
|
126
|
+
description: rich.summary,
|
|
127
|
+
scenes: rich.scenes.map((s) => ({
|
|
128
|
+
startSec: s.startSec,
|
|
129
|
+
endSec: s.endSec,
|
|
130
|
+
description: s.description,
|
|
131
|
+
})),
|
|
132
|
+
text: rich.fullTranscript ? [rich.fullTranscript] : undefined,
|
|
133
|
+
durationSec: rich.durationSec,
|
|
134
|
+
modelId: request.modelId,
|
|
135
|
+
providerId: 'agentos-video-analyzer',
|
|
136
|
+
providerMetadata: rich.metadata,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// -------------------------------------------------------------------------
|
|
140
|
+
// Rich analysis — main pipeline
|
|
141
|
+
// -------------------------------------------------------------------------
|
|
142
|
+
/**
|
|
143
|
+
* Run the full video analysis pipeline with scene detection, vision
|
|
144
|
+
* descriptions, optional audio transcription, and LLM summarization.
|
|
145
|
+
*
|
|
146
|
+
* The pipeline executes these stages sequentially:
|
|
147
|
+
*
|
|
148
|
+
* 1. **Extract frames** — decode video at 1fps via ffmpeg
|
|
149
|
+
* 2. **Detect scenes** — run SceneDetector over extracted frames
|
|
150
|
+
* 3. **Describe scenes** — send key frames to VisionPipeline
|
|
151
|
+
* 4. **Transcribe audio** — (optional) extract audio and run STT
|
|
152
|
+
* 5. **Summarize** — generate overall summary via LLM
|
|
153
|
+
*
|
|
154
|
+
* Progress events are emitted at each phase transition when
|
|
155
|
+
* `onProgress` is provided.
|
|
156
|
+
*
|
|
157
|
+
* @param request - Rich analysis parameters.
|
|
158
|
+
* @returns Rich analysis result with scenes, summary, and optional RAG chunks.
|
|
159
|
+
*
|
|
160
|
+
* @throws {Error} If ffprobe/ffmpeg are not installed on the system.
|
|
161
|
+
* @throws {Error} If the video buffer is empty or invalid.
|
|
162
|
+
*/
|
|
163
|
+
async analyze(request) {
|
|
164
|
+
// Resolve video buffer
|
|
165
|
+
const videoBuffer = Buffer.isBuffer(request.video)
|
|
166
|
+
? request.video
|
|
167
|
+
: await this._downloadVideo(request.video);
|
|
168
|
+
if (!videoBuffer || videoBuffer.length === 0) {
|
|
169
|
+
throw new Error('VideoAnalyzer.analyze: video buffer is empty.');
|
|
170
|
+
}
|
|
171
|
+
// Create a unique temp directory for all intermediate files
|
|
172
|
+
const tmpBase = join(tmpdir(), `agentos-video-${randomUUID()}`);
|
|
173
|
+
await mkdir(tmpBase, { recursive: true });
|
|
174
|
+
const videoPath = join(tmpBase, 'input.mp4');
|
|
175
|
+
const framesDir = join(tmpBase, 'frames');
|
|
176
|
+
const audioPath = join(tmpBase, 'audio.wav');
|
|
177
|
+
try {
|
|
178
|
+
// Write video to temp file
|
|
179
|
+
await writeFile(videoPath, videoBuffer);
|
|
180
|
+
// -----------------------------------------------------------------------
|
|
181
|
+
// Stage 1: Probe duration
|
|
182
|
+
// -----------------------------------------------------------------------
|
|
183
|
+
await this._assertFfprobeAvailable();
|
|
184
|
+
const durationSec = await this._probeDuration(videoPath);
|
|
185
|
+
// -----------------------------------------------------------------------
|
|
186
|
+
// Stage 2: Extract frames at 1fps
|
|
187
|
+
// -----------------------------------------------------------------------
|
|
188
|
+
this._emitProgress(request.onProgress, 'extracting-frames', 0, 'Extracting frames at 1fps');
|
|
189
|
+
await mkdir(framesDir, { recursive: true });
|
|
190
|
+
let frames = await this._extractFrames(videoPath, framesDir);
|
|
191
|
+
const extractedFrameCount = frames.length;
|
|
192
|
+
if (request.maxFrames !== undefined && request.maxFrames > 0 && frames.length > request.maxFrames) {
|
|
193
|
+
frames = this._downsampleFrames(frames, request.maxFrames);
|
|
194
|
+
}
|
|
195
|
+
this._emitProgress(request.onProgress, 'extracting-frames', 100, frames.length === extractedFrameCount
|
|
196
|
+
? `Extracted ${frames.length} frames`
|
|
197
|
+
: `Extracted ${extractedFrameCount} frames and sampled ${frames.length}`);
|
|
198
|
+
// -----------------------------------------------------------------------
|
|
199
|
+
// Stage 3: Detect scenes
|
|
200
|
+
// -----------------------------------------------------------------------
|
|
201
|
+
this._emitProgress(request.onProgress, 'detecting-scenes', 0, 'Detecting scene boundaries');
|
|
202
|
+
const sceneBoundaries = await this._detectScenes(frames, request.sceneThreshold, request.maxScenes);
|
|
203
|
+
this._emitProgress(request.onProgress, 'detecting-scenes', 100, `Detected ${sceneBoundaries.length} scenes`);
|
|
204
|
+
// -----------------------------------------------------------------------
|
|
205
|
+
// Stage 4: Describe scenes via VisionPipeline
|
|
206
|
+
// -----------------------------------------------------------------------
|
|
207
|
+
this._emitProgress(request.onProgress, 'describing', 0, 'Describing scenes');
|
|
208
|
+
const visionPipeline = await this._ensureVisionPipeline();
|
|
209
|
+
const sceneDescriptions = [];
|
|
210
|
+
for (let i = 0; i < sceneBoundaries.length; i++) {
|
|
211
|
+
const boundary = sceneBoundaries[i];
|
|
212
|
+
// Select key frame: the frame closest to the midpoint of the scene
|
|
213
|
+
const midTimeSec = (boundary.startTimeSec + boundary.endTimeSec) / 2;
|
|
214
|
+
const keyFrame = this._selectKeyFrame(frames, midTimeSec);
|
|
215
|
+
let description = '';
|
|
216
|
+
let keyFrameBase64;
|
|
217
|
+
if (keyFrame) {
|
|
218
|
+
try {
|
|
219
|
+
const visionResult = await visionPipeline.process(keyFrame.sourceBuffer ?? keyFrame.buffer);
|
|
220
|
+
description = visionResult.text || 'No description available.';
|
|
221
|
+
keyFrameBase64 = (keyFrame.sourceBuffer ?? keyFrame.buffer).toString('base64');
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
description = 'Vision analysis failed for this scene.';
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
sceneDescriptions.push({
|
|
228
|
+
index: i,
|
|
229
|
+
startSec: boundary.startTimeSec,
|
|
230
|
+
endSec: boundary.endTimeSec,
|
|
231
|
+
durationSec: boundary.durationSec,
|
|
232
|
+
cutType: i === 0 ? 'start' : boundary.cutType,
|
|
233
|
+
description,
|
|
234
|
+
confidence: boundary.confidence,
|
|
235
|
+
keyFrame: keyFrameBase64,
|
|
236
|
+
});
|
|
237
|
+
this._emitProgress(request.onProgress, 'describing', Math.round(((i + 1) / sceneBoundaries.length) * 100), `Described scene ${i + 1}/${sceneBoundaries.length}`, i);
|
|
238
|
+
}
|
|
239
|
+
// -----------------------------------------------------------------------
|
|
240
|
+
// Stage 5: Transcribe audio (optional)
|
|
241
|
+
// -----------------------------------------------------------------------
|
|
242
|
+
let fullTranscript;
|
|
243
|
+
const shouldTranscribe = request.transcribeAudio !== false && this._sttProvider;
|
|
244
|
+
if (shouldTranscribe) {
|
|
245
|
+
this._emitProgress(request.onProgress, 'transcribing', 0, 'Extracting audio');
|
|
246
|
+
try {
|
|
247
|
+
const audioBuffer = await this._extractAudio(videoPath, audioPath);
|
|
248
|
+
if (audioBuffer && audioBuffer.length > 0) {
|
|
249
|
+
this._emitProgress(request.onProgress, 'transcribing', 30, 'Transcribing audio');
|
|
250
|
+
const sttResult = await this._sttProvider.transcribe({ data: audioBuffer, mimeType: 'audio/wav', sampleRate: 16000 });
|
|
251
|
+
fullTranscript = sttResult.text;
|
|
252
|
+
// Map transcript segments to scenes by time range
|
|
253
|
+
if (sttResult.segments && sttResult.segments.length > 0) {
|
|
254
|
+
for (const scene of sceneDescriptions) {
|
|
255
|
+
const overlapping = sttResult.segments.filter((seg) => seg.startTime < scene.endSec && seg.endTime > scene.startSec);
|
|
256
|
+
if (overlapping.length > 0) {
|
|
257
|
+
scene.transcript = overlapping.map((s) => s.text).join(' ').trim();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
this._emitProgress(request.onProgress, 'transcribing', 100, 'Transcription complete');
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
// STT failure is non-fatal — scenes still have visual descriptions
|
|
266
|
+
console.warn('[VideoAnalyzer] Audio transcription failed:', err.message);
|
|
267
|
+
this._emitProgress(request.onProgress, 'transcribing', 100, 'Transcription failed (non-fatal)');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// -----------------------------------------------------------------------
|
|
271
|
+
// Stage 6: Generate summary via LLM
|
|
272
|
+
// -----------------------------------------------------------------------
|
|
273
|
+
this._emitProgress(request.onProgress, 'summarizing', 0, 'Generating summary');
|
|
274
|
+
const summary = await this._generateSummary(sceneDescriptions, fullTranscript, request.prompt);
|
|
275
|
+
this._emitProgress(request.onProgress, 'summarizing', 100, 'Summary complete');
|
|
276
|
+
// -----------------------------------------------------------------------
|
|
277
|
+
// Stage 7: Optional RAG indexing
|
|
278
|
+
// -----------------------------------------------------------------------
|
|
279
|
+
let ragChunkIds;
|
|
280
|
+
if (request.indexForRAG) {
|
|
281
|
+
ragChunkIds = this._buildRagChunkIds(sceneDescriptions, summary);
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
durationSec,
|
|
285
|
+
sceneCount: sceneDescriptions.length,
|
|
286
|
+
scenes: sceneDescriptions,
|
|
287
|
+
summary,
|
|
288
|
+
fullTranscript,
|
|
289
|
+
ragChunkIds,
|
|
290
|
+
metadata: {
|
|
291
|
+
frameCount: frames.length,
|
|
292
|
+
extractedFrameCount,
|
|
293
|
+
maxFrames: request.maxFrames,
|
|
294
|
+
sceneThreshold: request.sceneThreshold ?? 0.3,
|
|
295
|
+
descriptionDetail: request.descriptionDetail ?? 'detailed',
|
|
296
|
+
transcribeAudio: request.transcribeAudio !== false,
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
finally {
|
|
301
|
+
// Clean up all temp files
|
|
302
|
+
try {
|
|
303
|
+
rm(tmpBase, { recursive: true, force: true }).catch(() => { });
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
// Cleanup failure is non-fatal
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// -------------------------------------------------------------------------
|
|
311
|
+
// Private — ffprobe / ffmpeg helpers
|
|
312
|
+
// -------------------------------------------------------------------------
|
|
313
|
+
/**
|
|
314
|
+
* Assert that ffprobe is available on the system PATH.
|
|
315
|
+
*
|
|
316
|
+
* Attempts to run `ffprobe -version` and throws a descriptive error
|
|
317
|
+
* if the command fails or is not found.
|
|
318
|
+
*
|
|
319
|
+
* @throws {Error} With installation instructions when ffprobe is missing.
|
|
320
|
+
*/
|
|
321
|
+
async _assertFfprobeAvailable() {
|
|
322
|
+
try {
|
|
323
|
+
await execFile('ffprobe', ['-version']);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
throw new Error('VideoAnalyzer requires ffprobe (part of ffmpeg) to be installed and on your PATH. ' +
|
|
327
|
+
'Install it with: brew install ffmpeg (macOS), apt install ffmpeg (Debian/Ubuntu), ' +
|
|
328
|
+
'or download from https://ffmpeg.org/download.html');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Probe the duration of a video file using ffprobe.
|
|
333
|
+
*
|
|
334
|
+
* Runs `ffprobe -v error -show_entries format=duration -of csv=p=0`
|
|
335
|
+
* and parses the output as a floating-point number of seconds.
|
|
336
|
+
*
|
|
337
|
+
* @param videoPath - Absolute path to the video file.
|
|
338
|
+
* @returns Duration in seconds.
|
|
339
|
+
* @throws {Error} If ffprobe cannot determine the duration.
|
|
340
|
+
*/
|
|
341
|
+
async _probeDuration(videoPath) {
|
|
342
|
+
const { stdout } = await execFile('ffprobe', [
|
|
343
|
+
'-v', 'error',
|
|
344
|
+
'-show_entries', 'format=duration',
|
|
345
|
+
'-of', 'csv=p=0',
|
|
346
|
+
videoPath,
|
|
347
|
+
]);
|
|
348
|
+
const duration = parseFloat(stdout.trim());
|
|
349
|
+
if (isNaN(duration) || duration <= 0) {
|
|
350
|
+
throw new Error(`VideoAnalyzer: ffprobe returned invalid duration "${stdout.trim()}" for video.`);
|
|
351
|
+
}
|
|
352
|
+
return duration;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Extract frames from a video at 1fps using ffmpeg.
|
|
356
|
+
*
|
|
357
|
+
* Writes PNG frames to the given output directory as `frame_0001.png`,
|
|
358
|
+
* `frame_0002.png`, etc. Then reads them back into {@link Frame} objects
|
|
359
|
+
* with timestamps derived from the frame index (1fps → index = seconds).
|
|
360
|
+
*
|
|
361
|
+
* @param videoPath - Absolute path to the input video.
|
|
362
|
+
* @param framesDir - Directory to write extracted frames into.
|
|
363
|
+
* @returns Array of Frame objects sorted by timestamp.
|
|
364
|
+
*/
|
|
365
|
+
async _extractFrames(videoPath, framesDir) {
|
|
366
|
+
// Extract at 1fps — each frame represents one second of video
|
|
367
|
+
await execFile('ffmpeg', [
|
|
368
|
+
'-i', videoPath,
|
|
369
|
+
'-vf', 'fps=1',
|
|
370
|
+
'-f', 'image2',
|
|
371
|
+
join(framesDir, 'frame_%04d.png'),
|
|
372
|
+
'-y',
|
|
373
|
+
], { timeout: 120000 });
|
|
374
|
+
// Read extracted frames
|
|
375
|
+
const files = await readdir(framesDir);
|
|
376
|
+
const frameFiles = files
|
|
377
|
+
.filter((f) => f.startsWith('frame_') && f.endsWith('.png'))
|
|
378
|
+
.sort();
|
|
379
|
+
const frames = [];
|
|
380
|
+
for (let i = 0; i < frameFiles.length; i++) {
|
|
381
|
+
const sourceBuffer = await readFile(join(framesDir, frameFiles[i]));
|
|
382
|
+
const buffer = await this._decodeFrameToRgb(sourceBuffer);
|
|
383
|
+
frames.push({
|
|
384
|
+
buffer,
|
|
385
|
+
sourceBuffer,
|
|
386
|
+
// At 1fps, frame index = seconds
|
|
387
|
+
timestampSec: i,
|
|
388
|
+
index: i,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
return frames;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Run the SceneDetector over a sequence of frames and collect
|
|
395
|
+
* all scene boundaries.
|
|
396
|
+
*
|
|
397
|
+
* Converts the Frame array into an async iterable for the detector's
|
|
398
|
+
* streaming API, then collects all yielded boundaries.
|
|
399
|
+
*
|
|
400
|
+
* @param frames - Extracted video frames in time order.
|
|
401
|
+
* @param threshold - Optional scene change threshold override.
|
|
402
|
+
* @param maxScenes - Maximum number of scenes to detect.
|
|
403
|
+
* @returns Array of SceneBoundary objects.
|
|
404
|
+
*/
|
|
405
|
+
async _detectScenes(frames, threshold, maxScenes) {
|
|
406
|
+
// Build an async iterable from the frames array
|
|
407
|
+
async function* toAsyncIterable() {
|
|
408
|
+
for (const frame of frames) {
|
|
409
|
+
yield frame;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// If a custom threshold was provided, create a temporary detector
|
|
413
|
+
const detector = threshold !== undefined
|
|
414
|
+
? new SceneDetector({
|
|
415
|
+
hardCutThreshold: threshold,
|
|
416
|
+
gradualThreshold: threshold * 0.5,
|
|
417
|
+
})
|
|
418
|
+
: this._sceneDetector;
|
|
419
|
+
const boundaries = [];
|
|
420
|
+
const limit = maxScenes ?? 100;
|
|
421
|
+
for await (const boundary of detector.detectScenes(toAsyncIterable())) {
|
|
422
|
+
boundaries.push(boundary);
|
|
423
|
+
if (boundaries.length >= limit)
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
return boundaries;
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Select the frame closest to a given timestamp from the frame array.
|
|
430
|
+
*
|
|
431
|
+
* Uses a simple linear search — frame counts are typically low
|
|
432
|
+
* (one per second of video) so this is efficient enough.
|
|
433
|
+
*
|
|
434
|
+
* @param frames - Array of extracted frames.
|
|
435
|
+
* @param targetSec - Target timestamp in seconds.
|
|
436
|
+
* @returns The frame closest to the target timestamp, or undefined if empty.
|
|
437
|
+
*/
|
|
438
|
+
_selectKeyFrame(frames, targetSec) {
|
|
439
|
+
if (frames.length === 0)
|
|
440
|
+
return undefined;
|
|
441
|
+
let closest = frames[0];
|
|
442
|
+
let minDelta = Math.abs(frames[0].timestampSec - targetSec);
|
|
443
|
+
for (let i = 1; i < frames.length; i++) {
|
|
444
|
+
const delta = Math.abs(frames[i].timestampSec - targetSec);
|
|
445
|
+
if (delta < minDelta) {
|
|
446
|
+
closest = frames[i];
|
|
447
|
+
minDelta = delta;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
return closest;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Extract the audio track from a video file as 16-bit PCM WAV.
|
|
454
|
+
*
|
|
455
|
+
* Uses ffmpeg with:
|
|
456
|
+
* - `-vn`: skip video stream
|
|
457
|
+
* - `-acodec pcm_s16le`: 16-bit PCM output
|
|
458
|
+
* - `-ar 16000`: 16kHz sample rate (standard for STT)
|
|
459
|
+
* - `-ac 1`: mono channel
|
|
460
|
+
*
|
|
461
|
+
* @param videoPath - Absolute path to the input video.
|
|
462
|
+
* @param audioPath - Absolute path for the output WAV file.
|
|
463
|
+
* @returns Audio buffer, or undefined if extraction fails.
|
|
464
|
+
*/
|
|
465
|
+
async _extractAudio(videoPath, audioPath) {
|
|
466
|
+
try {
|
|
467
|
+
await execFile('ffmpeg', [
|
|
468
|
+
'-i', videoPath,
|
|
469
|
+
'-vn',
|
|
470
|
+
'-acodec', 'pcm_s16le',
|
|
471
|
+
'-ar', '16000',
|
|
472
|
+
'-ac', '1',
|
|
473
|
+
audioPath,
|
|
474
|
+
'-y',
|
|
475
|
+
], { timeout: 60000 });
|
|
476
|
+
return await readFile(audioPath);
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
return undefined;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
// -------------------------------------------------------------------------
|
|
483
|
+
// Private — LLM summary generation
|
|
484
|
+
// -------------------------------------------------------------------------
|
|
485
|
+
/**
|
|
486
|
+
* Generate an overall video summary from scene descriptions and optional
|
|
487
|
+
* transcript using an LLM via generateText().
|
|
488
|
+
*
|
|
489
|
+
* The summary captures the narrative arc, key visual elements, and any
|
|
490
|
+
* spoken content across all scenes.
|
|
491
|
+
*
|
|
492
|
+
* @param scenes - Array of rich scene descriptions.
|
|
493
|
+
* @param transcript - Optional full transcript of the video.
|
|
494
|
+
* @returns Generated summary text.
|
|
495
|
+
*/
|
|
496
|
+
async _generateSummary(scenes, transcript, userPrompt) {
|
|
497
|
+
// Build the context from scene descriptions
|
|
498
|
+
const sceneLines = scenes.map((s) => {
|
|
499
|
+
let line = `Scene ${s.index + 1} [${s.startSec.toFixed(1)}s - ${s.endSec.toFixed(1)}s]: ${s.description}`;
|
|
500
|
+
if (s.transcript) {
|
|
501
|
+
line += `\n Spoken: "${s.transcript}"`;
|
|
502
|
+
}
|
|
503
|
+
return line;
|
|
504
|
+
});
|
|
505
|
+
const prompt = [
|
|
506
|
+
'You are analyzing a video. Below are descriptions of each scene detected in the video.',
|
|
507
|
+
userPrompt
|
|
508
|
+
? `\nUser request:\n${userPrompt}`
|
|
509
|
+
: '',
|
|
510
|
+
transcript ? `\nFull transcript:\n${transcript}` : '',
|
|
511
|
+
'\nScene descriptions:',
|
|
512
|
+
...sceneLines,
|
|
513
|
+
userPrompt
|
|
514
|
+
? '\nAnswer the user request using the observable scene and transcript evidence.'
|
|
515
|
+
: '\nProvide a concise summary (2-4 sentences) of the overall video content,',
|
|
516
|
+
userPrompt
|
|
517
|
+
? 'If the request cannot be answered fully, say what is directly supported by the video.'
|
|
518
|
+
: 'capturing the narrative arc, key visual elements, and any important spoken content.',
|
|
519
|
+
].filter(Boolean).join('\n');
|
|
520
|
+
try {
|
|
521
|
+
const { generateText } = await import('../../api/generateText.js');
|
|
522
|
+
const result = await generateText({
|
|
523
|
+
prompt,
|
|
524
|
+
temperature: 0.3,
|
|
525
|
+
maxTokens: 500,
|
|
526
|
+
});
|
|
527
|
+
return result.text || 'Unable to generate summary.';
|
|
528
|
+
}
|
|
529
|
+
catch {
|
|
530
|
+
// Fallback: concatenate scene descriptions if LLM is unavailable
|
|
531
|
+
return scenes.map((s) => s.description).join(' ');
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// -------------------------------------------------------------------------
|
|
535
|
+
// Private — RAG chunk ID generation
|
|
536
|
+
// -------------------------------------------------------------------------
|
|
537
|
+
/**
|
|
538
|
+
* Build placeholder RAG chunk IDs for each scene plus the summary.
|
|
539
|
+
*
|
|
540
|
+
* In a full implementation these IDs would correspond to actual vector
|
|
541
|
+
* store documents. For now, they serve as stable identifiers that a
|
|
542
|
+
* downstream RAG indexer can use to create or reference chunks.
|
|
543
|
+
*
|
|
544
|
+
* @param scenes - Scene descriptions to create chunk IDs for.
|
|
545
|
+
* @param summary - Overall summary to create a chunk ID for.
|
|
546
|
+
* @returns Array of generated chunk ID strings.
|
|
547
|
+
*/
|
|
548
|
+
_buildRagChunkIds(scenes, summary) {
|
|
549
|
+
const ids = [];
|
|
550
|
+
// One chunk per scene
|
|
551
|
+
for (const scene of scenes) {
|
|
552
|
+
ids.push(`video-scene-${scene.index}-${randomUUID().slice(0, 8)}`);
|
|
553
|
+
}
|
|
554
|
+
// One chunk for the summary
|
|
555
|
+
if (summary) {
|
|
556
|
+
ids.push(`video-summary-${randomUUID().slice(0, 8)}`);
|
|
557
|
+
}
|
|
558
|
+
return ids;
|
|
559
|
+
}
|
|
560
|
+
// -------------------------------------------------------------------------
|
|
561
|
+
// Private — utilities
|
|
562
|
+
// -------------------------------------------------------------------------
|
|
563
|
+
/**
|
|
564
|
+
* Download a video from a URL into a Buffer.
|
|
565
|
+
*
|
|
566
|
+
* @param url - Video URL to download.
|
|
567
|
+
* @returns Video content as a Buffer.
|
|
568
|
+
*/
|
|
569
|
+
async _downloadVideo(url) {
|
|
570
|
+
const response = await fetch(url);
|
|
571
|
+
if (!response.ok) {
|
|
572
|
+
throw new Error(`VideoAnalyzer: failed to download video from ${url}: ${response.status}`);
|
|
573
|
+
}
|
|
574
|
+
return Buffer.from(await response.arrayBuffer());
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Ensure the vision pipeline is available, creating one lazily if needed.
|
|
578
|
+
*
|
|
579
|
+
* When no vision pipeline was injected via the constructor, this method
|
|
580
|
+
* dynamically imports the factory and creates a default pipeline.
|
|
581
|
+
*
|
|
582
|
+
* @returns The resolved VisionPipeline instance.
|
|
583
|
+
*/
|
|
584
|
+
async _ensureVisionPipeline() {
|
|
585
|
+
if (!this._visionPipeline) {
|
|
586
|
+
const { createVisionPipeline } = await import('../vision/index.js');
|
|
587
|
+
this._visionPipeline = await createVisionPipeline();
|
|
588
|
+
}
|
|
589
|
+
return this._visionPipeline;
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Decode an extracted frame image into a raw RGB buffer for scene detection.
|
|
593
|
+
*
|
|
594
|
+
* When decoding is unavailable, the original encoded bytes are returned so
|
|
595
|
+
* callers still get a best-effort diff signal instead of a hard failure.
|
|
596
|
+
*/
|
|
597
|
+
async _decodeFrameToRgb(buffer) {
|
|
598
|
+
try {
|
|
599
|
+
const sharpModule = await import('sharp');
|
|
600
|
+
const sharp = sharpModule.default;
|
|
601
|
+
const { data } = await sharp(buffer)
|
|
602
|
+
.removeAlpha()
|
|
603
|
+
.toColourspace('rgb')
|
|
604
|
+
.raw()
|
|
605
|
+
.toBuffer({ resolveWithObject: true });
|
|
606
|
+
return Buffer.from(data);
|
|
607
|
+
}
|
|
608
|
+
catch {
|
|
609
|
+
return buffer;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Evenly downsample a frame list while preserving order and both endpoints.
|
|
614
|
+
*/
|
|
615
|
+
_downsampleFrames(frames, maxFrames) {
|
|
616
|
+
if (maxFrames >= frames.length)
|
|
617
|
+
return frames;
|
|
618
|
+
if (maxFrames <= 1)
|
|
619
|
+
return [frames[0]];
|
|
620
|
+
const sampled = [];
|
|
621
|
+
const lastIndex = frames.length - 1;
|
|
622
|
+
for (let i = 0; i < maxFrames; i++) {
|
|
623
|
+
const index = i === maxFrames - 1
|
|
624
|
+
? lastIndex
|
|
625
|
+
: Math.floor((i * frames.length) / maxFrames);
|
|
626
|
+
const frame = frames[index];
|
|
627
|
+
if (sampled[sampled.length - 1] !== frame) {
|
|
628
|
+
sampled.push(frame);
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
return sampled;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Emit a progress event to the caller's callback, if provided.
|
|
635
|
+
*
|
|
636
|
+
* @param callback - Optional progress callback from the request.
|
|
637
|
+
* @param phase - Current pipeline phase.
|
|
638
|
+
* @param progress - Progress percentage (0-100) within the phase.
|
|
639
|
+
* @param message - Human-readable status message.
|
|
640
|
+
* @param currentScene - 0-based scene index (for describing/transcribing phases).
|
|
641
|
+
*/
|
|
642
|
+
_emitProgress(callback, phase, progress, message, currentScene) {
|
|
643
|
+
if (callback) {
|
|
644
|
+
callback({ phase, progress, message, currentScene });
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
//# sourceMappingURL=VideoAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoAnalyzer.js","sourceRoot":"","sources":["../../../src/core/video/VideoAnalyzer.ts"],"names":[],"mappings":"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"}
|