antri_cli 1.26.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 (171) hide show
  1. package/README.md +92 -0
  2. package/bin/antri.js +2 -0
  3. package/dist/cli/banner.d.ts +22 -0
  4. package/dist/cli/banner.d.ts.map +1 -0
  5. package/dist/cli/banner.js +133 -0
  6. package/dist/cli/banner.js.map +1 -0
  7. package/dist/cli/dialogs/filePicker.d.ts +23 -0
  8. package/dist/cli/dialogs/filePicker.d.ts.map +1 -0
  9. package/dist/cli/dialogs/filePicker.js +106 -0
  10. package/dist/cli/dialogs/filePicker.js.map +1 -0
  11. package/dist/cli/dialogs/modelPicker.d.ts +10 -0
  12. package/dist/cli/dialogs/modelPicker.d.ts.map +1 -0
  13. package/dist/cli/dialogs/modelPicker.js +205 -0
  14. package/dist/cli/dialogs/modelPicker.js.map +1 -0
  15. package/dist/cli/dialogs/profilePicker.d.ts +11 -0
  16. package/dist/cli/dialogs/profilePicker.d.ts.map +1 -0
  17. package/dist/cli/dialogs/profilePicker.js +185 -0
  18. package/dist/cli/dialogs/profilePicker.js.map +1 -0
  19. package/dist/cli/dialogs/providerPicker.d.ts +19 -0
  20. package/dist/cli/dialogs/providerPicker.d.ts.map +1 -0
  21. package/dist/cli/dialogs/providerPicker.js +205 -0
  22. package/dist/cli/dialogs/providerPicker.js.map +1 -0
  23. package/dist/cli/prompt.d.ts +3 -0
  24. package/dist/cli/prompt.d.ts.map +1 -0
  25. package/dist/cli/prompt.js +50 -0
  26. package/dist/cli/prompt.js.map +1 -0
  27. package/dist/cli/promptToolkit.d.ts +14 -0
  28. package/dist/cli/promptToolkit.d.ts.map +1 -0
  29. package/dist/cli/promptToolkit.js +389 -0
  30. package/dist/cli/promptToolkit.js.map +1 -0
  31. package/dist/cli/renderer.d.ts +21 -0
  32. package/dist/cli/renderer.d.ts.map +1 -0
  33. package/dist/cli/renderer.js +97 -0
  34. package/dist/cli/renderer.js.map +1 -0
  35. package/dist/cli/shortcuts.d.ts +13 -0
  36. package/dist/cli/shortcuts.d.ts.map +1 -0
  37. package/dist/cli/shortcuts.js +414 -0
  38. package/dist/cli/shortcuts.js.map +1 -0
  39. package/dist/core/agent.d.ts +15 -0
  40. package/dist/core/agent.d.ts.map +1 -0
  41. package/dist/core/agent.js +232 -0
  42. package/dist/core/agent.js.map +1 -0
  43. package/dist/core/citations.d.ts +19 -0
  44. package/dist/core/citations.d.ts.map +1 -0
  45. package/dist/core/citations.js +40 -0
  46. package/dist/core/citations.js.map +1 -0
  47. package/dist/core/config.d.ts +16 -0
  48. package/dist/core/config.d.ts.map +1 -0
  49. package/dist/core/config.js +172 -0
  50. package/dist/core/config.js.map +1 -0
  51. package/dist/core/crawler.d.ts +18 -0
  52. package/dist/core/crawler.d.ts.map +1 -0
  53. package/dist/core/crawler.js +83 -0
  54. package/dist/core/crawler.js.map +1 -0
  55. package/dist/core/debugger.d.ts +20 -0
  56. package/dist/core/debugger.d.ts.map +1 -0
  57. package/dist/core/debugger.js +105 -0
  58. package/dist/core/debugger.js.map +1 -0
  59. package/dist/core/dialectic.d.ts +23 -0
  60. package/dist/core/dialectic.d.ts.map +1 -0
  61. package/dist/core/dialectic.js +300 -0
  62. package/dist/core/dialectic.js.map +1 -0
  63. package/dist/core/goalLoop.d.ts +14 -0
  64. package/dist/core/goalLoop.d.ts.map +1 -0
  65. package/dist/core/goalLoop.js +104 -0
  66. package/dist/core/goalLoop.js.map +1 -0
  67. package/dist/core/history.d.ts +13 -0
  68. package/dist/core/history.d.ts.map +1 -0
  69. package/dist/core/history.js +53 -0
  70. package/dist/core/history.js.map +1 -0
  71. package/dist/core/metaOptimizer.d.ts +27 -0
  72. package/dist/core/metaOptimizer.d.ts.map +1 -0
  73. package/dist/core/metaOptimizer.js +98 -0
  74. package/dist/core/metaOptimizer.js.map +1 -0
  75. package/dist/core/sandbox.d.ts +29 -0
  76. package/dist/core/sandbox.d.ts.map +1 -0
  77. package/dist/core/sandbox.js +141 -0
  78. package/dist/core/sandbox.js.map +1 -0
  79. package/dist/core/scraper.d.ts +22 -0
  80. package/dist/core/scraper.d.ts.map +1 -0
  81. package/dist/core/scraper.js +180 -0
  82. package/dist/core/scraper.js.map +1 -0
  83. package/dist/core/search.d.ts +27 -0
  84. package/dist/core/search.d.ts.map +1 -0
  85. package/dist/core/search.js +222 -0
  86. package/dist/core/search.js.map +1 -0
  87. package/dist/core/skillSynthesizer.d.ts +43 -0
  88. package/dist/core/skillSynthesizer.d.ts.map +1 -0
  89. package/dist/core/skillSynthesizer.js +147 -0
  90. package/dist/core/skillSynthesizer.js.map +1 -0
  91. package/dist/core/tools.d.ts +12 -0
  92. package/dist/core/tools.d.ts.map +1 -0
  93. package/dist/core/tools.js +467 -0
  94. package/dist/core/tools.js.map +1 -0
  95. package/dist/core/updater.d.ts +9 -0
  96. package/dist/core/updater.d.ts.map +1 -0
  97. package/dist/core/updater.js +63 -0
  98. package/dist/core/updater.js.map +1 -0
  99. package/dist/index.d.ts +3 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +92 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/consolidation.d.ts +17 -0
  104. package/dist/memory/consolidation.d.ts.map +1 -0
  105. package/dist/memory/consolidation.js +42 -0
  106. package/dist/memory/consolidation.js.map +1 -0
  107. package/dist/memory/episodic.d.ts +15 -0
  108. package/dist/memory/episodic.d.ts.map +1 -0
  109. package/dist/memory/episodic.js +97 -0
  110. package/dist/memory/episodic.js.map +1 -0
  111. package/dist/memory/manager.d.ts +24 -0
  112. package/dist/memory/manager.d.ts.map +1 -0
  113. package/dist/memory/manager.js +97 -0
  114. package/dist/memory/manager.js.map +1 -0
  115. package/dist/memory/profile.d.ts +21 -0
  116. package/dist/memory/profile.d.ts.map +1 -0
  117. package/dist/memory/profile.js +111 -0
  118. package/dist/memory/profile.js.map +1 -0
  119. package/dist/memory/semantic.d.ts +24 -0
  120. package/dist/memory/semantic.d.ts.map +1 -0
  121. package/dist/memory/semantic.js +102 -0
  122. package/dist/memory/semantic.js.map +1 -0
  123. package/dist/memory/types.d.ts +45 -0
  124. package/dist/memory/types.d.ts.map +1 -0
  125. package/dist/memory/types.js +2 -0
  126. package/dist/memory/types.js.map +1 -0
  127. package/dist/memory/vectorStore.d.ts +18 -0
  128. package/dist/memory/vectorStore.d.ts.map +1 -0
  129. package/dist/memory/vectorStore.js +103 -0
  130. package/dist/memory/vectorStore.js.map +1 -0
  131. package/dist/profiles/profileManager.d.ts +25 -0
  132. package/dist/profiles/profileManager.d.ts.map +1 -0
  133. package/dist/profiles/profileManager.js +205 -0
  134. package/dist/profiles/profileManager.js.map +1 -0
  135. package/dist/providers/anthropic.d.ts +14 -0
  136. package/dist/providers/anthropic.d.ts.map +1 -0
  137. package/dist/providers/anthropic.js +80 -0
  138. package/dist/providers/anthropic.js.map +1 -0
  139. package/dist/providers/base.d.ts +7 -0
  140. package/dist/providers/base.d.ts.map +1 -0
  141. package/dist/providers/base.js +2 -0
  142. package/dist/providers/base.js.map +1 -0
  143. package/dist/providers/gemini.d.ts +14 -0
  144. package/dist/providers/gemini.d.ts.map +1 -0
  145. package/dist/providers/gemini.js +77 -0
  146. package/dist/providers/gemini.js.map +1 -0
  147. package/dist/providers/index.d.ts +4 -0
  148. package/dist/providers/index.d.ts.map +1 -0
  149. package/dist/providers/index.js +65 -0
  150. package/dist/providers/index.js.map +1 -0
  151. package/dist/providers/mock.d.ts +8 -0
  152. package/dist/providers/mock.d.ts.map +1 -0
  153. package/dist/providers/mock.js +62 -0
  154. package/dist/providers/mock.js.map +1 -0
  155. package/dist/providers/models.d.ts +8 -0
  156. package/dist/providers/models.d.ts.map +1 -0
  157. package/dist/providers/models.js +403 -0
  158. package/dist/providers/models.js.map +1 -0
  159. package/dist/providers/openai.d.ts +18 -0
  160. package/dist/providers/openai.d.ts.map +1 -0
  161. package/dist/providers/openai.js +162 -0
  162. package/dist/providers/openai.js.map +1 -0
  163. package/dist/types.d.ts +116 -0
  164. package/dist/types.d.ts.map +1 -0
  165. package/dist/types.js +2 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/utils/logger.d.ts +23 -0
  168. package/dist/utils/logger.d.ts.map +1 -0
  169. package/dist/utils/logger.js +26 -0
  170. package/dist/utils/logger.js.map +1 -0
  171. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profilePicker.d.ts","sourceRoot":"","sources":["../../../src/cli/dialogs/profilePicker.ts"],"names":[],"mappings":"AAMA,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAa;;IAMrB,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YAsL5B,uBAAuB;CAUtC;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGvE"}
