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,340 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structured DOM extraction for Antigravity assistant responses.
|
|
4
|
+
*
|
|
5
|
+
* Provides two functions:
|
|
6
|
+
* - extractAssistantSegmentsPayloadScript() — Returns a CDP-evaluatable IIFE string
|
|
7
|
+
* that walks the DOM and returns a typed segment array.
|
|
8
|
+
* - classifyAssistantSegments(payload) — Node.js-side classifier that converts
|
|
9
|
+
* the raw payload into finalOutputText, activityLines, feedback, and diagnostics.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.classifyAssistantSegments = classifyAssistantSegments;
|
|
13
|
+
exports.extractAssistantSegmentsPayloadScript = extractAssistantSegmentsPayloadScript;
|
|
14
|
+
const htmlToTelegramMarkdown_1 = require("../utils/htmlToTelegramMarkdown");
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// classifyAssistantSegments — Node.js side
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/**
|
|
19
|
+
* Classify an AssistantDomSegmentPayload into output text, activity lines,
|
|
20
|
+
* feedback, and diagnostics.
|
|
21
|
+
*
|
|
22
|
+
* If the payload is invalid, returns a legacy-fallback result with empty fields.
|
|
23
|
+
*/
|
|
24
|
+
function classifyAssistantSegments(payload) {
|
|
25
|
+
if (!isValidPayload(payload)) {
|
|
26
|
+
return {
|
|
27
|
+
finalOutputText: '',
|
|
28
|
+
activityLines: [],
|
|
29
|
+
feedback: [],
|
|
30
|
+
diagnostics: {
|
|
31
|
+
source: 'legacy-fallback',
|
|
32
|
+
segmentCounts: {},
|
|
33
|
+
fallbackReason: 'invalid-payload',
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const typed = payload;
|
|
38
|
+
const segments = typed.segments;
|
|
39
|
+
const bodyTexts = [];
|
|
40
|
+
const activityLines = [];
|
|
41
|
+
const feedbackTexts = [];
|
|
42
|
+
const segmentCounts = {};
|
|
43
|
+
for (const seg of segments) {
|
|
44
|
+
segmentCounts[seg.kind] = (segmentCounts[seg.kind] ?? 0) + 1;
|
|
45
|
+
switch (seg.kind) {
|
|
46
|
+
case 'assistant-body':
|
|
47
|
+
if (seg.text && seg.text.trim()) {
|
|
48
|
+
bodyTexts.push(seg.text);
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case 'thinking':
|
|
52
|
+
case 'tool-call':
|
|
53
|
+
case 'tool-result':
|
|
54
|
+
if (seg.text && seg.text.trim()) {
|
|
55
|
+
activityLines.push(seg.text.trim());
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
case 'feedback':
|
|
59
|
+
if (seg.text && seg.text.trim()) {
|
|
60
|
+
feedbackTexts.push(seg.text.trim());
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Join body segments and apply HTML-to-Markdown conversion
|
|
66
|
+
const rawBody = bodyTexts.join('\n\n');
|
|
67
|
+
const finalOutputText = (0, htmlToTelegramMarkdown_1.htmlToTelegramHtml)(rawBody);
|
|
68
|
+
return {
|
|
69
|
+
finalOutputText,
|
|
70
|
+
activityLines,
|
|
71
|
+
feedback: feedbackTexts,
|
|
72
|
+
diagnostics: {
|
|
73
|
+
source: 'dom-structured',
|
|
74
|
+
segmentCounts,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// extractAssistantSegmentsPayloadScript — CDP IIFE
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Return a CDP-evaluatable IIFE string that walks the Antigravity DOM
|
|
83
|
+
* and returns an AssistantDomSegmentPayload object.
|
|
84
|
+
*
|
|
85
|
+
* The IIFE extracts:
|
|
86
|
+
* - assistant-body segments (innerHTML for Markdown conversion)
|
|
87
|
+
* - thinking segments (from <details> summary text)
|
|
88
|
+
* - tool-call / tool-result segments (from <details> content)
|
|
89
|
+
* - feedback segments (Good/Bad buttons)
|
|
90
|
+
*/
|
|
91
|
+
function extractAssistantSegmentsPayloadScript() {
|
|
92
|
+
// The IIFE is a plain string evaluated in the browser context via CDP.
|
|
93
|
+
// It MUST NOT reference any Node.js module or import.
|
|
94
|
+
//
|
|
95
|
+
// Uses the same multi-selector strategy as RESPONSE_TEXT to find
|
|
96
|
+
// assistant content nodes in Antigravity's DOM.
|
|
97
|
+
return `(() => {
|
|
98
|
+
var panel = document.querySelector('.antigravity-agent-side-panel');
|
|
99
|
+
var scope = panel || document;
|
|
100
|
+
|
|
101
|
+
// Same selectors as RESPONSE_TEXT — ordered by specificity
|
|
102
|
+
var selectors = [
|
|
103
|
+
'.rendered-markdown',
|
|
104
|
+
'.leading-relaxed.select-text',
|
|
105
|
+
'.flex.flex-col.gap-y-3',
|
|
106
|
+
'[data-message-author-role="assistant"]',
|
|
107
|
+
'[data-message-role="assistant"]',
|
|
108
|
+
'[class*="assistant-message"]',
|
|
109
|
+
'[class*="message-content"]',
|
|
110
|
+
'[class*="markdown-body"]',
|
|
111
|
+
'.prose',
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
var looksLikeActivityLog = function(text) {
|
|
115
|
+
var normalized = (text || '').trim().toLowerCase();
|
|
116
|
+
if (!normalized) return false;
|
|
117
|
+
if (/^(?:analy[sz]ing|reading|writing|running|searching|planning|thinking|processing|loading|executing|testing|debugging|fetching|connecting|creating|updating|deleting|installing|building|compiling|deploying|checking|scanning|parsing|resolving|downloading|uploading|analyzed|read|wrote|ran|created|updated|deleted|fetched|built|compiled|installed|resolved|downloaded|connected)\\b/i.test(normalized) && normalized.length <= 220) return true;
|
|
118
|
+
if (/^initiating\\s/i.test(normalized) && normalized.length <= 500) return true;
|
|
119
|
+
if (/^thought for\\s/i.test(normalized) && normalized.length <= 500) return true;
|
|
120
|
+
return false;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
var looksLikeFeedbackFooter = function(text) {
|
|
124
|
+
var normalized = (text || '').trim().toLowerCase().replace(/\\s+/g, ' ');
|
|
125
|
+
return normalized === 'good bad' || normalized === 'good' || normalized === 'bad';
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
var looksLikeToolOutput = function(text) {
|
|
129
|
+
var first = (text || '').trim().split('\\n')[0] || '';
|
|
130
|
+
if (/^[a-z0-9._-]+\\s*\\/\\s*[a-z0-9._-]+$/i.test(first)) return true;
|
|
131
|
+
if (/^full output written to\\b/i.test(first)) return true;
|
|
132
|
+
if (/^output\\.[a-z0-9._-]+(?:#l\\d+(?:-\\d+)?)?$/i.test(first)) return true;
|
|
133
|
+
return false;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
var isInsideExcludedContainer = function(node) {
|
|
137
|
+
if (node.closest('details')) return true;
|
|
138
|
+
if (node.closest('[class*="feedback"], footer')) return true;
|
|
139
|
+
if (node.closest('.notify-user-container')) return true;
|
|
140
|
+
if (node.closest('[role="dialog"]')) return true;
|
|
141
|
+
return false;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
var segments = [];
|
|
145
|
+
var seen = new Set();
|
|
146
|
+
var bodyFound = false;
|
|
147
|
+
|
|
148
|
+
// Pass 1: Find assistant body — last non-excluded content node (recency first)
|
|
149
|
+
var combinedSelector = selectors.join(', ');
|
|
150
|
+
var nodes = scope.querySelectorAll(combinedSelector);
|
|
151
|
+
|
|
152
|
+
for (var i = nodes.length - 1; i >= 0; i--) {
|
|
153
|
+
var node = nodes[i];
|
|
154
|
+
if (!node || seen.has(node)) continue;
|
|
155
|
+
seen.add(node);
|
|
156
|
+
if (isInsideExcludedContainer(node)) continue;
|
|
157
|
+
|
|
158
|
+
var text = (node.innerText || node.textContent || '').replace(/\\r/g, '').trim();
|
|
159
|
+
if (!text || text.length < 2) continue;
|
|
160
|
+
if (looksLikeActivityLog(text)) continue;
|
|
161
|
+
if (looksLikeFeedbackFooter(text)) continue;
|
|
162
|
+
if (looksLikeToolOutput(text)) continue;
|
|
163
|
+
|
|
164
|
+
// This is the assistant body — normalize code blocks then extract innerHTML
|
|
165
|
+
// AG wraps code in <pre><div class="..."> with a header div for language label,
|
|
166
|
+
// embedded <style> tags, and code-line divs — NOT standard <pre><code>.
|
|
167
|
+
// We normalize to <pre><code> for htmlToTelegramHtml.
|
|
168
|
+
var clone = node.cloneNode(true);
|
|
169
|
+
var pres = clone.querySelectorAll('pre');
|
|
170
|
+
for (var pi = 0; pi < pres.length; pi++) {
|
|
171
|
+
var pre = pres[pi];
|
|
172
|
+
// Extract language from header div (font-sans text-sm class)
|
|
173
|
+
var langDiv = pre.querySelector('.font-sans.text-sm, [class*="text-sm"][class*="opacity"]');
|
|
174
|
+
var lang = langDiv ? (langDiv.textContent || '').trim() : '';
|
|
175
|
+
|
|
176
|
+
// Remove <style> tags before extracting text (AG injects code-block CSS)
|
|
177
|
+
var styles = pre.querySelectorAll('style');
|
|
178
|
+
for (var si = 0; si < styles.length; si++) {
|
|
179
|
+
styles[si].parentNode.removeChild(styles[si]);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Remove the header bar (language label + copy button)
|
|
183
|
+
var headerBar = pre.querySelector('[class*="rounded-t"][class*="border-b"]');
|
|
184
|
+
if (headerBar) headerBar.parentNode.removeChild(headerBar);
|
|
185
|
+
|
|
186
|
+
// Extract code text: prefer code-line elements for reliable newlines
|
|
187
|
+
var codeLines = pre.querySelectorAll('.code-line, [class*="code-line"]');
|
|
188
|
+
var codeText;
|
|
189
|
+
if (codeLines.length > 0) {
|
|
190
|
+
var lineTexts = [];
|
|
191
|
+
for (var cli = 0; cli < codeLines.length; cli++) {
|
|
192
|
+
lineTexts.push(codeLines[cli].textContent || '');
|
|
193
|
+
}
|
|
194
|
+
codeText = lineTexts.join('\\n');
|
|
195
|
+
} else {
|
|
196
|
+
// Fallback: use innerText of cleaned pre
|
|
197
|
+
codeText = (pre.innerText || '').trim();
|
|
198
|
+
if (lang && codeText.startsWith(lang)) {
|
|
199
|
+
codeText = codeText.slice(lang.length).trim();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Remove trailing "Copy" or clipboard button text
|
|
203
|
+
codeText = codeText.replace(/\\nCopy$/i, '').replace(/\\ncopy code$/i, '').trim();
|
|
204
|
+
// Replace with simple <pre><code>
|
|
205
|
+
var newPre = document.createElement('pre');
|
|
206
|
+
var newCode = document.createElement('code');
|
|
207
|
+
if (lang) newCode.setAttribute('class', 'language-' + lang);
|
|
208
|
+
newCode.textContent = codeText;
|
|
209
|
+
newPre.appendChild(newCode);
|
|
210
|
+
pre.parentNode.replaceChild(newPre, pre);
|
|
211
|
+
}
|
|
212
|
+
// Also remove any top-level <style> tags from the clone
|
|
213
|
+
var topStyles = clone.querySelectorAll('style');
|
|
214
|
+
for (var tsi = 0; tsi < topStyles.length; tsi++) {
|
|
215
|
+
topStyles[tsi].parentNode.removeChild(topStyles[tsi]);
|
|
216
|
+
}
|
|
217
|
+
var bodyHtml = clone.innerHTML;
|
|
218
|
+
if (bodyHtml && bodyHtml.trim()) {
|
|
219
|
+
segments.push({
|
|
220
|
+
kind: 'assistant-body',
|
|
221
|
+
text: bodyHtml,
|
|
222
|
+
role: 'assistant',
|
|
223
|
+
messageIndex: 0,
|
|
224
|
+
domPath: 'multi-selector'
|
|
225
|
+
});
|
|
226
|
+
bodyFound = true;
|
|
227
|
+
break; // Only take the last (most recent) output node
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Pass 2: Extract thinking + tool segments from <details>
|
|
232
|
+
var details = scope.querySelectorAll('details');
|
|
233
|
+
for (var di = 0; di < details.length; di++) {
|
|
234
|
+
var detail = details[di];
|
|
235
|
+
var summary = detail.querySelector('summary');
|
|
236
|
+
if (summary) {
|
|
237
|
+
var summaryText = (summary.textContent || '').trim();
|
|
238
|
+
if (summaryText) {
|
|
239
|
+
segments.push({
|
|
240
|
+
kind: 'thinking',
|
|
241
|
+
text: summaryText,
|
|
242
|
+
role: 'assistant',
|
|
243
|
+
messageIndex: 0,
|
|
244
|
+
domPath: 'details:nth(' + di + ') summary'
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Extract child content (tool-call / tool-result) inside <details>
|
|
249
|
+
var children = detail.children;
|
|
250
|
+
for (var ci = 0; ci < children.length; ci++) {
|
|
251
|
+
var child = children[ci];
|
|
252
|
+
if (child.tagName === 'SUMMARY' || child.tagName === 'STYLE') continue;
|
|
253
|
+
var childText = (child.innerText || child.textContent || '').trim();
|
|
254
|
+
if (!childText || childText.length < 2) continue;
|
|
255
|
+
var childKind = looksLikeToolOutput(childText) ? 'tool-result' : 'tool-call';
|
|
256
|
+
segments.push({
|
|
257
|
+
kind: childKind,
|
|
258
|
+
text: childText.slice(0, 300),
|
|
259
|
+
role: 'assistant',
|
|
260
|
+
messageIndex: 0,
|
|
261
|
+
domPath: 'details:nth(' + di + ') child:nth(' + ci + ')'
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Pass 2.5: Broad activity scan - leaf-ish elements with activity-like text
|
|
267
|
+
// Uses querySelectorAll('*') to find activity nodes that don't match content
|
|
268
|
+
// selectors (e.g. "Analyzed package.json#L1-75" inside <div class="flex flex-row">).
|
|
269
|
+
// Excludes nodes inside response body containers to avoid false positives.
|
|
270
|
+
// Uses ancestor dedup to prevent capturing both parent and child activity nodes.
|
|
271
|
+
var actSeen = new Set();
|
|
272
|
+
var allEls = scope.querySelectorAll('*');
|
|
273
|
+
for (var ai = 0; ai < allEls.length; ai++) {
|
|
274
|
+
var el = allEls[ai];
|
|
275
|
+
if (el.children.length > 3) continue; // leaf-ish only
|
|
276
|
+
if (seen.has(el)) continue; // already captured in Pass 1/2
|
|
277
|
+
if (isInsideExcludedContainer(el)) continue;
|
|
278
|
+
// Skip nodes inside response body containers (prevents capturing inline words)
|
|
279
|
+
if (el.closest('.leading-relaxed, .rendered-markdown, .prose, .animate-markdown, [data-message-role], [data-message-author-role]')) continue;
|
|
280
|
+
var aText = (el.innerText || el.textContent || '').replace(/\\r/g, '').trim();
|
|
281
|
+
if (!aText || aText.length < 4 || aText.length > 300) continue;
|
|
282
|
+
if (looksLikeActivityLog(aText) || looksLikeToolOutput(aText)) {
|
|
283
|
+
// Ancestor dedup: skip if a parent was already captured as activity
|
|
284
|
+
var dup = false;
|
|
285
|
+
var p = el.parentElement;
|
|
286
|
+
while (p && p !== scope) {
|
|
287
|
+
if (actSeen.has(p)) { dup = true; break; }
|
|
288
|
+
p = p.parentElement;
|
|
289
|
+
}
|
|
290
|
+
if (dup) continue;
|
|
291
|
+
actSeen.add(el);
|
|
292
|
+
var aKind = looksLikeToolOutput(aText) ? 'tool-result' : 'tool-call';
|
|
293
|
+
segments.push({
|
|
294
|
+
kind: aKind,
|
|
295
|
+
text: aText.slice(0, 300),
|
|
296
|
+
role: 'assistant',
|
|
297
|
+
messageIndex: 0,
|
|
298
|
+
domPath: 'activity-scan:nth(' + ai + ')'
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Pass 3: Extract feedback buttons
|
|
304
|
+
var feedbackBtns = scope.querySelectorAll('[class*="feedback"] button, footer button');
|
|
305
|
+
for (var fi = 0; fi < feedbackBtns.length; fi++) {
|
|
306
|
+
var btnText = (feedbackBtns[fi].textContent || '').trim();
|
|
307
|
+
if (btnText === 'Good' || btnText === 'Bad') {
|
|
308
|
+
segments.push({
|
|
309
|
+
kind: 'feedback',
|
|
310
|
+
text: btnText,
|
|
311
|
+
role: 'assistant',
|
|
312
|
+
messageIndex: 0,
|
|
313
|
+
domPath: 'feedback button.' + btnText.toLowerCase()
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (!bodyFound && segments.length === 0) return null;
|
|
319
|
+
|
|
320
|
+
return {
|
|
321
|
+
source: 'dom-structured',
|
|
322
|
+
extractedAt: Date.now(),
|
|
323
|
+
segments: segments
|
|
324
|
+
};
|
|
325
|
+
})()`;
|
|
326
|
+
}
|
|
327
|
+
// ---------------------------------------------------------------------------
|
|
328
|
+
// Helpers
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
function isValidPayload(value) {
|
|
331
|
+
if (!value || typeof value !== 'object')
|
|
332
|
+
return false;
|
|
333
|
+
const obj = value;
|
|
334
|
+
if (obj.source !== 'dom-structured')
|
|
335
|
+
return false;
|
|
336
|
+
if (!Array.isArray(obj.segments))
|
|
337
|
+
return false;
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=assistantDomExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assistantDomExtractor.js","sourceRoot":"","sources":["../../src/services/assistantDomExtractor.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA2CH,8DA2DC;AAgBD,sFA2OC;AA/VD,4EAAqE;AA+BrE,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,OAAgB;IACtD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO;YACH,eAAe,EAAE,EAAE;YACnB,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE,EAAE;YACZ,WAAW,EAAE;gBACT,MAAM,EAAE,iBAAiB;gBACzB,aAAa,EAAE,EAAE;gBACjB,cAAc,EAAE,iBAAiB;aACpC;SACJ,CAAC;IACN,CAAC;IAED,MAAM,KAAK,GAAG,OAAqC,CAAC;IACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAEhC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,MAAM,aAAa,GAA2B,EAAE,CAAC;IAEjD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAE7D,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,gBAAgB;gBACjB,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9B,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACV,KAAK,UAAU,CAAC;YAChB,KAAK,WAAW,CAAC;YACjB,KAAK,aAAa;gBACd,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9B,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM;YACV,KAAK,UAAU;gBACX,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9B,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxC,CAAC;gBACD,MAAM;QACd,CAAC;IACL,CAAC;IAED,2DAA2D;IAC3D,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,IAAA,2CAAkB,EAAC,OAAO,CAAC,CAAC;IAEpD,OAAO;QACH,eAAe;QACf,aAAa;QACb,QAAQ,EAAE,aAAa;QACvB,WAAW,EAAE;YACT,MAAM,EAAE,gBAAgB;YACxB,aAAa;SAChB;KACJ,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAgB,qCAAqC;IACjD,uEAAuE;IACvE,sDAAsD;IACtD,EAAE;IACF,iEAAiE;IACjE,gDAAgD;IAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoON,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,cAAc,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,GAAG,CAAC,MAAM,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type AutoAcceptAction = 'on' | 'off' | 'status';
|
|
2
|
+
export interface AutoAcceptCommandResult {
|
|
3
|
+
success: boolean;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
changed: boolean;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class AutoAcceptService {
|
|
9
|
+
private enabled;
|
|
10
|
+
constructor(initialEnabled?: boolean);
|
|
11
|
+
isEnabled(): boolean;
|
|
12
|
+
handle(rawAction?: string): AutoAcceptCommandResult;
|
|
13
|
+
private normalizeAction;
|
|
14
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AutoAcceptService = void 0;
|
|
4
|
+
const i18n_1 = require("../utils/i18n");
|
|
5
|
+
class AutoAcceptService {
|
|
6
|
+
enabled;
|
|
7
|
+
constructor(initialEnabled = false) {
|
|
8
|
+
this.enabled = initialEnabled;
|
|
9
|
+
}
|
|
10
|
+
isEnabled() {
|
|
11
|
+
return this.enabled;
|
|
12
|
+
}
|
|
13
|
+
handle(rawAction) {
|
|
14
|
+
const action = this.normalizeAction(rawAction);
|
|
15
|
+
if (!action) {
|
|
16
|
+
return {
|
|
17
|
+
success: false,
|
|
18
|
+
enabled: this.enabled,
|
|
19
|
+
changed: false,
|
|
20
|
+
message: (0, i18n_1.t)('⚠️ Invalid argument. Usage: `/autoaccept [on/off/status]`'),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (action === 'status') {
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
enabled: this.enabled,
|
|
27
|
+
changed: false,
|
|
28
|
+
message: (0, i18n_1.t)(`⚙️ Auto-accept mode: **${this.enabled ? 'ON' : 'OFF'}**`),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
if (action === 'on') {
|
|
32
|
+
if (this.enabled) {
|
|
33
|
+
return {
|
|
34
|
+
success: true,
|
|
35
|
+
enabled: true,
|
|
36
|
+
changed: false,
|
|
37
|
+
message: (0, i18n_1.t)('ℹ️ Auto-accept mode is already **ON**.'),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
this.enabled = true;
|
|
41
|
+
return {
|
|
42
|
+
success: true,
|
|
43
|
+
enabled: true,
|
|
44
|
+
changed: true,
|
|
45
|
+
message: (0, i18n_1.t)('✅ Auto-accept mode turned **ON**. Future dialogs will be auto-allowed.'),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (!this.enabled) {
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
enabled: false,
|
|
52
|
+
changed: false,
|
|
53
|
+
message: (0, i18n_1.t)('ℹ️ Auto-accept mode is already **OFF**.'),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
this.enabled = false;
|
|
57
|
+
return {
|
|
58
|
+
success: true,
|
|
59
|
+
enabled: false,
|
|
60
|
+
changed: true,
|
|
61
|
+
message: (0, i18n_1.t)('✅ Auto-accept mode turned **OFF**. Returned to manual approval.'),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
normalizeAction(rawAction) {
|
|
65
|
+
if (!rawAction || rawAction.trim().length === 0)
|
|
66
|
+
return 'status';
|
|
67
|
+
const normalized = rawAction.trim().toLowerCase();
|
|
68
|
+
if (['on', 'enable', 'enabled', 'true', '1'].includes(normalized)) {
|
|
69
|
+
return 'on';
|
|
70
|
+
}
|
|
71
|
+
if (['off', 'disable', 'disabled', 'false', '0'].includes(normalized)) {
|
|
72
|
+
return 'off';
|
|
73
|
+
}
|
|
74
|
+
if (['status', 'state', 'show'].includes(normalized)) {
|
|
75
|
+
return 'status';
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.AutoAcceptService = AutoAcceptService;
|
|
81
|
+
//# sourceMappingURL=autoAcceptService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autoAcceptService.js","sourceRoot":"","sources":["../../src/services/autoAcceptService.ts"],"names":[],"mappings":";;;AAAA,wCAAkC;AAWlC,MAAa,iBAAiB;IAClB,OAAO,CAAU;IAEzB,YAAY,iBAA0B,KAAK;QACvC,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC;IAClC,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,SAAkB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAA,QAAC,EAAC,2DAA2D,CAAC;aAC1E,CAAC;QACN,CAAC;QAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAA,QAAC,EAAC,0BAA0B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;aACxE,CAAC;QACN,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO;oBACH,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAA,QAAC,EAAC,wCAAwC,CAAC;iBACvD,CAAC;YACN,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAA,QAAC,EAAC,wEAAwE,CAAC;aACvF,CAAC;QACN,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAA,QAAC,EAAC,yCAAyC,CAAC;aACxD,CAAC;QACN,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAA,QAAC,EAAC,iEAAiE,CAAC;SAChF,CAAC;IACN,CAAC;IAEO,eAAe,CAAC,SAAkB;QACtC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEjE,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACnD,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAlFD,8CAkFC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Api } from 'grammy';
|
|
2
|
+
import { AutoAcceptService } from './autoAcceptService';
|
|
3
|
+
import { CdpConnectionPool } from './cdpConnectionPool';
|
|
4
|
+
import { CdpService } from './cdpService';
|
|
5
|
+
import { QuotaService } from './quotaService';
|
|
6
|
+
import { UserMessageInfo } from './userMessageDetector';
|
|
7
|
+
/** Represents a Telegram chat target: either a chat_id or chat_id + message_thread_id */
|
|
8
|
+
export interface TelegramChannel {
|
|
9
|
+
chatId: number | string;
|
|
10
|
+
threadId?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface CdpBridge {
|
|
13
|
+
pool: CdpConnectionPool;
|
|
14
|
+
quota: QuotaService;
|
|
15
|
+
autoAccept: AutoAcceptService;
|
|
16
|
+
lastActiveWorkspace: string | null;
|
|
17
|
+
lastActiveChannel: TelegramChannel | null;
|
|
18
|
+
approvalChannelByWorkspace: Map<string, TelegramChannel>;
|
|
19
|
+
approvalChannelBySession: Map<string, TelegramChannel>;
|
|
20
|
+
botApi: Api | null;
|
|
21
|
+
botToken: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function getCurrentChatTitle(cdp: CdpService): Promise<string | null>;
|
|
24
|
+
export declare function registerApprovalWorkspaceChannel(bridge: CdpBridge, projectName: string, channel: TelegramChannel): void;
|
|
25
|
+
export declare function registerApprovalSessionChannel(bridge: CdpBridge, projectName: string, sessionTitle: string, channel: TelegramChannel): void;
|
|
26
|
+
export declare function resolveApprovalChannelForCurrentChat(bridge: CdpBridge, projectName: string, currentChatTitle: string | null): TelegramChannel | null;
|
|
27
|
+
export declare function buildApprovalCustomId(action: 'approve' | 'always_allow' | 'deny', projectName: string, channelId?: string): string;
|
|
28
|
+
export declare function parseApprovalCustomId(customId: string): {
|
|
29
|
+
action: 'approve' | 'always_allow' | 'deny';
|
|
30
|
+
projectName: string | null;
|
|
31
|
+
channelId: string | null;
|
|
32
|
+
} | null;
|
|
33
|
+
export declare function buildPlanningCustomId(action: 'open' | 'proceed', projectName: string, channelId?: string): string;
|
|
34
|
+
export declare function parsePlanningCustomId(customId: string): {
|
|
35
|
+
action: 'open' | 'proceed';
|
|
36
|
+
projectName: string | null;
|
|
37
|
+
channelId: string | null;
|
|
38
|
+
} | null;
|
|
39
|
+
export declare function buildErrorPopupCustomId(action: 'dismiss' | 'copy_debug' | 'retry', projectName: string, channelId?: string): string;
|
|
40
|
+
export declare function parseErrorPopupCustomId(customId: string): {
|
|
41
|
+
action: 'dismiss' | 'copy_debug' | 'retry';
|
|
42
|
+
projectName: string | null;
|
|
43
|
+
channelId: string | null;
|
|
44
|
+
} | null;
|
|
45
|
+
export declare function initCdpBridge(autoApproveDefault: boolean): CdpBridge;
|
|
46
|
+
export declare function getCurrentCdp(bridge: CdpBridge): CdpService | null;
|
|
47
|
+
export declare function ensureApprovalDetector(bridge: CdpBridge, cdp: CdpService, projectName: string): void;
|
|
48
|
+
export declare function ensurePlanningDetector(bridge: CdpBridge, cdp: CdpService, projectName: string): void;
|
|
49
|
+
export declare function ensureErrorPopupDetector(bridge: CdpBridge, cdp: CdpService, projectName: string): void;
|
|
50
|
+
export declare function ensureUserMessageDetector(bridge: CdpBridge, cdp: CdpService, projectName: string, onUserMessage: (info: UserMessageInfo) => void): void;
|