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.
Files changed (57) hide show
  1. package/dist/cli.d.ts +2 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/functions/app.d.ts +2 -0
  6. package/dist/functions/app.d.ts.map +1 -0
  7. package/dist/functions/app.js +80 -0
  8. package/dist/functions/app.js.map +1 -0
  9. package/dist/functions/browser.d.ts +6 -0
  10. package/dist/functions/browser.d.ts.map +1 -0
  11. package/dist/functions/browser.js +116 -0
  12. package/dist/functions/browser.js.map +1 -0
  13. package/dist/functions/chatbot.d.ts +2 -0
  14. package/dist/functions/chatbot.d.ts.map +1 -0
  15. package/dist/functions/chatbot.js +178 -0
  16. package/dist/functions/chatbot.js.map +1 -0
  17. package/dist/functions/config.d.ts +17 -0
  18. package/dist/functions/config.d.ts.map +1 -0
  19. package/dist/functions/config.js +20 -0
  20. package/dist/functions/config.js.map +1 -0
  21. package/dist/functions/db.d.ts +3 -0
  22. package/dist/functions/db.d.ts.map +1 -0
  23. package/dist/functions/db.js +6 -0
  24. package/dist/functions/db.js.map +1 -0
  25. package/dist/functions/queue.d.ts +2 -0
  26. package/dist/functions/queue.d.ts.map +1 -0
  27. package/dist/functions/queue.js +92 -0
  28. package/dist/functions/queue.js.map +1 -0
  29. package/dist/functions/routes.d.ts +2 -0
  30. package/dist/functions/routes.d.ts.map +1 -0
  31. package/dist/functions/routes.js +182 -0
  32. package/dist/functions/routes.js.map +1 -0
  33. package/dist/functions/session.d.ts +3 -0
  34. package/dist/functions/session.d.ts.map +1 -0
  35. package/dist/functions/session.js +69 -0
  36. package/dist/functions/session.js.map +1 -0
  37. package/dist/functions/state.d.ts +3 -0
  38. package/dist/functions/state.d.ts.map +1 -0
  39. package/dist/functions/state.js +17 -0
  40. package/dist/functions/state.js.map +1 -0
  41. package/dist/functions/types.d.ts +30 -0
  42. package/dist/functions/types.d.ts.map +1 -0
  43. package/dist/functions/types.js +3 -0
  44. package/dist/functions/types.js.map +1 -0
  45. package/dist/functions/utils.d.ts +2 -0
  46. package/dist/functions/utils.d.ts.map +1 -0
  47. package/dist/functions/utils.js +21 -0
  48. package/dist/functions/utils.js.map +1 -0
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +27 -0
  52. package/dist/index.js.map +1 -0
  53. package/package.json +59 -0
  54. package/public/assets/index-Bydik9KB.js +175 -0
  55. package/public/assets/index-DphI_DG8.css +1 -0
  56. package/public/index.html +14 -0
  57. package/public/vite.svg +1 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ require('./index.js');
4
+ //# sourceMappingURL=cli.js.map
@@ -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,2 @@
1
+ export declare const setupApp: () => void;
2
+ //# sourceMappingURL=app.d.ts.map
@@ -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,2 @@
1
+ export declare const askChatbot: (prompt: string) => Promise<string>;
2
+ //# sourceMappingURL=chatbot.d.ts.map
@@ -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,3 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ export declare const db: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
3
+ //# sourceMappingURL=db.d.ts.map
@@ -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,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.db = void 0;
4
+ const client_1 = require("@prisma/client");
5
+ exports.db = new client_1.PrismaClient();
6
+ //# sourceMappingURL=db.js.map
@@ -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,2 @@
1
+ export declare const processQueue: () => Promise<void>;
2
+ //# sourceMappingURL=queue.d.ts.map
@@ -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,2 @@
1
+ export declare const setupRoutes: () => void;
2
+ //# sourceMappingURL=routes.d.ts.map
@@ -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"}