@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,65 @@
|
|
|
1
|
+
import { Logger } from '../common/logger.js';
|
|
2
|
+
import { resolveProductionPaths } from './productionPaths.js';
|
|
3
|
+
export { resolveProductionPaths, getBaseUserDataDir } from './productionPaths.js';
|
|
4
|
+
/** Current configuration schema version. Bump when AppConfig gains breaking new fields. */
|
|
5
|
+
export const CONFIG_VERSION = 1;
|
|
6
|
+
export class ConfigService {
|
|
7
|
+
config;
|
|
8
|
+
logger = new Logger('ConfigService');
|
|
9
|
+
constructor(env = process.env) {
|
|
10
|
+
this.config = this.parseAndValidate(env);
|
|
11
|
+
this.logger.info('Configuration successfully loaded', {
|
|
12
|
+
environment: this.config.environment,
|
|
13
|
+
port: this.config.port,
|
|
14
|
+
databasePath: this.config.databasePath,
|
|
15
|
+
workspaceRoot: this.config.workspaceRoot,
|
|
16
|
+
logLevel: this.config.logLevel,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
parseAndValidate(env) {
|
|
20
|
+
const rawPort = env.PORT || '3000';
|
|
21
|
+
const port = parseInt(rawPort, 10);
|
|
22
|
+
if (isNaN(port) || port < 0 || port > 65535) {
|
|
23
|
+
throw new Error(`Invalid PORT configuration value: "${rawPort}". Must be integer between 0 and 65535.`);
|
|
24
|
+
}
|
|
25
|
+
const rawEnv = env.NODE_ENV || 'development';
|
|
26
|
+
if (!['development', 'production', 'test'].includes(rawEnv)) {
|
|
27
|
+
throw new Error(`Invalid NODE_ENV configuration value: "${rawEnv}". Allowed: development, production, test.`);
|
|
28
|
+
}
|
|
29
|
+
const rawLogLevel = (env.LOG_LEVEL || 'info').toLowerCase();
|
|
30
|
+
if (!['debug', 'info', 'warn', 'error'].includes(rawLogLevel)) {
|
|
31
|
+
throw new Error(`Invalid LOG_LEVEL configuration value: "${rawLogLevel}". Allowed: debug, info, warn, error.`);
|
|
32
|
+
}
|
|
33
|
+
const resolvedPaths = resolveProductionPaths(env);
|
|
34
|
+
const ollamaHost = env.OLLAMA_HOST || 'http://127.0.0.1:11434';
|
|
35
|
+
const databasePath = resolvedPaths.databasePath;
|
|
36
|
+
const workspaceRoot = resolvedPaths.workspaceRoot;
|
|
37
|
+
// Optional model pins — no error if absent; ModelRouter handles missing gracefully
|
|
38
|
+
const primaryModel = env.PRIMARY_MODEL?.trim() || undefined;
|
|
39
|
+
const fallbackModel = env.FALLBACK_MODEL?.trim() || undefined;
|
|
40
|
+
const envProvider = env.NEXUS_INFERENCE_PROVIDER || env.NEXUS_PROVIDER;
|
|
41
|
+
const nexusInferenceProvider = ['embedded', 'ollama', 'auto'].includes(envProvider)
|
|
42
|
+
? envProvider
|
|
43
|
+
: undefined;
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
port,
|
|
46
|
+
environment: rawEnv,
|
|
47
|
+
ollamaHost,
|
|
48
|
+
databasePath,
|
|
49
|
+
workspaceRoot,
|
|
50
|
+
logLevel: rawLogLevel,
|
|
51
|
+
primaryModel,
|
|
52
|
+
fallbackModel,
|
|
53
|
+
nexusInferenceProvider,
|
|
54
|
+
configVersion: CONFIG_VERSION,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
getConfig() {
|
|
58
|
+
return this.config;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export function loadConfig(env) {
|
|
62
|
+
const service = new ConfigService(env);
|
|
63
|
+
return service.getConfig();
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Production Path Resolution (P7-E)
|
|
3
|
+
*
|
|
4
|
+
* Resolves standard user data, database, log, and workspace paths for Windows
|
|
5
|
+
* desktop packaging. Separates read-only application installation files from
|
|
6
|
+
* writable user data directories.
|
|
7
|
+
*
|
|
8
|
+
* In Production:
|
|
9
|
+
* - User Data Dir: %APPDATA%\NEXUS AI\
|
|
10
|
+
* - Database Path: %APPDATA%\NEXUS AI\data\nexus.sqlite
|
|
11
|
+
* - Log Directory: %APPDATA%\NEXUS AI\logs\
|
|
12
|
+
* - Workspace Root: %USERPROFILE%\NEXUS-Workspace (User configurable)
|
|
13
|
+
*
|
|
14
|
+
* In Development / Test:
|
|
15
|
+
* - Uses relative fallback paths (e.g. ./data/nexus.sqlite, ./workspace)
|
|
16
|
+
*/
|
|
17
|
+
export interface ResolvedAppPaths {
|
|
18
|
+
userDataDir: string;
|
|
19
|
+
databasePath: string;
|
|
20
|
+
logDir: string;
|
|
21
|
+
workspaceRoot: string;
|
|
22
|
+
isProduction: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns the OS-specific base directory for user data.
|
|
26
|
+
* Windows: %APPDATA%\NEXUS AI
|
|
27
|
+
* Fallback: ~/.nexus-ai
|
|
28
|
+
*/
|
|
29
|
+
export declare function getBaseUserDataDir(env?: Record<string, string | undefined>): string;
|
|
30
|
+
/**
|
|
31
|
+
* Resolves all application paths based on environment and explicitly provided overrides.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resolveProductionPaths(env?: Record<string, string | undefined>): ResolvedAppPaths;
|
|
34
|
+
//# sourceMappingURL=productionPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productionPaths.d.ts","sourceRoot":"","sources":["../../src/config/productionPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,CAKhG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,gBAAgB,CA2D9G"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Production Path Resolution (P7-E)
|
|
3
|
+
*
|
|
4
|
+
* Resolves standard user data, database, log, and workspace paths for Windows
|
|
5
|
+
* desktop packaging. Separates read-only application installation files from
|
|
6
|
+
* writable user data directories.
|
|
7
|
+
*
|
|
8
|
+
* In Production:
|
|
9
|
+
* - User Data Dir: %APPDATA%\NEXUS AI\
|
|
10
|
+
* - Database Path: %APPDATA%\NEXUS AI\data\nexus.sqlite
|
|
11
|
+
* - Log Directory: %APPDATA%\NEXUS AI\logs\
|
|
12
|
+
* - Workspace Root: %USERPROFILE%\NEXUS-Workspace (User configurable)
|
|
13
|
+
*
|
|
14
|
+
* In Development / Test:
|
|
15
|
+
* - Uses relative fallback paths (e.g. ./data/nexus.sqlite, ./workspace)
|
|
16
|
+
*/
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import * as os from 'os';
|
|
20
|
+
/**
|
|
21
|
+
* Returns the OS-specific base directory for user data.
|
|
22
|
+
* Windows: %APPDATA%\NEXUS AI
|
|
23
|
+
* Fallback: ~/.nexus-ai
|
|
24
|
+
*/
|
|
25
|
+
export function getBaseUserDataDir(env = process.env) {
|
|
26
|
+
if (env.APPDATA) {
|
|
27
|
+
return path.join(env.APPDATA, 'NEXUS AI');
|
|
28
|
+
}
|
|
29
|
+
return path.join(os.homedir(), '.nexus-ai');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves all application paths based on environment and explicitly provided overrides.
|
|
33
|
+
*/
|
|
34
|
+
export function resolveProductionPaths(env = process.env) {
|
|
35
|
+
const isExplicitNonProd = env.NODE_ENV === 'test' || env.NODE_ENV === 'development' || Boolean(env.VITEST || process.env.VITEST);
|
|
36
|
+
const isProduction = env.NODE_ENV === 'production' || (!isExplicitNonProd && typeof process !== 'undefined' && process.defaultApp === undefined);
|
|
37
|
+
const baseDir = getBaseUserDataDir(env);
|
|
38
|
+
// Database path resolution
|
|
39
|
+
let databasePath;
|
|
40
|
+
if (env.DATABASE_PATH) {
|
|
41
|
+
databasePath = env.DATABASE_PATH;
|
|
42
|
+
}
|
|
43
|
+
else if (isProduction) {
|
|
44
|
+
databasePath = path.join(baseDir, 'data', 'nexus.sqlite');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
databasePath = './data/nexus.sqlite';
|
|
48
|
+
}
|
|
49
|
+
// Log directory resolution
|
|
50
|
+
let logDir;
|
|
51
|
+
if (env.LOG_DIR) {
|
|
52
|
+
logDir = env.LOG_DIR;
|
|
53
|
+
}
|
|
54
|
+
else if (isProduction) {
|
|
55
|
+
logDir = path.join(baseDir, 'logs');
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
logDir = './logs';
|
|
59
|
+
}
|
|
60
|
+
// Workspace root resolution
|
|
61
|
+
let workspaceRoot;
|
|
62
|
+
if (env.WORKSPACE_ROOT) {
|
|
63
|
+
workspaceRoot = env.WORKSPACE_ROOT;
|
|
64
|
+
}
|
|
65
|
+
else if (isProduction) {
|
|
66
|
+
workspaceRoot = path.join(os.homedir(), 'NEXUS-Workspace');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
workspaceRoot = './workspace';
|
|
70
|
+
}
|
|
71
|
+
// Ensure directories exist for writable production paths
|
|
72
|
+
if (isProduction || env.NODE_ENV !== 'test') {
|
|
73
|
+
try {
|
|
74
|
+
const dbDir = path.dirname(path.resolve(databasePath));
|
|
75
|
+
if (!fs.existsSync(dbDir)) {
|
|
76
|
+
fs.mkdirSync(dbDir, { recursive: true });
|
|
77
|
+
}
|
|
78
|
+
const resolvedLogDir = path.resolve(logDir);
|
|
79
|
+
if (!fs.existsSync(resolvedLogDir)) {
|
|
80
|
+
fs.mkdirSync(resolvedLogDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Non-fatal if filesystem is read-only in specialized test runners
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
userDataDir: baseDir,
|
|
89
|
+
databasePath,
|
|
90
|
+
logDir,
|
|
91
|
+
workspaceRoot,
|
|
92
|
+
isProduction,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=productionPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"productionPaths.js","sourceRoot":"","sources":["../../src/config/productionPaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — WorkspaceService (P7-C)
|
|
3
|
+
*
|
|
4
|
+
* Centralizes workspace lifecycle operations: validation, creation, access checks,
|
|
5
|
+
* canonical path resolution, and traversal prevention.
|
|
6
|
+
*
|
|
7
|
+
* Security invariants:
|
|
8
|
+
* - NEVER allows path traversal beyond a given base
|
|
9
|
+
* - NEVER touches secret files
|
|
10
|
+
* - NEVER calls ToolGateway / PermissionEngine (runs pre-bootstrap)
|
|
11
|
+
* - Canonical path is the ONLY path ever stored or returned
|
|
12
|
+
*/
|
|
13
|
+
import { LogLevel } from '../common/logger.js';
|
|
14
|
+
export type WorkspaceState = 'WORKSPACE_READY' | 'WORKSPACE_CREATED' | 'WORKSPACE_INVALID' | 'WORKSPACE_UNAVAILABLE' | 'WORKSPACE_NOT_ACCESSIBLE';
|
|
15
|
+
export interface WorkspaceValidationResult {
|
|
16
|
+
state: WorkspaceState;
|
|
17
|
+
canonicalPath: string;
|
|
18
|
+
existed: boolean;
|
|
19
|
+
readable: boolean;
|
|
20
|
+
writable: boolean;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class WorkspaceService {
|
|
24
|
+
private logger;
|
|
25
|
+
constructor(logLevel?: LogLevel);
|
|
26
|
+
/**
|
|
27
|
+
* Validates an existing workspace path without creating it.
|
|
28
|
+
* Returns the canonical path and access state.
|
|
29
|
+
*/
|
|
30
|
+
validateWorkspace(rawPath: string): WorkspaceValidationResult;
|
|
31
|
+
/**
|
|
32
|
+
* Validates and, if the workspace does not yet exist, creates it (mkdir -p).
|
|
33
|
+
* The path is canonicalized BEFORE any filesystem operation.
|
|
34
|
+
*/
|
|
35
|
+
initializeWorkspace(rawPath: string): WorkspaceValidationResult;
|
|
36
|
+
private _validate;
|
|
37
|
+
/** Returns true if the raw path string contains traversal patterns before resolution. */
|
|
38
|
+
private _containsTraversal;
|
|
39
|
+
/** Rejects well-known system root paths that should never be used as workspaces. */
|
|
40
|
+
private _isDangerousSystemPath;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=workspaceService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceService.d.ts","sourceRoot":"","sources":["../../src/config/workspaceService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAU,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,MAAM,cAAc,GACtB,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,uBAAuB,GACvB,0BAA0B,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,cAAc,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,GAAE,QAAiB;IAIvC;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB;IAI7D;;;OAGG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB;IAI/D,OAAO,CAAC,SAAS;IAuKjB,yFAAyF;IACzF,OAAO,CAAC,kBAAkB;IAM1B,oFAAoF;IACpF,OAAO,CAAC,sBAAsB;CAc/B"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — WorkspaceService (P7-C)
|
|
3
|
+
*
|
|
4
|
+
* Centralizes workspace lifecycle operations: validation, creation, access checks,
|
|
5
|
+
* canonical path resolution, and traversal prevention.
|
|
6
|
+
*
|
|
7
|
+
* Security invariants:
|
|
8
|
+
* - NEVER allows path traversal beyond a given base
|
|
9
|
+
* - NEVER touches secret files
|
|
10
|
+
* - NEVER calls ToolGateway / PermissionEngine (runs pre-bootstrap)
|
|
11
|
+
* - Canonical path is the ONLY path ever stored or returned
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'fs';
|
|
14
|
+
import * as path from 'path';
|
|
15
|
+
import { Logger } from '../common/logger.js';
|
|
16
|
+
export class WorkspaceService {
|
|
17
|
+
logger;
|
|
18
|
+
constructor(logLevel = 'info') {
|
|
19
|
+
this.logger = new Logger('WorkspaceService', logLevel);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Validates an existing workspace path without creating it.
|
|
23
|
+
* Returns the canonical path and access state.
|
|
24
|
+
*/
|
|
25
|
+
validateWorkspace(rawPath) {
|
|
26
|
+
return this._validate(rawPath, false);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validates and, if the workspace does not yet exist, creates it (mkdir -p).
|
|
30
|
+
* The path is canonicalized BEFORE any filesystem operation.
|
|
31
|
+
*/
|
|
32
|
+
initializeWorkspace(rawPath) {
|
|
33
|
+
return this._validate(rawPath, true);
|
|
34
|
+
}
|
|
35
|
+
_validate(rawPath, allowCreate) {
|
|
36
|
+
if (!rawPath || typeof rawPath !== 'string' || rawPath.trim() === '') {
|
|
37
|
+
return {
|
|
38
|
+
state: 'WORKSPACE_INVALID',
|
|
39
|
+
canonicalPath: '',
|
|
40
|
+
existed: false,
|
|
41
|
+
readable: false,
|
|
42
|
+
writable: false,
|
|
43
|
+
reason: 'Workspace path is empty or missing.',
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
let canonicalPath;
|
|
47
|
+
try {
|
|
48
|
+
// Resolve against cwd to make relative paths absolute, then normalize
|
|
49
|
+
const resolved = path.resolve(rawPath);
|
|
50
|
+
canonicalPath = resolved;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {
|
|
54
|
+
state: 'WORKSPACE_INVALID',
|
|
55
|
+
canonicalPath: rawPath,
|
|
56
|
+
existed: false,
|
|
57
|
+
readable: false,
|
|
58
|
+
writable: false,
|
|
59
|
+
reason: `Workspace path could not be resolved: "${rawPath}"`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Reject paths that contain traversal segments after resolution
|
|
63
|
+
if (this._containsTraversal(rawPath)) {
|
|
64
|
+
this.logger.warn(`Workspace traversal attempt rejected: "${rawPath}"`);
|
|
65
|
+
return {
|
|
66
|
+
state: 'WORKSPACE_INVALID',
|
|
67
|
+
canonicalPath,
|
|
68
|
+
existed: false,
|
|
69
|
+
readable: false,
|
|
70
|
+
writable: false,
|
|
71
|
+
reason: `Workspace path contains traversal segments and was rejected for safety.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Reject obviously dangerous system paths
|
|
75
|
+
if (this._isDangerousSystemPath(canonicalPath)) {
|
|
76
|
+
return {
|
|
77
|
+
state: 'WORKSPACE_INVALID',
|
|
78
|
+
canonicalPath,
|
|
79
|
+
existed: false,
|
|
80
|
+
readable: false,
|
|
81
|
+
writable: false,
|
|
82
|
+
reason: `Workspace path points to a protected system directory and cannot be used.`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
let existed = false;
|
|
86
|
+
try {
|
|
87
|
+
existed = fs.existsSync(canonicalPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return {
|
|
91
|
+
state: 'WORKSPACE_UNAVAILABLE',
|
|
92
|
+
canonicalPath,
|
|
93
|
+
existed: false,
|
|
94
|
+
readable: false,
|
|
95
|
+
writable: false,
|
|
96
|
+
reason: `Could not determine workspace existence for path: "${canonicalPath}"`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (!existed) {
|
|
100
|
+
if (!allowCreate) {
|
|
101
|
+
return {
|
|
102
|
+
state: 'WORKSPACE_NOT_ACCESSIBLE',
|
|
103
|
+
canonicalPath,
|
|
104
|
+
existed: false,
|
|
105
|
+
readable: false,
|
|
106
|
+
writable: false,
|
|
107
|
+
reason: `Workspace directory does not exist: "${canonicalPath}"`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Try to create workspace
|
|
111
|
+
try {
|
|
112
|
+
fs.mkdirSync(canonicalPath, { recursive: true });
|
|
113
|
+
this.logger.info(`Workspace created at: ${canonicalPath}`);
|
|
114
|
+
return {
|
|
115
|
+
state: 'WORKSPACE_CREATED',
|
|
116
|
+
canonicalPath,
|
|
117
|
+
existed: false,
|
|
118
|
+
readable: true,
|
|
119
|
+
writable: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
124
|
+
return {
|
|
125
|
+
state: 'WORKSPACE_NOT_ACCESSIBLE',
|
|
126
|
+
canonicalPath,
|
|
127
|
+
existed: false,
|
|
128
|
+
readable: false,
|
|
129
|
+
writable: false,
|
|
130
|
+
reason: `Failed to create workspace directory: ${msg}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Workspace exists — verify it is a directory
|
|
135
|
+
try {
|
|
136
|
+
const stat = fs.statSync(canonicalPath);
|
|
137
|
+
if (!stat.isDirectory()) {
|
|
138
|
+
return {
|
|
139
|
+
state: 'WORKSPACE_INVALID',
|
|
140
|
+
canonicalPath,
|
|
141
|
+
existed: true,
|
|
142
|
+
readable: false,
|
|
143
|
+
writable: false,
|
|
144
|
+
reason: `Workspace path exists but is not a directory: "${canonicalPath}"`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
150
|
+
return {
|
|
151
|
+
state: 'WORKSPACE_UNAVAILABLE',
|
|
152
|
+
canonicalPath,
|
|
153
|
+
existed: true,
|
|
154
|
+
readable: false,
|
|
155
|
+
writable: false,
|
|
156
|
+
reason: `Could not stat workspace path: ${msg}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Probe read access
|
|
160
|
+
let readable = false;
|
|
161
|
+
try {
|
|
162
|
+
fs.accessSync(canonicalPath, fs.constants.R_OK);
|
|
163
|
+
readable = true;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
readable = false;
|
|
167
|
+
}
|
|
168
|
+
// Probe write access
|
|
169
|
+
let writable = false;
|
|
170
|
+
try {
|
|
171
|
+
fs.accessSync(canonicalPath, fs.constants.W_OK);
|
|
172
|
+
writable = true;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
writable = false;
|
|
176
|
+
}
|
|
177
|
+
if (!readable || !writable) {
|
|
178
|
+
return {
|
|
179
|
+
state: 'WORKSPACE_NOT_ACCESSIBLE',
|
|
180
|
+
canonicalPath,
|
|
181
|
+
existed: true,
|
|
182
|
+
readable,
|
|
183
|
+
writable,
|
|
184
|
+
reason: `Workspace directory is not fully accessible (readable=${readable}, writable=${writable}).`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
this.logger.info(`Workspace ready at: ${canonicalPath}`);
|
|
188
|
+
return {
|
|
189
|
+
state: 'WORKSPACE_READY',
|
|
190
|
+
canonicalPath,
|
|
191
|
+
existed: true,
|
|
192
|
+
readable: true,
|
|
193
|
+
writable: true,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/** Returns true if the raw path string contains traversal patterns before resolution. */
|
|
197
|
+
_containsTraversal(rawPath) {
|
|
198
|
+
const normalized = rawPath.replace(/\\/g, '/');
|
|
199
|
+
const parts = normalized.split('/');
|
|
200
|
+
return parts.some((p) => p === '..');
|
|
201
|
+
}
|
|
202
|
+
/** Rejects well-known system root paths that should never be used as workspaces. */
|
|
203
|
+
_isDangerousSystemPath(canonicalPath) {
|
|
204
|
+
const dangerous = [
|
|
205
|
+
'C:\\Windows',
|
|
206
|
+
'C:\\Windows\\System32',
|
|
207
|
+
'/etc',
|
|
208
|
+
'/bin',
|
|
209
|
+
'/usr',
|
|
210
|
+
'/sys',
|
|
211
|
+
'/proc',
|
|
212
|
+
'/dev',
|
|
213
|
+
];
|
|
214
|
+
const norm = canonicalPath.replace(/\\/g, '/').toLowerCase();
|
|
215
|
+
return dangerous.some((d) => norm === d.replace(/\\/g, '/').toLowerCase());
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=workspaceService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceService.js","sourceRoot":"","sources":["../../src/config/workspaceService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Desktop App Window Manager (P7-E)
|
|
3
|
+
*
|
|
4
|
+
* Manages the Electron BrowserWindow lifecycle and security configuration.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY INVARIANTS:
|
|
7
|
+
* - contextIsolation: true
|
|
8
|
+
* - nodeIntegration: false
|
|
9
|
+
* - sandbox: true
|
|
10
|
+
* - webSecurity: true
|
|
11
|
+
* - Navigates ONLY to http://127.0.0.1:${port}
|
|
12
|
+
* - Blocks external popups and arbitrary web navigation.
|
|
13
|
+
*/
|
|
14
|
+
import { BrowserWindow } from 'electron';
|
|
15
|
+
export declare class AppWindow {
|
|
16
|
+
private window;
|
|
17
|
+
createWindow(port: number): BrowserWindow;
|
|
18
|
+
getWindow(): BrowserWindow | null;
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=appWindow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appWindow.d.ts","sourceRoot":"","sources":["../../src/desktop/appWindow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAS,MAAM,UAAU,CAAC;AAOhD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA8B;IAE5C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa;IAuDzC,SAAS,IAAI,aAAa,GAAG,IAAI;IAIjC,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Desktop App Window Manager (P7-E)
|
|
3
|
+
*
|
|
4
|
+
* Manages the Electron BrowserWindow lifecycle and security configuration.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY INVARIANTS:
|
|
7
|
+
* - contextIsolation: true
|
|
8
|
+
* - nodeIntegration: false
|
|
9
|
+
* - sandbox: true
|
|
10
|
+
* - webSecurity: true
|
|
11
|
+
* - Navigates ONLY to http://127.0.0.1:${port}
|
|
12
|
+
* - Blocks external popups and arbitrary web navigation.
|
|
13
|
+
*/
|
|
14
|
+
import { BrowserWindow, shell } from 'electron';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { fileURLToPath } from 'url';
|
|
17
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
18
|
+
const __dirname = path.dirname(__filename);
|
|
19
|
+
export class AppWindow {
|
|
20
|
+
window = null;
|
|
21
|
+
createWindow(port) {
|
|
22
|
+
const preloadPath = path.join(__dirname, 'preload.js');
|
|
23
|
+
this.window = new BrowserWindow({
|
|
24
|
+
width: 1440,
|
|
25
|
+
height: 900,
|
|
26
|
+
minWidth: 1280,
|
|
27
|
+
minHeight: 720,
|
|
28
|
+
title: 'NEXUS AI Workstation',
|
|
29
|
+
backgroundColor: '#0b0f19',
|
|
30
|
+
show: false,
|
|
31
|
+
autoHideMenuBar: true,
|
|
32
|
+
webPreferences: {
|
|
33
|
+
contextIsolation: true,
|
|
34
|
+
nodeIntegration: false,
|
|
35
|
+
sandbox: true,
|
|
36
|
+
webSecurity: true,
|
|
37
|
+
preload: preloadPath,
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
// Show window smoothly when ready-to-show
|
|
41
|
+
this.window.once('ready-to-show', () => {
|
|
42
|
+
this.window?.show();
|
|
43
|
+
});
|
|
44
|
+
// Load local UI server URL
|
|
45
|
+
const targetUrl = `http://127.0.0.1:${port}`;
|
|
46
|
+
this.window.loadURL(targetUrl);
|
|
47
|
+
// SECURITY GUARD: Lock navigation to local UI server only
|
|
48
|
+
this.window.webContents.on('will-navigate', (event, navigationUrl) => {
|
|
49
|
+
const parsed = new URL(navigationUrl);
|
|
50
|
+
if (parsed.hostname !== '127.0.0.1' && parsed.hostname !== 'localhost') {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
shell.openExternal(navigationUrl);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// SECURITY GUARD: Handle external link clicks safely in default OS browser
|
|
56
|
+
this.window.webContents.setWindowOpenHandler(({ url }) => {
|
|
57
|
+
const parsed = new URL(url);
|
|
58
|
+
if (parsed.hostname !== '127.0.0.1' && parsed.hostname !== 'localhost') {
|
|
59
|
+
shell.openExternal(url);
|
|
60
|
+
}
|
|
61
|
+
return { action: 'deny' };
|
|
62
|
+
});
|
|
63
|
+
this.window.on('closed', () => {
|
|
64
|
+
this.window = null;
|
|
65
|
+
});
|
|
66
|
+
return this.window;
|
|
67
|
+
}
|
|
68
|
+
getWindow() {
|
|
69
|
+
return this.window;
|
|
70
|
+
}
|
|
71
|
+
close() {
|
|
72
|
+
if (this.window && !this.window.isDestroyed()) {
|
|
73
|
+
this.window.close();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=appWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appWindow.js","sourceRoot":"","sources":["../../src/desktop/appWindow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Desktop App Main Entry Point (P7-E)
|
|
3
|
+
*
|
|
4
|
+
* Electron main process bootstrap.
|
|
5
|
+
* Owns single-instance enforcement, ApplicationApi core initialization,
|
|
6
|
+
* local UIServer startup, AppWindow creation, and clean shutdown lifecycle.
|
|
7
|
+
*
|
|
8
|
+
* SECURITY INVARIANT:
|
|
9
|
+
* - Single Backend Core: Bootstraps ApplicationApi directly. Zero secondary backend.
|
|
10
|
+
* - Localhost Binding: UIServer binds strictly to 127.0.0.1.
|
|
11
|
+
* - Single Instance Lock: Prevents duplicate database writers or port conflicts.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/desktop/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|