@nexus-ai-nexoralabs/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +16 -0
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/api/index.d.ts +81 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +224 -0
- package/dist/api/index.js.map +1 -0
- package/dist/chat/chatService.d.ts +49 -0
- package/dist/chat/chatService.d.ts.map +1 -0
- package/dist/chat/chatService.js +163 -0
- package/dist/chat/chatService.js.map +1 -0
- package/dist/chat/contextBuilder.d.ts +19 -0
- package/dist/chat/contextBuilder.d.ts.map +1 -0
- package/dist/chat/contextBuilder.js +43 -0
- package/dist/chat/contextBuilder.js.map +1 -0
- package/dist/chat/conversationService.d.ts +25 -0
- package/dist/chat/conversationService.d.ts.map +1 -0
- package/dist/chat/conversationService.js +55 -0
- package/dist/chat/conversationService.js.map +1 -0
- package/dist/chat/index.d.ts +6 -0
- package/dist/chat/index.d.ts.map +1 -0
- package/dist/chat/index.js +6 -0
- package/dist/chat/index.js.map +1 -0
- package/dist/chat/messageService.d.ts +18 -0
- package/dist/chat/messageService.d.ts.map +1 -0
- package/dist/chat/messageService.js +26 -0
- package/dist/chat/messageService.js.map +1 -0
- package/dist/chat/promptTemplates.d.ts +19 -0
- package/dist/chat/promptTemplates.d.ts.map +1 -0
- package/dist/chat/promptTemplates.js +32 -0
- package/dist/chat/promptTemplates.js.map +1 -0
- package/dist/cli/agentRunner.d.ts +126 -0
- package/dist/cli/agentRunner.d.ts.map +1 -0
- package/dist/cli/agentRunner.js +892 -0
- package/dist/cli/agentRunner.js.map +1 -0
- package/dist/cli/bin.d.ts +14 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +20 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/inputEngine.d.ts +76 -0
- package/dist/cli/inputEngine.d.ts.map +1 -0
- package/dist/cli/inputEngine.js +281 -0
- package/dist/cli/inputEngine.js.map +1 -0
- package/dist/cli/main.d.ts +9 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +144 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/uiFormatters.d.ts +108 -0
- package/dist/cli/uiFormatters.d.ts.map +1 -0
- package/dist/cli/uiFormatters.js +925 -0
- package/dist/cli/uiFormatters.js.map +1 -0
- package/dist/common/logger.d.ts +13 -0
- package/dist/common/logger.d.ts.map +1 -0
- package/dist/common/logger.js +43 -0
- package/dist/common/logger.js.map +1 -0
- package/dist/config/firstRunHealthCheck.d.ts +50 -0
- package/dist/config/firstRunHealthCheck.d.ts.map +1 -0
- package/dist/config/firstRunHealthCheck.js +196 -0
- package/dist/config/firstRunHealthCheck.js.map +1 -0
- package/dist/config/firstRunService.d.ts +53 -0
- package/dist/config/firstRunService.d.ts.map +1 -0
- package/dist/config/firstRunService.js +93 -0
- package/dist/config/firstRunService.js.map +1 -0
- package/dist/config/index.d.ts +30 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +65 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/productionPaths.d.ts +34 -0
- package/dist/config/productionPaths.d.ts.map +1 -0
- package/dist/config/productionPaths.js +95 -0
- package/dist/config/productionPaths.js.map +1 -0
- package/dist/config/workspaceService.d.ts +42 -0
- package/dist/config/workspaceService.d.ts.map +1 -0
- package/dist/config/workspaceService.js +218 -0
- package/dist/config/workspaceService.js.map +1 -0
- package/dist/desktop/appWindow.d.ts +21 -0
- package/dist/desktop/appWindow.d.ts.map +1 -0
- package/dist/desktop/appWindow.js +77 -0
- package/dist/desktop/appWindow.js.map +1 -0
- package/dist/desktop/main.d.ts +14 -0
- package/dist/desktop/main.d.ts.map +1 -0
- package/dist/desktop/main.js +90 -0
- package/dist/desktop/main.js.map +1 -0
- package/dist/desktop/preload.d.ts +14 -0
- package/dist/desktop/preload.d.ts.map +1 -0
- package/dist/desktop/preload.js +20 -0
- package/dist/desktop/preload.js.map +1 -0
- package/dist/intelligence/index.d.ts +33 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +82 -0
- package/dist/intelligence/index.js.map +1 -0
- package/dist/intelligence/modelGateway.d.ts +35 -0
- package/dist/intelligence/modelGateway.d.ts.map +1 -0
- package/dist/intelligence/modelGateway.js +123 -0
- package/dist/intelligence/modelGateway.js.map +1 -0
- package/dist/intelligence/modelRegistry.d.ts +17 -0
- package/dist/intelligence/modelRegistry.d.ts.map +1 -0
- package/dist/intelligence/modelRegistry.js +87 -0
- package/dist/intelligence/modelRegistry.js.map +1 -0
- package/dist/intelligence/modelRouter.d.ts +76 -0
- package/dist/intelligence/modelRouter.d.ts.map +1 -0
- package/dist/intelligence/modelRouter.js +256 -0
- package/dist/intelligence/modelRouter.js.map +1 -0
- package/dist/intelligence/ollamaAdapter.d.ts +49 -0
- package/dist/intelligence/ollamaAdapter.d.ts.map +1 -0
- package/dist/intelligence/ollamaAdapter.js +197 -0
- package/dist/intelligence/ollamaAdapter.js.map +1 -0
- package/dist/intelligence/prototype/runPrototype.d.ts +14 -0
- package/dist/intelligence/prototype/runPrototype.d.ts.map +1 -0
- package/dist/intelligence/prototype/runPrototype.js +87 -0
- package/dist/intelligence/prototype/runPrototype.js.map +1 -0
- package/dist/intelligence/providers/embeddedInferenceProvider.d.ts +29 -0
- package/dist/intelligence/providers/embeddedInferenceProvider.d.ts.map +1 -0
- package/dist/intelligence/providers/embeddedInferenceProvider.js +162 -0
- package/dist/intelligence/providers/embeddedInferenceProvider.js.map +1 -0
- package/dist/intelligence/providers/index.d.ts +4 -0
- package/dist/intelligence/providers/index.d.ts.map +1 -0
- package/dist/intelligence/providers/index.js +4 -0
- package/dist/intelligence/providers/index.js.map +1 -0
- package/dist/intelligence/providers/inferenceProvider.d.ts +98 -0
- package/dist/intelligence/providers/inferenceProvider.d.ts.map +1 -0
- package/dist/intelligence/providers/inferenceProvider.js +9 -0
- package/dist/intelligence/providers/inferenceProvider.js.map +1 -0
- package/dist/intelligence/providers/ollamaInferenceProvider.d.ts +17 -0
- package/dist/intelligence/providers/ollamaInferenceProvider.d.ts.map +1 -0
- package/dist/intelligence/providers/ollamaInferenceProvider.js +103 -0
- package/dist/intelligence/providers/ollamaInferenceProvider.js.map +1 -0
- package/dist/intelligence/provisioning/hardwareDetector.d.ts +5 -0
- package/dist/intelligence/provisioning/hardwareDetector.d.ts.map +1 -0
- package/dist/intelligence/provisioning/hardwareDetector.js +48 -0
- package/dist/intelligence/provisioning/hardwareDetector.js.map +1 -0
- package/dist/intelligence/provisioning/index.d.ts +12 -0
- package/dist/intelligence/provisioning/index.d.ts.map +1 -0
- package/dist/intelligence/provisioning/index.js +12 -0
- package/dist/intelligence/provisioning/index.js.map +1 -0
- package/dist/intelligence/provisioning/modelDownloader.d.ts +22 -0
- package/dist/intelligence/provisioning/modelDownloader.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelDownloader.js +134 -0
- package/dist/intelligence/provisioning/modelDownloader.js.map +1 -0
- package/dist/intelligence/provisioning/modelManifest.d.ts +10 -0
- package/dist/intelligence/provisioning/modelManifest.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelManifest.js +72 -0
- package/dist/intelligence/provisioning/modelManifest.js.map +1 -0
- package/dist/intelligence/provisioning/modelSelector.d.ts +14 -0
- package/dist/intelligence/provisioning/modelSelector.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelSelector.js +40 -0
- package/dist/intelligence/provisioning/modelSelector.js.map +1 -0
- package/dist/intelligence/provisioning/modelStorage.d.ts +12 -0
- package/dist/intelligence/provisioning/modelStorage.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelStorage.js +66 -0
- package/dist/intelligence/provisioning/modelStorage.js.map +1 -0
- package/dist/intelligence/provisioning/modelUpdater.d.ts +29 -0
- package/dist/intelligence/provisioning/modelUpdater.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelUpdater.js +89 -0
- package/dist/intelligence/provisioning/modelUpdater.js.map +1 -0
- package/dist/intelligence/provisioning/modelVerifier.d.ts +16 -0
- package/dist/intelligence/provisioning/modelVerifier.d.ts.map +1 -0
- package/dist/intelligence/provisioning/modelVerifier.js +108 -0
- package/dist/intelligence/provisioning/modelVerifier.js.map +1 -0
- package/dist/intelligence/provisioning/nativeRuntime.d.ts +18 -0
- package/dist/intelligence/provisioning/nativeRuntime.d.ts.map +1 -0
- package/dist/intelligence/provisioning/nativeRuntime.js +78 -0
- package/dist/intelligence/provisioning/nativeRuntime.js.map +1 -0
- package/dist/intelligence/provisioning/platformDetector.d.ts +15 -0
- package/dist/intelligence/provisioning/platformDetector.d.ts.map +1 -0
- package/dist/intelligence/provisioning/platformDetector.js +40 -0
- package/dist/intelligence/provisioning/platformDetector.js.map +1 -0
- package/dist/intelligence/provisioning/setupState.d.ts +10 -0
- package/dist/intelligence/provisioning/setupState.d.ts.map +1 -0
- package/dist/intelligence/provisioning/setupState.js +59 -0
- package/dist/intelligence/provisioning/setupState.js.map +1 -0
- package/dist/intelligence/provisioning/types.d.ts +51 -0
- package/dist/intelligence/provisioning/types.d.ts.map +1 -0
- package/dist/intelligence/provisioning/types.js +2 -0
- package/dist/intelligence/provisioning/types.js.map +1 -0
- package/dist/intelligence/runtime/embeddedRuntimeAdapter.d.ts +26 -0
- package/dist/intelligence/runtime/embeddedRuntimeAdapter.d.ts.map +1 -0
- package/dist/intelligence/runtime/embeddedRuntimeAdapter.js +119 -0
- package/dist/intelligence/runtime/embeddedRuntimeAdapter.js.map +1 -0
- package/dist/intelligence/runtime/ollamaRuntimeAdapter.d.ts +28 -0
- package/dist/intelligence/runtime/ollamaRuntimeAdapter.d.ts.map +1 -0
- package/dist/intelligence/runtime/ollamaRuntimeAdapter.js +131 -0
- package/dist/intelligence/runtime/ollamaRuntimeAdapter.js.map +1 -0
- package/dist/intelligence/runtime/runtimeManager.d.ts +37 -0
- package/dist/intelligence/runtime/runtimeManager.d.ts.map +1 -0
- package/dist/intelligence/runtime/runtimeManager.js +168 -0
- package/dist/intelligence/runtime/runtimeManager.js.map +1 -0
- package/dist/intelligence/runtime/types.d.ts +56 -0
- package/dist/intelligence/runtime/types.d.ts.map +1 -0
- package/dist/intelligence/runtime/types.js +7 -0
- package/dist/intelligence/runtime/types.js.map +1 -0
- package/dist/knowledge/chunker.d.ts +18 -0
- package/dist/knowledge/chunker.d.ts.map +1 -0
- package/dist/knowledge/chunker.js +55 -0
- package/dist/knowledge/chunker.js.map +1 -0
- package/dist/knowledge/citationService.d.ts +26 -0
- package/dist/knowledge/citationService.d.ts.map +1 -0
- package/dist/knowledge/citationService.js +47 -0
- package/dist/knowledge/citationService.js.map +1 -0
- package/dist/knowledge/embeddings.d.ts +11 -0
- package/dist/knowledge/embeddings.d.ts.map +1 -0
- package/dist/knowledge/embeddings.js +28 -0
- package/dist/knowledge/embeddings.js.map +1 -0
- package/dist/knowledge/hybridSearch.d.ts +13 -0
- package/dist/knowledge/hybridSearch.d.ts.map +1 -0
- package/dist/knowledge/hybridSearch.js +38 -0
- package/dist/knowledge/hybridSearch.js.map +1 -0
- package/dist/knowledge/index.d.ts +25 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +37 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/parsers.d.ts +20 -0
- package/dist/knowledge/parsers.d.ts.map +1 -0
- package/dist/knowledge/parsers.js +94 -0
- package/dist/knowledge/parsers.js.map +1 -0
- package/dist/knowledge/ragEngine.d.ts +24 -0
- package/dist/knowledge/ragEngine.d.ts.map +1 -0
- package/dist/knowledge/ragEngine.js +121 -0
- package/dist/knowledge/ragEngine.js.map +1 -0
- package/dist/knowledge/reranker.d.ts +10 -0
- package/dist/knowledge/reranker.d.ts.map +1 -0
- package/dist/knowledge/reranker.js +11 -0
- package/dist/knowledge/reranker.js.map +1 -0
- package/dist/knowledge/vectorStore.d.ts +22 -0
- package/dist/knowledge/vectorStore.d.ts.map +1 -0
- package/dist/knowledge/vectorStore.js +74 -0
- package/dist/knowledge/vectorStore.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +113 -0
- package/dist/main.js.map +1 -0
- package/dist/orchestration/agentExecutionService.d.ts +29 -0
- package/dist/orchestration/agentExecutionService.d.ts.map +1 -0
- package/dist/orchestration/agentExecutionService.js +306 -0
- package/dist/orchestration/agentExecutionService.js.map +1 -0
- package/dist/orchestration/agentStateMachine.d.ts +29 -0
- package/dist/orchestration/agentStateMachine.d.ts.map +1 -0
- package/dist/orchestration/agentStateMachine.js +153 -0
- package/dist/orchestration/agentStateMachine.js.map +1 -0
- package/dist/orchestration/agentTaskService.d.ts +44 -0
- package/dist/orchestration/agentTaskService.d.ts.map +1 -0
- package/dist/orchestration/agentTaskService.js +168 -0
- package/dist/orchestration/agentTaskService.js.map +1 -0
- package/dist/orchestration/codingAgentDiscovery.d.ts +32 -0
- package/dist/orchestration/codingAgentDiscovery.d.ts.map +1 -0
- package/dist/orchestration/codingAgentDiscovery.js +148 -0
- package/dist/orchestration/codingAgentDiscovery.js.map +1 -0
- package/dist/orchestration/codingAgentService.d.ts +40 -0
- package/dist/orchestration/codingAgentService.d.ts.map +1 -0
- package/dist/orchestration/codingAgentService.js +319 -0
- package/dist/orchestration/codingAgentService.js.map +1 -0
- package/dist/orchestration/codingAgentTypes.d.ts +111 -0
- package/dist/orchestration/codingAgentTypes.d.ts.map +1 -0
- package/dist/orchestration/codingAgentTypes.js +32 -0
- package/dist/orchestration/codingAgentTypes.js.map +1 -0
- package/dist/orchestration/codingAgentVerifier.d.ts +34 -0
- package/dist/orchestration/codingAgentVerifier.d.ts.map +1 -0
- package/dist/orchestration/codingAgentVerifier.js +109 -0
- package/dist/orchestration/codingAgentVerifier.js.map +1 -0
- package/dist/orchestration/codingRepairService.d.ts +34 -0
- package/dist/orchestration/codingRepairService.d.ts.map +1 -0
- package/dist/orchestration/codingRepairService.js +120 -0
- package/dist/orchestration/codingRepairService.js.map +1 -0
- package/dist/orchestration/goalCompletionVerifier.d.ts +36 -0
- package/dist/orchestration/goalCompletionVerifier.d.ts.map +1 -0
- package/dist/orchestration/goalCompletionVerifier.js +165 -0
- package/dist/orchestration/goalCompletionVerifier.js.map +1 -0
- package/dist/orchestration/humanApprovalService.d.ts +89 -0
- package/dist/orchestration/humanApprovalService.d.ts.map +1 -0
- package/dist/orchestration/humanApprovalService.js +346 -0
- package/dist/orchestration/humanApprovalService.js.map +1 -0
- package/dist/orchestration/index.d.ts +47 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +67 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/planner.d.ts +105 -0
- package/dist/orchestration/planner.d.ts.map +1 -0
- package/dist/orchestration/planner.js +692 -0
- package/dist/orchestration/planner.js.map +1 -0
- package/dist/orchestration/types.d.ts +109 -0
- package/dist/orchestration/types.d.ts.map +1 -0
- package/dist/orchestration/types.js +20 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/preview/previewServer.d.ts +39 -0
- package/dist/preview/previewServer.d.ts.map +1 -0
- package/dist/preview/previewServer.js +228 -0
- package/dist/preview/previewServer.js.map +1 -0
- package/dist/preview/previewService.d.ts +43 -0
- package/dist/preview/previewService.d.ts.map +1 -0
- package/dist/preview/previewService.js +289 -0
- package/dist/preview/previewService.js.map +1 -0
- package/dist/preview/previewTypes.d.ts +35 -0
- package/dist/preview/previewTypes.d.ts.map +1 -0
- package/dist/preview/previewTypes.js +5 -0
- package/dist/preview/previewTypes.js.map +1 -0
- package/dist/storage/database.d.ts +12 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +46 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/health.d.ts +17 -0
- package/dist/storage/health.d.ts.map +1 -0
- package/dist/storage/health.js +48 -0
- package/dist/storage/health.js.map +1 -0
- package/dist/storage/index.d.ts +45 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +96 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/migration.d.ts +17 -0
- package/dist/storage/migration.d.ts.map +1 -0
- package/dist/storage/migration.js +354 -0
- package/dist/storage/migration.js.map +1 -0
- package/dist/storage/projectService.d.ts +19 -0
- package/dist/storage/projectService.d.ts.map +1 -0
- package/dist/storage/projectService.js +29 -0
- package/dist/storage/projectService.js.map +1 -0
- package/dist/storage/repositories/agentTaskRepository.d.ts +34 -0
- package/dist/storage/repositories/agentTaskRepository.d.ts.map +1 -0
- package/dist/storage/repositories/agentTaskRepository.js +128 -0
- package/dist/storage/repositories/agentTaskRepository.js.map +1 -0
- package/dist/storage/repositories/approvalRepository.d.ts +20 -0
- package/dist/storage/repositories/approvalRepository.d.ts.map +1 -0
- package/dist/storage/repositories/approvalRepository.js +116 -0
- package/dist/storage/repositories/approvalRepository.js.map +1 -0
- package/dist/storage/repositories/conversationRepository.d.ts +16 -0
- package/dist/storage/repositories/conversationRepository.d.ts.map +1 -0
- package/dist/storage/repositories/conversationRepository.js +50 -0
- package/dist/storage/repositories/conversationRepository.js.map +1 -0
- package/dist/storage/repositories/knowledgeRepository.d.ts +109 -0
- package/dist/storage/repositories/knowledgeRepository.d.ts.map +1 -0
- package/dist/storage/repositories/knowledgeRepository.js +177 -0
- package/dist/storage/repositories/knowledgeRepository.js.map +1 -0
- package/dist/storage/repositories/messageRepository.d.ts +13 -0
- package/dist/storage/repositories/messageRepository.d.ts.map +1 -0
- package/dist/storage/repositories/messageRepository.js +39 -0
- package/dist/storage/repositories/messageRepository.js.map +1 -0
- package/dist/storage/repositories/modelsRepository.d.ts +39 -0
- package/dist/storage/repositories/modelsRepository.d.ts.map +1 -0
- package/dist/storage/repositories/modelsRepository.js +92 -0
- package/dist/storage/repositories/modelsRepository.js.map +1 -0
- package/dist/storage/repositories/projectRepository.d.ts +14 -0
- package/dist/storage/repositories/projectRepository.d.ts.map +1 -0
- package/dist/storage/repositories/projectRepository.js +44 -0
- package/dist/storage/repositories/projectRepository.js.map +1 -0
- package/dist/storage/repositories/settingsRepository.d.ts +10 -0
- package/dist/storage/repositories/settingsRepository.d.ts.map +1 -0
- package/dist/storage/repositories/settingsRepository.js +27 -0
- package/dist/storage/repositories/settingsRepository.js.map +1 -0
- package/dist/storage/repositories/types.d.ts +56 -0
- package/dist/storage/repositories/types.d.ts.map +1 -0
- package/dist/storage/repositories/types.js +2 -0
- package/dist/storage/repositories/types.js.map +1 -0
- package/dist/tools/adapters/filesystemAdapter.d.ts +121 -0
- package/dist/tools/adapters/filesystemAdapter.d.ts.map +1 -0
- package/dist/tools/adapters/filesystemAdapter.js +808 -0
- package/dist/tools/adapters/filesystemAdapter.js.map +1 -0
- package/dist/tools/adapters/terminalAdapter.d.ts +67 -0
- package/dist/tools/adapters/terminalAdapter.d.ts.map +1 -0
- package/dist/tools/adapters/terminalAdapter.js +487 -0
- package/dist/tools/adapters/terminalAdapter.js.map +1 -0
- package/dist/tools/adapters/terminalCommandPolicy.d.ts +44 -0
- package/dist/tools/adapters/terminalCommandPolicy.d.ts.map +1 -0
- package/dist/tools/adapters/terminalCommandPolicy.js +422 -0
- package/dist/tools/adapters/terminalCommandPolicy.js.map +1 -0
- package/dist/tools/adapters/terminalTypes.d.ts +111 -0
- package/dist/tools/adapters/terminalTypes.d.ts.map +1 -0
- package/dist/tools/adapters/terminalTypes.js +26 -0
- package/dist/tools/adapters/terminalTypes.js.map +1 -0
- package/dist/tools/approvalGate.d.ts +24 -0
- package/dist/tools/approvalGate.d.ts.map +1 -0
- package/dist/tools/approvalGate.js +137 -0
- package/dist/tools/approvalGate.js.map +1 -0
- package/dist/tools/approvalPolicyEngine.d.ts +32 -0
- package/dist/tools/approvalPolicyEngine.d.ts.map +1 -0
- package/dist/tools/approvalPolicyEngine.js +141 -0
- package/dist/tools/approvalPolicyEngine.js.map +1 -0
- package/dist/tools/approvalTypes.d.ts +67 -0
- package/dist/tools/approvalTypes.d.ts.map +1 -0
- package/dist/tools/approvalTypes.js +23 -0
- package/dist/tools/approvalTypes.js.map +1 -0
- package/dist/tools/index.d.ts +72 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +353 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/permissionEngine.d.ts +27 -0
- package/dist/tools/permissionEngine.d.ts.map +1 -0
- package/dist/tools/permissionEngine.js +130 -0
- package/dist/tools/permissionEngine.js.map +1 -0
- package/dist/tools/toolExecutor.d.ts +37 -0
- package/dist/tools/toolExecutor.d.ts.map +1 -0
- package/dist/tools/toolExecutor.js +440 -0
- package/dist/tools/toolExecutor.js.map +1 -0
- package/dist/tools/toolRegistry.d.ts +34 -0
- package/dist/tools/toolRegistry.d.ts.map +1 -0
- package/dist/tools/toolRegistry.js +92 -0
- package/dist/tools/toolRegistry.js.map +1 -0
- package/dist/tools/types.d.ts +82 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +33 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/ui/public/app.js +777 -0
- package/dist/ui/public/index.html +117 -0
- package/dist/ui/public/styles.css +413 -0
- package/dist/ui/server.d.ts +27 -0
- package/dist/ui/server.d.ts.map +1 -0
- package/dist/ui/server.js +373 -0
- package/dist/ui/server.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P7-H: Local Web Project Preview Service
|
|
3
|
+
*
|
|
4
|
+
* Coordinates latest completed task resolution, artifact discovery,
|
|
5
|
+
* workspace boundary validation, preview HTTP server lifecycle, and
|
|
6
|
+
* safe browser launching.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { execFile } from 'child_process';
|
|
11
|
+
import { PreviewServer } from './previewServer.js';
|
|
12
|
+
import { Logger } from '../common/logger.js';
|
|
13
|
+
export class PreviewService {
|
|
14
|
+
taskRepo;
|
|
15
|
+
workspaceRoot;
|
|
16
|
+
server;
|
|
17
|
+
logger;
|
|
18
|
+
activeTask = null;
|
|
19
|
+
constructor(taskRepo, workspaceRoot, logLevel = 'info') {
|
|
20
|
+
this.taskRepo = taskRepo;
|
|
21
|
+
this.workspaceRoot = workspaceRoot;
|
|
22
|
+
this.logger = new Logger('PreviewService', logLevel);
|
|
23
|
+
this.server = new PreviewServer(logLevel);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolve latest completed task or specific task by ID.
|
|
27
|
+
*/
|
|
28
|
+
resolveCompletedTask(taskId) {
|
|
29
|
+
if (taskId && taskId.trim()) {
|
|
30
|
+
const cleanId = taskId.trim();
|
|
31
|
+
const task = this.taskRepo.findById(cleanId);
|
|
32
|
+
if (task && task.state === 'completed') {
|
|
33
|
+
return task;
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const completed = this.taskRepo.findByState('completed');
|
|
38
|
+
if (completed.length === 0) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
// Sort descending by completedAt or updatedAt or createdAt
|
|
42
|
+
completed.sort((a, b) => {
|
|
43
|
+
const tA = new Date(a.completedAt || a.updatedAt || a.createdAt).getTime();
|
|
44
|
+
const tB = new Date(b.completedAt || b.updatedAt || b.createdAt).getTime();
|
|
45
|
+
return tB - tA;
|
|
46
|
+
});
|
|
47
|
+
return completed[0];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Discover files and project entry point created by a completed task.
|
|
51
|
+
*/
|
|
52
|
+
discoverArtifacts(task) {
|
|
53
|
+
const canonicalWorkspace = fs.realpathSync(path.resolve(this.workspaceRoot));
|
|
54
|
+
const createdFiles = [];
|
|
55
|
+
// 1. Inspect task plan steps if present
|
|
56
|
+
if (task.plan) {
|
|
57
|
+
try {
|
|
58
|
+
const planObj = typeof task.plan === 'string' ? JSON.parse(task.plan) : task.plan;
|
|
59
|
+
if (Array.isArray(planObj.steps)) {
|
|
60
|
+
for (const step of planObj.steps) {
|
|
61
|
+
if ((step.toolId === 'filesystem_write' || step.toolId === 'filesystem_edit') &&
|
|
62
|
+
step.params) {
|
|
63
|
+
const rel = step.params.relativePath || step.params.path;
|
|
64
|
+
if (rel && typeof rel === 'string') {
|
|
65
|
+
createdFiles.push(rel);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
this.logger.warn(`Failed to parse plan JSON for task '${task.id}'`, { error: String(err) });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 2. Determine base directory candidate from created files
|
|
76
|
+
let projectDir = canonicalWorkspace;
|
|
77
|
+
let entryFile = 'index.html';
|
|
78
|
+
// Look for index.html among step file targets
|
|
79
|
+
const indexRel = createdFiles.find((f) => path.basename(f).toLowerCase() === 'index.html');
|
|
80
|
+
if (indexRel) {
|
|
81
|
+
const absIndex = path.resolve(canonicalWorkspace, indexRel);
|
|
82
|
+
projectDir = path.dirname(absIndex);
|
|
83
|
+
entryFile = path.basename(absIndex);
|
|
84
|
+
}
|
|
85
|
+
else if (createdFiles.length > 0) {
|
|
86
|
+
const firstAbs = path.resolve(canonicalWorkspace, createdFiles[0]);
|
|
87
|
+
const dirCandidate = path.dirname(firstAbs);
|
|
88
|
+
if (fs.existsSync(dirCandidate) && fs.statSync(dirCandidate).isDirectory()) {
|
|
89
|
+
projectDir = dirCandidate;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Canonicalize projectDir
|
|
93
|
+
let canonicalProjectDir = canonicalWorkspace;
|
|
94
|
+
if (fs.existsSync(projectDir)) {
|
|
95
|
+
canonicalProjectDir = fs.realpathSync(projectDir);
|
|
96
|
+
}
|
|
97
|
+
// Security check: projectDir must be inside canonicalWorkspace
|
|
98
|
+
if (!canonicalProjectDir.startsWith(canonicalWorkspace)) {
|
|
99
|
+
canonicalProjectDir = canonicalWorkspace;
|
|
100
|
+
}
|
|
101
|
+
// Scan projectDir for existing files
|
|
102
|
+
const allProjectFiles = [];
|
|
103
|
+
let hasIndexHtml = false;
|
|
104
|
+
let hasWebFiles = false;
|
|
105
|
+
if (fs.existsSync(canonicalProjectDir)) {
|
|
106
|
+
const scanDir = (dir, base) => {
|
|
107
|
+
const items = fs.readdirSync(dir, { withFileTypes: true });
|
|
108
|
+
for (const item of items) {
|
|
109
|
+
const relPath = base ? `${base}/${item.name}` : item.name;
|
|
110
|
+
const fullPath = path.join(dir, item.name);
|
|
111
|
+
if (item.isDirectory() && !item.name.startsWith('.') && item.name !== 'node_modules') {
|
|
112
|
+
scanDir(fullPath, relPath);
|
|
113
|
+
}
|
|
114
|
+
else if (item.isFile()) {
|
|
115
|
+
allProjectFiles.push(relPath);
|
|
116
|
+
const lowerName = item.name.toLowerCase();
|
|
117
|
+
if (lowerName === 'index.html') {
|
|
118
|
+
hasIndexHtml = true;
|
|
119
|
+
}
|
|
120
|
+
if (lowerName.endsWith('.html') ||
|
|
121
|
+
lowerName.endsWith('.css') ||
|
|
122
|
+
lowerName.endsWith('.js')) {
|
|
123
|
+
hasWebFiles = true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
try {
|
|
129
|
+
scanDir(canonicalProjectDir, '');
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
this.logger.warn(`Error scanning directory '${canonicalProjectDir}'`, { error: String(err) });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Combine step created files and scanned files
|
|
136
|
+
const uniqueFiles = Array.from(new Set([...createdFiles, ...allProjectFiles]));
|
|
137
|
+
return {
|
|
138
|
+
projectDir: canonicalProjectDir,
|
|
139
|
+
entryFile,
|
|
140
|
+
files: uniqueFiles,
|
|
141
|
+
hasIndexHtml: hasIndexHtml || fs.existsSync(path.join(canonicalProjectDir, 'index.html')),
|
|
142
|
+
isWebProject: hasIndexHtml || hasWebFiles,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Launch preview for latest completed task or specified task ID.
|
|
147
|
+
*/
|
|
148
|
+
async preview(taskId) {
|
|
149
|
+
const task = this.resolveCompletedTask(taskId);
|
|
150
|
+
if (!task) {
|
|
151
|
+
if (taskId) {
|
|
152
|
+
return {
|
|
153
|
+
success: false,
|
|
154
|
+
status: 'NO_COMPLETED_TASK',
|
|
155
|
+
message: `Task '${taskId}' is not a completed task or does not exist.`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
success: false,
|
|
160
|
+
status: 'NO_COMPLETED_TASK',
|
|
161
|
+
message: 'No completed task is available to preview.',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
const artifacts = this.discoverArtifacts(task);
|
|
165
|
+
if (!artifacts.isWebProject) {
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
status: 'NOT_WEB_PROJECT',
|
|
169
|
+
task,
|
|
170
|
+
artifactsSummary: artifacts.files,
|
|
171
|
+
message: `Latest task '${task.title}' does not contain a previewable web project.`,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
if (!artifacts.hasIndexHtml) {
|
|
175
|
+
return {
|
|
176
|
+
success: false,
|
|
177
|
+
status: 'MISSING_INDEX',
|
|
178
|
+
task,
|
|
179
|
+
detectedFiles: artifacts.files,
|
|
180
|
+
message: 'No index.html entry point was found.',
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// Ensure projectDir is inside workspace
|
|
184
|
+
const canonicalWorkspace = fs.realpathSync(path.resolve(this.workspaceRoot));
|
|
185
|
+
if (!artifacts.projectDir.startsWith(canonicalWorkspace)) {
|
|
186
|
+
return {
|
|
187
|
+
success: false,
|
|
188
|
+
status: 'ERROR',
|
|
189
|
+
task,
|
|
190
|
+
error: 'Security Error: Preview directory is outside workspace boundaries.',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
const serverInfo = await this.server.start(artifacts.projectDir, artifacts.entryFile || 'index.html');
|
|
195
|
+
this.activeTask = task;
|
|
196
|
+
// Automatically launch browser
|
|
197
|
+
await this.openBrowser(serverInfo.url);
|
|
198
|
+
return {
|
|
199
|
+
success: true,
|
|
200
|
+
status: 'LAUNCHED',
|
|
201
|
+
task,
|
|
202
|
+
serverInfo,
|
|
203
|
+
detectedFiles: artifacts.files,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
208
|
+
this.logger.error(`Failed to start preview server for task '${task.id}'`, { error: msg });
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
status: 'ERROR',
|
|
212
|
+
task,
|
|
213
|
+
error: `Failed to start preview server: ${msg}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Stop active preview server.
|
|
219
|
+
*/
|
|
220
|
+
async stop() {
|
|
221
|
+
const info = this.server.getInfo();
|
|
222
|
+
if (!info) {
|
|
223
|
+
return {
|
|
224
|
+
success: true,
|
|
225
|
+
status: 'ALREADY_STOPPED',
|
|
226
|
+
message: 'No active preview server is currently running.',
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
await this.server.stop();
|
|
230
|
+
this.activeTask = null;
|
|
231
|
+
return {
|
|
232
|
+
success: true,
|
|
233
|
+
status: 'STOPPED',
|
|
234
|
+
message: 'Preview server stopped successfully.',
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get active preview status.
|
|
239
|
+
*/
|
|
240
|
+
getStatus() {
|
|
241
|
+
const info = this.server.getInfo();
|
|
242
|
+
if (!info) {
|
|
243
|
+
return { active: false };
|
|
244
|
+
}
|
|
245
|
+
return {
|
|
246
|
+
active: true,
|
|
247
|
+
taskId: this.activeTask?.id,
|
|
248
|
+
taskTitle: this.activeTask?.title,
|
|
249
|
+
serverInfo: info,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Open local preview URL safely in default browser without shell injection risk.
|
|
254
|
+
*/
|
|
255
|
+
async openBrowser(url) {
|
|
256
|
+
if (!url.startsWith('http://127.0.0.1:')) {
|
|
257
|
+
this.logger.warn(`Refusing to open non-loopback URL: '${url}'`);
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
return new Promise((resolve) => {
|
|
261
|
+
const platform = process.platform;
|
|
262
|
+
let command = '';
|
|
263
|
+
let args = [];
|
|
264
|
+
if (platform === 'win32') {
|
|
265
|
+
command = 'cmd.exe';
|
|
266
|
+
args = ['/c', 'start', '', url];
|
|
267
|
+
}
|
|
268
|
+
else if (platform === 'darwin') {
|
|
269
|
+
command = 'open';
|
|
270
|
+
args = [url];
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
command = 'xdg-open';
|
|
274
|
+
args = [url];
|
|
275
|
+
}
|
|
276
|
+
execFile(command, args, (err) => {
|
|
277
|
+
if (err) {
|
|
278
|
+
this.logger.warn(`Browser open command returned error (non-fatal): ${err.message}`);
|
|
279
|
+
resolve(false);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.logger.info(`Browser launched for URL: ${url}`);
|
|
283
|
+
resolve(true);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=previewService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"previewService.js","sourceRoot":"","sources":["../../src/preview/previewService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P7-H: Local Web Project Preview Types
|
|
3
|
+
*/
|
|
4
|
+
import type { AgentTask } from '../storage/repositories/types.js';
|
|
5
|
+
export type PreviewResultStatus = 'LAUNCHED' | 'NO_COMPLETED_TASK' | 'NOT_WEB_PROJECT' | 'MISSING_INDEX' | 'STOPPED' | 'ALREADY_STOPPED' | 'ERROR';
|
|
6
|
+
export interface PreviewServerInfo {
|
|
7
|
+
port: number;
|
|
8
|
+
url: string;
|
|
9
|
+
projectDir: string;
|
|
10
|
+
entryFile: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PreviewStatus {
|
|
13
|
+
active: boolean;
|
|
14
|
+
taskId?: string;
|
|
15
|
+
taskTitle?: string;
|
|
16
|
+
serverInfo?: PreviewServerInfo;
|
|
17
|
+
}
|
|
18
|
+
export interface DiscoveredArtifacts {
|
|
19
|
+
projectDir: string;
|
|
20
|
+
entryFile?: string;
|
|
21
|
+
files: string[];
|
|
22
|
+
hasIndexHtml: boolean;
|
|
23
|
+
isWebProject: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface PreviewResult {
|
|
26
|
+
success: boolean;
|
|
27
|
+
status: PreviewResultStatus;
|
|
28
|
+
task?: AgentTask;
|
|
29
|
+
serverInfo?: PreviewServerInfo;
|
|
30
|
+
detectedFiles?: string[];
|
|
31
|
+
artifactsSummary?: string[];
|
|
32
|
+
message?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=previewTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"previewTypes.d.ts","sourceRoot":"","sources":["../../src/preview/previewTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAC3B,UAAU,GACV,mBAAmB,GACnB,iBAAiB,GACjB,eAAe,GACf,SAAS,GACT,iBAAiB,GACjB,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"previewTypes.js","sourceRoot":"","sources":["../../src/preview/previewTypes.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Database as DatabaseType } from 'better-sqlite3';
|
|
2
|
+
import { LogLevel } from '../common/logger.js';
|
|
3
|
+
export declare class DatabaseConnection {
|
|
4
|
+
private databasePath;
|
|
5
|
+
private db;
|
|
6
|
+
private logger;
|
|
7
|
+
constructor(databasePath: string, logLevel?: LogLevel);
|
|
8
|
+
connect(): DatabaseType;
|
|
9
|
+
getDb(): DatabaseType;
|
|
10
|
+
close(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG/D,OAAO,EAAU,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,kBAAkB;IAK3B,OAAO,CAAC,YAAY;IAJtB,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,MAAM,CAAS;gBAGb,YAAY,EAAE,MAAM,EAC5B,QAAQ,GAAE,QAAiB;IAK7B,OAAO,IAAI,YAAY;IAwBvB,KAAK,IAAI,YAAY;IAOrB,KAAK,IAAI,IAAI;CAOd"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import { Logger } from '../common/logger.js';
|
|
5
|
+
export class DatabaseConnection {
|
|
6
|
+
databasePath;
|
|
7
|
+
db = null;
|
|
8
|
+
logger;
|
|
9
|
+
constructor(databasePath, logLevel = 'info') {
|
|
10
|
+
this.databasePath = databasePath;
|
|
11
|
+
this.logger = new Logger('DatabaseConnection', logLevel);
|
|
12
|
+
}
|
|
13
|
+
connect() {
|
|
14
|
+
if (this.db) {
|
|
15
|
+
return this.db;
|
|
16
|
+
}
|
|
17
|
+
if (this.databasePath !== ':memory:') {
|
|
18
|
+
const dir = path.dirname(path.resolve(this.databasePath));
|
|
19
|
+
if (!fs.existsSync(dir)) {
|
|
20
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
21
|
+
this.logger.info(`Created database directory at ${dir}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
this.logger.info(`Connecting to SQLite database at ${this.databasePath}`);
|
|
25
|
+
this.db = new Database(this.databasePath);
|
|
26
|
+
// Apply performance & integrity pragmas
|
|
27
|
+
this.db.pragma('journal_mode = WAL');
|
|
28
|
+
this.db.pragma('foreign_keys = ON');
|
|
29
|
+
this.db.pragma('busy_timeout = 5000');
|
|
30
|
+
return this.db;
|
|
31
|
+
}
|
|
32
|
+
getDb() {
|
|
33
|
+
if (!this.db) {
|
|
34
|
+
return this.connect();
|
|
35
|
+
}
|
|
36
|
+
return this.db;
|
|
37
|
+
}
|
|
38
|
+
close() {
|
|
39
|
+
if (this.db) {
|
|
40
|
+
this.logger.info('Closing SQLite database connection');
|
|
41
|
+
this.db.close();
|
|
42
|
+
this.db = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,EAAY,MAAM,qBAAqB,CAAC;AAEvD,MAAM,OAAO,kBAAkB;IAKnB;IAJF,EAAE,GAAwB,IAAI,CAAC;IAC/B,MAAM,CAAS;IAEvB,YACU,YAAoB,EAC5B,WAAqB,MAAM;QADnB,iBAAY,GAAZ,YAAY,CAAQ;QAG5B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1C,wCAAwC;QACxC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAEtC,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACvD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
export interface DatabaseHealthDetails {
|
|
3
|
+
connected: boolean;
|
|
4
|
+
ping: boolean;
|
|
5
|
+
schemaVersion: number;
|
|
6
|
+
integrity: string;
|
|
7
|
+
databasePath: string;
|
|
8
|
+
diskSpaceAccessible: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class DatabaseHealthCheck {
|
|
11
|
+
private db;
|
|
12
|
+
private databasePath;
|
|
13
|
+
private logger;
|
|
14
|
+
constructor(db: Database, databasePath: string);
|
|
15
|
+
check(schemaVersion: number): DatabaseHealthDetails;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/storage/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAK/C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,YAAY;IAJtB,OAAO,CAAC,MAAM,CAAqC;gBAGzC,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM;IAG9B,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB;CAsCpD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { Logger } from '../common/logger.js';
|
|
4
|
+
export class DatabaseHealthCheck {
|
|
5
|
+
db;
|
|
6
|
+
databasePath;
|
|
7
|
+
logger = new Logger('DatabaseHealthCheck');
|
|
8
|
+
constructor(db, databasePath) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
this.databasePath = databasePath;
|
|
11
|
+
}
|
|
12
|
+
check(schemaVersion) {
|
|
13
|
+
let connected = false;
|
|
14
|
+
let ping = false;
|
|
15
|
+
let integrity = 'unknown';
|
|
16
|
+
let diskSpaceAccessible = false;
|
|
17
|
+
try {
|
|
18
|
+
if (this.db) {
|
|
19
|
+
connected = true;
|
|
20
|
+
}
|
|
21
|
+
const pingRow = this.db.prepare('SELECT 1 as pingResult').get();
|
|
22
|
+
ping = pingRow?.pingResult === 1;
|
|
23
|
+
const integrityRow = this.db.prepare('PRAGMA quick_check').get();
|
|
24
|
+
if (integrityRow) {
|
|
25
|
+
integrity = Object.values(integrityRow)[0] || 'ok';
|
|
26
|
+
}
|
|
27
|
+
if (this.databasePath === ':memory:') {
|
|
28
|
+
diskSpaceAccessible = true;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const dir = path.dirname(path.resolve(this.databasePath));
|
|
32
|
+
diskSpaceAccessible = fs.existsSync(dir);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
this.logger.error('Database health check failed', { error: String(err) });
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
connected,
|
|
40
|
+
ping,
|
|
41
|
+
schemaVersion,
|
|
42
|
+
integrity,
|
|
43
|
+
databasePath: this.databasePath,
|
|
44
|
+
diskSpaceAccessible,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/storage/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAW7C,MAAM,OAAO,mBAAmB;IAIpB;IACA;IAJF,MAAM,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAEnD,YACU,EAAY,EACZ,YAAoB;QADpB,OAAE,GAAF,EAAE,CAAU;QACZ,iBAAY,GAAZ,YAAY,CAAQ;IAC3B,CAAC;IAEJ,KAAK,CAAC,aAAqB;QACzB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,SAAS,GAAG,SAAS,CAAC;QAC1B,IAAI,mBAAmB,GAAG,KAAK,CAAC;QAEhC,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACZ,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAwC,CAAC;YACtG,IAAI,GAAG,OAAO,EAAE,UAAU,KAAK,CAAC,CAAC;YAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,GAAG,EAAwC,CAAC;YACvG,IAAI,YAAY,EAAE,CAAC;gBACjB,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YACrD,CAAC;YAED,IAAI,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;gBACrC,mBAAmB,GAAG,IAAI,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC1D,mBAAmB,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO;YACL,SAAS;YACT,IAAI;YACJ,aAAa;YACb,SAAS;YACT,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,mBAAmB;SACpB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type DatabaseHealthDetails } from './health.js';
|
|
2
|
+
import { ProjectRepository } from './repositories/projectRepository.js';
|
|
3
|
+
import { ConversationRepository } from './repositories/conversationRepository.js';
|
|
4
|
+
import { MessageRepository } from './repositories/messageRepository.js';
|
|
5
|
+
import { AgentTaskRepository } from './repositories/agentTaskRepository.js';
|
|
6
|
+
import { SettingsRepository } from './repositories/settingsRepository.js';
|
|
7
|
+
import { ModelsRepository } from './repositories/modelsRepository.js';
|
|
8
|
+
import { KnowledgeRepository } from './repositories/knowledgeRepository.js';
|
|
9
|
+
import { ApprovalRepository } from './repositories/approvalRepository.js';
|
|
10
|
+
import { LogLevel } from '../common/logger.js';
|
|
11
|
+
export interface SubsystemStatus {
|
|
12
|
+
name: string;
|
|
13
|
+
initialized: boolean;
|
|
14
|
+
status: 'ok' | 'degraded' | 'error';
|
|
15
|
+
message?: string;
|
|
16
|
+
details?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface IStorageService {
|
|
19
|
+
initialize(): Promise<SubsystemStatus>;
|
|
20
|
+
getStatus(): SubsystemStatus;
|
|
21
|
+
}
|
|
22
|
+
export declare class StorageService implements IStorageService {
|
|
23
|
+
private databasePath;
|
|
24
|
+
private initialized;
|
|
25
|
+
private dbConn;
|
|
26
|
+
private db;
|
|
27
|
+
private migrationRunner;
|
|
28
|
+
private healthCheck;
|
|
29
|
+
private logger;
|
|
30
|
+
projects: ProjectRepository;
|
|
31
|
+
conversations: ConversationRepository;
|
|
32
|
+
messages: MessageRepository;
|
|
33
|
+
agentTasks: AgentTaskRepository;
|
|
34
|
+
settings: SettingsRepository;
|
|
35
|
+
models: ModelsRepository;
|
|
36
|
+
knowledge: KnowledgeRepository;
|
|
37
|
+
approvals: ApprovalRepository;
|
|
38
|
+
constructor(databasePath?: string, logLevel?: LogLevel);
|
|
39
|
+
initialize(): Promise<SubsystemStatus>;
|
|
40
|
+
getHealthDetails(): DatabaseHealthDetails | null;
|
|
41
|
+
getStatus(): SubsystemStatus;
|
|
42
|
+
close(): void;
|
|
43
|
+
}
|
|
44
|
+
export * from './projectService.js';
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAU,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,OAAO,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,SAAS,IAAI,eAAe,CAAC;CAC9B;AAED,qBAAa,cAAe,YAAW,eAAe;IAkBlD,OAAO,CAAC,YAAY;IAjBtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,MAAM,CAAS;IAEhB,QAAQ,EAAG,iBAAiB,CAAC;IAC7B,aAAa,EAAG,sBAAsB,CAAC;IACvC,QAAQ,EAAG,iBAAiB,CAAC;IAC7B,UAAU,EAAG,mBAAmB,CAAC;IACjC,QAAQ,EAAG,kBAAkB,CAAC;IAC9B,MAAM,EAAG,gBAAgB,CAAC;IAC1B,SAAS,EAAG,mBAAmB,CAAC;IAChC,SAAS,EAAG,kBAAkB,CAAC;gBAG5B,YAAY,GAAE,MAA8B,EACpD,QAAQ,GAAE,QAAiB;IAMvB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAgC5C,gBAAgB,IAAI,qBAAqB,GAAG,IAAI;IAQhD,SAAS,IAAI,eAAe;IAsB5B,KAAK,IAAI,IAAI;CAKd;AAED,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { DatabaseConnection } from './database.js';
|
|
2
|
+
import { MigrationRunner } from './migration.js';
|
|
3
|
+
import { DatabaseHealthCheck } from './health.js';
|
|
4
|
+
import { ProjectRepository } from './repositories/projectRepository.js';
|
|
5
|
+
import { ConversationRepository } from './repositories/conversationRepository.js';
|
|
6
|
+
import { MessageRepository } from './repositories/messageRepository.js';
|
|
7
|
+
import { AgentTaskRepository } from './repositories/agentTaskRepository.js';
|
|
8
|
+
import { SettingsRepository } from './repositories/settingsRepository.js';
|
|
9
|
+
import { ModelsRepository } from './repositories/modelsRepository.js';
|
|
10
|
+
import { KnowledgeRepository } from './repositories/knowledgeRepository.js';
|
|
11
|
+
import { ApprovalRepository } from './repositories/approvalRepository.js';
|
|
12
|
+
import { Logger } from '../common/logger.js';
|
|
13
|
+
export class StorageService {
|
|
14
|
+
databasePath;
|
|
15
|
+
initialized = false;
|
|
16
|
+
dbConn;
|
|
17
|
+
db = null;
|
|
18
|
+
migrationRunner = null;
|
|
19
|
+
healthCheck = null;
|
|
20
|
+
logger;
|
|
21
|
+
projects;
|
|
22
|
+
conversations;
|
|
23
|
+
messages;
|
|
24
|
+
agentTasks;
|
|
25
|
+
settings;
|
|
26
|
+
models;
|
|
27
|
+
knowledge;
|
|
28
|
+
approvals;
|
|
29
|
+
constructor(databasePath = './data/nexus.sqlite', logLevel = 'info') {
|
|
30
|
+
this.databasePath = databasePath;
|
|
31
|
+
this.logger = new Logger('StorageService', logLevel);
|
|
32
|
+
this.dbConn = new DatabaseConnection(this.databasePath, logLevel);
|
|
33
|
+
}
|
|
34
|
+
async initialize() {
|
|
35
|
+
try {
|
|
36
|
+
this.db = this.dbConn.connect();
|
|
37
|
+
this.migrationRunner = new MigrationRunner(this.db);
|
|
38
|
+
this.migrationRunner.runMigrations();
|
|
39
|
+
this.projects = new ProjectRepository(this.db);
|
|
40
|
+
this.conversations = new ConversationRepository(this.db);
|
|
41
|
+
this.messages = new MessageRepository(this.db);
|
|
42
|
+
this.agentTasks = new AgentTaskRepository(this.db);
|
|
43
|
+
this.settings = new SettingsRepository(this.db);
|
|
44
|
+
this.models = new ModelsRepository(this.db);
|
|
45
|
+
this.knowledge = new KnowledgeRepository(this.db);
|
|
46
|
+
this.approvals = new ApprovalRepository(this.db);
|
|
47
|
+
this.healthCheck = new DatabaseHealthCheck(this.db, this.databasePath);
|
|
48
|
+
this.initialized = true;
|
|
49
|
+
this.logger.info('StorageService subsystem fully initialized with SQLite persistence');
|
|
50
|
+
return this.getStatus();
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
this.logger.error('Failed to initialize StorageService', { error: String(err) });
|
|
54
|
+
this.initialized = false;
|
|
55
|
+
return {
|
|
56
|
+
name: 'StorageService',
|
|
57
|
+
initialized: false,
|
|
58
|
+
status: 'error',
|
|
59
|
+
message: `Initialization failed: ${String(err)}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
getHealthDetails() {
|
|
64
|
+
if (!this.db || !this.healthCheck || !this.migrationRunner) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const currentVersion = this.migrationRunner.getCurrentVersion();
|
|
68
|
+
return this.healthCheck.check(currentVersion);
|
|
69
|
+
}
|
|
70
|
+
getStatus() {
|
|
71
|
+
if (!this.initialized || !this.db) {
|
|
72
|
+
return {
|
|
73
|
+
name: 'StorageService',
|
|
74
|
+
initialized: false,
|
|
75
|
+
status: 'degraded',
|
|
76
|
+
message: 'Uninitialized',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const health = this.getHealthDetails();
|
|
80
|
+
const isOk = health?.connected && health?.ping && health?.integrity === 'ok';
|
|
81
|
+
return {
|
|
82
|
+
name: 'StorageService',
|
|
83
|
+
initialized: true,
|
|
84
|
+
status: isOk ? 'ok' : 'degraded',
|
|
85
|
+
message: isOk ? `SQLite engine ready (v${health?.schemaVersion})` : 'Database health degraded',
|
|
86
|
+
details: health ? health : undefined,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
close() {
|
|
90
|
+
this.dbConn.close();
|
|
91
|
+
this.db = null;
|
|
92
|
+
this.initialized = false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export * from './projectService.js';
|
|
96
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|