nova-terminal-assistant 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.

Potentially problematic release.


This version of nova-terminal-assistant might be problematic. Click here for more details.

Files changed (192) hide show
  1. package/README.md +358 -0
  2. package/bin/nova +38 -0
  3. package/bin/nova.js +12 -0
  4. package/package.json +67 -0
  5. package/src/cli/commands/SmartCompletion.ts +458 -0
  6. package/src/cli/index.ts +5 -0
  7. package/src/cli/startup/IFlowRepl.ts +212 -0
  8. package/src/cli/startup/InkBasedRepl.ts +1056 -0
  9. package/src/cli/startup/InteractiveRepl.ts +2833 -0
  10. package/src/cli/startup/NovaApp.ts +1861 -0
  11. package/src/cli/startup/index.ts +4 -0
  12. package/src/cli/startup/parseArgs.ts +293 -0
  13. package/src/cli/test-modules.ts +27 -0
  14. package/src/cli/ui/IFlowDropdown.ts +425 -0
  15. package/src/cli/ui/ModernReplUI.ts +276 -0
  16. package/src/cli/ui/SimpleSelector2.ts +215 -0
  17. package/src/cli/ui/components/ConfirmDialog.ts +176 -0
  18. package/src/cli/ui/components/ErrorPanel.ts +364 -0
  19. package/src/cli/ui/components/InkAppRunner.tsx +67 -0
  20. package/src/cli/ui/components/InkComponents.tsx +613 -0
  21. package/src/cli/ui/components/NovaInkApp.tsx +312 -0
  22. package/src/cli/ui/components/ProgressBar.ts +177 -0
  23. package/src/cli/ui/components/ProgressIndicator.ts +298 -0
  24. package/src/cli/ui/components/QuickActions.ts +396 -0
  25. package/src/cli/ui/components/SimpleErrorPanel.ts +231 -0
  26. package/src/cli/ui/components/StatusBar.ts +194 -0
  27. package/src/cli/ui/components/ThinkingBlockRenderer.ts +401 -0
  28. package/src/cli/ui/components/index.ts +27 -0
  29. package/src/cli/ui/ink-prototype.tsx +347 -0
  30. package/src/cli/utils/CliUI.ts +336 -0
  31. package/src/cli/utils/CompletionHelper.ts +388 -0
  32. package/src/cli/utils/EnhancedCompleter.test.ts +226 -0
  33. package/src/cli/utils/EnhancedCompleter.ts +513 -0
  34. package/src/cli/utils/ErrorEnhancer.ts +429 -0
  35. package/src/cli/utils/OutputFormatter.ts +193 -0
  36. package/src/cli/utils/index.ts +9 -0
  37. package/src/core/agents/AgentOrchestrator.ts +515 -0
  38. package/src/core/agents/index.ts +17 -0
  39. package/src/core/audit/AuditLogger.ts +509 -0
  40. package/src/core/audit/index.ts +11 -0
  41. package/src/core/auth/AuthManager.d.ts.map +1 -0
  42. package/src/core/auth/AuthManager.ts +138 -0
  43. package/src/core/auth/index.d.ts.map +1 -0
  44. package/src/core/auth/index.ts +2 -0
  45. package/src/core/config/ConfigManager.d.ts.map +1 -0
  46. package/src/core/config/ConfigManager.test.ts +183 -0
  47. package/src/core/config/ConfigManager.ts +1219 -0
  48. package/src/core/config/index.d.ts.map +1 -0
  49. package/src/core/config/index.ts +1 -0
  50. package/src/core/context/ContextBuilder.d.ts.map +1 -0
  51. package/src/core/context/ContextBuilder.ts +171 -0
  52. package/src/core/context/ContextCompressor.d.ts.map +1 -0
  53. package/src/core/context/ContextCompressor.ts +642 -0
  54. package/src/core/context/LayeredMemoryManager.ts +657 -0
  55. package/src/core/context/MemoryDiscovery.d.ts.map +1 -0
  56. package/src/core/context/MemoryDiscovery.ts +175 -0
  57. package/src/core/context/defaultSystemPrompt.d.ts.map +1 -0
  58. package/src/core/context/defaultSystemPrompt.ts +35 -0
  59. package/src/core/context/index.d.ts.map +1 -0
  60. package/src/core/context/index.ts +22 -0
  61. package/src/core/extensions/SkillGenerator.ts +421 -0
  62. package/src/core/extensions/SkillInstaller.d.ts.map +1 -0
  63. package/src/core/extensions/SkillInstaller.ts +257 -0
  64. package/src/core/extensions/SkillRegistry.d.ts.map +1 -0
  65. package/src/core/extensions/SkillRegistry.ts +361 -0
  66. package/src/core/extensions/SkillValidator.ts +525 -0
  67. package/src/core/extensions/index.ts +15 -0
  68. package/src/core/index.d.ts.map +1 -0
  69. package/src/core/index.ts +42 -0
  70. package/src/core/mcp/McpManager.d.ts.map +1 -0
  71. package/src/core/mcp/McpManager.ts +632 -0
  72. package/src/core/mcp/index.d.ts.map +1 -0
  73. package/src/core/mcp/index.ts +2 -0
  74. package/src/core/model/ModelClient.d.ts.map +1 -0
  75. package/src/core/model/ModelClient.ts +217 -0
  76. package/src/core/model/ModelConnectionTester.ts +363 -0
  77. package/src/core/model/ModelValidator.ts +348 -0
  78. package/src/core/model/index.d.ts.map +1 -0
  79. package/src/core/model/index.ts +6 -0
  80. package/src/core/model/providers/AnthropicProvider.d.ts.map +1 -0
  81. package/src/core/model/providers/AnthropicProvider.ts +279 -0
  82. package/src/core/model/providers/CodingPlanProvider.d.ts.map +1 -0
  83. package/src/core/model/providers/CodingPlanProvider.ts +210 -0
  84. package/src/core/model/providers/OllamaCloudProvider.d.ts.map +1 -0
  85. package/src/core/model/providers/OllamaCloudProvider.ts +405 -0
  86. package/src/core/model/providers/OllamaManager.d.ts.map +1 -0
  87. package/src/core/model/providers/OllamaManager.ts +201 -0
  88. package/src/core/model/providers/OllamaProvider.d.ts.map +1 -0
  89. package/src/core/model/providers/OllamaProvider.ts +73 -0
  90. package/src/core/model/providers/OpenAICompatibleProvider.d.ts.map +1 -0
  91. package/src/core/model/providers/OpenAICompatibleProvider.ts +327 -0
  92. package/src/core/model/providers/OpenAIProvider.d.ts.map +1 -0
  93. package/src/core/model/providers/OpenAIProvider.ts +29 -0
  94. package/src/core/model/providers/index.d.ts.map +1 -0
  95. package/src/core/model/providers/index.ts +12 -0
  96. package/src/core/model/types.d.ts.map +1 -0
  97. package/src/core/model/types.ts +77 -0
  98. package/src/core/security/ApprovalManager.d.ts.map +1 -0
  99. package/src/core/security/ApprovalManager.ts +174 -0
  100. package/src/core/security/FileFilter.d.ts.map +1 -0
  101. package/src/core/security/FileFilter.ts +141 -0
  102. package/src/core/security/HookExecutor.d.ts.map +1 -0
  103. package/src/core/security/HookExecutor.ts +178 -0
  104. package/src/core/security/SandboxExecutor.ts +447 -0
  105. package/src/core/security/index.d.ts.map +1 -0
  106. package/src/core/security/index.ts +8 -0
  107. package/src/core/session/AgentLoop.d.ts.map +1 -0
  108. package/src/core/session/AgentLoop.ts +501 -0
  109. package/src/core/session/SessionManager.d.ts.map +1 -0
  110. package/src/core/session/SessionManager.test.ts +183 -0
  111. package/src/core/session/SessionManager.ts +460 -0
  112. package/src/core/session/index.d.ts.map +1 -0
  113. package/src/core/session/index.ts +3 -0
  114. package/src/core/telemetry/Telemetry.d.ts.map +1 -0
  115. package/src/core/telemetry/Telemetry.ts +90 -0
  116. package/src/core/telemetry/TelemetryService.ts +531 -0
  117. package/src/core/telemetry/index.d.ts.map +1 -0
  118. package/src/core/telemetry/index.ts +12 -0
  119. package/src/core/testing/AutoFixer.ts +385 -0
  120. package/src/core/testing/ErrorAnalyzer.ts +499 -0
  121. package/src/core/testing/TestRunner.ts +265 -0
  122. package/src/core/testing/agent-cli-tests.ts +538 -0
  123. package/src/core/testing/index.ts +11 -0
  124. package/src/core/tools/ToolRegistry.d.ts.map +1 -0
  125. package/src/core/tools/ToolRegistry.test.ts +206 -0
  126. package/src/core/tools/ToolRegistry.ts +260 -0
  127. package/src/core/tools/impl/EditFileTool.d.ts.map +1 -0
  128. package/src/core/tools/impl/EditFileTool.ts +97 -0
  129. package/src/core/tools/impl/ListDirectoryTool.d.ts.map +1 -0
  130. package/src/core/tools/impl/ListDirectoryTool.ts +142 -0
  131. package/src/core/tools/impl/MemoryTool.d.ts.map +1 -0
  132. package/src/core/tools/impl/MemoryTool.ts +102 -0
  133. package/src/core/tools/impl/ReadFileTool.d.ts.map +1 -0
  134. package/src/core/tools/impl/ReadFileTool.ts +58 -0
  135. package/src/core/tools/impl/SearchContentTool.d.ts.map +1 -0
  136. package/src/core/tools/impl/SearchContentTool.ts +94 -0
  137. package/src/core/tools/impl/SearchFileTool.d.ts.map +1 -0
  138. package/src/core/tools/impl/SearchFileTool.ts +61 -0
  139. package/src/core/tools/impl/ShellTool.d.ts.map +1 -0
  140. package/src/core/tools/impl/ShellTool.ts +118 -0
  141. package/src/core/tools/impl/TaskTool.d.ts.map +1 -0
  142. package/src/core/tools/impl/TaskTool.ts +207 -0
  143. package/src/core/tools/impl/TodoTool.d.ts.map +1 -0
  144. package/src/core/tools/impl/TodoTool.ts +122 -0
  145. package/src/core/tools/impl/WebFetchTool.d.ts.map +1 -0
  146. package/src/core/tools/impl/WebFetchTool.ts +103 -0
  147. package/src/core/tools/impl/WebSearchTool.d.ts.map +1 -0
  148. package/src/core/tools/impl/WebSearchTool.ts +89 -0
  149. package/src/core/tools/impl/WriteFileTool.d.ts.map +1 -0
  150. package/src/core/tools/impl/WriteFileTool.ts +49 -0
  151. package/src/core/tools/impl/index.d.ts.map +1 -0
  152. package/src/core/tools/impl/index.ts +16 -0
  153. package/src/core/tools/index.d.ts.map +1 -0
  154. package/src/core/tools/index.ts +7 -0
  155. package/src/core/tools/schemas/execution.d.ts.map +1 -0
  156. package/src/core/tools/schemas/execution.ts +42 -0
  157. package/src/core/tools/schemas/file.d.ts.map +1 -0
  158. package/src/core/tools/schemas/file.ts +119 -0
  159. package/src/core/tools/schemas/index.d.ts.map +1 -0
  160. package/src/core/tools/schemas/index.ts +11 -0
  161. package/src/core/tools/schemas/memory.d.ts.map +1 -0
  162. package/src/core/tools/schemas/memory.ts +52 -0
  163. package/src/core/tools/schemas/orchestration.d.ts.map +1 -0
  164. package/src/core/tools/schemas/orchestration.ts +44 -0
  165. package/src/core/tools/schemas/search.d.ts.map +1 -0
  166. package/src/core/tools/schemas/search.ts +112 -0
  167. package/src/core/tools/schemas/todo.d.ts.map +1 -0
  168. package/src/core/tools/schemas/todo.ts +32 -0
  169. package/src/core/tools/schemas/web.d.ts.map +1 -0
  170. package/src/core/tools/schemas/web.ts +86 -0
  171. package/src/core/types/config.d.ts.map +1 -0
  172. package/src/core/types/config.ts +200 -0
  173. package/src/core/types/errors.d.ts.map +1 -0
  174. package/src/core/types/errors.ts +204 -0
  175. package/src/core/types/index.d.ts.map +1 -0
  176. package/src/core/types/index.ts +8 -0
  177. package/src/core/types/session.d.ts.map +1 -0
  178. package/src/core/types/session.ts +216 -0
  179. package/src/core/types/tools.d.ts.map +1 -0
  180. package/src/core/types/tools.ts +157 -0
  181. package/src/core/utils/CheckpointManager.d.ts.map +1 -0
  182. package/src/core/utils/CheckpointManager.ts +327 -0
  183. package/src/core/utils/Logger.d.ts.map +1 -0
  184. package/src/core/utils/Logger.ts +98 -0
  185. package/src/core/utils/RetryManager.ts +471 -0
  186. package/src/core/utils/TokenCounter.d.ts.map +1 -0
  187. package/src/core/utils/TokenCounter.ts +414 -0
  188. package/src/core/utils/VectorMemoryStore.ts +440 -0
  189. package/src/core/utils/helpers.d.ts.map +1 -0
  190. package/src/core/utils/helpers.ts +89 -0
  191. package/src/core/utils/index.d.ts.map +1 -0
  192. package/src/core/utils/index.ts +19 -0
