@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,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P6-C: Terminal Command Policy Engine
|
|
3
|
+
*
|
|
4
|
+
* Deterministic allowlist-based policy for validating terminal commands.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY PRINCIPLES:
|
|
7
|
+
* - Default is DENY. Only explicitly allowlisted commands may execute.
|
|
8
|
+
* - No shell interpreters (cmd, powershell, bash, sh) are ever permitted.
|
|
9
|
+
* - Shell chaining operators (&&, ||, ;, |, >, >>, <, 2>, &, $) are rejected.
|
|
10
|
+
* - Destructive and network commands are permanently blocked.
|
|
11
|
+
* - Each command/argument pair is validated, not just the command name.
|
|
12
|
+
* - Policy is extensible: add entries to ALLOWED_COMMANDS.
|
|
13
|
+
*/
|
|
14
|
+
import type { CommandPolicyResult, TerminalExecuteParams } from './terminalTypes.js';
|
|
15
|
+
import { LogLevel } from '../../common/logger.js';
|
|
16
|
+
export interface AllowedCommandEntry {
|
|
17
|
+
/** Command executable name (lowercase). */
|
|
18
|
+
command: string;
|
|
19
|
+
/** If set, only these subcommands/args are permitted. null means no per-arg restriction. */
|
|
20
|
+
allowedSubcommands?: ReadonlySet<string> | null;
|
|
21
|
+
/** Patterns that are blocked in the args for this command. */
|
|
22
|
+
blockedArgPatterns?: ReadonlyArray<RegExp>;
|
|
23
|
+
/** Risk classification. */
|
|
24
|
+
riskLevel: 'safe' | 'elevated';
|
|
25
|
+
description: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class TerminalCommandPolicy {
|
|
28
|
+
private logger;
|
|
29
|
+
constructor(logLevel?: LogLevel);
|
|
30
|
+
/**
|
|
31
|
+
* Evaluate whether a command invocation is permitted.
|
|
32
|
+
*
|
|
33
|
+
* @param params The structured terminal execute params.
|
|
34
|
+
* @returns Deterministic CommandPolicyResult.
|
|
35
|
+
*/
|
|
36
|
+
evaluate(params: TerminalExecuteParams): CommandPolicyResult;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the list of all allowed command names.
|
|
39
|
+
*/
|
|
40
|
+
getAllowedCommands(): string[];
|
|
41
|
+
private deny;
|
|
42
|
+
private sanitizeForLog;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=terminalCommandPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalCommandPolicy.d.ts","sourceRoot":"","sources":["../../../src/tools/adapters/terminalCommandPolicy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAU,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AA0G1D,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAChD,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,2BAA2B;IAC3B,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AA6KD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,GAAE,QAAiB;IAIvC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,qBAAqB,GAAG,mBAAmB;IAgJ5D;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,cAAc;CAIvB"}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P6-C: Terminal Command Policy Engine
|
|
3
|
+
*
|
|
4
|
+
* Deterministic allowlist-based policy for validating terminal commands.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY PRINCIPLES:
|
|
7
|
+
* - Default is DENY. Only explicitly allowlisted commands may execute.
|
|
8
|
+
* - No shell interpreters (cmd, powershell, bash, sh) are ever permitted.
|
|
9
|
+
* - Shell chaining operators (&&, ||, ;, |, >, >>, <, 2>, &, $) are rejected.
|
|
10
|
+
* - Destructive and network commands are permanently blocked.
|
|
11
|
+
* - Each command/argument pair is validated, not just the command name.
|
|
12
|
+
* - Policy is extensible: add entries to ALLOWED_COMMANDS.
|
|
13
|
+
*/
|
|
14
|
+
import { Logger } from '../../common/logger.js';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Shell Operator Detection
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Shell operators that indicate an attempt at shell chaining or injection.
|
|
20
|
+
* Primary defense is non-shell spawn (no shell: true). This is a secondary check.
|
|
21
|
+
*/
|
|
22
|
+
const SHELL_OPERATOR_PATTERNS = [
|
|
23
|
+
/&&/,
|
|
24
|
+
/\|\|/,
|
|
25
|
+
/(?<![a-zA-Z0-9])[;](?![a-zA-Z0-9])/, // standalone semicolons
|
|
26
|
+
/(?<![a-zA-Z0-9])\|(?!\|)/, // single pipe (not ||, already caught)
|
|
27
|
+
/>/,
|
|
28
|
+
/>>/,
|
|
29
|
+
/<(?!<)/,
|
|
30
|
+
/2>/,
|
|
31
|
+
/2>>/,
|
|
32
|
+
/(?<![a-zA-Z0-9])&(?!&)/, // single & (background)
|
|
33
|
+
/\$\(/, // command substitution $(...)
|
|
34
|
+
/`[^`]+`/, // backtick substitution
|
|
35
|
+
/%COMSPEC%/i,
|
|
36
|
+
/%SystemRoot%/i,
|
|
37
|
+
/\bpowershell\b/i,
|
|
38
|
+
/\bcmd\.exe\b/i,
|
|
39
|
+
/\bcmd\b/i,
|
|
40
|
+
/\bbash\b/i,
|
|
41
|
+
/\bsh\b/i,
|
|
42
|
+
/\bzsh\b/i,
|
|
43
|
+
/\/c\b/i,
|
|
44
|
+
/-[Cc]ommand\b/,
|
|
45
|
+
/-EncodedCommand\b/i,
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Commands that are permanently blocked regardless of arguments.
|
|
49
|
+
* These represent shell interpreters, destructive utilities, and network tools.
|
|
50
|
+
*/
|
|
51
|
+
const PERMANENTLY_BLOCKED_COMMANDS = new Set([
|
|
52
|
+
// Shell interpreters — primary threat
|
|
53
|
+
'cmd', 'cmd.exe', 'powershell', 'powershell.exe', 'pwsh', 'pwsh.exe',
|
|
54
|
+
'bash', 'bash.exe', 'sh', 'sh.exe', 'zsh', 'zsh.exe', 'fish', 'fish.exe',
|
|
55
|
+
'wscript', 'cscript', 'mshta',
|
|
56
|
+
// Destructive filesystem commands
|
|
57
|
+
'rm', 'rmdir', 'del', 'deltree', 'erase', 'format', 'rd',
|
|
58
|
+
'mkfs', 'fdisk', 'diskpart',
|
|
59
|
+
// System control
|
|
60
|
+
'shutdown', 'reboot', 'halt', 'init', 'systemctl', 'service',
|
|
61
|
+
'taskkill', 'tasklist', 'wmic',
|
|
62
|
+
'reg', 'regedit', 'regedt32',
|
|
63
|
+
'net', 'netsh', 'sc',
|
|
64
|
+
'runas', 'sudo', 'su',
|
|
65
|
+
'attrib', 'icacls', 'cacls', 'takeown', 'chmod', 'chown',
|
|
66
|
+
// Network tools
|
|
67
|
+
'curl', 'wget', 'ssh', 'scp', 'sftp', 'ftp', 'telnet',
|
|
68
|
+
'ping', 'tracert', 'traceroute', 'nslookup', 'dig',
|
|
69
|
+
'netstat', 'ipconfig', 'ifconfig', 'arp', 'route',
|
|
70
|
+
'nc', 'ncat', 'socat', 'openssl',
|
|
71
|
+
// Package installation (network)
|
|
72
|
+
'pip', 'pip3', 'pip2',
|
|
73
|
+
'gem', 'bundle',
|
|
74
|
+
'cargo', 'go',
|
|
75
|
+
'composer',
|
|
76
|
+
'apt', 'apt-get', 'yum', 'dnf', 'pacman', 'brew',
|
|
77
|
+
'choco', 'scoop', 'winget',
|
|
78
|
+
// Compilation/build from arbitrary sources
|
|
79
|
+
'make', 'cmake', 'msbuild', 'gradle', 'mvn', 'ant',
|
|
80
|
+
// Virtualization/containers
|
|
81
|
+
'docker', 'podman', 'kubectl', 'helm',
|
|
82
|
+
'vagrant', 'virtualbox',
|
|
83
|
+
]);
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Argument Blocklist Patterns
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
/**
|
|
88
|
+
* Patterns that are never allowed in arguments regardless of command.
|
|
89
|
+
* Primarily targets embedded shell sequences or null bytes.
|
|
90
|
+
*/
|
|
91
|
+
const BLOCKED_ARG_PATTERNS = [
|
|
92
|
+
/\0/, // Null byte
|
|
93
|
+
/&&/,
|
|
94
|
+
/\|\|/,
|
|
95
|
+
/`[^`]*`/, // Backtick substitution
|
|
96
|
+
/\$\(/, // Command substitution
|
|
97
|
+
/%COMSPEC%/i,
|
|
98
|
+
/\bpowershell\b/i,
|
|
99
|
+
/\bcmd\.exe\b/i,
|
|
100
|
+
/\/c\s+/i, // /c flag (cmd.exe)
|
|
101
|
+
/-[Cc]ommand\s*/, // PowerShell -Command
|
|
102
|
+
/-EncodedCommand\b/i, // PowerShell -EncodedCommand
|
|
103
|
+
];
|
|
104
|
+
/**
|
|
105
|
+
* The canonical allowlist. Only commands listed here may execute.
|
|
106
|
+
*
|
|
107
|
+
* POLICY:
|
|
108
|
+
* - "safe" → auto-approvable read/query operations
|
|
109
|
+
* - "elevated" → write/modify operations (still require approval via P5 pipeline)
|
|
110
|
+
*/
|
|
111
|
+
const ALLOWED_COMMANDS = [
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
// node
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
{
|
|
116
|
+
command: 'node',
|
|
117
|
+
allowedSubcommands: null, // validated at arg level below
|
|
118
|
+
blockedArgPatterns: [
|
|
119
|
+
/^-e$/i, // node -e "<code>" — arbitrary code execution
|
|
120
|
+
/^--eval$/i,
|
|
121
|
+
/^-p$/i, // node -p "<code>"
|
|
122
|
+
/^--print$/i,
|
|
123
|
+
],
|
|
124
|
+
riskLevel: 'elevated',
|
|
125
|
+
description: 'Node.js runtime for version checks and safe script execution',
|
|
126
|
+
},
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// npm
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
{
|
|
131
|
+
command: 'npm',
|
|
132
|
+
allowedSubcommands: new Set([
|
|
133
|
+
'test', 'run', 'build', 'lint', 'typecheck',
|
|
134
|
+
'--version', 'version', '-v',
|
|
135
|
+
'install', // allowed but flagged elevated
|
|
136
|
+
]),
|
|
137
|
+
blockedArgPatterns: [
|
|
138
|
+
/^publish$/i,
|
|
139
|
+
/^unpublish$/i,
|
|
140
|
+
/^uninstall$/i,
|
|
141
|
+
/^remove$/i,
|
|
142
|
+
/^rm$/i,
|
|
143
|
+
/^cache$/i,
|
|
144
|
+
/^exec$/i,
|
|
145
|
+
/^x$/i, // npm x = npx shorthand for arbitrary package exec
|
|
146
|
+
/^fund$/i,
|
|
147
|
+
/^pack$/i,
|
|
148
|
+
/^deprecate$/i,
|
|
149
|
+
/^logout$/i,
|
|
150
|
+
/^adduser$/i,
|
|
151
|
+
/^whoami$/i,
|
|
152
|
+
/^token$/i,
|
|
153
|
+
/^audit\s+fix$/i,
|
|
154
|
+
],
|
|
155
|
+
riskLevel: 'elevated',
|
|
156
|
+
description: 'npm for running defined project scripts (test, build, lint, typecheck)',
|
|
157
|
+
},
|
|
158
|
+
// ---------------------------------------------------------------------------
|
|
159
|
+
// npx
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
{
|
|
162
|
+
command: 'npx',
|
|
163
|
+
allowedSubcommands: new Set([
|
|
164
|
+
'tsc', // TypeScript compiler
|
|
165
|
+
]),
|
|
166
|
+
riskLevel: 'elevated',
|
|
167
|
+
description: 'npx limited to tsc (TypeScript compiler) only',
|
|
168
|
+
},
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
// git (read-only operations only)
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
{
|
|
173
|
+
command: 'git',
|
|
174
|
+
allowedSubcommands: new Set([
|
|
175
|
+
'status',
|
|
176
|
+
'diff',
|
|
177
|
+
'log',
|
|
178
|
+
'show',
|
|
179
|
+
'branch',
|
|
180
|
+
'--version',
|
|
181
|
+
'version',
|
|
182
|
+
'-v',
|
|
183
|
+
'--no-pager', // git --no-pager <subcommand> — safe prefix
|
|
184
|
+
]),
|
|
185
|
+
blockedArgPatterns: [
|
|
186
|
+
/^push$/i,
|
|
187
|
+
/^reset$/i,
|
|
188
|
+
/^clean$/i,
|
|
189
|
+
/^checkout$/i,
|
|
190
|
+
/^restore$/i,
|
|
191
|
+
/^rebase$/i,
|
|
192
|
+
/^merge$/i,
|
|
193
|
+
/^commit$/i,
|
|
194
|
+
/^tag$/i,
|
|
195
|
+
/^stash$/i,
|
|
196
|
+
/^bisect$/i,
|
|
197
|
+
/^cherry-pick$/i,
|
|
198
|
+
/^revert$/i,
|
|
199
|
+
/^am$/i,
|
|
200
|
+
/^apply$/i,
|
|
201
|
+
/^fetch$/i,
|
|
202
|
+
/^pull$/i,
|
|
203
|
+
/^clone$/i,
|
|
204
|
+
/^submodule$/i,
|
|
205
|
+
/^config$/i,
|
|
206
|
+
/^remote$/i,
|
|
207
|
+
/--force/i,
|
|
208
|
+
/--hard/i,
|
|
209
|
+
/--soft/i,
|
|
210
|
+
/--mixed/i,
|
|
211
|
+
],
|
|
212
|
+
riskLevel: 'safe',
|
|
213
|
+
description: 'git for read-only status, diff, log, and branch inspection',
|
|
214
|
+
},
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// python / python3
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
{
|
|
219
|
+
command: 'python',
|
|
220
|
+
allowedSubcommands: null,
|
|
221
|
+
blockedArgPatterns: [
|
|
222
|
+
/^-c$/i, // python -c "<code>" — arbitrary code execution
|
|
223
|
+
/^-m\s*pip/i, // python -m pip — package installation
|
|
224
|
+
],
|
|
225
|
+
riskLevel: 'elevated',
|
|
226
|
+
description: 'Python runtime for version checks and safe script execution',
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
command: 'python3',
|
|
230
|
+
allowedSubcommands: null,
|
|
231
|
+
blockedArgPatterns: [
|
|
232
|
+
/^-c$/i,
|
|
233
|
+
/^-m\s*pip/i,
|
|
234
|
+
],
|
|
235
|
+
riskLevel: 'elevated',
|
|
236
|
+
description: 'Python3 runtime for version checks and safe script execution',
|
|
237
|
+
},
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// pytest
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
{
|
|
242
|
+
command: 'pytest',
|
|
243
|
+
allowedSubcommands: null,
|
|
244
|
+
blockedArgPatterns: [],
|
|
245
|
+
riskLevel: 'elevated',
|
|
246
|
+
description: 'pytest test runner for Python projects',
|
|
247
|
+
},
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// tsc (TypeScript compiler)
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
{
|
|
252
|
+
command: 'tsc',
|
|
253
|
+
allowedSubcommands: null,
|
|
254
|
+
blockedArgPatterns: [],
|
|
255
|
+
riskLevel: 'elevated',
|
|
256
|
+
description: 'TypeScript compiler for type-checking and compilation',
|
|
257
|
+
},
|
|
258
|
+
];
|
|
259
|
+
// Build lookup map for O(1) access
|
|
260
|
+
const ALLOWED_COMMAND_MAP = new Map(ALLOWED_COMMANDS.map((entry) => [entry.command.toLowerCase(), entry]));
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
// TerminalCommandPolicy Class
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
export class TerminalCommandPolicy {
|
|
265
|
+
logger;
|
|
266
|
+
constructor(logLevel = 'info') {
|
|
267
|
+
this.logger = new Logger('TerminalCommandPolicy', logLevel);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Evaluate whether a command invocation is permitted.
|
|
271
|
+
*
|
|
272
|
+
* @param params The structured terminal execute params.
|
|
273
|
+
* @returns Deterministic CommandPolicyResult.
|
|
274
|
+
*/
|
|
275
|
+
evaluate(params) {
|
|
276
|
+
// 1. Basic structural validation
|
|
277
|
+
if (!params || typeof params !== 'object') {
|
|
278
|
+
return this.deny('INVALID_REQUEST', 'Terminal execute params must be a structured object.', 'blocked');
|
|
279
|
+
}
|
|
280
|
+
if (!params.command || typeof params.command !== 'string' || params.command.trim() === '') {
|
|
281
|
+
return this.deny('INVALID_REQUEST', 'Terminal execute params must specify a non-empty command string.', 'blocked');
|
|
282
|
+
}
|
|
283
|
+
if (!Array.isArray(params.args)) {
|
|
284
|
+
return this.deny('INVALID_REQUEST', 'Terminal execute params.args must be an array.', 'blocked');
|
|
285
|
+
}
|
|
286
|
+
// 2. Null byte check on command
|
|
287
|
+
if (params.command.includes('\0')) {
|
|
288
|
+
return this.deny('INVALID_REQUEST', 'Command contains a null byte character.', 'blocked');
|
|
289
|
+
}
|
|
290
|
+
const commandLower = params.command.trim().toLowerCase();
|
|
291
|
+
// 3. Permanently blocked commands check
|
|
292
|
+
if (PERMANENTLY_BLOCKED_COMMANDS.has(commandLower)) {
|
|
293
|
+
this.logger.warn(`Command policy: permanently blocked command rejected`, {
|
|
294
|
+
command: params.command,
|
|
295
|
+
});
|
|
296
|
+
return this.deny('COMMAND_NOT_ALLOWED', `Command '${params.command}' is permanently blocked by security policy.`, 'blocked');
|
|
297
|
+
}
|
|
298
|
+
// 4. Shell operator check on command itself
|
|
299
|
+
for (const pattern of SHELL_OPERATOR_PATTERNS) {
|
|
300
|
+
if (pattern.test(params.command)) {
|
|
301
|
+
this.logger.warn(`Command policy: shell operator detected in command`, {
|
|
302
|
+
command: params.command,
|
|
303
|
+
pattern: pattern.toString(),
|
|
304
|
+
});
|
|
305
|
+
return this.deny('INVALID_COMMAND_POLICY', `Command '${params.command}' contains a shell operator or injection pattern.`, 'blocked');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
// 5. Allowlist check
|
|
309
|
+
const entry = ALLOWED_COMMAND_MAP.get(commandLower);
|
|
310
|
+
if (!entry) {
|
|
311
|
+
this.logger.warn(`Command policy: command not in allowlist`, {
|
|
312
|
+
command: params.command,
|
|
313
|
+
});
|
|
314
|
+
return this.deny('COMMAND_NOT_ALLOWED', `Command '${params.command}' is not in the terminal execution allowlist.`, 'blocked');
|
|
315
|
+
}
|
|
316
|
+
// 6. Validate each argument
|
|
317
|
+
for (const arg of params.args) {
|
|
318
|
+
if (typeof arg !== 'string') {
|
|
319
|
+
return this.deny('INVALID_REQUEST', 'All args must be strings.', 'blocked');
|
|
320
|
+
}
|
|
321
|
+
// Null byte in arg
|
|
322
|
+
if (arg.includes('\0')) {
|
|
323
|
+
return this.deny('INVALID_REQUEST', `Argument contains a null byte character.`, 'blocked');
|
|
324
|
+
}
|
|
325
|
+
// Global shell operator patterns in args
|
|
326
|
+
for (const pattern of SHELL_OPERATOR_PATTERNS) {
|
|
327
|
+
if (pattern.test(arg)) {
|
|
328
|
+
this.logger.warn(`Command policy: shell operator detected in argument`, {
|
|
329
|
+
command: params.command,
|
|
330
|
+
arg,
|
|
331
|
+
pattern: pattern.toString(),
|
|
332
|
+
});
|
|
333
|
+
return this.deny('INVALID_COMMAND_POLICY', `Argument '${this.sanitizeForLog(arg)}' contains a shell operator or injection pattern.`, 'blocked');
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Global blocked arg patterns
|
|
337
|
+
for (const pattern of BLOCKED_ARG_PATTERNS) {
|
|
338
|
+
if (pattern.test(arg)) {
|
|
339
|
+
return this.deny('INVALID_COMMAND_POLICY', `Argument '${this.sanitizeForLog(arg)}' contains a blocked pattern.`, 'blocked');
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
// Per-command blocked arg patterns
|
|
343
|
+
if (entry.blockedArgPatterns) {
|
|
344
|
+
for (const pattern of entry.blockedArgPatterns) {
|
|
345
|
+
if (pattern.test(arg)) {
|
|
346
|
+
this.logger.warn(`Command policy: blocked argument pattern matched`, {
|
|
347
|
+
command: params.command,
|
|
348
|
+
arg,
|
|
349
|
+
pattern: pattern.toString(),
|
|
350
|
+
});
|
|
351
|
+
return this.deny('COMMAND_NOT_ALLOWED', `Argument '${this.sanitizeForLog(arg)}' is not permitted for command '${params.command}'.`, 'blocked');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// 7. Subcommand validation (if entry has restricted subcommand set)
|
|
357
|
+
if (entry.allowedSubcommands !== null && entry.allowedSubcommands !== undefined) {
|
|
358
|
+
// Find the first "subcommand" arg (first non-flag arg)
|
|
359
|
+
const firstArg = params.args[0];
|
|
360
|
+
if (!firstArg) {
|
|
361
|
+
// No subcommand provided — may be valid (e.g. --version) — allow
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
const firstArgLower = firstArg.toLowerCase();
|
|
365
|
+
if (!entry.allowedSubcommands.has(firstArgLower) && !firstArgLower.startsWith('-')) {
|
|
366
|
+
this.logger.warn(`Command policy: subcommand not in allowlist`, {
|
|
367
|
+
command: params.command,
|
|
368
|
+
subcommand: firstArg,
|
|
369
|
+
});
|
|
370
|
+
return this.deny('COMMAND_NOT_ALLOWED', `Subcommand '${firstArg}' is not permitted for '${params.command}'.`, 'blocked');
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// 8. Git-specific: check all args for blocked git subcommands
|
|
375
|
+
if (commandLower === 'git' && entry.blockedArgPatterns) {
|
|
376
|
+
for (const arg of params.args) {
|
|
377
|
+
for (const pattern of entry.blockedArgPatterns) {
|
|
378
|
+
if (pattern.test(arg)) {
|
|
379
|
+
this.logger.warn(`Command policy: blocked git argument`, {
|
|
380
|
+
command: 'git',
|
|
381
|
+
arg,
|
|
382
|
+
});
|
|
383
|
+
return this.deny('COMMAND_NOT_ALLOWED', `git argument '${this.sanitizeForLog(arg)}' is blocked by security policy (destructive git operations are not permitted).`, 'blocked');
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// All checks passed
|
|
389
|
+
this.logger.info(`Command policy: ALLOWED`, {
|
|
390
|
+
command: params.command,
|
|
391
|
+
riskLevel: entry.riskLevel,
|
|
392
|
+
argCount: params.args.length,
|
|
393
|
+
});
|
|
394
|
+
return {
|
|
395
|
+
allowed: true,
|
|
396
|
+
decision: 'ALLOWED',
|
|
397
|
+
reason: `Command '${params.command}' is permitted by the terminal execution policy.`,
|
|
398
|
+
riskLevel: entry.riskLevel,
|
|
399
|
+
resolvedCommand: params.command.trim(),
|
|
400
|
+
resolvedArgs: [...params.args],
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Returns the list of all allowed command names.
|
|
405
|
+
*/
|
|
406
|
+
getAllowedCommands() {
|
|
407
|
+
return ALLOWED_COMMANDS.map((e) => e.command);
|
|
408
|
+
}
|
|
409
|
+
deny(decision, reason, riskLevel) {
|
|
410
|
+
return {
|
|
411
|
+
allowed: false,
|
|
412
|
+
decision,
|
|
413
|
+
reason,
|
|
414
|
+
riskLevel,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
sanitizeForLog(arg) {
|
|
418
|
+
// Truncate and remove control characters for safe logging
|
|
419
|
+
return arg.slice(0, 80).replace(/[\x00-\x1f\x7f]/g, '?');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=terminalCommandPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalCommandPolicy.js","sourceRoot":"","sources":["../../../src/tools/adapters/terminalCommandPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P6-C: Bounded Terminal Execution Types
|
|
3
|
+
*
|
|
4
|
+
* Provides normalized data contracts for the terminal_execute tool.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY DESIGN:
|
|
7
|
+
* - Input is a structured object (NOT a raw shell string).
|
|
8
|
+
* - Command and args are always separate fields.
|
|
9
|
+
* - No shell interpretation is performed at any layer.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Structured request for the terminal_execute tool.
|
|
13
|
+
*
|
|
14
|
+
* DO NOT accept raw shell strings. Command + args are always separate.
|
|
15
|
+
* This prevents shell injection, chaining, and interpretation.
|
|
16
|
+
*/
|
|
17
|
+
export interface TerminalExecuteParams {
|
|
18
|
+
/** The executable to run (e.g. "npm", "git", "node"). Must be in the allowlist. */
|
|
19
|
+
command: string;
|
|
20
|
+
/** Arguments to pass to the command. Each arg is a separate string - no chaining. */
|
|
21
|
+
args: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Working directory for the process.
|
|
24
|
+
* - Relative paths are resolved against the workspace root.
|
|
25
|
+
* - Absolute paths must resolve inside the workspace root.
|
|
26
|
+
* - Defaults to workspace root if omitted or ".".
|
|
27
|
+
*/
|
|
28
|
+
cwd?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Execution timeout in milliseconds.
|
|
31
|
+
* - Default: 30,000 ms (30 seconds)
|
|
32
|
+
* - Maximum: 120,000 ms (120 seconds)
|
|
33
|
+
*/
|
|
34
|
+
timeoutMs?: number;
|
|
35
|
+
/**
|
|
36
|
+
* Maximum bytes to buffer for stdout.
|
|
37
|
+
* - Default: 262,144 bytes (256 KB)
|
|
38
|
+
* - Maximum: 1,048,576 bytes (1 MB)
|
|
39
|
+
*/
|
|
40
|
+
maxStdoutBytes?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Maximum bytes to buffer for stderr.
|
|
43
|
+
* - Default: 262,144 bytes (256 KB)
|
|
44
|
+
* - Maximum: 1,048,576 bytes (1 MB)
|
|
45
|
+
*/
|
|
46
|
+
maxStderrBytes?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Normalized result returned by the terminal_execute tool.
|
|
50
|
+
*/
|
|
51
|
+
export interface TerminalExecuteResult {
|
|
52
|
+
/** True if the process exited with code 0 and no timeout/cancellation occurred. */
|
|
53
|
+
success: boolean;
|
|
54
|
+
/** Process exit code. null if terminated by signal or timeout. */
|
|
55
|
+
exitCode: number | null;
|
|
56
|
+
/** Signal name that terminated the process (e.g. "SIGTERM"), or null. */
|
|
57
|
+
signal: string | null;
|
|
58
|
+
/** Standard output captured from the process (possibly truncated). */
|
|
59
|
+
stdout: string;
|
|
60
|
+
/** Standard error captured from the process (possibly truncated). */
|
|
61
|
+
stderr: string;
|
|
62
|
+
/** True if stdout was truncated due to output size limits. */
|
|
63
|
+
stdoutTruncated: boolean;
|
|
64
|
+
/** True if stderr was truncated due to output size limits. */
|
|
65
|
+
stderrTruncated: boolean;
|
|
66
|
+
/** Elapsed time in milliseconds from spawn to process exit/timeout. */
|
|
67
|
+
durationMs: number;
|
|
68
|
+
/** True if the process was killed due to timeout. */
|
|
69
|
+
timedOut: boolean;
|
|
70
|
+
/** True if the process was cancelled via AbortSignal. */
|
|
71
|
+
cancelled: boolean;
|
|
72
|
+
/** Error category if execution was blocked or failed. */
|
|
73
|
+
errorCategory?: TerminalErrorCategory;
|
|
74
|
+
/** Human-readable error message if execution was blocked or failed. */
|
|
75
|
+
errorMessage?: string;
|
|
76
|
+
}
|
|
77
|
+
export type CommandPolicyDecision = 'ALLOWED' | 'COMMAND_NOT_ALLOWED' | 'INVALID_REQUEST' | 'PATH_TRAVERSAL_DENIED' | 'INVALID_COMMAND_POLICY';
|
|
78
|
+
/**
|
|
79
|
+
* Risk classification for a validated command.
|
|
80
|
+
*/
|
|
81
|
+
export type CommandRiskLevel = 'safe' | 'elevated' | 'blocked';
|
|
82
|
+
/**
|
|
83
|
+
* Result returned by TerminalCommandPolicy.evaluate().
|
|
84
|
+
*/
|
|
85
|
+
export interface CommandPolicyResult {
|
|
86
|
+
allowed: boolean;
|
|
87
|
+
decision: CommandPolicyDecision;
|
|
88
|
+
reason: string;
|
|
89
|
+
riskLevel: CommandRiskLevel;
|
|
90
|
+
/** Normalized/resolved command that will be executed. */
|
|
91
|
+
resolvedCommand?: string;
|
|
92
|
+
/** Sanitized args (may be identical to input for safe commands). */
|
|
93
|
+
resolvedArgs?: string[];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Deterministic error category string union for terminal execution failures.
|
|
97
|
+
*/
|
|
98
|
+
export type TerminalErrorCategory = 'COMMAND_NOT_ALLOWED' | 'INVALID_REQUEST' | 'PATH_TRAVERSAL_DENIED' | 'APPROVAL_REQUIRED' | 'PERMISSION_DENIED' | 'TIMEOUT' | 'PROCESS_ERROR' | 'OUTPUT_LIMIT_EXCEEDED' | 'PROCESS_TERMINATED' | 'INVALID_COMMAND_POLICY';
|
|
99
|
+
export declare const TERMINAL_LIMITS: {
|
|
100
|
+
/** Default execution timeout in ms. */
|
|
101
|
+
readonly DEFAULT_TIMEOUT_MS: 30000;
|
|
102
|
+
/** Maximum execution timeout in ms. */
|
|
103
|
+
readonly MAX_TIMEOUT_MS: 120000;
|
|
104
|
+
/** Default stdout/stderr buffer size in bytes (256 KB). */
|
|
105
|
+
readonly DEFAULT_OUTPUT_BYTES: number;
|
|
106
|
+
/** Maximum stdout/stderr buffer size in bytes (1 MB). */
|
|
107
|
+
readonly MAX_OUTPUT_BYTES: number;
|
|
108
|
+
/** Grace period in ms before SIGKILL after SIGTERM. */
|
|
109
|
+
readonly KILL_GRACE_MS: 2000;
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=terminalTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalTypes.d.ts","sourceRoot":"","sources":["../../../src/tools/adapters/terminalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mFAAmF;IACnF,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,MAAM,qBAAqB,GAC7B,SAAS,GACT,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,wBAAwB,CAAC;AAE7B;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,gBAAgB,CAAC;IAC5B,yDAAyD;IACzD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAMD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,mBAAmB,GACnB,mBAAmB,GACnB,SAAS,GACT,eAAe,GACf,uBAAuB,GACvB,oBAAoB,GACpB,wBAAwB,CAAC;AAM7B,eAAO,MAAM,eAAe;IAC1B,uCAAuC;;IAEvC,uCAAuC;;IAEvC,2DAA2D;;IAE3D,yDAAyD;;IAEzD,uDAAuD;;CAE/C,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — P6-C: Bounded Terminal Execution Types
|
|
3
|
+
*
|
|
4
|
+
* Provides normalized data contracts for the terminal_execute tool.
|
|
5
|
+
*
|
|
6
|
+
* SECURITY DESIGN:
|
|
7
|
+
* - Input is a structured object (NOT a raw shell string).
|
|
8
|
+
* - Command and args are always separate fields.
|
|
9
|
+
* - No shell interpretation is performed at any layer.
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Terminal Execution Limits
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
export const TERMINAL_LIMITS = {
|
|
15
|
+
/** Default execution timeout in ms. */
|
|
16
|
+
DEFAULT_TIMEOUT_MS: 30_000,
|
|
17
|
+
/** Maximum execution timeout in ms. */
|
|
18
|
+
MAX_TIMEOUT_MS: 120_000,
|
|
19
|
+
/** Default stdout/stderr buffer size in bytes (256 KB). */
|
|
20
|
+
DEFAULT_OUTPUT_BYTES: 256 * 1024,
|
|
21
|
+
/** Maximum stdout/stderr buffer size in bytes (1 MB). */
|
|
22
|
+
MAX_OUTPUT_BYTES: 1024 * 1024,
|
|
23
|
+
/** Grace period in ms before SIGKILL after SIGTERM. */
|
|
24
|
+
KILL_GRACE_MS: 2_000,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=terminalTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminalTypes.js","sourceRoot":"","sources":["../../../src/tools/adapters/terminalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA+HH,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,uCAAuC;IACvC,kBAAkB,EAAE,MAAM;IAC1B,uCAAuC;IACvC,cAAc,EAAE,OAAO;IACvB,2DAA2D;IAC3D,oBAAoB,EAAE,GAAG,GAAG,IAAI;IAChC,yDAAyD;IACzD,gBAAgB,EAAE,IAAI,GAAG,IAAI;IAC7B,uDAAuD;IACvD,aAAa,EAAE,KAAK;CACZ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEXUS AI — Approval Gate
|
|
3
|
+
*
|
|
4
|
+
* Deterministic execution gate positioned immediately before tool execution.
|
|
5
|
+
* Evaluates human approval status for a given task step.
|
|
6
|
+
*
|
|
7
|
+
* Pipeline sequence:
|
|
8
|
+
* Plan -> PlanValidator -> PermissionEngine -> ApprovalPolicyEngine -> ApprovalGate -> ToolExecutor
|
|
9
|
+
*
|
|
10
|
+
* SECURITY GUARANTEES:
|
|
11
|
+
* - Missing, pending, rejected, expired, or cancelled approvals BLOCK execution completely.
|
|
12
|
+
* - Approval DOES NOT grant authorization — PermissionEngine remains mandatory.
|
|
13
|
+
*/
|
|
14
|
+
import type { ApprovalRequest, ApprovalGateResult } from './approvalTypes.js';
|
|
15
|
+
import { LogLevel } from '../common/logger.js';
|
|
16
|
+
export declare class ApprovalGate {
|
|
17
|
+
private logger;
|
|
18
|
+
constructor(logLevel?: LogLevel);
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate whether execution is permitted according to the approval request state.
|
|
21
|
+
*/
|
|
22
|
+
evaluateGate(approvalRequest: ApprovalRequest | null): ApprovalGateResult;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=approvalGate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalGate.d.ts","sourceRoot":"","sources":["../../src/tools/approvalGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAU,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEvD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,GAAE,QAAiB;IAIvC;;OAEG;IACH,YAAY,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,GAAG,kBAAkB;CAyH1E"}
|