@chatlychat/world 0.0.0-stage → 0.1.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.
Files changed (81) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +21 -0
  3. package/README.md +120 -2
  4. package/dist/agent.d.ts +59 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +232 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/bubble.d.ts +36 -0
  9. package/dist/bubble.d.ts.map +1 -0
  10. package/dist/bubble.js +108 -0
  11. package/dist/bubble.js.map +1 -0
  12. package/dist/capabilities.d.ts +77 -0
  13. package/dist/capabilities.d.ts.map +1 -0
  14. package/dist/capabilities.js +118 -0
  15. package/dist/capabilities.js.map +1 -0
  16. package/dist/cards.d.ts +51 -0
  17. package/dist/cards.d.ts.map +1 -0
  18. package/dist/cards.js +136 -0
  19. package/dist/cards.js.map +1 -0
  20. package/dist/composer.d.ts +25 -0
  21. package/dist/composer.d.ts.map +1 -0
  22. package/dist/composer.js +53 -0
  23. package/dist/composer.js.map +1 -0
  24. package/dist/examples/tsconfig.tsbuildinfo +1 -0
  25. package/dist/handlers.d.ts +26 -0
  26. package/dist/handlers.d.ts.map +1 -0
  27. package/dist/handlers.js +41 -0
  28. package/dist/handlers.js.map +1 -0
  29. package/dist/index.d.ts +26 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +24 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/input.d.ts +46 -0
  34. package/dist/input.d.ts.map +1 -0
  35. package/dist/input.js +89 -0
  36. package/dist/input.js.map +1 -0
  37. package/dist/layout.d.ts +24 -0
  38. package/dist/layout.d.ts.map +1 -0
  39. package/dist/layout.js +69 -0
  40. package/dist/layout.js.map +1 -0
  41. package/dist/model.d.ts +25 -0
  42. package/dist/model.d.ts.map +1 -0
  43. package/dist/model.js +60 -0
  44. package/dist/model.js.map +1 -0
  45. package/dist/motion.d.ts +27 -0
  46. package/dist/motion.d.ts.map +1 -0
  47. package/dist/motion.js +65 -0
  48. package/dist/motion.js.map +1 -0
  49. package/dist/panel.d.ts +77 -0
  50. package/dist/panel.d.ts.map +1 -0
  51. package/dist/panel.js +214 -0
  52. package/dist/panel.js.map +1 -0
  53. package/dist/selection.d.ts +14 -0
  54. package/dist/selection.d.ts.map +1 -0
  55. package/dist/selection.js +21 -0
  56. package/dist/selection.js.map +1 -0
  57. package/dist/text.d.ts +26 -0
  58. package/dist/text.d.ts.map +1 -0
  59. package/dist/text.js +100 -0
  60. package/dist/text.js.map +1 -0
  61. package/dist/theme-apply.d.ts +19 -0
  62. package/dist/theme-apply.d.ts.map +1 -0
  63. package/dist/theme-apply.js +88 -0
  64. package/dist/theme-apply.js.map +1 -0
  65. package/dist/types.d.ts +102 -0
  66. package/dist/types.d.ts.map +1 -0
  67. package/dist/types.js +41 -0
  68. package/dist/types.js.map +1 -0
  69. package/dist/visemes.d.ts +28 -0
  70. package/dist/visemes.d.ts.map +1 -0
  71. package/dist/visemes.js +42 -0
  72. package/dist/visemes.js.map +1 -0
  73. package/dist/world-api.d.ts +39 -0
  74. package/dist/world-api.d.ts.map +1 -0
  75. package/dist/world-api.js +2 -0
  76. package/dist/world-api.js.map +1 -0
  77. package/dist/world.d.ts +5 -0
  78. package/dist/world.d.ts.map +1 -0
  79. package/dist/world.js +573 -0
  80. package/dist/world.js.map +1 -0
  81. package/package.json +67 -3