@@ -0,0 +1,183 @@
1
+ // ============================================================================
2
+ // ConfigManager Tests
3
+ // ============================================================================
4
+
5
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
6
+ import { ConfigManager } from './ConfigManager.js';
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import * as os from 'node:os';
10
+
11
+ describe('ConfigManager', () => {
12
+ let configManager: ConfigManager;
13
+ const testConfigDir = path.join(os.tmpdir(), 'nova-test-config-' + Date.now());
14
+
15
+ beforeEach(() => {
16
+ // Create test config directory
17
+ if (!fs.existsSync(testConfigDir)) {
18
+ fs.mkdirSync(testConfigDir, { recursive: true });
19
+ }
20
+ configManager = new ConfigManager(testConfigDir);
21
+ });
22
+
23
+ afterEach(() => {
24
+ // Clean up test directory
25
+ if (fs.existsSync(testConfigDir)) {
26
+ fs.rmSync(testConfigDir, { recursive: true, force: true });
27
+ }
28
+ });
29
+
30
+ describe('load()', () => {
31
+ it('should create default config if not exists', async () => {
32
+ const config = await configManager.load();
33
+
34
+ expect(config).toBeDefined();
35
+ expect(config.core).toBeDefined();
36
+ expect(config.models).toBeDefined();
37
+ expect(config.models.providers).toBeDefined();
38
+ });
39
+
40
+ it('should load existing config', async () => {
41
+ // First load creates default
42
+ await configManager.load();
43
+
44
+ // Second load should read from disk
45
+ const configManager2 = new ConfigManager(testConfigDir);
46
+ const config = await configManager2.load();
47
+
48
+ expect(config).toBeDefined();
49
+ });
50
+
51
+ it('should have expected default providers', async () => {
52
+ const config = await configManager.load();
53
+
54
+ const providerNames = Object.keys(config.models.providers);
55
+ expect(providerNames).toContain('anthropic');
56
+ expect(providerNames).toContain('openai');
57
+ expect(providerNames).toContain('ollama');
58
+ });
59
+ });
60
+
61
+ describe('getConfig()', () => {
62
+ it('should throw if not loaded', () => {
63
+ expect(() => configManager.getConfig()).toThrow('Configuration not loaded');
64
+ });
65
+
66
+ it('should return config after load', async () => {
67
+ await configManager.load();
68
+ const config = configManager.getConfig();
69
+
70
+ expect(config).toBeDefined();
71
+ });
72
+ });
73
+
74
+ describe('getModelConfig()', () => {
75
+ beforeEach(async () => {
76
+ await configManager.load();
77
+ });
78
+
79
+ it('should return null for non-existent model', () => {
80
+ const result = configManager.getModelConfig('non-existent-model');
81
+ expect(result).toBeNull();
82
+ });
83
+
84
+ it('should find model by name', () => {
85
+ // Add a test model
86
+ const config = configManager.getConfig();
87
+ config.models.providers['test-provider'] = {
88
+ type: 'openai-compatible',
89
+ baseUrl: 'https://api.test.com',
90
+ models: {
91
+ 'test-model': {
92
+ name: 'test-model',
93
+ contextWindow: 4096,
94
+ maxOutput: 2048,
95
+ pricing: { input: 0.001, output: 0.002 },
96
+ },
97
+ },
98
+ };
99
+
100
+ const result = configManager.getModelConfig('test-model');
101
+ expect(result).toBeDefined();
102
+ expect(result?.model.name).toBe('test-model');
103
+ });
104
+
105
+ it('should parse provider/model format', () => {
106
+ const config = configManager.getConfig();
107
+ config.models.providers['test-provider'] = {
108
+ type: 'openai-compatible',
109
+ baseUrl: 'https://api.test.com',
110
+ models: {
111
+ 'test-model': {
112
+ name: 'test-model',
113
+ contextWindow: 4096,
114
+ maxOutput: 2048,
115
+ pricing: { input: 0.001, output: 0.002 },
116
+ },
117
+ },
118
+ };
119
+
120
+ const result = configManager.getModelConfig('test-provider/test-model');
121
+ expect(result).toBeDefined();
122
+ expect(result?.provider.name).toBe('test-provider');
123
+ expect(result?.model.name).toBe('test-model');
124
+ });
125
+
126
+ it('should return null for non-existent provider in provider/model format', () => {
127
+ const result = configManager.getModelConfig('non-existent/model');
128
+ expect(result).toBeNull();
129
+ });
130
+
131
+ it('should return null for non-existent model in existing provider', async () => {
132
+ await configManager.load();
133
+ const config = configManager.getConfig();
134
+ const firstProvider = Object.keys(config.models.providers)[0];
135
+
136
+ const result = configManager.getModelConfig(`${firstProvider}/non-existent-model`);
137
+ expect(result).toBeNull();
138
+ });
139
+ });
140
+
141
+ describe('save() and persist()', () => {
142
+ it('should persist changes to disk', async () => {
143
+ await configManager.load();
144
+
145
+ const config = configManager.getConfig();
146
+ config.core.defaultModel = 'test-default-model';
147
+
148
+ await configManager.save(config);
149
+
150
+ // Load again in new instance
151
+ const configManager2 = new ConfigManager(testConfigDir);
152
+ await configManager2.load();
153
+ const loadedConfig = configManager2.getConfig();
154
+
155
+ expect(loadedConfig.core.defaultModel).toBe('test-default-model');
156
+ });
157
+ });
158
+
159
+ describe('aliases', () => {
160
+ beforeEach(async () => {
161
+ await configManager.load();
162
+ });
163
+
164
+ it('should resolve alias', () => {
165
+ const config = configManager.getConfig();
166
+ config.models.aliases = { 'alias-model': 'real-model' };
167
+ config.models.providers['test'] = {
168
+ type: 'openai-compatible',
169
+ models: {
170
+ 'real-model': {
171
+ name: 'real-model',
172
+ contextWindow: 4096,
173
+ maxOutput: 2048,
174
+ pricing: { input: 0, output: 0 },
175
+ },
176
+ },
177
+ };
178
+
179
+ const result = configManager.getModelConfig('alias-model');
180
+ expect(result?.model.name).toBe('real-model');
181
+ });
182
+ });
183
+ });