promptbridge 1.0.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/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/functions/app.d.ts +2 -0
- package/dist/functions/app.d.ts.map +1 -0
- package/dist/functions/app.js +80 -0
- package/dist/functions/app.js.map +1 -0
- package/dist/functions/browser.d.ts +6 -0
- package/dist/functions/browser.d.ts.map +1 -0
- package/dist/functions/browser.js +116 -0
- package/dist/functions/browser.js.map +1 -0
- package/dist/functions/chatbot.d.ts +2 -0
- package/dist/functions/chatbot.d.ts.map +1 -0
- package/dist/functions/chatbot.js +178 -0
- package/dist/functions/chatbot.js.map +1 -0
- package/dist/functions/config.d.ts +17 -0
- package/dist/functions/config.d.ts.map +1 -0
- package/dist/functions/config.js +20 -0
- package/dist/functions/config.js.map +1 -0
- package/dist/functions/db.d.ts +3 -0
- package/dist/functions/db.d.ts.map +1 -0
- package/dist/functions/db.js +6 -0
- package/dist/functions/db.js.map +1 -0
- package/dist/functions/queue.d.ts +2 -0
- package/dist/functions/queue.d.ts.map +1 -0
- package/dist/functions/queue.js +92 -0
- package/dist/functions/queue.js.map +1 -0
- package/dist/functions/routes.d.ts +2 -0
- package/dist/functions/routes.d.ts.map +1 -0
- package/dist/functions/routes.js +182 -0
- package/dist/functions/routes.js.map +1 -0
- package/dist/functions/session.d.ts +3 -0
- package/dist/functions/session.d.ts.map +1 -0
- package/dist/functions/session.js +69 -0
- package/dist/functions/session.js.map +1 -0
- package/dist/functions/state.d.ts +3 -0
- package/dist/functions/state.d.ts.map +1 -0
- package/dist/functions/state.js +17 -0
- package/dist/functions/state.js.map +1 -0
- package/dist/functions/types.d.ts +30 -0
- package/dist/functions/types.d.ts.map +1 -0
- package/dist/functions/types.js +3 -0
- package/dist/functions/types.js.map +1 -0
- package/dist/functions/utils.d.ts +2 -0
- package/dist/functions/utils.d.ts.map +1 -0
- package/dist/functions/utils.js +21 -0
- package/dist/functions/utils.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
- package/public/assets/index-Bydik9KB.js +175 -0
- package/public/assets/index-DphI_DG8.css +1 -0
- package/public/index.html +14 -0
- package/public/vite.svg +1 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA,OAAO,CAAC,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/functions/app.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,QAAQ,QAAO,IA2E3B,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.setupApp = void 0;
|
|
7
|
+
const express_1 = __importDefault(require("express"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const state_1 = require("./state");
|
|
10
|
+
const routes_1 = require("./routes");
|
|
11
|
+
const db_1 = require("./db");
|
|
12
|
+
const setupApp = () => {
|
|
13
|
+
const API_KEY = process.env.API_KEY || 'promptbridge_secret_key';
|
|
14
|
+
// Native CORS handling
|
|
15
|
+
state_1.state.app.use((req, res, next) => {
|
|
16
|
+
res.header('Access-Control-Allow-Origin', '*'); // Allow all origins like localhost:5173
|
|
17
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
|
|
18
|
+
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
|
|
19
|
+
// Intercept OPTIONS method for preflight
|
|
20
|
+
if (req.method === 'OPTIONS') {
|
|
21
|
+
res.sendStatus(200);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
next();
|
|
25
|
+
});
|
|
26
|
+
state_1.state.app.use(express_1.default.json());
|
|
27
|
+
state_1.state.app.use(express_1.default.urlencoded({ extended: true }));
|
|
28
|
+
// Simple API Key Authorization Middleware
|
|
29
|
+
state_1.state.app.use(async (req, res, next) => {
|
|
30
|
+
// Allow health and status checks without API key if desired, but we'll protect /chat
|
|
31
|
+
if (req.path === '/chat') {
|
|
32
|
+
const authHeader = req.headers.authorization;
|
|
33
|
+
if (!authHeader) {
|
|
34
|
+
res.status(401).json({ error: 'Unauthorized', details: 'Missing API key' });
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const token = authHeader.replace(/^Bearer\s+/, '');
|
|
38
|
+
if (token === API_KEY) {
|
|
39
|
+
// Admin fallback key is allowed
|
|
40
|
+
next();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const apiKey = await db_1.db.apiKey.findUnique({
|
|
45
|
+
where: { key: token }
|
|
46
|
+
});
|
|
47
|
+
if (!apiKey || !apiKey.active) {
|
|
48
|
+
res.status(401).json({ error: 'Unauthorized', details: 'Invalid or inactive API key' });
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Attach to request if needed
|
|
52
|
+
req.apiKeyId = apiKey.id;
|
|
53
|
+
next();
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error('API Key verification failed:', error);
|
|
57
|
+
res.status(500).json({ error: 'Internal Server Error' });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
next();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
(0, routes_1.setupRoutes)();
|
|
66
|
+
// Serve the static React frontend
|
|
67
|
+
const publicPath = path_1.default.join(__dirname, '../../public');
|
|
68
|
+
state_1.state.app.use(express_1.default.static(publicPath));
|
|
69
|
+
// Handle React router paths - redirect any non-API to index.html
|
|
70
|
+
state_1.state.app.use((req, res) => {
|
|
71
|
+
if (req.method === 'GET' && !req.path.startsWith('/api') && !req.path.startsWith('/chat') && !req.path.startsWith('/admin') && !req.path.startsWith('/health')) {
|
|
72
|
+
res.sendFile(path_1.default.join(publicPath, 'index.html'));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
res.status(404).json({ error: 'Not Found' });
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
exports.setupApp = setupApp;
|
|
80
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/functions/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const initializeBrowser: () => Promise<void>;
|
|
2
|
+
export declare const reinitializeBrowser: () => Promise<void>;
|
|
3
|
+
export declare const startBrowser: () => Promise<void>;
|
|
4
|
+
export declare const stopBrowser: () => Promise<void>;
|
|
5
|
+
export declare const shutdownBrowser: () => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/functions/browser.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CA8CtD,CAAC;AAEF,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAAC,IAAI,CAUxD,CAAC;AAEF,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAMjD,CAAC;AAEF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAiBhD,CAAC;AAEF,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,IAAI,CAsBpD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.shutdownBrowser = exports.stopBrowser = exports.startBrowser = exports.reinitializeBrowser = exports.initializeBrowser = void 0;
|
|
7
|
+
const puppeteer_extra_1 = __importDefault(require("puppeteer-extra"));
|
|
8
|
+
const puppeteer_extra_plugin_stealth_1 = __importDefault(require("puppeteer-extra-plugin-stealth"));
|
|
9
|
+
const state_1 = require("./state");
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const session_1 = require("./session");
|
|
12
|
+
puppeteer_extra_1.default.use((0, puppeteer_extra_plugin_stealth_1.default)());
|
|
13
|
+
const initializeBrowser = async () => {
|
|
14
|
+
if (!state_1.state.isActive)
|
|
15
|
+
return;
|
|
16
|
+
try {
|
|
17
|
+
console.log('Initializing browser...');
|
|
18
|
+
state_1.state.browser = await puppeteer_extra_1.default.launch({
|
|
19
|
+
headless: config_1.CONFIG.headless,
|
|
20
|
+
args: [
|
|
21
|
+
'--no-sandbox',
|
|
22
|
+
'--disable-setuid-sandbox',
|
|
23
|
+
'--disable-web-security',
|
|
24
|
+
'--disable-features=IsolateOrigins,site-per-process',
|
|
25
|
+
'--window-size=1920,1080'
|
|
26
|
+
],
|
|
27
|
+
defaultViewport: {
|
|
28
|
+
width: 1920,
|
|
29
|
+
height: 1080
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const pages = await state_1.state.browser.pages();
|
|
33
|
+
state_1.state.page = pages.length > 0 ? pages[0] : await state_1.state.browser.newPage();
|
|
34
|
+
// Set a realistic user agent
|
|
35
|
+
await state_1.state.page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
|
|
36
|
+
// Load session
|
|
37
|
+
const sessionLoaded = await (0, session_1.loadSession)();
|
|
38
|
+
state_1.state.isInitialized = true;
|
|
39
|
+
console.log(`Browser initialized successfully. Session loaded: ${sessionLoaded}`);
|
|
40
|
+
// Handle browser disconnection
|
|
41
|
+
state_1.state.browser.on('disconnected', () => {
|
|
42
|
+
console.error('Browser disconnected!');
|
|
43
|
+
state_1.state.isInitialized = false;
|
|
44
|
+
if (state_1.state.isActive) {
|
|
45
|
+
(0, exports.reinitializeBrowser)();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Failed to initialize browser:', error);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.initializeBrowser = initializeBrowser;
|
|
55
|
+
const reinitializeBrowser = async () => {
|
|
56
|
+
if (!state_1.state.isActive)
|
|
57
|
+
return;
|
|
58
|
+
console.log('Attempting to reinitialize browser...');
|
|
59
|
+
setTimeout(async () => {
|
|
60
|
+
try {
|
|
61
|
+
await (0, exports.initializeBrowser)();
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error('Failed to reinitialize browser:', error);
|
|
65
|
+
}
|
|
66
|
+
}, 5000);
|
|
67
|
+
};
|
|
68
|
+
exports.reinitializeBrowser = reinitializeBrowser;
|
|
69
|
+
const startBrowser = async () => {
|
|
70
|
+
if (state_1.state.isActive && state_1.state.isInitialized)
|
|
71
|
+
return;
|
|
72
|
+
console.log('Starting API logic & Browser...');
|
|
73
|
+
state_1.state.isActive = true;
|
|
74
|
+
await (0, exports.initializeBrowser)();
|
|
75
|
+
};
|
|
76
|
+
exports.startBrowser = startBrowser;
|
|
77
|
+
const stopBrowser = async () => {
|
|
78
|
+
console.log('Stopping API logic & Browser...');
|
|
79
|
+
state_1.state.isActive = false;
|
|
80
|
+
// Save session before closing
|
|
81
|
+
try {
|
|
82
|
+
await (0, session_1.saveSession)();
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Failed to save session on stop:', error);
|
|
86
|
+
}
|
|
87
|
+
if (state_1.state.browser) {
|
|
88
|
+
await state_1.state.browser.close();
|
|
89
|
+
state_1.state.browser = null;
|
|
90
|
+
state_1.state.page = null;
|
|
91
|
+
state_1.state.isInitialized = false;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
exports.stopBrowser = stopBrowser;
|
|
95
|
+
const shutdownBrowser = async () => {
|
|
96
|
+
console.log('Shutting down gracefully...');
|
|
97
|
+
// Wait for queue to empty
|
|
98
|
+
while (state_1.state.requestQueue.length > 0) {
|
|
99
|
+
console.log(`Waiting for ${state_1.state.requestQueue.length} requests to complete...`);
|
|
100
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
101
|
+
}
|
|
102
|
+
// Save session before closing
|
|
103
|
+
try {
|
|
104
|
+
await (0, session_1.saveSession)();
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('Failed to save session on shutdown:', error);
|
|
108
|
+
}
|
|
109
|
+
// Close browser
|
|
110
|
+
if (state_1.state.browser) {
|
|
111
|
+
await state_1.state.browser.close();
|
|
112
|
+
}
|
|
113
|
+
process.exit(0);
|
|
114
|
+
};
|
|
115
|
+
exports.shutdownBrowser = shutdownBrowser;
|
|
116
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/functions/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatbot.d.ts","sourceRoot":"","sources":["../../src/functions/chatbot.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,MAAM,CAmN/D,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.askChatbot = void 0;
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
const state_1 = require("./state");
|
|
9
|
+
const config_1 = require("./config");
|
|
10
|
+
const askChatbot = async (prompt) => {
|
|
11
|
+
if (!state_1.state.page) {
|
|
12
|
+
throw new Error('Browser page not initialized');
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// Navigate to chatbot
|
|
16
|
+
await state_1.state.page.goto(config_1.CONFIG.chatbotUrl, {
|
|
17
|
+
waitUntil: 'networkidle2',
|
|
18
|
+
timeout: config_1.CONFIG.timeouts.navigation
|
|
19
|
+
});
|
|
20
|
+
const inputSelector = '#prompt-textarea';
|
|
21
|
+
await state_1.state.page.waitForSelector(inputSelector, {
|
|
22
|
+
timeout: config_1.CONFIG.timeouts.selector
|
|
23
|
+
});
|
|
24
|
+
// Clear input
|
|
25
|
+
await state_1.state.page.evaluate((sel) => {
|
|
26
|
+
const el = document.querySelector(sel);
|
|
27
|
+
if (!el)
|
|
28
|
+
return;
|
|
29
|
+
if (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT') {
|
|
30
|
+
el.value = '';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
el.innerHTML = '<p><br></p>';
|
|
34
|
+
}
|
|
35
|
+
el.focus();
|
|
36
|
+
}, inputSelector);
|
|
37
|
+
await new Promise(r => setTimeout(r, 200));
|
|
38
|
+
// Insert prompt
|
|
39
|
+
await state_1.state.page.evaluate((text) => {
|
|
40
|
+
const el = document.activeElement;
|
|
41
|
+
if (!el)
|
|
42
|
+
return;
|
|
43
|
+
if (el.tagName === 'TEXTAREA' || el.tagName === 'INPUT') {
|
|
44
|
+
el.value = text;
|
|
45
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
document.execCommand('insertText', false, text);
|
|
49
|
+
}
|
|
50
|
+
}, prompt);
|
|
51
|
+
await new Promise(r => setTimeout(r, 500));
|
|
52
|
+
// Send message
|
|
53
|
+
const sendBtnAvailable = await state_1.state.page.evaluate(() => {
|
|
54
|
+
const btn = document.querySelector('button[data-testid="send-button"]');
|
|
55
|
+
if (btn && !btn.disabled) {
|
|
56
|
+
btn.click();
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
});
|
|
61
|
+
if (!sendBtnAvailable) {
|
|
62
|
+
await state_1.state.page.keyboard.press('Enter');
|
|
63
|
+
}
|
|
64
|
+
// Wait until generation finishes robustly
|
|
65
|
+
let unchangedCount = 0;
|
|
66
|
+
let previousText = '';
|
|
67
|
+
const maxWaitTime = config_1.CONFIG.timeouts.response || 120000;
|
|
68
|
+
const startTime = Date.now();
|
|
69
|
+
// Short initial delay to allow the network request to initiate
|
|
70
|
+
await new Promise(r => setTimeout(r, 1500));
|
|
71
|
+
while (Date.now() - startTime < maxWaitTime) {
|
|
72
|
+
const status = await state_1.state.page.evaluate(() => {
|
|
73
|
+
const stopBtn = document.querySelector('button[aria-label="Stop generating"]') ||
|
|
74
|
+
document.querySelector('button[data-testid="stop-button"]') ||
|
|
75
|
+
document.querySelector('.result-streaming');
|
|
76
|
+
const responses = document.querySelectorAll('div[data-message-author-role="assistant"]');
|
|
77
|
+
const lastResponse = responses.length > 0 ? responses[responses.length - 1] : null;
|
|
78
|
+
const currentText = lastResponse ? (lastResponse.textContent || '') : '';
|
|
79
|
+
return {
|
|
80
|
+
hasIndicators: !!stopBtn,
|
|
81
|
+
text: currentText
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
if (status.hasIndicators) {
|
|
85
|
+
// Explicit "still working" indicator found
|
|
86
|
+
unchangedCount = 0;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// No explicit indicator. Check if text has stopped changing.
|
|
90
|
+
// We check if we have text AND it's identical to the last check
|
|
91
|
+
if (status.text.length > 0 && status.text === previousText) {
|
|
92
|
+
unchangedCount++;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
unchangedCount = 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
previousText = status.text;
|
|
99
|
+
// If the text hasn't changed for 10 consecutive checks (10 * 600ms = 6 seconds)
|
|
100
|
+
// and we have at least some text, we can be confident generation is complete.
|
|
101
|
+
if (unchangedCount >= 10 && previousText.length > 0) {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
await new Promise(r => setTimeout(r, 600));
|
|
105
|
+
}
|
|
106
|
+
// Additional safety buffer to allow for any final DOM re-renders
|
|
107
|
+
// (like syntax highlighting or markdown formatting).
|
|
108
|
+
await new Promise(r => setTimeout(r, 1500));
|
|
109
|
+
// Extract assistant response
|
|
110
|
+
const { text: response, debugHtml } = await state_1.state.page.evaluate(() => {
|
|
111
|
+
const responses = document.querySelectorAll('div[data-message-author-role="assistant"]');
|
|
112
|
+
if (responses.length === 0)
|
|
113
|
+
return { text: '', debugHtml: '' };
|
|
114
|
+
const last = responses[responses.length - 1];
|
|
115
|
+
// Grab the <pre> element to dump its structure for debugging
|
|
116
|
+
const preEl = last.querySelector('pre');
|
|
117
|
+
const debugHtml = preEl ? preEl.outerHTML.slice(0, 1000) : 'NO_PRE_FOUND';
|
|
118
|
+
// Try multiple selectors for the code content
|
|
119
|
+
const codeBlock = last.querySelector('pre code')
|
|
120
|
+
|| last.querySelector('code');
|
|
121
|
+
if (codeBlock) {
|
|
122
|
+
// Use a TreeWalker to skip buttons and UI chrome
|
|
123
|
+
const walker = document.createTreeWalker(codeBlock, NodeFilter.SHOW_TEXT, {
|
|
124
|
+
acceptNode(node) {
|
|
125
|
+
let parent = node.parentElement;
|
|
126
|
+
while (parent && parent !== codeBlock) {
|
|
127
|
+
const tag = parent.tagName.toLowerCase();
|
|
128
|
+
if (tag === 'button' || tag === 'svg' || tag === 'path' ||
|
|
129
|
+
parent.getAttribute('role') === 'button' ||
|
|
130
|
+
parent.classList.contains('code-header') ||
|
|
131
|
+
parent.classList.contains('sticky')) {
|
|
132
|
+
return NodeFilter.FILTER_REJECT;
|
|
133
|
+
}
|
|
134
|
+
parent = parent.parentElement;
|
|
135
|
+
}
|
|
136
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
let text = '';
|
|
140
|
+
let node;
|
|
141
|
+
while ((node = walker.nextNode())) {
|
|
142
|
+
text += node.textContent;
|
|
143
|
+
}
|
|
144
|
+
return { text: text || (codeBlock.textContent || ''), debugHtml };
|
|
145
|
+
}
|
|
146
|
+
// Fallback to innerText
|
|
147
|
+
return { text: last.innerText || '', debugHtml };
|
|
148
|
+
});
|
|
149
|
+
// DEBUG: dump the pre HTML so we can see what's happening
|
|
150
|
+
console.log('[DEBUG] Pre element HTML:', debugHtml);
|
|
151
|
+
console.log('[DEBUG] Raw response first 300 chars:', JSON.stringify(response.slice(0, 300)));
|
|
152
|
+
// Aggressively strip ALL known ChatGPT UI labels that may leak through.
|
|
153
|
+
// Handle \r\n, \n, or no newline. Strip multiple labels if needed.
|
|
154
|
+
let finalResponse = response;
|
|
155
|
+
// Remove leading whitespace + known labels repeatedly until none remain
|
|
156
|
+
let changed = true;
|
|
157
|
+
while (changed) {
|
|
158
|
+
const before = finalResponse;
|
|
159
|
+
finalResponse = finalResponse.replace(/^[\s\r\n]*(Run|Python|Copy code|Copy)[\s\r\n]*/i, '');
|
|
160
|
+
changed = finalResponse !== before;
|
|
161
|
+
}
|
|
162
|
+
finalResponse = finalResponse.trim();
|
|
163
|
+
if (!finalResponse) {
|
|
164
|
+
console.error('Bot returned an empty response. Dumping debug data...');
|
|
165
|
+
await fs_extra_1.default.ensureDir('debug');
|
|
166
|
+
await state_1.state.page.screenshot({
|
|
167
|
+
path: 'debug/debug_empty_response.png'
|
|
168
|
+
});
|
|
169
|
+
await fs_extra_1.default.writeFile('debug/debug_empty_response.html', await state_1.state.page.content());
|
|
170
|
+
}
|
|
171
|
+
return finalResponse;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
throw new Error(`Failed to get response: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
exports.askChatbot = askChatbot;
|
|
178
|
+
//# sourceMappingURL=chatbot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatbot.js","sourceRoot":"","sources":["../../src/functions/chatbot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const CONFIG: {
|
|
2
|
+
sessionFile: string;
|
|
3
|
+
chatbotUrl: string;
|
|
4
|
+
headless: boolean;
|
|
5
|
+
port: string | number;
|
|
6
|
+
selectors: {
|
|
7
|
+
input: string;
|
|
8
|
+
submitButton: string;
|
|
9
|
+
response: string;
|
|
10
|
+
};
|
|
11
|
+
timeouts: {
|
|
12
|
+
navigation: number;
|
|
13
|
+
response: number;
|
|
14
|
+
selector: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/functions/config.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CAelB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONFIG = void 0;
|
|
4
|
+
exports.CONFIG = {
|
|
5
|
+
sessionFile: './session.json',
|
|
6
|
+
chatbotUrl: process.env.CHATBOT_URL || 'https://chatgpt.com/',
|
|
7
|
+
headless: process.env.NODE_ENV === 'production',
|
|
8
|
+
port: process.env.PORT || 3000,
|
|
9
|
+
selectors: {
|
|
10
|
+
input: process.env.INPUT_SELECTOR || 'textarea',
|
|
11
|
+
submitButton: process.env.SUBMIT_SELECTOR || 'button[type="submit"]',
|
|
12
|
+
response: process.env.RESPONSE_SELECTOR || '.response',
|
|
13
|
+
},
|
|
14
|
+
timeouts: {
|
|
15
|
+
navigation: 30000,
|
|
16
|
+
response: 60000,
|
|
17
|
+
selector: 10000,
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/functions/config.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IAClB,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB;IAC7D,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;IAC/C,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI;IAC9B,SAAS,EAAE;QACP,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU;QAC/C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,uBAAuB;QACpE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,WAAW;KACzD;IACD,QAAQ,EAAE;QACN,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;KAClB;CACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/functions/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,eAAO,MAAM,EAAE,gIAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/functions/db.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAEjC,QAAA,EAAE,GAAG,IAAI,qBAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/functions/queue.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,IAAI,CAwFjD,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processQueue = void 0;
|
|
4
|
+
const state_1 = require("./state");
|
|
5
|
+
const chatbot_1 = require("./chatbot");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const db_1 = require("./db");
|
|
8
|
+
const processQueue = async () => {
|
|
9
|
+
if (state_1.state.isProcessing || state_1.state.requestQueue.length === 0) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
state_1.state.isProcessing = true;
|
|
13
|
+
while (state_1.state.requestQueue.length > 0) {
|
|
14
|
+
// console.log(state.requestQueue)
|
|
15
|
+
const { req, res, dbRequestId } = state_1.state.requestQueue[0];
|
|
16
|
+
const startTime = Date.now();
|
|
17
|
+
if (dbRequestId) {
|
|
18
|
+
try {
|
|
19
|
+
await db_1.db.apiRequest.update({
|
|
20
|
+
where: { id: dbRequestId },
|
|
21
|
+
data: { status: 'Processing' }
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (err) { }
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const { prompt } = req.body;
|
|
28
|
+
const answer = await (0, chatbot_1.askChatbot)(prompt);
|
|
29
|
+
// Attempt to parse it as JSON to ensure it's clean, otherwise wrap it
|
|
30
|
+
let parsedAnswer;
|
|
31
|
+
try {
|
|
32
|
+
parsedAnswer = JSON.parse(answer);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
// Fallback if ChatGPT still included some markdown or text
|
|
36
|
+
console.log(answer);
|
|
37
|
+
const cleanAnswer = answer.replace(/````json/g, '').replace(/````/g, '').trim();
|
|
38
|
+
console.log(cleanAnswer);
|
|
39
|
+
try {
|
|
40
|
+
parsedAnswer = JSON.parse(cleanAnswer);
|
|
41
|
+
}
|
|
42
|
+
catch (e2) {
|
|
43
|
+
// Ultimate fallback, format it so it survives JSON parsing with literal newlines
|
|
44
|
+
parsedAnswer = { answer: (0, utils_1.formatResponseCode)(answer) };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (dbRequestId) {
|
|
48
|
+
try {
|
|
49
|
+
await db_1.db.apiRequest.update({
|
|
50
|
+
where: { id: dbRequestId },
|
|
51
|
+
data: {
|
|
52
|
+
status: 'Completed',
|
|
53
|
+
result: typeof parsedAnswer === 'string' ? parsedAnswer : JSON.stringify(parsedAnswer),
|
|
54
|
+
durationMs: Date.now() - startTime
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) { }
|
|
59
|
+
}
|
|
60
|
+
// Optional Formatting Layer: ensure that literal `\n` characters are passed exactly as the API requested
|
|
61
|
+
// In a JSON payload, a newline is usually naturally escaped by Express `res.json()`.
|
|
62
|
+
res.json(parsedAnswer);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.error('Error processing request:', error);
|
|
66
|
+
if (dbRequestId) {
|
|
67
|
+
try {
|
|
68
|
+
await db_1.db.apiRequest.update({
|
|
69
|
+
where: { id: dbRequestId },
|
|
70
|
+
data: {
|
|
71
|
+
status: 'Failed',
|
|
72
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
73
|
+
durationMs: Date.now() - startTime
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (err) { }
|
|
78
|
+
}
|
|
79
|
+
res.status(500).json({
|
|
80
|
+
error: 'Failed to get response',
|
|
81
|
+
details: error instanceof Error ? error.message : 'Unknown error'
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Remove processed request
|
|
85
|
+
state_1.state.requestQueue.shift();
|
|
86
|
+
// Small delay between requests to avoid rate limiting
|
|
87
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
88
|
+
}
|
|
89
|
+
state_1.state.isProcessing = false;
|
|
90
|
+
};
|
|
91
|
+
exports.processQueue = processQueue;
|
|
92
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/functions/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/functions/routes.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW,QAAO,IA8K9B,CAAC"}
|