@adcops/autocore-react 3.3.8 → 3.3.10
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 +58 -58
- package/additional-docs/AutoCoreTagContext.md +441 -441
- package/additional-docs/ButtonApiSpecs.md +48 -48
- package/additional-docs/GlobalEventEmitter.md +243 -243
- package/additional-docs/general_recommendations.md +22 -22
- package/additional-docs/react_performance_notes.md +94 -94
- package/dist/assets/svg/blockly_logo.svg +82 -82
- package/dist/assets/svg/distance.svg +40 -40
- package/dist/assets/svg/python_logo.svg +246 -246
- package/dist/assets/svg/rotation_ccw.svg +50 -50
- package/dist/assets/svg/rotation_ccw_a.svg +57 -57
- package/dist/assets/svg/rotation_ccw_b.svg +57 -57
- package/dist/assets/svg/rotation_ccw_c.svg +57 -57
- package/dist/assets/svg/rotation_cw.svg +49 -49
- package/dist/assets/svg/rotation_cw_a.svg +30 -30
- package/dist/assets/svg/rotation_cw_b.svg +30 -30
- package/dist/assets/svg/rotation_cw_c.svg +30 -30
- package/dist/assets/svg/speed.svg +39 -39
- package/dist/components/BlocklyEditor.css +93 -93
- package/dist/components/JogPanel.css +41 -41
- package/dist/components/ProgressBarWithValue.css +27 -27
- package/dist/components/ValueIndicator.css +31 -31
- package/dist/components/osk.css +123 -123
- package/dist/core/AutoCoreTagContext.d.ts.map +1 -1
- package/dist/core/AutoCoreTagContext.js +1 -1
- package/dist/hub/HubBase.d.ts +3 -3
- package/dist/hub/HubBase.d.ts.map +1 -1
- package/dist/hub/HubBase.js +1 -1
- package/package.json +104 -104
- package/readme.md +343 -343
- package/src/assets/BlocklyLogo.tsx +27 -27
- package/src/assets/Distance.tsx +18 -18
- package/src/assets/JogLong.tsx +13 -13
- package/src/assets/JogMedium.tsx +13 -13
- package/src/assets/JogShort.tsx +13 -13
- package/src/assets/PythonLogo.tsx +83 -83
- package/src/assets/Rotation3D.tsx +13 -13
- package/src/assets/RotationCcw.tsx +33 -33
- package/src/assets/RotationCcwA.tsx +45 -45
- package/src/assets/RotationCcwB.tsx +45 -45
- package/src/assets/RotationCcwC.tsx +45 -45
- package/src/assets/RotationCw.tsx +31 -31
- package/src/assets/RotationCwA.tsx +42 -42
- package/src/assets/RotationCwB.tsx +42 -42
- package/src/assets/RotationCwC.tsx +42 -42
- package/src/assets/Run.tsx +13 -13
- package/src/assets/Speed.tsx +18 -18
- package/src/assets/SpeedFast.tsx +13 -13
- package/src/assets/SpeedMedium.tsx +13 -13
- package/src/assets/SpeedNone.tsx +13 -13
- package/src/assets/SpeedSlow.tsx +13 -13
- package/src/assets/Walk.tsx +13 -13
- package/src/assets/index.ts +22 -22
- package/src/assets/svg/blockly_logo.svg +82 -82
- package/src/assets/svg/distance.svg +40 -40
- package/src/assets/svg/python_logo.svg +246 -246
- package/src/assets/svg/rotation_ccw.svg +50 -50
- package/src/assets/svg/rotation_ccw_a.svg +57 -57
- package/src/assets/svg/rotation_ccw_b.svg +57 -57
- package/src/assets/svg/rotation_ccw_c.svg +57 -57
- package/src/assets/svg/rotation_cw.svg +49 -49
- package/src/assets/svg/rotation_cw_a.svg +30 -30
- package/src/assets/svg/rotation_cw_b.svg +30 -30
- package/src/assets/svg/rotation_cw_c.svg +30 -30
- package/src/assets/svg/speed.svg +39 -39
- package/src/components/AutoCoreDevPanel.tsx +414 -414
- package/src/components/BlocklyEditor.css +93 -93
- package/src/components/BlocklyEditor.tsx +609 -609
- package/src/components/CodeEditor.tsx +155 -155
- package/src/components/FileList.tsx +390 -390
- package/src/components/FileSelect.tsx +128 -128
- package/src/components/FitText.tsx +35 -35
- package/src/components/Indicator.tsx +188 -188
- package/src/components/IndicatorButton.tsx +214 -214
- package/src/components/IndicatorRect.tsx +172 -172
- package/src/components/JogPanel.css +41 -41
- package/src/components/JogPanel.tsx +461 -461
- package/src/components/Lamp.tsx +243 -243
- package/src/components/Osk.tsx +192 -192
- package/src/components/OskDialog.tsx +164 -164
- package/src/components/ProgressBarWithValue.css +27 -27
- package/src/components/ProgressBarWithValue.tsx +48 -48
- package/src/components/TextInput.tsx +195 -195
- package/src/components/ToggleGroup.tsx +322 -322
- package/src/components/ValueDisplay.tsx +236 -236
- package/src/components/ValueIndicator.css +31 -31
- package/src/components/ValueIndicator.tsx +135 -135
- package/src/components/ValueInput.tsx +368 -368
- package/src/components/osk.css +123 -123
- package/src/core/ActionMode.ts +19 -19
- package/src/core/AutoCoreTagContext.tsx +625 -614
- package/src/core/AutoCoreTagTypes.ts +334 -334
- package/src/core/CoreStreamTypes.ts +512 -512
- package/src/core/EventEmitterContext.tsx +434 -434
- package/src/core/IndicatorButtonState.ts +34 -34
- package/src/core/IndicatorColor.ts +35 -35
- package/src/core/MaskPatterns.ts +87 -87
- package/src/core/NumerableTypes.ts +80 -80
- package/src/core/PositionContext.ts +59 -59
- package/src/core/UniqueId.ts +41 -41
- package/src/core/ValueSimulator.ts +166 -166
- package/src/core/hoc.tsx +65 -65
- package/src/hooks/adsHooks.tsx +287 -287
- package/src/hooks/commandHooks.tsx +300 -300
- package/src/hooks/index.ts +12 -12
- package/src/hooks/useAutoCoreTag.ts +103 -103
- package/src/hooks/useScaledValue.tsx +99 -99
- package/src/hub/CommandMessage.ts +89 -89
- package/src/hub/DebugPanel.ts +307 -307
- package/src/hub/HubBase.ts +249 -236
- package/src/hub/HubSimulate.ts +124 -124
- package/src/hub/HubTauri.ts +140 -140
- package/src/hub/HubWebSocket.ts +250 -250
- package/src/hub/debug.ts +211 -211
- package/src/hub/index.ts +81 -81
- package/src/themes/adc-dark/_extensions.scss +166 -166
- package/src/themes/adc-dark/_variables.scss +913 -913
- package/src/themes/adc-dark/blue/_fonts.scss +23 -23
- package/src/themes/adc-dark/blue/adc_theme.scss +31 -31
- package/src/themes/adc-dark/blue/theme.scss +14 -14
- package/src/themes/theme-base/_colors.scss +17 -17
- package/src/themes/theme-base/_common.scss +74 -74
- package/src/themes/theme-base/_components.scss +111 -111
- package/src/themes/theme-base/_mixins.scss +243 -243
- package/src/themes/theme-base/components/button/_button.scss +644 -644
- package/src/themes/theme-base/components/button/_speeddial.scss +91 -91
- package/src/themes/theme-base/components/button/_splitbutton.scss +358 -358
- package/src/themes/theme-base/components/data/_carousel.scss +39 -39
- package/src/themes/theme-base/components/data/_datascroller.scss +47 -47
- package/src/themes/theme-base/components/data/_datatable.scss +388 -388
- package/src/themes/theme-base/components/data/_dataview.scss +47 -47
- package/src/themes/theme-base/components/data/_filter.scss +137 -137
- package/src/themes/theme-base/components/data/_orderlist.scss +86 -86
- package/src/themes/theme-base/components/data/_organizationchart.scss +50 -50
- package/src/themes/theme-base/components/data/_paginator.scss +91 -91
- package/src/themes/theme-base/components/data/_picklist.scss +73 -73
- package/src/themes/theme-base/components/data/_timeline.scss +38 -38
- package/src/themes/theme-base/components/data/_tree.scss +184 -184
- package/src/themes/theme-base/components/data/_treetable.scss +431 -431
- package/src/themes/theme-base/components/file/_fileupload.scss +41 -41
- package/src/themes/theme-base/components/input/_autocomplete.scss +94 -94
- package/src/themes/theme-base/components/input/_calendar.scss +251 -251
- package/src/themes/theme-base/components/input/_cascadeselect.scss +107 -107
- package/src/themes/theme-base/components/input/_checkbox.scss +181 -181
- package/src/themes/theme-base/components/input/_chips.scss +102 -102
- package/src/themes/theme-base/components/input/_colorpicker.scss +17 -17
- package/src/themes/theme-base/components/input/_dropdown.scss +252 -252
- package/src/themes/theme-base/components/input/_editor.scss +122 -122
- package/src/themes/theme-base/components/input/_iconfield.scss +9 -9
- package/src/themes/theme-base/components/input/_inputgroup.scss +74 -74
- package/src/themes/theme-base/components/input/_inputicon.scss +14 -14
- package/src/themes/theme-base/components/input/_inputnumber.scss +4 -4
- package/src/themes/theme-base/components/input/_inputotp.scss +10 -10
- package/src/themes/theme-base/components/input/_inputswitch.scss +99 -99
- package/src/themes/theme-base/components/input/_inputtext.scss +101 -101
- package/src/themes/theme-base/components/input/_listbox.scss +138 -138
- package/src/themes/theme-base/components/input/_mention.scss +30 -30
- package/src/themes/theme-base/components/input/_multiselect.scss +278 -278
- package/src/themes/theme-base/components/input/_password.scss +32 -32
- package/src/themes/theme-base/components/input/_radiobutton.scss +169 -169
- package/src/themes/theme-base/components/input/_rating.scss +80 -80
- package/src/themes/theme-base/components/input/_selectbutton.scss +49 -49
- package/src/themes/theme-base/components/input/_slider.scss +49 -49
- package/src/themes/theme-base/components/input/_togglebutton.scss +99 -99
- package/src/themes/theme-base/components/input/_treeselect.scss +151 -151
- package/src/themes/theme-base/components/input/_tristatecheckbox.scss +46 -46
- package/src/themes/theme-base/components/menu/_breadcrumb.scss +42 -42
- package/src/themes/theme-base/components/menu/_contextmenu.scss +39 -39
- package/src/themes/theme-base/components/menu/_dock.scss +109 -109
- package/src/themes/theme-base/components/menu/_megamenu.scss +141 -141
- package/src/themes/theme-base/components/menu/_menu.scss +33 -33
- package/src/themes/theme-base/components/menu/_menubar.scss +216 -216
- package/src/themes/theme-base/components/menu/_panelmenu.scss +153 -153
- package/src/themes/theme-base/components/menu/_slidemenu.scss +60 -60
- package/src/themes/theme-base/components/menu/_steps.scss +57 -57
- package/src/themes/theme-base/components/menu/_tabmenu.scss +50 -50
- package/src/themes/theme-base/components/menu/_tieredmenu.scss +43 -43
- package/src/themes/theme-base/components/messages/_inlinemessage.scss +69 -69
- package/src/themes/theme-base/components/messages/_message.scss +107 -107
- package/src/themes/theme-base/components/messages/_toast.scss +100 -100
- package/src/themes/theme-base/components/misc/_avatar.scss +33 -33
- package/src/themes/theme-base/components/misc/_badge.scss +76 -76
- package/src/themes/theme-base/components/misc/_chip.scss +38 -38
- package/src/themes/theme-base/components/misc/_inplace.scss +17 -17
- package/src/themes/theme-base/components/misc/_metergroup.scss +80 -80
- package/src/themes/theme-base/components/misc/_progressbar.scss +17 -17
- package/src/themes/theme-base/components/misc/_scrolltop.scss +24 -24
- package/src/themes/theme-base/components/misc/_skeleton.scss +7 -7
- package/src/themes/theme-base/components/misc/_tag.scss +39 -39
- package/src/themes/theme-base/components/misc/_terminal.scss +12 -12
- package/src/themes/theme-base/components/multimedia/_galleria.scss +153 -153
- package/src/themes/theme-base/components/multimedia/_image.scss +53 -53
- package/src/themes/theme-base/components/overlay/_confirmpopup.scss +72 -72
- package/src/themes/theme-base/components/overlay/_dialog.scss +78 -78
- package/src/themes/theme-base/components/overlay/_overlaypanel.scss +64 -64
- package/src/themes/theme-base/components/overlay/_sidebar.scss +23 -23
- package/src/themes/theme-base/components/overlay/_tooltip.scss +33 -33
- package/src/themes/theme-base/components/panel/_accordion.scss +118 -118
- package/src/themes/theme-base/components/panel/_card.scss +30 -30
- package/src/themes/theme-base/components/panel/_divider.scss +30 -30
- package/src/themes/theme-base/components/panel/_fieldset.scss +47 -47
- package/src/themes/theme-base/components/panel/_panel.scss +47 -47
- package/src/themes/theme-base/components/panel/_scrollpanel.scss +10 -10
- package/src/themes/theme-base/components/panel/_splitter.scss +23 -23
- package/src/themes/theme-base/components/panel/_stepper.scss +136 -136
- package/src/themes/theme-base/components/panel/_tabview.scss +147 -147
- package/src/themes/theme-base/components/panel/_toolbar.scss +11 -11
- package/terser.config.cjs +25 -25
- package/todo.md +18 -18
- package/tools/build-themes.cjs +65 -65
- package/tools/copy-distribution-files.cjs +77 -77
- package/tools/minify.cjs +55 -55
- package/tsconfig.json +48 -48
- package/typedoc.json +12 -12
- package/.claude/settings.local.json +0 -7
package/src/hub/debug.ts
CHANGED
|
@@ -1,211 +1,211 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2026 Automated Design Corp. All Rights Reserved.
|
|
3
|
-
*
|
|
4
|
-
* Debug Logging Utility for CoreStream/Hub Communication
|
|
5
|
-
*
|
|
6
|
-
* This utility provides debug logging that won't be stripped by production builds.
|
|
7
|
-
* It uses console.warn/console.error which are typically preserved, and stores
|
|
8
|
-
* logs in a buffer that can be inspected from the browser console.
|
|
9
|
-
*
|
|
10
|
-
* Usage in browser console:
|
|
11
|
-
* window.__AUTOCORE_DEBUG__.enable() - Enable debug logging
|
|
12
|
-
* window.__AUTOCORE_DEBUG__.disable() - Disable debug logging
|
|
13
|
-
* window.__AUTOCORE_DEBUG__.logs - View all logged messages
|
|
14
|
-
* window.__AUTOCORE_DEBUG__.clear() - Clear log buffer
|
|
15
|
-
* window.__AUTOCORE_DEBUG__.dump() - Dump all logs to console
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
export interface DebugLogEntry {
|
|
19
|
-
timestamp: number;
|
|
20
|
-
source: string;
|
|
21
|
-
level: "info" | "warn" | "error" | "send" | "recv";
|
|
22
|
-
message: string;
|
|
23
|
-
data?: unknown;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
interface DebugState {
|
|
27
|
-
enabled: boolean;
|
|
28
|
-
logs: DebugLogEntry[];
|
|
29
|
-
maxLogs: number;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// Global state - attached to window for browser console access
|
|
33
|
-
const state: DebugState = {
|
|
34
|
-
enabled: true, // Start enabled for debugging
|
|
35
|
-
logs: [],
|
|
36
|
-
maxLogs: 1000,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
// Format timestamp as HH:MM:SS.mmm
|
|
40
|
-
function formatTime(ts: number): string {
|
|
41
|
-
const d = new Date(ts);
|
|
42
|
-
return d.toTimeString().slice(0, 8) + "." + String(d.getMilliseconds()).padStart(3, "0");
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Format log entry for console output
|
|
46
|
-
function formatEntry(entry: DebugLogEntry): string {
|
|
47
|
-
return `[${formatTime(entry.timestamp)}] [${entry.source}] ${entry.message}`;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// Add a log entry
|
|
51
|
-
function addLog(
|
|
52
|
-
source: string,
|
|
53
|
-
level: DebugLogEntry["level"],
|
|
54
|
-
message: string,
|
|
55
|
-
data?: unknown
|
|
56
|
-
): void {
|
|
57
|
-
const entry: DebugLogEntry = {
|
|
58
|
-
timestamp: Date.now(),
|
|
59
|
-
source,
|
|
60
|
-
level,
|
|
61
|
-
message,
|
|
62
|
-
data,
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// Add to buffer (with size limit)
|
|
66
|
-
state.logs.push(entry);
|
|
67
|
-
if (state.logs.length > state.maxLogs) {
|
|
68
|
-
state.logs.shift();
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Output to console if enabled
|
|
72
|
-
if (state.enabled) {
|
|
73
|
-
const formatted = formatEntry(entry);
|
|
74
|
-
const style = getLogStyle(level);
|
|
75
|
-
|
|
76
|
-
switch (level) {
|
|
77
|
-
case "error":
|
|
78
|
-
console.error(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
79
|
-
break;
|
|
80
|
-
case "warn":
|
|
81
|
-
console.warn(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
82
|
-
break;
|
|
83
|
-
case "send":
|
|
84
|
-
console.warn(`%c>>> ${formatted}`, style, data !== undefined ? data : "");
|
|
85
|
-
break;
|
|
86
|
-
case "recv":
|
|
87
|
-
console.warn(`%c<<< ${formatted}`, style, data !== undefined ? data : "");
|
|
88
|
-
break;
|
|
89
|
-
default:
|
|
90
|
-
console.warn(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Get console style for log level
|
|
96
|
-
function getLogStyle(level: DebugLogEntry["level"]): string {
|
|
97
|
-
switch (level) {
|
|
98
|
-
case "error":
|
|
99
|
-
return "color: #ff4444; font-weight: bold;";
|
|
100
|
-
case "warn":
|
|
101
|
-
return "color: #ffaa00;";
|
|
102
|
-
case "send":
|
|
103
|
-
return "color: #44ff44;"; // Green for outgoing
|
|
104
|
-
case "recv":
|
|
105
|
-
return "color: #4444ff;"; // Blue for incoming
|
|
106
|
-
default:
|
|
107
|
-
return "color: #888888;";
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Public debug API
|
|
112
|
-
export const debug = {
|
|
113
|
-
/** Log an info message */
|
|
114
|
-
info(source: string, message: string, data?: unknown): void {
|
|
115
|
-
addLog(source, "info", message, data);
|
|
116
|
-
},
|
|
117
|
-
|
|
118
|
-
/** Log a warning message */
|
|
119
|
-
warn(source: string, message: string, data?: unknown): void {
|
|
120
|
-
addLog(source, "warn", message, data);
|
|
121
|
-
},
|
|
122
|
-
|
|
123
|
-
/** Log an error message */
|
|
124
|
-
error(source: string, message: string, data?: unknown): void {
|
|
125
|
-
addLog(source, "error", message, data);
|
|
126
|
-
},
|
|
127
|
-
|
|
128
|
-
/** Log an outgoing message (to server) */
|
|
129
|
-
send(source: string, message: string, data?: unknown): void {
|
|
130
|
-
addLog(source, "send", message, data);
|
|
131
|
-
},
|
|
132
|
-
|
|
133
|
-
/** Log an incoming message (from server) */
|
|
134
|
-
recv(source: string, message: string, data?: unknown): void {
|
|
135
|
-
addLog(source, "recv", message, data);
|
|
136
|
-
},
|
|
137
|
-
|
|
138
|
-
/** Check if debug is enabled */
|
|
139
|
-
isEnabled(): boolean {
|
|
140
|
-
return state.enabled;
|
|
141
|
-
},
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
// Browser console API
|
|
145
|
-
const consoleAPI = {
|
|
146
|
-
enable(): void {
|
|
147
|
-
state.enabled = true;
|
|
148
|
-
console.warn("%c[AutoCore Debug] Logging ENABLED", "color: #44ff44; font-weight: bold;");
|
|
149
|
-
},
|
|
150
|
-
|
|
151
|
-
disable(): void {
|
|
152
|
-
state.enabled = false;
|
|
153
|
-
console.warn("%c[AutoCore Debug] Logging DISABLED", "color: #ff4444; font-weight: bold;");
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
get logs(): DebugLogEntry[] {
|
|
157
|
-
return [...state.logs];
|
|
158
|
-
},
|
|
159
|
-
|
|
160
|
-
clear(): void {
|
|
161
|
-
state.logs = [];
|
|
162
|
-
console.warn("%c[AutoCore Debug] Logs cleared", "color: #ffaa00;");
|
|
163
|
-
},
|
|
164
|
-
|
|
165
|
-
dump(): void {
|
|
166
|
-
console.group("[AutoCore Debug] Full Log Dump");
|
|
167
|
-
for (const entry of state.logs) {
|
|
168
|
-
const formatted = formatEntry(entry);
|
|
169
|
-
switch (entry.level) {
|
|
170
|
-
case "send":
|
|
171
|
-
console.log(`%c>>> ${formatted}`, "color: #44ff44;", entry.data);
|
|
172
|
-
break;
|
|
173
|
-
case "recv":
|
|
174
|
-
console.log(`%c<<< ${formatted}`, "color: #4444ff;", entry.data);
|
|
175
|
-
break;
|
|
176
|
-
case "error":
|
|
177
|
-
console.log(`%c${formatted}`, "color: #ff4444;", entry.data);
|
|
178
|
-
break;
|
|
179
|
-
default:
|
|
180
|
-
console.log(formatted, entry.data);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
console.groupEnd();
|
|
184
|
-
},
|
|
185
|
-
|
|
186
|
-
/** Filter logs by source */
|
|
187
|
-
filterBySource(source: string): DebugLogEntry[] {
|
|
188
|
-
return state.logs.filter((e) => e.source.includes(source));
|
|
189
|
-
},
|
|
190
|
-
|
|
191
|
-
/** Filter logs by level */
|
|
192
|
-
filterByLevel(level: DebugLogEntry["level"]): DebugLogEntry[] {
|
|
193
|
-
return state.logs.filter((e) => e.level === level);
|
|
194
|
-
},
|
|
195
|
-
|
|
196
|
-
/** Get only send/recv messages */
|
|
197
|
-
getMessages(): DebugLogEntry[] {
|
|
198
|
-
return state.logs.filter((e) => e.level === "send" || e.level === "recv");
|
|
199
|
-
},
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
// Attach to window for browser console access
|
|
203
|
-
if (typeof window !== "undefined") {
|
|
204
|
-
(window as unknown as { __AUTOCORE_DEBUG__: typeof consoleAPI }).__AUTOCORE_DEBUG__ = consoleAPI;
|
|
205
|
-
console.warn(
|
|
206
|
-
"%c[AutoCore Debug] Debug utility loaded. Access via window.__AUTOCORE_DEBUG__",
|
|
207
|
-
"color: #44ff44; font-weight: bold;"
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
export default debug;
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2026 Automated Design Corp. All Rights Reserved.
|
|
3
|
+
*
|
|
4
|
+
* Debug Logging Utility for CoreStream/Hub Communication
|
|
5
|
+
*
|
|
6
|
+
* This utility provides debug logging that won't be stripped by production builds.
|
|
7
|
+
* It uses console.warn/console.error which are typically preserved, and stores
|
|
8
|
+
* logs in a buffer that can be inspected from the browser console.
|
|
9
|
+
*
|
|
10
|
+
* Usage in browser console:
|
|
11
|
+
* window.__AUTOCORE_DEBUG__.enable() - Enable debug logging
|
|
12
|
+
* window.__AUTOCORE_DEBUG__.disable() - Disable debug logging
|
|
13
|
+
* window.__AUTOCORE_DEBUG__.logs - View all logged messages
|
|
14
|
+
* window.__AUTOCORE_DEBUG__.clear() - Clear log buffer
|
|
15
|
+
* window.__AUTOCORE_DEBUG__.dump() - Dump all logs to console
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface DebugLogEntry {
|
|
19
|
+
timestamp: number;
|
|
20
|
+
source: string;
|
|
21
|
+
level: "info" | "warn" | "error" | "send" | "recv";
|
|
22
|
+
message: string;
|
|
23
|
+
data?: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface DebugState {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
logs: DebugLogEntry[];
|
|
29
|
+
maxLogs: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Global state - attached to window for browser console access
|
|
33
|
+
const state: DebugState = {
|
|
34
|
+
enabled: true, // Start enabled for debugging
|
|
35
|
+
logs: [],
|
|
36
|
+
maxLogs: 1000,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// Format timestamp as HH:MM:SS.mmm
|
|
40
|
+
function formatTime(ts: number): string {
|
|
41
|
+
const d = new Date(ts);
|
|
42
|
+
return d.toTimeString().slice(0, 8) + "." + String(d.getMilliseconds()).padStart(3, "0");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Format log entry for console output
|
|
46
|
+
function formatEntry(entry: DebugLogEntry): string {
|
|
47
|
+
return `[${formatTime(entry.timestamp)}] [${entry.source}] ${entry.message}`;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Add a log entry
|
|
51
|
+
function addLog(
|
|
52
|
+
source: string,
|
|
53
|
+
level: DebugLogEntry["level"],
|
|
54
|
+
message: string,
|
|
55
|
+
data?: unknown
|
|
56
|
+
): void {
|
|
57
|
+
const entry: DebugLogEntry = {
|
|
58
|
+
timestamp: Date.now(),
|
|
59
|
+
source,
|
|
60
|
+
level,
|
|
61
|
+
message,
|
|
62
|
+
data,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// Add to buffer (with size limit)
|
|
66
|
+
state.logs.push(entry);
|
|
67
|
+
if (state.logs.length > state.maxLogs) {
|
|
68
|
+
state.logs.shift();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Output to console if enabled
|
|
72
|
+
if (state.enabled) {
|
|
73
|
+
const formatted = formatEntry(entry);
|
|
74
|
+
const style = getLogStyle(level);
|
|
75
|
+
|
|
76
|
+
switch (level) {
|
|
77
|
+
case "error":
|
|
78
|
+
console.error(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
79
|
+
break;
|
|
80
|
+
case "warn":
|
|
81
|
+
console.warn(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
82
|
+
break;
|
|
83
|
+
case "send":
|
|
84
|
+
console.warn(`%c>>> ${formatted}`, style, data !== undefined ? data : "");
|
|
85
|
+
break;
|
|
86
|
+
case "recv":
|
|
87
|
+
console.warn(`%c<<< ${formatted}`, style, data !== undefined ? data : "");
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
console.warn(`%c${formatted}`, style, data !== undefined ? data : "");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Get console style for log level
|
|
96
|
+
function getLogStyle(level: DebugLogEntry["level"]): string {
|
|
97
|
+
switch (level) {
|
|
98
|
+
case "error":
|
|
99
|
+
return "color: #ff4444; font-weight: bold;";
|
|
100
|
+
case "warn":
|
|
101
|
+
return "color: #ffaa00;";
|
|
102
|
+
case "send":
|
|
103
|
+
return "color: #44ff44;"; // Green for outgoing
|
|
104
|
+
case "recv":
|
|
105
|
+
return "color: #4444ff;"; // Blue for incoming
|
|
106
|
+
default:
|
|
107
|
+
return "color: #888888;";
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Public debug API
|
|
112
|
+
export const debug = {
|
|
113
|
+
/** Log an info message */
|
|
114
|
+
info(source: string, message: string, data?: unknown): void {
|
|
115
|
+
addLog(source, "info", message, data);
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
/** Log a warning message */
|
|
119
|
+
warn(source: string, message: string, data?: unknown): void {
|
|
120
|
+
addLog(source, "warn", message, data);
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
/** Log an error message */
|
|
124
|
+
error(source: string, message: string, data?: unknown): void {
|
|
125
|
+
addLog(source, "error", message, data);
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
/** Log an outgoing message (to server) */
|
|
129
|
+
send(source: string, message: string, data?: unknown): void {
|
|
130
|
+
addLog(source, "send", message, data);
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/** Log an incoming message (from server) */
|
|
134
|
+
recv(source: string, message: string, data?: unknown): void {
|
|
135
|
+
addLog(source, "recv", message, data);
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
/** Check if debug is enabled */
|
|
139
|
+
isEnabled(): boolean {
|
|
140
|
+
return state.enabled;
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Browser console API
|
|
145
|
+
const consoleAPI = {
|
|
146
|
+
enable(): void {
|
|
147
|
+
state.enabled = true;
|
|
148
|
+
console.warn("%c[AutoCore Debug] Logging ENABLED", "color: #44ff44; font-weight: bold;");
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
disable(): void {
|
|
152
|
+
state.enabled = false;
|
|
153
|
+
console.warn("%c[AutoCore Debug] Logging DISABLED", "color: #ff4444; font-weight: bold;");
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
get logs(): DebugLogEntry[] {
|
|
157
|
+
return [...state.logs];
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
clear(): void {
|
|
161
|
+
state.logs = [];
|
|
162
|
+
console.warn("%c[AutoCore Debug] Logs cleared", "color: #ffaa00;");
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
dump(): void {
|
|
166
|
+
console.group("[AutoCore Debug] Full Log Dump");
|
|
167
|
+
for (const entry of state.logs) {
|
|
168
|
+
const formatted = formatEntry(entry);
|
|
169
|
+
switch (entry.level) {
|
|
170
|
+
case "send":
|
|
171
|
+
console.log(`%c>>> ${formatted}`, "color: #44ff44;", entry.data);
|
|
172
|
+
break;
|
|
173
|
+
case "recv":
|
|
174
|
+
console.log(`%c<<< ${formatted}`, "color: #4444ff;", entry.data);
|
|
175
|
+
break;
|
|
176
|
+
case "error":
|
|
177
|
+
console.log(`%c${formatted}`, "color: #ff4444;", entry.data);
|
|
178
|
+
break;
|
|
179
|
+
default:
|
|
180
|
+
console.log(formatted, entry.data);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
console.groupEnd();
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
/** Filter logs by source */
|
|
187
|
+
filterBySource(source: string): DebugLogEntry[] {
|
|
188
|
+
return state.logs.filter((e) => e.source.includes(source));
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
/** Filter logs by level */
|
|
192
|
+
filterByLevel(level: DebugLogEntry["level"]): DebugLogEntry[] {
|
|
193
|
+
return state.logs.filter((e) => e.level === level);
|
|
194
|
+
},
|
|
195
|
+
|
|
196
|
+
/** Get only send/recv messages */
|
|
197
|
+
getMessages(): DebugLogEntry[] {
|
|
198
|
+
return state.logs.filter((e) => e.level === "send" || e.level === "recv");
|
|
199
|
+
},
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// Attach to window for browser console access
|
|
203
|
+
if (typeof window !== "undefined") {
|
|
204
|
+
(window as unknown as { __AUTOCORE_DEBUG__: typeof consoleAPI }).__AUTOCORE_DEBUG__ = consoleAPI;
|
|
205
|
+
console.warn(
|
|
206
|
+
"%c[AutoCore Debug] Debug utility loaded. Access via window.__AUTOCORE_DEBUG__",
|
|
207
|
+
"color: #44ff44; font-weight: bold;"
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export default debug;
|
package/src/hub/index.ts
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (C) 2024 Automated Design Corp. All Rights Reserved.
|
|
3
|
-
* Created Date: 2024-01-16 21:07:29
|
|
4
|
-
* -----
|
|
5
|
-
* Last Modified: 2026-01-29 09:34:39
|
|
6
|
-
* Modified By: ADC
|
|
7
|
-
* -----
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
console.log("[hub/index.ts] Module loading...");
|
|
12
|
-
|
|
13
|
-
import { HubBase as Hub } from './HubBase';
|
|
14
|
-
import { HubTauri } from './HubTauri';
|
|
15
|
-
import { HubWebSocket } from "./HubWebSocket";
|
|
16
|
-
import { HubSimulate } from "./HubSimulate";
|
|
17
|
-
import { getDebugPanel } from "./DebugPanel";
|
|
18
|
-
|
|
19
|
-
console.log("[hub/index.ts] Imports complete");
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Singleton hub instance.
|
|
23
|
-
* This ensures all components share the same connection to the backend.
|
|
24
|
-
*/
|
|
25
|
-
let hubInstance: Hub | null = null;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Creates or returns the singleton Hub connection to the backend.
|
|
29
|
-
*
|
|
30
|
-
* The hub type is determined automatically:
|
|
31
|
-
* - If running in Tauri: HubTauri (direct Rust IPC)
|
|
32
|
-
* - Otherwise: HubWebSocket (WebSocket to autocore-server)
|
|
33
|
-
*
|
|
34
|
-
* @returns Hub The singleton hub instance
|
|
35
|
-
*/
|
|
36
|
-
export function createHub(): Hub {
|
|
37
|
-
console.log("[HUB] createHub() called");
|
|
38
|
-
const panel = getDebugPanel();
|
|
39
|
-
panel.log("info", "createHub", `called (hasInstance: ${!!hubInstance})`);
|
|
40
|
-
|
|
41
|
-
if (!hubInstance) {
|
|
42
|
-
if (typeof window !== 'undefined' && (window as any).__TAURI__ !== undefined && (window as any).__TAURI__ !== null) {
|
|
43
|
-
panel.log("info", "createHub", "Creating HubTauri instance");
|
|
44
|
-
hubInstance = new HubTauri();
|
|
45
|
-
} else {
|
|
46
|
-
panel.log("info", "createHub", "Creating HubWebSocket instance");
|
|
47
|
-
hubInstance = new HubWebSocket();
|
|
48
|
-
}
|
|
49
|
-
} else {
|
|
50
|
-
panel.log("info", "createHub", "Returning existing hub instance");
|
|
51
|
-
}
|
|
52
|
-
return hubInstance;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Returns the current hub instance, or null if not yet created.
|
|
57
|
-
* Useful for checking if a hub exists without creating one.
|
|
58
|
-
*/
|
|
59
|
-
export function getHubInstance(): Hub | null {
|
|
60
|
-
return hubInstance;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Resets the singleton hub instance.
|
|
65
|
-
* This should only be used for testing or when intentionally reconnecting.
|
|
66
|
-
*/
|
|
67
|
-
export function resetHub(): void {
|
|
68
|
-
hubInstance = null;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Export HubBase for convenience to save importing throughout the application.
|
|
72
|
-
export { HubBase as Hub } from './HubBase';
|
|
73
|
-
export { HubTauri };
|
|
74
|
-
export { HubWebSocket };
|
|
75
|
-
export { HubSimulate };
|
|
76
|
-
|
|
77
|
-
// Export CommandMessage types
|
|
78
|
-
export type { CommandMessage } from './CommandMessage';
|
|
79
|
-
export { MessageType } from './CommandMessage';
|
|
80
|
-
|
|
81
|
-
// Export DebugPanel utilities
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2024 Automated Design Corp. All Rights Reserved.
|
|
3
|
+
* Created Date: 2024-01-16 21:07:29
|
|
4
|
+
* -----
|
|
5
|
+
* Last Modified: 2026-01-29 09:34:39
|
|
6
|
+
* Modified By: ADC
|
|
7
|
+
* -----
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
console.log("[hub/index.ts] Module loading...");
|
|
12
|
+
|
|
13
|
+
import { HubBase as Hub } from './HubBase';
|
|
14
|
+
import { HubTauri } from './HubTauri';
|
|
15
|
+
import { HubWebSocket } from "./HubWebSocket";
|
|
16
|
+
import { HubSimulate } from "./HubSimulate";
|
|
17
|
+
import { getDebugPanel } from "./DebugPanel";
|
|
18
|
+
|
|
19
|
+
console.log("[hub/index.ts] Imports complete");
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Singleton hub instance.
|
|
23
|
+
* This ensures all components share the same connection to the backend.
|
|
24
|
+
*/
|
|
25
|
+
let hubInstance: Hub | null = null;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates or returns the singleton Hub connection to the backend.
|
|
29
|
+
*
|
|
30
|
+
* The hub type is determined automatically:
|
|
31
|
+
* - If running in Tauri: HubTauri (direct Rust IPC)
|
|
32
|
+
* - Otherwise: HubWebSocket (WebSocket to autocore-server)
|
|
33
|
+
*
|
|
34
|
+
* @returns Hub The singleton hub instance
|
|
35
|
+
*/
|
|
36
|
+
export function createHub(): Hub {
|
|
37
|
+
console.log("[HUB] createHub() called");
|
|
38
|
+
const panel = getDebugPanel();
|
|
39
|
+
panel.log("info", "createHub", `called (hasInstance: ${!!hubInstance})`);
|
|
40
|
+
|
|
41
|
+
if (!hubInstance) {
|
|
42
|
+
if (typeof window !== 'undefined' && (window as any).__TAURI__ !== undefined && (window as any).__TAURI__ !== null) {
|
|
43
|
+
panel.log("info", "createHub", "Creating HubTauri instance");
|
|
44
|
+
hubInstance = new HubTauri();
|
|
45
|
+
} else {
|
|
46
|
+
panel.log("info", "createHub", "Creating HubWebSocket instance");
|
|
47
|
+
hubInstance = new HubWebSocket();
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
panel.log("info", "createHub", "Returning existing hub instance");
|
|
51
|
+
}
|
|
52
|
+
return hubInstance;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Returns the current hub instance, or null if not yet created.
|
|
57
|
+
* Useful for checking if a hub exists without creating one.
|
|
58
|
+
*/
|
|
59
|
+
export function getHubInstance(): Hub | null {
|
|
60
|
+
return hubInstance;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Resets the singleton hub instance.
|
|
65
|
+
* This should only be used for testing or when intentionally reconnecting.
|
|
66
|
+
*/
|
|
67
|
+
export function resetHub(): void {
|
|
68
|
+
hubInstance = null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Export HubBase for convenience to save importing throughout the application.
|
|
72
|
+
export { HubBase as Hub } from './HubBase';
|
|
73
|
+
export { HubTauri };
|
|
74
|
+
export { HubWebSocket };
|
|
75
|
+
export { HubSimulate };
|
|
76
|
+
|
|
77
|
+
// Export CommandMessage types
|
|
78
|
+
export type { CommandMessage } from './CommandMessage';
|
|
79
|
+
export { MessageType } from './CommandMessage';
|
|
80
|
+
|
|
81
|
+
// Export DebugPanel utilities
|
|
82
82
|
export { enableDebugPanel } from './DebugPanel';
|