@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,777 @@
1
+ /**
2
+ * NEXUS AI — Desktop SPA Client Application (P7-D)
3
+ *
4
+ * Client-side ES2022 controller.
5
+ * Routes 12 desktop views, interacts with native UIServer REST endpoints,
6
+ * manages view state, plan rendering, approval delegation, file viewing, and wizard overlay.
7
+ */
8
+
9
+ (function () {
10
+ 'use strict';
11
+
12
+ // App State
13
+ const state = {
14
+ activeView: 'dashboard',
15
+ health: null,
16
+ firstRunReport: null,
17
+ runtimeInfo: null,
18
+ tasks: [],
19
+ approvals: [],
20
+ activity: [],
21
+ workspaceTree: null,
22
+ activeFileContent: null,
23
+ activeFilePath: null,
24
+ };
25
+
26
+ // DOM Elements
27
+ const container = document.getElementById('main-view-container');
28
+ const navItems = document.querySelectorAll('.nav-item');
29
+ const navApprovalCount = document.getElementById('nav-approval-count');
30
+
31
+ // Header Elements
32
+ const hdrSysVal = document.getElementById('hdr-sys-val');
33
+ const hdrRtVal = document.getElementById('hdr-rt-val');
34
+ const hdrModelVal = document.getElementById('hdr-model-val');
35
+ const hdrSysDot = document.querySelector('#hdr-system-status .dot');
36
+ const hdrRtDot = document.querySelector('#hdr-runtime-status .dot');
37
+
38
+ // Modal Wizard
39
+ const modalWizard = document.getElementById('modal-wizard');
40
+ const btnWizardFinish = document.getElementById('btn-wizard-finish');
41
+ const btnCloseWizard = document.getElementById('btn-close-wizard');
42
+ const btnFirstRunWizard = document.getElementById('btn-first-run-wizard');
43
+
44
+ // API helper
45
+ async function apiFetch(endpoint, options = {}) {
46
+ try {
47
+ const res = await fetch(endpoint, {
48
+ headers: { 'Content-Type': 'application/json' },
49
+ ...options,
50
+ });
51
+ return await res.json();
52
+ } catch (err) {
53
+ console.error(`API Fetch Error [${endpoint}]:`, err);
54
+ return { error: String(err) };
55
+ }
56
+ }
57
+
58
+ // Poll system health
59
+ async function refreshSystemState() {
60
+ state.health = await apiFetch('/api/health');
61
+ state.firstRunReport = await apiFetch('/api/first-run');
62
+ state.runtimeInfo = await apiFetch('/api/runtime');
63
+ const apprRes = await apiFetch('/api/approvals');
64
+ state.approvals = apprRes.approvals || [];
65
+ const taskRes = await apiFetch('/api/tasks');
66
+ state.tasks = taskRes.tasks || [];
67
+
68
+ updateHeaderUI();
69
+ updateNavBadges();
70
+ }
71
+
72
+ function updateHeaderUI() {
73
+ if (!state.health) return;
74
+
75
+ const sysOverall = (state.health.overall || 'UNKNOWN').toUpperCase();
76
+ hdrSysVal.textContent = sysOverall;
77
+ if (sysOverall === 'OK') {
78
+ hdrSysDot.className = 'dot green';
79
+ } else if (sysOverall === 'DEGRADED') {
80
+ hdrSysDot.className = 'dot yellow';
81
+ } else {
82
+ hdrSysDot.className = 'dot red';
83
+ }
84
+
85
+ const rtHealth = state.runtimeInfo?.health;
86
+ const rtStatus = (rtHealth?.status || 'UNAVAILABLE').toUpperCase();
87
+ hdrRtVal.textContent = rtStatus;
88
+ if (rtStatus === 'READY') {
89
+ hdrRtDot.className = 'dot green';
90
+ } else {
91
+ hdrRtDot.className = 'dot yellow';
92
+ }
93
+
94
+ if (state.firstRunReport?.primaryModelId) {
95
+ hdrModelVal.textContent = state.firstRunReport.primaryModelId;
96
+ }
97
+ }
98
+
99
+ function updateNavBadges() {
100
+ const pendingCount = state.approvals.length;
101
+ if (pendingCount > 0) {
102
+ navApprovalCount.textContent = pendingCount;
103
+ navApprovalCount.classList.remove('hidden');
104
+ } else {
105
+ navApprovalCount.classList.add('hidden');
106
+ }
107
+ }
108
+
109
+ // Navigation Routing
110
+ function setupNavigation() {
111
+ navItems.forEach((item) => {
112
+ item.addEventListener('click', () => {
113
+ const view = item.getAttribute('data-view');
114
+ switchView(view);
115
+ });
116
+ });
117
+
118
+ btnFirstRunWizard?.addEventListener('click', () => showWizardModal());
119
+ btnCloseWizard?.addEventListener('click', () => hideWizardModal());
120
+ btnWizardFinish?.addEventListener('click', () => hideWizardModal());
121
+ }
122
+
123
+ function switchView(viewName) {
124
+ state.activeView = viewName;
125
+ navItems.forEach((item) => {
126
+ if (item.getAttribute('data-view') === viewName) {
127
+ item.classList.add('active');
128
+ } else {
129
+ item.classList.remove('active');
130
+ }
131
+ });
132
+
133
+ renderCurrentView();
134
+ }
135
+
136
+ function renderCurrentView() {
137
+ switch (state.activeView) {
138
+ case 'dashboard': renderDashboardView(); break;
139
+ case 'agent': renderAgentView(); break;
140
+ case 'plan': renderPlanView(); break;
141
+ case 'approvals': renderApprovalsView(); break;
142
+ case 'explorer': renderExplorerView(); break;
143
+ case 'diff': renderDiffView(); break;
144
+ case 'history': renderHistoryView(); break;
145
+ case 'activity': renderActivityView(); break;
146
+ case 'models': renderModelsView(); break;
147
+ case 'knowledge': renderKnowledgeView(); break;
148
+ case 'settings': renderSettingsView(); break;
149
+ default: renderDashboardView(); break;
150
+ }
151
+ }
152
+
153
+ // 1. DASHBOARD VIEW
154
+ function renderDashboardView() {
155
+ const sysOverall = state.health?.overall?.toUpperCase() || 'OK';
156
+ const rtStatus = state.runtimeInfo?.health?.status?.toUpperCase() || 'READY';
157
+ const wsPath = state.firstRunReport?.workspaceCanonicalPath || 'C:\\...\\workspace';
158
+ const model = state.firstRunReport?.primaryModelId || 'qwen2.5:3b';
159
+
160
+ container.innerHTML = `
161
+ <div class="view-header">
162
+ <h1 class="view-title">System Dashboard</h1>
163
+ <p class="view-subtitle">Real-time NEXUS AI workstation overview & status</p>
164
+ </div>
165
+
166
+ <div class="grid-4" style="margin-bottom:24px;">
167
+ <div class="card">
168
+ <div class="card-title">System Status</div>
169
+ <div class="card-value" style="color:${sysOverall === 'OK' ? 'var(--success)' : 'var(--warning)'}">${sysOverall}</div>
170
+ </div>
171
+ <div class="card">
172
+ <div class="card-title">AI Runtime</div>
173
+ <div class="card-value" style="color:${rtStatus === 'READY' ? 'var(--success)' : 'var(--warning)'}">${rtStatus}</div>
174
+ </div>
175
+ <div class="card">
176
+ <div class="card-title">Active Model</div>
177
+ <div class="card-value" style="font-size:15px; margin-top:4px;">${model}</div>
178
+ </div>
179
+ <div class="card">
180
+ <div class="card-title">Pending Approvals</div>
181
+ <div class="card-value" style="color:${state.approvals.length > 0 ? 'var(--warning)' : 'var(--text-main)'}">${state.approvals.length}</div>
182
+ </div>
183
+ </div>
184
+
185
+ <div class="grid-2">
186
+ <div class="card">
187
+ <div class="card-title">Quick Actions</div>
188
+ <div style="display:flex; flex-direction:column; gap:10px; margin-top:10px;">
189
+ <button class="btn-primary" onclick="window.nexusApp.switchView('agent')">🤖 Start New Agent Task</button>
190
+ <button class="btn-secondary" onclick="window.nexusApp.switchView('approvals')">🛡️ Review Pending Approvals (${state.approvals.length})</button>
191
+ <button class="btn-secondary" onclick="window.nexusApp.switchView('explorer')">📁 Browse Workspace Files</button>
192
+ </div>
193
+ </div>
194
+
195
+ <div class="card">
196
+ <div class="card-title">Workspace Location</div>
197
+ <div style="margin-top:10px;">
198
+ <p style="font-size:12px; color:var(--text-muted);">Configured Sandbox Path:</p>
199
+ <div class="code-box" style="margin-top:6px; font-size:11px;">${wsPath}</div>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ `;
204
+ }
205
+
206
+ // Task execution polling & formatting helpers
207
+ let activeTaskPollInterval = null;
208
+
209
+ function stopTaskPolling() {
210
+ if (activeTaskPollInterval) {
211
+ clearInterval(activeTaskPollInterval);
212
+ activeTaskPollInterval = null;
213
+ }
214
+ }
215
+
216
+ function formatTaskLog(task) {
217
+ if (!task) return 'Agent execution log will stream here...';
218
+ let log = `[Task ID] ${task.id}\n`;
219
+ log += `[Goal] ${task.title}\n`;
220
+ log += `[State] ${(task.state || 'UNKNOWN').toUpperCase()}\n`;
221
+ if (task.currentStep) {
222
+ log += `[Current Step] ${task.currentStep} (Status: ${task.stepStatus || 'active'})\n`;
223
+ }
224
+
225
+ if (task.plan) {
226
+ try {
227
+ const steps = typeof task.plan === 'string' ? JSON.parse(task.plan) : task.plan;
228
+ if (Array.isArray(steps) && steps.length > 0) {
229
+ log += `\n[Execution Plan Steps (${steps.length})]:\n`;
230
+ steps.forEach((s, i) => {
231
+ log += ` ${i + 1}. [${s.toolId}] ${s.stepId} — caps: [${(s.requestedCapabilities || []).join(', ')}]\n`;
232
+ });
233
+ }
234
+ } catch {
235
+ log += `\n[Plan] ${task.plan}\n`;
236
+ }
237
+ }
238
+
239
+ if (task.state === 'completed') {
240
+ log += '\n✅ Task completed successfully.\n';
241
+ } else if (task.state === 'awaiting_approval') {
242
+ log += '\n⚠ Task paused — approval required.\nGo to Approval Center to review and authorize the next step.\n';
243
+ } else if (task.state === 'failed') {
244
+ log += `\n❌ Task failed [${task.errorCategory || 'UNKNOWN'}]\n`;
245
+ } else if (task.state === 'cancelled') {
246
+ log += '\n⚠ Task was cancelled.\n';
247
+ }
248
+ return log;
249
+ }
250
+
251
+ function updateFlowSteps(taskState) {
252
+ const steps = ['planning', 'plan_ready', 'awaiting_approval', 'executing', 'observing', 'verifying', 'completed'];
253
+ const currentState = (taskState || '').toLowerCase();
254
+
255
+ let activeIndex = 0;
256
+ if (currentState === 'planning') activeIndex = 0;
257
+ else if (currentState === 'awaiting_approval') activeIndex = 2;
258
+ else if (currentState === 'executing') activeIndex = 3;
259
+ else if (currentState === 'observing') activeIndex = 4;
260
+ else if (currentState === 'verifying') activeIndex = 5;
261
+ else if (currentState === 'completed') activeIndex = 6;
262
+ else if (currentState === 'failed') activeIndex = 3;
263
+
264
+ steps.forEach((stepId, idx) => {
265
+ const el = document.getElementById(`step-${stepId}`);
266
+ if (el) {
267
+ if (idx <= activeIndex) {
268
+ el.classList.add('active');
269
+ } else {
270
+ el.classList.remove('active');
271
+ }
272
+ }
273
+ });
274
+ }
275
+
276
+ function pollTask(taskId) {
277
+ stopTaskPolling();
278
+ activeTaskPollInterval = setInterval(async () => {
279
+ const res = await apiFetch(`/api/tasks/${taskId}`);
280
+ if (!res.task) {
281
+ stopTaskPolling();
282
+ return;
283
+ }
284
+ const task = res.task;
285
+ const idx = state.tasks.findIndex((t) => t.id === task.id);
286
+ if (idx >= 0) state.tasks[idx] = task;
287
+ else state.tasks.push(task);
288
+
289
+ if (state.activeView === 'agent') {
290
+ const box = document.getElementById('agent-output-box');
291
+ if (box) box.textContent = formatTaskLog(task);
292
+ updateFlowSteps(task.state);
293
+ }
294
+
295
+ if (['completed', 'failed', 'cancelled', 'awaiting_approval'].includes(task.state)) {
296
+ stopTaskPolling();
297
+ const btn = document.getElementById('btn-submit-task');
298
+ if (btn) btn.disabled = false;
299
+ refreshSystemState();
300
+ }
301
+ }, 800);
302
+ }
303
+
304
+ // 2. AGENT WORKSPACE VIEW
305
+ function renderAgentView() {
306
+ stopTaskPolling();
307
+
308
+ const latestTask = state.tasks && state.tasks.length > 0 ? state.tasks[state.tasks.length - 1] : null;
309
+
310
+ container.innerHTML = `
311
+ <div class="view-header">
312
+ <h1 class="view-title">Agent Workspace</h1>
313
+ <p class="view-subtitle">Issue high-level coding or analysis tasks to NEXUS AI</p>
314
+ </div>
315
+
316
+ <div class="card" style="margin-bottom:24px;">
317
+ <div class="card-title">New Task Request</div>
318
+ <div style="display:flex; gap:10px; margin-top:10px;">
319
+ <input type="text" id="inp-task-prompt" placeholder="e.g. Build a portfolio landing page with CSS grid" />
320
+ <button class="btn-primary" id="btn-submit-task" style="white-space:nowrap;">Run Agent Task</button>
321
+ </div>
322
+ </div>
323
+
324
+ <div class="card">
325
+ <div class="card-title">Agent Execution State Machine Flow</div>
326
+ <div class="flow-steps">
327
+ <div class="flow-step" id="step-planning">PLANNING</div>
328
+ <div class="flow-step" id="step-plan_ready">PLAN READY</div>
329
+ <div class="flow-step" id="step-awaiting_approval">AWAITING APPROVAL</div>
330
+ <div class="flow-step" id="step-executing">EXECUTING</div>
331
+ <div class="flow-step" id="step-observing">OBSERVING</div>
332
+ <div class="flow-step" id="step-verifying">VERIFYING</div>
333
+ <div class="flow-step" id="step-completed">COMPLETED</div>
334
+ </div>
335
+
336
+ <div id="agent-output-box" class="code-box" style="min-height:180px; font-size:12px; margin-top:12px; color:var(--text-muted);">
337
+ ${formatTaskLog(latestTask)}
338
+ </div>
339
+ </div>
340
+ `;
341
+
342
+ if (latestTask) {
343
+ updateFlowSteps(latestTask.state);
344
+ if (!['completed', 'failed', 'cancelled', 'awaiting_approval'].includes(latestTask.state)) {
345
+ pollTask(latestTask.id);
346
+ }
347
+ }
348
+
349
+ document.getElementById('btn-submit-task')?.addEventListener('click', async () => {
350
+ const prompt = document.getElementById('inp-task-prompt')?.value?.trim();
351
+ if (!prompt) return;
352
+
353
+ const btn = document.getElementById('btn-submit-task');
354
+ if (btn) btn.disabled = true;
355
+
356
+ const box = document.getElementById('agent-output-box');
357
+ if (box) box.textContent = `[Planning] Synthesizing plan for: "${prompt}"...\n`;
358
+ updateFlowSteps('planning');
359
+
360
+ const res = await apiFetch('/api/tasks', {
361
+ method: 'POST',
362
+ body: JSON.stringify({ prompt }),
363
+ });
364
+
365
+ if (res.error || res.planError || res.executionError) {
366
+ const err = res.error || res.planError || res.executionError;
367
+ if (box) box.textContent += `\n[Error] ${err}\n`;
368
+ if (btn) btn.disabled = false;
369
+ return;
370
+ }
371
+
372
+ const task = res.task;
373
+ if (task) {
374
+ if (box) box.textContent = formatTaskLog(task);
375
+ updateFlowSteps(task.state);
376
+ pollTask(task.id);
377
+ } else {
378
+ if (btn) btn.disabled = false;
379
+ }
380
+ });
381
+ }
382
+
383
+ // 3. PLAN VIEW
384
+ function renderPlanView() {
385
+ container.innerHTML = `
386
+ <div class="view-header">
387
+ <h1 class="view-title">Plan Visualization</h1>
388
+ <p class="view-subtitle">Structured execution plan steps generated by PlanSynthesisService</p>
389
+ </div>
390
+
391
+ <div class="card">
392
+ <div class="card-title">Sample Synthesized Plan Steps</div>
393
+ <div style="margin-top:12px; display:flex; flex-direction:column; gap:12px;">
394
+ <div style="background-color:var(--bg-surface); padding:12px; border-radius:6px; border:1px solid var(--border);">
395
+ <div style="display:flex; justify-content:space-between; align-items:center;">
396
+ <strong>Step 1: Workspace Structure Inspection</strong>
397
+ <span style="background-color:rgba(16,185,129,0.15); color:var(--success); font-size:11px; padding:2px 8px; border-radius:4px; font-weight:600;">LOW RISK</span>
398
+ </div>
399
+ <p style="font-size:12px; color:var(--text-muted); margin-top:4px;">Tool: <code>workspace_tree</code> | Capabilities: <code>filesystem.read</code></p>
400
+ </div>
401
+
402
+ <div style="background-color:var(--bg-surface); padding:12px; border-radius:6px; border:1px solid var(--border);">
403
+ <div style="display:flex; justify-content:space-between; align-items:center;">
404
+ <strong>Step 2: Generate Core File</strong>
405
+ <span style="background-color:rgba(245,158,11,0.15); color:var(--warning); font-size:11px; padding:2px 8px; border-radius:4px; font-weight:600;">MEDIUM RISK</span>
406
+ </div>
407
+ <p style="font-size:12px; color:var(--text-muted); margin-top:4px;">Tool: <code>filesystem_write</code> | Capabilities: <code>filesystem.write</code></p>
408
+ </div>
409
+ </div>
410
+ </div>
411
+ `;
412
+ }
413
+
414
+ // 4. APPROVAL CENTER
415
+ function renderApprovalsView() {
416
+ const list = state.approvals;
417
+ let html = `
418
+ <div class="view-header">
419
+ <h1 class="view-title">Approval Center</h1>
420
+ <p class="view-subtitle">Review & authorize high-risk operations requested by agent tasks</p>
421
+ </div>
422
+ `;
423
+
424
+ if (list.length === 0) {
425
+ html += `
426
+ <div class="card" style="text-align:center; padding:40px;">
427
+ <p style="font-size:16px; color:var(--success);">✅ No pending approval requests</p>
428
+ <p style="font-size:12px; color:var(--text-muted); margin-top:6px;">All low-risk operations are automatically approved by policy.</p>
429
+ </div>
430
+ `;
431
+ } else {
432
+ html += `<div style="display:flex; flex-direction:column; gap:16px;">`;
433
+ list.forEach((appr) => {
434
+ html += `
435
+ <div class="card" style="border-left:4px solid var(--warning);">
436
+ <div style="display:flex; justify-content:space-between; align-items:center;">
437
+ <h3>Approval Required: ${appr.toolId}</h3>
438
+ <span style="background-color:var(--warning); color:#000; font-weight:700; font-size:11px; padding:2px 8px; border-radius:4px;">${appr.riskLevel.toUpperCase()} RISK</span>
439
+ </div>
440
+ <p style="font-size:12px; color:var(--text-muted); margin-top:6px;">Task ID: <code>${appr.taskId}</code> | Step ID: <code>${appr.stepId}</code></p>
441
+ <p style="font-size:12px; margin-top:6px;">Reason: ${appr.reasonCategory || 'Operation requires explicit user consent'}</p>
442
+ <div style="display:flex; gap:10px; margin-top:14px;">
443
+ <button class="btn-primary" onclick="window.nexusApp.respondApproval('${appr.approvalId}', 'APPROVED')">Approve</button>
444
+ <button class="btn-danger" onclick="window.nexusApp.respondApproval('${appr.approvalId}', 'REJECTED')">Reject</button>
445
+ </div>
446
+ </div>
447
+ `;
448
+ });
449
+ html += `</div>`;
450
+ }
451
+
452
+ container.innerHTML = html;
453
+ }
454
+
455
+ // 5. WORKSPACE EXPLORER VIEW
456
+ function renderExplorerView() {
457
+ container.innerHTML = `
458
+ <div class="view-header">
459
+ <h1 class="view-title">Workspace Explorer</h1>
460
+ <p class="view-subtitle">Read-only navigation of canonical workspace directory sandbox</p>
461
+ </div>
462
+
463
+ <div class="grid-2">
464
+ <div class="card">
465
+ <div class="card-title">Directory Tree</div>
466
+ <button class="btn-secondary" id="btn-load-tree" style="margin-bottom:10px;">Refresh Directory Tree</button>
467
+ <div class="code-box" id="tree-box" style="height:320px;">Click refresh to inspect workspace tree...</div>
468
+ </div>
469
+
470
+ <div class="card">
471
+ <div class="card-title">File Content Reader</div>
472
+ <div style="display:flex; gap:8px; margin-bottom:10px;">
473
+ <input type="text" id="inp-read-file" placeholder="e.g. index.html" />
474
+ <button class="btn-primary" id="btn-read-file">Read</button>
475
+ </div>
476
+ <div class="code-box" id="file-box" style="height:270px;">Enter relative path to view content...</div>
477
+ </div>
478
+ </div>
479
+ `;
480
+
481
+ document.getElementById('btn-load-tree')?.addEventListener('click', async () => {
482
+ const box = document.getElementById('tree-box');
483
+ box.textContent = 'Loading workspace tree via ToolGateway...';
484
+ const res = await apiFetch('/api/workspace/tree');
485
+ box.textContent = JSON.stringify(res, null, 2);
486
+ });
487
+
488
+ document.getElementById('btn-read-file')?.addEventListener('click', async () => {
489
+ const relPath = document.getElementById('inp-read-file')?.value?.trim();
490
+ if (!relPath) return;
491
+ const box = document.getElementById('file-box');
492
+ box.textContent = `Reading "${relPath}"...`;
493
+ const res = await apiFetch('/api/workspace/file', {
494
+ method: 'POST',
495
+ body: JSON.stringify({ relativePath: relPath }),
496
+ });
497
+ box.textContent = JSON.stringify(res, null, 2);
498
+ });
499
+ }
500
+
501
+ // 6. FILE DIFF VIEWER
502
+ function renderDiffView() {
503
+ container.innerHTML = `
504
+ <div class="view-header">
505
+ <h1 class="view-title">File Diff Viewer</h1>
506
+ <p class="view-subtitle">Inspect unified before / after diffs for safe file edits</p>
507
+ </div>
508
+
509
+ <div class="card">
510
+ <div class="card-title">Unified Diff Container</div>
511
+ <div class="code-box" style="font-family:var(--font-mono); font-size:12px; margin-top:10px;">
512
+ <span style="color:var(--text-dim);">--- a/workspace/index.html</span>
513
+ <span style="color:var(--text-dim);">+++ b/workspace/index.html</span>
514
+ <span style="color:var(--accent);">@@ -1,5 +1,6 @@</span>
515
+ &lt;!DOCTYPE html&gt;
516
+ &lt;html&gt;
517
+ -&lt;title&gt;Old Title&lt;/title&gt;
518
+ +&lt;title&gt;NEXUS AI — Desktop App&lt;/title&gt;
519
+ &lt;/html&gt;
520
+ </div>
521
+ </div>
522
+ `;
523
+ }
524
+
525
+ // 7. TASK HISTORY VIEW
526
+ function renderHistoryView() {
527
+ const tasks = state.tasks;
528
+ let html = `
529
+ <div class="view-header">
530
+ <h1 class="view-title">Task History</h1>
531
+ <p class="view-subtitle">Chronological record of all created agent execution tasks</p>
532
+ </div>
533
+ `;
534
+
535
+ if (tasks.length === 0) {
536
+ html += `<div class="card"><p style="color:var(--text-muted);">No task history recorded yet.</p></div>`;
537
+ } else {
538
+ html += `<div class="card"><div style="display:flex; flex-direction:column; gap:10px;">`;
539
+ tasks.forEach((t) => {
540
+ html += `
541
+ <div style="padding:10px; border-bottom:1px solid var(--border); display:flex; justify-content:space-between; align-items:center;">
542
+ <div>
543
+ <strong>${t.title}</strong>
544
+ <div style="font-size:11px; color:var(--text-dim);">ID: ${t.id} | Created: ${new Date(t.createdAt).toLocaleString()}</div>
545
+ </div>
546
+ <span style="background-color:var(--bg-surface); padding:2px 8px; border-radius:4px; font-size:11px; font-weight:700; border:1px solid var(--border);">${t.state.toUpperCase()}</span>
547
+ </div>
548
+ `;
549
+ });
550
+ html += `</div></div>`;
551
+ }
552
+
553
+ container.innerHTML = html;
554
+ }
555
+
556
+ // 8. ACTIVITY TIMELINE VIEW
557
+ function renderActivityView() {
558
+ container.innerHTML = `
559
+ <div class="view-header">
560
+ <h1 class="view-title">Activity Timeline</h1>
561
+ <p class="view-subtitle">User-friendly timeline of system lifecycle events</p>
562
+ </div>
563
+ <div class="card" id="activity-box">Loading activity timeline...</div>
564
+ `;
565
+
566
+ apiFetch('/api/activity').then((res) => {
567
+ const box = document.getElementById('activity-box');
568
+ if (!box) return;
569
+ const list = res.activity || [];
570
+ if (list.length === 0) {
571
+ box.textContent = 'No recent activity items.';
572
+ return;
573
+ }
574
+ let html = '<div style="display:flex; flex-direction:column; gap:12px;">';
575
+ list.forEach((item) => {
576
+ html += `
577
+ <div style="border-left:3px solid var(--accent); padding-left:12px;">
578
+ <strong>${item.title}</strong>
579
+ <p style="font-size:12px; color:var(--text-muted);">${item.detail || ''}</p>
580
+ <span style="font-size:10px; color:var(--text-dim);">${new Date(item.timestamp).toLocaleString()}</span>
581
+ </div>
582
+ `;
583
+ });
584
+ html += '</div>';
585
+ box.innerHTML = html;
586
+ });
587
+ }
588
+
589
+ // 9. MODELS & RUNTIME VIEW
590
+ function renderModelsView() {
591
+ const health = state.runtimeInfo?.health;
592
+ const models = state.runtimeInfo?.models || [];
593
+
594
+ container.innerHTML = `
595
+ <div class="view-header">
596
+ <h1 class="view-title">Models & Runtime Management</h1>
597
+ <p class="view-subtitle">AI Runtime status and local model inventory</p>
598
+ </div>
599
+
600
+ <div class="grid-2" style="margin-bottom:20px;">
601
+ <div class="card">
602
+ <div class="card-title">Runtime Provider</div>
603
+ <div style="font-size:18px; font-weight:700;">${health?.providerId?.toUpperCase() || 'OLLAMA'}</div>
604
+ <p style="font-size:12px; color:var(--text-muted); margin-top:4px;">Endpoint: ${health?.endpoint || 'http://127.0.0.1:11434'}</p>
605
+ <p style="font-size:12px; color:var(--text-muted);">Version: ${health?.version || 'unknown'}</p>
606
+ </div>
607
+ <div class="card">
608
+ <div class="card-title">Runtime Readiness</div>
609
+ <div class="card-value" style="color:${health?.status === 'READY' ? 'var(--success)' : 'var(--warning)'}">${health?.status || 'UNAVAILABLE'}</div>
610
+ </div>
611
+ </div>
612
+
613
+ <div class="card">
614
+ <div class="card-title">Discovered Local Models (${models.length})</div>
615
+ <div style="margin-top:10px; display:flex; flex-direction:column; gap:8px;">
616
+ ${models.length === 0 ? '<p style="color:var(--text-muted);">No models discovered in local runtime.</p>' : ''}
617
+ ${models.map((m) => `
618
+ <div style="padding:8px 12px; background-color:var(--bg-surface); border:1px solid var(--border); border-radius:6px; display:flex; justify-content:space-between; align-items:center;">
619
+ <div>
620
+ <strong>${m.id}</strong>
621
+ <span style="font-size:11px; color:var(--text-dim); margin-left:8px;">${m.parameterSize || 'latest'}</span>
622
+ </div>
623
+ <span style="background-color:rgba(16,185,129,0.15); color:var(--success); font-size:11px; font-weight:600; padding:2px 6px; border-radius:4px;">MODEL_READY</span>
624
+ </div>
625
+ `).join('')}
626
+ </div>
627
+ </div>
628
+ `;
629
+ }
630
+
631
+ // 10. KNOWLEDGE / RAG VIEW
632
+ function renderKnowledgeView() {
633
+ container.innerHTML = `
634
+ <div class="view-header">
635
+ <h1 class="view-title">Knowledge Engine & RAG</h1>
636
+ <p class="view-subtitle">Offline vector collections and document retrieval sandbox</p>
637
+ </div>
638
+
639
+ <div class="grid-2">
640
+ <div class="card">
641
+ <div class="card-title">Ingest Text Document</div>
642
+ <div style="display:flex; flex-direction:column; gap:8px; margin-top:10px;">
643
+ <input type="text" id="inp-doc-name" placeholder="Document Filename (e.g. notes.md)" />
644
+ <textarea id="inp-doc-text" rows="5" placeholder="Enter markdown or plain text content..."></textarea>
645
+ <button class="btn-primary" id="btn-ingest-doc">Ingest into Collection</button>
646
+ </div>
647
+ </div>
648
+
649
+ <div class="card">
650
+ <div class="card-title">Ingestion Result</div>
651
+ <div class="code-box" id="ingest-res-box" style="height:200px;">Ingested document details will appear here...</div>
652
+ </div>
653
+ </div>
654
+ `;
655
+
656
+ document.getElementById('btn-ingest-doc')?.addEventListener('click', async () => {
657
+ const filename = document.getElementById('inp-doc-name')?.value?.trim();
658
+ const text = document.getElementById('inp-doc-text')?.value?.trim();
659
+ if (!filename || !text) return;
660
+
661
+ const box = document.getElementById('ingest-res-box');
662
+ box.textContent = 'Ingesting document...';
663
+ const res = await apiFetch('/api/knowledge/ingest', {
664
+ method: 'POST',
665
+ body: JSON.stringify({ filename, text }),
666
+ });
667
+ box.textContent = JSON.stringify(res, null, 2);
668
+ });
669
+ }
670
+
671
+ // 11. SETTINGS VIEW
672
+ function renderSettingsView() {
673
+ const config = state.health?.config || {};
674
+
675
+ container.innerHTML = `
676
+ <div class="view-header">
677
+ <h1 class="view-title">Application Settings</h1>
678
+ <p class="view-subtitle">System configuration & workspace validation sandbox</p>
679
+ </div>
680
+
681
+ <div class="card" style="margin-bottom:20px;">
682
+ <div class="card-title">System Settings</div>
683
+ <div style="display:flex; flex-direction:column; gap:10px; margin-top:10px;">
684
+ <div><label style="font-size:12px; color:var(--text-muted);">Environment:</label> <input type="text" value="${config.environment || 'development'}" disabled /></div>
685
+ <div><label style="font-size:12px; color:var(--text-muted);">Port:</label> <input type="text" value="${config.port || 3000}" disabled /></div>
686
+ <div><label style="font-size:12px; color:var(--text-muted);">Ollama Host:</label> <input type="text" value="${config.ollamaHost || 'http://127.0.0.1:11434'}" disabled /></div>
687
+ <div><label style="font-size:12px; color:var(--text-muted);">Database Path:</label> <input type="text" value="${config.databasePath || ''}" disabled /></div>
688
+ </div>
689
+ </div>
690
+
691
+ <div class="card">
692
+ <div class="card-title">Workspace Validator</div>
693
+ <div style="display:flex; gap:10px; margin-top:10px;">
694
+ <input type="text" id="inp-val-ws" placeholder="Enter path to validate..." />
695
+ <button class="btn-primary" id="btn-val-ws">Validate</button>
696
+ </div>
697
+ <div class="code-box" id="val-ws-box" style="margin-top:10px;">Validation output...</div>
698
+ </div>
699
+ `;
700
+
701
+ document.getElementById('btn-val-ws')?.addEventListener('click', async () => {
702
+ const pathVal = document.getElementById('inp-val-ws')?.value?.trim();
703
+ if (!pathVal) return;
704
+ const box = document.getElementById('val-ws-box');
705
+ box.textContent = 'Validating workspace path...';
706
+ const res = await apiFetch('/api/workspace/validate', {
707
+ method: 'POST',
708
+ body: JSON.stringify({ path: pathVal }),
709
+ });
710
+ box.textContent = JSON.stringify(res, null, 2);
711
+ });
712
+ }
713
+
714
+ // 12. FIRST-RUN WIZARD MODAL
715
+ function showWizardModal() {
716
+ const report = state.firstRunReport;
717
+ const content = document.getElementById('wizard-content');
718
+ if (!content) return;
719
+
720
+ if (!report) {
721
+ content.innerHTML = '<p>Loading health check report...</p>';
722
+ } else {
723
+ let html = `<p style="margin-bottom:12px;">First-Run Status: <strong>${report.state}</strong></p>`;
724
+ html += '<div style="display:flex; flex-direction:column; gap:8px;">';
725
+ (report.checks || []).forEach((c) => {
726
+ const color = c.status === 'OK' ? 'var(--success)' : c.status === 'DEGRADED' ? 'var(--warning)' : 'var(--error)';
727
+ html += `
728
+ <div style="padding:8px; border:1px solid var(--border); border-radius:6px; display:flex; justify-content:space-between; align-items:center;">
729
+ <span>${c.name}</span>
730
+ <span style="color:${color}; font-weight:700; font-size:12px;">[${c.status}]</span>
731
+ </div>
732
+ `;
733
+ });
734
+ html += '</div>';
735
+ content.innerHTML = html;
736
+ }
737
+
738
+ modalWizard?.classList.remove('hidden');
739
+ }
740
+
741
+ function hideWizardModal() {
742
+ modalWizard?.classList.add('hidden');
743
+ }
744
+
745
+ // Global namespace export for inline HTML handlers
746
+ window.nexusApp = {
747
+ switchView,
748
+ async respondApproval(id, decision) {
749
+ const res = await apiFetch(`/api/approvals/${id}/respond`, {
750
+ method: 'POST',
751
+ body: JSON.stringify({ decision }),
752
+ });
753
+ await refreshSystemState();
754
+ // Show resumed execution result on Agent view if we are on it
755
+ if (state.activeView === 'approvals' && res.task) {
756
+ const task = res.task;
757
+ const msg = task.state === 'completed'
758
+ ? `\n✅ Task ${task.id} completed after approval.`
759
+ : task.state === 'awaiting_approval'
760
+ ? `\n⚠ Another approval is required for task ${task.id}.`
761
+ : task.state === 'failed'
762
+ ? `\n❌ Task ${task.id} failed [${task.errorCategory || 'UNKNOWN'}] after approval.`
763
+ : `\nTask ${task.id} state: ${task.state.toUpperCase()}`;
764
+ alert(msg);
765
+ }
766
+ renderApprovalsView();
767
+ },
768
+ };
769
+
770
+ // Init Application
771
+ document.addEventListener('DOMContentLoaded', async () => {
772
+ setupNavigation();
773
+ await refreshSystemState();
774
+ switchView('dashboard');
775
+ setInterval(refreshSystemState, 5000); // 5s refresh loop
776
+ });
777
+ })();