@vgai/sdk 0.4.0-canary.20260715.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/package.json +27 -0
- package/src/cinematic/capabilities-operations.ts +128 -0
- package/src/cinematic/cue-operations.ts +198 -0
- package/src/cinematic/gsap-operations.ts +126 -0
- package/src/cinematic/index.ts +59 -0
- package/src/cinematic/preview-operations.ts +279 -0
- package/src/cinematic/preview-transport.ts +244 -0
- package/src/cinematic/render-operations.ts +409 -0
- package/src/cinematic/render-transport.ts +238 -0
- package/src/cinematic/theatre-operations.ts +306 -0
- package/src/editor/camera-operations.ts +169 -0
- package/src/editor/console-operations.ts +87 -0
- package/src/editor/hierarchy-operations.ts +95 -0
- package/src/editor/index.ts +62 -0
- package/src/editor/open-operations.ts +209 -0
- package/src/editor/screenshot-operations.ts +99 -0
- package/src/editor/selection-operations.ts +144 -0
- package/src/editor/session-operations.ts +73 -0
- package/src/editor/source-location-operations.ts +106 -0
- package/src/editor/transport.ts +647 -0
- package/src/errors.ts +72 -0
- package/src/http/http-projection.ts +349 -0
- package/src/http/index.ts +11 -0
- package/src/index.ts +67 -0
- package/src/mcp/index.ts +16 -0
- package/src/mcp/mcp-projection.ts +288 -0
- package/src/operations.ts +83 -0
- package/src/play/control-operations.ts +205 -0
- package/src/play/debug-command-operations.ts +245 -0
- package/src/play/index.ts +66 -0
- package/src/play/input-operations.ts +316 -0
- package/src/play/lifecycle-operations.ts +271 -0
- package/src/play/log-operations.ts +279 -0
- package/src/play/run-ticks-operations.ts +141 -0
- package/src/play/state-operations.ts +210 -0
- package/src/play/status-operations.ts +160 -0
- package/src/play/transport.ts +728 -0
- package/src/project/asset-operations.ts +243 -0
- package/src/project/component-operations.ts +337 -0
- package/src/project/discovery-operations.ts +269 -0
- package/src/project/entity-operations.ts +366 -0
- package/src/project/index.ts +55 -0
- package/src/project/input-map-operations.ts +233 -0
- package/src/project/manifest-operations.ts +355 -0
- package/src/project/scene-operations.ts +426 -0
- package/src/project/shared.ts +299 -0
- package/src/registry.ts +285 -0
- package/src/render/capabilities/ffmpeg.ts +141 -0
- package/src/render/index.ts +15 -0
- package/src/render/render-cinematic.ts +1847 -0
- package/src/types.ts +101 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `play.gameplayState.inspect` / `play.gameplayState.list`
|
|
3
|
+
* (B4, §8 B4 "gameplay state/test-hook inspection when provided by the game";
|
|
4
|
+
* implemented for real in Wave 5, docs/SYNTHETIC-PLAYER-SPEC.md §3.5).
|
|
5
|
+
*
|
|
6
|
+
* The registration mechanism this file's old HONEST-GAP jsdoc anticipated
|
|
7
|
+
* now exists: games register named state providers via
|
|
8
|
+
* `ctx.debug.registerStateProvider(name, fn, { tier? })` (the game-scoped
|
|
9
|
+
* debug registry, `packages/engine/src/runtime/debug-registry.ts`), the
|
|
10
|
+
* editor's play mode exposes the registry through `SystemAdapters.debug`,
|
|
11
|
+
* and `command-listener.ts`'s `inspect-gameplay-state`/`list-gameplay-state`
|
|
12
|
+
* relay cases read it. `keys` are PROVIDER NAMES (the op name and its
|
|
13
|
+
* keys-in/`{state}`-out schema are unchanged — registry names are stable).
|
|
14
|
+
*
|
|
15
|
+
* Against a STALE editor page (one predating these relay cases) the
|
|
16
|
+
* transport translates the structured `UNKNOWN_COMMAND_TYPE` marker into
|
|
17
|
+
* `undefined` and this op throws its declared `GAMEPLAY_STATE_UNSUPPORTED`.
|
|
18
|
+
* A running game that exposes NO debug adapter answers `{ state: null }` —
|
|
19
|
+
* the schema's honest "the game exposes none" shape, never a fabricated
|
|
20
|
+
* snapshot.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
import { OperationError } from '../errors.js';
|
|
25
|
+
import { defineOperation, type OperationRegistry } from '../registry.js';
|
|
26
|
+
import {
|
|
27
|
+
getPlayTransport,
|
|
28
|
+
PLAY_READ_TIMEOUT_MS,
|
|
29
|
+
PLAY_RUNTIME_NOT_AVAILABLE_ERROR,
|
|
30
|
+
type PlayCommandResult,
|
|
31
|
+
relayErrorMarker,
|
|
32
|
+
relayStringArray,
|
|
33
|
+
resolvePlaySession,
|
|
34
|
+
withPlayTimeout,
|
|
35
|
+
} from './transport.js';
|
|
36
|
+
|
|
37
|
+
const GAMEPLAY_STATE_UNSUPPORTED_ERROR = {
|
|
38
|
+
code: 'GAMEPLAY_STATE_UNSUPPORTED',
|
|
39
|
+
summary:
|
|
40
|
+
'The connected editor page predates the gameplay-state relay commands (version skew, ' +
|
|
41
|
+
'matched on the structured UNKNOWN_COMMAND_TYPE marker) — reload the editor tab. ' +
|
|
42
|
+
'Never fabricated.',
|
|
43
|
+
data: z.object({}),
|
|
44
|
+
} as const;
|
|
45
|
+
|
|
46
|
+
const STATE_PROVIDER_NOT_FOUND_ERROR = {
|
|
47
|
+
code: 'STATE_PROVIDER_NOT_FOUND',
|
|
48
|
+
summary:
|
|
49
|
+
'A requested key names no registered state provider. `data.registered` lists every ' +
|
|
50
|
+
'provider name the running game registered (plus built-ins).',
|
|
51
|
+
data: z.object({ registered: z.array(z.string()) }),
|
|
52
|
+
} as const;
|
|
53
|
+
|
|
54
|
+
const COMMAND_FAILED_ERROR = {
|
|
55
|
+
code: 'COMMAND_FAILED',
|
|
56
|
+
summary: 'The connected editor rejected or failed to execute the relayed state read.',
|
|
57
|
+
data: z.object({ message: z.string() }),
|
|
58
|
+
} as const;
|
|
59
|
+
|
|
60
|
+
/** Map a relayed `ok: false` result onto this file's declared codes. */
|
|
61
|
+
function throwStateRelayFailure(result: PlayCommandResult, label: string): never {
|
|
62
|
+
const marker = relayErrorMarker(result);
|
|
63
|
+
if (marker?.code === 'STATE_PROVIDER_NOT_FOUND') {
|
|
64
|
+
throw new OperationError(
|
|
65
|
+
'STATE_PROVIDER_NOT_FOUND',
|
|
66
|
+
result.error ?? 'state provider not found',
|
|
67
|
+
{ registered: relayStringArray(marker.data['registered']) },
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const message = result.error ?? `${label} command failed`;
|
|
71
|
+
throw new OperationError('COMMAND_FAILED', message, { message });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// play.gameplayState.inspect
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
const PlayGameplayStateInspectInput = z.object({
|
|
79
|
+
keys: z
|
|
80
|
+
.array(z.string())
|
|
81
|
+
.optional()
|
|
82
|
+
.describe(
|
|
83
|
+
'Optional subset of registered state-provider names to read; omit for the full snapshot ' +
|
|
84
|
+
'of every provider (stateAll).',
|
|
85
|
+
),
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const PlayGameplayStateInspectResult = z.object({
|
|
89
|
+
state: z
|
|
90
|
+
.record(z.string(), z.unknown())
|
|
91
|
+
.nullable()
|
|
92
|
+
.describe('The game-provided state snapshot, or null when the game exposes none.'),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
export const playGameplayStateInspect = defineOperation({
|
|
96
|
+
name: 'play.gameplayState.inspect',
|
|
97
|
+
summary: 'Inspect game-registered state providers from a running play session.',
|
|
98
|
+
description:
|
|
99
|
+
'Reads named state providers a game registered via ctx.debug.registerStateProvider ' +
|
|
100
|
+
'(docs/SYNTHETIC-PLAYER-SPEC.md §3.1) from the live editor play session, through the ' +
|
|
101
|
+
'inspect-gameplay-state relay command. `keys` are provider names; omitting them returns ' +
|
|
102
|
+
'one coherent snapshot of every provider. Returns { state: null } when the running game ' +
|
|
103
|
+
'exposes no debug adapter; throws GAMEPLAY_STATE_UNSUPPORTED against a stale editor page.',
|
|
104
|
+
input: PlayGameplayStateInspectInput,
|
|
105
|
+
result: PlayGameplayStateInspectResult,
|
|
106
|
+
errors: [
|
|
107
|
+
PLAY_RUNTIME_NOT_AVAILABLE_ERROR,
|
|
108
|
+
GAMEPLAY_STATE_UNSUPPORTED_ERROR,
|
|
109
|
+
STATE_PROVIDER_NOT_FOUND_ERROR,
|
|
110
|
+
COMMAND_FAILED_ERROR,
|
|
111
|
+
],
|
|
112
|
+
requires: { editor: true, play: true },
|
|
113
|
+
host: 'runtime-page',
|
|
114
|
+
mutates: false,
|
|
115
|
+
supportsDryRun: false,
|
|
116
|
+
permission: {
|
|
117
|
+
risk: 'read',
|
|
118
|
+
summary: 'Would read game-registered state providers from the live play session.',
|
|
119
|
+
},
|
|
120
|
+
async impl(input, ctx) {
|
|
121
|
+
const transport = getPlayTransport(ctx);
|
|
122
|
+
const session = await resolvePlaySession(ctx, transport);
|
|
123
|
+
const result = await withPlayTimeout(
|
|
124
|
+
transport.getGameplayState(session, input.keys, PLAY_READ_TIMEOUT_MS),
|
|
125
|
+
PLAY_READ_TIMEOUT_MS,
|
|
126
|
+
'play.gameplayState.inspect',
|
|
127
|
+
).catch(() => undefined);
|
|
128
|
+
if (result === undefined) {
|
|
129
|
+
throw new OperationError(
|
|
130
|
+
'GAMEPLAY_STATE_UNSUPPORTED',
|
|
131
|
+
'The connected editor page predates the gameplay-state relay commands — reload it.',
|
|
132
|
+
{},
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
if (!result.ok) throwStateRelayFailure(result, 'inspect-gameplay-state');
|
|
136
|
+
const state =
|
|
137
|
+
(result.data as { state?: Record<string, unknown> | null } | undefined)?.state ?? null;
|
|
138
|
+
return { state };
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// play.gameplayState.list
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
const PlayGameplayStateListResult = z.object({
|
|
147
|
+
providers: z
|
|
148
|
+
.array(
|
|
149
|
+
z.object({
|
|
150
|
+
name: z.string().describe('Registered provider name (built-ins: time, input.actions).'),
|
|
151
|
+
tier: z
|
|
152
|
+
.enum(['observable', 'assisted'])
|
|
153
|
+
.describe(
|
|
154
|
+
"Honesty tier (D14): 'observable' state a player could see; 'assisted' X-ray state.",
|
|
155
|
+
),
|
|
156
|
+
}),
|
|
157
|
+
)
|
|
158
|
+
.describe('Every registered state provider of the running game, with its honesty tier.'),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
export const playGameplayStateList = defineOperation({
|
|
162
|
+
name: 'play.gameplayState.list',
|
|
163
|
+
summary: 'List the state providers a running play session registers, with honesty tiers.',
|
|
164
|
+
description:
|
|
165
|
+
'Enumerates ctx.debug.registerStateProvider registrations (plus the time/input.actions ' +
|
|
166
|
+
'built-ins) from the live editor play session via the list-gameplay-state relay command. ' +
|
|
167
|
+
'A running game with no debug adapter lists an empty array; throws ' +
|
|
168
|
+
'GAMEPLAY_STATE_UNSUPPORTED against a stale editor page.',
|
|
169
|
+
input: z.object({}),
|
|
170
|
+
result: PlayGameplayStateListResult,
|
|
171
|
+
errors: [
|
|
172
|
+
PLAY_RUNTIME_NOT_AVAILABLE_ERROR,
|
|
173
|
+
GAMEPLAY_STATE_UNSUPPORTED_ERROR,
|
|
174
|
+
COMMAND_FAILED_ERROR,
|
|
175
|
+
],
|
|
176
|
+
requires: { editor: true, play: true },
|
|
177
|
+
host: 'runtime-page',
|
|
178
|
+
mutates: false,
|
|
179
|
+
supportsDryRun: false,
|
|
180
|
+
permission: {
|
|
181
|
+
risk: 'read',
|
|
182
|
+
summary: "Would list the live play session's registered state providers.",
|
|
183
|
+
},
|
|
184
|
+
async impl(_input, ctx) {
|
|
185
|
+
const transport = getPlayTransport(ctx);
|
|
186
|
+
const session = await resolvePlaySession(ctx, transport);
|
|
187
|
+
const result = await withPlayTimeout(
|
|
188
|
+
transport.listGameplayState(session, PLAY_READ_TIMEOUT_MS),
|
|
189
|
+
PLAY_READ_TIMEOUT_MS,
|
|
190
|
+
'play.gameplayState.list',
|
|
191
|
+
).catch(() => undefined);
|
|
192
|
+
if (result === undefined) {
|
|
193
|
+
throw new OperationError(
|
|
194
|
+
'GAMEPLAY_STATE_UNSUPPORTED',
|
|
195
|
+
'The connected editor page predates the gameplay-state relay commands — reload it.',
|
|
196
|
+
{},
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (!result.ok) throwStateRelayFailure(result, 'list-gameplay-state');
|
|
200
|
+
const providers =
|
|
201
|
+
(result.data as { providers?: { name: string; tier: 'observable' | 'assisted' }[] })
|
|
202
|
+
?.providers ?? [];
|
|
203
|
+
return { providers };
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
export function registerStateOperations(registry: OperationRegistry): void {
|
|
208
|
+
registry.register(playGameplayStateInspect);
|
|
209
|
+
registry.register(playGameplayStateList);
|
|
210
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `play.status` / `play.activeWorld.inspect` (B4, §8 B4 "status and
|
|
3
|
+
* active-world inspection").
|
|
4
|
+
*
|
|
5
|
+
* status.playState is genuinely wired: `GET /__editor/state`'s `playState`
|
|
6
|
+
* field, populated by `collectState()` (`packages/editor/src/command-listener.ts`)
|
|
7
|
+
* after every relayed command. `seed`/`deterministic`/`timeScale` are ALL
|
|
8
|
+
* real (D15/T-D15.6 landed seed/deterministic; timeScale since Wave 5) —
|
|
9
|
+
* `collectState` reports the live session's `ctx.random.seed`, whether its
|
|
10
|
+
* manifest declares `determinism.seededRandom`, and the live `GameLoop
|
|
11
|
+
* .timeScale`; each is `null`/`false` only when no session/Game is running
|
|
12
|
+
* or a prior `play.seed.set`/`play.timeScale.set` never succeeded.
|
|
13
|
+
*
|
|
14
|
+
* `activeWorld.inspect` is a full HONEST GAP: `collectState()` carries no
|
|
15
|
+
* world id/kind field at all today (only a scalar `entityCount` and the
|
|
16
|
+
* other UI-state fields already listed in `../editor/transport.ts`'s
|
|
17
|
+
* jsdoc) — the live wire protocol has nothing to report. A test transport
|
|
18
|
+
* can supply a real `ActiveWorldInfo`, proving the result schema round-trips
|
|
19
|
+
* end to end (see `../../test/play-operations.test.ts`).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { z } from 'zod';
|
|
23
|
+
import { OperationError } from '../errors.js';
|
|
24
|
+
import { defineOperation, type OperationRegistry } from '../registry.js';
|
|
25
|
+
import {
|
|
26
|
+
getPlayTransport,
|
|
27
|
+
PLAY_READ_TIMEOUT_MS,
|
|
28
|
+
PLAY_RUNTIME_NOT_AVAILABLE_ERROR,
|
|
29
|
+
resolvePlaySession,
|
|
30
|
+
withPlayTimeout,
|
|
31
|
+
} from './transport.js';
|
|
32
|
+
|
|
33
|
+
const PLAY_STATUS_UNAVAILABLE_ERROR = {
|
|
34
|
+
code: 'PLAY_STATUS_UNAVAILABLE',
|
|
35
|
+
summary: 'A session is connected but did not answer the status read in time.',
|
|
36
|
+
data: z.object({}),
|
|
37
|
+
} as const;
|
|
38
|
+
|
|
39
|
+
const ACTIVE_WORLD_UNAVAILABLE_ERROR = {
|
|
40
|
+
code: 'ACTIVE_WORLD_UNAVAILABLE',
|
|
41
|
+
summary:
|
|
42
|
+
'A session is connected, but its wire protocol does not carry active-world data today ' +
|
|
43
|
+
'(a documented gap, not a fabricated value — see module jsdoc).',
|
|
44
|
+
data: z.object({}),
|
|
45
|
+
} as const;
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// play.status
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
const PlayStatusInput = z
|
|
52
|
+
.object({})
|
|
53
|
+
.describe('No input — reads current play status from the target editor session.');
|
|
54
|
+
|
|
55
|
+
const PlayStatusResult = z.object({
|
|
56
|
+
playState: z.enum(['stopped', 'playing', 'paused']),
|
|
57
|
+
seed: z
|
|
58
|
+
.number()
|
|
59
|
+
.nullable()
|
|
60
|
+
.describe(
|
|
61
|
+
"The running session's current ctx.random root seed, or null when no first-party Game " +
|
|
62
|
+
'is running.',
|
|
63
|
+
),
|
|
64
|
+
deterministic: z
|
|
65
|
+
.boolean()
|
|
66
|
+
.describe(
|
|
67
|
+
'True iff the running project declares determinism.seededRandom (D15) — i.e. ' +
|
|
68
|
+
'play.seed.set and the gameplay-rng-ban/dev-mode-trap enforcers apply to it.',
|
|
69
|
+
),
|
|
70
|
+
timeScale: z
|
|
71
|
+
.number()
|
|
72
|
+
.nullable()
|
|
73
|
+
.describe('Currently applied simulation time-scale, or null when never successfully set.'),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
export const playStatus = defineOperation({
|
|
77
|
+
name: 'play.status',
|
|
78
|
+
summary: 'Read the current play-mode status (running/paused/stopped, seed, time-scale).',
|
|
79
|
+
description:
|
|
80
|
+
'Resolves a target session then reads its playState/seed/deterministic (real, live — D15/' +
|
|
81
|
+
'T-D15.6) plus timeScale (null unless a prior play.timeScale.set call actually succeeded — ' +
|
|
82
|
+
'see control-operations.ts).',
|
|
83
|
+
input: PlayStatusInput,
|
|
84
|
+
result: PlayStatusResult,
|
|
85
|
+
errors: [PLAY_RUNTIME_NOT_AVAILABLE_ERROR, PLAY_STATUS_UNAVAILABLE_ERROR],
|
|
86
|
+
requires: { editor: true },
|
|
87
|
+
host: 'runtime-page',
|
|
88
|
+
mutates: false,
|
|
89
|
+
supportsDryRun: false,
|
|
90
|
+
permission: { risk: 'read', summary: 'Reads live play status only.' },
|
|
91
|
+
async impl(_input, ctx) {
|
|
92
|
+
const transport = getPlayTransport(ctx);
|
|
93
|
+
const session = await resolvePlaySession(ctx, transport);
|
|
94
|
+
const status = await withPlayTimeout(
|
|
95
|
+
transport.getStatus(session, PLAY_READ_TIMEOUT_MS),
|
|
96
|
+
PLAY_READ_TIMEOUT_MS,
|
|
97
|
+
'play.status',
|
|
98
|
+
).catch(() => undefined);
|
|
99
|
+
if (!status) {
|
|
100
|
+
throw new OperationError(
|
|
101
|
+
'PLAY_STATUS_UNAVAILABLE',
|
|
102
|
+
'The connected editor session did not answer the status read in time.',
|
|
103
|
+
{},
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
return status;
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
// play.activeWorld.inspect
|
|
112
|
+
// ---------------------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
const PlayActiveWorldInspectInput = z
|
|
115
|
+
.object({})
|
|
116
|
+
.describe('No input — inspects the active world of the running play session.');
|
|
117
|
+
|
|
118
|
+
const PlayActiveWorldInspectResult = z.object({
|
|
119
|
+
worldId: z.string(),
|
|
120
|
+
worldKind: z.string(),
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
export const playActiveWorldInspect = defineOperation({
|
|
124
|
+
name: 'play.activeWorld.inspect',
|
|
125
|
+
summary: 'Inspect the active world of a running play session (id/kind).',
|
|
126
|
+
description:
|
|
127
|
+
'Real wire protocol has no world data today (see module jsdoc) — always throws the declared ' +
|
|
128
|
+
'ACTIVE_WORLD_UNAVAILABLE against the real transport; a test transport can supply real data, ' +
|
|
129
|
+
'proving the result schema round-trips end to end.',
|
|
130
|
+
input: PlayActiveWorldInspectInput,
|
|
131
|
+
result: PlayActiveWorldInspectResult,
|
|
132
|
+
errors: [PLAY_RUNTIME_NOT_AVAILABLE_ERROR, ACTIVE_WORLD_UNAVAILABLE_ERROR],
|
|
133
|
+
requires: { editor: true, play: true },
|
|
134
|
+
host: 'runtime-page',
|
|
135
|
+
mutates: false,
|
|
136
|
+
supportsDryRun: false,
|
|
137
|
+
permission: { risk: 'read', summary: 'Reads live active-world state only.' },
|
|
138
|
+
async impl(_input, ctx) {
|
|
139
|
+
const transport = getPlayTransport(ctx);
|
|
140
|
+
const session = await resolvePlaySession(ctx, transport);
|
|
141
|
+
const world = await withPlayTimeout(
|
|
142
|
+
transport.getActiveWorld(session, PLAY_READ_TIMEOUT_MS),
|
|
143
|
+
PLAY_READ_TIMEOUT_MS,
|
|
144
|
+
'play.activeWorld.inspect',
|
|
145
|
+
).catch(() => undefined);
|
|
146
|
+
if (!world) {
|
|
147
|
+
throw new OperationError(
|
|
148
|
+
'ACTIVE_WORLD_UNAVAILABLE',
|
|
149
|
+
"The connected editor's wire protocol does not carry active-world data today.",
|
|
150
|
+
{},
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
return world;
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
export function registerStatusOperations(registry: OperationRegistry): void {
|
|
158
|
+
registry.register(playStatus);
|
|
159
|
+
registry.register(playActiveWorldInspect);
|
|
160
|
+
}
|