@elizaos/plugin-facewear 2.0.3-beta.5 → 2.0.3-beta.7
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/actions/display-text.d.ts +4 -0
- package/dist/actions/display-text.d.ts.map +1 -0
- package/dist/actions/display-text.js +90 -0
- package/dist/actions/display-text.js.map +1 -0
- package/dist/actions/facewear-connect.d.ts +3 -0
- package/dist/actions/facewear-connect.d.ts.map +1 -0
- package/dist/actions/facewear-connect.js +70 -0
- package/dist/actions/facewear-connect.js.map +1 -0
- package/dist/actions/facewear-control.d.ts +4 -0
- package/dist/actions/facewear-control.d.ts.map +1 -0
- package/dist/actions/facewear-control.js +627 -0
- package/dist/actions/facewear-control.js.map +1 -0
- package/dist/actions/facewear-debug.d.ts +3 -0
- package/dist/actions/facewear-debug.d.ts.map +1 -0
- package/dist/actions/facewear-debug.js +62 -0
- package/dist/actions/facewear-debug.js.map +1 -0
- package/dist/actions/facewear-status.d.ts +4 -0
- package/dist/actions/facewear-status.d.ts.map +1 -0
- package/dist/actions/facewear-status.js +66 -0
- package/dist/actions/facewear-status.js.map +1 -0
- package/dist/actions/microphone.d.ts +4 -0
- package/dist/actions/microphone.d.ts.map +1 -0
- package/dist/actions/microphone.js +63 -0
- package/dist/actions/microphone.js.map +1 -0
- package/dist/actions/view-actions.d.ts +23 -0
- package/dist/actions/view-actions.d.ts.map +1 -0
- package/dist/actions/view-actions.js +314 -0
- package/dist/actions/view-actions.js.map +1 -0
- package/dist/actions/vision-query.d.ts +4 -0
- package/dist/actions/vision-query.d.ts.map +1 -0
- package/dist/actions/vision-query.js +41 -0
- package/dist/actions/vision-query.js.map +1 -0
- package/dist/actions/xr-view-actions.d.ts +14 -0
- package/dist/actions/xr-view-actions.d.ts.map +1 -0
- package/dist/actions/xr-view-actions.js +29 -0
- package/dist/actions/xr-view-actions.js.map +1 -0
- package/dist/components/FacewearSpatialView.d.ts +50 -0
- package/dist/components/FacewearSpatialView.d.ts.map +1 -0
- package/dist/components/FacewearSpatialView.js +129 -0
- package/dist/components/FacewearSpatialView.js.map +1 -0
- package/dist/components/FacewearView.d.ts +17 -0
- package/dist/components/FacewearView.d.ts.map +1 -0
- package/dist/components/FacewearView.js +88 -0
- package/dist/components/FacewearView.js.map +1 -0
- package/dist/components/SmartglassesPanelView.d.ts +22 -0
- package/dist/components/SmartglassesPanelView.d.ts.map +1 -0
- package/dist/components/SmartglassesPanelView.js +140 -0
- package/dist/components/SmartglassesPanelView.js.map +1 -0
- package/dist/components/SmartglassesSpatialView.d.ts +46 -0
- package/dist/components/SmartglassesSpatialView.d.ts.map +1 -0
- package/dist/components/SmartglassesSpatialView.js +240 -0
- package/dist/components/SmartglassesSpatialView.js.map +1 -0
- package/dist/components/facewear-profiles.d.ts +27 -0
- package/dist/components/facewear-profiles.d.ts.map +1 -0
- package/dist/components/facewear-profiles.js +40 -0
- package/dist/components/facewear-profiles.js.map +1 -0
- package/dist/devices/apple-vision-pro.d.ts +7 -0
- package/dist/devices/apple-vision-pro.d.ts.map +1 -0
- package/dist/devices/apple-vision-pro.js +21 -0
- package/dist/devices/apple-vision-pro.js.map +1 -0
- package/dist/devices/even-realities.d.ts +7 -0
- package/dist/devices/even-realities.d.ts.map +1 -0
- package/dist/devices/even-realities.js +13 -0
- package/dist/devices/even-realities.js.map +1 -0
- package/dist/devices/meta-quest.d.ts +5 -0
- package/dist/devices/meta-quest.d.ts.map +1 -0
- package/dist/devices/meta-quest.js +21 -0
- package/dist/devices/meta-quest.js.map +1 -0
- package/dist/devices/registry.d.ts +19 -0
- package/dist/devices/registry.d.ts.map +1 -0
- package/dist/devices/registry.js +96 -0
- package/dist/devices/registry.js.map +1 -0
- package/dist/devices/xreal.d.ts +7 -0
- package/dist/devices/xreal.d.ts.map +1 -0
- package/dist/devices/xreal.js +19 -0
- package/dist/devices/xreal.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +260 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/smartglasses.d.ts +306 -0
- package/dist/protocol/smartglasses.d.ts.map +1 -0
- package/dist/protocol/smartglasses.js +1485 -0
- package/dist/protocol/smartglasses.js.map +1 -0
- package/dist/protocol/xr.d.ts +137 -0
- package/dist/protocol/xr.d.ts.map +1 -0
- package/dist/protocol/xr.js +18 -0
- package/dist/protocol/xr.js.map +1 -0
- package/dist/providers/facewear-context.d.ts +3 -0
- package/dist/providers/facewear-context.d.ts.map +1 -0
- package/dist/providers/facewear-context.js +59 -0
- package/dist/providers/facewear-context.js.map +1 -0
- package/dist/providers/smartglasses-status.d.ts +3 -0
- package/dist/providers/smartglasses-status.d.ts.map +1 -0
- package/dist/providers/smartglasses-status.js +33 -0
- package/dist/providers/smartglasses-status.js.map +1 -0
- package/dist/register-terminal-view.d.ts +21 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +70 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/register.d.ts +8 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +116 -0
- package/dist/register.js.map +1 -0
- package/dist/routes/connect.d.ts +3 -0
- package/dist/routes/connect.d.ts.map +1 -0
- package/dist/routes/connect.js +86 -0
- package/dist/routes/connect.js.map +1 -0
- package/dist/routes/device-config.d.ts +5 -0
- package/dist/routes/device-config.d.ts.map +1 -0
- package/dist/routes/device-config.js +56 -0
- package/dist/routes/device-config.js.map +1 -0
- package/dist/routes/simulator-route.d.ts +8 -0
- package/dist/routes/simulator-route.d.ts.map +1 -0
- package/dist/routes/simulator-route.js +32 -0
- package/dist/routes/simulator-route.js.map +1 -0
- package/dist/routes/status.d.ts +3 -0
- package/dist/routes/status.d.ts.map +1 -0
- package/dist/routes/status.js +34 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/view-host.d.ts +24 -0
- package/dist/routes/view-host.d.ts.map +1 -0
- package/dist/routes/view-host.js +339 -0
- package/dist/routes/view-host.js.map +1 -0
- package/dist/routes/views.d.ts +8 -0
- package/dist/routes/views.d.ts.map +1 -0
- package/dist/routes/views.js +31 -0
- package/dist/routes/views.js.map +1 -0
- package/dist/services/audio-pipeline.d.ts +20 -0
- package/dist/services/audio-pipeline.d.ts.map +1 -0
- package/dist/services/audio-pipeline.js +87 -0
- package/dist/services/audio-pipeline.js.map +1 -0
- package/dist/services/facewear-service.d.ts +26 -0
- package/dist/services/facewear-service.d.ts.map +1 -0
- package/dist/services/facewear-service.js +45 -0
- package/dist/services/facewear-service.js.map +1 -0
- package/dist/services/smartglasses-service.d.ts +244 -0
- package/dist/services/smartglasses-service.d.ts.map +1 -0
- package/dist/services/smartglasses-service.js +821 -0
- package/dist/services/smartglasses-service.js.map +1 -0
- package/dist/services/vision-pipeline.d.ts +16 -0
- package/dist/services/vision-pipeline.d.ts.map +1 -0
- package/dist/services/vision-pipeline.js +39 -0
- package/dist/services/vision-pipeline.js.map +1 -0
- package/dist/services/xr-session-service.d.ts +54 -0
- package/dist/services/xr-session-service.d.ts.map +1 -0
- package/dist/services/xr-session-service.js +345 -0
- package/dist/services/xr-session-service.js.map +1 -0
- package/dist/status-format.d.ts +15 -0
- package/dist/status-format.d.ts.map +1 -0
- package/dist/status-format.js +89 -0
- package/dist/status-format.js.map +1 -0
- package/dist/transport/even-bridge.d.ts +69 -0
- package/dist/transport/even-bridge.d.ts.map +1 -0
- package/dist/transport/even-bridge.js +510 -0
- package/dist/transport/even-bridge.js.map +1 -0
- package/dist/transport/mock.d.ts +42 -0
- package/dist/transport/mock.d.ts.map +1 -0
- package/dist/transport/mock.js +124 -0
- package/dist/transport/mock.js.map +1 -0
- package/dist/transport/noble.d.ts +62 -0
- package/dist/transport/noble.d.ts.map +1 -0
- package/dist/transport/noble.js +256 -0
- package/dist/transport/noble.js.map +1 -0
- package/dist/transport/types.d.ts +36 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +1 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/web-bluetooth.d.ts +58 -0
- package/dist/transport/web-bluetooth.d.ts.map +1 -0
- package/dist/transport/web-bluetooth.js +164 -0
- package/dist/transport/web-bluetooth.js.map +1 -0
- package/dist/ui/FacewearAppView.d.ts +4 -0
- package/dist/ui/FacewearAppView.d.ts.map +1 -0
- package/dist/ui/FacewearAppView.js +257 -0
- package/dist/ui/FacewearAppView.js.map +1 -0
- package/dist/ui/SmartglassesView.d.ts +10 -0
- package/dist/ui/SmartglassesView.d.ts.map +1 -0
- package/dist/ui/SmartglassesView.helpers.d.ts +104 -0
- package/dist/ui/SmartglassesView.helpers.d.ts.map +1 -0
- package/dist/ui/SmartglassesView.helpers.js +261 -0
- package/dist/ui/SmartglassesView.helpers.js.map +1 -0
- package/dist/ui/SmartglassesView.js +1189 -0
- package/dist/ui/SmartglassesView.js.map +1 -0
- package/dist/ui/facewear-view-bundle.d.ts +5 -0
- package/dist/ui/facewear-view-bundle.d.ts.map +1 -0
- package/dist/ui/facewear-view-bundle.js +17 -0
- package/dist/ui/facewear-view-bundle.js.map +1 -0
- package/dist/views/bundle.js +2950 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,627 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseJSONObjectFromText
|
|
3
|
+
} from "@elizaos/core";
|
|
4
|
+
import {
|
|
5
|
+
G1DashboardLayout,
|
|
6
|
+
G1SubCommand,
|
|
7
|
+
G1TemperatureUnit,
|
|
8
|
+
G1TimeFormat
|
|
9
|
+
} from "../protocol/smartglasses.js";
|
|
10
|
+
import {
|
|
11
|
+
getSmartglassesService
|
|
12
|
+
} from "../services/smartglasses-service.js";
|
|
13
|
+
import { setupSummaryForStatus } from "../status-format.js";
|
|
14
|
+
const SUPPORTED_OPS = [
|
|
15
|
+
"connect",
|
|
16
|
+
"disconnect",
|
|
17
|
+
"clear",
|
|
18
|
+
"exit_dashboard",
|
|
19
|
+
"exit_function",
|
|
20
|
+
"start_ai",
|
|
21
|
+
"connection_ready",
|
|
22
|
+
"page_up",
|
|
23
|
+
"page_down",
|
|
24
|
+
"rsvp_text",
|
|
25
|
+
"heartbeat",
|
|
26
|
+
"heartbeat_start",
|
|
27
|
+
"heartbeat_stop",
|
|
28
|
+
"battery_status",
|
|
29
|
+
"raw",
|
|
30
|
+
"get_serial",
|
|
31
|
+
"app_whitelist",
|
|
32
|
+
"g1_setup",
|
|
33
|
+
"silent_mode",
|
|
34
|
+
"brightness",
|
|
35
|
+
"dashboard",
|
|
36
|
+
"dashboard_position",
|
|
37
|
+
"dashboard_layout",
|
|
38
|
+
"dashboard_calendar",
|
|
39
|
+
"dashboard_time_weather",
|
|
40
|
+
"headup_angle",
|
|
41
|
+
"wear_detection",
|
|
42
|
+
"wifi_scan",
|
|
43
|
+
"wifi_status",
|
|
44
|
+
"wifi_configure",
|
|
45
|
+
"wifi_setup",
|
|
46
|
+
"navigation_start",
|
|
47
|
+
"navigation_directions",
|
|
48
|
+
"navigation_primary_image",
|
|
49
|
+
"navigation_secondary_image",
|
|
50
|
+
"navigation_poller",
|
|
51
|
+
"navigation_end",
|
|
52
|
+
"translate_setup",
|
|
53
|
+
"translate_start",
|
|
54
|
+
"translate_languages",
|
|
55
|
+
"translate_original",
|
|
56
|
+
"translate_translated",
|
|
57
|
+
"note_add",
|
|
58
|
+
"note_delete",
|
|
59
|
+
"voice_note_list",
|
|
60
|
+
"voice_note_fetch",
|
|
61
|
+
"voice_note_delete",
|
|
62
|
+
"voice_note_delete_all",
|
|
63
|
+
"notification",
|
|
64
|
+
"bmp_image"
|
|
65
|
+
];
|
|
66
|
+
const OP_ALIASES = /* @__PURE__ */ new Map([
|
|
67
|
+
["pair", "connect"],
|
|
68
|
+
["pair_headset", "connect"],
|
|
69
|
+
["connect_headset", "connect"],
|
|
70
|
+
["reconnect", "connect"],
|
|
71
|
+
["unpair", "disconnect"],
|
|
72
|
+
["disconnect_headset", "disconnect"],
|
|
73
|
+
["exit", "exit_dashboard"],
|
|
74
|
+
["dashboard_exit", "exit_dashboard"],
|
|
75
|
+
["function_exit", "exit_function"],
|
|
76
|
+
["serial", "get_serial"],
|
|
77
|
+
["whitelist", "app_whitelist"],
|
|
78
|
+
["app_allowlist", "app_whitelist"],
|
|
79
|
+
["setup", "g1_setup"],
|
|
80
|
+
["app_setup", "g1_setup"],
|
|
81
|
+
["dashboard_calendar_item", "dashboard_calendar"],
|
|
82
|
+
["set_dashboard_position", "dashboard_position"],
|
|
83
|
+
["dashboard_height_depth", "dashboard_position"],
|
|
84
|
+
["dashboard_depth", "dashboard_position"],
|
|
85
|
+
["time_weather", "dashboard_time_weather"],
|
|
86
|
+
["navigation_init", "navigation_start"],
|
|
87
|
+
["navigation_direction", "navigation_directions"],
|
|
88
|
+
["navigation_primary", "navigation_primary_image"],
|
|
89
|
+
["navigation_secondary", "navigation_secondary_image"],
|
|
90
|
+
["navigation_stop", "navigation_end"],
|
|
91
|
+
["translate", "translate_setup"],
|
|
92
|
+
["translation_setup", "translate_setup"],
|
|
93
|
+
["translate_text", "translate_translated"],
|
|
94
|
+
["start_even_ai", "start_ai"],
|
|
95
|
+
["init", "connection_ready"],
|
|
96
|
+
["initialize", "connection_ready"],
|
|
97
|
+
["connection_init", "connection_ready"],
|
|
98
|
+
["ready", "connection_ready"],
|
|
99
|
+
["previous_page", "page_up"],
|
|
100
|
+
["prev_page", "page_up"],
|
|
101
|
+
["next_page", "page_down"],
|
|
102
|
+
["start_heartbeat", "heartbeat_start"],
|
|
103
|
+
["heartbeat_loop", "heartbeat_start"],
|
|
104
|
+
["stop_heartbeat", "heartbeat_stop"],
|
|
105
|
+
["battery", "battery_status"],
|
|
106
|
+
["get_battery", "battery_status"],
|
|
107
|
+
["request_battery", "battery_status"],
|
|
108
|
+
["battery_request", "battery_status"],
|
|
109
|
+
["rsvp", "rsvp_text"],
|
|
110
|
+
["rsvp_display", "rsvp_text"],
|
|
111
|
+
["bmp", "bmp_image"],
|
|
112
|
+
["image", "bmp_image"],
|
|
113
|
+
["quick_note_fetch", "voice_note_fetch"],
|
|
114
|
+
["quick_note_list", "voice_note_list"],
|
|
115
|
+
["quick_note_info", "voice_note_list"],
|
|
116
|
+
["voice_note_info", "voice_note_list"],
|
|
117
|
+
["voice_notes", "voice_note_list"],
|
|
118
|
+
["quick_note_delete", "voice_note_delete"],
|
|
119
|
+
["quick_note_delete_all", "voice_note_delete_all"],
|
|
120
|
+
["delete_all_voice_notes", "voice_note_delete_all"],
|
|
121
|
+
["voice_notes_delete_all", "voice_note_delete_all"],
|
|
122
|
+
["clear_voice_notes", "voice_note_delete_all"],
|
|
123
|
+
["voice_note_audio", "voice_note_fetch"],
|
|
124
|
+
["scan_wifi", "wifi_scan"],
|
|
125
|
+
["wifi_networks", "wifi_scan"],
|
|
126
|
+
["wifi", "wifi_status"],
|
|
127
|
+
["wifi_connect", "wifi_configure"],
|
|
128
|
+
["configure_wifi", "wifi_configure"],
|
|
129
|
+
["set_wifi", "wifi_configure"],
|
|
130
|
+
["wifi_prompt", "wifi_setup"],
|
|
131
|
+
["wifi_setup_request", "wifi_setup"],
|
|
132
|
+
["request_wifi_setup", "wifi_setup"]
|
|
133
|
+
]);
|
|
134
|
+
function parseParams(message) {
|
|
135
|
+
const text = message.content?.text ?? "";
|
|
136
|
+
return parseJSONObjectFromText(text) ?? {
|
|
137
|
+
op: text.trim()
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function requireOp(value) {
|
|
141
|
+
if (typeof value !== "string") return null;
|
|
142
|
+
const normalized = value.trim().replace(/[\s-]+/g, "_").toLowerCase();
|
|
143
|
+
const alias = OP_ALIASES.get(normalized);
|
|
144
|
+
if (alias) return alias;
|
|
145
|
+
return SUPPORTED_OPS.includes(normalized) ? normalized : null;
|
|
146
|
+
}
|
|
147
|
+
function numberParam(params, name) {
|
|
148
|
+
const value = params[name];
|
|
149
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
150
|
+
if (!Number.isFinite(parsed))
|
|
151
|
+
throw new Error(`Missing numeric parameter: ${name}`);
|
|
152
|
+
return parsed;
|
|
153
|
+
}
|
|
154
|
+
function stringParam(params, name) {
|
|
155
|
+
const value = params[name];
|
|
156
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
157
|
+
throw new Error(`Missing string parameter: ${name}`);
|
|
158
|
+
}
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
function boolParam(params, name, fallback = false) {
|
|
162
|
+
const value = params[name];
|
|
163
|
+
if (typeof value === "boolean") return value;
|
|
164
|
+
if (typeof value === "string")
|
|
165
|
+
return /^(true|1|yes|on|enable|enabled)$/i.test(value);
|
|
166
|
+
return fallback;
|
|
167
|
+
}
|
|
168
|
+
function sideParam(params, fallback = "both") {
|
|
169
|
+
const value = params.side ?? params.target;
|
|
170
|
+
if (value === void 0) return fallback;
|
|
171
|
+
if (value === "left" || value === "right" || value === "both") return value;
|
|
172
|
+
throw new Error("side must be left, right, or both");
|
|
173
|
+
}
|
|
174
|
+
function connectionReadyModeParam(params) {
|
|
175
|
+
const value = String(params.initMode ?? params.mode ?? params.variant ?? "").trim().toLowerCase();
|
|
176
|
+
if (value === "official" || value === "official-app" || value === "even-demo-app" || value === "same-init")
|
|
177
|
+
return "official";
|
|
178
|
+
if (value === "android-f4" || value === "android" || value === "even-demo-android" || value === "f4")
|
|
179
|
+
return "android-f4";
|
|
180
|
+
return "lens-specific";
|
|
181
|
+
}
|
|
182
|
+
function singleSideParam(params, fallback = "right") {
|
|
183
|
+
const side = sideParam(params, fallback);
|
|
184
|
+
return side === "both" ? fallback : side;
|
|
185
|
+
}
|
|
186
|
+
function whitelistParam(params) {
|
|
187
|
+
const value = params.whitelist ?? params.allowlist ?? params.json ?? params.data;
|
|
188
|
+
if (typeof value === "string" || Array.isArray(value)) return value;
|
|
189
|
+
if (value && typeof value === "object")
|
|
190
|
+
return value;
|
|
191
|
+
throw new Error(
|
|
192
|
+
"Missing whitelist payload: whitelist, allowlist, json, or data"
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
function startAiSubcommand(value) {
|
|
196
|
+
if (typeof value === "number") return value;
|
|
197
|
+
if (typeof value !== "string") return G1SubCommand.Start;
|
|
198
|
+
const normalized = value.trim().replace(/[\s-]+/g, "_").toLowerCase();
|
|
199
|
+
if (normalized === "exit" || normalized === "exit_dashboard")
|
|
200
|
+
return G1SubCommand.Exit;
|
|
201
|
+
if (normalized === "stop" || normalized === "clear") return G1SubCommand.Stop;
|
|
202
|
+
return G1SubCommand.Start;
|
|
203
|
+
}
|
|
204
|
+
function bytesParam(params) {
|
|
205
|
+
const value = params.data ?? params.bytes ?? params.hex ?? params.base64;
|
|
206
|
+
if (value instanceof Uint8Array) return value;
|
|
207
|
+
if (Array.isArray(value) && value.every((item) => Number.isInteger(item))) {
|
|
208
|
+
return Uint8Array.from(value);
|
|
209
|
+
}
|
|
210
|
+
if (typeof value !== "string" || value.trim() === "") {
|
|
211
|
+
throw new Error("Missing byte payload: data, bytes, hex, or base64");
|
|
212
|
+
}
|
|
213
|
+
const text = value.trim();
|
|
214
|
+
if (/^(?:0x)?[0-9a-f]+$/i.test(text) && text.replace(/^0x/i, "").length % 2 === 0) {
|
|
215
|
+
const hex = text.replace(/^0x/i, "");
|
|
216
|
+
return Uint8Array.from(
|
|
217
|
+
hex.match(/../g)?.map((byte) => Number.parseInt(byte, 16)) ?? []
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
if (typeof Buffer !== "undefined")
|
|
221
|
+
return Uint8Array.from(Buffer.from(text, "base64"));
|
|
222
|
+
if (typeof atob !== "undefined") {
|
|
223
|
+
return Uint8Array.from(atob(text), (char) => char.charCodeAt(0));
|
|
224
|
+
}
|
|
225
|
+
throw new Error("Base64 payload decoding is not available");
|
|
226
|
+
}
|
|
227
|
+
function pixelBytesParam(params) {
|
|
228
|
+
const value = params.pixels ?? params.pixelData ?? params.data;
|
|
229
|
+
return bytesParam({ data: value });
|
|
230
|
+
}
|
|
231
|
+
function numberArrayParam(params, name) {
|
|
232
|
+
const value = params[name];
|
|
233
|
+
if (Array.isArray(value) && value.every((item) => Number.isInteger(item))) {
|
|
234
|
+
return value.map(Number);
|
|
235
|
+
}
|
|
236
|
+
return Array.from(bytesParam({ data: value }));
|
|
237
|
+
}
|
|
238
|
+
function bitPlaneParam(params, name, expectedLength, fallbackBit) {
|
|
239
|
+
const value = params[name];
|
|
240
|
+
if (value === void 0 && fallbackBit !== void 0) {
|
|
241
|
+
return Array.from({ length: expectedLength }, () => fallbackBit);
|
|
242
|
+
}
|
|
243
|
+
const bits = numberArrayParam(params, name);
|
|
244
|
+
if (bits.length !== expectedLength) {
|
|
245
|
+
throw new Error(`${name} must contain ${expectedLength} bit values`);
|
|
246
|
+
}
|
|
247
|
+
return bits;
|
|
248
|
+
}
|
|
249
|
+
function dashboardLayoutParam(params) {
|
|
250
|
+
const value = String(params.layout ?? "full").toLowerCase();
|
|
251
|
+
if (value === "full") return G1DashboardLayout.Full;
|
|
252
|
+
if (value === "dual") return G1DashboardLayout.Dual;
|
|
253
|
+
if (value === "minimal") return G1DashboardLayout.Minimal;
|
|
254
|
+
throw new Error("layout must be full, dual, or minimal");
|
|
255
|
+
}
|
|
256
|
+
function temperatureUnitParam(value) {
|
|
257
|
+
if (value === void 0) return void 0;
|
|
258
|
+
const normalized = String(value).toLowerCase();
|
|
259
|
+
if (normalized === "f" || normalized === "fahrenheit")
|
|
260
|
+
return G1TemperatureUnit.Fahrenheit;
|
|
261
|
+
if (normalized === "c" || normalized === "celsius")
|
|
262
|
+
return G1TemperatureUnit.Celsius;
|
|
263
|
+
throw new Error("temperatureUnit must be celsius or fahrenheit");
|
|
264
|
+
}
|
|
265
|
+
function timeFormatParam(value) {
|
|
266
|
+
if (value === void 0) return void 0;
|
|
267
|
+
const normalized = String(value).toLowerCase();
|
|
268
|
+
if (normalized === "12" || normalized === "12h")
|
|
269
|
+
return G1TimeFormat.TwelveHour;
|
|
270
|
+
if (normalized === "24" || normalized === "24h")
|
|
271
|
+
return G1TimeFormat.TwentyFourHour;
|
|
272
|
+
throw new Error("timeFormat must be 12h or 24h");
|
|
273
|
+
}
|
|
274
|
+
function wifiActionValue(result) {
|
|
275
|
+
return {
|
|
276
|
+
available: result.available,
|
|
277
|
+
status: result.status,
|
|
278
|
+
networks: result.networks
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
function statusActionValue(status) {
|
|
282
|
+
return {
|
|
283
|
+
...status,
|
|
284
|
+
setup: setupSummaryForStatus(status)
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function actionErrorMessage(error) {
|
|
288
|
+
return error instanceof Error ? error.message : String(error);
|
|
289
|
+
}
|
|
290
|
+
const smartglassesControlAction = {
|
|
291
|
+
name: "SMARTGLASSES_CONTROL",
|
|
292
|
+
similes: [
|
|
293
|
+
"EVEN_GLASSES_CONTROL",
|
|
294
|
+
"SMARTGLASSES_SETTINGS",
|
|
295
|
+
"SMARTGLASSES_NOTIFICATION",
|
|
296
|
+
"SMARTGLASSES_NOTE"
|
|
297
|
+
],
|
|
298
|
+
description: "Run Even Realities G1 control operations: whole-headset connect/disconnect, clear/exit/start AI, connection-ready init including official iOS same-init and Android F4 same-init modes, RSVP display, heartbeat loop, battery status request, raw packets, serial request, app whitelist/setup, silent mode, brightness, bridge Wi-Fi scan/status/configure, dashboard position/content, navigation, translation overlays, head-up angle, wear detection, notes, voice-note list/fetch/delete/delete-all, notifications, and BMP images. Provide JSON with op and parameters.",
|
|
299
|
+
descriptionCompressed: "smartglasses-control: connect, display session, raw packets, settings, Wi-Fi, dashboard, navigation, translate, notes, notifications, BMP",
|
|
300
|
+
contexts: ["smartglasses", "wearable", "operations"],
|
|
301
|
+
validate: async (runtime) => Boolean(getSmartglassesService(runtime)),
|
|
302
|
+
handler: async (runtime, message, _state, _options, callback) => {
|
|
303
|
+
const service = getSmartglassesService(runtime);
|
|
304
|
+
if (!service)
|
|
305
|
+
return { success: false, text: "Smartglasses service not loaded" };
|
|
306
|
+
const params = parseParams(message);
|
|
307
|
+
const op = requireOp(params.op);
|
|
308
|
+
if (!op) {
|
|
309
|
+
return {
|
|
310
|
+
success: false,
|
|
311
|
+
text: "Provide a supported smartglasses op.",
|
|
312
|
+
values: {
|
|
313
|
+
supportedOps: SUPPORTED_OPS.join(",")
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
let operationResult;
|
|
318
|
+
try {
|
|
319
|
+
switch (op) {
|
|
320
|
+
case "connect":
|
|
321
|
+
await service.connect();
|
|
322
|
+
if (boolParam(params, "init", true)) {
|
|
323
|
+
await service.sendConnectionReady(
|
|
324
|
+
sideParam(params),
|
|
325
|
+
connectionReadyModeParam(params)
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
operationResult = statusActionValue(service.getStatus());
|
|
329
|
+
break;
|
|
330
|
+
case "disconnect":
|
|
331
|
+
await service.disconnect();
|
|
332
|
+
operationResult = statusActionValue(service.getStatus());
|
|
333
|
+
break;
|
|
334
|
+
case "clear":
|
|
335
|
+
await service.clearDisplay();
|
|
336
|
+
break;
|
|
337
|
+
case "exit_dashboard":
|
|
338
|
+
await service.exitToDashboard();
|
|
339
|
+
break;
|
|
340
|
+
case "exit_function":
|
|
341
|
+
await service.exitFunction();
|
|
342
|
+
break;
|
|
343
|
+
case "start_ai":
|
|
344
|
+
await service.sendStartAi(
|
|
345
|
+
startAiSubcommand(params.subcommand),
|
|
346
|
+
params.param === void 0 ? new Uint8Array() : bytesParam({ data: params.param })
|
|
347
|
+
);
|
|
348
|
+
break;
|
|
349
|
+
case "connection_ready":
|
|
350
|
+
await service.sendConnectionReady(
|
|
351
|
+
sideParam(params),
|
|
352
|
+
connectionReadyModeParam(params)
|
|
353
|
+
);
|
|
354
|
+
break;
|
|
355
|
+
case "page_up":
|
|
356
|
+
await service.pageUp();
|
|
357
|
+
break;
|
|
358
|
+
case "page_down":
|
|
359
|
+
await service.pageDown();
|
|
360
|
+
break;
|
|
361
|
+
case "rsvp_text":
|
|
362
|
+
await service.displayRsvpText(stringParam(params, "text"), {
|
|
363
|
+
wordsPerGroup: params.wordsPerGroup === void 0 ? void 0 : numberParam(params, "wordsPerGroup"),
|
|
364
|
+
wpm: params.wpm === void 0 ? void 0 : numberParam(params, "wpm"),
|
|
365
|
+
paddingChar: typeof params.paddingChar === "string" ? params.paddingChar : void 0,
|
|
366
|
+
mode: params.mode === "text" || params.mode === "ai" ? params.mode : void 0,
|
|
367
|
+
skipDelay: boolParam(params, "skipDelay", false)
|
|
368
|
+
});
|
|
369
|
+
break;
|
|
370
|
+
case "heartbeat":
|
|
371
|
+
await service.sendHeartbeat(
|
|
372
|
+
params.seq === void 0 ? void 0 : numberParam(params, "seq")
|
|
373
|
+
);
|
|
374
|
+
break;
|
|
375
|
+
case "heartbeat_start":
|
|
376
|
+
service.startHeartbeatLoop({
|
|
377
|
+
intervalMs: params.intervalMs === void 0 ? void 0 : numberParam(params, "intervalMs"),
|
|
378
|
+
immediate: boolParam(params, "immediate", true)
|
|
379
|
+
});
|
|
380
|
+
break;
|
|
381
|
+
case "heartbeat_stop":
|
|
382
|
+
service.stopHeartbeatLoop();
|
|
383
|
+
break;
|
|
384
|
+
case "battery_status":
|
|
385
|
+
await service.requestBatteryStatus(sideParam(params));
|
|
386
|
+
break;
|
|
387
|
+
case "raw":
|
|
388
|
+
await service.sendRaw(bytesParam(params), sideParam(params));
|
|
389
|
+
break;
|
|
390
|
+
case "get_serial":
|
|
391
|
+
await service.requestSerial(sideParam(params));
|
|
392
|
+
break;
|
|
393
|
+
case "app_whitelist":
|
|
394
|
+
operationResult = await service.sendAppWhitelist(
|
|
395
|
+
whitelistParam(params),
|
|
396
|
+
sideParam(params, "left")
|
|
397
|
+
);
|
|
398
|
+
break;
|
|
399
|
+
case "g1_setup":
|
|
400
|
+
operationResult = await service.sendG1Setup(
|
|
401
|
+
whitelistParam(params),
|
|
402
|
+
sideParam(params, "left")
|
|
403
|
+
);
|
|
404
|
+
break;
|
|
405
|
+
case "silent_mode":
|
|
406
|
+
await service.setSilentMode(boolParam(params, "enabled", true));
|
|
407
|
+
break;
|
|
408
|
+
case "brightness":
|
|
409
|
+
await service.setBrightness(
|
|
410
|
+
numberParam(params, "level"),
|
|
411
|
+
boolParam(params, "auto", false)
|
|
412
|
+
);
|
|
413
|
+
break;
|
|
414
|
+
case "dashboard":
|
|
415
|
+
await service.setDashboard(
|
|
416
|
+
boolParam(params, "enabled", true),
|
|
417
|
+
params.position === void 0 ? 0 : numberParam(params, "position")
|
|
418
|
+
);
|
|
419
|
+
break;
|
|
420
|
+
case "dashboard_position":
|
|
421
|
+
await service.setDashboardPosition(
|
|
422
|
+
numberParam(params, "height"),
|
|
423
|
+
numberParam(params, "depth")
|
|
424
|
+
);
|
|
425
|
+
break;
|
|
426
|
+
case "dashboard_layout":
|
|
427
|
+
await service.setDashboardLayout(dashboardLayoutParam(params));
|
|
428
|
+
break;
|
|
429
|
+
case "dashboard_calendar":
|
|
430
|
+
await service.sendDashboardCalendarItem({
|
|
431
|
+
name: stringParam(params, "name"),
|
|
432
|
+
time: stringParam(params, "time"),
|
|
433
|
+
location: stringParam(params, "location")
|
|
434
|
+
});
|
|
435
|
+
break;
|
|
436
|
+
case "dashboard_time_weather":
|
|
437
|
+
await service.sendDashboardTimeWeather({
|
|
438
|
+
seqId: params.seqId === void 0 ? void 0 : numberParam(params, "seqId"),
|
|
439
|
+
timestampMs: params.timestampMs === void 0 ? void 0 : numberParam(params, "timestampMs"),
|
|
440
|
+
timezoneOffsetSeconds: params.timezoneOffsetSeconds === void 0 ? void 0 : numberParam(params, "timezoneOffsetSeconds"),
|
|
441
|
+
temperatureInCelsius: numberParam(params, "temperatureInCelsius"),
|
|
442
|
+
weatherIcon: params.weatherIcon === void 0 ? void 0 : numberParam(params, "weatherIcon"),
|
|
443
|
+
temperatureUnit: temperatureUnitParam(params.temperatureUnit),
|
|
444
|
+
timeFormat: timeFormatParam(params.timeFormat)
|
|
445
|
+
});
|
|
446
|
+
break;
|
|
447
|
+
case "headup_angle":
|
|
448
|
+
await service.setHeadUpAngle(numberParam(params, "angle"));
|
|
449
|
+
break;
|
|
450
|
+
case "wear_detection":
|
|
451
|
+
await service.setGlassesWearDetection(
|
|
452
|
+
boolParam(params, "enabled", true)
|
|
453
|
+
);
|
|
454
|
+
break;
|
|
455
|
+
case "wifi_scan":
|
|
456
|
+
operationResult = wifiActionValue(await service.scanWifi());
|
|
457
|
+
break;
|
|
458
|
+
case "wifi_status":
|
|
459
|
+
operationResult = wifiActionValue(await service.getWifiStatus());
|
|
460
|
+
break;
|
|
461
|
+
case "wifi_configure":
|
|
462
|
+
operationResult = wifiActionValue(
|
|
463
|
+
await service.configureWifi(
|
|
464
|
+
stringParam(params, "ssid"),
|
|
465
|
+
typeof params.password === "string" ? params.password : ""
|
|
466
|
+
)
|
|
467
|
+
);
|
|
468
|
+
break;
|
|
469
|
+
case "wifi_setup":
|
|
470
|
+
operationResult = wifiActionValue(
|
|
471
|
+
await service.requestWifiSetup(
|
|
472
|
+
typeof params.reason === "string" ? params.reason : void 0
|
|
473
|
+
)
|
|
474
|
+
);
|
|
475
|
+
break;
|
|
476
|
+
case "navigation_start":
|
|
477
|
+
await service.startNavigation();
|
|
478
|
+
break;
|
|
479
|
+
case "navigation_directions":
|
|
480
|
+
await service.sendNavigationDirections({
|
|
481
|
+
seqId: params.seqId === void 0 ? void 0 : numberParam(params, "seqId"),
|
|
482
|
+
totalDuration: stringParam(params, "totalDuration"),
|
|
483
|
+
totalDistance: stringParam(params, "totalDistance"),
|
|
484
|
+
direction: stringParam(params, "direction"),
|
|
485
|
+
distance: stringParam(params, "distance"),
|
|
486
|
+
speed: stringParam(params, "speed"),
|
|
487
|
+
directionTurn: numberParam(params, "directionTurn"),
|
|
488
|
+
customX: Array.isArray(params.customX) ? params.customX : void 0,
|
|
489
|
+
customY: params.customY === void 0 ? void 0 : numberParam(params, "customY")
|
|
490
|
+
});
|
|
491
|
+
break;
|
|
492
|
+
case "navigation_primary_image":
|
|
493
|
+
operationResult = await service.sendNavigationPrimaryImage(
|
|
494
|
+
bitPlaneParam(params, "image", 136 * 136),
|
|
495
|
+
bitPlaneParam(params, "overlay", 136 * 136, 0)
|
|
496
|
+
);
|
|
497
|
+
break;
|
|
498
|
+
case "navigation_secondary_image":
|
|
499
|
+
operationResult = await service.sendNavigationSecondaryImage(
|
|
500
|
+
bitPlaneParam(params, "image", 488 * 136),
|
|
501
|
+
bitPlaneParam(params, "overlay", 488 * 136, 0)
|
|
502
|
+
);
|
|
503
|
+
break;
|
|
504
|
+
case "navigation_poller":
|
|
505
|
+
await service.sendNavigationPoller();
|
|
506
|
+
break;
|
|
507
|
+
case "navigation_end":
|
|
508
|
+
await service.endNavigation();
|
|
509
|
+
break;
|
|
510
|
+
case "translate_setup":
|
|
511
|
+
await service.sendTranslateSetup();
|
|
512
|
+
break;
|
|
513
|
+
case "translate_start":
|
|
514
|
+
await service.startTranslate();
|
|
515
|
+
break;
|
|
516
|
+
case "translate_languages":
|
|
517
|
+
await service.setTranslateLanguages(
|
|
518
|
+
numberParam(params, "fromLanguage"),
|
|
519
|
+
numberParam(params, "toLanguage")
|
|
520
|
+
);
|
|
521
|
+
break;
|
|
522
|
+
case "translate_original":
|
|
523
|
+
await service.sendTranslateText(
|
|
524
|
+
"original",
|
|
525
|
+
stringParam(params, "text"),
|
|
526
|
+
params.syncId === void 0 ? void 0 : numberParam(params, "syncId")
|
|
527
|
+
);
|
|
528
|
+
break;
|
|
529
|
+
case "translate_translated":
|
|
530
|
+
await service.sendTranslateText(
|
|
531
|
+
"translated",
|
|
532
|
+
stringParam(params, "text"),
|
|
533
|
+
params.syncId === void 0 ? void 0 : numberParam(params, "syncId")
|
|
534
|
+
);
|
|
535
|
+
break;
|
|
536
|
+
case "note_add":
|
|
537
|
+
await service.addOrUpdateNote(
|
|
538
|
+
numberParam(params, "noteNumber"),
|
|
539
|
+
stringParam(params, "title"),
|
|
540
|
+
stringParam(params, "text")
|
|
541
|
+
);
|
|
542
|
+
break;
|
|
543
|
+
case "note_delete":
|
|
544
|
+
await service.deleteNote(numberParam(params, "noteNumber"));
|
|
545
|
+
break;
|
|
546
|
+
case "voice_note_list":
|
|
547
|
+
operationResult = await service.requestVoiceNoteList({
|
|
548
|
+
syncId: params.syncId === void 0 ? void 0 : numberParam(params, "syncId"),
|
|
549
|
+
side: singleSideParam(params, "right")
|
|
550
|
+
});
|
|
551
|
+
break;
|
|
552
|
+
case "voice_note_fetch":
|
|
553
|
+
operationResult = await service.requestVoiceNoteAudio(
|
|
554
|
+
numberParam(params, "noteIndex"),
|
|
555
|
+
{
|
|
556
|
+
syncId: params.syncId === void 0 ? void 0 : numberParam(params, "syncId"),
|
|
557
|
+
side: singleSideParam(params, "right")
|
|
558
|
+
}
|
|
559
|
+
);
|
|
560
|
+
break;
|
|
561
|
+
case "voice_note_delete":
|
|
562
|
+
operationResult = await service.deleteVoiceNoteAudio(
|
|
563
|
+
numberParam(params, "noteIndex"),
|
|
564
|
+
{
|
|
565
|
+
syncId: params.syncId === void 0 ? void 0 : numberParam(params, "syncId"),
|
|
566
|
+
side: singleSideParam(params, "right")
|
|
567
|
+
}
|
|
568
|
+
);
|
|
569
|
+
break;
|
|
570
|
+
case "voice_note_delete_all":
|
|
571
|
+
operationResult = await service.deleteAllVoiceNoteAudio({
|
|
572
|
+
syncId: params.syncId === void 0 ? void 0 : numberParam(params, "syncId"),
|
|
573
|
+
side: singleSideParam(params, "right")
|
|
574
|
+
});
|
|
575
|
+
break;
|
|
576
|
+
case "notification":
|
|
577
|
+
operationResult = await service.sendNotification({
|
|
578
|
+
msgId: params.msgId === void 0 ? void 0 : numberParam(params, "msgId"),
|
|
579
|
+
type: params.type === void 0 ? void 0 : numberParam(params, "type"),
|
|
580
|
+
appIdentifier: stringParam(params, "appIdentifier"),
|
|
581
|
+
title: stringParam(params, "title"),
|
|
582
|
+
subtitle: typeof params.subtitle === "string" ? params.subtitle : void 0,
|
|
583
|
+
message: stringParam(params, "message"),
|
|
584
|
+
timeS: params.timeS === void 0 ? void 0 : numberParam(params, "timeS"),
|
|
585
|
+
date: typeof params.date === "string" ? params.date : void 0,
|
|
586
|
+
displayName: typeof params.displayName === "string" ? params.displayName : void 0
|
|
587
|
+
});
|
|
588
|
+
break;
|
|
589
|
+
case "bmp_image":
|
|
590
|
+
if (params.pixels !== void 0 || params.pixelData !== void 0) {
|
|
591
|
+
operationResult = await service.sendMonochromeBmpImage(
|
|
592
|
+
pixelBytesParam(params),
|
|
593
|
+
{
|
|
594
|
+
width: params.width === void 0 ? void 0 : numberParam(params, "width"),
|
|
595
|
+
height: params.height === void 0 ? void 0 : numberParam(params, "height"),
|
|
596
|
+
threshold: params.threshold === void 0 ? void 0 : numberParam(params, "threshold")
|
|
597
|
+
}
|
|
598
|
+
);
|
|
599
|
+
} else {
|
|
600
|
+
operationResult = await service.sendBmpImage(bytesParam(params));
|
|
601
|
+
}
|
|
602
|
+
break;
|
|
603
|
+
}
|
|
604
|
+
} catch (error) {
|
|
605
|
+
const text = `Smartglasses ${op} command failed: ${actionErrorMessage(error)}`;
|
|
606
|
+
await callback?.({ text });
|
|
607
|
+
return {
|
|
608
|
+
success: false,
|
|
609
|
+
text,
|
|
610
|
+
values: {
|
|
611
|
+
op,
|
|
612
|
+
error: actionErrorMessage(error)
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
const response = `Smartglasses ${op} command sent.`;
|
|
617
|
+
await callback?.({ text: response });
|
|
618
|
+
return { success: true, text: response, values: { op, operationResult } };
|
|
619
|
+
},
|
|
620
|
+
examples: []
|
|
621
|
+
};
|
|
622
|
+
const facewearControlAction = smartglassesControlAction;
|
|
623
|
+
export {
|
|
624
|
+
facewearControlAction,
|
|
625
|
+
smartglassesControlAction
|
|
626
|
+
};
|
|
627
|
+
//# sourceMappingURL=facewear-control.js.map
|