package/dist/world.js ADDED
@@ -0,0 +1,573 @@
1
+ /**
2
+ * `createWorld` — a Chatly conversation rendered into the host's three.js
3
+ * scene.
4
+ *
5
+ * The host adds `world.root` to ITS scene and calls `world.update(dt)` from
6
+ * ITS loop; it keeps the scene, the avatars, the input and the wayfinding.
7
+ * The world draws what the conversation contains (picks, bubbles, a panel, an
8
+ * agent body), routes taps and bot-fired capabilities back, and applies the
9
+ * `worldTheme` to all of it.
10
+ */
11
+ import { embodiedAgent, expressionClip, messageEmbodiment, resolveWorldPlacement, resolveWorldTheme, } from '@chatlychat/core';
12
+ import { Group, Raycaster, Vector2, Vector3 } from 'three';
13
+ import { AgentBody } from './agent.js';
14
+ import { MAX_BUBBLES, anchorBubble, animateTyping, createTyping, defaultBubble, speakerKind, } from './bubble.js';
15
+ import { CapabilityRegistry } from './capabilities.js';
16
+ import { buildGrid, cardKey, defaultCard, readCard } from './cards.js';
17
+ import { createComposer } from './composer.js';
18
+ import { cardActions, makeHandlers } from './handlers.js';
19
+ import { Gaze, attachController, interactive, pickRay } from './input.js';
20
+ import { GRID_PLACEMENTS } from './layout.js';
21
+ import { cachedLoader, gltfLoader } from './model.js';
22
+ import { Motion, enter, setOpacity } from './motion.js';
23
+ import { PanelRig, defaultComposer, defaultPanel, followMode, } from './panel.js';
24
+ import { Selection } from './selection.js';
25
+ import { ensureFont } from './text.js';
26
+ import { WORLD_CONTRACT, WorldError } from './types.js';
27
+ import { readVisemes } from './visemes.js';
28
+ // A panel that tracks the head exactly is nauseating, so `locked` is not offered.
29
+ const FOLLOWS = ['none', 'lazy'];
30
+ export function createWorld(opts) {
31
+ const { conversation, camera } = opts;
32
+ const now = opts.now ?? (() => Date.now());
33
+ const onError = opts.onError ?? (() => undefined);
34
+ const announce = opts.announce ?? (() => undefined);
35
+ const r = opts.renderers;
36
+ if (r?.contract !== undefined && r.contract !== WORLD_CONTRACT.version) {
37
+ throw new WorldError('unsupported_contract', `renderers were written for contract ${String(r.contract)}; this world speaks ${String(WORLD_CONTRACT.version)}`);
38
+ }
39
+ const readReduced = () => typeof opts.reducedMotion === 'function' ? opts.reducedMotion() : (opts.reducedMotion ?? false);
40
+ let reduced = readReduced();
41
+ let baseTheme = opts.theme ?? null;
42
+ let layers = opts.themeLayers ?? [];
43
+ let scene = opts.scene ?? 'light';
44
+ const resolve = () => resolveWorldTheme(baseTheme ?? {}, { scene, layers, reducedMotion: reduced });
45
+ let theme = resolve();
46
+ ensureFont(theme.fontUrl);
47
+ const placement = resolveWorldPlacement(opts.placement, {
48
+ ...opts.abilities,
49
+ follow: (opts.abilities?.follow ?? FOLLOWS).filter((f) => f !== 'locked'),
50
+ hud: false,
51
+ });
52
+ const root = new Group();
53
+ root.name = WORLD_CONTRACT.objects.root;
54
+ const motion = new Motion(reduced);
55
+ const selection = new Selection();
56
+ const capabilities = new CapabilityRegistry(announce);
57
+ const rawLoad = opts.loadModel ?? gltfLoader();
58
+ const loadModel = cachedLoader(rawLoad);
59
+ // The avatar is loaded once and owned; a clone of a skinned mesh would share its skeleton.
60
+ const agent = new AgentBody(theme, rawLoad, onError, reduced);
61
+ const anchors = opts.anchors ?? {};
62
+ let agentNode = null;
63
+ root.add(agent.root);
64
+ const rig = new PanelRig(root, placement, followMode(placement, opts.follow));
65
+ const unbind = capabilities.bind(conversation);
66
+ const hooks = {
67
+ hostEvent: async (event, data, action) => {
68
+ if (capabilities.has(event)) {
69
+ const rep = await capabilities.invoke(event, data, false);
70
+ await conversation.reportAction({
71
+ messageId: action.messageId,
72
+ actionId: action.actionId,
73
+ status: rep.status,
74
+ ...(rep.text === null ? {} : { text: rep.text }),
75
+ });
76
+ return true;
77
+ }
78
+ opts.onHostEvent?.(event, data);
79
+ return opts.onHostEvent !== undefined;
80
+ },
81
+ openUrl: (href) => opts.onOpenUrl?.(href),
82
+ };
83
+ const sound = (kind, at) => {
84
+ const url = theme[`sound${kind[0]?.toUpperCase() ?? ''}${kind.slice(1)}`];
85
+ if (url !== null) {
86
+ opts.onSound?.({
87
+ kind,
88
+ url,
89
+ volume: theme.soundVolume,
90
+ spatial: theme.soundSpatial && at !== undefined,
91
+ position: at === undefined ? null : at.getWorldPosition(new Vector3()),
92
+ });
93
+ }
94
+ };
95
+ /* ─────────────────────────────── picks ─────────────────────────────── */
96
+ let grid = null;
97
+ let held = null;
98
+ const named = (node, name) => {
99
+ node.name = node.name === '' ? name : node.name;
100
+ return node;
101
+ };
102
+ const drawCard = (g, index) => {
103
+ const block = g.cards[index];
104
+ const key = cardKey(g.message, block, index);
105
+ const data = readCard(block);
106
+ const props = {
107
+ theme,
108
+ placement,
109
+ reducedMotion: reduced,
110
+ block: { type: 'card', ...block },
111
+ message: g.message,
112
+ selected: selection.id === key,
113
+ ...makeHandlers(conversation, g.message, data.title, cardActions(block), hooks),
114
+ };
115
+ const node = named(r?.renderCard !== undefined
116
+ ? r.renderCard(props)
117
+ : defaultCard(props, { loadModel, onError }), WORLD_CONTRACT.objects.card);
118
+ node.userData['cardKey'] = key;
119
+ if (node.userData['cl3Handled'] !== true) {
120
+ interactive(node, 'card', () => void toggle(key));
121
+ }
122
+ return node;
123
+ };
124
+ const redraw = (key) => {
125
+ const e = key === null ? undefined : grid?.nodes.get(key);
126
+ if (grid === null || e === undefined) {
127
+ return;
128
+ }
129
+ const next = drawCard(grid, e.index);
130
+ next.position.copy(e.node.position);
131
+ next.rotation.copy(e.node.rotation);
132
+ const parent = e.node.parent;
133
+ if (parent !== null) {
134
+ // Same slot in the child list, so traversal order stays the card order.
135
+ parent.children.splice(parent.children.indexOf(e.node), 1, next);
136
+ next.parent = parent;
137
+ e.node.parent = null;
138
+ }
139
+ grid.nodes.set(key, { node: next, index: e.index });
140
+ };
141
+ const dropHeld = () => {
142
+ held?.removeFromParent();
143
+ held = null;
144
+ };
145
+ const showHeld = (key) => {
146
+ dropHeld();
147
+ if (grid === null) {
148
+ return;
149
+ }
150
+ const index = grid.nodes.get(key)?.index ?? 0;
151
+ const block = grid.cards[index];
152
+ const data = readCard(block);
153
+ const props = {
154
+ theme,
155
+ placement,
156
+ reducedMotion: reduced,
157
+ block: { type: 'card', ...block },
158
+ message: grid.message,
159
+ release: () => release(),
160
+ ...makeHandlers(conversation, grid.message, data.title, cardActions(block), hooks),
161
+ };
162
+ const node = r?.renderPick !== undefined
163
+ ? r.renderPick(props)
164
+ : (() => {
165
+ const n = defaultCard({ ...props, selected: true }, { loadModel, onError });
166
+ n.name = WORLD_CONTRACT.objects.pick;
167
+ n.scale.setScalar(0.6);
168
+ return n;
169
+ })();
170
+ named(node, WORLD_CONTRACT.objects.pick);
171
+ if (node.userData['cl3Handled'] !== true) {
172
+ interactive(node, 'release', release);
173
+ }
174
+ if (anchors.hand !== undefined && anchors.hand !== null) {
175
+ anchors.hand.add(node);
176
+ }
177
+ else {
178
+ // Placed once, in front of where the visitor is looking — not carried on the head.
179
+ const dir = camera.getWorldDirection(new Vector3());
180
+ const at = camera.getWorldPosition(new Vector3()).addScaledVector(dir, 0.6);
181
+ at.y -= 0.25;
182
+ root.add(node);
183
+ node.position.copy(root.worldToLocal(at));
184
+ }
185
+ const y = node.position.y;
186
+ const k = theme.motionPick;
187
+ motion.run(k === 'none' ? 0 : 250, (t) => {
188
+ if (k === 'rise') {
189
+ node.position.y = y - 0.15 * (1 - t);
190
+ }
191
+ else if (k === 'drop') {
192
+ node.position.y = y + 0.15 * (1 - t);
193
+ }
194
+ else {
195
+ setOpacity(node, t);
196
+ }
197
+ });
198
+ held = node;
199
+ };
200
+ const select = async (key) => {
201
+ const e = grid?.nodes.get(key);
202
+ if (grid === null || e === undefined || selection.id === key) {
203
+ return;
204
+ }
205
+ const prev = selection.id;
206
+ const block = grid.cards[e.index];
207
+ selection.set(key);
208
+ redraw(prev);
209
+ redraw(key);
210
+ showHeld(key);
211
+ sound('pick', e.node);
212
+ try {
213
+ await makeHandlers(conversation, grid.message, readCard(block).title, [], hooks).select({
214
+ type: 'card.select',
215
+ card: typeof block['id'] === 'string' ? block['id'] : `c${String(e.index)}`,
216
+ message: grid.message.id,
217
+ });
218
+ sound('select', e.node);
219
+ }
220
+ catch (err) {
221
+ // The thread never heard about it, so the world must not claim it was picked.
222
+ if (selection.id === key) {
223
+ release();
224
+ }
225
+ onError(err);
226
+ }
227
+ };
228
+ function release() {
229
+ const prev = selection.id;
230
+ selection.set(null);
231
+ redraw(prev);
232
+ dropHeld();
233
+ }
234
+ const toggle = (key) => {
235
+ if (selection.id === key) {
236
+ release();
237
+ return Promise.resolve();
238
+ }
239
+ return select(key);
240
+ };
241
+ const showGrid = (message) => {
242
+ const blocks = message.blocks?.blocks ?? [];
243
+ const block = [...blocks].reverse().find((b) => b.type === 'card_grid' || b.type === 'card');
244
+ grid?.group.removeFromParent();
245
+ release();
246
+ grid = null;
247
+ if (block === undefined) {
248
+ return;
249
+ }
250
+ const cards = block.type === 'card'
251
+ ? [block]
252
+ : (block['cards'] ?? []);
253
+ const want = block['placement'];
254
+ const kind = GRID_PLACEMENTS.includes(want)
255
+ ? want
256
+ : 'arc';
257
+ const draft = { message, cards };
258
+ const built = buildGrid(kind, cards.length, theme, (i) => drawCard(draft, i), (i) => cardKey(message, cards[i], i));
259
+ grid = Object.assign(built, { message, cards });
260
+ // Spawned where the viewer stands and faces now; then left alone.
261
+ const cam = camera.getWorldPosition(new Vector3());
262
+ const dir = camera.getWorldDirection(new Vector3());
263
+ built.group.position.copy(root.worldToLocal(cam));
264
+ built.group.rotation.y = Math.atan2(-dir.x, -dir.z);
265
+ root.add(built.group);
266
+ for (const { node } of built.nodes.values()) {
267
+ enter(motion, node, theme.motionEntrance);
268
+ }
269
+ };
270
+ /* ─────────────────────────── speech and panel ───────────────────────── */
271
+ const bubbles = [];
272
+ let typing = null;
273
+ const seen = new Set();
274
+ let primed = false;
275
+ const bubbleOf = (m) => named((r?.renderBubble ?? defaultBubble)({
276
+ theme,
277
+ placement,
278
+ reducedMotion: reduced,
279
+ message: m,
280
+ embodiment: messageEmbodiment(m),
281
+ streaming: m.streamState === 'streaming',
282
+ }), WORLD_CONTRACT.objects.bubble);
283
+ const speakerFor = (m) => speakerKind(m) === 'visitor'
284
+ ? (anchors.visitor ?? null)
285
+ : (anchors.speaker?.(m.authorId) ?? agentNode ?? agent.root);
286
+ const addBubble = (m) => {
287
+ const speaker = speakerFor(m);
288
+ if (speaker === null || m.body === '') {
289
+ return;
290
+ }
291
+ const node = bubbleOf(m);
292
+ root.add(node);
293
+ enter(motion, node, theme.motionEntrance);
294
+ bubbles.push({ messageId: m.id, speaker, node, body: m.body, bornAt: now() });
295
+ while (bubbles.length > MAX_BUBBLES) {
296
+ bubbles.shift()?.node.removeFromParent();
297
+ }
298
+ };
299
+ const composer = createComposer({
300
+ conversation,
301
+ onError,
302
+ onSent: () => sound('send', anchors.visitor ?? undefined),
303
+ onChange: (composingChanged) => {
304
+ if (composingChanged) {
305
+ sync(conversation.getSnapshot());
306
+ }
307
+ redrawPanel(conversation.getSnapshot());
308
+ },
309
+ });
310
+ const composerView = {
311
+ get draft() {
312
+ return composer.draft;
313
+ },
314
+ submit: () => void composer.submit(),
315
+ requestInput: () => opts.onComposeRequest?.(),
316
+ };
317
+ let panel = null;
318
+ let composerNode = null;
319
+ function redrawPanel(snap) {
320
+ panel?.removeFromParent();
321
+ composerNode?.removeFromParent();
322
+ const ctx = { theme, placement, reducedMotion: reduced };
323
+ panel = named((r?.renderPanel ?? defaultPanel)({
324
+ ...ctx,
325
+ conversation: conversation,
326
+ messages: snap.messages,
327
+ typing: snap.typing,
328
+ }), WORLD_CONTRACT.objects.panel);
329
+ const cprops = {
330
+ ...ctx,
331
+ send: async (body) => {
332
+ await conversation.send(body);
333
+ },
334
+ setComposing: (c) => composer.setComposing(c),
335
+ disabled: snap.connection === 'closed' || composer.busy,
336
+ };
337
+ composerNode = named(r?.renderComposer !== undefined
338
+ ? r.renderComposer(cprops)
339
+ : defaultComposer(cprops, composerView, placement.widthMetres), WORLD_CONTRACT.objects.composer);
340
+ const ph = (panel.userData['size'] ?? [0, 0.3])[1];
341
+ const ch = (composerNode.userData['size'] ?? [0, 0.07])[1];
342
+ panel.position.y = 0;
343
+ composerNode.position.y = -(ph / 2 + ch / 2 + 0.02);
344
+ rig.group.add(panel, composerNode);
345
+ }
346
+ /* ───────────────────────────── snapshot sync ────────────────────────── */
347
+ let lastState = null;
348
+ let lastCue = null;
349
+ let cueSeq = 0;
350
+ let agentKey = '';
351
+ /** A host's own agent body, when it supplied `renderAgent`; the default body hides behind it. */
352
+ const drawAgent = (view) => {
353
+ if (r?.renderAgent === undefined) {
354
+ return;
355
+ }
356
+ const key = `${view.state}|${view.presence?.name ?? ''}|${String(cueSeq)}`;
357
+ if (key === agentKey) {
358
+ return;
359
+ }
360
+ agentKey = key;
361
+ const node = named(r.renderAgent({
362
+ theme,
363
+ placement,
364
+ reducedMotion: reduced,
365
+ agent: view,
366
+ embodiment: lastCue,
367
+ expressionClip: expressionClip(view.presence, lastCue),
368
+ }), WORLD_CONTRACT.objects.agent);
369
+ if (node !== agentNode) {
370
+ agentNode?.removeFromParent();
371
+ agentNode = node;
372
+ root.add(node);
373
+ }
374
+ agent.root.visible = false;
375
+ agent.root.name = `${WORLD_CONTRACT.objects.agent}-default`;
376
+ };
377
+ const agentView = (snap) => {
378
+ const view = embodiedAgent(snap, {
379
+ ...(opts.presences === undefined ? {} : { presences: opts.presences }),
380
+ visitorComposing: composer.composing,
381
+ });
382
+ agent.setPresence(view.presence);
383
+ agent.setState(view.state);
384
+ drawAgent(view);
385
+ if (view.state !== lastState) {
386
+ lastState = view.state;
387
+ if (view.described !== null) {
388
+ announce(view.described);
389
+ }
390
+ }
391
+ };
392
+ function sync(snap) {
393
+ if (snap.loaded && !primed) {
394
+ // History is not replayed as speech: only what arrives from here on.
395
+ primed = true;
396
+ for (const m of snap.messages) {
397
+ if (!m.pending) {
398
+ seen.add(m.id);
399
+ }
400
+ }
401
+ const lastCards = [...snap.messages]
402
+ .reverse()
403
+ .find((m) => m.blocks?.blocks.some((b) => b.type === 'card_grid' || b.type === 'card'));
404
+ if (lastCards !== undefined) {
405
+ showGrid(lastCards);
406
+ }
407
+ }
408
+ else if (primed) {
409
+ for (const m of snap.messages) {
410
+ if (m.pending ||
411
+ seen.has(m.id) ||
412
+ m.deletedAt !== null ||
413
+ m.hiddenFromContact ||
414
+ m.kind === 'system_event') {
415
+ continue;
416
+ }
417
+ seen.add(m.id);
418
+ addBubble(m);
419
+ const fromAgent = speakerKind(m) === 'agent';
420
+ if (fromAgent) {
421
+ sound('receive', agent.root);
422
+ announce(m.body);
423
+ const cue = messageEmbodiment(m);
424
+ lastCue = cue;
425
+ cueSeq += 1;
426
+ agent.playExpression(expressionClip(agent.presence, cue));
427
+ if (cue?.lookAt != null) {
428
+ const t = cue.lookAt;
429
+ agent.lookAt(t.target === 'visitor' ? 'visitor' : (anchors.resolve?.(t.ref) ?? null));
430
+ }
431
+ agent.setVisemes(readVisemes(m), now());
432
+ }
433
+ if (m.blocks?.blocks.some((b) => b.type === 'card_grid' || b.type === 'card')) {
434
+ showGrid(m);
435
+ }
436
+ }
437
+ // A streaming reply grows in place.
438
+ for (const b of bubbles) {
439
+ const m = snap.messages.find((x) => x.id === b.messageId);
440
+ if (m !== undefined && m.body !== b.body) {
441
+ const next = bubbleOf(m);
442
+ next.position.copy(b.node.position);
443
+ b.node.parent?.add(next);
444
+ b.node.removeFromParent();
445
+ b.node = next;
446
+ b.body = m.body;
447
+ }
448
+ }
449
+ }
450
+ if (snap.typing !== null && theme.typingLook !== 'none' && theme.typingLook !== 'avatar') {
451
+ if (typing === null) {
452
+ typing = createTyping(theme);
453
+ root.add(typing);
454
+ }
455
+ }
456
+ else if (typing !== null) {
457
+ typing.removeFromParent();
458
+ typing = null;
459
+ }
460
+ agentView(snap);
461
+ redrawPanel(snap);
462
+ }
463
+ const unsubscribe = conversation.subscribe(() => sync(conversation.getSnapshot()));
464
+ rig.group.userData['rig'] = true;
465
+ sync(conversation.getSnapshot());
466
+ /* ───────────────────────────────── frame ────────────────────────────── */
467
+ const activate = (hit) => hit.activate();
468
+ const ndc = new Vector2();
469
+ const world = {
470
+ root,
471
+ capabilities,
472
+ selection,
473
+ agent,
474
+ composer,
475
+ get theme() {
476
+ return theme;
477
+ },
478
+ placement,
479
+ get reducedMotion() {
480
+ return reduced;
481
+ },
482
+ update(dtSeconds) {
483
+ const next = readReduced();
484
+ if (next !== reduced) {
485
+ world.setReducedMotion(next);
486
+ }
487
+ const dt = dtSeconds * 1000;
488
+ const t = now();
489
+ motion.update(dt);
490
+ agent.update(dt, t, camera);
491
+ rig.update(dt, {
492
+ camera,
493
+ reduced,
494
+ agent: agentNode ?? agent.root,
495
+ place: placement.ref === null ? null : (anchors.resolve?.(placement.ref) ?? null),
496
+ wrist: anchors.wrist ?? null,
497
+ });
498
+ for (let i = bubbles.length - 1; i >= 0; i -= 1) {
499
+ const b = bubbles[i];
500
+ if (t - b.bornAt > theme.bubbleDurationMs) {
501
+ b.node.removeFromParent();
502
+ bubbles.splice(i, 1);
503
+ }
504
+ }
505
+ bubbles.forEach((b, slot) => anchorBubble(b.node, b.speaker, camera, bubbles.length - 1 - slot, root));
506
+ if (typing !== null) {
507
+ animateTyping(typing, t, reduced);
508
+ anchorBubble(typing, agentNode ?? agent.root, camera, bubbles.length, root);
509
+ }
510
+ if (grid !== null && !reduced) {
511
+ for (const { node } of grid.nodes.values()) {
512
+ if (node.userData['float'] === true) {
513
+ node.position.y += Math.sin(t / 700 + node.position.x * 3) * 0.0004 * dt;
514
+ }
515
+ }
516
+ }
517
+ },
518
+ pick: (origin, direction) => pickRay(root, origin, direction),
519
+ pickAtPointer(x, y) {
520
+ const ray = new Raycaster();
521
+ ray.setFromCamera(ndc.set(x, y), camera);
522
+ return pickRay(root, ray.ray.origin, ray.ray.direction);
523
+ },
524
+ activate,
525
+ attachController: (c) => attachController(root, c, activate),
526
+ attachGaze: (o) => new Gaze(root, camera, o?.dwellMs ?? 1500, activate),
527
+ setReducedMotion(v) {
528
+ reduced = v;
529
+ motion.reduced = v;
530
+ agent.reduced = v;
531
+ world.setTheme(baseTheme, layers);
532
+ },
533
+ setTheme(th, l) {
534
+ baseTheme = th;
535
+ layers = l ?? layers;
536
+ theme = resolve();
537
+ agent.setTheme(theme);
538
+ ensureFont(theme.fontUrl);
539
+ sync(conversation.getSnapshot());
540
+ if (grid !== null) {
541
+ const m = grid.message;
542
+ showGrid(m);
543
+ }
544
+ },
545
+ setScene(s) {
546
+ scene = s;
547
+ world.setTheme(baseTheme, layers);
548
+ },
549
+ select,
550
+ release,
551
+ cardKeys: () => (grid === null ? [] : [...grid.nodes.keys()]),
552
+ dispose() {
553
+ unsubscribe();
554
+ unbind();
555
+ motion.clear();
556
+ agent.dispose();
557
+ root.removeFromParent();
558
+ root.traverse((o) => {
559
+ const m = o;
560
+ m.geometry?.dispose();
561
+ for (const mat of Array.isArray(m.material)
562
+ ? m.material
563
+ : m.material === undefined
564
+ ? []
565
+ : [m.material]) {
566
+ mat.dispose();
567
+ }
568
+ });
569
+ },
570
+ };
571
+ return world;
572
+ }
573
+ //# sourceMappingURL=world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world.js","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"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"}