@realnation/builder-shared-sdk 1.1.0 → 1.1.2

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/README.md CHANGED
@@ -242,12 +242,6 @@ const result = await uploadOssFile({
242
242
  console.log(result.url);
243
243
  ```
244
244
 
245
-
246
- ## 测试
247
- ```bash
248
- npm run test
249
- ```
250
-
251
245
  ## 🔧 构建
252
246
 
253
247
  ```bash
@@ -26,6 +26,8 @@ export interface ConnectionOptions {
26
26
  require?: HelloMessage['require'];
27
27
  /** Heartbeat period. The client pings; the runtime only ever answers. */
28
28
  heartbeatMs?: number;
29
+ /** Maximum time without a pong before a half-open socket is dropped. */
30
+ heartbeatTimeoutMs?: number;
29
31
  /** Reconnect backoff. Capped so a long outage still retries about twice a minute. */
30
32
  backoffStartMs?: number;
31
33
  backoffMaxMs?: number;
@@ -62,6 +64,7 @@ export declare class WsConnection implements Transport {
62
64
  private binaryHandlers;
63
65
  private stateHandlers;
64
66
  private heartbeatHandle;
67
+ private lastPongAt;
65
68
  private reconnectHandle;
66
69
  private handshakeHandle;
67
70
  private backoffMs;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/runtime/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/runtime/connection.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { RUNTIME_URL } from './protocol.js';
2
2
  const DEFAULTS = {
3
3
  heartbeatMs: 5000,
4
+ heartbeatTimeoutMs: 12000,
4
5
  backoffStartMs: 500,
5
6
  backoffMaxMs: 30000,
6
7
  handshakeTimeoutMs: 8000,
@@ -23,6 +24,7 @@ export class WsConnection {
23
24
  binaryHandlers = new Set();
24
25
  stateHandlers = new Set();
25
26
  heartbeatHandle = null;
27
+ lastPongAt = 0;
26
28
  reconnectHandle = null;
27
29
  handshakeHandle = null;
28
30
  backoffMs;
@@ -35,6 +37,7 @@ export class WsConnection {
35
37
  url: options.url ?? defaultUrl(),
36
38
  client: options.client ?? 'qiksense-web',
37
39
  heartbeatMs: options.heartbeatMs ?? DEFAULTS.heartbeatMs,
40
+ heartbeatTimeoutMs: options.heartbeatTimeoutMs ?? DEFAULTS.heartbeatTimeoutMs,
38
41
  backoffStartMs: options.backoffStartMs ?? DEFAULTS.backoffStartMs,
39
42
  backoffMaxMs: options.backoffMaxMs ?? DEFAULTS.backoffMaxMs,
40
43
  handshakeTimeoutMs: options.handshakeTimeoutMs ?? DEFAULTS.handshakeTimeoutMs,
@@ -109,6 +112,11 @@ export class WsConnection {
109
112
  this.setState('closed');
110
113
  return;
111
114
  }
115
+ // A refused connection may close before onopen, so no handshake timer
116
+ // exists to reject the first connect(). Do not leave a Runner gate or
117
+ // any other caller waiting forever; reconnect remains available for
118
+ // callers that keep this transport alive after observing the failure.
119
+ this.failHandshake(new Error('runtime connection closed before ready'));
112
120
  this.scheduleReconnect();
113
121
  };
114
122
  }
@@ -136,14 +144,23 @@ export class WsConnection {
136
144
  this.pendingHandshake = null;
137
145
  pending?.resolve(msg);
138
146
  }
147
+ if (msg.type === 'pong')
148
+ this.lastPongAt = this.opts.now();
139
149
  for (const fn of this.messageHandlers)
140
150
  fn(msg);
141
151
  }
142
152
  startHeartbeat() {
143
153
  this.stopHeartbeat();
154
+ this.lastPongAt = this.opts.now();
144
155
  const tick = () => {
145
- // Client-initiated only. The runtime never sends ping; a client waiting
146
- // for one would eventually decide a healthy link was dead.
156
+ // Client-initiated only. A ping that merely leaves the browser proves
157
+ // nothing about Runtime or the return path; pong is the liveness proof.
158
+ if (this.opts.now() - this.lastPongAt > this.opts.heartbeatTimeoutMs) {
159
+ this.stopHeartbeat();
160
+ this.dropSocket();
161
+ this.scheduleReconnect();
162
+ return;
163
+ }
147
164
  this.send({ type: 'ping', ts: this.opts.now() });
148
165
  this.heartbeatHandle = this.opts.setTimer(tick, this.opts.heartbeatMs);
149
166
  };
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import type { Transport, ConnectionState } from './connection.js';
11
11
  import type { SilhouetteFrame } from './decode.js';
12
- import type { BodyUpdate, DeviceConnected, DeviceError, GestureUpdate, PointerUpdate, RequestError, RuntimeConfig } from './protocol.js';
12
+ import type { BodyUpdate, DeviceConnected, DeviceError, GestureUpdate, HandGestureUpdate, HandGestureDiagnostic, PointerUpdate, PlayerSilhouetteLost as PlayerSilhouetteLostEvent, RequestError, RuntimeConfig } from './protocol.js';
13
13
  export type Unsubscribe = () => void;
14
14
  export type GestureName = GestureUpdate['gesture'];
15
15
  /** Motion (IMU). Carried as a generic event until the schema grows a definition. */
@@ -64,6 +64,18 @@ export interface CapabilityChange {
64
64
  capabilities: unknown[];
65
65
  lost: unknown[];
66
66
  }
67
+ /** A selected foreground player, not generic depth occupancy. */
68
+ export interface PlayerSilhouetteFrame extends SilhouetteFrame {
69
+ player: {
70
+ id: number;
71
+ distance: number;
72
+ confidence: number;
73
+ };
74
+ }
75
+ export interface PlayerSilhouetteLost {
76
+ reason: PlayerSilhouetteLostEvent['reason'];
77
+ ts: number;
78
+ }
67
79
  /** Aligns skeleton data to the video's playback clock (design/03 §4.5). */
68
80
  export interface VideoAligner {
69
81
  current(): BodyUpdate | null;
@@ -84,9 +96,13 @@ export declare class RuntimeFacade {
84
96
  private disposers;
85
97
  private readonly bodyCh;
86
98
  private readonly gestureCh;
99
+ private readonly handGestureCh;
100
+ private readonly handGestureDiagnosticCh;
87
101
  private readonly gestureByName;
88
102
  private readonly pointerCh;
89
103
  private readonly silhouetteCh;
104
+ private readonly playerSilhouetteCh;
105
+ private readonly playerSilhouetteLostCh;
90
106
  private readonly motionCh;
91
107
  private readonly deviceErrCh;
92
108
  private readonly deviceConnCh;
@@ -95,6 +111,7 @@ export declare class RuntimeFacade {
95
111
  private readonly stateCh;
96
112
  /** Last `device:connected.config` seen. Read-through only — see effectiveConfig. */
97
113
  private lastConfig;
114
+ private lastPlayerSilhouette;
98
115
  private trackedPlayers;
99
116
  private readonly setTimer;
100
117
  private readonly clearTimer;
@@ -134,12 +151,22 @@ export declare class RuntimeFacade {
134
151
  onUpdate: (fn: (g: GestureUpdate) => void) => Unsubscribe;
135
152
  on: (name: GestureName, fn: (g: GestureUpdate) => void) => Unsubscribe;
136
153
  };
154
+ /** Fine-grained fingers/hand-shape events from the optional Hand5 pipeline. */
155
+ readonly handGesture: {
156
+ onUpdate: (fn: (g: HandGestureUpdate) => void) => Unsubscribe;
157
+ onDiagnostic: (fn: (d: HandGestureDiagnostic) => void) => Unsubscribe;
158
+ };
137
159
  readonly pointer: {
138
160
  onUpdate: (fn: (p: PointerUpdate) => void) => Unsubscribe;
139
161
  };
140
162
  readonly silhouette: {
141
163
  onUpdate: (fn: (f: SilhouetteFrame) => void) => Unsubscribe;
142
164
  };
165
+ readonly playerSilhouette: {
166
+ onUpdate: (fn: (f: PlayerSilhouetteFrame) => void) => Unsubscribe;
167
+ onLost: (fn: (lost: PlayerSilhouetteLost) => void) => Unsubscribe;
168
+ current: () => PlayerSilhouetteFrame | null;
169
+ };
143
170
  readonly motion: {
144
171
  onUpdate: (fn: (m: MotionUpdate) => void) => Unsubscribe;
145
172
  };
@@ -1 +1 @@
1
- {"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/runtime/facade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"facade.d.ts","sourceRoot":"","sources":["../../src/runtime/facade.ts"],"names":[],"mappings":"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"}
@@ -38,9 +38,13 @@ export class RuntimeFacade {
38
38
  disposers = [];
39
39
  bodyCh = new Channel();
40
40
  gestureCh = new Channel();
41
+ handGestureCh = new Channel();
42
+ handGestureDiagnosticCh = new Channel();
41
43
  gestureByName = new Map();
42
44
  pointerCh = new Channel();
43
45
  silhouetteCh = new Channel();
46
+ playerSilhouetteCh = new Channel();
47
+ playerSilhouetteLostCh = new Channel();
44
48
  motionCh = new Channel();
45
49
  deviceErrCh = new Channel();
46
50
  deviceConnCh = new Channel();
@@ -49,6 +53,7 @@ export class RuntimeFacade {
49
53
  stateCh = new Channel();
50
54
  /** Last `device:connected.config` seen. Read-through only — see effectiveConfig. */
51
55
  lastConfig = {};
56
+ lastPlayerSilhouette = null;
52
57
  trackedPlayers = new Set();
53
58
  setTimer;
54
59
  clearTimer;
@@ -75,12 +80,32 @@ export class RuntimeFacade {
75
80
  this.gestureByName.get(g.gesture)?.emit(g);
76
81
  break;
77
82
  }
83
+ case 'hand-gesture:update':
84
+ this.handGestureCh.emit(msg);
85
+ break;
86
+ case 'hand-gesture:diagnostic':
87
+ this.handGestureDiagnosticCh.emit(msg);
88
+ break;
78
89
  case 'pointer:update':
79
90
  this.pointerCh.emit(msg);
80
91
  break;
81
92
  case 'depth:silhouette':
82
93
  this.silhouetteCh.emit(decodeSilhouette(msg));
83
94
  break;
95
+ case 'depth:player-silhouette': {
96
+ const raw = msg;
97
+ const frame = decodeSilhouette(raw);
98
+ frame.player = raw.player;
99
+ this.lastPlayerSilhouette = frame;
100
+ this.playerSilhouetteCh.emit(frame);
101
+ break;
102
+ }
103
+ case 'player-silhouette:lost': {
104
+ const raw = msg;
105
+ this.lastPlayerSilhouette = null;
106
+ this.playerSilhouetteLostCh.emit({ reason: raw.reason, ts: raw.ts });
107
+ break;
108
+ }
84
109
  case 'motion:update':
85
110
  this.motionCh.emit(msg);
86
111
  break;
@@ -234,12 +259,22 @@ export class RuntimeFacade {
234
259
  return ch.add(fn);
235
260
  },
236
261
  };
262
+ /** Fine-grained fingers/hand-shape events from the optional Hand5 pipeline. */
263
+ handGesture = {
264
+ onUpdate: (fn) => this.handGestureCh.add(fn),
265
+ onDiagnostic: (fn) => this.handGestureDiagnosticCh.add(fn),
266
+ };
237
267
  pointer = {
238
268
  onUpdate: (fn) => this.pointerCh.add(fn),
239
269
  };
240
270
  silhouette = {
241
271
  onUpdate: (fn) => this.silhouetteCh.add(fn),
242
272
  };
273
+ playerSilhouette = {
274
+ onUpdate: (fn) => this.playerSilhouetteCh.add(fn),
275
+ onLost: (fn) => this.playerSilhouetteLostCh.add(fn),
276
+ current: () => this.lastPlayerSilhouette,
277
+ };
243
278
  motion = {
244
279
  onUpdate: (fn) => this.motionCh.add(fn),
245
280
  };
@@ -256,6 +291,12 @@ export class RuntimeFacade {
256
291
  * callers get a MediaStream.
257
292
  */
258
293
  async openStream() {
294
+ // A Runtime session has one colour-stream receiver. Replacing an active
295
+ // receiver would silently freeze the first consumer, so callers must
296
+ // explicitly release it with camera.stopStream() before another component
297
+ // can acquire the stream.
298
+ if (this.pc)
299
+ throw new Error('camera stream is already in use');
259
300
  const RTC = globalThis.RTCPeerConnection;
260
301
  if (!RTC)
261
302
  throw new Error('WebRTC is not available in this environment');
@@ -263,6 +304,24 @@ export class RuntimeFacade {
263
304
  this.pc = pc;
264
305
  pc.addTransceiver('video', { direction: 'recvonly' });
265
306
  const stream = new MediaStream();
307
+ let remoteDescriptionApplied = false;
308
+ const pendingRemoteIce = [];
309
+ const addRemoteIce = async (candidate) => {
310
+ if (!candidate)
311
+ return;
312
+ await pc.addIceCandidate({ candidate, sdpMid: '0' });
313
+ };
314
+ // camera:ice is intentionally an event rather than a response: host ICE
315
+ // gathering can happen while camera.offer is still awaiting its answer.
316
+ const offRemoteIce = this.transport.onMessage((raw) => {
317
+ const msg = raw;
318
+ if (msg.type !== 'camera:ice' || typeof msg.candidate !== 'string' || !msg.candidate)
319
+ return;
320
+ if (!remoteDescriptionApplied)
321
+ pendingRemoteIce.push(msg.candidate);
322
+ else
323
+ void addRemoteIce(msg.candidate).catch(() => { });
324
+ });
266
325
  const track = new Promise((resolve) => {
267
326
  pc.ontrack = (ev) => {
268
327
  stream.addTrack(ev.track);
@@ -271,19 +330,38 @@ export class RuntimeFacade {
271
330
  });
272
331
  pc.onicecandidate = (ev) => {
273
332
  if (ev.candidate) {
274
- void this.#request('camera.ice', { candidate: ev.candidate.toJSON() }).catch(() => {
333
+ void this.#request('camera.ice', { candidate: ev.candidate.candidate }).catch(() => {
275
334
  /* trickle ICE is best-effort; the offer/answer already carries host candidates */
276
335
  });
277
336
  }
337
+ else {
338
+ void this.#request('camera.ice', { done: true }).catch(() => { });
339
+ }
278
340
  };
279
- const offer = await pc.createOffer();
280
- await pc.setLocalDescription(offer);
281
- const res = await this.#request('camera.offer', { sdp: offer.sdp, type: offer.type });
282
- await pc.setRemoteDescription({
283
- type: 'answer',
284
- sdp: res.sdp,
285
- });
286
- return track;
341
+ try {
342
+ const offer = await pc.createOffer();
343
+ await pc.setLocalDescription(offer);
344
+ const res = await this.#request('camera.offer', {
345
+ sdp: offer.sdp, type: offer.type, stream: 'color', transport: 'webrtc-h264',
346
+ });
347
+ if (typeof res.sdp !== 'string' || !res.sdp)
348
+ throw new Error('camera.offer returned no SDP answer');
349
+ await pc.setRemoteDescription({ type: 'answer', sdp: res.sdp });
350
+ remoteDescriptionApplied = true;
351
+ while (pendingRemoteIce.length)
352
+ await addRemoteIce(pendingRemoteIce.shift());
353
+ return await track;
354
+ }
355
+ catch (error) {
356
+ if (this.pc === pc)
357
+ this.closeStream();
358
+ throw error;
359
+ }
360
+ finally {
361
+ // The connection-level dispatcher remains installed; this one exists
362
+ // only to bridge this particular PeerConnection's ICE lifecycle.
363
+ offRemoteIce();
364
+ }
287
365
  }
288
366
  closeStream() {
289
367
  this.pc?.close();
@@ -35,8 +35,8 @@ export type { ConnectStatus } from './capability.js';
35
35
  export { decodeSilhouette, parseBinaryFrame, fnv1a64, binaryCorrelationId, QSBN_HEADER_BYTES } from './decode.js';
36
36
  export type { SilhouetteFrame, BinaryFrame } from './decode.js';
37
37
  export { RuntimeCommandError } from './facade.js';
38
- export type { Unsubscribe, GestureName, MotionUpdate, SnapshotResult, DeviceInfo, RuntimeStatus, CameraConfig, CapabilityChange, VideoAligner, } from './facade.js';
38
+ export type { Unsubscribe, GestureName, MotionUpdate, SnapshotResult, DeviceInfo, RuntimeStatus, CameraConfig, CapabilityChange, VideoAligner, PlayerSilhouetteFrame, PlayerSilhouetteLost, } from './facade.js';
39
39
  export type { ConnectionState, ConnectionOptions, Transport } from './connection.js';
40
- export type { BodyUpdate, Capability, CapabilityMiss, CalibBox, DepthSilhouette, DeviceConnected, DeviceError, GestureUpdate, HelloMessage, Joint, PointerUpdate, ReadyMessage, RequestError, RequestName, RuntimeConfig, RuntimeNamespace, ServerMessage, Timestamp, } from './protocol.js';
40
+ export type { BodyUpdate, Capability, CapabilityMiss, CalibBox, DepthSilhouette, DeviceConnected, DeviceError, GestureUpdate, HandGestureUpdate, HandGestureDiagnostic, HelloMessage, Joint, PointerUpdate, PlayerSilhouette, PlayerSilhouetteLost as PlayerSilhouetteLostEvent, ReadyMessage, RequestError, RequestName, RuntimeConfig, RuntimeNamespace, ServerMessage, Timestamp, } from './protocol.js';
41
41
  export { SCHEMA_HASH, RUNTIME_URL, GRID_W, GRID_H } from './protocol.js';
42
42
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC;IAC9E,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,OAAQ,SAAQ,aAAa;IACxC,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB;IAO5D;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAMvC,iEAAiE;IACjE,IAAI,aAAa,IAAI,aAAa,GAAG,IAAI,CAExC;IAED,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,KAAK,IAAI,IAAI;CAId;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAazE;AAMD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClH,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrF,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,eAAe,EACf,eAAe,EACf,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC;IAC9E,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,OAAQ,SAAQ,aAAa;IACxC,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA8B;gBAE3C,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,iBAAiB;IAO5D;;;;;;OAMG;IACG,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;IAMvC,iEAAiE;IACjE,IAAI,aAAa,IAAI,aAAa,GAAG,IAAI,CAExC;IAED,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,KAAK,IAAI,IAAI;CAId;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAazE;AAMD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAClH,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrF,YAAY,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,eAAe,EACf,eAAe,EACf,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,oBAAoB,IAAI,yBAAyB,EACjD,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
@@ -43,6 +43,7 @@ export declare class MockTransport implements Transport {
43
43
  private makeBody;
44
44
  private makePointer;
45
45
  private makeSilhouette;
46
+ private makePlayerSilhouette;
46
47
  send(msg: ClientMessage): void;
47
48
  private answer;
48
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,EAEV,UAAU,EACV,aAAa,EAGb,YAAY,EAGZ,YAAY,EAGZ,aAAa,EACd,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,QAAQ,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAQD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CACuB;IAC5C,sEAAsE;IACtE,aAAa,SAAK;gBAEN,OAAO,GAAE,WAAgB;IAYrC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,OAAO,CAAC,QAAQ;IAMhB,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IA4ChC,OAAO,CAAC,QAAQ;IAShB,kFAAkF;IAClF,IAAI,IAAI,IAAI;IAsBZ,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,cAAc;IA2BtB,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAsB9B,OAAO,CAAC,MAAM;IA4Bd;;;OAGG;IACH,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAI9B,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrD,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAKlD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,KAAK,IAAI,IAAI;CAOd"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,EAEV,UAAU,EACV,aAAa,EAIb,YAAY,EAIZ,YAAY,EAGZ,aAAa,EACd,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,QAAQ,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAQD,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,eAAe,CAAyC;IAChE,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CACuB;IAC5C,sEAAsE;IACtE,aAAa,SAAK;gBAEN,OAAO,GAAE,WAAgB;IAYrC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,OAAO,CAAC,QAAQ;IAMhB,OAAO,IAAI,OAAO,CAAC,YAAY,CAAC;IA4ChC,OAAO,CAAC,QAAQ;IAShB,kFAAkF;IAClF,IAAI,IAAI,IAAI;IAmCZ,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,oBAAoB;IAQ5B,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAsB9B,OAAO,CAAC,MAAM;IA4Bd;;;OAGG;IACH,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAI9B,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrD,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAKlD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAK3D,KAAK,IAAI,IAAI;CAOd"}
@@ -92,7 +92,10 @@ export class MockTransport {
92
92
  this.emit(this.makePointer(t, ts));
93
93
  // A gesture every two seconds, alternating, so handlers get exercised.
94
94
  if (this.frame % (this.opts.fps * 2) === 0) {
95
- const gestures = ['raise_left', 'raise_right', 'jump', 'wave'];
95
+ const gestures = [
96
+ 'raise_left', 'raise_right', 'jump', 'squat', 'wave',
97
+ 'swipe_left', 'swipe_right', 'push_left', 'push_right',
98
+ ];
96
99
  this.emit({
97
100
  type: 'gesture:update',
98
101
  player: 0,
@@ -100,8 +103,17 @@ export class MockTransport {
100
103
  ts,
101
104
  });
102
105
  }
103
- if (this.frame % 3 === 0)
106
+ if (this.frame % this.opts.fps === 0 && this.opts.require?.capabilities?.some((c) => c.name === 'hand-gesture')) {
107
+ const shapes = ['fist', 'one', 'two', 'three', 'four', 'five', 'six', 'eight', 'victory', 'ok', 'thumb_up', 'thumb_down', 'i_love_you'];
108
+ this.emit({ type: 'hand-gesture:update', player: 0, side: 'right',
109
+ gesture: shapes[(this.frame / this.opts.fps) % shapes.length | 0], confidence: .9, ts });
110
+ }
111
+ if (this.frame % 3 === 0) {
104
112
  this.emit(this.makeSilhouette(t, ts));
113
+ if (this.opts.require?.capabilities?.some((c) => c.name === 'player-silhouette')) {
114
+ this.emit(this.makePlayerSilhouette(t, ts));
115
+ }
116
+ }
105
117
  }
106
118
  makeBody(t, ts) {
107
119
  const sway = Math.sin(t * 0.7) * 0.08;
@@ -157,6 +169,13 @@ export class MockTransport {
157
169
  ts,
158
170
  };
159
171
  }
172
+ makePlayerSilhouette(t, ts) {
173
+ const legacy = this.makeSilhouette(t, ts);
174
+ return {
175
+ type: 'depth:player-silhouette', w: legacy.w, h: legacy.h, mask: legacy.mask,
176
+ coverage: legacy.coverage ?? 0, player: { id: 1, distance: 2.0, confidence: 0.9 }, ts,
177
+ };
178
+ }
160
179
  send(msg) {
161
180
  if (msg.type === 'ping') {
162
181
  this.pingsReceived++;
@@ -2,7 +2,7 @@
2
2
  * QikSense Runtime protocol types.
3
3
  *
4
4
  * @generated from protocol/*.schema.json — DO NOT EDIT BY HAND.
5
- * schema-hash: 608c0091
5
+ * schema-hash: aa98328f
6
6
  *
7
7
  * Regenerate with: node protocol/generate.mjs
8
8
  *
@@ -11,7 +11,7 @@
11
11
  * copy has fallen behind the schemas.
12
12
  */
13
13
  /** Hash of the schema inputs this file was generated from. */
14
- export declare const SCHEMA_HASH = "608c0091";
14
+ export declare const SCHEMA_HASH = "aa98328f";
15
15
  /** Default local endpoint. https pages must use wss to avoid mixed-content blocking. */
16
16
  export declare const RUNTIME_URL = "ws://127.0.0.1:17872";
17
17
  /** Silhouette grid geometry. Must match qs_silhouette_v1 in qs_data_abi.h. */
@@ -73,8 +73,35 @@ export interface RuntimeNamespace {
73
73
  maxDistanceM?: number;
74
74
  calibBox?: CalibBox;
75
75
  gain?: number;
76
+ /** Ignore tiny normalized pointer movements to suppress stationary jitter. */
77
+ deadZone?: number;
78
+ /** Predict pointer position forward by this duration to compensate latency. */
79
+ predictMs?: number;
80
+ /** Hands eligible to produce Pointer updates. */
81
+ pointerHands?: "left" | "right" | "both";
82
+ /** Normalized-coordinate speed that enters the Pointer stroke state. */
83
+ pointerOnSpeed?: number;
84
+ /** Normalized-coordinate speed that releases the Pointer stroke state. */
85
+ pointerOffSpeed?: number;
76
86
  smoothing?: "none" | "ema" | "oneEuro";
77
87
  lockPolicy?: "nearest" | "largest" | "first";
88
+ /** RTMDet-gated single-player depth foreground. Other detected people are candidates, not automatic interruptions. */
89
+ playerSilhouette?: {
90
+ roi?: {
91
+ x?: number;
92
+ y?: number;
93
+ width?: number;
94
+ height?: number;
95
+ };
96
+ minDistance?: number;
97
+ maxDistance?: number;
98
+ bandWidth?: number;
99
+ minAreaRatio?: number;
100
+ lostFrames?: number;
101
+ maxCandidates?: number;
102
+ lockGraceFrames?: number;
103
+ selection?: "lock-nearest-center" | "nearest" | "largest" | "first";
104
+ };
78
105
  }
79
106
  /**
80
107
  * Physical region mapped onto the 0..1 game plane. Owned by the runtime namespace because the runtime is what computes Pointer.
@@ -115,7 +142,28 @@ export interface BodyUpdate {
115
142
  export interface GestureUpdate {
116
143
  type: "gesture:update";
117
144
  player: number;
118
- gesture: "raise_left" | "raise_right" | "jump" | "squat" | "wave" | "swipe" | "push";
145
+ gesture: "raise_left" | "raise_right" | "jump" | "squat" | "wave" | "swipe_left" | "swipe_right" | "push_left" | "push_right";
146
+ ts: Timestamp;
147
+ }
148
+ /**
149
+ * Fine-grained static hand gesture from Hand5 landmarks. Side is the subject's unmirrored view.
150
+ */
151
+ export interface HandGestureUpdate {
152
+ type: "hand-gesture:update";
153
+ player: number;
154
+ side: "left" | "right";
155
+ gesture: "fist" | "one" | "two" | "three" | "four" | "five" | "six" | "eight" | "victory" | "ok" | "thumb_up" | "thumb_down" | "i_love_you";
156
+ confidence: number;
157
+ ts: Timestamp;
158
+ }
159
+ /**
160
+ * One-Hz health counter for the optional Hand5 pipeline; intended for the SDK lab, not gameplay.
161
+ */
162
+ export interface HandGestureDiagnostic {
163
+ type: "hand-gesture:diagnostic";
164
+ inferences: number;
165
+ classified: number;
166
+ stable: number;
119
167
  ts: Timestamp;
120
168
  }
121
169
  /**
@@ -148,6 +196,27 @@ export interface DepthSilhouette {
148
196
  farthest?: number;
149
197
  ts: Timestamp;
150
198
  }
199
+ /**
200
+ * A single selected foreground player, not generic depth occupancy.
201
+ */
202
+ export interface PlayerSilhouette {
203
+ type: "depth:player-silhouette";
204
+ w: number;
205
+ h: number;
206
+ mask: string;
207
+ coverage: number;
208
+ player: {
209
+ id: number;
210
+ distance: number;
211
+ confidence: number;
212
+ };
213
+ ts: Timestamp;
214
+ }
215
+ export interface PlayerSilhouetteLost {
216
+ type: "player-silhouette:lost";
217
+ reason: "NO_FOREGROUND" | "TOO_SMALL" | "AMBIGUOUS" | "OUT_OF_ROI";
218
+ ts: Timestamp;
219
+ }
151
220
  export interface DeviceConnected {
152
221
  type: "device:connected";
153
222
  device: string;
@@ -162,6 +231,18 @@ export interface DeviceError {
162
231
  code: "NO_DEVICE" | "NO_TRACKER" | "START_FAILED" | "CAPABILITY_CONFLICT";
163
232
  message?: string;
164
233
  }
234
+ /**
235
+ * Runtime-only capability change: a device was unplugged, or another client took an exclusive one. Never sent during the handshake — that is what `ready` is for. Two phases, two paths, no overlap (design/02 §3.1).
236
+ */
237
+ export interface CapabilityChanged {
238
+ type: "capability:changed";
239
+ /** The COMPLETE capability set after the change, not a delta. A client can replace its state wholesale instead of reconciling, which is what keeps it correct after a missed message. */
240
+ capabilities: Capability[];
241
+ /** What went away and why. Same reason vocabulary as the handshake, so a client has one mapping from reason to on-screen message rather than two. */
242
+ lost?: CapabilityMiss[];
243
+ /** Capabilities that became available — a device plugged back in. Present so recovery is an event too, not something a client discovers by reconnecting. */
244
+ gained?: Capability[];
245
+ }
165
246
  /**
166
247
  * Client-initiated only. The runtime answers pong and never sends ping; a client waiting for a server ping would decide the link is dead.
167
248
  */
@@ -181,7 +262,7 @@ export type Timestamp = number;
181
262
  * A named capability with a version and capability-specific params. Params matter: an experience needing leftHand cannot tell from the name alone whether a body-tracking plugin supplies it.
182
263
  */
183
264
  export interface Capability {
184
- name: "body-tracking" | "hand-tracking" | "face-tracking" | "pointer" | "gesture" | "imu" | "depth" | "depth-silhouette" | "camera-stream";
265
+ name: "body-tracking" | "hand-tracking" | "hand-gesture" | "face-tracking" | "pointer" | "gesture" | "imu" | "depth" | "depth-silhouette" | "player-silhouette" | "camera-stream";
185
266
  version?: number;
186
267
  params?: Record<string, unknown>;
187
268
  /** When absent this capability does not block startup; it is reported in ready.unsatisfied instead. */
@@ -203,6 +284,8 @@ export interface HelloMessage {
203
284
  /** Clients declare capabilities, never plugin names — that is what keeps Builder and Runner independent of any vendor. */
204
285
  require?: {
205
286
  capabilities?: Capability[];
287
+ /** Optional provider ordering hint. A provider that cannot satisfy the request must fall back to another real provider. */
288
+ preferPlugin?: string;
206
289
  config?: Record<string, unknown>;
207
290
  };
208
291
  }
@@ -222,7 +305,7 @@ export interface ReadyMessage {
222
305
  }
223
306
  /** Anything the runtime sends. The trailing member keeps forward-compatibility:
224
307
  * an older client must ignore unknown types rather than fail. */
225
- export type ServerMessage = ReadyMessage | BodyUpdate | GestureUpdate | PointerUpdate | DepthSilhouette | DeviceConnected | DeviceError | Pong | ResponseMessage | {
308
+ export type ServerMessage = ReadyMessage | BodyUpdate | GestureUpdate | PointerUpdate | HandGestureUpdate | HandGestureDiagnostic | DepthSilhouette | PlayerSilhouette | PlayerSilhouetteLost | DeviceConnected | DeviceError | Pong | ResponseMessage | CapabilityChanged | {
226
309
  type: string;
227
310
  [k: string]: unknown;
228
311
  };
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/runtime/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/runtime/protocol.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * QikSense Runtime protocol types.
3
3
  *
4
4
  * @generated from protocol/*.schema.json — DO NOT EDIT BY HAND.
5
- * schema-hash: 608c0091
5
+ * schema-hash: aa98328f
6
6
  *
7
7
  * Regenerate with: node protocol/generate.mjs
8
8
  *
@@ -11,7 +11,7 @@
11
11
  * copy has fallen behind the schemas.
12
12
  */
13
13
  /** Hash of the schema inputs this file was generated from. */
14
- export const SCHEMA_HASH = '608c0091';
14
+ export const SCHEMA_HASH = 'aa98328f';
15
15
  /** Default local endpoint. https pages must use wss to avoid mixed-content blocking. */
16
16
  export const RUNTIME_URL = 'ws://127.0.0.1:17872';
17
17
  /** Silhouette grid geometry. Must match qs_silhouette_v1 in qs_data_abi.h. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@realnation/builder-shared-sdk",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "exports": {