@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.
Files changed (411) hide show
  1. package/.env.example +16 -0
  2. package/LICENSE +21 -0
  3. package/README.md +106 -0
  4. package/dist/api/index.d.ts +81 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +224 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/chat/chatService.d.ts +49 -0
  9. package/dist/chat/chatService.d.ts.map +1 -0
  10. package/dist/chat/chatService.js +163 -0
  11. package/dist/chat/chatService.js.map +1 -0
  12. package/dist/chat/contextBuilder.d.ts +19 -0
  13. package/dist/chat/contextBuilder.d.ts.map +1 -0
  14. package/dist/chat/contextBuilder.js +43 -0
  15. package/dist/chat/contextBuilder.js.map +1 -0
  16. package/dist/chat/conversationService.d.ts +25 -0
  17. package/dist/chat/conversationService.d.ts.map +1 -0
  18. package/dist/chat/conversationService.js +55 -0
  19. package/dist/chat/conversationService.js.map +1 -0
  20. package/dist/chat/index.d.ts +6 -0
  21. package/dist/chat/index.d.ts.map +1 -0
  22. package/dist/chat/index.js +6 -0
  23. package/dist/chat/index.js.map +1 -0
  24. package/dist/chat/messageService.d.ts +18 -0
  25. package/dist/chat/messageService.d.ts.map +1 -0
  26. package/dist/chat/messageService.js +26 -0
  27. package/dist/chat/messageService.js.map +1 -0
  28. package/dist/chat/promptTemplates.d.ts +19 -0
  29. package/dist/chat/promptTemplates.d.ts.map +1 -0
  30. package/dist/chat/promptTemplates.js +32 -0
  31. package/dist/chat/promptTemplates.js.map +1 -0
  32. package/dist/cli/agentRunner.d.ts +126 -0
  33. package/dist/cli/agentRunner.d.ts.map +1 -0
  34. package/dist/cli/agentRunner.js +892 -0
  35. package/dist/cli/agentRunner.js.map +1 -0
  36. package/dist/cli/bin.d.ts +14 -0
  37. package/dist/cli/bin.d.ts.map +1 -0
  38. package/dist/cli/bin.js +20 -0
  39. package/dist/cli/bin.js.map +1 -0
  40. package/dist/cli/index.d.ts +3 -0
  41. package/dist/cli/index.d.ts.map +1 -0
  42. package/dist/cli/index.js +2 -0
  43. package/dist/cli/index.js.map +1 -0
  44. package/dist/cli/inputEngine.d.ts +76 -0
  45. package/dist/cli/inputEngine.d.ts.map +1 -0
  46. package/dist/cli/inputEngine.js +281 -0
  47. package/dist/cli/inputEngine.js.map +1 -0
  48. package/dist/cli/main.d.ts +9 -0
  49. package/dist/cli/main.d.ts.map +1 -0
  50. package/dist/cli/main.js +144 -0
  51. package/dist/cli/main.js.map +1 -0
  52. package/dist/cli/uiFormatters.d.ts +108 -0
  53. package/dist/cli/uiFormatters.d.ts.map +1 -0
  54. package/dist/cli/uiFormatters.js +925 -0
  55. package/dist/cli/uiFormatters.js.map +1 -0
  56. package/dist/common/logger.d.ts +13 -0
  57. package/dist/common/logger.d.ts.map +1 -0
  58. package/dist/common/logger.js +43 -0
  59. package/dist/common/logger.js.map +1 -0
  60. package/dist/config/firstRunHealthCheck.d.ts +50 -0
  61. package/dist/config/firstRunHealthCheck.d.ts.map +1 -0
  62. package/dist/config/firstRunHealthCheck.js +196 -0
  63. package/dist/config/firstRunHealthCheck.js.map +1 -0
  64. package/dist/config/firstRunService.d.ts +53 -0
  65. package/dist/config/firstRunService.d.ts.map +1 -0
  66. package/dist/config/firstRunService.js +93 -0
  67. package/dist/config/firstRunService.js.map +1 -0
  68. package/dist/config/index.d.ts +30 -0
  69. package/dist/config/index.d.ts.map +1 -0
  70. package/dist/config/index.js +65 -0
  71. package/dist/config/index.js.map +1 -0
  72. package/dist/config/productionPaths.d.ts +34 -0
  73. package/dist/config/productionPaths.d.ts.map +1 -0
  74. package/dist/config/productionPaths.js +95 -0
  75. package/dist/config/productionPaths.js.map +1 -0
  76. package/dist/config/workspaceService.d.ts +42 -0
  77. package/dist/config/workspaceService.d.ts.map +1 -0
  78. package/dist/config/workspaceService.js +218 -0
  79. package/dist/config/workspaceService.js.map +1 -0
  80. package/dist/desktop/appWindow.d.ts +21 -0
  81. package/dist/desktop/appWindow.d.ts.map +1 -0
  82. package/dist/desktop/appWindow.js +77 -0
  83. package/dist/desktop/appWindow.js.map +1 -0
  84. package/dist/desktop/main.d.ts +14 -0
  85. package/dist/desktop/main.d.ts.map +1 -0
  86. package/dist/desktop/main.js +90 -0
  87. package/dist/desktop/main.js.map +1 -0
  88. package/dist/desktop/preload.d.ts +14 -0
  89. package/dist/desktop/preload.d.ts.map +1 -0
  90. package/dist/desktop/preload.js +20 -0
  91. package/dist/desktop/preload.js.map +1 -0
  92. package/dist/intelligence/index.d.ts +33 -0
  93. package/dist/intelligence/index.d.ts.map +1 -0
  94. package/dist/intelligence/index.js +82 -0
  95. package/dist/intelligence/index.js.map +1 -0
  96. package/dist/intelligence/modelGateway.d.ts +35 -0
  97. package/dist/intelligence/modelGateway.d.ts.map +1 -0
  98. package/dist/intelligence/modelGateway.js +123 -0
  99. package/dist/intelligence/modelGateway.js.map +1 -0
  100. package/dist/intelligence/modelRegistry.d.ts +17 -0
  101. package/dist/intelligence/modelRegistry.d.ts.map +1 -0
  102. package/dist/intelligence/modelRegistry.js +87 -0
  103. package/dist/intelligence/modelRegistry.js.map +1 -0
  104. package/dist/intelligence/modelRouter.d.ts +76 -0
  105. package/dist/intelligence/modelRouter.d.ts.map +1 -0
  106. package/dist/intelligence/modelRouter.js +256 -0
  107. package/dist/intelligence/modelRouter.js.map +1 -0
  108. package/dist/intelligence/ollamaAdapter.d.ts +49 -0
  109. package/dist/intelligence/ollamaAdapter.d.ts.map +1 -0
  110. package/dist/intelligence/ollamaAdapter.js +197 -0
  111. package/dist/intelligence/ollamaAdapter.js.map +1 -0
  112. package/dist/intelligence/prototype/runPrototype.d.ts +14 -0
  113. package/dist/intelligence/prototype/runPrototype.d.ts.map +1 -0
  114. package/dist/intelligence/prototype/runPrototype.js +87 -0
  115. package/dist/intelligence/prototype/runPrototype.js.map +1 -0
  116. package/dist/intelligence/providers/embeddedInferenceProvider.d.ts +29 -0
  117. package/dist/intelligence/providers/embeddedInferenceProvider.d.ts.map +1 -0
  118. package/dist/intelligence/providers/embeddedInferenceProvider.js +162 -0
  119. package/dist/intelligence/providers/embeddedInferenceProvider.js.map +1 -0
  120. package/dist/intelligence/providers/index.d.ts +4 -0
  121. package/dist/intelligence/providers/index.d.ts.map +1 -0
  122. package/dist/intelligence/providers/index.js +4 -0
  123. package/dist/intelligence/providers/index.js.map +1 -0
  124. package/dist/intelligence/providers/inferenceProvider.d.ts +98 -0
  125. package/dist/intelligence/providers/inferenceProvider.d.ts.map +1 -0
  126. package/dist/intelligence/providers/inferenceProvider.js +9 -0
  127. package/dist/intelligence/providers/inferenceProvider.js.map +1 -0
  128. package/dist/intelligence/providers/ollamaInferenceProvider.d.ts +17 -0
  129. package/dist/intelligence/providers/ollamaInferenceProvider.d.ts.map +1 -0
  130. package/dist/intelligence/providers/ollamaInferenceProvider.js +103 -0
  131. package/dist/intelligence/providers/ollamaInferenceProvider.js.map +1 -0
  132. package/dist/intelligence/provisioning/hardwareDetector.d.ts +5 -0
  133. package/dist/intelligence/provisioning/hardwareDetector.d.ts.map +1 -0
  134. package/dist/intelligence/provisioning/hardwareDetector.js +48 -0
  135. package/dist/intelligence/provisioning/hardwareDetector.js.map +1 -0
  136. package/dist/intelligence/provisioning/index.d.ts +12 -0
  137. package/dist/intelligence/provisioning/index.d.ts.map +1 -0
  138. package/dist/intelligence/provisioning/index.js +12 -0
  139. package/dist/intelligence/provisioning/index.js.map +1 -0
  140. package/dist/intelligence/provisioning/modelDownloader.d.ts +22 -0
  141. package/dist/intelligence/provisioning/modelDownloader.d.ts.map +1 -0
  142. package/dist/intelligence/provisioning/modelDownloader.js +134 -0
  143. package/dist/intelligence/provisioning/modelDownloader.js.map +1 -0
  144. package/dist/intelligence/provisioning/modelManifest.d.ts +10 -0
  145. package/dist/intelligence/provisioning/modelManifest.d.ts.map +1 -0
  146. package/dist/intelligence/provisioning/modelManifest.js +72 -0
  147. package/dist/intelligence/provisioning/modelManifest.js.map +1 -0
  148. package/dist/intelligence/provisioning/modelSelector.d.ts +14 -0
  149. package/dist/intelligence/provisioning/modelSelector.d.ts.map +1 -0
  150. package/dist/intelligence/provisioning/modelSelector.js +40 -0
  151. package/dist/intelligence/provisioning/modelSelector.js.map +1 -0
  152. package/dist/intelligence/provisioning/modelStorage.d.ts +12 -0
  153. package/dist/intelligence/provisioning/modelStorage.d.ts.map +1 -0
  154. package/dist/intelligence/provisioning/modelStorage.js +66 -0
  155. package/dist/intelligence/provisioning/modelStorage.js.map +1 -0
  156. package/dist/intelligence/provisioning/modelUpdater.d.ts +29 -0
  157. package/dist/intelligence/provisioning/modelUpdater.d.ts.map +1 -0
  158. package/dist/intelligence/provisioning/modelUpdater.js +89 -0
  159. package/dist/intelligence/provisioning/modelUpdater.js.map +1 -0
  160. package/dist/intelligence/provisioning/modelVerifier.d.ts +16 -0
  161. package/dist/intelligence/provisioning/modelVerifier.d.ts.map +1 -0
  162. package/dist/intelligence/provisioning/modelVerifier.js +108 -0
  163. package/dist/intelligence/provisioning/modelVerifier.js.map +1 -0
  164. package/dist/intelligence/provisioning/nativeRuntime.d.ts +18 -0
  165. package/dist/intelligence/provisioning/nativeRuntime.d.ts.map +1 -0
  166. package/dist/intelligence/provisioning/nativeRuntime.js +78 -0
  167. package/dist/intelligence/provisioning/nativeRuntime.js.map +1 -0
  168. package/dist/intelligence/provisioning/platformDetector.d.ts +15 -0
  169. package/dist/intelligence/provisioning/platformDetector.d.ts.map +1 -0
  170. package/dist/intelligence/provisioning/platformDetector.js +40 -0
  171. package/dist/intelligence/provisioning/platformDetector.js.map +1 -0
  172. package/dist/intelligence/provisioning/setupState.d.ts +10 -0
  173. package/dist/intelligence/provisioning/setupState.d.ts.map +1 -0
  174. package/dist/intelligence/provisioning/setupState.js +59 -0
  175. package/dist/intelligence/provisioning/setupState.js.map +1 -0
  176. package/dist/intelligence/provisioning/types.d.ts +51 -0
  177. package/dist/intelligence/provisioning/types.d.ts.map +1 -0
  178. package/dist/intelligence/provisioning/types.js +2 -0
  179. package/dist/intelligence/provisioning/types.js.map +1 -0
  180. package/dist/intelligence/runtime/embeddedRuntimeAdapter.d.ts +26 -0
  181. package/dist/intelligence/runtime/embeddedRuntimeAdapter.d.ts.map +1 -0
  182. package/dist/intelligence/runtime/embeddedRuntimeAdapter.js +119 -0
  183. package/dist/intelligence/runtime/embeddedRuntimeAdapter.js.map +1 -0
  184. package/dist/intelligence/runtime/ollamaRuntimeAdapter.d.ts +28 -0
  185. package/dist/intelligence/runtime/ollamaRuntimeAdapter.d.ts.map +1 -0
  186. package/dist/intelligence/runtime/ollamaRuntimeAdapter.js +131 -0
  187. package/dist/intelligence/runtime/ollamaRuntimeAdapter.js.map +1 -0
  188. package/dist/intelligence/runtime/runtimeManager.d.ts +37 -0
  189. package/dist/intelligence/runtime/runtimeManager.d.ts.map +1 -0
  190. package/dist/intelligence/runtime/runtimeManager.js +168 -0
  191. package/dist/intelligence/runtime/runtimeManager.js.map +1 -0
  192. package/dist/intelligence/runtime/types.d.ts +56 -0
  193. package/dist/intelligence/runtime/types.d.ts.map +1 -0
  194. package/dist/intelligence/runtime/types.js +7 -0
  195. package/dist/intelligence/runtime/types.js.map +1 -0
  196. package/dist/knowledge/chunker.d.ts +18 -0
  197. package/dist/knowledge/chunker.d.ts.map +1 -0
  198. package/dist/knowledge/chunker.js +55 -0
  199. package/dist/knowledge/chunker.js.map +1 -0
  200. package/dist/knowledge/citationService.d.ts +26 -0
  201. package/dist/knowledge/citationService.d.ts.map +1 -0
  202. package/dist/knowledge/citationService.js +47 -0
  203. package/dist/knowledge/citationService.js.map +1 -0
  204. package/dist/knowledge/embeddings.d.ts +11 -0
  205. package/dist/knowledge/embeddings.d.ts.map +1 -0
  206. package/dist/knowledge/embeddings.js +28 -0
  207. package/dist/knowledge/embeddings.js.map +1 -0
  208. package/dist/knowledge/hybridSearch.d.ts +13 -0
  209. package/dist/knowledge/hybridSearch.d.ts.map +1 -0
  210. package/dist/knowledge/hybridSearch.js +38 -0
  211. package/dist/knowledge/hybridSearch.js.map +1 -0
  212. package/dist/knowledge/index.d.ts +25 -0
  213. package/dist/knowledge/index.d.ts.map +1 -0
  214. package/dist/knowledge/index.js +37 -0
  215. package/dist/knowledge/index.js.map +1 -0
  216. package/dist/knowledge/parsers.d.ts +20 -0
  217. package/dist/knowledge/parsers.d.ts.map +1 -0
  218. package/dist/knowledge/parsers.js +94 -0
  219. package/dist/knowledge/parsers.js.map +1 -0
  220. package/dist/knowledge/ragEngine.d.ts +24 -0
  221. package/dist/knowledge/ragEngine.d.ts.map +1 -0
  222. package/dist/knowledge/ragEngine.js +121 -0
  223. package/dist/knowledge/ragEngine.js.map +1 -0
  224. package/dist/knowledge/reranker.d.ts +10 -0
  225. package/dist/knowledge/reranker.d.ts.map +1 -0
  226. package/dist/knowledge/reranker.js +11 -0
  227. package/dist/knowledge/reranker.js.map +1 -0
  228. package/dist/knowledge/vectorStore.d.ts +22 -0
  229. package/dist/knowledge/vectorStore.d.ts.map +1 -0
  230. package/dist/knowledge/vectorStore.js +74 -0
  231. package/dist/knowledge/vectorStore.js.map +1 -0
  232. package/dist/main.d.ts +2 -0
  233. package/dist/main.d.ts.map +1 -0
  234. package/dist/main.js +113 -0
  235. package/dist/main.js.map +1 -0
  236. package/dist/orchestration/agentExecutionService.d.ts +29 -0
  237. package/dist/orchestration/agentExecutionService.d.ts.map +1 -0
  238. package/dist/orchestration/agentExecutionService.js +306 -0
  239. package/dist/orchestration/agentExecutionService.js.map +1 -0
  240. package/dist/orchestration/agentStateMachine.d.ts +29 -0
  241. package/dist/orchestration/agentStateMachine.d.ts.map +1 -0
  242. package/dist/orchestration/agentStateMachine.js +153 -0
  243. package/dist/orchestration/agentStateMachine.js.map +1 -0
  244. package/dist/orchestration/agentTaskService.d.ts +44 -0
  245. package/dist/orchestration/agentTaskService.d.ts.map +1 -0
  246. package/dist/orchestration/agentTaskService.js +168 -0
  247. package/dist/orchestration/agentTaskService.js.map +1 -0
  248. package/dist/orchestration/codingAgentDiscovery.d.ts +32 -0
  249. package/dist/orchestration/codingAgentDiscovery.d.ts.map +1 -0
  250. package/dist/orchestration/codingAgentDiscovery.js +148 -0
  251. package/dist/orchestration/codingAgentDiscovery.js.map +1 -0
  252. package/dist/orchestration/codingAgentService.d.ts +40 -0
  253. package/dist/orchestration/codingAgentService.d.ts.map +1 -0
  254. package/dist/orchestration/codingAgentService.js +319 -0
  255. package/dist/orchestration/codingAgentService.js.map +1 -0
  256. package/dist/orchestration/codingAgentTypes.d.ts +111 -0
  257. package/dist/orchestration/codingAgentTypes.d.ts.map +1 -0
  258. package/dist/orchestration/codingAgentTypes.js +32 -0
  259. package/dist/orchestration/codingAgentTypes.js.map +1 -0
  260. package/dist/orchestration/codingAgentVerifier.d.ts +34 -0
  261. package/dist/orchestration/codingAgentVerifier.d.ts.map +1 -0
  262. package/dist/orchestration/codingAgentVerifier.js +109 -0
  263. package/dist/orchestration/codingAgentVerifier.js.map +1 -0
  264. package/dist/orchestration/codingRepairService.d.ts +34 -0
  265. package/dist/orchestration/codingRepairService.d.ts.map +1 -0
  266. package/dist/orchestration/codingRepairService.js +120 -0
  267. package/dist/orchestration/codingRepairService.js.map +1 -0
  268. package/dist/orchestration/goalCompletionVerifier.d.ts +36 -0
  269. package/dist/orchestration/goalCompletionVerifier.d.ts.map +1 -0
  270. package/dist/orchestration/goalCompletionVerifier.js +165 -0
  271. package/dist/orchestration/goalCompletionVerifier.js.map +1 -0
  272. package/dist/orchestration/humanApprovalService.d.ts +89 -0
  273. package/dist/orchestration/humanApprovalService.d.ts.map +1 -0
  274. package/dist/orchestration/humanApprovalService.js +346 -0
  275. package/dist/orchestration/humanApprovalService.js.map +1 -0
  276. package/dist/orchestration/index.d.ts +47 -0
  277. package/dist/orchestration/index.d.ts.map +1 -0
  278. package/dist/orchestration/index.js +67 -0
  279. package/dist/orchestration/index.js.map +1 -0
  280. package/dist/orchestration/planner.d.ts +105 -0
  281. package/dist/orchestration/planner.d.ts.map +1 -0
  282. package/dist/orchestration/planner.js +692 -0
  283. package/dist/orchestration/planner.js.map +1 -0
  284. package/dist/orchestration/types.d.ts +109 -0
  285. package/dist/orchestration/types.d.ts.map +1 -0
  286. package/dist/orchestration/types.js +20 -0
  287. package/dist/orchestration/types.js.map +1 -0
  288. package/dist/preview/previewServer.d.ts +39 -0
  289. package/dist/preview/previewServer.d.ts.map +1 -0
  290. package/dist/preview/previewServer.js +228 -0
  291. package/dist/preview/previewServer.js.map +1 -0
  292. package/dist/preview/previewService.d.ts +43 -0
  293. package/dist/preview/previewService.d.ts.map +1 -0
  294. package/dist/preview/previewService.js +289 -0
  295. package/dist/preview/previewService.js.map +1 -0
  296. package/dist/preview/previewTypes.d.ts +35 -0
  297. package/dist/preview/previewTypes.d.ts.map +1 -0
  298. package/dist/preview/previewTypes.js +5 -0
  299. package/dist/preview/previewTypes.js.map +1 -0
  300. package/dist/storage/database.d.ts +12 -0
  301. package/dist/storage/database.d.ts.map +1 -0
  302. package/dist/storage/database.js +46 -0
  303. package/dist/storage/database.js.map +1 -0
  304. package/dist/storage/health.d.ts +17 -0
  305. package/dist/storage/health.d.ts.map +1 -0
  306. package/dist/storage/health.js +48 -0
  307. package/dist/storage/health.js.map +1 -0
  308. package/dist/storage/index.d.ts +45 -0
  309. package/dist/storage/index.d.ts.map +1 -0
  310. package/dist/storage/index.js +96 -0
  311. package/dist/storage/index.js.map +1 -0
  312. package/dist/storage/migration.d.ts +17 -0
  313. package/dist/storage/migration.d.ts.map +1 -0
  314. package/dist/storage/migration.js +354 -0
  315. package/dist/storage/migration.js.map +1 -0
  316. package/dist/storage/projectService.d.ts +19 -0
  317. package/dist/storage/projectService.d.ts.map +1 -0
  318. package/dist/storage/projectService.js +29 -0
  319. package/dist/storage/projectService.js.map +1 -0
  320. package/dist/storage/repositories/agentTaskRepository.d.ts +34 -0
  321. package/dist/storage/repositories/agentTaskRepository.d.ts.map +1 -0
  322. package/dist/storage/repositories/agentTaskRepository.js +128 -0
  323. package/dist/storage/repositories/agentTaskRepository.js.map +1 -0
  324. package/dist/storage/repositories/approvalRepository.d.ts +20 -0
  325. package/dist/storage/repositories/approvalRepository.d.ts.map +1 -0
  326. package/dist/storage/repositories/approvalRepository.js +116 -0
  327. package/dist/storage/repositories/approvalRepository.js.map +1 -0
  328. package/dist/storage/repositories/conversationRepository.d.ts +16 -0
  329. package/dist/storage/repositories/conversationRepository.d.ts.map +1 -0
  330. package/dist/storage/repositories/conversationRepository.js +50 -0
  331. package/dist/storage/repositories/conversationRepository.js.map +1 -0
  332. package/dist/storage/repositories/knowledgeRepository.d.ts +109 -0
  333. package/dist/storage/repositories/knowledgeRepository.d.ts.map +1 -0
  334. package/dist/storage/repositories/knowledgeRepository.js +177 -0
  335. package/dist/storage/repositories/knowledgeRepository.js.map +1 -0
  336. package/dist/storage/repositories/messageRepository.d.ts +13 -0
  337. package/dist/storage/repositories/messageRepository.d.ts.map +1 -0
  338. package/dist/storage/repositories/messageRepository.js +39 -0
  339. package/dist/storage/repositories/messageRepository.js.map +1 -0
  340. package/dist/storage/repositories/modelsRepository.d.ts +39 -0
  341. package/dist/storage/repositories/modelsRepository.d.ts.map +1 -0
  342. package/dist/storage/repositories/modelsRepository.js +92 -0
  343. package/dist/storage/repositories/modelsRepository.js.map +1 -0
  344. package/dist/storage/repositories/projectRepository.d.ts +14 -0
  345. package/dist/storage/repositories/projectRepository.d.ts.map +1 -0
  346. package/dist/storage/repositories/projectRepository.js +44 -0
  347. package/dist/storage/repositories/projectRepository.js.map +1 -0
  348. package/dist/storage/repositories/settingsRepository.d.ts +10 -0
  349. package/dist/storage/repositories/settingsRepository.d.ts.map +1 -0
  350. package/dist/storage/repositories/settingsRepository.js +27 -0
  351. package/dist/storage/repositories/settingsRepository.js.map +1 -0
  352. package/dist/storage/repositories/types.d.ts +56 -0
  353. package/dist/storage/repositories/types.d.ts.map +1 -0
  354. package/dist/storage/repositories/types.js +2 -0
  355. package/dist/storage/repositories/types.js.map +1 -0
  356. package/dist/tools/adapters/filesystemAdapter.d.ts +121 -0
  357. package/dist/tools/adapters/filesystemAdapter.d.ts.map +1 -0
  358. package/dist/tools/adapters/filesystemAdapter.js +808 -0
  359. package/dist/tools/adapters/filesystemAdapter.js.map +1 -0
  360. package/dist/tools/adapters/terminalAdapter.d.ts +67 -0
  361. package/dist/tools/adapters/terminalAdapter.d.ts.map +1 -0
  362. package/dist/tools/adapters/terminalAdapter.js +487 -0
  363. package/dist/tools/adapters/terminalAdapter.js.map +1 -0
  364. package/dist/tools/adapters/terminalCommandPolicy.d.ts +44 -0
  365. package/dist/tools/adapters/terminalCommandPolicy.d.ts.map +1 -0
  366. package/dist/tools/adapters/terminalCommandPolicy.js +422 -0
  367. package/dist/tools/adapters/terminalCommandPolicy.js.map +1 -0
  368. package/dist/tools/adapters/terminalTypes.d.ts +111 -0
  369. package/dist/tools/adapters/terminalTypes.d.ts.map +1 -0
  370. package/dist/tools/adapters/terminalTypes.js +26 -0
  371. package/dist/tools/adapters/terminalTypes.js.map +1 -0
  372. package/dist/tools/approvalGate.d.ts +24 -0
  373. package/dist/tools/approvalGate.d.ts.map +1 -0
  374. package/dist/tools/approvalGate.js +137 -0
  375. package/dist/tools/approvalGate.js.map +1 -0
  376. package/dist/tools/approvalPolicyEngine.d.ts +32 -0
  377. package/dist/tools/approvalPolicyEngine.d.ts.map +1 -0
  378. package/dist/tools/approvalPolicyEngine.js +141 -0
  379. package/dist/tools/approvalPolicyEngine.js.map +1 -0
  380. package/dist/tools/approvalTypes.d.ts +67 -0
  381. package/dist/tools/approvalTypes.d.ts.map +1 -0
  382. package/dist/tools/approvalTypes.js +23 -0
  383. package/dist/tools/approvalTypes.js.map +1 -0
  384. package/dist/tools/index.d.ts +72 -0
  385. package/dist/tools/index.d.ts.map +1 -0
  386. package/dist/tools/index.js +353 -0
  387. package/dist/tools/index.js.map +1 -0
  388. package/dist/tools/permissionEngine.d.ts +27 -0
  389. package/dist/tools/permissionEngine.d.ts.map +1 -0
  390. package/dist/tools/permissionEngine.js +130 -0
  391. package/dist/tools/permissionEngine.js.map +1 -0
  392. package/dist/tools/toolExecutor.d.ts +37 -0
  393. package/dist/tools/toolExecutor.d.ts.map +1 -0
  394. package/dist/tools/toolExecutor.js +440 -0
  395. package/dist/tools/toolExecutor.js.map +1 -0
  396. package/dist/tools/toolRegistry.d.ts +34 -0
  397. package/dist/tools/toolRegistry.d.ts.map +1 -0
  398. package/dist/tools/toolRegistry.js +92 -0
  399. package/dist/tools/toolRegistry.js.map +1 -0
  400. package/dist/tools/types.d.ts +82 -0
  401. package/dist/tools/types.d.ts.map +1 -0
  402. package/dist/tools/types.js +33 -0
  403. package/dist/tools/types.js.map +1 -0
  404. package/dist/ui/public/app.js +777 -0
  405. package/dist/ui/public/index.html +117 -0
  406. package/dist/ui/public/styles.css +413 -0
  407. package/dist/ui/server.d.ts +27 -0
  408. package/dist/ui/server.d.ts.map +1 -0
  409. package/dist/ui/server.js +373 -0
  410. package/dist/ui/server.js.map +1 -0
  411. 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"}