incanto 0.51.0 → 0.52.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/2d.d.ts +37 -2
- package/dist/2d.js +3 -3
- package/dist/3d.d.ts +3 -3
- package/dist/3d.js +4 -4
- package/dist/{behavior-rZNfzVbH.d.ts → behavior-uPEuZrUB.d.ts} +10 -0
- package/dist/{create-game-CkzKZ4v5.js → create-game-B_e9hJf7.js} +92 -10
- package/dist/{create-game-BNaOC3Px.js → create-game-CGnoypjL.js} +6 -6
- package/dist/debug.d.ts +1 -1
- package/dist/debug.js +1 -1
- package/dist/{duplicate-EybyYeyL.js → duplicate-B-OtSRFL.js} +1 -1
- package/dist/editor.js +1917 -1579
- package/dist/{environment-presets-C08pOC6H.js → environment-presets-DSZwsKPs.js} +3 -3
- package/dist/{gameplay-bStgtZBV.js → gameplay-B6jqvYeM.js} +6 -4
- package/dist/gameplay.d.ts +1 -1
- package/dist/gameplay.js +1 -1
- package/dist/index.d.ts +65 -5
- package/dist/index.js +7 -7
- package/dist/{loader-B2asghWa.js → loader-B-Gft32x.js} +32 -32
- package/dist/{loader-Dkbn56KC.d.ts → loader-B9iTqs27.d.ts} +1 -1
- package/dist/net.d.ts +15 -410
- package/dist/net.js +1 -822
- package/dist/{pathfinding-Bz34pvQD.d.ts → pathfinding-CAR9DjQQ.d.ts} +1 -1
- package/dist/{physics-2d-Ccq2L9R0.js → physics-2d-Dns-oZlE.js} +2 -2
- package/dist/{physics-3d-B2c5KNYh.js → physics-3d-BhI0ehpe.js} +3 -3
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/{register-CGq-Hee8.js → register-DVwlnZAZ.js} +2 -2
- package/dist/{register-B_BaaGx-.js → register-Trx7WHnD.js} +3 -3
- package/dist/{registry-IyWCGe4q.js → registry-C7u42TID.js} +23 -1
- package/dist/{replay-DIP2_as4.d.ts → replay-BU1CCM15.d.ts} +1 -1
- package/dist/{replay-BgKxGcXH.js → replay-BicPOMX0.js} +195 -2
- package/dist/split-screen-CZ9ccBBQ.js +1267 -0
- package/dist/split-screen-paxkQs_q.d.ts +441 -0
- package/dist/{src-C3UwzYXl.js → src-5gbZO47I.js} +1 -1
- package/dist/{teardown-BKTCzLek.js → teardown-ks3d5W9n.js} +2 -1
- package/dist/{test-D2gRpk5V.js → test-DAojuFdb.js} +119 -22
- package/dist/test.d.ts +60 -5
- package/dist/test.js +3 -3
- package/dist/vite.js +2 -2
- package/editor/assets/{agent8-DbX_msaO.js → agent8-CCvckvbw.js} +1 -1
- package/editor/assets/{debug-C-kMxdl1.js → debug-CLNCOnbc.js} +1 -1
- package/editor/assets/{index-CUc1U7wm.js → index-Cb5Brupb.js} +99 -92
- package/editor/index.html +1 -1
- package/package.json +1 -1
- package/skills/incanto-assets.md +4 -1
- package/skills/incanto-editor.md +48 -11
- package/skills/incanto-gameplay-behaviors.md +14 -5
- package/skills/incanto-multiplayer.md +39 -3
- package/skills/incanto-verifying-your-game.md +56 -0
- package/templates/agent8-server.ts +79 -2
- package/templates-app/beacon-isle-3d/package.json +1 -1
- package/templates-app/tps-3d/package.json +1 -1
- package/templates-app/village-quest-3d/package.json +1 -1
- package/dist/register-CLVhzWcI.js +0 -374
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
|
-
import {
|
|
2
|
+
import { C as diagnose } from "./loader-B-Gft32x.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
|
-
import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-
|
|
4
|
+
import { _ as RigidBody2D, b as validateCollider2D, g as PhysicsBody2D, h as CharacterBody2D, m as Area2D, p as Joint2D, y as Node2D } from "./register-Trx7WHnD.js";
|
|
5
5
|
import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
|
|
6
6
|
//#region src/2d/physics/physics-2d.ts
|
|
7
7
|
var physics_2d_exports = /* @__PURE__ */ __exportAll({
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
|
-
import {
|
|
2
|
+
import { C as diagnose } from "./loader-B-Gft32x.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
|
-
import { B as validateCollider3D, F as CharacterBody3D, I as PhysicsBody3D, L as RigidBody3D, P as Area3D, z as Node3D } from "./gameplay-
|
|
4
|
+
import { B as validateCollider3D, F as CharacterBody3D, I as PhysicsBody3D, L as RigidBody3D, P as Area3D, z as Node3D } from "./gameplay-B6jqvYeM.js";
|
|
5
5
|
import { n as registerDebugSource } from "./debug-draw-BM3DsvtT.js";
|
|
6
|
-
import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-
|
|
6
|
+
import { A as Terrain3D, F as InstancedMesh3D, L as buildMeshGeometry, P as Joint3D } from "./environment-presets-DSZwsKPs.js";
|
|
7
7
|
import { Euler, Matrix4, Quaternion, Vector3 } from "three";
|
|
8
8
|
//#region src/3d/physics/collider-lines.ts
|
|
9
9
|
/**
|
package/dist/react.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as Scene, b as Engine, n as BehaviorCtor } from "./behavior-
|
|
1
|
+
import { P as Scene, b as Engine, n as BehaviorCtor } from "./behavior-uPEuZrUB.js";
|
|
2
2
|
import { c as JsonValue } from "./schema-CFeioQRE.js";
|
|
3
3
|
import { CSSProperties, ReactNode } from "react";
|
|
4
4
|
|
package/dist/react.js
CHANGED
|
@@ -156,7 +156,7 @@ function IncantoCanvas(props) {
|
|
|
156
156
|
pointer: latest.pointer,
|
|
157
157
|
...keyboard !== void 0 ? { keyboard } : {}
|
|
158
158
|
};
|
|
159
|
-
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-
|
|
159
|
+
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-CGnoypjL.js").then((n) => n.n)).createGame3D(o) : async (o) => (await import("./create-game-B_e9hJf7.js").then((n) => n.n)).createGame2D(o)))(opts);
|
|
160
160
|
if (disposed) {
|
|
161
161
|
next.dispose();
|
|
162
162
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { C as
|
|
1
|
+
import { C as diagnose, M as Signal, S as InputMap, f as Node, g as restoreBehaviors, h as captureBehaviors, v as createSaveStore, x as resolveOrderGroups, y as ORDER_GROUP_BASE } from "./loader-B-Gft32x.js";
|
|
2
2
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
3
3
|
import { t as Rng } from "./rng-DP-SR7eg.js";
|
|
4
|
-
import { l as registerNode } from "./registry-
|
|
4
|
+
import { l as registerNode } from "./registry-C7u42TID.js";
|
|
5
5
|
//#region src/core/audio/buses.ts
|
|
6
6
|
/**
|
|
7
7
|
* Global volume state — `master` × `sfx`/`music` gain (0..1) plus a `muted`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as registerCoreNodes } from "./register-
|
|
1
|
+
import { b as effectiveOrder, f as Node } from "./loader-B-Gft32x.js";
|
|
2
|
+
import { t as registerCoreNodes } from "./register-DVwlnZAZ.js";
|
|
3
3
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
4
4
|
import { t as Rng } from "./rng-DP-SR7eg.js";
|
|
5
|
-
import { i as getNodeSchema, l as registerNode } from "./registry-
|
|
5
|
+
import { i as getNodeSchema, l as registerNode } from "./registry-C7u42TID.js";
|
|
6
6
|
import { i as ParticleSim, n as resolveFrames, o as PARTICLE_PRESET_NAMES, r as validateAnimationAliases, s as applyParticlePreset, t as resolveAnimation } from "./sprite-animation-D_p28jwU.js";
|
|
7
7
|
import { AdditiveBlending, BufferAttribute, BufferGeometry, CanvasTexture, Color, DynamicDrawUsage, Group, InstancedMesh, MathUtils, Matrix4, Mesh, MeshBasicMaterial, NearestFilter, NormalBlending, Object3D, PlaneGeometry } from "three";
|
|
8
8
|
//#region src/2d/physics/collider-validate.ts
|
|
@@ -39,13 +39,27 @@ function getNodeType(typeName) {
|
|
|
39
39
|
const ctor = types.get(typeName);
|
|
40
40
|
if (!ctor) {
|
|
41
41
|
const registered = [...types.keys()];
|
|
42
|
-
throw new IncantoError("UNKNOWN_NODE_TYPE", `Unknown node type '${typeName}'. Registered types: [${registered.join(", ")}]
|
|
42
|
+
throw new IncantoError("UNKNOWN_NODE_TYPE", `Unknown node type '${typeName}'. Registered types: [${registered.join(", ")}].` + missingRegistrarHint(typeName), {
|
|
43
43
|
nodeType: typeName,
|
|
44
44
|
validOptions: registered
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
return ctor;
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* "Unknown node type 'Node2D'" next to a list with no 2D types in it is the
|
|
51
|
+
* most confusing error this engine can produce: the type is not misspelled and
|
|
52
|
+
* not missing — a REGISTRAR was never called. Say which one.
|
|
53
|
+
*
|
|
54
|
+
* The case that produced this: the multiplayer boot registers `registerNodesNet()`
|
|
55
|
+
* and loads a 2D scene, which dies on its own root node.
|
|
56
|
+
*/
|
|
57
|
+
function missingRegistrarHint(typeName) {
|
|
58
|
+
const suffix = typeName.endsWith("2D") ? "2D" : typeName.endsWith("3D") ? "3D" : "";
|
|
59
|
+
if (!suffix || types.has(`Node${suffix}`)) return "";
|
|
60
|
+
const dim = suffix.toLowerCase();
|
|
61
|
+
return ` '${typeName}' is a ${dim} node and no ${dim} type is registered: call registerNodes${suffix}() (from 'incanto/${dim}') before loading the scene — createGame${suffix}() does it for you. Registrars compose: a multiplayer game calls registerNodes${suffix}() AND registerNodesNet().`;
|
|
62
|
+
}
|
|
49
63
|
function registeredTypes() {
|
|
50
64
|
return [...types.keys()];
|
|
51
65
|
}
|
|
@@ -123,6 +137,14 @@ function applySchemaProps(target, schema, props, label, aliases = {}, extraOptio
|
|
|
123
137
|
validatePropValue(value, def.default, `${label}.${key}`, options);
|
|
124
138
|
target[key] = jsonClone(value);
|
|
125
139
|
}
|
|
140
|
+
for (const [key, def] of Object.entries(schema)) {
|
|
141
|
+
if (!def.required) continue;
|
|
142
|
+
const value = target[key];
|
|
143
|
+
if (value === "" || value === void 0 || value === null) throw new IncantoError("PROP_TYPE_MISMATCH", `'${label}' needs a "${key}" — it is empty.`, {
|
|
144
|
+
prop: key,
|
|
145
|
+
nodeType: label
|
|
146
|
+
});
|
|
147
|
+
}
|
|
126
148
|
}
|
|
127
149
|
/**
|
|
128
150
|
* Instantiate a registered type, assign schema defaults (cloned), then the
|
|
@@ -1,4 +1,196 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { E as behaviorSchema, w as parseNodePath } from "./loader-B-Gft32x.js";
|
|
2
|
+
import { D as translationKey } from "./register-DVwlnZAZ.js";
|
|
3
|
+
import { i as getNodeSchema } from "./registry-C7u42TID.js";
|
|
4
|
+
//#region src/core/node-refs.ts
|
|
5
|
+
/**
|
|
6
|
+
* Node-path PROPS, resolved against scene JSON.
|
|
7
|
+
*
|
|
8
|
+
* `Chase.target`, `Camera2D.follow`, `Spawner.prefab`, `Joint3D.target`,
|
|
9
|
+
* `CharacterController3D.skinPath`, `Foliage3D.terrain` … each holds a path to
|
|
10
|
+
* another node, and nothing checked any of them. A connection whose end does not
|
|
11
|
+
* resolve is a hard `DANGLING_CONNECTION` at load; a PROP that does not resolve
|
|
12
|
+
* is nothing at all — `getNodeOrNull` returns null, the scene loads, the enemy
|
|
13
|
+
* never chases, and no error is ever printed.
|
|
14
|
+
*
|
|
15
|
+
* That makes it exactly the class `auditScene` exists for: loads fine, plays
|
|
16
|
+
* wrong. The editor uses the same resolver so the two cannot drift.
|
|
17
|
+
*
|
|
18
|
+
* The grammar comes from `parseNodePath` — the loader's own parser — so a path
|
|
19
|
+
* this module accepts is one the engine accepts.
|
|
20
|
+
*/
|
|
21
|
+
function nodeAt(root, path) {
|
|
22
|
+
let node = root;
|
|
23
|
+
for (const index of path) {
|
|
24
|
+
node = node?.children?.[index];
|
|
25
|
+
if (!node) return null;
|
|
26
|
+
}
|
|
27
|
+
return node ?? null;
|
|
28
|
+
}
|
|
29
|
+
function byName(root, name) {
|
|
30
|
+
const found = [];
|
|
31
|
+
const walk = (node, at) => {
|
|
32
|
+
if (node.name === name) found.push(at);
|
|
33
|
+
(node.children ?? []).forEach((child, i) => {
|
|
34
|
+
walk(child, [...at, i]);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
walk(root, []);
|
|
38
|
+
return found;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve `value` from the node at `owner`, the way the engine would.
|
|
42
|
+
*
|
|
43
|
+
* Note the asymmetry with connections, whose paths resolve from the SCENE ROOT:
|
|
44
|
+
* a prop's path resolves from the node holding it, which is why `'../Skin'` is
|
|
45
|
+
* the documented default of `CharacterController3D.skinPath` and would mean
|
|
46
|
+
* nothing in a connection.
|
|
47
|
+
*/
|
|
48
|
+
function resolveRefInJson(root, owner, value) {
|
|
49
|
+
if (!root) return {
|
|
50
|
+
ok: false,
|
|
51
|
+
problem: {
|
|
52
|
+
kind: "noMatch",
|
|
53
|
+
name: value
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = parseNodePath(value);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
ok: false,
|
|
62
|
+
problem: {
|
|
63
|
+
kind: "grammar",
|
|
64
|
+
message: error instanceof Error ? error.message : String(error)
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (parsed.kind === "unique") {
|
|
69
|
+
const found = byName(root, parsed.name);
|
|
70
|
+
if (found.length === 1) return {
|
|
71
|
+
ok: true,
|
|
72
|
+
path: found[0]
|
|
73
|
+
};
|
|
74
|
+
if (found.length === 0) return {
|
|
75
|
+
ok: false,
|
|
76
|
+
problem: {
|
|
77
|
+
kind: "noMatch",
|
|
78
|
+
name: parsed.name
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
problem: {
|
|
84
|
+
kind: "ambiguous",
|
|
85
|
+
name: parsed.name,
|
|
86
|
+
count: found.length
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
let at;
|
|
91
|
+
let segments = parsed.segments;
|
|
92
|
+
if (parsed.kind === "absolute") {
|
|
93
|
+
const first = segments[0] ?? "";
|
|
94
|
+
if (first !== root.name && first !== "root") return {
|
|
95
|
+
ok: false,
|
|
96
|
+
problem: {
|
|
97
|
+
kind: "wrongRoot",
|
|
98
|
+
first,
|
|
99
|
+
root: String(root.name ?? "")
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
at = [];
|
|
103
|
+
segments = segments.slice(1);
|
|
104
|
+
} else at = [...owner];
|
|
105
|
+
for (const segment of segments) {
|
|
106
|
+
if (segment === "..") {
|
|
107
|
+
if (at.length === 0) return {
|
|
108
|
+
ok: false,
|
|
109
|
+
problem: { kind: "aboveRoot" }
|
|
110
|
+
};
|
|
111
|
+
at.pop();
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const here = nodeAt(root, at);
|
|
115
|
+
const index = (here?.children ?? []).findIndex((child) => child.name === segment);
|
|
116
|
+
if (index < 0) return {
|
|
117
|
+
ok: false,
|
|
118
|
+
problem: {
|
|
119
|
+
kind: "noChild",
|
|
120
|
+
parent: String(here?.name ?? "?"),
|
|
121
|
+
segment
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
at.push(index);
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
path: at
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/** The problem in English, for `incanto-check` and as the editor's base text. */
|
|
132
|
+
function describeRefProblem(problem, value) {
|
|
133
|
+
switch (problem.kind) {
|
|
134
|
+
case "grammar": return problem.message;
|
|
135
|
+
case "noMatch": return `'%${problem.name}' matches no node in this scene.`;
|
|
136
|
+
case "ambiguous": return `'%${problem.name}' matches ${problem.count} nodes — a %name must be unique.`;
|
|
137
|
+
case "wrongRoot": return `'${value}' starts at '${problem.first}', but the scene root is '${problem.root}' (or write '/root/…').`;
|
|
138
|
+
case "noChild": return `'${value}' leads nowhere — '${problem.parent}' has no child named '${problem.segment}'.`;
|
|
139
|
+
case "aboveRoot": return `'${value}' walks above the scene root.`;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Every prop on this node declared `nodePath: true`, per bag. */
|
|
143
|
+
function refProps(node) {
|
|
144
|
+
const collect = (schema) => Object.entries(schema).filter(([, def]) => def?.nodePath).map(([key]) => key);
|
|
145
|
+
let props = [];
|
|
146
|
+
if (node.type) try {
|
|
147
|
+
props = collect(getNodeSchema(node.type));
|
|
148
|
+
} catch {}
|
|
149
|
+
const name = node.script?.name;
|
|
150
|
+
return {
|
|
151
|
+
props,
|
|
152
|
+
script: name ? collect(behaviorSchema(name)) : []
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Scene lints for node-path props that point at nothing.
|
|
157
|
+
*
|
|
158
|
+
* An EMPTY value is not reported: `''` is the default of most of these props and
|
|
159
|
+
* means "not set", which is a choice rather than a typo.
|
|
160
|
+
*/
|
|
161
|
+
function nodeRefWarnings(scene) {
|
|
162
|
+
const root = scene.root;
|
|
163
|
+
if (!root) return [];
|
|
164
|
+
const warnings = [];
|
|
165
|
+
const walk = (node, at, path) => {
|
|
166
|
+
const keys = refProps(node);
|
|
167
|
+
const bags = [[
|
|
168
|
+
node.props,
|
|
169
|
+
keys.props,
|
|
170
|
+
""
|
|
171
|
+
], [
|
|
172
|
+
node.script?.props,
|
|
173
|
+
keys.script,
|
|
174
|
+
`${node.script?.name ?? "script"}.`
|
|
175
|
+
]];
|
|
176
|
+
for (const [bag, propKeys, prefix] of bags) {
|
|
177
|
+
if (!bag) continue;
|
|
178
|
+
for (const key of propKeys) {
|
|
179
|
+
const value = bag[key];
|
|
180
|
+
if (typeof value !== "string" || value === "") continue;
|
|
181
|
+
const result = resolveRefInJson(root, at, value);
|
|
182
|
+
if (result.ok) continue;
|
|
183
|
+
warnings.push(`${path}: ${prefix}${key} — ${describeRefProblem(result.problem, value)} The scene loads and the prop does nothing.`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
(node.children ?? []).forEach((child, i) => {
|
|
187
|
+
walk(child, [...at, i], `${path}/${child.name ?? "?"}`);
|
|
188
|
+
});
|
|
189
|
+
};
|
|
190
|
+
walk(root, [], String(root.name ?? "root"));
|
|
191
|
+
return warnings;
|
|
192
|
+
}
|
|
193
|
+
//#endregion
|
|
2
194
|
//#region src/core/audit.ts
|
|
3
195
|
const ANIMATED_TYPES = new Set([
|
|
4
196
|
"Particles2D",
|
|
@@ -88,6 +280,7 @@ function auditScene(scene) {
|
|
|
88
280
|
if (cameras > 0 && currentCameras === 0) warnings.push("no camera has \"current\": true — the screen renders from a default view, probably not what you framed.");
|
|
89
281
|
if (currentCameras > 1) warnings.push(`${currentCameras} cameras claim "current": true — only the first found wins.`);
|
|
90
282
|
if (scene.dimension === "3d" && lights === 0 && !isLit(scene.environment)) warnings.push("nothing lights this 3D scene — no light node, no environment sky/hdri, and no ambient intensity. It will render black. Add a DirectionalLight3D, or an \"environment\": { \"sky\": { \"type\": \"atmosphere\" } } / { \"preset\": \"...\" }.");
|
|
283
|
+
for (const warning of nodeRefWarnings(scene)) warnings.push(warning);
|
|
91
284
|
for (const warning of auditStrings(scene)) warnings.push(warning);
|
|
92
285
|
return warnings;
|
|
93
286
|
}
|
|
@@ -217,4 +410,4 @@ function replay(engine, recording, opts) {
|
|
|
217
410
|
}
|
|
218
411
|
}
|
|
219
412
|
//#endregion
|
|
220
|
-
export { startRecording as n, auditScene as r, replay as t };
|
|
413
|
+
export { nodeRefWarnings as a, describeRefProblem as i, startRecording as n, resolveRefInJson as o, auditScene as r, replay as t };
|