@laplace.live/persona-sdk 0.0.1
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/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/client.d.ts +95 -0
- package/dist/client.js +312 -0
- package/dist/envelope.d.ts +54 -0
- package/dist/envelope.js +71 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.js +32 -0
- package/dist/events.d.ts +42 -0
- package/dist/events.js +16 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/methods.d.ts +579 -0
- package/dist/methods.js +1 -0
- package/dist/protocol.d.ts +11 -0
- package/dist/protocol.js +12 -0
- package/dist/schemas.d.ts +189 -0
- package/dist/schemas.js +92 -0
- package/dist/types.d.ts +390 -0
- package/dist/types.js +32 -0
- package/package.json +44 -0
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { HotkeyState, ModelFormat, PoseStatus, SceneState, Settings, TrackingStatus } from './types.ts';
|
|
2
|
+
/** Every push event a session can subscribe to, with its payload. */
|
|
3
|
+
export interface EventMap {
|
|
4
|
+
/** Any scene mutation: create/delete/rename/activate/shortcut and persisted scene edits. */
|
|
5
|
+
'scene.changed': SceneState;
|
|
6
|
+
'settings.changed': {
|
|
7
|
+
settings: Settings;
|
|
8
|
+
};
|
|
9
|
+
'hotkey.state': {
|
|
10
|
+
modelId: string | null;
|
|
11
|
+
config: HotkeyState;
|
|
12
|
+
};
|
|
13
|
+
'tracking.status': {
|
|
14
|
+
tracking: TrackingStatus;
|
|
15
|
+
pose: PoseStatus;
|
|
16
|
+
};
|
|
17
|
+
/** A model instance finished loading on stage. */
|
|
18
|
+
'instance.loaded': {
|
|
19
|
+
instanceId: string;
|
|
20
|
+
format: ModelFormat;
|
|
21
|
+
};
|
|
22
|
+
'expression.changed': {
|
|
23
|
+
instanceId: string;
|
|
24
|
+
active: string[];
|
|
25
|
+
};
|
|
26
|
+
'motion.started': {
|
|
27
|
+
instanceId: string;
|
|
28
|
+
group: string;
|
|
29
|
+
index: number;
|
|
30
|
+
};
|
|
31
|
+
'motion.ended': {
|
|
32
|
+
instanceId: string;
|
|
33
|
+
};
|
|
34
|
+
/** True while a scene apply or pipeline warm-up is in flight. */
|
|
35
|
+
'scene.loading': {
|
|
36
|
+
loading: boolean;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export type EventName = keyof EventMap;
|
|
40
|
+
export type EventData<E extends EventName = EventName> = EventMap[E];
|
|
41
|
+
export declare const EVENT_NAMES: readonly EventName[];
|
|
42
|
+
export declare function isEventName(v: unknown): v is EventName;
|
package/dist/events.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Built from a `Record<EventName, …>` so a new EventMap key that is missing
|
|
2
|
+
// here fails the build instead of silently failing `isEventName`.
|
|
3
|
+
export const EVENT_NAMES = Object.keys({
|
|
4
|
+
'scene.changed': true,
|
|
5
|
+
'settings.changed': true,
|
|
6
|
+
'hotkey.state': true,
|
|
7
|
+
'tracking.status': true,
|
|
8
|
+
'instance.loaded': true,
|
|
9
|
+
'expression.changed': true,
|
|
10
|
+
'motion.started': true,
|
|
11
|
+
'motion.ended': true,
|
|
12
|
+
'scene.loading': true,
|
|
13
|
+
});
|
|
14
|
+
export function isEventName(v) {
|
|
15
|
+
return typeof v === 'string' && EVENT_NAMES.includes(v);
|
|
16
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import type { EventName } from './events.ts';
|
|
2
|
+
import type { AnchorOption, AssetKind, AssetRef, Attach, Expression, ExpressionPersistence, HotkeyConfig, HotkeyState, InjectEntry, InjectTarget, InstanceRuntime, ModelInfo, ModelRef, MotionGroup, MToonTuning, ObjectContent, ObjectLightOverride, ObjectSpace, Place2D, Place3D, PlayingMotion, PoseSourceId, PoseStatus, Scene, SceneItem, ScenePatch, SceneState, ScreenPlacement, Settings, SettingsPatch, TrackingSourceId, TrackingStatus, VrmPlacement } from './types.ts';
|
|
3
|
+
/** Marker for methods that take no parameters; the client lets you omit the argument. */
|
|
4
|
+
export type EmptyRequest = Record<never, never>;
|
|
5
|
+
/** Marker for methods whose success response carries no data. */
|
|
6
|
+
export type EmptyResponse = Record<never, never>;
|
|
7
|
+
export type SceneListRequest = EmptyRequest;
|
|
8
|
+
export type SceneListResponse = SceneState;
|
|
9
|
+
/** Omitting `sceneId` reads the active scene. */
|
|
10
|
+
export interface SceneGetRequest {
|
|
11
|
+
sceneId?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SceneGetResponse {
|
|
14
|
+
scene: Scene;
|
|
15
|
+
}
|
|
16
|
+
export interface SceneActivateRequest {
|
|
17
|
+
sceneId: string;
|
|
18
|
+
}
|
|
19
|
+
export type SceneActivateResponse = SceneState;
|
|
20
|
+
export type SceneCreateRequest = EmptyRequest;
|
|
21
|
+
export type SceneCreateResponse = SceneState;
|
|
22
|
+
export interface SceneDuplicateRequest {
|
|
23
|
+
sceneId: string;
|
|
24
|
+
}
|
|
25
|
+
export type SceneDuplicateResponse = SceneState;
|
|
26
|
+
export interface SceneRenameRequest {
|
|
27
|
+
sceneId: string;
|
|
28
|
+
name: string;
|
|
29
|
+
}
|
|
30
|
+
export type SceneRenameResponse = SceneState;
|
|
31
|
+
export interface SceneDeleteRequest {
|
|
32
|
+
sceneId: string;
|
|
33
|
+
}
|
|
34
|
+
export type SceneDeleteResponse = SceneState;
|
|
35
|
+
export interface SceneSetShortcutRequest {
|
|
36
|
+
sceneId: string;
|
|
37
|
+
/** Electron accelerator string, or null to clear. */
|
|
38
|
+
accelerator: string | null;
|
|
39
|
+
}
|
|
40
|
+
export type SceneSetShortcutResponse = SceneState;
|
|
41
|
+
export type ScenePatchRequest = ScenePatch;
|
|
42
|
+
export interface ScenePatchResponse {
|
|
43
|
+
scene: Scene;
|
|
44
|
+
}
|
|
45
|
+
export type InstanceListRequest = EmptyRequest;
|
|
46
|
+
export interface InstanceListResponse {
|
|
47
|
+
instances: InstanceRuntime[];
|
|
48
|
+
}
|
|
49
|
+
export interface InstanceGetRequest {
|
|
50
|
+
instanceId?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface InstanceGetResponse {
|
|
53
|
+
item: SceneItem;
|
|
54
|
+
runtime: InstanceRuntime;
|
|
55
|
+
}
|
|
56
|
+
export interface InstanceAddRequest {
|
|
57
|
+
modelId: string;
|
|
58
|
+
}
|
|
59
|
+
export interface InstanceAddResponse {
|
|
60
|
+
instanceId: string;
|
|
61
|
+
}
|
|
62
|
+
export interface InstanceRemoveRequest {
|
|
63
|
+
instanceId: string;
|
|
64
|
+
}
|
|
65
|
+
export type InstanceRemoveResponse = EmptyResponse;
|
|
66
|
+
export interface InstanceSetVisibleRequest {
|
|
67
|
+
instanceId: string;
|
|
68
|
+
visible: boolean;
|
|
69
|
+
}
|
|
70
|
+
export type InstanceSetVisibleResponse = EmptyResponse;
|
|
71
|
+
export interface InstanceReorderRequest {
|
|
72
|
+
/** Full z-order within the scene; ids not listed keep their relative order at the end. */
|
|
73
|
+
orderedInstanceIds: string[];
|
|
74
|
+
}
|
|
75
|
+
export type InstanceReorderResponse = EmptyResponse;
|
|
76
|
+
export interface InstanceSetPrimaryRequest {
|
|
77
|
+
instanceId: string;
|
|
78
|
+
}
|
|
79
|
+
export type InstanceSetPrimaryResponse = EmptyResponse;
|
|
80
|
+
export interface InstanceSetPlacementRequest {
|
|
81
|
+
instanceId?: string;
|
|
82
|
+
live2d?: Partial<ScreenPlacement>;
|
|
83
|
+
vrm?: Partial<VrmPlacement>;
|
|
84
|
+
}
|
|
85
|
+
export type InstanceSetPlacementResponse = EmptyResponse;
|
|
86
|
+
export interface InstanceSetMToonRequest {
|
|
87
|
+
instanceId?: string;
|
|
88
|
+
tuning: Partial<MToonTuning>;
|
|
89
|
+
}
|
|
90
|
+
export type InstanceSetMToonResponse = EmptyResponse;
|
|
91
|
+
export interface InstanceSetIdleRequest {
|
|
92
|
+
instanceId?: string;
|
|
93
|
+
idleAnimation?: boolean;
|
|
94
|
+
idleClip?: string;
|
|
95
|
+
}
|
|
96
|
+
export type InstanceSetIdleResponse = EmptyResponse;
|
|
97
|
+
export interface InstanceInfoRequest {
|
|
98
|
+
instanceId?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface InstanceInfoResponse {
|
|
101
|
+
info: ModelInfo;
|
|
102
|
+
}
|
|
103
|
+
export interface ObjectAddRequest {
|
|
104
|
+
content: ObjectContent;
|
|
105
|
+
name?: string;
|
|
106
|
+
}
|
|
107
|
+
export interface ObjectAddResponse {
|
|
108
|
+
instanceId: string;
|
|
109
|
+
}
|
|
110
|
+
export interface ObjectRenameRequest {
|
|
111
|
+
instanceId: string;
|
|
112
|
+
name: string;
|
|
113
|
+
}
|
|
114
|
+
export type ObjectRenameResponse = EmptyResponse;
|
|
115
|
+
export interface ObjectSetContentRequest {
|
|
116
|
+
instanceId: string;
|
|
117
|
+
content: ObjectContent;
|
|
118
|
+
}
|
|
119
|
+
export type ObjectSetContentResponse = EmptyResponse;
|
|
120
|
+
export interface ObjectSetSpaceRequest {
|
|
121
|
+
instanceId: string;
|
|
122
|
+
space: ObjectSpace;
|
|
123
|
+
}
|
|
124
|
+
export type ObjectSetSpaceResponse = EmptyResponse;
|
|
125
|
+
export interface ObjectSetPlacementRequest {
|
|
126
|
+
instanceId: string;
|
|
127
|
+
place2d?: Partial<Place2D>;
|
|
128
|
+
place3d?: Partial<Place3D>;
|
|
129
|
+
}
|
|
130
|
+
export type ObjectSetPlacementResponse = EmptyResponse;
|
|
131
|
+
export interface ObjectAttachRequest {
|
|
132
|
+
instanceId: string;
|
|
133
|
+
/** Null detaches. */
|
|
134
|
+
attach: Attach | null;
|
|
135
|
+
}
|
|
136
|
+
export type ObjectAttachResponse = EmptyResponse;
|
|
137
|
+
export interface ObjectSetLightOverridesRequest {
|
|
138
|
+
instanceId: string;
|
|
139
|
+
overrides: Record<string, ObjectLightOverride>;
|
|
140
|
+
}
|
|
141
|
+
export type ObjectSetLightOverridesResponse = EmptyResponse;
|
|
142
|
+
export interface ObjectAnchorsRequest {
|
|
143
|
+
parentInstanceId: string;
|
|
144
|
+
}
|
|
145
|
+
/** Anchors a loaded model offers for attachment. */
|
|
146
|
+
export interface ObjectAnchorsResponse {
|
|
147
|
+
anchors: AnchorOption[];
|
|
148
|
+
}
|
|
149
|
+
export interface ExpressionListRequest {
|
|
150
|
+
instanceId?: string;
|
|
151
|
+
}
|
|
152
|
+
export interface ExpressionListResponse {
|
|
153
|
+
expressions: Expression[];
|
|
154
|
+
}
|
|
155
|
+
export interface ExpressionActiveRequest {
|
|
156
|
+
instanceId?: string;
|
|
157
|
+
}
|
|
158
|
+
export interface ExpressionActiveResponse {
|
|
159
|
+
active: string[];
|
|
160
|
+
}
|
|
161
|
+
export interface ExpressionToggleRequest {
|
|
162
|
+
instanceId?: string;
|
|
163
|
+
name: string;
|
|
164
|
+
}
|
|
165
|
+
export interface ExpressionToggleResponse {
|
|
166
|
+
active: string[];
|
|
167
|
+
}
|
|
168
|
+
export interface ExpressionGetPersistenceRequest {
|
|
169
|
+
modelId?: string;
|
|
170
|
+
}
|
|
171
|
+
export type ExpressionGetPersistenceResponse = ExpressionPersistence;
|
|
172
|
+
export interface ExpressionSetPersistenceRequest {
|
|
173
|
+
modelId?: string;
|
|
174
|
+
enabled: boolean;
|
|
175
|
+
}
|
|
176
|
+
export type ExpressionSetPersistenceResponse = ExpressionPersistence;
|
|
177
|
+
export interface MotionListRequest {
|
|
178
|
+
instanceId?: string;
|
|
179
|
+
}
|
|
180
|
+
export interface MotionListResponse {
|
|
181
|
+
groups: MotionGroup[];
|
|
182
|
+
}
|
|
183
|
+
export interface MotionPlayRequest {
|
|
184
|
+
instanceId?: string;
|
|
185
|
+
group: string;
|
|
186
|
+
index: number;
|
|
187
|
+
}
|
|
188
|
+
export type MotionPlayResponse = EmptyResponse;
|
|
189
|
+
export interface MotionPlayingRequest {
|
|
190
|
+
instanceId?: string;
|
|
191
|
+
}
|
|
192
|
+
export interface MotionPlayingResponse {
|
|
193
|
+
playing: PlayingMotion | null;
|
|
194
|
+
}
|
|
195
|
+
export interface HotkeyListRequest {
|
|
196
|
+
modelId?: string;
|
|
197
|
+
}
|
|
198
|
+
export type HotkeyListResponse = HotkeyState;
|
|
199
|
+
export interface HotkeySetRequest {
|
|
200
|
+
modelId?: string;
|
|
201
|
+
/** Healed leniently server-side: malformed entries drop, missing ids are minted. */
|
|
202
|
+
config: HotkeyConfig;
|
|
203
|
+
}
|
|
204
|
+
export type HotkeySetResponse = HotkeyState;
|
|
205
|
+
export interface HotkeyTriggerRequest {
|
|
206
|
+
hotkeyId: string;
|
|
207
|
+
}
|
|
208
|
+
export type HotkeyTriggerResponse = EmptyResponse;
|
|
209
|
+
export type ModelListRequest = EmptyRequest;
|
|
210
|
+
export interface ModelListResponse {
|
|
211
|
+
models: ModelRef[];
|
|
212
|
+
}
|
|
213
|
+
export type AssetListRequest = EmptyRequest;
|
|
214
|
+
export interface AssetListResponse {
|
|
215
|
+
assets: AssetRef[];
|
|
216
|
+
}
|
|
217
|
+
/** Register a model entry file under a user-configured plugin folder. */
|
|
218
|
+
export interface ModelRegisterRequest {
|
|
219
|
+
path: string;
|
|
220
|
+
}
|
|
221
|
+
export interface ModelRegisterResponse {
|
|
222
|
+
model: ModelRef;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Register an asset file under a plugin folder. `want` asserts the kind
|
|
226
|
+
* (mismatches answer `invalid-params`); `ibl` also accepts plain image files.
|
|
227
|
+
*/
|
|
228
|
+
export interface AssetRegisterRequest {
|
|
229
|
+
path: string;
|
|
230
|
+
want?: AssetKind;
|
|
231
|
+
}
|
|
232
|
+
export interface AssetRegisterResponse {
|
|
233
|
+
asset: AssetRef;
|
|
234
|
+
}
|
|
235
|
+
export type SettingsGetRequest = EmptyRequest;
|
|
236
|
+
export interface SettingsGetResponse {
|
|
237
|
+
settings: Settings;
|
|
238
|
+
}
|
|
239
|
+
export interface SettingsPatchRequest {
|
|
240
|
+
settings: SettingsPatch;
|
|
241
|
+
}
|
|
242
|
+
export interface SettingsPatchResponse {
|
|
243
|
+
settings: Settings;
|
|
244
|
+
}
|
|
245
|
+
export interface TrackingSetEnabledRequest {
|
|
246
|
+
enabled: boolean;
|
|
247
|
+
}
|
|
248
|
+
export type TrackingSetEnabledResponse = EmptyResponse;
|
|
249
|
+
export interface TrackingSetSourceRequest {
|
|
250
|
+
source: TrackingSourceId;
|
|
251
|
+
}
|
|
252
|
+
export type TrackingSetSourceResponse = EmptyResponse;
|
|
253
|
+
export interface PoseSetEnabledRequest {
|
|
254
|
+
enabled: boolean;
|
|
255
|
+
}
|
|
256
|
+
export type PoseSetEnabledResponse = EmptyResponse;
|
|
257
|
+
export interface PoseSetSourceRequest {
|
|
258
|
+
source: PoseSourceId;
|
|
259
|
+
}
|
|
260
|
+
/** Switching protocol resets the port to that source's default; the response reports it. */
|
|
261
|
+
export interface PoseSetSourceResponse {
|
|
262
|
+
port: number;
|
|
263
|
+
}
|
|
264
|
+
export interface PoseSetPortRequest {
|
|
265
|
+
port: number;
|
|
266
|
+
}
|
|
267
|
+
export type PoseSetPortResponse = EmptyResponse;
|
|
268
|
+
export type TrackingStatusRequest = EmptyRequest;
|
|
269
|
+
export interface TrackingStatusResponse {
|
|
270
|
+
tracking: TrackingStatus;
|
|
271
|
+
pose: PoseStatus;
|
|
272
|
+
}
|
|
273
|
+
export interface StageResetTransformRequest {
|
|
274
|
+
instanceId?: string;
|
|
275
|
+
}
|
|
276
|
+
export type StageResetTransformResponse = EmptyResponse;
|
|
277
|
+
export type StageResetCameraRequest = EmptyRequest;
|
|
278
|
+
export type StageResetCameraResponse = EmptyResponse;
|
|
279
|
+
export type StageShockwaveRequest = EmptyRequest;
|
|
280
|
+
export type StageShockwaveResponse = EmptyResponse;
|
|
281
|
+
export type AppInfoRequest = EmptyRequest;
|
|
282
|
+
export interface AppInfoResponse {
|
|
283
|
+
name: string;
|
|
284
|
+
version: string;
|
|
285
|
+
platform: string;
|
|
286
|
+
protocol: number;
|
|
287
|
+
}
|
|
288
|
+
export type AppLocalAddressesRequest = EmptyRequest;
|
|
289
|
+
export interface AppLocalAddressesResponse {
|
|
290
|
+
addresses: {
|
|
291
|
+
iface: string;
|
|
292
|
+
address: string;
|
|
293
|
+
}[];
|
|
294
|
+
}
|
|
295
|
+
export type AppStatsRequest = EmptyRequest;
|
|
296
|
+
export interface AppStatsResponse {
|
|
297
|
+
fps: number | null;
|
|
298
|
+
}
|
|
299
|
+
export interface EventsSubscribeRequest {
|
|
300
|
+
events: EventName[];
|
|
301
|
+
}
|
|
302
|
+
export interface EventsSubscribeResponse {
|
|
303
|
+
subscribed: EventName[];
|
|
304
|
+
}
|
|
305
|
+
/** Omitting `events` unsubscribes from everything; unknown names are tolerated. */
|
|
306
|
+
export interface EventsUnsubscribeRequest {
|
|
307
|
+
events?: EventName[];
|
|
308
|
+
}
|
|
309
|
+
export interface EventsUnsubscribeResponse {
|
|
310
|
+
subscribed: EventName[];
|
|
311
|
+
}
|
|
312
|
+
export interface ParamInjectRequest {
|
|
313
|
+
entries: InjectEntry[];
|
|
314
|
+
}
|
|
315
|
+
export type ParamInjectResponse = EmptyResponse;
|
|
316
|
+
export interface ParamReleaseRequest {
|
|
317
|
+
/** Omitting `targets` releases everything this session holds. */
|
|
318
|
+
targets?: InjectTarget[];
|
|
319
|
+
}
|
|
320
|
+
export type ParamReleaseResponse = EmptyResponse;
|
|
321
|
+
/**
|
|
322
|
+
* The full request surface: method → request/response. Model-scoped methods take
|
|
323
|
+
* an optional `instanceId` defaulting to the scene's primary model instance.
|
|
324
|
+
*/
|
|
325
|
+
export interface MethodMap {
|
|
326
|
+
'scene.list': {
|
|
327
|
+
request: SceneListRequest;
|
|
328
|
+
response: SceneListResponse;
|
|
329
|
+
};
|
|
330
|
+
'scene.get': {
|
|
331
|
+
request: SceneGetRequest;
|
|
332
|
+
response: SceneGetResponse;
|
|
333
|
+
};
|
|
334
|
+
'scene.activate': {
|
|
335
|
+
request: SceneActivateRequest;
|
|
336
|
+
response: SceneActivateResponse;
|
|
337
|
+
};
|
|
338
|
+
'scene.create': {
|
|
339
|
+
request: SceneCreateRequest;
|
|
340
|
+
response: SceneCreateResponse;
|
|
341
|
+
};
|
|
342
|
+
'scene.duplicate': {
|
|
343
|
+
request: SceneDuplicateRequest;
|
|
344
|
+
response: SceneDuplicateResponse;
|
|
345
|
+
};
|
|
346
|
+
'scene.rename': {
|
|
347
|
+
request: SceneRenameRequest;
|
|
348
|
+
response: SceneRenameResponse;
|
|
349
|
+
};
|
|
350
|
+
'scene.delete': {
|
|
351
|
+
request: SceneDeleteRequest;
|
|
352
|
+
response: SceneDeleteResponse;
|
|
353
|
+
};
|
|
354
|
+
'scene.setShortcut': {
|
|
355
|
+
request: SceneSetShortcutRequest;
|
|
356
|
+
response: SceneSetShortcutResponse;
|
|
357
|
+
};
|
|
358
|
+
/** Live edit of the active scene's sections; applies next frame, persists debounced. */
|
|
359
|
+
'scene.patch': {
|
|
360
|
+
request: ScenePatchRequest;
|
|
361
|
+
response: ScenePatchResponse;
|
|
362
|
+
};
|
|
363
|
+
'instance.list': {
|
|
364
|
+
request: InstanceListRequest;
|
|
365
|
+
response: InstanceListResponse;
|
|
366
|
+
};
|
|
367
|
+
'instance.get': {
|
|
368
|
+
request: InstanceGetRequest;
|
|
369
|
+
response: InstanceGetResponse;
|
|
370
|
+
};
|
|
371
|
+
'instance.add': {
|
|
372
|
+
request: InstanceAddRequest;
|
|
373
|
+
response: InstanceAddResponse;
|
|
374
|
+
};
|
|
375
|
+
/** Removes any scene item — model or object. */
|
|
376
|
+
'instance.remove': {
|
|
377
|
+
request: InstanceRemoveRequest;
|
|
378
|
+
response: InstanceRemoveResponse;
|
|
379
|
+
};
|
|
380
|
+
'instance.setVisible': {
|
|
381
|
+
request: InstanceSetVisibleRequest;
|
|
382
|
+
response: InstanceSetVisibleResponse;
|
|
383
|
+
};
|
|
384
|
+
'instance.reorder': {
|
|
385
|
+
request: InstanceReorderRequest;
|
|
386
|
+
response: InstanceReorderResponse;
|
|
387
|
+
};
|
|
388
|
+
'instance.setPrimary': {
|
|
389
|
+
request: InstanceSetPrimaryRequest;
|
|
390
|
+
response: InstanceSetPrimaryResponse;
|
|
391
|
+
};
|
|
392
|
+
'instance.setPlacement': {
|
|
393
|
+
request: InstanceSetPlacementRequest;
|
|
394
|
+
response: InstanceSetPlacementResponse;
|
|
395
|
+
};
|
|
396
|
+
'instance.setMToon': {
|
|
397
|
+
request: InstanceSetMToonRequest;
|
|
398
|
+
response: InstanceSetMToonResponse;
|
|
399
|
+
};
|
|
400
|
+
'instance.setIdle': {
|
|
401
|
+
request: InstanceSetIdleRequest;
|
|
402
|
+
response: InstanceSetIdleResponse;
|
|
403
|
+
};
|
|
404
|
+
'instance.info': {
|
|
405
|
+
request: InstanceInfoRequest;
|
|
406
|
+
response: InstanceInfoResponse;
|
|
407
|
+
};
|
|
408
|
+
'object.add': {
|
|
409
|
+
request: ObjectAddRequest;
|
|
410
|
+
response: ObjectAddResponse;
|
|
411
|
+
};
|
|
412
|
+
'object.rename': {
|
|
413
|
+
request: ObjectRenameRequest;
|
|
414
|
+
response: ObjectRenameResponse;
|
|
415
|
+
};
|
|
416
|
+
'object.setContent': {
|
|
417
|
+
request: ObjectSetContentRequest;
|
|
418
|
+
response: ObjectSetContentResponse;
|
|
419
|
+
};
|
|
420
|
+
'object.setSpace': {
|
|
421
|
+
request: ObjectSetSpaceRequest;
|
|
422
|
+
response: ObjectSetSpaceResponse;
|
|
423
|
+
};
|
|
424
|
+
'object.setPlacement': {
|
|
425
|
+
request: ObjectSetPlacementRequest;
|
|
426
|
+
response: ObjectSetPlacementResponse;
|
|
427
|
+
};
|
|
428
|
+
'object.attach': {
|
|
429
|
+
request: ObjectAttachRequest;
|
|
430
|
+
response: ObjectAttachResponse;
|
|
431
|
+
};
|
|
432
|
+
'object.setLightOverrides': {
|
|
433
|
+
request: ObjectSetLightOverridesRequest;
|
|
434
|
+
response: ObjectSetLightOverridesResponse;
|
|
435
|
+
};
|
|
436
|
+
'object.anchors': {
|
|
437
|
+
request: ObjectAnchorsRequest;
|
|
438
|
+
response: ObjectAnchorsResponse;
|
|
439
|
+
};
|
|
440
|
+
'expression.list': {
|
|
441
|
+
request: ExpressionListRequest;
|
|
442
|
+
response: ExpressionListResponse;
|
|
443
|
+
};
|
|
444
|
+
'expression.active': {
|
|
445
|
+
request: ExpressionActiveRequest;
|
|
446
|
+
response: ExpressionActiveResponse;
|
|
447
|
+
};
|
|
448
|
+
'expression.toggle': {
|
|
449
|
+
request: ExpressionToggleRequest;
|
|
450
|
+
response: ExpressionToggleResponse;
|
|
451
|
+
};
|
|
452
|
+
'expression.getPersistence': {
|
|
453
|
+
request: ExpressionGetPersistenceRequest;
|
|
454
|
+
response: ExpressionGetPersistenceResponse;
|
|
455
|
+
};
|
|
456
|
+
'expression.setPersistence': {
|
|
457
|
+
request: ExpressionSetPersistenceRequest;
|
|
458
|
+
response: ExpressionSetPersistenceResponse;
|
|
459
|
+
};
|
|
460
|
+
'motion.list': {
|
|
461
|
+
request: MotionListRequest;
|
|
462
|
+
response: MotionListResponse;
|
|
463
|
+
};
|
|
464
|
+
'motion.play': {
|
|
465
|
+
request: MotionPlayRequest;
|
|
466
|
+
response: MotionPlayResponse;
|
|
467
|
+
};
|
|
468
|
+
'motion.playing': {
|
|
469
|
+
request: MotionPlayingRequest;
|
|
470
|
+
response: MotionPlayingResponse;
|
|
471
|
+
};
|
|
472
|
+
'hotkey.list': {
|
|
473
|
+
request: HotkeyListRequest;
|
|
474
|
+
response: HotkeyListResponse;
|
|
475
|
+
};
|
|
476
|
+
'hotkey.set': {
|
|
477
|
+
request: HotkeySetRequest;
|
|
478
|
+
response: HotkeySetResponse;
|
|
479
|
+
};
|
|
480
|
+
'hotkey.trigger': {
|
|
481
|
+
request: HotkeyTriggerRequest;
|
|
482
|
+
response: HotkeyTriggerResponse;
|
|
483
|
+
};
|
|
484
|
+
'model.list': {
|
|
485
|
+
request: ModelListRequest;
|
|
486
|
+
response: ModelListResponse;
|
|
487
|
+
};
|
|
488
|
+
'asset.list': {
|
|
489
|
+
request: AssetListRequest;
|
|
490
|
+
response: AssetListResponse;
|
|
491
|
+
};
|
|
492
|
+
'model.register': {
|
|
493
|
+
request: ModelRegisterRequest;
|
|
494
|
+
response: ModelRegisterResponse;
|
|
495
|
+
};
|
|
496
|
+
'asset.register': {
|
|
497
|
+
request: AssetRegisterRequest;
|
|
498
|
+
response: AssetRegisterResponse;
|
|
499
|
+
};
|
|
500
|
+
'settings.get': {
|
|
501
|
+
request: SettingsGetRequest;
|
|
502
|
+
response: SettingsGetResponse;
|
|
503
|
+
};
|
|
504
|
+
'settings.patch': {
|
|
505
|
+
request: SettingsPatchRequest;
|
|
506
|
+
response: SettingsPatchResponse;
|
|
507
|
+
};
|
|
508
|
+
'tracking.setEnabled': {
|
|
509
|
+
request: TrackingSetEnabledRequest;
|
|
510
|
+
response: TrackingSetEnabledResponse;
|
|
511
|
+
};
|
|
512
|
+
'tracking.setSource': {
|
|
513
|
+
request: TrackingSetSourceRequest;
|
|
514
|
+
response: TrackingSetSourceResponse;
|
|
515
|
+
};
|
|
516
|
+
'pose.setEnabled': {
|
|
517
|
+
request: PoseSetEnabledRequest;
|
|
518
|
+
response: PoseSetEnabledResponse;
|
|
519
|
+
};
|
|
520
|
+
'pose.setSource': {
|
|
521
|
+
request: PoseSetSourceRequest;
|
|
522
|
+
response: PoseSetSourceResponse;
|
|
523
|
+
};
|
|
524
|
+
'pose.setPort': {
|
|
525
|
+
request: PoseSetPortRequest;
|
|
526
|
+
response: PoseSetPortResponse;
|
|
527
|
+
};
|
|
528
|
+
'tracking.status': {
|
|
529
|
+
request: TrackingStatusRequest;
|
|
530
|
+
response: TrackingStatusResponse;
|
|
531
|
+
};
|
|
532
|
+
'stage.resetTransform': {
|
|
533
|
+
request: StageResetTransformRequest;
|
|
534
|
+
response: StageResetTransformResponse;
|
|
535
|
+
};
|
|
536
|
+
'stage.resetCamera': {
|
|
537
|
+
request: StageResetCameraRequest;
|
|
538
|
+
response: StageResetCameraResponse;
|
|
539
|
+
};
|
|
540
|
+
'stage.shockwave': {
|
|
541
|
+
request: StageShockwaveRequest;
|
|
542
|
+
response: StageShockwaveResponse;
|
|
543
|
+
};
|
|
544
|
+
'app.info': {
|
|
545
|
+
request: AppInfoRequest;
|
|
546
|
+
response: AppInfoResponse;
|
|
547
|
+
};
|
|
548
|
+
'app.localAddresses': {
|
|
549
|
+
request: AppLocalAddressesRequest;
|
|
550
|
+
response: AppLocalAddressesResponse;
|
|
551
|
+
};
|
|
552
|
+
'app.stats': {
|
|
553
|
+
request: AppStatsRequest;
|
|
554
|
+
response: AppStatsResponse;
|
|
555
|
+
};
|
|
556
|
+
'events.subscribe': {
|
|
557
|
+
request: EventsSubscribeRequest;
|
|
558
|
+
response: EventsSubscribeResponse;
|
|
559
|
+
};
|
|
560
|
+
'events.unsubscribe': {
|
|
561
|
+
request: EventsUnsubscribeRequest;
|
|
562
|
+
response: EventsUnsubscribeResponse;
|
|
563
|
+
};
|
|
564
|
+
/**
|
|
565
|
+
* Write parameter leases. Each entry holds ~1 s from its last write, then
|
|
566
|
+
* reverts — keep sending to keep driving. Ownership is per-session.
|
|
567
|
+
*/
|
|
568
|
+
'param.inject': {
|
|
569
|
+
request: ParamInjectRequest;
|
|
570
|
+
response: ParamInjectResponse;
|
|
571
|
+
};
|
|
572
|
+
'param.release': {
|
|
573
|
+
request: ParamReleaseRequest;
|
|
574
|
+
response: ParamReleaseResponse;
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
export type MethodName = keyof MethodMap;
|
|
578
|
+
export type MethodRequest<M extends MethodName> = MethodMap[M]['request'];
|
|
579
|
+
export type MethodResponse<M extends MethodName> = MethodMap[M]['response'];
|
package/dist/methods.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { InjectTarget } from './types.ts';
|
|
2
|
+
/** Bumped on breaking wire changes; the server reports it in `hello` and clients warn on mismatch. */
|
|
3
|
+
export declare const PROTOCOL_VERSION = 1;
|
|
4
|
+
/** Default port the Persona API server listens on (user-configurable in the app). */
|
|
5
|
+
export declare const DEFAULT_API_PORT = 25034;
|
|
6
|
+
/** An injected parameter reverts this long after its last write — the lease, not a setting. */
|
|
7
|
+
export declare const INJECT_LEASE_TTL_MS = 1000;
|
|
8
|
+
/** How often {@link PersonaClient.driveParameter} re-sends held leases to keep them alive. */
|
|
9
|
+
export declare const INJECT_HEARTBEAT_MS = 100;
|
|
10
|
+
/** Canonical map key for an injection target — JSON framing so ids containing spaces cannot collide. */
|
|
11
|
+
export declare function injectTargetKey(t: InjectTarget): string;
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Bumped on breaking wire changes; the server reports it in `hello` and clients warn on mismatch. */
|
|
2
|
+
export const PROTOCOL_VERSION = 1;
|
|
3
|
+
/** Default port the Persona API server listens on (user-configurable in the app). */
|
|
4
|
+
export const DEFAULT_API_PORT = 25034;
|
|
5
|
+
/** An injected parameter reverts this long after its last write — the lease, not a setting. */
|
|
6
|
+
export const INJECT_LEASE_TTL_MS = 1000;
|
|
7
|
+
/** How often {@link PersonaClient.driveParameter} re-sends held leases to keep them alive. */
|
|
8
|
+
export const INJECT_HEARTBEAT_MS = 100;
|
|
9
|
+
/** Canonical map key for an injection target — JSON framing so ids containing spaces cannot collide. */
|
|
10
|
+
export function injectTargetKey(t) {
|
|
11
|
+
return JSON.stringify([t.type, t.id, t.instanceId ?? '']);
|
|
12
|
+
}
|