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.
- package/dist/cli-adapter.d.ts +78 -0
- package/dist/cli-adapter.d.ts.map +1 -1
- package/dist/cli-adapter.js +566 -165
- package/dist/cli-adapter.js.map +1 -1
- package/dist/config/build-config.d.ts +1 -1
- package/dist/config/build-config.js +1 -1
- package/dist/config/mcp-config-manager.d.ts +21 -0
- package/dist/config/mcp-config-manager.d.ts.map +1 -1
- package/dist/config/mcp-config-manager.js +184 -1
- package/dist/config/mcp-config-manager.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +7 -2
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.d.ts.map +1 -1
- package/dist/config/slash-commands.js +5 -3
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/index.js +66 -11
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.d.ts +34 -3
- package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
- package/dist/mcp/mcp-command-handler.js +171 -83
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
- package/dist/mcp/mcp-server-manager.js +9 -23
- package/dist/mcp/mcp-server-manager.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +42 -5
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-service-client.d.ts +6 -1
- package/dist/services/ai-service-client.d.ts.map +1 -1
- package/dist/services/ai-service-client.js +6 -6
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.d.ts +20 -0
- package/dist/services/api-client.d.ts.map +1 -1
- package/dist/services/api-client.js +35 -0
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/input-detection-agent.d.ts +40 -0
- package/dist/services/input-detection-agent.d.ts.map +1 -0
- package/dist/services/input-detection-agent.js +213 -0
- package/dist/services/input-detection-agent.js.map +1 -0
- package/dist/services/input-requirement-detector.d.ts +28 -0
- package/dist/services/input-requirement-detector.d.ts.map +1 -0
- package/dist/services/input-requirement-detector.js +203 -0
- package/dist/services/input-requirement-detector.js.map +1 -0
- package/dist/services/monitored-shell-manager.d.ts +120 -0
- package/dist/services/monitored-shell-manager.d.ts.map +1 -0
- package/dist/services/monitored-shell-manager.js +239 -0
- package/dist/services/monitored-shell-manager.js.map +1 -0
- package/dist/services/session-quota-manager.d.ts +101 -0
- package/dist/services/session-quota-manager.d.ts.map +1 -0
- package/dist/services/session-quota-manager.js +242 -0
- package/dist/services/session-quota-manager.js.map +1 -0
- package/dist/services/shell-input-agent.d.ts +89 -0
- package/dist/services/shell-input-agent.d.ts.map +1 -0
- package/dist/services/shell-input-agent.js +361 -0
- package/dist/services/shell-input-agent.js.map +1 -0
- package/dist/services/sub-agent-manager.d.ts +139 -0
- package/dist/services/sub-agent-manager.d.ts.map +1 -0
- package/dist/services/sub-agent-manager.js +517 -0
- package/dist/services/sub-agent-manager.js.map +1 -0
- package/dist/tools/background-command.d.ts.map +1 -1
- package/dist/tools/background-command.js +33 -13
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.d.ts.map +1 -1
- package/dist/tools/command.js +78 -4
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/file-ops.d.ts.map +1 -1
- package/dist/tools/file-ops.js +33 -19
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/get-diff.d.ts.map +1 -1
- package/dist/tools/get-diff.js +5 -2
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.d.ts.map +1 -1
- package/dist/tools/grep-search.js +41 -15
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/plan-mode.js +3 -3
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/registry.js +1 -1
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/sub-agent.d.ts +9 -0
- package/dist/tools/sub-agent.d.ts.map +1 -0
- package/dist/tools/sub-agent.js +232 -0
- package/dist/tools/sub-agent.js.map +1 -0
- package/dist/tools/task-complete.d.ts.map +1 -1
- package/dist/tools/task-complete.js +14 -32
- package/dist/tools/task-complete.js.map +1 -1
- package/dist/ui/components/App.d.ts +45 -0
- package/dist/ui/components/App.d.ts.map +1 -1
- package/dist/ui/components/App.js +598 -95
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/CircularSelectInput.d.ts +24 -0
- package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
- package/dist/ui/components/CircularSelectInput.js +71 -0
- package/dist/ui/components/CircularSelectInput.js.map +1 -0
- package/dist/ui/components/ErrorBoundary.d.ts +3 -2
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/ui/components/ErrorBoundary.js +29 -1
- package/dist/ui/components/ErrorBoundary.js.map +1 -1
- package/dist/ui/components/InputBox.d.ts +4 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -1
- package/dist/ui/components/InputBox.js +40 -2
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.d.ts +6 -0
- package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
- package/dist/ui/components/InteractiveShell.js +57 -6
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/MCPAddScreen.d.ts +13 -0
- package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPAddScreen.js +54 -0
- package/dist/ui/components/MCPAddScreen.js.map +1 -0
- package/dist/ui/components/MCPListScreen.d.ts +17 -0
- package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPListScreen.js +50 -0
- package/dist/ui/components/MCPListScreen.js.map +1 -0
- package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
- package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
- package/dist/ui/components/MCPServerListScreen.js +59 -0
- package/dist/ui/components/MCPServerListScreen.js.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
- package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
- package/dist/ui/components/MonitorModeAIPanel.js +69 -0
- package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
- package/dist/ui/components/MultiLineInput.d.ts +13 -0
- package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
- package/dist/ui/components/MultiLineInput.js +223 -0
- package/dist/ui/components/MultiLineInput.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +2 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -1
- package/dist/ui/components/StatusBar.js +33 -2
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +271 -12
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.js +3 -2
- package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
- package/dist/utils/editor-utils.d.ts +3 -3
- package/dist/utils/editor-utils.d.ts.map +1 -1
- package/dist/utils/editor-utils.js +15 -12
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/input-classifier.d.ts.map +1 -1
- package/dist/utils/input-classifier.js +1 -0
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/terminal-output.d.ts.map +1 -1
- package/dist/utils/terminal-output.js +198 -171
- package/dist/utils/terminal-output.js.map +1 -1
- 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"}
|