@@ -0,0 +1,185 @@
1
+ import readline from 'readline';
2
+ import chalk from 'chalk';
3
+ import { profileManager } from '../../profiles/profileManager.js';
4
+ import { log } from '../../utils/logger.js';
5
+ export class ProfilePicker {
6
+ profiles = [];
7
+ searchQuery = '';
8
+ selectedIndex = 0;
9
+ renderedLines = 0;
10
+ constructor() {
11
+ this.profiles = profileManager.listProfiles();
12
+ }
13
+ async run() {
14
+ this.profiles = profileManager.listProfiles();
15
+ this.searchQuery = '';
16
+ this.selectedIndex = 0;
17
+ return new Promise((resolve) => {
18
+ const stdin = process.stdin;
19
+ const stdout = process.stdout;
20
+ readline.emitKeypressEvents(stdin);
21
+ const isRawSupported = stdin.isTTY && typeof stdin.setRawMode === 'function';
22
+ if (isRawSupported) {
23
+ stdin.setRawMode(true);
24
+ }
25
+ stdin.resume();
26
+ stdout.write('\x1b[?25l'); // Hide cursor
27
+ const erase = () => {
28
+ if (this.renderedLines > 0) {
29
+ stdout.write('\x1b[2K\r');
30
+ for (let i = 1; i < this.renderedLines; i++) {
31
+ stdout.write('\x1b[1A\x1b[2K\r');
32
+ }
33
+ this.renderedLines = 0;
34
+ }
35
+ };
36
+ const getFilteredOptions = () => {
37
+ const options = [
38
+ { type: 'create', label: '➕ [Create New Profile]' },
39
+ ];
40
+ const q = this.searchQuery.toLowerCase();
41
+ const filteredProfiles = this.profiles.filter((p) => p.name.toLowerCase().includes(q));
42
+ for (const p of filteredProfiles) {
43
+ options.push({
44
+ type: 'profile',
45
+ data: p,
46
+ label: `${p.name} ${p.isActive ? chalk.hex('#a5b4fc')('(active)') : ''} · ${chalk.gray(`${p.notesCount} notes`)}`,
47
+ });
48
+ }
49
+ return options;
50
+ };
51
+ const render = () => {
52
+ erase();
53
+ const lines = [];
54
+ const options = getFilteredOptions();
55
+ const activeName = profileManager.getActiveProfileName();
56
+ if (this.selectedIndex >= options.length)
57
+ this.selectedIndex = Math.max(0, options.length - 1);
58
+ if (this.selectedIndex < 0)
59
+ this.selectedIndex = 0;
60
+ lines.push(chalk.bold.hex('#c084fc')(`👤 Select Profile (Active: ${activeName})`));
61
+ lines.push(chalk.hex('#475569')('─'.repeat(68)));
62
+ // Search bar
63
+ const searchDisplay = this.searchQuery
64
+ ? chalk.white(this.searchQuery)
65
+ : chalk.hex('#64748b')('Search profiles or select create...');
66
+ lines.push(`🔍 ${searchDisplay}`);
67
+ lines.push(chalk.hex('#475569')('─'.repeat(68)));
68
+ const maxVisible = 10;
69
+ const startIdx = Math.max(0, Math.min(this.selectedIndex - Math.floor(maxVisible / 2), options.length - maxVisible));
70
+ const visibleOptions = options.slice(startIdx, startIdx + maxVisible);
71
+ for (let i = 0; i < visibleOptions.length; i++) {
72
+ const opt = visibleOptions[i];
73
+ const actualIdx = startIdx + i;
74
+ const isSelected = actualIdx === this.selectedIndex;
75
+ if (isSelected) {
76
+ lines.push(chalk.bgRgb(46, 41, 84).bold.white(` ❯ ${opt.label} `));
77
+ }
78
+ else {
79
+ lines.push(` ${opt.label}`);
80
+ }
81
+ }
82
+ lines.push(chalk.hex('#475569')('─'.repeat(68)));
83
+ lines.push(chalk.italic.hex('#64748b')('↑↓ to navigate · Enter to select/create · Esc to cancel'));
84
+ stdout.write(lines.join('\n'));
85
+ this.renderedLines = lines.length;
86
+ };
87
+ const cleanup = () => {
88
+ erase();
89
+ stdin.removeListener('keypress', onKeypress);
90
+ if (isRawSupported) {
91
+ stdin.setRawMode(false);
92
+ }
93
+ stdout.write('\x1b[?25h'); // Restore cursor
94
+ };
95
+ const onKeypress = async (str, key) => {
96
+ if (!key) {
97
+ if (str) {
98
+ this.searchQuery += str;
99
+ this.selectedIndex = 0;
100
+ render();
101
+ }
102
+ return;
103
+ }
104
+ if (key.ctrl && key.name === 'c') {
105
+ cleanup();
106
+ process.exit(0);
107
+ }
108
+ if (key.name === 'escape') {
109
+ cleanup();
110
+ resolve(null);
111
+ return;
112
+ }
113
+ const options = getFilteredOptions();
114
+ if (key.name === 'up') {
115
+ if (options.length > 0) {
116
+ this.selectedIndex = (this.selectedIndex - 1 + options.length) % options.length;
117
+ render();
118
+ }
119
+ return;
120
+ }
121
+ if (key.name === 'down') {
122
+ if (options.length > 0) {
123
+ this.selectedIndex = (this.selectedIndex + 1) % options.length;
124
+ render();
125
+ }
126
+ return;
127
+ }
128
+ if (key.name === 'return' || key.name === 'enter') {
129
+ const selected = options[this.selectedIndex];
130
+ cleanup();
131
+ if (selected.type === 'create') {
132
+ const newName = await this.promptForNewProfileName();
133
+ if (newName) {
134
+ profileManager.createProfile(newName);
135
+ log.success(`Created and switched to new profile: ${chalk.cyan(newName)}!`);
136
+ resolve(newName);
137
+ }
138
+ else {
139
+ resolve(null);
140
+ }
141
+ }
142
+ else if (selected.data) {
143
+ profileManager.setActiveProfile(selected.data.name);
144
+ log.success(`Switched active profile to: ${chalk.cyan(selected.data.name)}!`);
145
+ resolve(selected.data.name);
146
+ }
147
+ else {
148
+ resolve(null);
149
+ }
150
+ return;
151
+ }
152
+ if (key.name === 'backspace') {
153
+ if (this.searchQuery.length > 0) {
154
+ this.searchQuery = this.searchQuery.slice(0, -1);
155
+ this.selectedIndex = 0;
156
+ render();
157
+ }
158
+ return;
159
+ }
160
+ if (str && !key.ctrl && !key.meta) {
161
+ this.searchQuery += str;
162
+ this.selectedIndex = 0;
163
+ render();
164
+ }
165
+ };
166
+ stdin.on('keypress', onKeypress);
167
+ render();
168
+ });
169
+ }
170
+ async promptForNewProfileName() {
171
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
172
+ return new Promise((res) => {
173
+ console.log();
174
+ rl.question(chalk.bold.hex('#c084fc')('Enter name for new profile (e.g. profile_2, architect, backend_dev): '), (ans) => {
175
+ rl.close();
176
+ res(ans.trim() || null);
177
+ });
178
+ });
179
+ }
180
+ }
181
+ export async function runProfilePickerWorkflow() {
182
+ const picker = new ProfilePicker();
183
+ return await picker.run();
184
+ }
185
+ //# sourceMappingURL=profilePicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profilePicker.js","sourceRoot":"","sources":["../../../src/cli/dialogs/profilePicker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { AntriConfig, ProviderType } from '../../types.js';
2
+ export interface ProviderOption {
3
+ id: ProviderType;
4
+ name: string;
5
+ recommended?: boolean;
6
+ requiresKey: boolean;
7
+ defaultBaseUrl?: string;
8
+ envVar: string;
9
+ }
10
+ export declare const PROVIDERS_LIST: ProviderOption[];
11
+ /**
12
+ * Interactive Provider Selection Dialog matching refrence_provider.png
13
+ */
14
+ export declare function showProviderPickerDialog(config: AntriConfig): Promise<ProviderType | null>;
15
+ /**
16
+ * Handles the full connect workflow including prompting for missing keys/URLs
17
+ */
18
+ export declare function runConnectWorkflow(): Promise<void>;
19
+ //# sourceMappingURL=providerPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPicker.d.ts","sourceRoot":"","sources":["../../../src/cli/dialogs/providerPicker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI3D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,cAAc,EAAE,cAAc,EA+C1C,CAAC;AAEF;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA0GhG;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DxD"}
@@ -0,0 +1,205 @@
1
+ import readline from 'readline';
2
+ import chalk from 'chalk';
3
+ import { configManager } from '../../core/config.js';
4
+ import { log, colors } from '../../utils/logger.js';
5
+ export const PROVIDERS_LIST = [
6
+ {
7
+ id: 'ollama',
8
+ name: 'Ollama (Local)',
9
+ requiresKey: false,
10
+ defaultBaseUrl: 'http://localhost:11434',
11
+ envVar: 'OLLAMA_BASE_URL',
12
+ },
13
+ {
14
+ id: 'anthropic',
15
+ name: 'Anthropic',
16
+ requiresKey: true,
17
+ envVar: 'ANTHROPIC_API_KEY',
18
+ },
19
+ {
20
+ id: 'nvidia-nim',
21
+ name: 'NVIDIA NIM',
22
+ requiresKey: true,
23
+ defaultBaseUrl: 'https://integrate.api.nvidia.com/v1',
24
+ envVar: 'NVIDIA_API_KEY',
25
+ },
26
+ {
27
+ id: 'openai',
28
+ name: 'OpenAI',
29
+ requiresKey: true,
30
+ envVar: 'OPENAI_API_KEY',
31
+ },
32
+ {
33
+ id: 'gemini',
34
+ name: 'Google Gemini',
35
+ requiresKey: true,
36
+ envVar: 'GEMINI_API_KEY',
37
+ },
38
+ {
39
+ id: 'deepseek',
40
+ name: 'DeepSeek',
41
+ recommended: true,
42
+ requiresKey: true,
43
+ envVar: 'DEEPSEEK_API_KEY',
44
+ },
45
+ {
46
+ id: 'custom',
47
+ name: 'Custom (OpenAI-compatible)',
48
+ requiresKey: false,
49
+ defaultBaseUrl: 'http://localhost:8000/v1',
50
+ envVar: 'CUSTOM_BASE_URL',
51
+ },
52
+ ];
53
+ /**
54
+ * Interactive Provider Selection Dialog matching refrence_provider.png
55
+ */
56
+ export async function showProviderPickerDialog(config) {
57
+ return new Promise((resolve) => {
58
+ let selectedIndex = 0;
59
+ // Default selected index to current provider
60
+ const currentIdx = PROVIDERS_LIST.findIndex((p) => p.id === config.provider);
61
+ if (currentIdx !== -1)
62
+ selectedIndex = currentIdx;
63
+ let renderedLines = 0;
64
+ const stdin = process.stdin;
65
+ const stdout = process.stdout;
66
+ readline.emitKeypressEvents(stdin);
67
+ const isRawSupported = stdin.isTTY && typeof stdin.setRawMode === 'function';
68
+ if (isRawSupported) {
69
+ stdin.setRawMode(true);
70
+ }
71
+ stdin.resume();
72
+ stdout.write('\x1b[?25l'); // Hide cursor
73
+ const eraseDialog = () => {
74
+ if (renderedLines > 0) {
75
+ stdout.write('\x1b[2K\r');
76
+ for (let i = 1; i < renderedLines; i++) {
77
+ stdout.write('\x1b[1A\x1b[2K\r');
78
+ }
79
+ renderedLines = 0;
80
+ }
81
+ };
82
+ const render = () => {
83
+ eraseDialog();
84
+ const lines = [];
85
+ // Header matching refrence_provider.png
86
+ const title = chalk.bold.hex('#c084fc')('Select AI Provider');
87
+ const currentProviderName = PROVIDERS_LIST.find((p) => p.id === config.provider)?.name || config.provider;
88
+ const currentLabel = chalk.hex('#64748b')(' Current: ') + chalk.hex('#4ade80')(currentProviderName);
89
+ lines.push(`${title}${currentLabel}`);
90
+ lines.push(chalk.hex('#64748b')('Available Providers:'));
91
+ lines.push('');
92
+ // List of providers
93
+ for (let i = 0; i < PROVIDERS_LIST.length; i++) {
94
+ const item = PROVIDERS_LIST[i];
95
+ const isSelected = i === selectedIndex;
96
+ const recTag = item.recommended ? chalk.hex('#64748b')(' (recommended)') : '';
97
+ if (isSelected) {
98
+ lines.push(chalk.bold.hex('#a5b4fc')(`> ${item.name}${recTag}`));
99
+ }
100
+ else {
101
+ lines.push(chalk.hex('#94a3b8')(` ${item.name}${recTag}`));
102
+ }
103
+ }
104
+ lines.push('');
105
+ lines.push(chalk.italic.hex('#64748b')('Press ESC to cancel'));
106
+ stdout.write(lines.join('\n'));
107
+ renderedLines = lines.length;
108
+ };
109
+ const cleanup = () => {
110
+ eraseDialog();
111
+ stdin.removeListener('keypress', onKeypress);
112
+ if (isRawSupported) {
113
+ stdin.setRawMode(false);
114
+ }
115
+ stdout.write('\x1b[2K\r');
116
+ stdout.write('\x1b[?25h');
117
+ };
118
+ const onKeypress = async (str, key) => {
119
+ if (!key)
120
+ return;
121
+ if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
122
+ cleanup();
123
+ resolve(null);
124
+ return;
125
+ }
126
+ if (key.name === 'up') {
127
+ selectedIndex = (selectedIndex - 1 + PROVIDERS_LIST.length) % PROVIDERS_LIST.length;
128
+ render();
129
+ return;
130
+ }
131
+ if (key.name === 'down') {
132
+ selectedIndex = (selectedIndex + 1) % PROVIDERS_LIST.length;
133
+ render();
134
+ return;
135
+ }
136
+ if (key.name === 'return' || key.name === 'enter') {
137
+ const chosen = PROVIDERS_LIST[selectedIndex];
138
+ cleanup();
139
+ resolve(chosen.id);
140
+ return;
141
+ }
142
+ };
143
+ stdin.on('keypress', onKeypress);
144
+ render();
145
+ });
146
+ }
147
+ /**
148
+ * Handles the full connect workflow including prompting for missing keys/URLs
149
+ */
150
+ export async function runConnectWorkflow() {
151
+ const currentConfig = configManager.get();
152
+ const chosenProvider = await showProviderPickerDialog(currentConfig);
153
+ if (!chosenProvider) {
154
+ return;
155
+ }
156
+ const option = PROVIDERS_LIST.find((p) => p.id === chosenProvider);
157
+ if (!option)
158
+ return;
159
+ // If provider needs API key and none is set, prompt user
160
+ const currentKey = currentConfig.apiKeys[chosenProvider.replace('-', '_')];
161
+ if (chosenProvider === 'ollama') {
162
+ configManager.setProvider('ollama');
163
+ log.success(`Connected to ${colors.primary('Ollama (Local)')}!`);
164
+ console.log(chalk.hex('#64748b')('Use /models to view installed local models.'));
165
+ return;
166
+ }
167
+ if (chosenProvider === 'custom') {
168
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
169
+ const promptAsync = (q) => new Promise((res) => rl.question(q, res));
170
+ console.log(chalk.bold.hex('#a5b4fc')('\n⚙ Custom OpenAI-compatible Provider Setup:'));
171
+ const url = (await promptAsync(chalk.cyan('Base URL (e.g. http://localhost:8000/v1): '))) || 'http://localhost:8000/v1';
172
+ const key = (await promptAsync(chalk.cyan('API Key (optional): '))) || 'custom-key';
173
+ const model = (await promptAsync(chalk.cyan('Model Name: '))) || 'custom-model';
174
+ rl.close();
175
+ configManager.setBaseUrl('custom', url.trim());
176
+ configManager.setApiKey('custom', key.trim());
177
+ configManager.setProvider('custom', model.trim());
178
+ log.success(`Connected to Custom Provider at ${colors.primary(url)}!`);
179
+ return;
180
+ }
181
+ if (option.requiresKey && !currentKey) {
182
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
183
+ const promptAsync = (q) => new Promise((res) => rl.question(q, res));
184
+ console.log(chalk.bold.hex('#a5b4fc')(`\n🔑 Enter API Key for ${option.name}:`));
185
+ console.log(chalk.hex('#64748b')(`(Or set ${option.envVar} in your .env file)`));
186
+ const enteredKey = await promptAsync(chalk.cyan('> '));
187
+ rl.close();
188
+ if (enteredKey.trim()) {
189
+ configManager.setApiKey(chosenProvider, enteredKey.trim());
190
+ configManager.setProvider(chosenProvider);
191
+ log.success(`API key saved and connected to ${colors.primary(option.name)}!`);
192
+ console.log(chalk.hex('#64748b')('Use /models to choose your model.'));
193
+ }
194
+ else {
195
+ configManager.setProvider(chosenProvider);
196
+ log.info(`Provider set to ${colors.primary(option.name)} (No API key saved yet).`);
197
+ }
198
+ }
199
+ else {
200
+ configManager.setProvider(chosenProvider);
201
+ log.success(`Switched provider to ${colors.primary(option.name)}! (Model: ${configManager.get().model})`);
202
+ console.log(chalk.hex('#64748b')('Use /models to choose or switch models.'));
203
+ }
204
+ }
205
+ //# sourceMappingURL=providerPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerPicker.js","sourceRoot":"","sources":["../../../src/cli/dialogs/providerPicker.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAWpD,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,wBAAwB;QACxC,MAAM,EAAE,iBAAiB;KAC1B;IACD;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,mBAAmB;KAC5B;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,IAAI;QACjB,cAAc,EAAE,qCAAqC;QACrD,MAAM,EAAE,gBAAgB;KACzB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;KACzB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;KACzB;IACD;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,kBAAkB;KAC3B;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,0BAA0B;QAC1C,MAAM,EAAE,iBAAiB;KAC1B;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAmB;IAChE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,6CAA6C;QAC7C,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7E,IAAI,UAAU,KAAK,CAAC,CAAC;YAAE,aAAa,GAAG,UAAU,CAAC;QAElD,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,CAAC;QAC7E,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,CAAC;QAEf,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;QAEzC,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;oBACvC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACnC,CAAC;gBACD,aAAa,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,WAAW,EAAE,CAAC;YAEd,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,wCAAwC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC9D,MAAM,mBAAmB,GACvB,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC;YAChF,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACpG,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,YAAY,EAAE,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEf,oBAAoB;YACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,UAAU,GAAG,CAAC,KAAK,aAAa,CAAC;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAE9E,IAAI,UAAU,EAAE,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAE/D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/B,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,WAAW,EAAE,CAAC;YACd,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,cAAc,EAAE,CAAC;gBACnB,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,EAAE,GAAW,EAAE,GAAiB,EAAE,EAAE;YAC1D,IAAI,CAAC,GAAG;gBAAE,OAAO;YAEjB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC5D,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACtB,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;gBACpF,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;gBAC5D,MAAM,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC7C,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,cAAc,GAAG,MAAM,wBAAwB,CAAC,aAAa,CAAC,CAAC;IAErE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,yDAAyD;IACzD,MAAM,UAAU,GAAI,aAAa,CAAC,OAAe,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAEpF,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAErF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvF,MAAM,GAAG,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC,IAAI,0BAA0B,CAAC;QACxH,MAAM,GAAG,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;QACpF,MAAM,KAAK,GAAG,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;QAChF,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/C,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,OAAO,CAAC,mCAAmC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACtF,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,OAAO,CAAS,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAErF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,0BAA0B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC;QACjF,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,KAAK,EAAE,CAAC;QAEX,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,aAAa,CAAC,SAAS,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC1C,GAAG,CAAC,OAAO,CAAC,kCAAkC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1C,GAAG,CAAC,OAAO,CAAC,wBAAwB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,aAAa,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;QAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { AntriAgent } from '../core/agent.js';
2
+ export declare function startInteractiveSession(initialAgent?: AntriAgent): Promise<void>;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,wBAAsB,uBAAuB,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDtF"}
@@ -0,0 +1,50 @@
1
+ import chalk from 'chalk';
2
+ import { configManager } from '../core/config.js';
3
+ import { AntriAgent } from '../core/agent.js';
4
+ import { renderBanner } from './banner.js';
5
+ import { ShortcutHandler } from './shortcuts.js';
6
+ import { promptBoxReader } from './promptToolkit.js';
7
+ export async function startInteractiveSession(initialAgent) {
8
+ const config = configManager.get();
9
+ const agent = initialAgent || new AntriAgent(config);
10
+ const shortcutHandler = new ShortcutHandler(agent);
11
+ // Clear screen and show banner matching Home.png
12
+ console.clear();
13
+ renderBanner(config);
14
+ // Continuous REPL loop - runs indefinitely until user exits
15
+ while (true) {
16
+ try {
17
+ const currentConfig = configManager.get();
18
+ promptBoxReader.updateModel(currentConfig.model);
19
+ promptBoxReader.updateWorkingDir(currentConfig.workingDir);
20
+ // Read boxed prompt with live prompt_toolkit autocomplete on '/'
21
+ const input = await promptBoxReader.readPrompt('Ask your question...');
22
+ const trimmed = (input || '').trim();
23
+ if (!trimmed) {
24
+ continue;
25
+ }
26
+ // Check shortcuts and slash commands
27
+ const shortcutResult = await shortcutHandler.handle(trimmed, currentConfig);
28
+ if (shortcutResult.shouldExit) {
29
+ break;
30
+ }
31
+ if (shortcutResult.shouldClear) {
32
+ continue;
33
+ }
34
+ if (shortcutResult.handled) {
35
+ console.log();
36
+ continue;
37
+ }
38
+ // Output single user prompt badge pill for chat queries
39
+ promptBoxReader.printSubmittedPrompt(trimmed);
40
+ // Normal chat query to the agent
41
+ await agent.chat(trimmed);
42
+ // Next iteration of loop will render the active prompt box at the new bottom!
43
+ }
44
+ catch (err) {
45
+ console.error(chalk.red(`\nError: ${err.message}\n`));
46
+ }
47
+ }
48
+ process.exit(0);
49
+ }
50
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/cli/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,YAAyB;IACrE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,YAAY,IAAI,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;IAEnD,iDAAiD;IACjD,OAAO,CAAC,KAAK,EAAE,CAAC;IAChB,YAAY,CAAC,MAAM,CAAC,CAAC;IAErB,4DAA4D;IAC5D,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;YAC1C,eAAe,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACjD,eAAe,CAAC,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAE3D,iEAAiE;YACjE,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAErC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,qCAAqC;YACrC,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAE5E,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;gBAC9B,MAAM;YACR,CAAC;YAED,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YAED,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,SAAS;YACX,CAAC;YAED,wDAAwD;YACxD,eAAe,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAE9C,iCAAiC;YACjC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,8EAA8E;QAChF,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { SlashCommand } from '../types.js';
2
+ export declare const PROMPT_TOOLKIT_COMMANDS: SlashCommand[];
3
+ export declare class PromptBoxReader {
4
+ private activeModel;
5
+ private workingDir;
6
+ private renderedLines;
7
+ constructor(activeModel?: string, workingDir?: string);
8
+ updateModel(newModel: string): void;
9
+ updateWorkingDir(newDir: string): void;
10
+ readPrompt(placeholder?: string): Promise<string>;
11
+ printSubmittedPrompt(prompt: string): void;
12
+ }
13
+ export declare const promptBoxReader: PromptBoxReader;
14
+ //# sourceMappingURL=promptToolkit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptToolkit.d.ts","sourceRoot":"","sources":["../../src/cli/promptToolkit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,eAAO,MAAM,uBAAuB,EAAE,YAAY,EAmCjD,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAa;gBAEtB,WAAW,SAA+B,EAAE,UAAU,SAAgB;IAK3E,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAInC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,UAAU,CAAC,WAAW,SAAyB,GAAG,OAAO,CAAC,MAAM,CAAC;IAmWvE,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAOlD;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}