@elizaos/app-hyperscape 1.0.0
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/index.d.ts +20 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/routes.d.ts +18 -0
- package/dist/routes.js +88 -0
- package/dist/routes.js.map +1 -0
- package/elizaos.plugin.json +63 -0
- package/package.json +84 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Plugin } from '@elizaos/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @elizaos/app-hyperscape
|
|
5
|
+
*
|
|
6
|
+
* ElizaOS app for connecting AI agents to Hyperscape 3D multiplayer RPG worlds.
|
|
7
|
+
* Agents can explore, fight, gather resources, craft items, bank, and chat.
|
|
8
|
+
*
|
|
9
|
+
* This is a "connect" type app — the agent plugin connects to an external
|
|
10
|
+
* Hyperscape game server via WebSocket. The player opens the Hyperscape client
|
|
11
|
+
* in their browser to watch their agent play.
|
|
12
|
+
*
|
|
13
|
+
* When the full @hyperscape/plugin-hyperscape is published to npm, this package
|
|
14
|
+
* will re-export it. Until then, this provides the registry-compatible wrapper
|
|
15
|
+
* with app metadata and basic configuration.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
declare const appHyperscape: Plugin;
|
|
19
|
+
|
|
20
|
+
export { appHyperscape, appHyperscape as default };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { logger } from "@elizaos/core";
|
|
3
|
+
function env(key, fallback = "") {
|
|
4
|
+
const v = process.env[key]?.trim();
|
|
5
|
+
return v && v !== "undefined" && v !== "null" ? v : fallback;
|
|
6
|
+
}
|
|
7
|
+
var appHyperscape = {
|
|
8
|
+
name: "@elizaos/app-hyperscape",
|
|
9
|
+
description: "Connect AI agents to Hyperscape 3D multiplayer RPG \u2014 explore, fight, gather, craft, and socialize",
|
|
10
|
+
config: {
|
|
11
|
+
HYPERSCAPE_SERVER_URL: env("HYPERSCAPE_SERVER_URL", "ws://localhost:5555/ws"),
|
|
12
|
+
HYPERSCAPE_AUTO_RECONNECT: env("HYPERSCAPE_AUTO_RECONNECT", "true"),
|
|
13
|
+
HYPERSCAPE_AUTH_TOKEN: env("HYPERSCAPE_AUTH_TOKEN"),
|
|
14
|
+
HYPERSCAPE_AUTONOMY_MODE: env("HYPERSCAPE_AUTONOMY_MODE", "llm")
|
|
15
|
+
},
|
|
16
|
+
init: async (_config, runtime) => {
|
|
17
|
+
const serverUrl = runtime.getSetting("HYPERSCAPE_SERVER_URL") || process.env.HYPERSCAPE_SERVER_URL || "ws://localhost:5555/ws";
|
|
18
|
+
logger.info(`[app-hyperscape] Configured for server: ${serverUrl}`);
|
|
19
|
+
},
|
|
20
|
+
app: {
|
|
21
|
+
displayName: "Hyperscape",
|
|
22
|
+
category: "game",
|
|
23
|
+
launchType: "connect",
|
|
24
|
+
launchUrl: "https://hyperscape.ai",
|
|
25
|
+
capabilities: [
|
|
26
|
+
"combat",
|
|
27
|
+
"skills",
|
|
28
|
+
"inventory",
|
|
29
|
+
"banking",
|
|
30
|
+
"social-chat",
|
|
31
|
+
"exploration",
|
|
32
|
+
"crafting"
|
|
33
|
+
],
|
|
34
|
+
viewer: {
|
|
35
|
+
url: "http://localhost:3333",
|
|
36
|
+
embedParams: {
|
|
37
|
+
embedded: "true",
|
|
38
|
+
mode: "spectator",
|
|
39
|
+
quality: "medium"
|
|
40
|
+
},
|
|
41
|
+
postMessageAuth: true,
|
|
42
|
+
sandbox: "allow-scripts allow-same-origin allow-popups allow-forms"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
var index_default = appHyperscape;
|
|
47
|
+
export {
|
|
48
|
+
appHyperscape,
|
|
49
|
+
index_default as default
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @elizaos/app-hyperscape\n *\n * ElizaOS app for connecting AI agents to Hyperscape 3D multiplayer RPG worlds.\n * Agents can explore, fight, gather resources, craft items, bank, and chat.\n *\n * This is a \"connect\" type app — the agent plugin connects to an external\n * Hyperscape game server via WebSocket. The player opens the Hyperscape client\n * in their browser to watch their agent play.\n *\n * When the full @hyperscape/plugin-hyperscape is published to npm, this package\n * will re-export it. Until then, this provides the registry-compatible wrapper\n * with app metadata and basic configuration.\n */\n\nimport type { Plugin, IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\n/** Read an env value, treating \"undefined\"/\"null\"/empty as missing. */\nfunction env(key: string, fallback = \"\"): string {\n const v = process.env[key]?.trim();\n return v && v !== \"undefined\" && v !== \"null\" ? v : fallback;\n}\n\n// ── Plugin Definition ──────────────────────────────────────────────────────\n\nexport const appHyperscape = {\n name: \"@elizaos/app-hyperscape\",\n description:\n \"Connect AI agents to Hyperscape 3D multiplayer RPG — explore, fight, gather, craft, and socialize\",\n\n config: {\n HYPERSCAPE_SERVER_URL: env(\"HYPERSCAPE_SERVER_URL\", \"ws://localhost:5555/ws\"),\n HYPERSCAPE_AUTO_RECONNECT: env(\"HYPERSCAPE_AUTO_RECONNECT\", \"true\"),\n HYPERSCAPE_AUTH_TOKEN: env(\"HYPERSCAPE_AUTH_TOKEN\"),\n HYPERSCAPE_AUTONOMY_MODE: env(\"HYPERSCAPE_AUTONOMY_MODE\", \"llm\"),\n },\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime) => {\n const serverUrl =\n runtime.getSetting(\"HYPERSCAPE_SERVER_URL\") ||\n process.env.HYPERSCAPE_SERVER_URL ||\n \"ws://localhost:5555/ws\";\n logger.info(`[app-hyperscape] Configured for server: ${serverUrl}`);\n },\n\n app: {\n displayName: \"Hyperscape\",\n category: \"game\",\n launchType: \"connect\",\n launchUrl: \"https://hyperscape.ai\",\n capabilities: [\n \"combat\",\n \"skills\",\n \"inventory\",\n \"banking\",\n \"social-chat\",\n \"exploration\",\n \"crafting\",\n ],\n viewer: {\n url: \"http://localhost:3333\",\n embedParams: {\n embedded: \"true\",\n mode: \"spectator\",\n quality: \"medium\",\n },\n postMessageAuth: true,\n sandbox: \"allow-scripts allow-same-origin allow-popups allow-forms\",\n },\n },\n} as Plugin;\n\nexport default appHyperscape;\n"],"mappings":";AAgBA,SAAS,cAAc;AAKvB,SAAS,IAAI,KAAa,WAAW,IAAY;AAC/C,QAAM,IAAI,QAAQ,IAAI,GAAG,GAAG,KAAK;AACjC,SAAO,KAAK,MAAM,eAAe,MAAM,SAAS,IAAI;AACtD;AAIO,IAAM,gBAAgB;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,QAAQ;AAAA,IACN,uBAAuB,IAAI,yBAAyB,wBAAwB;AAAA,IAC5E,2BAA2B,IAAI,6BAA6B,MAAM;AAAA,IAClE,uBAAuB,IAAI,uBAAuB;AAAA,IAClD,0BAA0B,IAAI,4BAA4B,KAAK;AAAA,EACjE;AAAA,EAEA,MAAM,OAAO,SAAiC,YAA2B;AACvE,UAAM,YACJ,QAAQ,WAAW,uBAAuB,KAC1C,QAAQ,IAAI,yBACZ;AACF,WAAO,KAAK,2CAA2C,SAAS,EAAE;AAAA,EACpE;AAAA,EAEA,KAAK;AAAA,IACH,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,aAAa;AAAA,QACX,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
|
package/dist/routes.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as http from 'node:http';
|
|
2
|
+
|
|
3
|
+
interface HyperscapeRelayOptions {
|
|
4
|
+
rawBodyOverride?: string;
|
|
5
|
+
contentTypeOverride?: string;
|
|
6
|
+
}
|
|
7
|
+
interface AppsHyperscapeRouteContext {
|
|
8
|
+
req: http.IncomingMessage;
|
|
9
|
+
res: http.ServerResponse;
|
|
10
|
+
method: string;
|
|
11
|
+
pathname: string;
|
|
12
|
+
readJsonBody: <T extends object>(req: http.IncomingMessage, res: http.ServerResponse) => Promise<T | null>;
|
|
13
|
+
error: (res: http.ServerResponse, message: string, status?: number) => void;
|
|
14
|
+
relayHyperscapeApi: (method: "GET" | "POST", path: string, options?: HyperscapeRelayOptions) => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
declare function handleAppsHyperscapeRoutes(ctx: AppsHyperscapeRouteContext): Promise<boolean>;
|
|
17
|
+
|
|
18
|
+
export { type AppsHyperscapeRouteContext, type HyperscapeRelayOptions, handleAppsHyperscapeRoutes };
|
package/dist/routes.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/routes.ts
|
|
2
|
+
async function handleAppsHyperscapeRoutes(ctx) {
|
|
3
|
+
const {
|
|
4
|
+
req,
|
|
5
|
+
res,
|
|
6
|
+
method,
|
|
7
|
+
pathname,
|
|
8
|
+
relayHyperscapeApi,
|
|
9
|
+
readJsonBody,
|
|
10
|
+
error
|
|
11
|
+
} = ctx;
|
|
12
|
+
if (method === "GET" && pathname === "/api/apps/hyperscape/embedded-agents") {
|
|
13
|
+
await relayHyperscapeApi("GET", "/api/embedded-agents");
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (method === "POST" && pathname === "/api/apps/hyperscape/embedded-agents") {
|
|
17
|
+
await relayHyperscapeApi("POST", "/api/embedded-agents");
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
if (method === "POST") {
|
|
21
|
+
const embeddedActionMatch = pathname.match(
|
|
22
|
+
/^\/api\/apps\/hyperscape\/embedded-agents\/([^/]+)\/(start|stop|pause|resume|command)$/
|
|
23
|
+
);
|
|
24
|
+
if (embeddedActionMatch) {
|
|
25
|
+
const characterId = decodeURIComponent(embeddedActionMatch[1]);
|
|
26
|
+
const action = embeddedActionMatch[2];
|
|
27
|
+
await relayHyperscapeApi(
|
|
28
|
+
"POST",
|
|
29
|
+
`/api/embedded-agents/${encodeURIComponent(characterId)}/${action}`
|
|
30
|
+
);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
const messageMatch = pathname.match(
|
|
34
|
+
/^\/api\/apps\/hyperscape\/agents\/([^/]+)\/message$/
|
|
35
|
+
);
|
|
36
|
+
if (messageMatch) {
|
|
37
|
+
const agentId = decodeURIComponent(messageMatch[1]);
|
|
38
|
+
const body = await readJsonBody(req, res);
|
|
39
|
+
if (!body) return true;
|
|
40
|
+
const content = body.content?.trim();
|
|
41
|
+
if (!content) {
|
|
42
|
+
error(res, "content is required");
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
await relayHyperscapeApi(
|
|
46
|
+
"POST",
|
|
47
|
+
`/api/embedded-agents/${encodeURIComponent(agentId)}/command`,
|
|
48
|
+
{
|
|
49
|
+
rawBodyOverride: JSON.stringify({
|
|
50
|
+
command: "chat",
|
|
51
|
+
data: { message: content }
|
|
52
|
+
}),
|
|
53
|
+
contentTypeOverride: "application/json"
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (method === "GET") {
|
|
60
|
+
const goalMatch = pathname.match(
|
|
61
|
+
/^\/api\/apps\/hyperscape\/agents\/([^/]+)\/goal$/
|
|
62
|
+
);
|
|
63
|
+
if (goalMatch) {
|
|
64
|
+
const agentId = decodeURIComponent(goalMatch[1]);
|
|
65
|
+
await relayHyperscapeApi(
|
|
66
|
+
"GET",
|
|
67
|
+
`/api/agents/${encodeURIComponent(agentId)}/goal`
|
|
68
|
+
);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const quickActionsMatch = pathname.match(
|
|
72
|
+
/^\/api\/apps\/hyperscape\/agents\/([^/]+)\/quick-actions$/
|
|
73
|
+
);
|
|
74
|
+
if (quickActionsMatch) {
|
|
75
|
+
const agentId = decodeURIComponent(quickActionsMatch[1]);
|
|
76
|
+
await relayHyperscapeApi(
|
|
77
|
+
"GET",
|
|
78
|
+
`/api/agents/${encodeURIComponent(agentId)}/quick-actions`
|
|
79
|
+
);
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
handleAppsHyperscapeRoutes
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/routes.ts"],"sourcesContent":["import type * as http from \"node:http\";\n\nexport interface HyperscapeRelayOptions {\n rawBodyOverride?: string;\n contentTypeOverride?: string;\n}\n\nexport interface AppsHyperscapeRouteContext {\n req: http.IncomingMessage;\n res: http.ServerResponse;\n method: string;\n pathname: string;\n readJsonBody: <T extends object>(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ) => Promise<T | null>;\n error: (res: http.ServerResponse, message: string, status?: number) => void;\n relayHyperscapeApi: (\n method: \"GET\" | \"POST\",\n path: string,\n options?: HyperscapeRelayOptions,\n ) => Promise<void>;\n}\n\nexport async function handleAppsHyperscapeRoutes(\n ctx: AppsHyperscapeRouteContext,\n): Promise<boolean> {\n const {\n req,\n res,\n method,\n pathname,\n relayHyperscapeApi,\n readJsonBody,\n error,\n } = ctx;\n\n if (method === \"GET\" && pathname === \"/api/apps/hyperscape/embedded-agents\") {\n await relayHyperscapeApi(\"GET\", \"/api/embedded-agents\");\n return true;\n }\n\n if (\n method === \"POST\" &&\n pathname === \"/api/apps/hyperscape/embedded-agents\"\n ) {\n await relayHyperscapeApi(\"POST\", \"/api/embedded-agents\");\n return true;\n }\n\n if (method === \"POST\") {\n const embeddedActionMatch = pathname.match(\n /^\\/api\\/apps\\/hyperscape\\/embedded-agents\\/([^/]+)\\/(start|stop|pause|resume|command)$/,\n );\n if (embeddedActionMatch) {\n const characterId = decodeURIComponent(embeddedActionMatch[1]);\n const action = embeddedActionMatch[2];\n await relayHyperscapeApi(\n \"POST\",\n `/api/embedded-agents/${encodeURIComponent(characterId)}/${action}`,\n );\n return true;\n }\n\n const messageMatch = pathname.match(\n /^\\/api\\/apps\\/hyperscape\\/agents\\/([^/]+)\\/message$/,\n );\n if (messageMatch) {\n const agentId = decodeURIComponent(messageMatch[1]);\n const body = await readJsonBody<{ content?: string }>(req, res);\n if (!body) return true;\n const content = body.content?.trim();\n if (!content) {\n error(res, \"content is required\");\n return true;\n }\n await relayHyperscapeApi(\n \"POST\",\n `/api/embedded-agents/${encodeURIComponent(agentId)}/command`,\n {\n rawBodyOverride: JSON.stringify({\n command: \"chat\",\n data: { message: content },\n }),\n contentTypeOverride: \"application/json\",\n },\n );\n return true;\n }\n }\n\n if (method === \"GET\") {\n const goalMatch = pathname.match(\n /^\\/api\\/apps\\/hyperscape\\/agents\\/([^/]+)\\/goal$/,\n );\n if (goalMatch) {\n const agentId = decodeURIComponent(goalMatch[1]);\n await relayHyperscapeApi(\n \"GET\",\n `/api/agents/${encodeURIComponent(agentId)}/goal`,\n );\n return true;\n }\n\n const quickActionsMatch = pathname.match(\n /^\\/api\\/apps\\/hyperscape\\/agents\\/([^/]+)\\/quick-actions$/,\n );\n if (quickActionsMatch) {\n const agentId = decodeURIComponent(quickActionsMatch[1]);\n await relayHyperscapeApi(\n \"GET\",\n `/api/agents/${encodeURIComponent(agentId)}/quick-actions`,\n );\n return true;\n }\n }\n\n return false;\n}\n"],"mappings":";AAwBA,eAAsB,2BACpB,KACkB;AAClB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,WAAW,SAAS,aAAa,wCAAwC;AAC3E,UAAM,mBAAmB,OAAO,sBAAsB;AACtD,WAAO;AAAA,EACT;AAEA,MACE,WAAW,UACX,aAAa,wCACb;AACA,UAAM,mBAAmB,QAAQ,sBAAsB;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,QAAQ;AACrB,UAAM,sBAAsB,SAAS;AAAA,MACnC;AAAA,IACF;AACA,QAAI,qBAAqB;AACvB,YAAM,cAAc,mBAAmB,oBAAoB,CAAC,CAAC;AAC7D,YAAM,SAAS,oBAAoB,CAAC;AACpC,YAAM;AAAA,QACJ;AAAA,QACA,wBAAwB,mBAAmB,WAAW,CAAC,IAAI,MAAM;AAAA,MACnE;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,SAAS;AAAA,MAC5B;AAAA,IACF;AACA,QAAI,cAAc;AAChB,YAAM,UAAU,mBAAmB,aAAa,CAAC,CAAC;AAClD,YAAM,OAAO,MAAM,aAAmC,KAAK,GAAG;AAC9D,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,UAAU,KAAK,SAAS,KAAK;AACnC,UAAI,CAAC,SAAS;AACZ,cAAM,KAAK,qBAAqB;AAChC,eAAO;AAAA,MACT;AACA,YAAM;AAAA,QACJ;AAAA,QACA,wBAAwB,mBAAmB,OAAO,CAAC;AAAA,QACnD;AAAA,UACE,iBAAiB,KAAK,UAAU;AAAA,YAC9B,SAAS;AAAA,YACT,MAAM,EAAE,SAAS,QAAQ;AAAA,UAC3B,CAAC;AAAA,UACD,qBAAqB;AAAA,QACvB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,WAAW,OAAO;AACpB,UAAM,YAAY,SAAS;AAAA,MACzB;AAAA,IACF;AACA,QAAI,WAAW;AACb,YAAM,UAAU,mBAAmB,UAAU,CAAC,CAAC;AAC/C,YAAM;AAAA,QACJ;AAAA,QACA,eAAe,mBAAmB,OAAO,CAAC;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,oBAAoB,SAAS;AAAA,MACjC;AAAA,IACF;AACA,QAAI,mBAAmB;AACrB,YAAM,UAAU,mBAAmB,kBAAkB,CAAC,CAAC;AACvD,YAAM;AAAA,QACJ;AAAA,QACA,eAAe,mBAAmB,OAAO,CAAC;AAAA,MAC5C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "@elizaos/app-hyperscape",
|
|
3
|
+
"name": "Hyperscape",
|
|
4
|
+
"description": "AI-powered 3D multiplayer RPG — explore, fight, gather, craft, and socialize with AI agents",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"kind": "app",
|
|
7
|
+
"configSchema": {
|
|
8
|
+
"HYPERSCAPE_SERVER_URL": {
|
|
9
|
+
"type": "string",
|
|
10
|
+
"description": "WebSocket URL for Hyperscape game server",
|
|
11
|
+
"default": "ws://localhost:5555/ws"
|
|
12
|
+
},
|
|
13
|
+
"HYPERSCAPE_CLIENT_URL": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "URL for Hyperscape web client/viewer",
|
|
16
|
+
"default": "http://localhost:3333"
|
|
17
|
+
},
|
|
18
|
+
"HYPERSCAPE_AUTH_TOKEN": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Authentication token for Hyperscape"
|
|
21
|
+
},
|
|
22
|
+
"HYPERSCAPE_AUTO_RECONNECT": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "Automatically reconnect on disconnect",
|
|
25
|
+
"default": "true"
|
|
26
|
+
},
|
|
27
|
+
"HYPERSCAPE_AUTONOMY_MODE": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Agent autonomy mode: llm, scripted, or hybrid",
|
|
30
|
+
"default": "llm"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"app": {
|
|
34
|
+
"displayName": "Hyperscape",
|
|
35
|
+
"category": "game",
|
|
36
|
+
"launchType": "connect",
|
|
37
|
+
"launchUrl": "http://localhost:3333",
|
|
38
|
+
"capabilities": [
|
|
39
|
+
"combat",
|
|
40
|
+
"skills",
|
|
41
|
+
"inventory",
|
|
42
|
+
"banking",
|
|
43
|
+
"social-chat",
|
|
44
|
+
"exploration",
|
|
45
|
+
"crafting"
|
|
46
|
+
],
|
|
47
|
+
"maxPlayers": 100
|
|
48
|
+
},
|
|
49
|
+
"viewer": {
|
|
50
|
+
"url": "{HYPERSCAPE_CLIENT_URL}",
|
|
51
|
+
"embedParams": {
|
|
52
|
+
"embedded": "true",
|
|
53
|
+
"mode": "spectator",
|
|
54
|
+
"followEntity": "{HYPERSCAPE_CHARACTER_ID}"
|
|
55
|
+
},
|
|
56
|
+
"postMessageAuth": true,
|
|
57
|
+
"sandbox": "allow-scripts allow-same-origin allow-popups allow-forms"
|
|
58
|
+
},
|
|
59
|
+
"keywords": ["rpg", "3d", "multiplayer", "mmo", "game"],
|
|
60
|
+
"author": "Hyperscape Team",
|
|
61
|
+
"homepage": "https://hyperscape.ai",
|
|
62
|
+
"repository": "https://github.com/elizaos/app-hyperscape"
|
|
63
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elizaos/app-hyperscape",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Hyperscape — AI-powered 3D multiplayer RPG where agents explore, fight, gather, craft, and socialize",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
"*": {
|
|
10
|
+
"routes": [
|
|
11
|
+
"dist/routes.d.ts"
|
|
12
|
+
],
|
|
13
|
+
"*": [
|
|
14
|
+
"dist/index.d.ts"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./routes": {
|
|
25
|
+
"types": "./dist/routes.d.ts",
|
|
26
|
+
"import": "./dist/routes.js",
|
|
27
|
+
"default": "./dist/routes.js"
|
|
28
|
+
},
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"elizaos.plugin.json"
|
|
34
|
+
],
|
|
35
|
+
"keywords": [
|
|
36
|
+
"elizaos",
|
|
37
|
+
"app",
|
|
38
|
+
"hyperscape",
|
|
39
|
+
"rpg",
|
|
40
|
+
"3d",
|
|
41
|
+
"multiplayer",
|
|
42
|
+
"mmo",
|
|
43
|
+
"game"
|
|
44
|
+
],
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@elizaos/core": "^2.0.0-alpha.2"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"tsup": "8.3.5",
|
|
50
|
+
"typescript": "^5.9.2"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsup --format esm --dts",
|
|
54
|
+
"dev": "tsup --format esm --dts --watch",
|
|
55
|
+
"clean": "rm -rf dist"
|
|
56
|
+
},
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
},
|
|
60
|
+
"elizaos": {
|
|
61
|
+
"kind": "app",
|
|
62
|
+
"app": {
|
|
63
|
+
"displayName": "Hyperscape",
|
|
64
|
+
"category": "game",
|
|
65
|
+
"launchType": "connect",
|
|
66
|
+
"launchUrl": "{HYPERSCAPE_CLIENT_URL}",
|
|
67
|
+
"capabilities": [
|
|
68
|
+
"combat",
|
|
69
|
+
"skills",
|
|
70
|
+
"inventory",
|
|
71
|
+
"banking",
|
|
72
|
+
"social-chat",
|
|
73
|
+
"exploration",
|
|
74
|
+
"crafting"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
"viewer": {
|
|
78
|
+
"url": "{HYPERSCAPE_CLIENT_URL}",
|
|
79
|
+
"postMessageAuth": true,
|
|
80
|
+
"sandbox": "allow-scripts allow-same-origin allow-popups allow-forms"
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
"license": "MIT"
|
|
84
|
+
}
|