@chatlychat/world 0.0.0-stage → 0.2.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/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +184 -2
- package/dist/agent.d.ts +63 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +251 -0
- package/dist/agent.js.map +1 -0
- package/dist/bubble.d.ts +36 -0
- package/dist/bubble.d.ts.map +1 -0
- package/dist/bubble.js +108 -0
- package/dist/bubble.js.map +1 -0
- package/dist/capabilities.d.ts +77 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +129 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cards.d.ts +51 -0
- package/dist/cards.d.ts.map +1 -0
- package/dist/cards.js +136 -0
- package/dist/cards.js.map +1 -0
- package/dist/composer.d.ts +25 -0
- package/dist/composer.d.ts.map +1 -0
- package/dist/composer.js +53 -0
- package/dist/composer.js.map +1 -0
- package/dist/handlers.d.ts +26 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +41 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +46 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +89 -0
- package/dist/input.js.map +1 -0
- package/dist/layout.d.ts +24 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +69 -0
- package/dist/layout.js.map +1 -0
- package/dist/model.d.ts +57 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +86 -0
- package/dist/model.js.map +1 -0
- package/dist/motion.d.ts +27 -0
- package/dist/motion.d.ts.map +1 -0
- package/dist/motion.js +65 -0
- package/dist/motion.js.map +1 -0
- package/dist/panel.d.ts +77 -0
- package/dist/panel.d.ts.map +1 -0
- package/dist/panel.js +214 -0
- package/dist/panel.js.map +1 -0
- package/dist/picks.d.ts +45 -0
- package/dist/picks.d.ts.map +1 -0
- package/dist/picks.js +186 -0
- package/dist/picks.js.map +1 -0
- package/dist/selection.d.ts +14 -0
- package/dist/selection.d.ts.map +1 -0
- package/dist/selection.js +21 -0
- package/dist/selection.js.map +1 -0
- package/dist/text.d.ts +26 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +100 -0
- package/dist/text.js.map +1 -0
- package/dist/theme-apply.d.ts +19 -0
- package/dist/theme-apply.d.ts.map +1 -0
- package/dist/theme-apply.js +88 -0
- package/dist/theme-apply.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +41 -0
- package/dist/types.js.map +1 -0
- package/dist/visemes.d.ts +28 -0
- package/dist/visemes.d.ts.map +1 -0
- package/dist/visemes.js +42 -0
- package/dist/visemes.js.map +1 -0
- package/dist/vrm.d.ts +97 -0
- package/dist/vrm.d.ts.map +1 -0
- package/dist/vrm.js +212 -0
- package/dist/vrm.js.map +1 -0
- package/dist/world-api.d.ts +39 -0
- package/dist/world-api.d.ts.map +1 -0
- package/dist/world-api.js +2 -0
- package/dist/world-api.js.map +1 -0
- package/dist/world.d.ts +5 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.js +414 -0
- package/dist/world.js.map +1 -0
- package/package.json +75 -3
package/dist/vrm.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VRM avatars — the optional half of the agent's body.
|
|
3
|
+
*
|
|
4
|
+
* `@pixiv/three-vrm` is an OPTIONAL peer dependency. This file never imports
|
|
5
|
+
* it statically, and the dynamic import below names it through a computed
|
|
6
|
+
* specifier, so no bundler resolves it while building a glTF-only host: that
|
|
7
|
+
* host neither installs it nor ships a byte of it. A host that does use VRM
|
|
8
|
+
* installs it and, if it bundles, hands the import over as `loadVrm`:
|
|
9
|
+
* `loadVrm: () => import('@pixiv/three-vrm')`. That one line is what lets ITS
|
|
10
|
+
* bundler see the package.
|
|
11
|
+
*
|
|
12
|
+
* API used (three-vrm v3, https://pixiv.github.io/three-vrm/packages/three-vrm/docs/):
|
|
13
|
+
* `VRMLoaderPlugin` registered on a `GLTFLoader` leaves the `VRM` on
|
|
14
|
+
* `gltf.userData.vrm`; `vrm.expressionManager.setValue(name, 0..1)`;
|
|
15
|
+
* `vrm.lookAt.target`; `vrm.humanoid.getNormalizedBoneNode(bone)`;
|
|
16
|
+
* `vrm.update(deltaSeconds)`; `VRMUtils.rotateVRM0(vrm)`.
|
|
17
|
+
*/
|
|
18
|
+
import { Group, Vector3 } from 'three';
|
|
19
|
+
import { WorldError } from './types.js';
|
|
20
|
+
export const VRM_PEER = '@pixiv/three-vrm';
|
|
21
|
+
/** The module, or a typed error that names the missing peer and how to fix it. */
|
|
22
|
+
export async function loadVrmModule(custom) {
|
|
23
|
+
try {
|
|
24
|
+
// A computed specifier on purpose: see the header.
|
|
25
|
+
const spec = ['@pixiv', 'three-vrm'].join('/');
|
|
26
|
+
const mod = await (custom ??
|
|
27
|
+
(() => import(/* @vite-ignore */ /* webpackIgnore: true */ spec)))();
|
|
28
|
+
if (typeof mod.VRMLoaderPlugin !== 'function') {
|
|
29
|
+
throw new Error('no VRMLoaderPlugin export');
|
|
30
|
+
}
|
|
31
|
+
return mod;
|
|
32
|
+
}
|
|
33
|
+
catch (cause) {
|
|
34
|
+
const e = new WorldError('missing_peer', `VRM avatars need the optional peer dependency ${VRM_PEER}. Run \`npm install ${VRM_PEER}\`; ` +
|
|
35
|
+
`if you bundle, also pass \`loadVrm\` (a function returning import(...) of it) to createWorld.`);
|
|
36
|
+
e.cause = cause;
|
|
37
|
+
throw e;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** The glTF carries a VRM 0.x (`VRM`) or 1.0 (`VRMC_vrm`) extension. */
|
|
41
|
+
export function hasVrmExtension(gltf) {
|
|
42
|
+
const ext = gltf.userData?.['gltfExtensions'];
|
|
43
|
+
if (typeof ext === 'object' && ext !== null && ('VRM' in ext || 'VRMC_vrm' in ext)) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
const used = gltf.parser?.json?.extensionsUsed;
|
|
47
|
+
return Array.isArray(used) && used.some((x) => x === 'VRM' || x === 'VRMC_vrm');
|
|
48
|
+
}
|
|
49
|
+
/** Which loader an avatar needs: its declared format wins; the extension catches an unlabelled file. */
|
|
50
|
+
export const wantsVrm = (format, gltf) => format === 'vrm' || (gltf !== undefined && hasVrmExtension(gltf));
|
|
51
|
+
/**
|
|
52
|
+
* Chatly viseme -> one of VRM's five mouth expressions, and how far to open it.
|
|
53
|
+
* Keys are compared lower-case with any `viseme_` prefix removed. A viseme not
|
|
54
|
+
* listed, `sil` and `PP` (lips shut) all close the mouth.
|
|
55
|
+
*/
|
|
56
|
+
export const VISEME_TO_VRM = {
|
|
57
|
+
// VRM's own vowels, and the Oculus vowels.
|
|
58
|
+
aa: ['aa', 1],
|
|
59
|
+
ih: ['ih', 1],
|
|
60
|
+
ou: ['ou', 1],
|
|
61
|
+
ee: ['ee', 1],
|
|
62
|
+
oh: ['oh', 1],
|
|
63
|
+
e: ['ee', 1],
|
|
64
|
+
i: ['ih', 1],
|
|
65
|
+
o: ['oh', 1],
|
|
66
|
+
u: ['ou', 1],
|
|
67
|
+
// Oculus consonants: the nearest vowel shape, held shallower.
|
|
68
|
+
ff: ['ih', 0.4],
|
|
69
|
+
th: ['ih', 0.5],
|
|
70
|
+
dd: ['aa', 0.4],
|
|
71
|
+
kk: ['aa', 0.4],
|
|
72
|
+
ch: ['ou', 0.5],
|
|
73
|
+
ss: ['ih', 0.5],
|
|
74
|
+
nn: ['ih', 0.3],
|
|
75
|
+
rr: ['ou', 0.5],
|
|
76
|
+
pp: null,
|
|
77
|
+
sil: null,
|
|
78
|
+
};
|
|
79
|
+
export const VRM_VOWELS = ['aa', 'ih', 'ou', 'ee', 'oh'];
|
|
80
|
+
export function vrmVisemeFor(v) {
|
|
81
|
+
return VISEME_TO_VRM[v.toLowerCase().replace(/^viseme_/, '')] ?? null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Chatly `embodiment.expression` -> VRM preset and weight. The rest (`nod`,
|
|
85
|
+
* `shake_head`, `point`, `wave`, `shrug`, `think`) are gestures, not faces: they
|
|
86
|
+
* play only as the host's clip from `presence.expressions`. No Chatly expression
|
|
87
|
+
* is `angry` or `relaxed`, so those presets are never driven.
|
|
88
|
+
*/
|
|
89
|
+
export const EXPRESSION_TO_VRM = {
|
|
90
|
+
smile: ['happy', 0.7],
|
|
91
|
+
laugh: ['happy', 1],
|
|
92
|
+
surprised: ['surprised', 1],
|
|
93
|
+
concerned: ['sad', 0.6],
|
|
94
|
+
};
|
|
95
|
+
const HOLD_S = 2.5;
|
|
96
|
+
const FADE_OUT_S = 0.5;
|
|
97
|
+
const EASE_IN_S = 0.12;
|
|
98
|
+
const BLINK_EVERY_S = 4;
|
|
99
|
+
const BLINK_S = 0.15;
|
|
100
|
+
const HEAD_YAW = 0.6;
|
|
101
|
+
const HEAD_PITCH = 0.35;
|
|
102
|
+
const HEAD_RATE = 8;
|
|
103
|
+
/** Drives one loaded VRM: mouth, face, blink, gaze, and `vrm.update`. */
|
|
104
|
+
export class VrmRig {
|
|
105
|
+
vrm;
|
|
106
|
+
reduced;
|
|
107
|
+
target = new Group();
|
|
108
|
+
face = null;
|
|
109
|
+
mouth = null;
|
|
110
|
+
clock = 0;
|
|
111
|
+
head = { yaw: 0, pitch: 0 };
|
|
112
|
+
constructor(vrm, reduced) {
|
|
113
|
+
this.vrm = vrm;
|
|
114
|
+
this.reduced = reduced;
|
|
115
|
+
this.target.name = 'cl3-agent-gaze';
|
|
116
|
+
if (vrm.lookAt != null) {
|
|
117
|
+
vrm.lookAt.target = this.target;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
get gazeTarget() {
|
|
121
|
+
return this.target;
|
|
122
|
+
}
|
|
123
|
+
set(name, w) {
|
|
124
|
+
this.vrm.expressionManager?.setValue(name, w);
|
|
125
|
+
}
|
|
126
|
+
/** Open one of the five vowels (or close the mouth with null). Always zeroes the other four. */
|
|
127
|
+
setMouth(v, w) {
|
|
128
|
+
const hit = v === null ? null : vrmVisemeFor(v);
|
|
129
|
+
const vowel = hit === null ? null : hit[0];
|
|
130
|
+
for (const name of VRM_VOWELS) {
|
|
131
|
+
this.set(name, name === vowel ? Math.min(1, w * (hit?.[1] ?? 0)) : 0);
|
|
132
|
+
}
|
|
133
|
+
this.mouth = vowel;
|
|
134
|
+
}
|
|
135
|
+
/** Show a face for a cue; false when the expression is a gesture with no VRM preset. */
|
|
136
|
+
express(e) {
|
|
137
|
+
const p = e === null ? undefined : EXPRESSION_TO_VRM[e];
|
|
138
|
+
if (p === undefined) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
if (this.face !== null && this.face.name !== p[0]) {
|
|
142
|
+
this.set(this.face.name, 0);
|
|
143
|
+
}
|
|
144
|
+
this.face = { name: p[0], weight: p[1], age: 0 };
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
/** Point the eyes and head at a world position (null = release the head). */
|
|
148
|
+
gazeAt(root, at, dt) {
|
|
149
|
+
const bone = this.vrm.humanoid?.getNormalizedBoneNode('head');
|
|
150
|
+
const k = this.reduced ? 1 : 1 - Math.exp(-HEAD_RATE * dt);
|
|
151
|
+
let yaw = 0;
|
|
152
|
+
let pitch = 0;
|
|
153
|
+
if (at !== null && bone != null) {
|
|
154
|
+
this.target.position.copy(at);
|
|
155
|
+
this.target.updateMatrixWorld(true);
|
|
156
|
+
const from = root.worldToLocal(bone.getWorldPosition(new Vector3()));
|
|
157
|
+
const to = root.worldToLocal(at.clone());
|
|
158
|
+
const dx = to.x - from.x;
|
|
159
|
+
const dz = to.z - from.z;
|
|
160
|
+
yaw = Math.max(-HEAD_YAW, Math.min(HEAD_YAW, Math.atan2(dx, dz)));
|
|
161
|
+
pitch = Math.max(-HEAD_PITCH, Math.min(HEAD_PITCH, -Math.atan2(to.y - from.y, Math.hypot(dx, dz))));
|
|
162
|
+
}
|
|
163
|
+
this.head = {
|
|
164
|
+
yaw: this.head.yaw + (yaw - this.head.yaw) * k,
|
|
165
|
+
pitch: this.head.pitch + (pitch - this.head.pitch) * k,
|
|
166
|
+
};
|
|
167
|
+
// A head never driven is left to the clips; one released is eased home, then left alone.
|
|
168
|
+
if (bone != null &&
|
|
169
|
+
(at !== null || Math.abs(this.head.yaw) + Math.abs(this.head.pitch) > 1e-3)) {
|
|
170
|
+
bone.rotation.set(this.head.pitch, this.head.yaw, 0);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/** Advance the face and blink, then `vrm.update`. Call after the mixer and the gaze. */
|
|
174
|
+
update(dt) {
|
|
175
|
+
this.clock += dt;
|
|
176
|
+
const f = this.face;
|
|
177
|
+
if (f !== null) {
|
|
178
|
+
f.age += dt;
|
|
179
|
+
const fade = this.reduced ? 0 : FADE_OUT_S;
|
|
180
|
+
const k = this.reduced
|
|
181
|
+
? Number(f.age <= HOLD_S)
|
|
182
|
+
: f.age < EASE_IN_S
|
|
183
|
+
? f.age / EASE_IN_S
|
|
184
|
+
: f.age <= HOLD_S
|
|
185
|
+
? 1
|
|
186
|
+
: 1 - (f.age - HOLD_S) / fade;
|
|
187
|
+
this.set(f.name, f.weight * Math.max(0, Math.min(1, k)));
|
|
188
|
+
if (f.age >= HOLD_S + fade) {
|
|
189
|
+
this.set(f.name, 0);
|
|
190
|
+
this.face = null;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// A held, motionless blink would read as a fault, so reduced motion has none.
|
|
194
|
+
const phase = this.clock % BLINK_EVERY_S;
|
|
195
|
+
this.set('blink', this.reduced || phase > BLINK_S ? 0 : 1 - Math.abs(1 - (2 * phase) / BLINK_S));
|
|
196
|
+
this.vrm.update(dt);
|
|
197
|
+
}
|
|
198
|
+
get openVowel() {
|
|
199
|
+
return this.mouth;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Where the agent should look, as a world position, for `gazeAt`. */
|
|
203
|
+
export function gazePoint(gaze, camera) {
|
|
204
|
+
if (gaze === null) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
if (gaze === 'visitor') {
|
|
208
|
+
return camera.getWorldPosition(new Vector3());
|
|
209
|
+
}
|
|
210
|
+
return gaze instanceof Vector3 ? gaze : gaze.getWorldPosition(new Vector3());
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=vrm.js.map
|
package/dist/vrm.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vrm.js","sourceRoot":"","sources":["../src/vrm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AgentBody } from './agent.js';
|
|
2
|
+
import type { CapabilityRegistry } from './capabilities.js';
|
|
3
|
+
import type { Composer } from './composer.js';
|
|
4
|
+
import type { Gaze, Hit } from './input.js';
|
|
5
|
+
import type { Selection } from './selection.js';
|
|
6
|
+
import type { ResolvedWorldPlacement, ResolvedWorldTheme, WorldTheme } from '@chatlychat/core';
|
|
7
|
+
import type { Group, Object3D, Vector3 } from 'three';
|
|
8
|
+
/** What `createWorld` returns. */
|
|
9
|
+
export interface ChatlyWorld {
|
|
10
|
+
/** Add this to your scene. */
|
|
11
|
+
readonly root: Group;
|
|
12
|
+
readonly capabilities: CapabilityRegistry;
|
|
13
|
+
readonly selection: Selection;
|
|
14
|
+
readonly agent: AgentBody;
|
|
15
|
+
readonly composer: Composer;
|
|
16
|
+
readonly theme: ResolvedWorldTheme;
|
|
17
|
+
readonly placement: ResolvedWorldPlacement;
|
|
18
|
+
readonly reducedMotion: boolean;
|
|
19
|
+
/** Call every frame with the frame time in SECONDS. */
|
|
20
|
+
update(dtSeconds: number): void;
|
|
21
|
+
/** What a ray from `origin` along `direction` strikes, or null. Does not activate it. */
|
|
22
|
+
pick(origin: Vector3, direction: Vector3): Hit | null;
|
|
23
|
+
/** Normalised device coordinates (-1..1), for a mouse or touch. */
|
|
24
|
+
pickAtPointer(x: number, y: number): Hit | null;
|
|
25
|
+
activate(hit: Hit): void;
|
|
26
|
+
attachController(controller: Object3D): () => void;
|
|
27
|
+
attachGaze(opts?: {
|
|
28
|
+
dwellMs?: number;
|
|
29
|
+
}): Gaze;
|
|
30
|
+
setReducedMotion(reduced: boolean): void;
|
|
31
|
+
setTheme(theme: WorldTheme | null, layers?: readonly WorldTheme[]): void;
|
|
32
|
+
setScene(scene: 'light' | 'dark'): void;
|
|
33
|
+
/** Select a card by key (`cardKeys()`); the same as the visitor tapping it. */
|
|
34
|
+
select(key: string): Promise<void>;
|
|
35
|
+
release(): void;
|
|
36
|
+
cardKeys(): readonly string[];
|
|
37
|
+
dispose(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=world-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-api.d.ts","sourceRoot":"","sources":["../src/world-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEtD,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,uDAAuD;IACvD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,yFAAyF;IACzF,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;IACtD,mEAAmE;IACnE,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IACzB,gBAAgB,CAAC,UAAU,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;IACnD,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IACzE,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,+EAA+E;IAC/E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,IAAI,SAAS,MAAM,EAAE,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-api.js","sourceRoot":"","sources":["../src/world-api.ts"],"names":[],"mappings":""}
|
package/dist/world.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"AAmDA,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CA2a3D"}
|