remoat 0.2.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.
- package/LICENSE +21 -0
- package/README.md +297 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +80 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/commands/doctor.d.ts +1 -0
- package/dist/bin/commands/doctor.js +211 -0
- package/dist/bin/commands/doctor.js.map +1 -0
- package/dist/bin/commands/open.d.ts +1 -0
- package/dist/bin/commands/open.js +187 -0
- package/dist/bin/commands/open.js.map +1 -0
- package/dist/bin/commands/setup.d.ts +1 -0
- package/dist/bin/commands/setup.js +267 -0
- package/dist/bin/commands/setup.js.map +1 -0
- package/dist/bin/commands/start.d.ts +2 -0
- package/dist/bin/commands/start.js +39 -0
- package/dist/bin/commands/start.js.map +1 -0
- package/dist/bot/index.d.ts +2 -0
- package/dist/bot/index.js +1393 -0
- package/dist/bot/index.js.map +1 -0
- package/dist/commands/chatCommandHandler.d.ts +20 -0
- package/dist/commands/chatCommandHandler.js +30 -0
- package/dist/commands/chatCommandHandler.js.map +1 -0
- package/dist/commands/cleanupCommandHandler.d.ts +21 -0
- package/dist/commands/cleanupCommandHandler.js +40 -0
- package/dist/commands/cleanupCommandHandler.js.map +1 -0
- package/dist/commands/joinCommandHandler.d.ts +19 -0
- package/dist/commands/joinCommandHandler.js +27 -0
- package/dist/commands/joinCommandHandler.js.map +1 -0
- package/dist/commands/messageParser.d.ts +7 -0
- package/dist/commands/messageParser.js +29 -0
- package/dist/commands/messageParser.js.map +1 -0
- package/dist/commands/slashCommandHandler.d.ts +21 -0
- package/dist/commands/slashCommandHandler.js +105 -0
- package/dist/commands/slashCommandHandler.js.map +1 -0
- package/dist/commands/workspaceCommandHandler.d.ts +16 -0
- package/dist/commands/workspaceCommandHandler.js +29 -0
- package/dist/commands/workspaceCommandHandler.js.map +1 -0
- package/dist/database/chatSessionRepository.d.ts +59 -0
- package/dist/database/chatSessionRepository.js +110 -0
- package/dist/database/chatSessionRepository.js.map +1 -0
- package/dist/database/scheduleRepository.d.ts +60 -0
- package/dist/database/scheduleRepository.js +106 -0
- package/dist/database/scheduleRepository.js.map +1 -0
- package/dist/database/templateRepository.d.ts +51 -0
- package/dist/database/templateRepository.js +90 -0
- package/dist/database/templateRepository.js.map +1 -0
- package/dist/database/workspaceBindingRepository.d.ts +48 -0
- package/dist/database/workspaceBindingRepository.js +92 -0
- package/dist/database/workspaceBindingRepository.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.js +14 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/sanitize.d.ts +1 -0
- package/dist/middleware/sanitize.js +18 -0
- package/dist/middleware/sanitize.js.map +1 -0
- package/dist/services/antigravityLauncher.d.ts +7 -0
- package/dist/services/antigravityLauncher.js +94 -0
- package/dist/services/antigravityLauncher.js.map +1 -0
- package/dist/services/approvalDetector.d.ts +97 -0
- package/dist/services/approvalDetector.js +394 -0
- package/dist/services/approvalDetector.js.map +1 -0
- package/dist/services/assistantDomExtractor.d.ts +49 -0
- package/dist/services/assistantDomExtractor.js +340 -0
- package/dist/services/assistantDomExtractor.js.map +1 -0
- package/dist/services/autoAcceptService.d.ts +14 -0
- package/dist/services/autoAcceptService.js +81 -0
- package/dist/services/autoAcceptService.js.map +1 -0
- package/dist/services/cdpBridgeManager.d.ts +50 -0
- package/dist/services/cdpBridgeManager.js +355 -0
- package/dist/services/cdpBridgeManager.js.map +1 -0
- package/dist/services/cdpConnectionPool.d.ts +88 -0
- package/dist/services/cdpConnectionPool.js +235 -0
- package/dist/services/cdpConnectionPool.js.map +1 -0
- package/dist/services/cdpService.d.ts +214 -0
- package/dist/services/cdpService.js +1423 -0
- package/dist/services/cdpService.js.map +1 -0
- package/dist/services/chatSessionService.d.ts +89 -0
- package/dist/services/chatSessionService.js +738 -0
- package/dist/services/chatSessionService.js.map +1 -0
- package/dist/services/errorPopupDetector.d.ts +89 -0
- package/dist/services/errorPopupDetector.js +274 -0
- package/dist/services/errorPopupDetector.js.map +1 -0
- package/dist/services/modeService.d.ts +44 -0
- package/dist/services/modeService.js +74 -0
- package/dist/services/modeService.js.map +1 -0
- package/dist/services/modelService.d.ts +36 -0
- package/dist/services/modelService.js +64 -0
- package/dist/services/modelService.js.map +1 -0
- package/dist/services/planningDetector.d.ts +87 -0
- package/dist/services/planningDetector.js +321 -0
- package/dist/services/planningDetector.js.map +1 -0
- package/dist/services/processManager.d.ts +18 -0
- package/dist/services/processManager.js +62 -0
- package/dist/services/processManager.js.map +1 -0
- package/dist/services/progressSender.d.ts +20 -0
- package/dist/services/progressSender.js +65 -0
- package/dist/services/progressSender.js.map +1 -0
- package/dist/services/promptDispatcher.d.ts +38 -0
- package/dist/services/promptDispatcher.js +42 -0
- package/dist/services/promptDispatcher.js.map +1 -0
- package/dist/services/quotaService.d.ts +21 -0
- package/dist/services/quotaService.js +191 -0
- package/dist/services/quotaService.js.map +1 -0
- package/dist/services/responseMonitor.d.ts +129 -0
- package/dist/services/responseMonitor.js +996 -0
- package/dist/services/responseMonitor.js.map +1 -0
- package/dist/services/scheduleService.d.ts +58 -0
- package/dist/services/scheduleService.js +135 -0
- package/dist/services/scheduleService.js.map +1 -0
- package/dist/services/screenshotService.d.ts +55 -0
- package/dist/services/screenshotService.js +86 -0
- package/dist/services/screenshotService.js.map +1 -0
- package/dist/services/telegramTopicManager.d.ts +40 -0
- package/dist/services/telegramTopicManager.js +103 -0
- package/dist/services/telegramTopicManager.js.map +1 -0
- package/dist/services/titleGeneratorService.d.ts +32 -0
- package/dist/services/titleGeneratorService.js +114 -0
- package/dist/services/titleGeneratorService.js.map +1 -0
- package/dist/services/updateCheckService.d.ts +16 -0
- package/dist/services/updateCheckService.js +148 -0
- package/dist/services/updateCheckService.js.map +1 -0
- package/dist/services/userMessageDetector.d.ts +57 -0
- package/dist/services/userMessageDetector.js +222 -0
- package/dist/services/userMessageDetector.js.map +1 -0
- package/dist/services/workspaceService.d.ts +33 -0
- package/dist/services/workspaceService.js +65 -0
- package/dist/services/workspaceService.js.map +1 -0
- package/dist/ui/autoAcceptUi.d.ts +6 -0
- package/dist/ui/autoAcceptUi.js +22 -0
- package/dist/ui/autoAcceptUi.js.map +1 -0
- package/dist/ui/modeUi.d.ts +12 -0
- package/dist/ui/modeUi.js +40 -0
- package/dist/ui/modeUi.js.map +1 -0
- package/dist/ui/modelsUi.d.ts +12 -0
- package/dist/ui/modelsUi.js +101 -0
- package/dist/ui/modelsUi.js.map +1 -0
- package/dist/ui/projectListUi.d.ts +11 -0
- package/dist/ui/projectListUi.js +59 -0
- package/dist/ui/projectListUi.js.map +1 -0
- package/dist/ui/screenshotUi.d.ts +6 -0
- package/dist/ui/screenshotUi.js +28 -0
- package/dist/ui/screenshotUi.js.map +1 -0
- package/dist/ui/sessionPickerUi.d.ts +8 -0
- package/dist/ui/sessionPickerUi.js +32 -0
- package/dist/ui/sessionPickerUi.js.map +1 -0
- package/dist/ui/templateUi.d.ts +5 -0
- package/dist/ui/templateUi.js +44 -0
- package/dist/ui/templateUi.js.map +1 -0
- package/dist/utils/cdpPorts.d.ts +2 -0
- package/dist/utils/cdpPorts.js +6 -0
- package/dist/utils/cdpPorts.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.js +12 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/configLoader.d.ts +23 -0
- package/dist/utils/configLoader.js +153 -0
- package/dist/utils/configLoader.js.map +1 -0
- package/dist/utils/htmlToTelegramMarkdown.d.ts +6 -0
- package/dist/utils/htmlToTelegramMarkdown.js +189 -0
- package/dist/utils/htmlToTelegramMarkdown.js.map +1 -0
- package/dist/utils/i18n.d.ts +3 -0
- package/dist/utils/i18n.js +78 -0
- package/dist/utils/i18n.js.map +1 -0
- package/dist/utils/imageHandler.d.ts +35 -0
- package/dist/utils/imageHandler.js +155 -0
- package/dist/utils/imageHandler.js.map +1 -0
- package/dist/utils/lockfile.d.ts +7 -0
- package/dist/utils/lockfile.js +117 -0
- package/dist/utils/lockfile.js.map +1 -0
- package/dist/utils/logger.d.ts +23 -0
- package/dist/utils/logger.js +85 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logo.d.ts +1 -0
- package/dist/utils/logo.js +14 -0
- package/dist/utils/logo.js.map +1 -0
- package/dist/utils/metadataExtractor.d.ts +5 -0
- package/dist/utils/metadataExtractor.js +16 -0
- package/dist/utils/metadataExtractor.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +23 -0
- package/dist/utils/pathUtils.js +58 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/dist/utils/processLogBuffer.d.ts +17 -0
- package/dist/utils/processLogBuffer.js +108 -0
- package/dist/utils/processLogBuffer.js.map +1 -0
- package/dist/utils/streamMessageFormatter.d.ts +18 -0
- package/dist/utils/streamMessageFormatter.js +91 -0
- package/dist/utils/streamMessageFormatter.js.map +1 -0
- package/dist/utils/telegramFormatter.d.ts +37 -0
- package/dist/utils/telegramFormatter.js +445 -0
- package/dist/utils/telegramFormatter.js.map +1 -0
- package/dist/utils/voiceHandler.d.ts +23 -0
- package/dist/utils/voiceHandler.js +169 -0
- package/dist/utils/voiceHandler.js.map +1 -0
- package/locales/en.json +85 -0
- package/locales/ja.json +109 -0
- package/package.json +84 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PromptDispatcher = void 0;
|
|
4
|
+
class PromptDispatcher {
|
|
5
|
+
deps;
|
|
6
|
+
/** Per-channel lock to prevent concurrent prompt dispatch */
|
|
7
|
+
channelLocks = new Map();
|
|
8
|
+
/** Per-workspace lock to prevent cross-topic races on the same workspace */
|
|
9
|
+
workspaceLocks = new Map();
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
this.deps = deps;
|
|
12
|
+
}
|
|
13
|
+
channelKey(ch) {
|
|
14
|
+
return ch.threadId ? `${ch.chatId}:${ch.threadId}` : String(ch.chatId);
|
|
15
|
+
}
|
|
16
|
+
async send(req) {
|
|
17
|
+
const chKey = this.channelKey(req.channel);
|
|
18
|
+
const wsName = req.cdp.getCurrentWorkspaceName();
|
|
19
|
+
const wsKey = wsName ? `ws:${wsName}` : null;
|
|
20
|
+
// Serialize per workspace (primary) and per channel (fallback).
|
|
21
|
+
// Two topics bound to the same workspace must not poll the DOM concurrently.
|
|
22
|
+
const lockKey = wsKey ?? chKey;
|
|
23
|
+
const previous = this.workspaceLocks.get(lockKey) ?? Promise.resolve();
|
|
24
|
+
const current = previous.then(() => this.deps.sendPromptImpl(this.deps.bridge, req.channel, req.prompt, req.cdp, this.deps.modeService, this.deps.modelService, req.inboundImages ?? [], req.options)).catch(() => { });
|
|
25
|
+
this.workspaceLocks.set(lockKey, current);
|
|
26
|
+
// Also keep per-channel entry so callers that check channel ordering still work
|
|
27
|
+
this.channelLocks.set(chKey, current);
|
|
28
|
+
try {
|
|
29
|
+
await current;
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
if (this.workspaceLocks.get(lockKey) === current) {
|
|
33
|
+
this.workspaceLocks.delete(lockKey);
|
|
34
|
+
}
|
|
35
|
+
if (this.channelLocks.get(chKey) === current) {
|
|
36
|
+
this.channelLocks.delete(chKey);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.PromptDispatcher = PromptDispatcher;
|
|
42
|
+
//# sourceMappingURL=promptDispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptDispatcher.js","sourceRoot":"","sources":["../../src/services/promptDispatcher.ts"],"names":[],"mappings":";;;AAyCA,MAAa,gBAAgB;IAMI;IAL7B,6DAA6D;IACrD,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;IACxD,4EAA4E;IACpE,cAAc,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D,YAA6B,IAA0B;QAA1B,SAAI,GAAJ,IAAI,CAAsB;IAAI,CAAC;IAEpD,UAAU,CAAC,EAAmB;QAClC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAA0B;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7C,gEAAgE;QAChE,6EAA6E;QAC7E,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAC/B,IAAI,CAAC,IAAI,CAAC,cAAc,CACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAChB,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,GAAG,EACP,IAAI,CAAC,IAAI,CAAC,WAAW,EACrB,IAAI,CAAC,IAAI,CAAC,YAAY,EACtB,GAAG,CAAC,aAAa,IAAI,EAAE,EACvB,GAAG,CAAC,OAAO,CACd,CACJ,CAAC,KAAK,CAAC,GAAG,EAAE,GAA8C,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1C,gFAAgF;QAChF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEtC,IAAI,CAAC;YACD,MAAM,OAAO,CAAC;QAClB,CAAC;gBAAS,CAAC;YACP,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC/C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC3C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;IACL,CAAC;CACJ;AAjDD,4CAiDC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface QuotaInfo {
|
|
2
|
+
remainingFraction: number;
|
|
3
|
+
resetTime: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ModelQuota {
|
|
6
|
+
label: string;
|
|
7
|
+
model: string;
|
|
8
|
+
quotaInfo?: QuotaInfo;
|
|
9
|
+
}
|
|
10
|
+
export interface UserStatusData {
|
|
11
|
+
clientModelConfigs?: ModelQuota[];
|
|
12
|
+
}
|
|
13
|
+
export declare class QuotaService {
|
|
14
|
+
private cachedPort;
|
|
15
|
+
private cachedCsrfToken;
|
|
16
|
+
private cachedPid;
|
|
17
|
+
private getUnixProcessInfo;
|
|
18
|
+
private getListeningPorts;
|
|
19
|
+
private requestApi;
|
|
20
|
+
fetchQuota(retryCount?: number): Promise<ModelQuota[]>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.QuotaService = void 0;
|
|
37
|
+
const logger_1 = require("../utils/logger");
|
|
38
|
+
const child_process_1 = require("child_process");
|
|
39
|
+
const util_1 = require("util");
|
|
40
|
+
const https = __importStar(require("https"));
|
|
41
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
42
|
+
class QuotaService {
|
|
43
|
+
cachedPort = null;
|
|
44
|
+
cachedCsrfToken = null;
|
|
45
|
+
cachedPid = null;
|
|
46
|
+
async getUnixProcessInfo() {
|
|
47
|
+
try {
|
|
48
|
+
// macOS
|
|
49
|
+
const { stdout } = await execAsync('pgrep -fl language_server');
|
|
50
|
+
const lines = stdout.split('\n');
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
if (line.includes('--csrf_token')) {
|
|
53
|
+
const parts = line.trim().split(/\s+/);
|
|
54
|
+
const pid = parseInt(parts[0], 10);
|
|
55
|
+
const cmd = line.substring(parts[0].length).trim();
|
|
56
|
+
const tokenMatch = cmd.match(/--csrf_token[=\s]+([a-zA-Z0-9\-]+)/);
|
|
57
|
+
if (pid && tokenMatch && tokenMatch[1]) {
|
|
58
|
+
return { pid, csrf_token: tokenMatch[1] };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
logger_1.logger.error('Failed to get process info:', e);
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
async getListeningPorts(pid) {
|
|
69
|
+
const ports = [];
|
|
70
|
+
try {
|
|
71
|
+
// macOS
|
|
72
|
+
const { stdout } = await execAsync(`lsof -nP -a -iTCP -sTCP:LISTEN -p ${pid}`);
|
|
73
|
+
const regex = new RegExp(`^\\S+\\s+${pid}\\s+.*?(?:TCP|UDP)\\s+(?:\\*|[\\d.]+|\\[[\\da-f:]+\\]):(\\d+)\\s+\\(LISTEN\\)`, 'gim');
|
|
74
|
+
let match;
|
|
75
|
+
while ((match = regex.exec(stdout)) !== null) {
|
|
76
|
+
const port = parseInt(match[1], 10);
|
|
77
|
+
if (!ports.includes(port)) {
|
|
78
|
+
ports.push(port);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
logger_1.logger.error(`Failed to get ports for pid ${pid}:`, e);
|
|
84
|
+
}
|
|
85
|
+
return ports;
|
|
86
|
+
}
|
|
87
|
+
requestApi(port, csrfToken) {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const data = JSON.stringify({
|
|
90
|
+
metadata: { ideName: 'antigravity', extensionName: 'antigravity', locale: 'en' }
|
|
91
|
+
});
|
|
92
|
+
const options = {
|
|
93
|
+
hostname: '127.0.0.1',
|
|
94
|
+
port: port,
|
|
95
|
+
path: '/exa.language_server_pb.LanguageServerService/GetUserStatus',
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
'Content-Length': Buffer.byteLength(data),
|
|
100
|
+
'Connect-Protocol-Version': '1',
|
|
101
|
+
'X-Codeium-Csrf-Token': csrfToken,
|
|
102
|
+
},
|
|
103
|
+
// Safe: targets loopback (127.0.0.1) only — Antigravity's local gRPC endpoint uses a self-signed cert
|
|
104
|
+
rejectUnauthorized: false,
|
|
105
|
+
timeout: 2000,
|
|
106
|
+
};
|
|
107
|
+
const req = https.request(options, res => {
|
|
108
|
+
let body = '';
|
|
109
|
+
res.on('data', chunk => body += chunk);
|
|
110
|
+
res.on('end', () => {
|
|
111
|
+
if (res.statusCode !== 200) {
|
|
112
|
+
return reject(new Error(`HTTP ${res.statusCode}`));
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const parsed = JSON.parse(body);
|
|
116
|
+
const cascadeData = parsed?.userStatus?.cascadeModelConfigData;
|
|
117
|
+
const rawConfigs = cascadeData?.clientModelConfigs || [];
|
|
118
|
+
const configs = rawConfigs.map((c) => {
|
|
119
|
+
const label = c.label || c.displayName || c.modelName || '';
|
|
120
|
+
const model = c.modelOrAlias?.model || c.model || c.modelId || '';
|
|
121
|
+
const qi = c.quotaInfo || c.quota || c.usageInfo;
|
|
122
|
+
const quotaInfo = qi ? {
|
|
123
|
+
remainingFraction: parseFloat(qi.remainingFraction ?? qi.remaining ?? 0),
|
|
124
|
+
resetTime: qi.resetTime || qi.resetAt || '',
|
|
125
|
+
} : undefined;
|
|
126
|
+
return { label, model, quotaInfo };
|
|
127
|
+
});
|
|
128
|
+
resolve({ clientModelConfigs: configs });
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
reject(new Error('Invalid JSON response'));
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
req.on('error', reject);
|
|
136
|
+
req.on('timeout', () => {
|
|
137
|
+
req.destroy();
|
|
138
|
+
reject(new Error('Request timeout'));
|
|
139
|
+
});
|
|
140
|
+
req.write(data);
|
|
141
|
+
req.end();
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
async fetchQuota(retryCount = 0) {
|
|
145
|
+
let processInfo = await this.getUnixProcessInfo();
|
|
146
|
+
if (!processInfo) {
|
|
147
|
+
logger_1.logger.error('No language_server process found.');
|
|
148
|
+
return [];
|
|
149
|
+
}
|
|
150
|
+
const { pid, csrf_token } = processInfo;
|
|
151
|
+
// If PID or Token changed, invalidate cache
|
|
152
|
+
if (this.cachedPid !== pid || this.cachedCsrfToken !== csrf_token) {
|
|
153
|
+
this.cachedPort = null;
|
|
154
|
+
this.cachedPid = pid;
|
|
155
|
+
this.cachedCsrfToken = csrf_token;
|
|
156
|
+
}
|
|
157
|
+
let targetPort = this.cachedPort;
|
|
158
|
+
if (!targetPort) {
|
|
159
|
+
const ports = await this.getListeningPorts(pid);
|
|
160
|
+
for (const port of ports) {
|
|
161
|
+
try {
|
|
162
|
+
const data = await this.requestApi(port, csrf_token);
|
|
163
|
+
targetPort = port;
|
|
164
|
+
this.cachedPort = port;
|
|
165
|
+
return data.clientModelConfigs || [];
|
|
166
|
+
}
|
|
167
|
+
catch (e) {
|
|
168
|
+
continue; // try next port
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
try {
|
|
174
|
+
const data = await this.requestApi(targetPort, csrf_token);
|
|
175
|
+
return data.clientModelConfigs || [];
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
// cache might be invalid — retry once with fresh port scan
|
|
179
|
+
this.cachedPort = null;
|
|
180
|
+
if (retryCount < 1) {
|
|
181
|
+
return this.fetchQuota(retryCount + 1);
|
|
182
|
+
}
|
|
183
|
+
logger_1.logger.error('fetchQuota failed after retry:', e);
|
|
184
|
+
return [];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return [];
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.QuotaService = QuotaService;
|
|
191
|
+
//# sourceMappingURL=quotaService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quotaService.js","sourceRoot":"","sources":["../../src/services/quotaService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { ExtractionMode } from '../utils/config';
|
|
2
|
+
import { CdpService } from './cdpService';
|
|
3
|
+
/** Lean DOM selectors for response extraction */
|
|
4
|
+
export declare const RESPONSE_SELECTORS: {
|
|
5
|
+
/** Scored selector approach for extracting response text.
|
|
6
|
+
* Tie-breaking: newest wins (first found in reverse iteration).
|
|
7
|
+
* DOM is normal order: index 0 = oldest, N-1 = newest.
|
|
8
|
+
* Reverse iteration (N-1→0) visits newest first; strict > keeps it. */
|
|
9
|
+
RESPONSE_TEXT: string;
|
|
10
|
+
/** Stop button detection via tooltip-id + text fallback */
|
|
11
|
+
STOP_BUTTON: string;
|
|
12
|
+
/** Check if planning dialog (Open/Proceed buttons) is active */
|
|
13
|
+
PLANNING_ACTIVE: string;
|
|
14
|
+
/** Click stop button via tooltip-id + text fallback */
|
|
15
|
+
CLICK_STOP_BUTTON: string;
|
|
16
|
+
/** Diagnostic: dump ALL candidate text nodes with filter classification */
|
|
17
|
+
DUMP_ALL_TEXTS: string;
|
|
18
|
+
/** Extract process log entries (activity messages + tool output) from DOM */
|
|
19
|
+
PROCESS_LOGS: string;
|
|
20
|
+
/** Combined poll script — stop button + quota error + legacy text in one CDP call */
|
|
21
|
+
COMBINED_POLL: string;
|
|
22
|
+
/** Quota error detection — text-based h3 span match first, class-based fallback second */
|
|
23
|
+
QUOTA_ERROR: string;
|
|
24
|
+
/** Structured DOM extraction — walks DOM to produce typed segment array */
|
|
25
|
+
RESPONSE_STRUCTURED: string;
|
|
26
|
+
/** One-shot DOM diagnostic — dumps DOM structure around activity areas */
|
|
27
|
+
DOM_DIAGNOSTIC: string;
|
|
28
|
+
};
|
|
29
|
+
/** Response generation phases */
|
|
30
|
+
export type ResponsePhase = 'waiting' | 'thinking' | 'generating' | 'complete' | 'timeout' | 'quotaReached';
|
|
31
|
+
export interface ResponseMonitorOptions {
|
|
32
|
+
/** CDP service instance */
|
|
33
|
+
cdpService: CdpService;
|
|
34
|
+
/** Poll interval in ms (default: 2000) */
|
|
35
|
+
pollIntervalMs?: number;
|
|
36
|
+
/** Max monitoring duration in ms (default: 300000) */
|
|
37
|
+
maxDurationMs?: number;
|
|
38
|
+
/** Consecutive stop-gone confirmations needed (default: 3) */
|
|
39
|
+
stopGoneConfirmCount?: number;
|
|
40
|
+
/** Extraction mode: 'legacy' uses innerText, 'structured' uses DOM segment extraction */
|
|
41
|
+
extractionMode?: ExtractionMode;
|
|
42
|
+
/** Text update callback */
|
|
43
|
+
onProgress?: (text: string) => void;
|
|
44
|
+
/** Generation complete callback. Meta.source indicates whether text is already Telegram HTML (structured) or plain (legacy). */
|
|
45
|
+
onComplete?: (finalText: string, meta?: {
|
|
46
|
+
source: 'structured' | 'legacy';
|
|
47
|
+
}) => void;
|
|
48
|
+
/** Timeout callback */
|
|
49
|
+
onTimeout?: (lastText: string) => void;
|
|
50
|
+
/** Phase change callback */
|
|
51
|
+
onPhaseChange?: (phase: ResponsePhase, text: string | null) => void;
|
|
52
|
+
/** Process log update callback (activity messages + tool output) */
|
|
53
|
+
onProcessLog?: (text: string) => void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Lean AI response monitor.
|
|
57
|
+
*
|
|
58
|
+
* Each poll makes exactly 3 CDP calls: stop button, quota, text extraction.
|
|
59
|
+
* Completion: stop button gone N consecutive times -> complete.
|
|
60
|
+
* Simple baseline suppression via string comparison.
|
|
61
|
+
* NO network event subscription.
|
|
62
|
+
*/
|
|
63
|
+
export declare class ResponseMonitor {
|
|
64
|
+
private readonly cdpService;
|
|
65
|
+
private readonly pollIntervalMs;
|
|
66
|
+
private readonly maxDurationMs;
|
|
67
|
+
private readonly stopGoneConfirmCount;
|
|
68
|
+
private readonly extractionMode;
|
|
69
|
+
private readonly onProgress?;
|
|
70
|
+
private readonly onComplete?;
|
|
71
|
+
private readonly onTimeout?;
|
|
72
|
+
private readonly onPhaseChange?;
|
|
73
|
+
private readonly onProcessLog?;
|
|
74
|
+
private pollTimer;
|
|
75
|
+
private timeoutTimer;
|
|
76
|
+
private isRunning;
|
|
77
|
+
private lastText;
|
|
78
|
+
private baselineText;
|
|
79
|
+
private generationStarted;
|
|
80
|
+
private currentPhase;
|
|
81
|
+
private stopGoneCount;
|
|
82
|
+
private quotaDetected;
|
|
83
|
+
private seenProcessLogKeys;
|
|
84
|
+
private structuredDiagLogged;
|
|
85
|
+
private lastExtractionSource;
|
|
86
|
+
constructor(options: ResponseMonitorOptions);
|
|
87
|
+
/** Start monitoring */
|
|
88
|
+
start(): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Start monitoring in passive mode.
|
|
91
|
+
* Same as start() but with generationStarted=true, so text changes
|
|
92
|
+
* are detected immediately without waiting for the stop button to appear.
|
|
93
|
+
* Used when joining an existing session that may already be generating.
|
|
94
|
+
*/
|
|
95
|
+
startPassive(): Promise<void>;
|
|
96
|
+
/** Internal initialization shared between start() and startPassive() */
|
|
97
|
+
private initMonitoring;
|
|
98
|
+
/** Stop monitoring */
|
|
99
|
+
stop(): Promise<void>;
|
|
100
|
+
/** Get current phase */
|
|
101
|
+
getPhase(): ResponsePhase;
|
|
102
|
+
/** Whether quota error was detected */
|
|
103
|
+
getQuotaDetected(): boolean;
|
|
104
|
+
/** Whether monitoring is active */
|
|
105
|
+
isActive(): boolean;
|
|
106
|
+
/** Get last extracted text */
|
|
107
|
+
getLastText(): string | null;
|
|
108
|
+
/** Get last extraction source (structured = HTML, legacy = plain text) */
|
|
109
|
+
getLastExtractionSource(): 'structured' | 'legacy' | null;
|
|
110
|
+
/** Click the stop button to interrupt LLM generation */
|
|
111
|
+
clickStopButton(): Promise<{
|
|
112
|
+
ok: boolean;
|
|
113
|
+
method?: string;
|
|
114
|
+
error?: string;
|
|
115
|
+
}>;
|
|
116
|
+
private setPhase;
|
|
117
|
+
private schedulePoll;
|
|
118
|
+
private buildEvaluateParams;
|
|
119
|
+
/**
|
|
120
|
+
* Emit new process log entries, deduplicating against previously seen keys.
|
|
121
|
+
*/
|
|
122
|
+
private emitNewProcessLogs;
|
|
123
|
+
/**
|
|
124
|
+
* Single poll cycle.
|
|
125
|
+
* - Legacy mode: 4 CDP calls (stop, quota, text, process logs).
|
|
126
|
+
* - Structured mode: 3-4 CDP calls (stop, quota, structured; legacy text on fallback).
|
|
127
|
+
*/
|
|
128
|
+
private poll;
|
|
129
|
+
}
|