invixco 1.0.6

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/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "invixco",
3
+ "productName": "invixco",
4
+ "version": "1.0.6",
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
+ "invixco": "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
+ "devDependencies": {},
42
+ "type": "commonjs"
43
+ }
Binary file
Binary file
package/renderer.js ADDED
@@ -0,0 +1,172 @@
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
+ const sectionBadge = document.getElementById('section-badge');
7
+
8
+ // ═══════════════════════════════════════════
9
+ // PHANTOM-BATCH RENDERER v16.0 (Improved HUD)
10
+ // ═══════════════════════════════════════════
11
+
12
+ let isPinned = false;
13
+ let solvingQNum = null;
14
+ let historyItems = [];
15
+ let userIsScrolling = false;
16
+ let currentSection = 'GEN';
17
+
18
+ // Section display names
19
+ const SECTION_NAMES = {
20
+ 'GEN': 'GEN',
21
+ 'DEB': 'DEB',
22
+ 'APT': 'APT',
23
+ 'PRG': 'PRG'
24
+ };
25
+
26
+ // Show startup status
27
+ answerArea.innerHTML = '<div class="status-msg">● Ready</div>';
28
+
29
+ ipcRenderer.on('update-hud', (event, state) => {
30
+ batchCounter.innerText = `[${state.count}/10]`;
31
+ container.style.display = state.isForcedHidden ? 'none' : 'flex';
32
+ batchCounter.style.display = state.isForcedHidden ? 'none' : 'inline';
33
+
34
+ // Update section badge
35
+ if (state.activeSection && state.activeSection !== currentSection) {
36
+ currentSection = state.activeSection;
37
+ sectionBadge.innerText = SECTION_NAMES[currentSection] || currentSection;
38
+
39
+ // Brief flash effect on section change
40
+ sectionBadge.style.opacity = '1';
41
+ setTimeout(() => { sectionBadge.style.opacity = ''; }, 600);
42
+ }
43
+
44
+ isPinned = state.isPinned;
45
+ if (isPinned) {
46
+ container.classList.add('pinned');
47
+ } else {
48
+ container.classList.remove('pinned');
49
+ }
50
+
51
+ // Show combat mode indicator
52
+ if (state.isCombatMode) {
53
+ sectionBadge.style.borderBottom = '1px solid rgba(200,100,100,0.4)';
54
+ } else {
55
+ sectionBadge.style.borderBottom = '';
56
+ }
57
+ });
58
+
59
+ ipcRenderer.on('update-ans', (event, data) => {
60
+ try {
61
+ const parsed = JSON.parse(data);
62
+
63
+ if (parsed.type === 'solving') {
64
+ solvingQNum = parsed.qNum;
65
+ renderView();
66
+ return;
67
+ }
68
+
69
+ if (parsed.type === 'history') {
70
+ const newHistory = parsed.items;
71
+ const lastOld = historyItems.length > 0 ? historyItems[historyItems.length-1].answer : "";
72
+ const lastNew = newHistory.length > 0 ? newHistory[newHistory.length-1].answer : "";
73
+
74
+ if (newHistory.length !== historyItems.length || lastOld !== lastNew) {
75
+ solvingQNum = null;
76
+ historyItems = newHistory;
77
+ renderView();
78
+
79
+ if (!userIsScrolling) {
80
+ setTimeout(() => { answerArea.scrollTop = answerArea.scrollHeight; }, 50);
81
+ }
82
+ }
83
+ return;
84
+ }
85
+
86
+ if (parsed.type === 'status') {
87
+ answerArea.innerHTML = `<div class="status-msg">${escapeHtml(parsed.message)}</div>`;
88
+ return;
89
+ }
90
+
91
+ if (parsed.type === 'cleared') {
92
+ answerArea.innerHTML = '<div class="status-msg">Queue cleared</div>';
93
+ setTimeout(() => {
94
+ if (historyItems.length > 0) renderView();
95
+ else answerArea.innerHTML = '<div class="status-msg">● Ready</div>';
96
+ }, 1000);
97
+ return;
98
+ }
99
+ } catch (e) {}
100
+ });
101
+
102
+ let scrollTimeout = null;
103
+ answerArea.addEventListener('scroll', () => {
104
+ userIsScrolling = true;
105
+ if (scrollTimeout) clearTimeout(scrollTimeout);
106
+ scrollTimeout = setTimeout(() => {
107
+ const atBottom = answerArea.scrollTop + answerArea.clientHeight >= answerArea.scrollHeight - 20;
108
+ if (atBottom) userIsScrolling = false;
109
+ }, 1500);
110
+ });
111
+
112
+ // Only slow down mouse wheel (big deltas). Touchpad (small deltas) passes through natively.
113
+ answerArea.addEventListener('wheel', (e) => {
114
+ const absDelta = Math.abs(e.deltaY);
115
+ if (absDelta > 30) {
116
+ e.preventDefault();
117
+ answerArea.scrollTop += e.deltaY > 0 ? 16 : -16;
118
+ }
119
+ }, { passive: false });
120
+
121
+ function renderView() {
122
+ let html = '';
123
+
124
+ historyItems.forEach((item) => {
125
+ const answer = item.answer || '';
126
+
127
+ // Detect if this is a code answer (has indentation, braces, semicolons, def/class keywords)
128
+ const isCode = /^(class |def |function |import |#include|public |private |int |void |for |while |if |return )/m.test(answer) ||
129
+ (answer.split('\n').filter(l => l.startsWith(' ') || l.startsWith('\t')).length > 2);
130
+
131
+ const lines = answer.split('\n');
132
+ const firstLine = escapeHtml(lines[0] || '');
133
+ const rest = lines.slice(1).map(l => escapeHtml(l)).join('\n');
134
+
135
+ html += `<div class="q-block">`;
136
+ html += `<span class="q-tag">${escapeHtml(String(item.qNum))}</span> `;
137
+ html += `<span class="q-first">${firstLine}</span>`;
138
+
139
+ if (rest) {
140
+ if (isCode) {
141
+ html += `\n<span class="q-code">${rest}</span>`;
142
+ } else {
143
+ html += `\n<span class="q-rest">${rest}</span>`;
144
+ }
145
+ }
146
+ html += `</div>`;
147
+ });
148
+
149
+ if (solvingQNum) {
150
+ html += `<div class="q-block solving"><span class="q-tag">${escapeHtml(solvingQNum)}</span> ...</div>`;
151
+ }
152
+
153
+ answerArea.innerHTML = html;
154
+ }
155
+
156
+ function escapeHtml(t) {
157
+ if (!t) return '';
158
+ return t.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
159
+ }
160
+
161
+ // Stealth click routing
162
+ ipcRenderer.on('stealth-click', (event, { x, y }) => {
163
+ const el = document.elementFromPoint(x, y);
164
+ if (el) {
165
+ el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y }));
166
+ const now = Date.now();
167
+ if (el._lastClick && (now - el._lastClick < 300)) {
168
+ el.dispatchEvent(new MouseEvent('dblclick', { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y }));
169
+ }
170
+ el._lastClick = now;
171
+ }
172
+ });
package/styles.css ADDED
@@ -0,0 +1,143 @@
1
+ :root {
2
+ --phantom-text: rgba(160, 160, 160, 0.7);
3
+ --phantom-accent: rgba(140, 140, 140, 0.85);
4
+ --phantom-code: rgba(170, 170, 170, 0.75);
5
+ --phantom-dim: rgba(120, 120, 120, 0.5);
6
+ --badge-bg: rgba(60, 60, 60, 0.35);
7
+ --badge-text: rgba(160, 160, 160, 0.8);
8
+ }
9
+
10
+ body {
11
+ margin: 0;
12
+ padding: 0;
13
+ overflow: hidden;
14
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
15
+ background: transparent;
16
+ cursor: default !important;
17
+ }
18
+
19
+ #container {
20
+ width: 100vw;
21
+ height: 100vh;
22
+ display: flex;
23
+ flex-direction: column;
24
+ background: transparent !important;
25
+ padding: 2px;
26
+ box-sizing: border-box;
27
+ opacity: 0.4; /* Predictable Visibility */
28
+ border: none !important;
29
+ border-radius: 4px;
30
+ user-select: none;
31
+ -webkit-app-region: drag;
32
+ cursor: default !important;
33
+ }
34
+
35
+ #container.active { background: transparent !important; border: none !important; }
36
+
37
+ /* ═══ TOP BAR: Batch counter + Section badge ═══ */
38
+ #top-bar {
39
+ display: flex;
40
+ align-items: center;
41
+ gap: 4px;
42
+ font-size: 9px;
43
+ color: var(--phantom-dim);
44
+ flex-shrink: 0;
45
+ line-height: 1;
46
+ }
47
+
48
+ #batch-counter {
49
+ font-size: 9px;
50
+ color: var(--phantom-dim);
51
+ }
52
+
53
+ #section-badge {
54
+ font-size: 7px;
55
+ letter-spacing: 0.8px;
56
+ color: var(--badge-text);
57
+ background: var(--badge-bg);
58
+ padding: 1px 3px;
59
+ border-radius: 2px;
60
+ font-weight: bold;
61
+ }
62
+
63
+ /* ═══ ANSWER AREA ═══ */
64
+ #answer-area {
65
+ margin-top: 3px;
66
+ font-size: 11px;
67
+ line-height: 1.15;
68
+ color: var(--phantom-text);
69
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7);
70
+ white-space: pre-wrap;
71
+ overflow-y: scroll;
72
+ max-height: 130px;
73
+ -webkit-app-region: no-drag;
74
+ pointer-events: auto !important;
75
+ scroll-behavior: smooth;
76
+ }
77
+
78
+ #answer-area::-webkit-scrollbar { display: none; }
79
+
80
+ /* ═══ QUESTION BLOCKS ═══ */
81
+ .q-block {
82
+ margin-bottom: 6px;
83
+ padding-bottom: 4px;
84
+ border-bottom: 1px solid rgba(100, 116, 139, 0.1);
85
+ }
86
+
87
+ .q-block:last-child { border-bottom: none; }
88
+
89
+ .q-tag {
90
+ color: var(--badge-text);
91
+ font-size: 8px;
92
+ opacity: 0.9;
93
+ background: var(--badge-bg);
94
+ padding: 0px 2px;
95
+ border-radius: 2px;
96
+ }
97
+
98
+ .q-first {
99
+ font-size: 12px;
100
+ color: var(--phantom-accent);
101
+ letter-spacing: 0.2px;
102
+ }
103
+
104
+ .q-rest {
105
+ font-size: 11px;
106
+ color: var(--phantom-text);
107
+ display: block;
108
+ margin-top: 1px;
109
+ line-height: 1.2;
110
+ }
111
+
112
+ /* ═══ CODE BLOCKS (inside answers) ═══ */
113
+ .q-code {
114
+ font-size: 11px;
115
+ color: var(--phantom-code);
116
+ display: block;
117
+ margin-top: 2px;
118
+ line-height: 1.25;
119
+ letter-spacing: 0.1px;
120
+ padding-left: 4px;
121
+ border-left: 1px solid rgba(100, 140, 180, 0.15);
122
+ }
123
+
124
+ /* ═══ STATUS MESSAGES ═══ */
125
+ .status-msg {
126
+ font-size: 9px;
127
+ color: var(--phantom-dim);
128
+ text-align: center;
129
+ padding: 4px 0;
130
+ letter-spacing: 0.5px;
131
+ }
132
+
133
+ /* ═══ SOLVING ANIMATION ═══ */
134
+ .solving {
135
+ opacity: 0.5;
136
+ animation: pulse 1.2s infinite;
137
+ }
138
+
139
+ @keyframes pulse {
140
+ 0% { opacity: 0.2; }
141
+ 50% { opacity: 0.6; }
142
+ 100% { opacity: 0.2; }
143
+ }