@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,314 @@
|
|
|
1
|
+
import { listViews } from "@elizaos/agent/api/views-registry";
|
|
2
|
+
import {
|
|
3
|
+
XR_SERVICE_TYPE
|
|
4
|
+
} from "../services/xr-session-service.js";
|
|
5
|
+
function getService(runtime) {
|
|
6
|
+
return runtime.getService(XR_SERVICE_TYPE) ?? null;
|
|
7
|
+
}
|
|
8
|
+
function firstConnectionId(svc) {
|
|
9
|
+
return svc.getConnections()[0]?.id ?? null;
|
|
10
|
+
}
|
|
11
|
+
function agentBaseUrl() {
|
|
12
|
+
const port = process.env.ELIZA_API_PORT?.trim() || process.env.ELIZA_PORT?.trim() || "31337";
|
|
13
|
+
return process.env.XR_AGENT_URL ?? `http://localhost:${port}`;
|
|
14
|
+
}
|
|
15
|
+
const xrOpenViewAction = {
|
|
16
|
+
name: "XR_OPEN_VIEW",
|
|
17
|
+
similes: ["OPEN_XR_VIEW", "SHOW_XR_PANEL", "XR_SHOW", "XR_LAUNCH"],
|
|
18
|
+
description: "Opens a view panel on the connected XR headset by view id. Use XR_LIST_VIEWS first to discover available view ids.",
|
|
19
|
+
examples: [
|
|
20
|
+
[
|
|
21
|
+
{ name: "user", content: { text: "open the wallet in XR" } },
|
|
22
|
+
{
|
|
23
|
+
name: "agent",
|
|
24
|
+
content: {
|
|
25
|
+
text: "Opening wallet view on your headset.",
|
|
26
|
+
action: "XR_OPEN_VIEW"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
[
|
|
31
|
+
{ name: "user", content: { text: "show training dashboard in XR" } },
|
|
32
|
+
{
|
|
33
|
+
name: "agent",
|
|
34
|
+
content: { text: "Launching training panel.", action: "XR_OPEN_VIEW" }
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
],
|
|
38
|
+
validate: async (runtime) => {
|
|
39
|
+
const svc = getService(runtime);
|
|
40
|
+
return svc?.hasActiveConnections() ?? false;
|
|
41
|
+
},
|
|
42
|
+
handler: async (runtime, message, _state, options, callback) => {
|
|
43
|
+
const svc = getService(runtime);
|
|
44
|
+
if (!svc) {
|
|
45
|
+
const text2 = "No XR session service available.";
|
|
46
|
+
await callback?.({ text: text2 });
|
|
47
|
+
return { success: false, text: text2 };
|
|
48
|
+
}
|
|
49
|
+
const viewId = options?.viewId ?? extractViewId(message.content.text ?? "");
|
|
50
|
+
if (!viewId) {
|
|
51
|
+
const text2 = "Please specify which view to open. Try XR_LIST_VIEWS to see available views.";
|
|
52
|
+
await callback?.({ text: text2 });
|
|
53
|
+
return { success: false, text: text2 };
|
|
54
|
+
}
|
|
55
|
+
const connId = firstConnectionId(svc);
|
|
56
|
+
if (!connId) {
|
|
57
|
+
const text2 = "No XR device is connected.";
|
|
58
|
+
await callback?.({ text: text2 });
|
|
59
|
+
return { success: false, text: text2 };
|
|
60
|
+
}
|
|
61
|
+
const base = agentBaseUrl();
|
|
62
|
+
const scale = options?.scale ?? 1;
|
|
63
|
+
svc.openView(connId, viewId, base, { scale, followMode: "billboard" });
|
|
64
|
+
const text = `Opening ${viewId} view on your headset.`;
|
|
65
|
+
await callback?.({ text });
|
|
66
|
+
return { success: true, text };
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const xrCloseViewAction = {
|
|
70
|
+
name: "XR_CLOSE_VIEW",
|
|
71
|
+
similes: ["CLOSE_XR_VIEW", "HIDE_XR_PANEL", "XR_CLOSE", "XR_DISMISS"],
|
|
72
|
+
description: "Closes a specific view panel on the connected XR headset.",
|
|
73
|
+
examples: [
|
|
74
|
+
[
|
|
75
|
+
{ name: "user", content: { text: "close the wallet panel" } },
|
|
76
|
+
{
|
|
77
|
+
name: "agent",
|
|
78
|
+
content: { text: "Closing wallet panel.", action: "XR_CLOSE_VIEW" }
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
],
|
|
82
|
+
validate: async (runtime) => {
|
|
83
|
+
const svc = getService(runtime);
|
|
84
|
+
return svc?.hasActiveConnections() ?? false;
|
|
85
|
+
},
|
|
86
|
+
handler: async (runtime, message, _state, options, callback) => {
|
|
87
|
+
const svc = getService(runtime);
|
|
88
|
+
if (!svc) {
|
|
89
|
+
const text2 = "No XR service.";
|
|
90
|
+
await callback?.({ text: text2 });
|
|
91
|
+
return { success: false, text: text2 };
|
|
92
|
+
}
|
|
93
|
+
const viewId = options?.viewId ?? extractViewId(message.content.text ?? "");
|
|
94
|
+
const connId = firstConnectionId(svc);
|
|
95
|
+
if (!connId) {
|
|
96
|
+
const text2 = "No XR device connected.";
|
|
97
|
+
await callback?.({ text: text2 });
|
|
98
|
+
return { success: false, text: text2 };
|
|
99
|
+
}
|
|
100
|
+
let text;
|
|
101
|
+
if (viewId) {
|
|
102
|
+
svc.closeView(connId, viewId);
|
|
103
|
+
text = `Closed ${viewId}.`;
|
|
104
|
+
await callback?.({ text });
|
|
105
|
+
} else {
|
|
106
|
+
const views = collectXRViews();
|
|
107
|
+
for (const view of views) {
|
|
108
|
+
svc.closeView(connId, view.id);
|
|
109
|
+
}
|
|
110
|
+
text = views.length > 0 ? "Closed all XR panels." : "No XR panels to close.";
|
|
111
|
+
await callback?.({ text });
|
|
112
|
+
}
|
|
113
|
+
return { success: true, text };
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const xrSwitchViewAction = {
|
|
117
|
+
name: "XR_SWITCH_VIEW",
|
|
118
|
+
similes: ["SWITCH_XR_VIEW", "XR_GO_TO", "XR_NAVIGATE"],
|
|
119
|
+
description: "Switches the active (foreground) view on the XR headset without closing others.",
|
|
120
|
+
examples: [
|
|
121
|
+
[
|
|
122
|
+
{ name: "user", content: { text: "switch to companion in XR" } },
|
|
123
|
+
{
|
|
124
|
+
name: "agent",
|
|
125
|
+
content: {
|
|
126
|
+
text: "Switching to companion view.",
|
|
127
|
+
action: "XR_SWITCH_VIEW"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
],
|
|
132
|
+
validate: async (runtime) => {
|
|
133
|
+
const svc = getService(runtime);
|
|
134
|
+
return svc?.hasActiveConnections() ?? false;
|
|
135
|
+
},
|
|
136
|
+
handler: async (runtime, message, _state, options, callback) => {
|
|
137
|
+
const svc = getService(runtime);
|
|
138
|
+
if (!svc) {
|
|
139
|
+
const text2 = "No XR service.";
|
|
140
|
+
await callback?.({ text: text2 });
|
|
141
|
+
return { success: false, text: text2 };
|
|
142
|
+
}
|
|
143
|
+
const viewId = options?.viewId ?? extractViewId(message.content.text ?? "");
|
|
144
|
+
const connId = firstConnectionId(svc);
|
|
145
|
+
if (!connId || !viewId) {
|
|
146
|
+
const text2 = "Specify a view id.";
|
|
147
|
+
await callback?.({ text: text2 });
|
|
148
|
+
return { success: false, text: text2 };
|
|
149
|
+
}
|
|
150
|
+
svc.switchView(connId, viewId);
|
|
151
|
+
const text = `Switched to ${viewId}.`;
|
|
152
|
+
await callback?.({ text });
|
|
153
|
+
return { success: true, text };
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const xrListViewsAction = {
|
|
157
|
+
name: "XR_LIST_VIEWS",
|
|
158
|
+
similes: ["LIST_XR_VIEWS", "XR_VIEWS", "WHAT_XR_VIEWS", "SHOW_XR_LAUNCHER"],
|
|
159
|
+
description: "Lists all views available on the XR device and optionally sends a launcher catalog to the headset. Use this before XR_OPEN_VIEW.",
|
|
160
|
+
examples: [
|
|
161
|
+
[
|
|
162
|
+
{ name: "user", content: { text: "what can I open in XR?" } },
|
|
163
|
+
{
|
|
164
|
+
name: "agent",
|
|
165
|
+
content: {
|
|
166
|
+
text: "Available XR views are registered by the loaded plugins.",
|
|
167
|
+
action: "XR_LIST_VIEWS"
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
],
|
|
172
|
+
validate: async (runtime) => {
|
|
173
|
+
const svc = getService(runtime);
|
|
174
|
+
return svc !== null;
|
|
175
|
+
},
|
|
176
|
+
handler: async (runtime, _message, _state, options, callback) => {
|
|
177
|
+
const svc = getService(runtime);
|
|
178
|
+
if (!svc) {
|
|
179
|
+
const text2 = "No XR service.";
|
|
180
|
+
await callback?.({ text: text2 });
|
|
181
|
+
return { success: false, text: text2 };
|
|
182
|
+
}
|
|
183
|
+
const xrViews = collectXRViews();
|
|
184
|
+
const connId = firstConnectionId(svc);
|
|
185
|
+
if (connId && options?.sendCatalog !== false) {
|
|
186
|
+
svc.sendViewsCatalog(connId, xrViews);
|
|
187
|
+
}
|
|
188
|
+
if (xrViews.length === 0) {
|
|
189
|
+
const text2 = "No XR views are currently registered.";
|
|
190
|
+
await callback?.({ text: text2 });
|
|
191
|
+
return { success: true, text: text2 };
|
|
192
|
+
}
|
|
193
|
+
const list = xrViews.map((v) => `\u2022 ${v.label} (id: ${v.id})`).join("\n");
|
|
194
|
+
const text = `Available XR views:
|
|
195
|
+
${list}
|
|
196
|
+
|
|
197
|
+
Say "open [view name]" to launch one.`;
|
|
198
|
+
await callback?.({ text });
|
|
199
|
+
return { success: true, text };
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
const xrResizeViewAction = {
|
|
203
|
+
name: "XR_RESIZE_VIEW",
|
|
204
|
+
similes: ["RESIZE_XR_PANEL", "XR_MAKE_BIGGER", "XR_MAKE_SMALLER", "XR_SCALE"],
|
|
205
|
+
description: "Resizes or repositions the active XR view panel. Accepts scale (0.5 = half, 2.0 = double) and distance.",
|
|
206
|
+
examples: [
|
|
207
|
+
[
|
|
208
|
+
{ name: "user", content: { text: "make the panel bigger" } },
|
|
209
|
+
{
|
|
210
|
+
name: "agent",
|
|
211
|
+
content: { text: "Scaling up the panel.", action: "XR_RESIZE_VIEW" }
|
|
212
|
+
}
|
|
213
|
+
],
|
|
214
|
+
[
|
|
215
|
+
{ name: "user", content: { text: "make it smaller and move closer" } },
|
|
216
|
+
{
|
|
217
|
+
name: "agent",
|
|
218
|
+
content: {
|
|
219
|
+
text: "Resizing and moving panel closer.",
|
|
220
|
+
action: "XR_RESIZE_VIEW"
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
],
|
|
225
|
+
validate: async (runtime) => {
|
|
226
|
+
const svc = getService(runtime);
|
|
227
|
+
return svc?.hasActiveConnections() ?? false;
|
|
228
|
+
},
|
|
229
|
+
handler: async (runtime, message, _state, options, callback) => {
|
|
230
|
+
const svc = getService(runtime);
|
|
231
|
+
if (!svc) {
|
|
232
|
+
const text2 = "No XR service.";
|
|
233
|
+
await callback?.({ text: text2 });
|
|
234
|
+
return { success: false, text: text2 };
|
|
235
|
+
}
|
|
236
|
+
const connId = firstConnectionId(svc);
|
|
237
|
+
if (!connId) {
|
|
238
|
+
const text2 = "No XR device connected.";
|
|
239
|
+
await callback?.({ text: text2 });
|
|
240
|
+
return { success: false, text: text2 };
|
|
241
|
+
}
|
|
242
|
+
const inputText = message.content.text?.toLowerCase() ?? "";
|
|
243
|
+
let scale = options?.scale ?? 1;
|
|
244
|
+
let distance = options?.distance ?? 1.5;
|
|
245
|
+
if (inputText.includes("bigger") || inputText.includes("larger") || inputText.includes("bigger"))
|
|
246
|
+
scale = 1.5;
|
|
247
|
+
if (inputText.includes("smaller") || inputText.includes("tiny"))
|
|
248
|
+
scale = 0.6;
|
|
249
|
+
if (inputText.includes("closer") || inputText.includes("nearer"))
|
|
250
|
+
distance = 0.8;
|
|
251
|
+
if (inputText.includes("farther") || inputText.includes("further") || inputText.includes("away"))
|
|
252
|
+
distance = 2.5;
|
|
253
|
+
if (inputText.includes("fullscreen") || inputText.includes("full screen")) {
|
|
254
|
+
svc.resizeView(connId, "", { scale: 2, fullscreen: true });
|
|
255
|
+
const text2 = "Panel fullscreened.";
|
|
256
|
+
await callback?.({ text: text2 });
|
|
257
|
+
return { success: true, text: text2 };
|
|
258
|
+
}
|
|
259
|
+
const viewId = options?.viewId ?? "";
|
|
260
|
+
svc.resizeView(connId, viewId, { scale, distance });
|
|
261
|
+
const text = `Panel resized to ${scale}\xD7 at ${distance}m.`;
|
|
262
|
+
await callback?.({ text });
|
|
263
|
+
return { success: true, text };
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const facewearOpenViewAction = xrOpenViewAction;
|
|
267
|
+
const facewearCloseViewAction = xrCloseViewAction;
|
|
268
|
+
const facewearSwitchViewAction = xrSwitchViewAction;
|
|
269
|
+
const facewearListViewsAction = xrListViewsAction;
|
|
270
|
+
const facewearResizeViewAction = xrResizeViewAction;
|
|
271
|
+
function extractViewId(text) {
|
|
272
|
+
const lower = text.toLowerCase();
|
|
273
|
+
for (const view of collectXRViews()) {
|
|
274
|
+
const terms = [view.id, view.id.replace(/-/g, " "), view.label].map(
|
|
275
|
+
(term) => term.toLowerCase()
|
|
276
|
+
);
|
|
277
|
+
if (terms.some((term) => term && lower.includes(term))) {
|
|
278
|
+
return view.id;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
const quoted = text.match(/["']([^"']+)["']/);
|
|
282
|
+
if (quoted) return quoted[1] ?? "";
|
|
283
|
+
return "";
|
|
284
|
+
}
|
|
285
|
+
function collectXRViews() {
|
|
286
|
+
const byId = /* @__PURE__ */ new Map();
|
|
287
|
+
for (const view of listViews({ developerMode: true, viewType: "xr" })) {
|
|
288
|
+
if (view.viewType !== "xr") continue;
|
|
289
|
+
byId.set(view.id, {
|
|
290
|
+
id: view.id,
|
|
291
|
+
label: view.label,
|
|
292
|
+
icon: view.icon,
|
|
293
|
+
description: view.description
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return [...byId.values()].sort(
|
|
297
|
+
(a, b) => a.label.localeCompare(b.label) || a.id.localeCompare(b.id)
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
export {
|
|
301
|
+
collectXRViews,
|
|
302
|
+
extractViewId,
|
|
303
|
+
facewearCloseViewAction,
|
|
304
|
+
facewearListViewsAction,
|
|
305
|
+
facewearOpenViewAction,
|
|
306
|
+
facewearResizeViewAction,
|
|
307
|
+
facewearSwitchViewAction,
|
|
308
|
+
xrCloseViewAction,
|
|
309
|
+
xrListViewsAction,
|
|
310
|
+
xrOpenViewAction,
|
|
311
|
+
xrResizeViewAction,
|
|
312
|
+
xrSwitchViewAction
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=view-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/view-actions.ts"],"sourcesContent":["import { listViews } from \"@elizaos/agent/api/views-registry\";\nimport type {\n Action,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport {\n XR_SERVICE_TYPE,\n type XRSessionService,\n} from \"../services/xr-session-service.js\";\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getService(runtime: IAgentRuntime): XRSessionService | null {\n return runtime.getService<XRSessionService>(XR_SERVICE_TYPE) ?? null;\n}\n\nfunction firstConnectionId(svc: XRSessionService): string | null {\n return svc.getConnections()[0]?.id ?? null;\n}\n\nfunction agentBaseUrl(): string {\n // The API port is orchestrator-assigned (never hardcoded) — read it from the\n // environment, not a non-existent `runtime.port` field. Falls back to 31337.\n const port =\n process.env.ELIZA_API_PORT?.trim() ||\n process.env.ELIZA_PORT?.trim() ||\n \"31337\";\n return process.env.XR_AGENT_URL ?? `http://localhost:${port}`;\n}\n\n// ── XR_OPEN_VIEW ───────────────────────────────────────────────────────────\n\nexport const xrOpenViewAction: Action = {\n name: \"XR_OPEN_VIEW\",\n similes: [\"OPEN_XR_VIEW\", \"SHOW_XR_PANEL\", \"XR_SHOW\", \"XR_LAUNCH\"],\n description:\n \"Opens a view panel on the connected XR headset by view id. Use XR_LIST_VIEWS first to discover available view ids.\",\n examples: [\n [\n { name: \"user\", content: { text: \"open the wallet in XR\" } },\n {\n name: \"agent\",\n content: {\n text: \"Opening wallet view on your headset.\",\n action: \"XR_OPEN_VIEW\",\n },\n },\n ],\n [\n { name: \"user\", content: { text: \"show training dashboard in XR\" } },\n {\n name: \"agent\",\n content: { text: \"Launching training panel.\", action: \"XR_OPEN_VIEW\" },\n },\n ],\n ],\n\n validate: async (runtime): Promise<boolean> => {\n const svc = getService(runtime);\n return svc?.hasActiveConnections() ?? false;\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state: State | undefined,\n options: Record<string, unknown> | undefined,\n callback?: HandlerCallback,\n ) => {\n const svc = getService(runtime);\n if (!svc) {\n const text = \"No XR session service available.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n const viewId =\n (options?.viewId as string | undefined) ??\n extractViewId(message.content.text ?? \"\");\n if (!viewId) {\n const text =\n \"Please specify which view to open. Try XR_LIST_VIEWS to see available views.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n const connId = firstConnectionId(svc);\n if (!connId) {\n const text = \"No XR device is connected.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n const base = agentBaseUrl();\n const scale = (options?.scale as number | undefined) ?? 1.0;\n svc.openView(connId, viewId, base, { scale, followMode: \"billboard\" });\n const text = `Opening ${viewId} view on your headset.`;\n await callback?.({ text });\n return { success: true, text };\n },\n};\n\n// ── XR_CLOSE_VIEW ──────────────────────────────────────────────────────────\n\nexport const xrCloseViewAction: Action = {\n name: \"XR_CLOSE_VIEW\",\n similes: [\"CLOSE_XR_VIEW\", \"HIDE_XR_PANEL\", \"XR_CLOSE\", \"XR_DISMISS\"],\n description: \"Closes a specific view panel on the connected XR headset.\",\n examples: [\n [\n { name: \"user\", content: { text: \"close the wallet panel\" } },\n {\n name: \"agent\",\n content: { text: \"Closing wallet panel.\", action: \"XR_CLOSE_VIEW\" },\n },\n ],\n ],\n\n validate: async (runtime) => {\n const svc = getService(runtime);\n return svc?.hasActiveConnections() ?? false;\n },\n\n handler: async (runtime, message, _state, options, callback) => {\n const svc = getService(runtime);\n if (!svc) {\n const text = \"No XR service.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n const viewId =\n (options?.viewId as string | undefined) ??\n extractViewId(message.content.text ?? \"\");\n const connId = firstConnectionId(svc);\n if (!connId) {\n const text = \"No XR device connected.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n let text: string;\n if (viewId) {\n svc.closeView(connId, viewId);\n text = `Closed ${viewId}.`;\n await callback?.({ text });\n } else {\n const views = collectXRViews();\n for (const view of views) {\n svc.closeView(connId, view.id);\n }\n text =\n views.length > 0 ? \"Closed all XR panels.\" : \"No XR panels to close.\";\n await callback?.({ text });\n }\n return { success: true, text };\n },\n};\n\n// ── XR_SWITCH_VIEW ─────────────────────────────────────────────────────────\n\nexport const xrSwitchViewAction: Action = {\n name: \"XR_SWITCH_VIEW\",\n similes: [\"SWITCH_XR_VIEW\", \"XR_GO_TO\", \"XR_NAVIGATE\"],\n description:\n \"Switches the active (foreground) view on the XR headset without closing others.\",\n examples: [\n [\n { name: \"user\", content: { text: \"switch to companion in XR\" } },\n {\n name: \"agent\",\n content: {\n text: \"Switching to companion view.\",\n action: \"XR_SWITCH_VIEW\",\n },\n },\n ],\n ],\n\n validate: async (runtime) => {\n const svc = getService(runtime);\n return svc?.hasActiveConnections() ?? false;\n },\n\n handler: async (runtime, message, _state, options, callback) => {\n const svc = getService(runtime);\n if (!svc) {\n const text = \"No XR service.\";\n await callback?.({ text });\n return { success: false, text };\n }\n const viewId =\n (options?.viewId as string | undefined) ??\n extractViewId(message.content.text ?? \"\");\n const connId = firstConnectionId(svc);\n if (!connId || !viewId) {\n const text = \"Specify a view id.\";\n await callback?.({ text });\n return { success: false, text };\n }\n svc.switchView(connId, viewId);\n const text = `Switched to ${viewId}.`;\n await callback?.({ text });\n return { success: true, text };\n },\n};\n\n// ── XR_LIST_VIEWS ──────────────────────────────────────────────────────────\n\nexport const xrListViewsAction: Action = {\n name: \"XR_LIST_VIEWS\",\n similes: [\"LIST_XR_VIEWS\", \"XR_VIEWS\", \"WHAT_XR_VIEWS\", \"SHOW_XR_LAUNCHER\"],\n description:\n \"Lists all views available on the XR device and optionally sends a launcher catalog to the headset. Use this before XR_OPEN_VIEW.\",\n examples: [\n [\n { name: \"user\", content: { text: \"what can I open in XR?\" } },\n {\n name: \"agent\",\n content: {\n text: \"Available XR views are registered by the loaded plugins.\",\n action: \"XR_LIST_VIEWS\",\n },\n },\n ],\n ],\n\n validate: async (runtime) => {\n const svc = getService(runtime);\n return svc !== null;\n },\n\n handler: async (runtime, _message, _state, options, callback) => {\n const svc = getService(runtime);\n if (!svc) {\n const text = \"No XR service.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n // Collect XR view declarations from all registered plugins\n const xrViews = collectXRViews();\n\n const connId = firstConnectionId(svc);\n if (connId && (options?.sendCatalog as boolean | undefined) !== false) {\n svc.sendViewsCatalog(connId, xrViews);\n }\n\n if (xrViews.length === 0) {\n const text = \"No XR views are currently registered.\";\n await callback?.({ text });\n return { success: true, text };\n }\n\n const list = xrViews.map((v) => `• ${v.label} (id: ${v.id})`).join(\"\\n\");\n const text = `Available XR views:\\n${list}\\n\\nSay \"open [view name]\" to launch one.`;\n await callback?.({ text });\n return { success: true, text };\n },\n};\n\n// ── XR_RESIZE_VIEW ─────────────────────────────────────────────────────────\n\nexport const xrResizeViewAction: Action = {\n name: \"XR_RESIZE_VIEW\",\n similes: [\"RESIZE_XR_PANEL\", \"XR_MAKE_BIGGER\", \"XR_MAKE_SMALLER\", \"XR_SCALE\"],\n description:\n \"Resizes or repositions the active XR view panel. Accepts scale (0.5 = half, 2.0 = double) and distance.\",\n examples: [\n [\n { name: \"user\", content: { text: \"make the panel bigger\" } },\n {\n name: \"agent\",\n content: { text: \"Scaling up the panel.\", action: \"XR_RESIZE_VIEW\" },\n },\n ],\n [\n { name: \"user\", content: { text: \"make it smaller and move closer\" } },\n {\n name: \"agent\",\n content: {\n text: \"Resizing and moving panel closer.\",\n action: \"XR_RESIZE_VIEW\",\n },\n },\n ],\n ],\n\n validate: async (runtime) => {\n const svc = getService(runtime);\n return svc?.hasActiveConnections() ?? false;\n },\n\n handler: async (runtime, message, _state, options, callback) => {\n const svc = getService(runtime);\n if (!svc) {\n const text = \"No XR service.\";\n await callback?.({ text });\n return { success: false, text };\n }\n const connId = firstConnectionId(svc);\n if (!connId) {\n const text = \"No XR device connected.\";\n await callback?.({ text });\n return { success: false, text };\n }\n\n const inputText = message.content.text?.toLowerCase() ?? \"\";\n let scale = (options?.scale as number | undefined) ?? 1.0;\n let distance = (options?.distance as number | undefined) ?? 1.5;\n\n if (\n inputText.includes(\"bigger\") ||\n inputText.includes(\"larger\") ||\n inputText.includes(\"bigger\")\n )\n scale = 1.5;\n if (inputText.includes(\"smaller\") || inputText.includes(\"tiny\"))\n scale = 0.6;\n if (inputText.includes(\"closer\") || inputText.includes(\"nearer\"))\n distance = 0.8;\n if (\n inputText.includes(\"farther\") ||\n inputText.includes(\"further\") ||\n inputText.includes(\"away\")\n )\n distance = 2.5;\n if (inputText.includes(\"fullscreen\") || inputText.includes(\"full screen\")) {\n svc.resizeView(connId, \"\", { scale: 2.0, fullscreen: true });\n const text = \"Panel fullscreened.\";\n await callback?.({ text });\n return { success: true, text };\n }\n\n const viewId = (options?.viewId as string | undefined) ?? \"\";\n svc.resizeView(connId, viewId, { scale, distance });\n const text = `Panel resized to ${scale}× at ${distance}m.`;\n await callback?.({ text });\n return { success: true, text };\n },\n};\n\n// ── Aliases for facewear consumers ────────────────────────────────────────\n\nexport const facewearOpenViewAction = xrOpenViewAction;\nexport const facewearCloseViewAction = xrCloseViewAction;\nexport const facewearSwitchViewAction = xrSwitchViewAction;\nexport const facewearListViewsAction = xrListViewsAction;\nexport const facewearResizeViewAction = xrResizeViewAction;\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/** Extract a likely view id from natural language */\nexport function extractViewId(text: string): string {\n const lower = text.toLowerCase();\n for (const view of collectXRViews()) {\n const terms = [view.id, view.id.replace(/-/g, \" \"), view.label].map(\n (term) => term.toLowerCase(),\n );\n if (terms.some((term) => term && lower.includes(term))) {\n return view.id;\n }\n }\n const quoted = text.match(/[\"']([^\"']+)[\"']/);\n if (quoted) return quoted[1] ?? \"\";\n return \"\";\n}\n\ntype XRViewSummary = {\n id: string;\n label: string;\n icon?: string;\n description?: string;\n};\n\n/** Collect all XR-typed views from registered plugins */\nexport function collectXRViews(): XRViewSummary[] {\n const byId = new Map<string, XRViewSummary>();\n for (const view of listViews({ developerMode: true, viewType: \"xr\" })) {\n if (view.viewType !== \"xr\") continue;\n byId.set(view.id, {\n id: view.id,\n label: view.label,\n icon: view.icon,\n description: view.description,\n });\n }\n return [...byId.values()].sort(\n (a, b) => a.label.localeCompare(b.label) || a.id.localeCompare(b.id),\n );\n}\n"],"mappings":"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","names":["text"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-query.d.ts","sourceRoot":"","sources":["../../src/actions/vision-query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,mBAAmB,EAAE,MAkDjC,CAAC;AAGF,eAAO,MAAM,yBAAyB,QAAsB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
XR_SERVICE_TYPE
|
|
3
|
+
} from "../services/xr-session-service.js";
|
|
4
|
+
const xrQueryVisionAction = {
|
|
5
|
+
name: "XR_QUERY_VISION",
|
|
6
|
+
description: "Describe what the user is currently looking at through their XR headset camera. Use this when the user asks 'what do you see', 'look at this', or any question about their surroundings.",
|
|
7
|
+
validate: async (runtime) => {
|
|
8
|
+
const svc = runtime.getService(XR_SERVICE_TYPE);
|
|
9
|
+
if (!svc?.hasActiveConnections()) return false;
|
|
10
|
+
return svc.getConnections().some((c) => svc.getVisionPipeline().hasRecentFrame(c.id));
|
|
11
|
+
},
|
|
12
|
+
handler: async (runtime, message, _state, _options, callback) => {
|
|
13
|
+
const svc = runtime.getService(XR_SERVICE_TYPE);
|
|
14
|
+
if (!svc) {
|
|
15
|
+
await callback?.({ text: "XR service is not running." });
|
|
16
|
+
return void 0;
|
|
17
|
+
}
|
|
18
|
+
const conn = svc.getConnections().find((c) => c.roomId === message.roomId);
|
|
19
|
+
if (!conn) {
|
|
20
|
+
await callback?.({
|
|
21
|
+
text: "No XR device connection found for this session."
|
|
22
|
+
});
|
|
23
|
+
return void 0;
|
|
24
|
+
}
|
|
25
|
+
const description = await svc.getVisionPipeline().describeFrame(runtime, conn.id);
|
|
26
|
+
if (!description) {
|
|
27
|
+
await callback?.({
|
|
28
|
+
text: "No recent camera frame available from the XR device."
|
|
29
|
+
});
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
await callback?.({ text: description });
|
|
33
|
+
return void 0;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
const facewearQueryVisionAction = xrQueryVisionAction;
|
|
37
|
+
export {
|
|
38
|
+
facewearQueryVisionAction,
|
|
39
|
+
xrQueryVisionAction
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=vision-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/vision-query.ts"],"sourcesContent":["import type {\n Action,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n State,\n} from \"@elizaos/core\";\nimport {\n XR_SERVICE_TYPE,\n type XRSessionService,\n} from \"../services/xr-session-service.js\";\n\nexport const xrQueryVisionAction: Action = {\n name: \"XR_QUERY_VISION\",\n description:\n \"Describe what the user is currently looking at through their XR headset camera. Use this when the user asks 'what do you see', 'look at this', or any question about their surroundings.\",\n\n validate: async (runtime: IAgentRuntime): Promise<boolean> => {\n const svc = runtime.getService<XRSessionService>(XR_SERVICE_TYPE);\n if (!svc?.hasActiveConnections()) return false;\n // At least one connection must have a recent frame\n return svc\n .getConnections()\n .some((c) => svc.getVisionPipeline().hasRecentFrame(c.id));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state?: State,\n _options?: unknown,\n callback?: HandlerCallback,\n ): Promise<ActionResult | undefined> => {\n const svc = runtime.getService<XRSessionService>(XR_SERVICE_TYPE);\n if (!svc) {\n await callback?.({ text: \"XR service is not running.\" });\n return undefined;\n }\n\n const conn = svc.getConnections().find((c) => c.roomId === message.roomId);\n\n if (!conn) {\n await callback?.({\n text: \"No XR device connection found for this session.\",\n });\n return undefined;\n }\n\n const description = await svc\n .getVisionPipeline()\n .describeFrame(runtime, conn.id);\n\n if (!description) {\n await callback?.({\n text: \"No recent camera frame available from the XR device.\",\n });\n return undefined;\n }\n\n await callback?.({ text: description });\n return undefined;\n },\n};\n\n// Alias for facewear plugin consumers\nexport const facewearQueryVisionAction = xrQueryVisionAction;\n"],"mappings":"AAQA;AAAA,EACE;AAAA,OAEK;AAEA,MAAM,sBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EAEF,UAAU,OAAO,YAA6C;AAC5D,UAAM,MAAM,QAAQ,WAA6B,eAAe;AAChE,QAAI,CAAC,KAAK,qBAAqB,EAAG,QAAO;AAEzC,WAAO,IACJ,eAAe,EACf,KAAK,CAAC,MAAM,IAAI,kBAAkB,EAAE,eAAe,EAAE,EAAE,CAAC;AAAA,EAC7D;AAAA,EAEA,SAAS,OACP,SACA,SACA,QACA,UACA,aACsC;AACtC,UAAM,MAAM,QAAQ,WAA6B,eAAe;AAChE,QAAI,CAAC,KAAK;AACR,YAAM,WAAW,EAAE,MAAM,6BAA6B,CAAC;AACvD,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,IAAI,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAEzE,QAAI,CAAC,MAAM;AACT,YAAM,WAAW;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,MAAM,IACvB,kBAAkB,EAClB,cAAc,SAAS,KAAK,EAAE;AAEjC,QAAI,CAAC,aAAa;AAChB,YAAM,WAAW;AAAA,QACf,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,EAAE,MAAM,YAAY,CAAC;AACtC,WAAO;AAAA,EACT;AACF;AAGO,MAAM,4BAA4B;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XR view control actions — re-exported with the canonical names the
|
|
3
|
+
* feature-parity test suite expects.
|
|
4
|
+
*
|
|
5
|
+
* All five actions (XR_OPEN_VIEW, XR_CLOSE_VIEW, XR_SWITCH_VIEW,
|
|
6
|
+
* XR_LIST_VIEWS, XR_RESIZE_VIEW) are implemented in view-actions.ts and
|
|
7
|
+
* re-exported here so tests can import from a single predictable location.
|
|
8
|
+
*
|
|
9
|
+
* Natural-language routing is implemented in view-actions.ts against the
|
|
10
|
+
* runtime view registry, so this module does not need to know about other
|
|
11
|
+
* plugins' view ids.
|
|
12
|
+
*/
|
|
13
|
+
export { collectXRViews, extractViewId, xrCloseViewAction as XR_CLOSE_VIEW, xrCloseViewAction, xrListViewsAction as XR_LIST_VIEWS, xrListViewsAction, xrOpenViewAction as XR_OPEN_VIEW, xrOpenViewAction, xrResizeViewAction as XR_RESIZE_VIEW, xrResizeViewAction, xrSwitchViewAction as XR_SWITCH_VIEW, xrSwitchViewAction, } from "./view-actions.js";
|
|
14
|
+
//# sourceMappingURL=xr-view-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xr-view-actions.d.ts","sourceRoot":"","sources":["../../src/actions/xr-view-actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,cAAc,EACd,aAAa,EACb,iBAAiB,IAAI,aAAa,EAClC,iBAAiB,EACjB,iBAAiB,IAAI,aAAa,EAClC,iBAAiB,EACjB,gBAAgB,IAAI,YAAY,EAChC,gBAAgB,EAChB,kBAAkB,IAAI,cAAc,EACpC,kBAAkB,EAClB,kBAAkB,IAAI,cAAc,EACpC,kBAAkB,GACnB,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
collectXRViews,
|
|
3
|
+
extractViewId,
|
|
4
|
+
xrCloseViewAction,
|
|
5
|
+
xrCloseViewAction as xrCloseViewAction2,
|
|
6
|
+
xrListViewsAction,
|
|
7
|
+
xrListViewsAction as xrListViewsAction2,
|
|
8
|
+
xrOpenViewAction,
|
|
9
|
+
xrOpenViewAction as xrOpenViewAction2,
|
|
10
|
+
xrResizeViewAction,
|
|
11
|
+
xrResizeViewAction as xrResizeViewAction2,
|
|
12
|
+
xrSwitchViewAction,
|
|
13
|
+
xrSwitchViewAction as xrSwitchViewAction2
|
|
14
|
+
} from "./view-actions.js";
|
|
15
|
+
export {
|
|
16
|
+
xrCloseViewAction as XR_CLOSE_VIEW,
|
|
17
|
+
xrListViewsAction as XR_LIST_VIEWS,
|
|
18
|
+
xrOpenViewAction as XR_OPEN_VIEW,
|
|
19
|
+
xrResizeViewAction as XR_RESIZE_VIEW,
|
|
20
|
+
xrSwitchViewAction as XR_SWITCH_VIEW,
|
|
21
|
+
collectXRViews,
|
|
22
|
+
extractViewId,
|
|
23
|
+
xrCloseViewAction2 as xrCloseViewAction,
|
|
24
|
+
xrListViewsAction2 as xrListViewsAction,
|
|
25
|
+
xrOpenViewAction2 as xrOpenViewAction,
|
|
26
|
+
xrResizeViewAction2 as xrResizeViewAction,
|
|
27
|
+
xrSwitchViewAction2 as xrSwitchViewAction
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=xr-view-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/xr-view-actions.ts"],"sourcesContent":["/**\n * XR view control actions — re-exported with the canonical names the\n * feature-parity test suite expects.\n *\n * All five actions (XR_OPEN_VIEW, XR_CLOSE_VIEW, XR_SWITCH_VIEW,\n * XR_LIST_VIEWS, XR_RESIZE_VIEW) are implemented in view-actions.ts and\n * re-exported here so tests can import from a single predictable location.\n *\n * Natural-language routing is implemented in view-actions.ts against the\n * runtime view registry, so this module does not need to know about other\n * plugins' view ids.\n */\n\nexport {\n collectXRViews,\n extractViewId,\n xrCloseViewAction as XR_CLOSE_VIEW,\n xrCloseViewAction,\n xrListViewsAction as XR_LIST_VIEWS,\n xrListViewsAction,\n xrOpenViewAction as XR_OPEN_VIEW,\n xrOpenViewAction,\n xrResizeViewAction as XR_RESIZE_VIEW,\n xrResizeViewAction,\n xrSwitchViewAction as XR_SWITCH_VIEW,\n xrSwitchViewAction,\n} from \"./view-actions.js\";\n"],"mappings":"AAaA;AAAA,EACE;AAAA,EACA;AAAA,EACqB;AAAA,EACrB,qBAAAA;AAAA,EACqB;AAAA,EACrB,qBAAAC;AAAA,EACoB;AAAA,EACpB,oBAAAC;AAAA,EACsB;AAAA,EACtB,sBAAAC;AAAA,EACsB;AAAA,EACtB,sBAAAC;AAAA,OACK;","names":["xrCloseViewAction","xrListViewsAction","xrOpenViewAction","xrResizeViewAction","xrSwitchViewAction"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FacewearSpatialView - the facewear device-management surface authored once
|
|
3
|
+
* with the spatial vocabulary, so it renders correctly wherever it is shown:
|
|
4
|
+
*
|
|
5
|
+
* - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).
|
|
6
|
+
* - TUI - rendered to real terminal lines by the agent terminal, via
|
|
7
|
+
* `registerSpatialTerminalView` (see `register-terminal-view.tsx`).
|
|
8
|
+
*
|
|
9
|
+
* It is purely presentational (a snapshot + an action callback in, primitives
|
|
10
|
+
* out) and imports only the cross-modality primitives plus a type-only view of
|
|
11
|
+
* the device registry, so it is safe to render in the Node agent process where
|
|
12
|
+
* the terminal lives (no fetch/Capacitor runtime import).
|
|
13
|
+
*/
|
|
14
|
+
import type { FacewearDeviceType } from "../devices/registry.js";
|
|
15
|
+
/** A connected facewear device, mirrored from `/api/facewear/status`. */
|
|
16
|
+
export interface FacewearDeviceRow {
|
|
17
|
+
id: string;
|
|
18
|
+
kind: "xr" | "smartglasses";
|
|
19
|
+
deviceType?: string;
|
|
20
|
+
}
|
|
21
|
+
/** A supported device the operator can connect/manage. */
|
|
22
|
+
export interface FacewearProfileRow {
|
|
23
|
+
type: FacewearDeviceType;
|
|
24
|
+
name: string;
|
|
25
|
+
manufacturer: string;
|
|
26
|
+
connectionType: string;
|
|
27
|
+
connected: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface FacewearSnapshot {
|
|
30
|
+
/** Supported device profiles with their derived connected state. */
|
|
31
|
+
profiles: FacewearProfileRow[];
|
|
32
|
+
/** The live connected devices the status route reports. */
|
|
33
|
+
devices: FacewearDeviceRow[];
|
|
34
|
+
/** Number of connected devices (the header pill count). */
|
|
35
|
+
connectedCount: number;
|
|
36
|
+
loading?: boolean;
|
|
37
|
+
error?: string | null;
|
|
38
|
+
}
|
|
39
|
+
/** Empty snapshot used by the terminal registry before live data arrives. */
|
|
40
|
+
export declare const EMPTY_FACEWEAR_SNAPSHOT: FacewearSnapshot;
|
|
41
|
+
export interface FacewearSpatialViewProps {
|
|
42
|
+
snapshot: FacewearSnapshot;
|
|
43
|
+
/**
|
|
44
|
+
* Dispatch by agent id: `connect:<deviceType>` (connect/manage a profile),
|
|
45
|
+
* `refresh`, `xr-connect`, `xr-status`.
|
|
46
|
+
*/
|
|
47
|
+
onAction?: (action: string) => void;
|
|
48
|
+
}
|
|
49
|
+
export declare function FacewearSpatialView({ snapshot, onAction, }: FacewearSpatialViewProps): import("react/jsx-runtime").JSX.Element;
|
|
50
|
+
//# sourceMappingURL=FacewearSpatialView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FacewearSpatialView.d.ts","sourceRoot":"","sources":["../../src/components/FacewearSpatialView.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,GAAG,cAAc,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAID,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,EAAE,gBAMrC,CAAC;AAMF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,QAAQ,GACT,EAAE,wBAAwB,2CAuH1B"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Card,
|
|
5
|
+
Divider,
|
|
6
|
+
HStack,
|
|
7
|
+
List,
|
|
8
|
+
Text,
|
|
9
|
+
VStack
|
|
10
|
+
} from "@elizaos/ui/spatial";
|
|
11
|
+
const VISIBLE_DEVICE_LIMIT = 4;
|
|
12
|
+
const EMPTY_FACEWEAR_SNAPSHOT = {
|
|
13
|
+
profiles: [],
|
|
14
|
+
devices: [],
|
|
15
|
+
connectedCount: 0,
|
|
16
|
+
loading: false,
|
|
17
|
+
error: null
|
|
18
|
+
};
|
|
19
|
+
function connectionTone(connected) {
|
|
20
|
+
return connected ? "success" : "muted";
|
|
21
|
+
}
|
|
22
|
+
function FacewearSpatialView({
|
|
23
|
+
snapshot,
|
|
24
|
+
onAction
|
|
25
|
+
}) {
|
|
26
|
+
const dispatch = (action) => () => onAction?.(action);
|
|
27
|
+
const { connectedCount } = snapshot;
|
|
28
|
+
const visibleDevices = snapshot.devices.slice(0, VISIBLE_DEVICE_LIMIT);
|
|
29
|
+
const hiddenDevices = Math.max(
|
|
30
|
+
0,
|
|
31
|
+
snapshot.devices.length - VISIBLE_DEVICE_LIMIT
|
|
32
|
+
);
|
|
33
|
+
return /* @__PURE__ */ jsxs(Card, { gap: 1, padding: 1, children: [
|
|
34
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, align: "center", children: [
|
|
35
|
+
/* @__PURE__ */ jsx(
|
|
36
|
+
Text,
|
|
37
|
+
{
|
|
38
|
+
style: "caption",
|
|
39
|
+
tone: connectedCount > 0 ? "success" : "muted",
|
|
40
|
+
grow: 1,
|
|
41
|
+
children: connectedCount > 0 ? `${connectedCount} device${connectedCount === 1 ? "" : "s"} connected` : "None"
|
|
42
|
+
}
|
|
43
|
+
),
|
|
44
|
+
/* @__PURE__ */ jsx(Text, { style: "caption", tone: "muted", children: snapshot.loading ? "loading" : `${snapshot.profiles.length} models` })
|
|
45
|
+
] }),
|
|
46
|
+
snapshot.error ? /* @__PURE__ */ jsx(Text, { tone: "danger", style: "caption", children: snapshot.error }) : null,
|
|
47
|
+
visibleDevices.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
48
|
+
/* @__PURE__ */ jsx(Divider, { label: "active" }),
|
|
49
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, wrap: true, children: [
|
|
50
|
+
visibleDevices.map((device) => /* @__PURE__ */ jsx(Text, { style: "caption", tone: "success", wrap: false, children: device.deviceType ?? device.kind }, device.id)),
|
|
51
|
+
hiddenDevices > 0 ? /* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", children: [
|
|
52
|
+
"+",
|
|
53
|
+
hiddenDevices
|
|
54
|
+
] }) : null
|
|
55
|
+
] })
|
|
56
|
+
] }) : null,
|
|
57
|
+
/* @__PURE__ */ jsx(Divider, { label: "devices" }),
|
|
58
|
+
snapshot.profiles.length === 0 ? /* @__PURE__ */ jsx(Text, { tone: "muted", align: "center", style: "caption", children: snapshot.loading ? "Loading" : "None" }) : /* @__PURE__ */ jsx(List, { gap: 0, children: snapshot.profiles.map((profile) => /* @__PURE__ */ jsxs(
|
|
59
|
+
HStack,
|
|
60
|
+
{
|
|
61
|
+
gap: 1,
|
|
62
|
+
align: "center",
|
|
63
|
+
agent: `device-${profile.type}`,
|
|
64
|
+
children: [
|
|
65
|
+
/* @__PURE__ */ jsx(Text, { tone: connectionTone(profile.connected), children: profile.connected ? "[ok]" : "[ ]" }),
|
|
66
|
+
/* @__PURE__ */ jsxs(VStack, { gap: 0, grow: 1, children: [
|
|
67
|
+
/* @__PURE__ */ jsx(Text, { bold: true, wrap: false, children: profile.name }),
|
|
68
|
+
/* @__PURE__ */ jsxs(Text, { style: "caption", tone: "muted", wrap: false, children: [
|
|
69
|
+
profile.manufacturer,
|
|
70
|
+
" \xB7 ",
|
|
71
|
+
profile.connectionType
|
|
72
|
+
] })
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
Button,
|
|
76
|
+
{
|
|
77
|
+
variant: profile.connected ? "outline" : "solid",
|
|
78
|
+
tone: profile.connected ? "default" : "primary",
|
|
79
|
+
agent: `connect:${profile.type}`,
|
|
80
|
+
onPress: dispatch(`connect:${profile.type}`),
|
|
81
|
+
children: profile.connected ? "Manage" : "Connect"
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
profile.type
|
|
87
|
+
)) }),
|
|
88
|
+
/* @__PURE__ */ jsx(Divider, { label: "actions" }),
|
|
89
|
+
/* @__PURE__ */ jsxs(HStack, { gap: 1, wrap: true, children: [
|
|
90
|
+
/* @__PURE__ */ jsx(
|
|
91
|
+
Button,
|
|
92
|
+
{
|
|
93
|
+
variant: "outline",
|
|
94
|
+
tone: "default",
|
|
95
|
+
grow: 1,
|
|
96
|
+
agent: "xr-connect",
|
|
97
|
+
onPress: dispatch("xr-connect"),
|
|
98
|
+
children: "XR Connect"
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
Button,
|
|
103
|
+
{
|
|
104
|
+
variant: "outline",
|
|
105
|
+
tone: "default",
|
|
106
|
+
grow: 1,
|
|
107
|
+
agent: "xr-status",
|
|
108
|
+
onPress: dispatch("xr-status"),
|
|
109
|
+
children: "XR Status"
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
Button,
|
|
114
|
+
{
|
|
115
|
+
variant: "ghost",
|
|
116
|
+
tone: "default",
|
|
117
|
+
agent: "refresh",
|
|
118
|
+
onPress: dispatch("refresh"),
|
|
119
|
+
children: "Refresh"
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
] })
|
|
123
|
+
] });
|
|
124
|
+
}
|
|
125
|
+
export {
|
|
126
|
+
EMPTY_FACEWEAR_SNAPSHOT,
|
|
127
|
+
FacewearSpatialView
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=FacewearSpatialView.js.map
|