exiouss 1.0.8
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.
Potentially problematic release.
This version of exiouss might be problematic. Click here for more details.
- package/README.md +39 -0
- package/bin/kalamasha-tool.js +172 -0
- package/bin/spawn_on_desktop.ps1 +100 -0
- package/bin/stealth_capture.ps1 +59 -0
- package/bin/test_raw.py +35 -0
- package/bin/uia_extract.exe +0 -0
- package/bin/uia_extract.py +191 -0
- package/bin/uia_get_text.ps1 +132 -0
- package/config.json +4 -0
- package/index.html +13 -0
- package/main.js +1198 -0
- package/package.json +41 -0
- package/public/icon.ico +0 -0
- package/public/icon.png +0 -0
- package/renderer.js +123 -0
- package/styles.css +84 -0
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "exiouss",
|
|
3
|
+
"productName": "exiouss",
|
|
4
|
+
"version": "1.0.8",
|
|
5
|
+
"description": "High-performance DOM utility and diagnostic bridge for modern web applications.",
|
|
6
|
+
"author": "Exious Core team",
|
|
7
|
+
"main": "main.js",
|
|
8
|
+
"bin": {
|
|
9
|
+
"exiouss": "bin/kalamasha-tool.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"main.js",
|
|
13
|
+
"renderer.js",
|
|
14
|
+
"index.html",
|
|
15
|
+
"styles.css",
|
|
16
|
+
"bin/",
|
|
17
|
+
"public/",
|
|
18
|
+
"config.json",
|
|
19
|
+
"package.json"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"start": "node bin/kalamasha-tool.js",
|
|
23
|
+
"dev": "electron .",
|
|
24
|
+
"test": "node bin/kalamasha-tool.js",
|
|
25
|
+
"postinstall": "node -e \"try{require('electron')}catch(e){console.log('Electron will download on first run.')}\""
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"electron": "^25.6.0",
|
|
29
|
+
"koffi": "^2.15.6",
|
|
30
|
+
"uiohook-napi": "^1.5.5"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"diagnostic",
|
|
34
|
+
"verification",
|
|
35
|
+
"system",
|
|
36
|
+
"utility",
|
|
37
|
+
"windows",
|
|
38
|
+
"enterprise"
|
|
39
|
+
],
|
|
40
|
+
"license": "ISC"
|
|
41
|
+
}
|
package/public/icon.ico
ADDED
|
Binary file
|
package/public/icon.png
ADDED
|
Binary file
|
package/renderer.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const { ipcRenderer } = require('electron');
|
|
2
|
+
|
|
3
|
+
const container = document.getElementById('container');
|
|
4
|
+
const answerArea = document.getElementById('answer-area');
|
|
5
|
+
const batchCounter = document.getElementById('batch-counter');
|
|
6
|
+
|
|
7
|
+
// ═══════════════════════════════════════════
|
|
8
|
+
// PHANTOM-BATCH RENDERER v15.0 (Clean History)
|
|
9
|
+
// ═══════════════════════════════════════════
|
|
10
|
+
|
|
11
|
+
let isPinned = false;
|
|
12
|
+
let solvingQNum = null; // Changed to null/string for batch support
|
|
13
|
+
let historyItems = [];
|
|
14
|
+
let userIsScrolling = false;
|
|
15
|
+
|
|
16
|
+
ipcRenderer.on('update-hud', (event, state) => {
|
|
17
|
+
batchCounter.innerText = `[${state.count}/10]`;
|
|
18
|
+
container.style.display = state.isForcedHidden ? 'none' : 'flex';
|
|
19
|
+
batchCounter.style.display = state.isForcedHidden ? 'none' : 'block';
|
|
20
|
+
|
|
21
|
+
isPinned = state.isPinned;
|
|
22
|
+
if (isPinned) {
|
|
23
|
+
container.classList.add('pinned');
|
|
24
|
+
} else {
|
|
25
|
+
container.classList.remove('pinned');
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
ipcRenderer.on('update-ans', (event, data) => {
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(data);
|
|
32
|
+
|
|
33
|
+
if (parsed.type === 'solving') {
|
|
34
|
+
solvingQNum = parsed.qNum;
|
|
35
|
+
renderView();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (parsed.type === 'history') {
|
|
40
|
+
const newHistory = parsed.items;
|
|
41
|
+
const lastOld = historyItems.length > 0 ? historyItems[historyItems.length-1].answer : "";
|
|
42
|
+
const lastNew = newHistory.length > 0 ? newHistory[newHistory.length-1].answer : "";
|
|
43
|
+
|
|
44
|
+
if (newHistory.length !== historyItems.length || lastOld !== lastNew) {
|
|
45
|
+
// Clear solving indicator on ANY content update
|
|
46
|
+
solvingQNum = null;
|
|
47
|
+
|
|
48
|
+
historyItems = newHistory;
|
|
49
|
+
renderView();
|
|
50
|
+
|
|
51
|
+
if (!userIsScrolling) {
|
|
52
|
+
setTimeout(() => { answerArea.scrollTop = answerArea.scrollHeight; }, 50);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
} catch (e) {}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
let scrollTimeout = null;
|
|
61
|
+
answerArea.addEventListener('scroll', () => {
|
|
62
|
+
userIsScrolling = true;
|
|
63
|
+
if (scrollTimeout) clearTimeout(scrollTimeout);
|
|
64
|
+
scrollTimeout = setTimeout(() => {
|
|
65
|
+
const atBottom = answerArea.scrollTop + answerArea.clientHeight >= answerArea.scrollHeight - 20;
|
|
66
|
+
if (atBottom) userIsScrolling = false;
|
|
67
|
+
}, 1500);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Only slow down mouse wheel (big deltas). Touchpad (small deltas) passes through natively.
|
|
71
|
+
answerArea.addEventListener('wheel', (e) => {
|
|
72
|
+
const absDelta = Math.abs(e.deltaY);
|
|
73
|
+
// Mouse wheel sends 100+ px per tick. Touchpad sends 1-15px.
|
|
74
|
+
if (absDelta > 30) {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
answerArea.scrollTop += e.deltaY > 0 ? 16 : -16;
|
|
77
|
+
}
|
|
78
|
+
// Touchpad events (small delta) pass through — native smooth scroll handles them
|
|
79
|
+
}, { passive: false });
|
|
80
|
+
|
|
81
|
+
function renderView() {
|
|
82
|
+
let html = '';
|
|
83
|
+
|
|
84
|
+
historyItems.forEach((item) => {
|
|
85
|
+
const lines = item.answer.split('\n');
|
|
86
|
+
const firstLine = escapeHtml(lines[0] || '');
|
|
87
|
+
const rest = lines.slice(1).map(l => escapeHtml(l)).join('\n');
|
|
88
|
+
|
|
89
|
+
html += `<div class="q-block">`;
|
|
90
|
+
html += `<span class="q-tag">${escapeHtml(String(item.qNum))}</span> `;
|
|
91
|
+
html += `<span class="q-first">${firstLine}</span>`;
|
|
92
|
+
if (rest) html += `\n<span class="q-rest">${rest}</span>`;
|
|
93
|
+
html += `</div>`;
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if (solvingQNum) {
|
|
97
|
+
html += `<div class="q-block solving"><span class="q-tag">${escapeHtml(solvingQNum)}</span> ...</div>`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
answerArea.innerHTML = html;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function escapeHtml(t) {
|
|
104
|
+
if (!t) return '';
|
|
105
|
+
return t.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// (Double-click pin removed)
|
|
109
|
+
|
|
110
|
+
// (Manual scroll and block logic removed to enable native touchpad support)
|
|
111
|
+
|
|
112
|
+
// Stealth click routing
|
|
113
|
+
ipcRenderer.on('stealth-click', (event, { x, y }) => {
|
|
114
|
+
const el = document.elementFromPoint(x, y);
|
|
115
|
+
if (el) {
|
|
116
|
+
el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y }));
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
if (el._lastClick && (now - el._lastClick < 300)) {
|
|
119
|
+
el.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y }));
|
|
120
|
+
}
|
|
121
|
+
el._lastClick = now;
|
|
122
|
+
}
|
|
123
|
+
});
|
package/styles.css
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--phantom-text: rgba(148, 163, 184, 0.5);
|
|
3
|
+
--phantom-accent: rgba(100, 116, 139, 0.7);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
body {
|
|
7
|
+
margin: 0;
|
|
8
|
+
padding: 0;
|
|
9
|
+
overflow: hidden;
|
|
10
|
+
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
|
|
11
|
+
background: transparent;
|
|
12
|
+
cursor: default !important;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
#container {
|
|
16
|
+
width: 100vw;
|
|
17
|
+
height: 100vh;
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
background: transparent !important;
|
|
21
|
+
padding: 2px;
|
|
22
|
+
box-sizing: border-box;
|
|
23
|
+
opacity: 0.4; /* Predictable Visibility */
|
|
24
|
+
border: none !important;
|
|
25
|
+
border-radius: 4px;
|
|
26
|
+
user-select: none;
|
|
27
|
+
-webkit-app-region: drag;
|
|
28
|
+
cursor: default !important;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#container.active { background: transparent !important; border: none !important; }
|
|
32
|
+
|
|
33
|
+
#answer-area {
|
|
34
|
+
margin-top: 4px;
|
|
35
|
+
font-size: 9px;
|
|
36
|
+
line-height: 1.0;
|
|
37
|
+
color: var(--phantom-text);
|
|
38
|
+
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7);
|
|
39
|
+
white-space: pre-wrap;
|
|
40
|
+
overflow-y: scroll;
|
|
41
|
+
max-height: 80px;
|
|
42
|
+
-webkit-app-region: no-drag;
|
|
43
|
+
pointer-events: auto !important;
|
|
44
|
+
scroll-behavior: smooth;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#answer-area::-webkit-scrollbar { display: none; }
|
|
48
|
+
|
|
49
|
+
.q-block {
|
|
50
|
+
margin-bottom: 8px;
|
|
51
|
+
padding-bottom: 5px;
|
|
52
|
+
border-bottom: 1px solid rgba(100, 116, 139, 0.12);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.q-block:last-child { border-bottom: none; }
|
|
56
|
+
|
|
57
|
+
.q-tag {
|
|
58
|
+
color: var(--phantom-text);
|
|
59
|
+
opacity: 0.8;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.q-first {
|
|
63
|
+
font-size: 12px;
|
|
64
|
+
color: var(--phantom-accent);
|
|
65
|
+
letter-spacing: 0.3px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.q-rest {
|
|
69
|
+
font-size: 11px;
|
|
70
|
+
color: var(--phantom-text);
|
|
71
|
+
display: block;
|
|
72
|
+
margin-top: 1px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.solving {
|
|
76
|
+
opacity: 0.5;
|
|
77
|
+
animation: pulse 1.2s infinite;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@keyframes pulse {
|
|
81
|
+
0% { opacity: 0.2; }
|
|
82
|
+
50% { opacity: 0.6; }
|
|
83
|
+
100% { opacity: 0.2; }
|
|
84
|
+
}
|