centaurus-cli 2.9.0 → 2.9.2

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 (148) hide show
  1. package/dist/cli-adapter.d.ts +78 -0
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +566 -165
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/build-config.d.ts +1 -1
  6. package/dist/config/build-config.js +1 -1
  7. package/dist/config/mcp-config-manager.d.ts +21 -0
  8. package/dist/config/mcp-config-manager.d.ts.map +1 -1
  9. package/dist/config/mcp-config-manager.js +184 -1
  10. package/dist/config/mcp-config-manager.js.map +1 -1
  11. package/dist/config/models.d.ts +1 -0
  12. package/dist/config/models.d.ts.map +1 -1
  13. package/dist/config/models.js +7 -2
  14. package/dist/config/models.js.map +1 -1
  15. package/dist/config/slash-commands.d.ts.map +1 -1
  16. package/dist/config/slash-commands.js +5 -3
  17. package/dist/config/slash-commands.js.map +1 -1
  18. package/dist/index.js +66 -11
  19. package/dist/index.js.map +1 -1
  20. package/dist/mcp/mcp-command-handler.d.ts +34 -3
  21. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  22. package/dist/mcp/mcp-command-handler.js +171 -83
  23. package/dist/mcp/mcp-command-handler.js.map +1 -1
  24. package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
  25. package/dist/mcp/mcp-server-manager.js +9 -23
  26. package/dist/mcp/mcp-server-manager.js.map +1 -1
  27. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  28. package/dist/mcp/mcp-tool-wrapper.js +42 -5
  29. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  30. package/dist/services/ai-service-client.d.ts +6 -1
  31. package/dist/services/ai-service-client.d.ts.map +1 -1
  32. package/dist/services/ai-service-client.js +6 -6
  33. package/dist/services/ai-service-client.js.map +1 -1
  34. package/dist/services/api-client.d.ts +20 -0
  35. package/dist/services/api-client.d.ts.map +1 -1
  36. package/dist/services/api-client.js +35 -0
  37. package/dist/services/api-client.js.map +1 -1
  38. package/dist/services/input-detection-agent.d.ts +40 -0
  39. package/dist/services/input-detection-agent.d.ts.map +1 -0
  40. package/dist/services/input-detection-agent.js +213 -0
  41. package/dist/services/input-detection-agent.js.map +1 -0
  42. package/dist/services/input-requirement-detector.d.ts +28 -0
  43. package/dist/services/input-requirement-detector.d.ts.map +1 -0
  44. package/dist/services/input-requirement-detector.js +203 -0
  45. package/dist/services/input-requirement-detector.js.map +1 -0
  46. package/dist/services/monitored-shell-manager.d.ts +120 -0
  47. package/dist/services/monitored-shell-manager.d.ts.map +1 -0
  48. package/dist/services/monitored-shell-manager.js +239 -0
  49. package/dist/services/monitored-shell-manager.js.map +1 -0
  50. package/dist/services/session-quota-manager.d.ts +101 -0
  51. package/dist/services/session-quota-manager.d.ts.map +1 -0
  52. package/dist/services/session-quota-manager.js +242 -0
  53. package/dist/services/session-quota-manager.js.map +1 -0
  54. package/dist/services/shell-input-agent.d.ts +89 -0
  55. package/dist/services/shell-input-agent.d.ts.map +1 -0
  56. package/dist/services/shell-input-agent.js +361 -0
  57. package/dist/services/shell-input-agent.js.map +1 -0
  58. package/dist/services/sub-agent-manager.d.ts +139 -0
  59. package/dist/services/sub-agent-manager.d.ts.map +1 -0
  60. package/dist/services/sub-agent-manager.js +517 -0
  61. package/dist/services/sub-agent-manager.js.map +1 -0
  62. package/dist/tools/background-command.d.ts.map +1 -1
  63. package/dist/tools/background-command.js +33 -13
  64. package/dist/tools/background-command.js.map +1 -1
  65. package/dist/tools/command.d.ts.map +1 -1
  66. package/dist/tools/command.js +78 -4
  67. package/dist/tools/command.js.map +1 -1
  68. package/dist/tools/file-ops.d.ts.map +1 -1
  69. package/dist/tools/file-ops.js +33 -19
  70. package/dist/tools/file-ops.js.map +1 -1
  71. package/dist/tools/get-diff.d.ts.map +1 -1
  72. package/dist/tools/get-diff.js +5 -2
  73. package/dist/tools/get-diff.js.map +1 -1
  74. package/dist/tools/grep-search.d.ts.map +1 -1
  75. package/dist/tools/grep-search.js +41 -15
  76. package/dist/tools/grep-search.js.map +1 -1
  77. package/dist/tools/plan-mode.js +3 -3
  78. package/dist/tools/plan-mode.js.map +1 -1
  79. package/dist/tools/registry.js +1 -1
  80. package/dist/tools/registry.js.map +1 -1
  81. package/dist/tools/sub-agent.d.ts +9 -0
  82. package/dist/tools/sub-agent.d.ts.map +1 -0
  83. package/dist/tools/sub-agent.js +232 -0
  84. package/dist/tools/sub-agent.js.map +1 -0
  85. package/dist/tools/task-complete.d.ts.map +1 -1
  86. package/dist/tools/task-complete.js +14 -32
  87. package/dist/tools/task-complete.js.map +1 -1
  88. package/dist/ui/components/App.d.ts +45 -0
  89. package/dist/ui/components/App.d.ts.map +1 -1
  90. package/dist/ui/components/App.js +598 -95
  91. package/dist/ui/components/App.js.map +1 -1
  92. package/dist/ui/components/CircularSelectInput.d.ts +24 -0
  93. package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
  94. package/dist/ui/components/CircularSelectInput.js +71 -0
  95. package/dist/ui/components/CircularSelectInput.js.map +1 -0
  96. package/dist/ui/components/ErrorBoundary.d.ts +3 -2
  97. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
  98. package/dist/ui/components/ErrorBoundary.js +29 -1
  99. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  100. package/dist/ui/components/InputBox.d.ts +4 -0
  101. package/dist/ui/components/InputBox.d.ts.map +1 -1
  102. package/dist/ui/components/InputBox.js +40 -2
  103. package/dist/ui/components/InputBox.js.map +1 -1
  104. package/dist/ui/components/InteractiveShell.d.ts +6 -0
  105. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  106. package/dist/ui/components/InteractiveShell.js +57 -6
  107. package/dist/ui/components/InteractiveShell.js.map +1 -1
  108. package/dist/ui/components/MCPAddScreen.d.ts +13 -0
  109. package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
  110. package/dist/ui/components/MCPAddScreen.js +54 -0
  111. package/dist/ui/components/MCPAddScreen.js.map +1 -0
  112. package/dist/ui/components/MCPListScreen.d.ts +17 -0
  113. package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
  114. package/dist/ui/components/MCPListScreen.js +50 -0
  115. package/dist/ui/components/MCPListScreen.js.map +1 -0
  116. package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
  117. package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
  118. package/dist/ui/components/MCPServerListScreen.js +59 -0
  119. package/dist/ui/components/MCPServerListScreen.js.map +1 -0
  120. package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
  121. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
  122. package/dist/ui/components/MonitorModeAIPanel.js +69 -0
  123. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
  124. package/dist/ui/components/MultiLineInput.d.ts +13 -0
  125. package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
  126. package/dist/ui/components/MultiLineInput.js +223 -0
  127. package/dist/ui/components/MultiLineInput.js.map +1 -0
  128. package/dist/ui/components/StatusBar.d.ts +2 -0
  129. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  130. package/dist/ui/components/StatusBar.js +33 -2
  131. package/dist/ui/components/StatusBar.js.map +1 -1
  132. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  133. package/dist/ui/components/ToolExecutionMessage.js +271 -12
  134. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  135. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
  136. package/dist/ui/components/VersionUpdatePrompt.js +3 -2
  137. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  138. package/dist/utils/editor-utils.d.ts +3 -3
  139. package/dist/utils/editor-utils.d.ts.map +1 -1
  140. package/dist/utils/editor-utils.js +15 -12
  141. package/dist/utils/editor-utils.js.map +1 -1
  142. package/dist/utils/input-classifier.d.ts.map +1 -1
  143. package/dist/utils/input-classifier.js +1 -0
  144. package/dist/utils/input-classifier.js.map +1 -1
  145. package/dist/utils/terminal-output.d.ts.map +1 -1
  146. package/dist/utils/terminal-output.js +198 -171
  147. package/dist/utils/terminal-output.js.map +1 -1
  148. package/package.json +2 -1
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Session Quota Manager
3
+ *
4
+ * Tracks and enforces rate limits based on backend configuration.
5
+ * Each agent loop turn counts as one message.
6
+ * Configuration is fetched from backend API on startup with fallback defaults.
7
+ */
8
+ /**
9
+ * Session quota state stored on disk
10
+ */
11
+ interface SessionQuotaState {
12
+ sessionStartTime: number;
13
+ messagesUsed: number;
14
+ }
15
+ /**
16
+ * SessionQuotaManager class for managing rate limits
17
+ */
18
+ declare class SessionQuotaManager {
19
+ private quotaFilePath;
20
+ private configFilePath;
21
+ private state;
22
+ private configLoaded;
23
+ constructor();
24
+ /**
25
+ * Load cached config from disk (synced on previous fetch)
26
+ */
27
+ private loadCachedConfig;
28
+ /**
29
+ * Apply configuration values
30
+ */
31
+ private applyConfig;
32
+ /**
33
+ * Save config to disk for caching
34
+ */
35
+ private saveConfigCache;
36
+ /**
37
+ * Fetch configuration from backend API
38
+ * Call this on CLI startup to get latest config
39
+ */
40
+ fetchConfigFromBackend(): Promise<void>;
41
+ /**
42
+ * Load quota state from disk, or create fresh state if expired or missing
43
+ */
44
+ private loadState;
45
+ /**
46
+ * Create a fresh session state
47
+ */
48
+ private createFreshState;
49
+ /**
50
+ * Save current state to disk
51
+ */
52
+ private saveState;
53
+ /**
54
+ * Check if session has expired and reset if needed
55
+ */
56
+ private checkAndResetIfExpired;
57
+ /**
58
+ * Check if user can send a message (has remaining quota)
59
+ */
60
+ canSendMessage(): boolean;
61
+ /**
62
+ * Increment the message count (call this on each agent loop turn)
63
+ */
64
+ incrementMessageCount(): void;
65
+ /**
66
+ * Get the number of remaining messages in the current session
67
+ */
68
+ getRemainingMessages(): number;
69
+ /**
70
+ * Get the total messages used in the current session
71
+ */
72
+ getMessagesUsed(): number;
73
+ /**
74
+ * Get time remaining until session resets (in milliseconds)
75
+ * Returns 0 if no session has started
76
+ */
77
+ getTimeUntilReset(): number;
78
+ /**
79
+ * Get formatted time remaining as "Xh Ym" string
80
+ */
81
+ getFormattedTimeRemaining(): string;
82
+ /**
83
+ * Get session start time (for debugging)
84
+ */
85
+ getSessionStartTime(): number;
86
+ /**
87
+ * Force reset the session (for testing purposes)
88
+ */
89
+ resetSession(): void;
90
+ /**
91
+ * Get current config values (for debugging)
92
+ */
93
+ getCurrentConfig(): {
94
+ maxMessagesPerSession: number;
95
+ sessionDurationMs: number;
96
+ warningThreshold: number;
97
+ };
98
+ }
99
+ export declare const sessionQuotaManager: SessionQuotaManager;
100
+ export { SessionQuotaState };
101
+ //# sourceMappingURL=session-quota-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-quota-manager.d.ts","sourceRoot":"","sources":["../../src/services/session-quota-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH;;GAEG;AACH,UAAU,iBAAiB;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACxB;AAYD;;GAEG;AACH,cAAM,mBAAmB;IACrB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAAkB;;IAoBtC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB7C;;OAEG;IACH,OAAO,CAAC,SAAS;IAwBjB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,SAAS;IAQjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,cAAc,IAAI,OAAO;IAKzB;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAY7B;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAK9B;;OAEG;IACH,eAAe,IAAI,MAAM;IAKzB;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAY3B;;OAEG;IACH,yBAAyB,IAAI,MAAM;IAiBnC;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,gBAAgB;;;;;CAOnB;AAGD,eAAO,MAAM,mBAAmB,qBAA4B,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Session Quota Manager
3
+ *
4
+ * Tracks and enforces rate limits based on backend configuration.
5
+ * Each agent loop turn counts as one message.
6
+ * Configuration is fetched from backend API on startup with fallback defaults.
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import { logError, logWarning, logInfo } from '../utils/logger.js';
12
+ import { apiClient } from './api-client.js';
13
+ // Default constants (fallback if backend is unreachable)
14
+ let MAX_MESSAGES_PER_SESSION = 50;
15
+ let SESSION_DURATION_MS = 4 * 60 * 60 * 1000; // 4 hours in milliseconds
16
+ let WARNING_THRESHOLD = 10;
17
+ /**
18
+ * SessionQuotaManager class for managing rate limits
19
+ */
20
+ class SessionQuotaManager {
21
+ quotaFilePath;
22
+ configFilePath;
23
+ state;
24
+ configLoaded = false;
25
+ constructor() {
26
+ const homeDir = os.homedir();
27
+ const centaurusDir = path.join(homeDir, '.centaurus');
28
+ this.quotaFilePath = path.join(centaurusDir, 'session-quota.json');
29
+ this.configFilePath = path.join(centaurusDir, 'rate-limits-config.json');
30
+ // Ensure directory exists
31
+ if (!fs.existsSync(centaurusDir)) {
32
+ fs.mkdirSync(centaurusDir, { recursive: true });
33
+ }
34
+ // Load cached config first (sync, for immediate use)
35
+ this.loadCachedConfig();
36
+ // Load or initialize state
37
+ this.state = this.loadState();
38
+ }
39
+ /**
40
+ * Load cached config from disk (synced on previous fetch)
41
+ */
42
+ loadCachedConfig() {
43
+ try {
44
+ if (fs.existsSync(this.configFilePath)) {
45
+ const data = fs.readFileSync(this.configFilePath, 'utf-8');
46
+ const config = JSON.parse(data);
47
+ this.applyConfig(config);
48
+ this.configLoaded = true;
49
+ }
50
+ }
51
+ catch (error) {
52
+ logWarning(`Failed to load cached rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);
53
+ }
54
+ }
55
+ /**
56
+ * Apply configuration values
57
+ */
58
+ applyConfig(config) {
59
+ MAX_MESSAGES_PER_SESSION = config.maxMessagesPerSession;
60
+ SESSION_DURATION_MS = config.sessionDurationHours * 60 * 60 * 1000;
61
+ WARNING_THRESHOLD = config.warningThreshold || 10;
62
+ }
63
+ /**
64
+ * Save config to disk for caching
65
+ */
66
+ saveConfigCache(config) {
67
+ try {
68
+ fs.writeFileSync(this.configFilePath, JSON.stringify(config, null, 2), 'utf-8');
69
+ }
70
+ catch (error) {
71
+ logWarning(`Failed to cache rate limits config: ${error instanceof Error ? error.message : 'Unknown error'}`);
72
+ }
73
+ }
74
+ /**
75
+ * Fetch configuration from backend API
76
+ * Call this on CLI startup to get latest config
77
+ */
78
+ async fetchConfigFromBackend() {
79
+ try {
80
+ const config = await apiClient.getRateLimitsConfig();
81
+ if (config) {
82
+ this.applyConfig(config);
83
+ this.saveConfigCache(config);
84
+ this.configLoaded = true;
85
+ logInfo(`Rate limits config fetched from backend: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);
86
+ }
87
+ }
88
+ catch (error) {
89
+ // Backend unreachable - use cached or default config
90
+ if (!this.configLoaded) {
91
+ logWarning(`Backend unreachable for rate limits config, using defaults: ${MAX_MESSAGES_PER_SESSION} messages per ${SESSION_DURATION_MS / (60 * 60 * 1000)}h`);
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * Load quota state from disk, or create fresh state if expired or missing
97
+ */
98
+ loadState() {
99
+ try {
100
+ if (fs.existsSync(this.quotaFilePath)) {
101
+ const data = fs.readFileSync(this.quotaFilePath, 'utf-8');
102
+ const state = JSON.parse(data);
103
+ // Check if session has expired
104
+ const now = Date.now();
105
+ const sessionAge = now - state.sessionStartTime;
106
+ if (sessionAge >= SESSION_DURATION_MS) {
107
+ // Session expired, return fresh state (but don't save yet)
108
+ return this.createFreshState();
109
+ }
110
+ return state;
111
+ }
112
+ }
113
+ catch (error) {
114
+ logWarning(`Failed to load session quota state: ${error instanceof Error ? error.message : 'Unknown error'}`);
115
+ }
116
+ return this.createFreshState();
117
+ }
118
+ /**
119
+ * Create a fresh session state
120
+ */
121
+ createFreshState() {
122
+ return {
123
+ sessionStartTime: 0, // Will be set on first message
124
+ messagesUsed: 0
125
+ };
126
+ }
127
+ /**
128
+ * Save current state to disk
129
+ */
130
+ saveState() {
131
+ try {
132
+ fs.writeFileSync(this.quotaFilePath, JSON.stringify(this.state, null, 2), 'utf-8');
133
+ }
134
+ catch (error) {
135
+ logError('Failed to save session quota state', error instanceof Error ? error : new Error(String(error)));
136
+ }
137
+ }
138
+ /**
139
+ * Check if session has expired and reset if needed
140
+ */
141
+ checkAndResetIfExpired() {
142
+ if (this.state.sessionStartTime === 0) {
143
+ // No session started yet
144
+ return;
145
+ }
146
+ const now = Date.now();
147
+ const sessionAge = now - this.state.sessionStartTime;
148
+ if (sessionAge >= SESSION_DURATION_MS) {
149
+ // Session expired, reset state
150
+ this.state = this.createFreshState();
151
+ // Don't save yet - will be saved when first message is sent
152
+ }
153
+ }
154
+ /**
155
+ * Check if user can send a message (has remaining quota)
156
+ */
157
+ canSendMessage() {
158
+ this.checkAndResetIfExpired();
159
+ return this.state.messagesUsed < MAX_MESSAGES_PER_SESSION;
160
+ }
161
+ /**
162
+ * Increment the message count (call this on each agent loop turn)
163
+ */
164
+ incrementMessageCount() {
165
+ this.checkAndResetIfExpired();
166
+ // Start session on first message
167
+ if (this.state.sessionStartTime === 0) {
168
+ this.state.sessionStartTime = Date.now();
169
+ }
170
+ this.state.messagesUsed++;
171
+ this.saveState();
172
+ }
173
+ /**
174
+ * Get the number of remaining messages in the current session
175
+ */
176
+ getRemainingMessages() {
177
+ this.checkAndResetIfExpired();
178
+ return Math.max(0, MAX_MESSAGES_PER_SESSION - this.state.messagesUsed);
179
+ }
180
+ /**
181
+ * Get the total messages used in the current session
182
+ */
183
+ getMessagesUsed() {
184
+ this.checkAndResetIfExpired();
185
+ return this.state.messagesUsed;
186
+ }
187
+ /**
188
+ * Get time remaining until session resets (in milliseconds)
189
+ * Returns 0 if no session has started
190
+ */
191
+ getTimeUntilReset() {
192
+ if (this.state.sessionStartTime === 0) {
193
+ return 0;
194
+ }
195
+ const now = Date.now();
196
+ const sessionAge = now - this.state.sessionStartTime;
197
+ const timeRemaining = SESSION_DURATION_MS - sessionAge;
198
+ return Math.max(0, timeRemaining);
199
+ }
200
+ /**
201
+ * Get formatted time remaining as "Xh Ym" string
202
+ */
203
+ getFormattedTimeRemaining() {
204
+ const timeMs = this.getTimeUntilReset();
205
+ if (timeMs <= 0) {
206
+ return '0h 0m';
207
+ }
208
+ const totalMinutes = Math.ceil(timeMs / (60 * 1000));
209
+ const hours = Math.floor(totalMinutes / 60);
210
+ const minutes = totalMinutes % 60;
211
+ if (hours > 0) {
212
+ return `${hours}h ${minutes}m`;
213
+ }
214
+ return `${minutes}m`;
215
+ }
216
+ /**
217
+ * Get session start time (for debugging)
218
+ */
219
+ getSessionStartTime() {
220
+ return this.state.sessionStartTime;
221
+ }
222
+ /**
223
+ * Force reset the session (for testing purposes)
224
+ */
225
+ resetSession() {
226
+ this.state = this.createFreshState();
227
+ this.saveState();
228
+ }
229
+ /**
230
+ * Get current config values (for debugging)
231
+ */
232
+ getCurrentConfig() {
233
+ return {
234
+ maxMessagesPerSession: MAX_MESSAGES_PER_SESSION,
235
+ sessionDurationMs: SESSION_DURATION_MS,
236
+ warningThreshold: WARNING_THRESHOLD
237
+ };
238
+ }
239
+ }
240
+ // Export singleton instance
241
+ export const sessionQuotaManager = new SessionQuotaManager();
242
+ //# sourceMappingURL=session-quota-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-quota-manager.js","sourceRoot":"","sources":["../../src/services/session-quota-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Shell Input Agent Service
3
+ *
4
+ * An isolated AI agent that handles shell input prompts during Agent Control Mode.
5
+ * Completely separate from the main chat agent - has its own conversation history,
6
+ * tools, and lifecycle. Terminates immediately when the shell command completes.
7
+ */
8
+ import { Message as AIMessage } from './ai-service-client.js';
9
+ import { ToolRegistry } from '../tools/registry.js';
10
+ export interface ShellInputSession {
11
+ shellId: string;
12
+ command: string;
13
+ cwd: string;
14
+ isActive: boolean;
15
+ abortController: AbortController;
16
+ conversationHistory: AIMessage[];
17
+ mainConversationContext?: AIMessage[];
18
+ turnCount: number;
19
+ startTime: Date;
20
+ lastInputTime?: Date;
21
+ }
22
+ declare class ShellInputAgentClass {
23
+ private sessions;
24
+ private toolRegistry?;
25
+ private onShellInput?;
26
+ private onToolExecutionUpdate?;
27
+ private onPromptAnswered?;
28
+ private processingLock;
29
+ /**
30
+ * Initialize the agent with a tool registry
31
+ */
32
+ initialize(toolRegistry: ToolRegistry): void;
33
+ /**
34
+ * Set callback for sending input to shell (bridges to App.tsx's onShellInput)
35
+ */
36
+ setOnShellInput(callback: (shellId: string, input: string) => void): void;
37
+ /**
38
+ * Set callback for tool execution updates (for UI feedback)
39
+ */
40
+ setOnToolExecutionUpdate(callback: (update: any) => void): void;
41
+ /**
42
+ * Set callback for when a prompt has been answered
43
+ * This is used to update the UI to show a tick instead of spinner
44
+ */
45
+ setOnPromptAnswered(callback: (shellId: string) => void): void;
46
+ /**
47
+ * Start a new shell input session
48
+ * @param shellId Unique identifier for this shell session
49
+ * @param command The command being run
50
+ * @param cwd Current working directory
51
+ * @param mainConversation Optional main agent conversation history for context
52
+ */
53
+ startSession(shellId: string, command: string, cwd: string, mainConversation?: AIMessage[]): void;
54
+ /**
55
+ * Handle an input prompt detected in shell output
56
+ * Returns quickly - AI call runs in background
57
+ */
58
+ handleInputPrompt(shellId: string, shellOutput: string, promptContext: string, inputType: string, confidence: string): Promise<void>;
59
+ /**
60
+ * Process an input prompt with AI
61
+ */
62
+ private processInputPrompt;
63
+ /**
64
+ * Build the input prompt for AI
65
+ */
66
+ private buildInputPrompt;
67
+ /**
68
+ * Terminate a shell input session immediately
69
+ */
70
+ terminateSession(shellId: string): void;
71
+ /**
72
+ * Check if a session is active
73
+ */
74
+ isSessionActive(shellId: string): boolean;
75
+ /**
76
+ * Get session info (for debugging)
77
+ */
78
+ getSessionInfo(shellId: string): {
79
+ turnCount: number;
80
+ isActive: boolean;
81
+ } | undefined;
82
+ /**
83
+ * Terminate all active sessions
84
+ */
85
+ terminateAllSessions(): void;
86
+ }
87
+ export declare const ShellInputAgent: ShellInputAgentClass;
88
+ export {};
89
+ //# sourceMappingURL=shell-input-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-input-agent.d.ts","sourceRoot":"","sources":["../../src/services/shell-input-agent.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAmB,OAAO,IAAI,SAAS,EAAe,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOpD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,SAAS,EAAE,CAAC;IACjC,uBAAuB,CAAC,EAAE,SAAS,EAAE,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,aAAa,CAAC,EAAE,IAAI,CAAC;CACxB;AAwCD,cAAM,oBAAoB;IACtB,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAAC,CAA2C;IAChE,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,gBAAgB,CAAC,CAA4B;IACrD,OAAO,CAAC,cAAc,CAAmC;IAEzD;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAK5C;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIzE;;OAEG;IACH,wBAAwB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAI/D;;;OAGG;IACH,mBAAmB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI9D;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI;IAuBjG;;;OAGG;IACG,iBAAiB,CACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;YACW,kBAAkB;IAkKhC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0DxB;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAqBvC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKzC;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS;IASrF;;OAEG;IACH,oBAAoB,IAAI,IAAI;CAK/B;AAGD,eAAO,MAAM,eAAe,sBAA6B,CAAC"}