@elizaos/plugin-xr 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/xr-query-vision.d.ts +3 -0
- package/dist/actions/xr-query-vision.d.ts.map +1 -0
- package/dist/actions/xr-query-vision.js +39 -0
- package/dist/actions/xr-query-vision.js.map +1 -0
- package/dist/actions/xr-view-actions.d.ts +18 -0
- package/dist/actions/xr-view-actions.d.ts.map +1 -0
- package/dist/actions/xr-view-actions.js +304 -0
- package/dist/actions/xr-view-actions.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +124 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +18 -0
- package/dist/protocol.js.map +1 -0
- package/dist/providers/xr-context.d.ts +3 -0
- package/dist/providers/xr-context.d.ts.map +1 -0
- package/dist/providers/xr-context.js +34 -0
- package/dist/providers/xr-context.js.map +1 -0
- package/dist/routes/xr-connect.d.ts +3 -0
- package/dist/routes/xr-connect.d.ts.map +1 -0
- package/{src/routes/xr-connect.ts → dist/routes/xr-connect.js} +12 -15
- package/dist/routes/xr-connect.js.map +1 -0
- package/dist/routes/xr-simulator-route.d.ts +8 -0
- package/dist/routes/xr-simulator-route.d.ts.map +1 -0
- package/{src/routes/xr-simulator-route.ts → dist/routes/xr-simulator-route.js} +10 -16
- package/dist/routes/xr-simulator-route.js.map +1 -0
- package/dist/routes/xr-status.d.ts +3 -0
- package/dist/routes/xr-status.d.ts.map +1 -0
- package/{src/routes/xr-status.ts → dist/routes/xr-status.js} +13 -15
- package/dist/routes/xr-status.js.map +1 -0
- package/dist/routes/xr-view-host.d.ts +24 -0
- package/dist/routes/xr-view-host.d.ts.map +1 -0
- package/{src/routes/xr-view-host.ts → dist/routes/xr-view-host.js} +22 -59
- package/dist/routes/xr-view-host.js.map +1 -0
- package/dist/routes/xr-views.d.ts +8 -0
- package/dist/routes/xr-views.d.ts.map +1 -0
- package/dist/routes/xr-views.js +31 -0
- package/dist/routes/xr-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/{src/services/audio-pipeline.ts → dist/services/audio-pipeline.js} +25 -58
- package/dist/services/audio-pipeline.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 +50 -0
- package/dist/services/xr-session-service.d.ts.map +1 -0
- package/{src/services/xr-session-service.ts → dist/services/xr-session-service.js} +85 -194
- package/dist/services/xr-session-service.js.map +1 -0
- package/package.json +9 -4
- package/AGENTS.md +0 -151
- package/CLAUDE.md +0 -151
- package/simulator/bun.lock +0 -159
- package/simulator/package.json +0 -28
- package/simulator/src/emulator.ts +0 -174
- package/simulator/src/mock-agent.ts +0 -233
- package/simulator/src/node.ts +0 -9
- package/simulator/src/playwright-fixture.ts +0 -169
- package/simulator/src/types.ts +0 -51
- package/simulator/tsconfig.json +0 -13
- package/simulator/vite.config.ts +0 -25
- package/src/__tests__/audio-pipeline.test.ts +0 -129
- package/src/__tests__/protocol.test.ts +0 -53
- package/src/__tests__/routes-e2e.test.ts +0 -276
- package/src/__tests__/vision-pipeline.test.ts +0 -73
- package/src/__tests__/xr-bundle-coverage.test.ts +0 -303
- package/src/__tests__/xr-feature-parity.test.ts +0 -524
- package/src/__tests__/xr-functional-parity.test.ts +0 -522
- package/src/__tests__/xr-view-host-http.test.ts +0 -239
- package/src/__tests__/xr-view-host.test.ts +0 -174
- package/src/actions/xr-query-vision.ts +0 -64
- package/src/actions/xr-view-actions.ts +0 -386
- package/src/index.ts +0 -55
- package/src/protocol.ts +0 -126
- package/src/providers/xr-context.ts +0 -49
- package/src/routes/xr-views.ts +0 -43
- package/src/services/vision-pipeline.ts +0 -57
- package/tsconfig.build.json +0 -9
- package/tsconfig.json +0 -30
- package/vitest.config.ts +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xr-query-vision.d.ts","sourceRoot":"","sources":["../../src/actions/xr-query-vision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EAMP,MAAM,eAAe,CAAC;AAMvB,eAAO,MAAM,mBAAmB,EAAE,MAkDjC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
export {
|
|
37
|
+
xrQueryVisionAction
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=xr-query-vision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/xr-query-vision.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 | undefined,\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"],"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;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Action } from "@elizaos/core";
|
|
2
|
+
export declare const xrOpenViewAction: Action;
|
|
3
|
+
export declare const xrCloseViewAction: Action;
|
|
4
|
+
export declare const xrSwitchViewAction: Action;
|
|
5
|
+
export declare const xrListViewsAction: Action;
|
|
6
|
+
export declare const xrResizeViewAction: Action;
|
|
7
|
+
/** Extract a likely view id from natural language */
|
|
8
|
+
export declare function extractViewId(text: string): string;
|
|
9
|
+
type XRViewSummary = {
|
|
10
|
+
id: string;
|
|
11
|
+
label: string;
|
|
12
|
+
icon?: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
};
|
|
15
|
+
/** Collect all XR-typed views from registered plugins */
|
|
16
|
+
export declare function collectXRViews(): XRViewSummary[];
|
|
17
|
+
export {};
|
|
18
|
+
//# 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":"AACA,OAAO,KAAK,EACV,MAAM,EAKP,MAAM,eAAe,CAAC;AA4BvB,eAAO,MAAM,gBAAgB,EAAE,MAoE9B,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,MAqD/B,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,MA4ChC,CAAC;AAIF,eAAO,MAAM,iBAAiB,EAAE,MAkD/B,CAAC;AAIF,eAAO,MAAM,kBAAkB,EAAE,MA6EhC,CAAC;AAIF,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAalD;AAED,KAAK,aAAa,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,yDAAyD;AACzD,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAchD"}
|
|
@@ -0,0 +1,304 @@
|
|
|
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
|
+
function extractViewId(text) {
|
|
267
|
+
const lower = text.toLowerCase();
|
|
268
|
+
for (const view of collectXRViews()) {
|
|
269
|
+
const terms = [view.id, view.id.replace(/-/g, " "), view.label].map(
|
|
270
|
+
(term) => term.toLowerCase()
|
|
271
|
+
);
|
|
272
|
+
if (terms.some((term) => term && lower.includes(term))) {
|
|
273
|
+
return view.id;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const quoted = text.match(/["']([^"']+)["']/);
|
|
277
|
+
if (quoted?.[1]) return quoted[1];
|
|
278
|
+
return "";
|
|
279
|
+
}
|
|
280
|
+
function collectXRViews() {
|
|
281
|
+
const byId = /* @__PURE__ */ new Map();
|
|
282
|
+
for (const view of listViews({ developerMode: true, viewType: "xr" })) {
|
|
283
|
+
if (view.viewType !== "xr") continue;
|
|
284
|
+
byId.set(view.id, {
|
|
285
|
+
id: view.id,
|
|
286
|
+
label: view.label,
|
|
287
|
+
icon: view.icon,
|
|
288
|
+
description: view.description
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
return [...byId.values()].sort(
|
|
292
|
+
(a, b) => a.label.localeCompare(b.label) || a.id.localeCompare(b.id)
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
export {
|
|
296
|
+
collectXRViews,
|
|
297
|
+
extractViewId,
|
|
298
|
+
xrCloseViewAction,
|
|
299
|
+
xrListViewsAction,
|
|
300
|
+
xrOpenViewAction,
|
|
301
|
+
xrResizeViewAction,
|
|
302
|
+
xrSwitchViewAction
|
|
303
|
+
};
|
|
304
|
+
//# sourceMappingURL=xr-view-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/actions/xr-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// ── 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?.[1]) 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"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Plugin } from "@elizaos/core";
|
|
2
|
+
export type * from "./protocol.ts";
|
|
3
|
+
export { AudioPipeline } from "./services/audio-pipeline.ts";
|
|
4
|
+
export { VisionPipeline } from "./services/vision-pipeline.ts";
|
|
5
|
+
export { XR_SERVICE_TYPE, XR_WS_PORT_DEFAULT, XRSessionService, } from "./services/xr-session-service.ts";
|
|
6
|
+
export declare const xrPlugin: Plugin;
|
|
7
|
+
export default xrPlugin;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAiB5C,mBAAmB,eAAe,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,QAAQ,EAAE,MA0BtB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { xrQueryVisionAction } from "./actions/xr-query-vision.js";
|
|
2
|
+
import {
|
|
3
|
+
xrCloseViewAction,
|
|
4
|
+
xrListViewsAction,
|
|
5
|
+
xrOpenViewAction,
|
|
6
|
+
xrResizeViewAction,
|
|
7
|
+
xrSwitchViewAction
|
|
8
|
+
} from "./actions/xr-view-actions.js";
|
|
9
|
+
import { xrContextProvider } from "./providers/xr-context.js";
|
|
10
|
+
import { xrConnectRoute } from "./routes/xr-connect.js";
|
|
11
|
+
import { xrSimulatorRoute } from "./routes/xr-simulator-route.js";
|
|
12
|
+
import { xrStatusRoute } from "./routes/xr-status.js";
|
|
13
|
+
import { xrViewHostRoute } from "./routes/xr-view-host.js";
|
|
14
|
+
import { xrViewsRoute } from "./routes/xr-views.js";
|
|
15
|
+
import { XRSessionService } from "./services/xr-session-service.js";
|
|
16
|
+
import { AudioPipeline } from "./services/audio-pipeline.js";
|
|
17
|
+
import { VisionPipeline } from "./services/vision-pipeline.js";
|
|
18
|
+
import {
|
|
19
|
+
XR_SERVICE_TYPE,
|
|
20
|
+
XR_WS_PORT_DEFAULT,
|
|
21
|
+
XRSessionService as XRSessionService2
|
|
22
|
+
} from "./services/xr-session-service.js";
|
|
23
|
+
const xrPlugin = {
|
|
24
|
+
name: "@elizaos/plugin-xr",
|
|
25
|
+
description: "Streams audio and camera video from XR headsets (Quest 3, XReal) to the agent and delivers voice responses back.",
|
|
26
|
+
services: [XRSessionService],
|
|
27
|
+
actions: [
|
|
28
|
+
xrQueryVisionAction,
|
|
29
|
+
xrOpenViewAction,
|
|
30
|
+
xrCloseViewAction,
|
|
31
|
+
xrSwitchViewAction,
|
|
32
|
+
xrListViewsAction,
|
|
33
|
+
xrResizeViewAction
|
|
34
|
+
],
|
|
35
|
+
providers: [xrContextProvider],
|
|
36
|
+
routes: [
|
|
37
|
+
xrStatusRoute,
|
|
38
|
+
xrConnectRoute,
|
|
39
|
+
xrViewsRoute,
|
|
40
|
+
xrViewHostRoute,
|
|
41
|
+
xrSimulatorRoute
|
|
42
|
+
],
|
|
43
|
+
config: {
|
|
44
|
+
XR_WS_PORT: 31338
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var index_default = xrPlugin;
|
|
48
|
+
export {
|
|
49
|
+
AudioPipeline,
|
|
50
|
+
VisionPipeline,
|
|
51
|
+
XRSessionService2 as XRSessionService,
|
|
52
|
+
XR_SERVICE_TYPE,
|
|
53
|
+
XR_WS_PORT_DEFAULT,
|
|
54
|
+
index_default as default,
|
|
55
|
+
xrPlugin
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Plugin } from \"@elizaos/core\";\nimport { xrQueryVisionAction } from \"./actions/xr-query-vision.js\";\nimport {\n xrCloseViewAction,\n xrListViewsAction,\n xrOpenViewAction,\n xrResizeViewAction,\n xrSwitchViewAction,\n} from \"./actions/xr-view-actions.js\";\nimport { xrContextProvider } from \"./providers/xr-context.js\";\nimport { xrConnectRoute } from \"./routes/xr-connect.js\";\nimport { xrSimulatorRoute } from \"./routes/xr-simulator-route.js\";\nimport { xrStatusRoute } from \"./routes/xr-status.js\";\nimport { xrViewHostRoute } from \"./routes/xr-view-host.js\";\nimport { xrViewsRoute } from \"./routes/xr-views.js\";\nimport { XRSessionService } from \"./services/xr-session-service.js\";\n\nexport type * from \"./protocol.js\";\nexport { AudioPipeline } from \"./services/audio-pipeline.js\";\nexport { VisionPipeline } from \"./services/vision-pipeline.js\";\nexport {\n XR_SERVICE_TYPE,\n XR_WS_PORT_DEFAULT,\n XRSessionService,\n} from \"./services/xr-session-service.js\";\n\nexport const xrPlugin: Plugin = {\n name: \"@elizaos/plugin-xr\",\n description:\n \"Streams audio and camera video from XR headsets (Quest 3, XReal) to the agent and delivers voice responses back.\",\n\n services: [XRSessionService],\n actions: [\n xrQueryVisionAction,\n xrOpenViewAction,\n xrCloseViewAction,\n xrSwitchViewAction,\n xrListViewsAction,\n xrResizeViewAction,\n ],\n providers: [xrContextProvider],\n routes: [\n xrStatusRoute,\n xrConnectRoute,\n xrViewsRoute,\n xrViewHostRoute,\n xrSimulatorRoute,\n ],\n\n config: {\n XR_WS_PORT: 31338,\n },\n};\n\nexport default xrPlugin;\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAGjC,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B;AAAA,EACE;AAAA,EACA;AAAA,EACA,oBAAAA;AAAA,OACK;AAEA,MAAM,WAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,UAAU,CAAC,gBAAgB;AAAA,EAC3B,SAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,WAAW,CAAC,iBAAiB;AAAA,EAC7B,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,IACN,YAAY;AAAA,EACd;AACF;AAEA,IAAO,gBAAQ;","names":["XRSessionService"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export type XRDeviceType = "quest3" | "xreal" | "simulator";
|
|
2
|
+
/** View panel state reported back from the XR device */
|
|
3
|
+
export interface XRViewPanelState {
|
|
4
|
+
viewId: string;
|
|
5
|
+
active: boolean;
|
|
6
|
+
width?: number;
|
|
7
|
+
height?: number;
|
|
8
|
+
}
|
|
9
|
+
export type XRClientControl = {
|
|
10
|
+
type: "hello";
|
|
11
|
+
deviceType: XRDeviceType;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: "ping";
|
|
15
|
+
} | {
|
|
16
|
+
type: "view_ready";
|
|
17
|
+
viewId: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: "view_closed";
|
|
20
|
+
viewId: string;
|
|
21
|
+
} | {
|
|
22
|
+
type: "view_event";
|
|
23
|
+
viewId: string;
|
|
24
|
+
event: string;
|
|
25
|
+
payload?: unknown;
|
|
26
|
+
};
|
|
27
|
+
export interface XRAudioHeader {
|
|
28
|
+
type: "audio";
|
|
29
|
+
ts: number;
|
|
30
|
+
sampleRate: number;
|
|
31
|
+
/** "webm-opus" from MediaRecorder, "pcm-f32" from ScriptProcessor fallback */
|
|
32
|
+
encoding: "webm-opus" | "pcm-f32";
|
|
33
|
+
}
|
|
34
|
+
export interface XRFrameHeader {
|
|
35
|
+
type: "frame";
|
|
36
|
+
ts: number;
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
format: "jpeg" | "webp";
|
|
40
|
+
pose?: {
|
|
41
|
+
position: {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
z: number;
|
|
45
|
+
};
|
|
46
|
+
orientation: {
|
|
47
|
+
x: number;
|
|
48
|
+
y: number;
|
|
49
|
+
z: number;
|
|
50
|
+
w: number;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export type XRBinaryHeader = XRAudioHeader | XRFrameHeader;
|
|
55
|
+
/** XR panel sizing options */
|
|
56
|
+
export interface XRPanelConfig {
|
|
57
|
+
/** Panel width relative to default (0.5 = half, 2.0 = double) */
|
|
58
|
+
scale?: number;
|
|
59
|
+
/** Follow mode: billboard | fixed | follow */
|
|
60
|
+
followMode?: "billboard" | "fixed" | "follow";
|
|
61
|
+
/** Distance from camera in metres */
|
|
62
|
+
distance?: number;
|
|
63
|
+
/** Whether to show as full-overlay or floating panel */
|
|
64
|
+
fullscreen?: boolean;
|
|
65
|
+
}
|
|
66
|
+
export type XRServerControl = {
|
|
67
|
+
type: "ready";
|
|
68
|
+
sessionId: string;
|
|
69
|
+
} | {
|
|
70
|
+
type: "transcript";
|
|
71
|
+
text: string;
|
|
72
|
+
final: boolean;
|
|
73
|
+
} | {
|
|
74
|
+
type: "agent_text";
|
|
75
|
+
text: string;
|
|
76
|
+
} | {
|
|
77
|
+
type: "pong";
|
|
78
|
+
}
|
|
79
|
+
/** Open (or bring to front) a view by its registered view id */
|
|
80
|
+
| {
|
|
81
|
+
type: "view_open";
|
|
82
|
+
viewId: string;
|
|
83
|
+
agentBaseUrl: string;
|
|
84
|
+
config?: XRPanelConfig;
|
|
85
|
+
}
|
|
86
|
+
/** Close a specific view panel */
|
|
87
|
+
| {
|
|
88
|
+
type: "view_close";
|
|
89
|
+
viewId: string;
|
|
90
|
+
}
|
|
91
|
+
/** Switch the "active" (foreground) view */
|
|
92
|
+
| {
|
|
93
|
+
type: "view_switch";
|
|
94
|
+
viewId: string;
|
|
95
|
+
}
|
|
96
|
+
/** Resize / reposition the active or named panel */
|
|
97
|
+
| {
|
|
98
|
+
type: "view_resize";
|
|
99
|
+
viewId?: string;
|
|
100
|
+
config: XRPanelConfig;
|
|
101
|
+
}
|
|
102
|
+
/** Send all available views to the device for the launcher */
|
|
103
|
+
| {
|
|
104
|
+
type: "views_catalog";
|
|
105
|
+
views: Array<{
|
|
106
|
+
id: string;
|
|
107
|
+
label: string;
|
|
108
|
+
icon?: string;
|
|
109
|
+
description?: string;
|
|
110
|
+
}>;
|
|
111
|
+
};
|
|
112
|
+
export interface XRTTSAudioHeader {
|
|
113
|
+
type: "tts_audio";
|
|
114
|
+
sampleRate: number;
|
|
115
|
+
channels: number;
|
|
116
|
+
/** encoding of the outbound audio */
|
|
117
|
+
encoding: "mp3" | "wav" | "pcm-f32";
|
|
118
|
+
}
|
|
119
|
+
export declare function encodeBinaryFrame(header: XRBinaryHeader | XRTTSAudioHeader, payload: Uint8Array | Buffer): Buffer;
|
|
120
|
+
export declare function decodeBinaryFrame(data: Buffer): {
|
|
121
|
+
header: XRBinaryHeader | XRTTSAudioHeader;
|
|
122
|
+
payload: Buffer;
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
function encodeBinaryFrame(header, payload) {
|
|
2
|
+
const headerJson = Buffer.from(JSON.stringify(header), "utf8");
|
|
3
|
+
const lenBuf = Buffer.allocUnsafe(4);
|
|
4
|
+
lenBuf.writeUInt32BE(headerJson.length, 0);
|
|
5
|
+
return Buffer.concat([lenBuf, headerJson, payload]);
|
|
6
|
+
}
|
|
7
|
+
function decodeBinaryFrame(data) {
|
|
8
|
+
const headerLen = data.readUInt32BE(0);
|
|
9
|
+
const headerJson = data.subarray(4, 4 + headerLen).toString("utf8");
|
|
10
|
+
const header = JSON.parse(headerJson);
|
|
11
|
+
const payload = data.subarray(4 + headerLen);
|
|
12
|
+
return { header, payload };
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
decodeBinaryFrame,
|
|
16
|
+
encodeBinaryFrame
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=protocol.js.map
|