realtime-avatar 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.
- package/AGENTS.md +132 -0
- package/CLAUDE.md +17 -0
- package/LICENSE +21 -0
- package/README.md +254 -0
- package/dist/api-keys.d.ts +26 -0
- package/dist/api-keys.d.ts.map +1 -0
- package/dist/api-keys.js +88 -0
- package/dist/api-keys.js.map +1 -0
- package/dist/browser/audio.d.ts +65 -0
- package/dist/browser/audio.d.ts.map +1 -0
- package/dist/browser/audio.js +154 -0
- package/dist/browser/audio.js.map +1 -0
- package/dist/browser/boomerang.d.ts +38 -0
- package/dist/browser/boomerang.d.ts.map +1 -0
- package/dist/browser/boomerang.js +85 -0
- package/dist/browser/boomerang.js.map +1 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +8 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/media-session.d.ts +43 -0
- package/dist/browser/media-session.d.ts.map +1 -0
- package/dist/browser/media-session.js +169 -0
- package/dist/browser/media-session.js.map +1 -0
- package/dist/browser/player.d.ts +162 -0
- package/dist/browser/player.d.ts.map +1 -0
- package/dist/browser/player.js +514 -0
- package/dist/browser/player.js.map +1 -0
- package/dist/browser/view.d.ts +47 -0
- package/dist/browser/view.d.ts.map +1 -0
- package/dist/browser/view.js +7 -0
- package/dist/browser/view.js.map +1 -0
- package/dist/browser/webrtc.d.ts +21 -0
- package/dist/browser/webrtc.d.ts.map +1 -0
- package/dist/browser/webrtc.js +149 -0
- package/dist/browser/webrtc.js.map +1 -0
- package/dist/browser/yuv-canvas.d.ts +13 -0
- package/dist/browser/yuv-canvas.d.ts.map +1 -0
- package/dist/browser/yuv-canvas.js +95 -0
- package/dist/browser/yuv-canvas.js.map +1 -0
- package/dist/client.d.ts +195 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +440 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +33 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +73 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated/openapi.d.ts +1523 -0
- package/dist/generated/openapi.d.ts.map +1 -0
- package/dist/generated/openapi.js +6 -0
- package/dist/generated/openapi.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/media.d.ts +40 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +4 -0
- package/dist/media.js.map +1 -0
- package/dist/mux.d.ts +104 -0
- package/dist/mux.d.ts.map +1 -0
- package/dist/mux.js +290 -0
- package/dist/mux.js.map +1 -0
- package/dist/platform.d.ts +163 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +5 -0
- package/dist/platform.js.map +1 -0
- package/dist/react/index.d.ts +5 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/provider.d.ts +37 -0
- package/dist/react/provider.d.ts.map +1 -0
- package/dist/react/provider.js +33 -0
- package/dist/react/provider.js.map +1 -0
- package/dist/react/realtime.d.ts +74 -0
- package/dist/react/realtime.d.ts.map +1 -0
- package/dist/react/realtime.js +105 -0
- package/dist/react/realtime.js.map +1 -0
- package/dist/react/session.d.ts +91 -0
- package/dist/react/session.d.ts.map +1 -0
- package/dist/react/session.js +322 -0
- package/dist/react/session.js.map +1 -0
- package/dist/react/stage.d.ts +23 -0
- package/dist/react/stage.d.ts.map +1 -0
- package/dist/react/stage.js +62 -0
- package/dist/react/stage.js.map +1 -0
- package/dist/schemas.d.ts +59 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +58 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +8 -0
- package/dist/server.js.map +1 -0
- package/dist/session-socket.d.ts +96 -0
- package/dist/session-socket.d.ts.map +1 -0
- package/dist/session-socket.js +299 -0
- package/dist/session-socket.js.map +1 -0
- package/dist/session.d.ts +107 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +192 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +94 -0
package/dist/session.js
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A reusable handle for one avatar: carries the avatar id + render source so
|
|
3
|
+
* callers don't repeat them on every turn, and warms the renderer via
|
|
4
|
+
* `prepare()` — or `connect()`, which pins prepare AND every turn to one GPU
|
|
5
|
+
* container over a single WebSocket (the low-latency path) with transparent
|
|
6
|
+
* HTTP fallback when the socket drops.
|
|
7
|
+
*
|
|
8
|
+
* const session = client.session({ avatarId });
|
|
9
|
+
* await session.connect().catch(() => session.prepare()); // socket, else HTTP
|
|
10
|
+
* const stream = await session.chat("who are you?"); // rides the socket when open
|
|
11
|
+
*/
|
|
12
|
+
export class AvatarSession {
|
|
13
|
+
client;
|
|
14
|
+
config;
|
|
15
|
+
socket = null;
|
|
16
|
+
constructor(client, config) {
|
|
17
|
+
this.client = client;
|
|
18
|
+
this.config = config;
|
|
19
|
+
}
|
|
20
|
+
get avatarId() {
|
|
21
|
+
return this.config.avatarId;
|
|
22
|
+
}
|
|
23
|
+
/** True while a live session socket is open; turns will ride it. */
|
|
24
|
+
get connected() {
|
|
25
|
+
return this.socket?.open === true;
|
|
26
|
+
}
|
|
27
|
+
/** Transport the NEXT turn will use. */
|
|
28
|
+
get transport() {
|
|
29
|
+
return this.connected ? "socket" : "http";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Open a single-socket realtime session and prepare the avatar on it: every
|
|
33
|
+
* subsequent `chat()`/`speak()` runs on the SAME GPU container until
|
|
34
|
+
* `disconnect()`. Throws when the socket cannot be established — callers that
|
|
35
|
+
* want graceful degradation just fall back to `prepare()` (HTTP turns).
|
|
36
|
+
*/
|
|
37
|
+
async connect(options = {}) {
|
|
38
|
+
return (await this.connectWithGrant(options)).prepared;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Same as `connect()`, but also exposes the session grant minted by the
|
|
42
|
+
* platform. The grant may contain an advisory media-plane plan (for example
|
|
43
|
+
* Cloudflare WHEP playback) that the browser can attach without another API call.
|
|
44
|
+
*/
|
|
45
|
+
async connectWithGrant(options = {}) {
|
|
46
|
+
this.disconnect();
|
|
47
|
+
const grant = await this.client.createSessionGrant({ signal: options.signal });
|
|
48
|
+
options.onGrant?.(grant);
|
|
49
|
+
const socket = await this.client.connectRealtimeSession({
|
|
50
|
+
signal: options.signal,
|
|
51
|
+
WebSocketImpl: options.WebSocketImpl,
|
|
52
|
+
grant,
|
|
53
|
+
});
|
|
54
|
+
try {
|
|
55
|
+
const prepared = await socket.prepare(this.prepareRequest());
|
|
56
|
+
this.socket = socket;
|
|
57
|
+
return { grant, prepared };
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
socket.close();
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Close the session socket (if any); turns fall back to HTTP. */
|
|
65
|
+
disconnect() {
|
|
66
|
+
this.socket?.close();
|
|
67
|
+
this.socket = null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Stop the in-flight socket turn server-side (the GPU stops rendering frames
|
|
71
|
+
* nobody will play) while KEEPING the socket warm for the next turn. The
|
|
72
|
+
* socket is dropped only if the server never confirms. No-op on the HTTP
|
|
73
|
+
* path — abort the fetch via its `signal` instead.
|
|
74
|
+
*/
|
|
75
|
+
async cancel() {
|
|
76
|
+
const socket = this.socket;
|
|
77
|
+
if (!socket)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
await socket.cancelTurn();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
if (this.socket === socket)
|
|
84
|
+
this.socket = null;
|
|
85
|
+
socket.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
prepare(options = {}) {
|
|
89
|
+
if (this.connected && this.socket)
|
|
90
|
+
return this.socket.prepare(this.prepareRequest());
|
|
91
|
+
return this.client.prepare(this.prepareRequest(), options);
|
|
92
|
+
}
|
|
93
|
+
/** The prepare payload this session sends — reusable over a `RealtimeSessionSocket`. */
|
|
94
|
+
prepareRequest() {
|
|
95
|
+
return defined({
|
|
96
|
+
avatar_id: this.config.avatarId,
|
|
97
|
+
source_kind: this.config.sourceKind,
|
|
98
|
+
portrait_url: this.config.portraitUrl,
|
|
99
|
+
source_video_url: this.config.sourceVideoUrl,
|
|
100
|
+
video_cache_id: this.config.videoCacheId,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async chat(text, options = {}) {
|
|
104
|
+
const { history, turn, ...requestOptions } = options;
|
|
105
|
+
const socketTurn = await this.socketTurn({ ...this.chatRequest(text, history), ...turn });
|
|
106
|
+
if (socketTurn)
|
|
107
|
+
return socketTurn;
|
|
108
|
+
return this.client.chat({ ...this.turnBase(), ...turn, avatarId: this.config.avatarId, text, history }, requestOptions);
|
|
109
|
+
}
|
|
110
|
+
async speak(text, options = {}) {
|
|
111
|
+
const { turn, ...requestOptions } = options;
|
|
112
|
+
const socketTurn = await this.socketTurn({ ...this.speakRequest(text), ...turn });
|
|
113
|
+
if (socketTurn)
|
|
114
|
+
return socketTurn;
|
|
115
|
+
return this.client.speak({ ...this.turnBase(), ...turn, avatarId: this.config.avatarId, text }, requestOptions);
|
|
116
|
+
}
|
|
117
|
+
/** The chat turn payload — reusable over a `RealtimeSessionSocket`. */
|
|
118
|
+
chatRequest(text, history) {
|
|
119
|
+
return {
|
|
120
|
+
...this.turnBase(),
|
|
121
|
+
mode: "chat",
|
|
122
|
+
avatar_id: this.config.avatarId,
|
|
123
|
+
messages: boundTurnMessages([...(history ?? []), { role: "user", content: text }]),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** The speak-text turn payload — reusable over a `RealtimeSessionSocket`. */
|
|
127
|
+
speakRequest(text) {
|
|
128
|
+
return {
|
|
129
|
+
...this.turnBase(),
|
|
130
|
+
mode: "speak_text",
|
|
131
|
+
avatar_id: this.config.avatarId,
|
|
132
|
+
text,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Run the turn on the live socket when one is open. Waits out a previous
|
|
137
|
+
* turn that is still draining its cancel (no-op when idle); a socket that
|
|
138
|
+
* fails the drain is dropped so the caller's turn falls back to HTTP.
|
|
139
|
+
*/
|
|
140
|
+
async socketTurn(request) {
|
|
141
|
+
const socket = this.socket;
|
|
142
|
+
if (!socket || !socket.open)
|
|
143
|
+
return null;
|
|
144
|
+
try {
|
|
145
|
+
await socket.cancelTurn();
|
|
146
|
+
return socket.turn(request);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
if (this.socket === socket)
|
|
150
|
+
this.socket = null;
|
|
151
|
+
socket.close();
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
turnBase() {
|
|
156
|
+
return {
|
|
157
|
+
// Hardware H.264 playback (~6x less bandwidth than MJPEG) whenever the
|
|
158
|
+
// runtime can decode it; turnDefaults.video_codec overrides.
|
|
159
|
+
...(supportsWebCodecsH264() ? { video_codec: "h264" } : {}),
|
|
160
|
+
...this.config.turnDefaults,
|
|
161
|
+
...defined({
|
|
162
|
+
source_kind: this.config.sourceKind,
|
|
163
|
+
portrait_url: this.config.portraitUrl,
|
|
164
|
+
source_video_url: this.config.sourceVideoUrl,
|
|
165
|
+
video_cache_id: this.config.videoCacheId,
|
|
166
|
+
voice_id: this.config.voiceId,
|
|
167
|
+
background_id: this.config.backgroundId,
|
|
168
|
+
}),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function defined(value) {
|
|
173
|
+
return Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined));
|
|
174
|
+
}
|
|
175
|
+
// Server cap on chat context per turn (RealtimeTurnRequest.messages). Long
|
|
176
|
+
// histories are trimmed to system prompts + the most recent remainder so
|
|
177
|
+
// callers can keep appending forever — an unbounded prompt would fail
|
|
178
|
+
// validation AND inflate LLM first-token latency on every turn.
|
|
179
|
+
const MAX_TURN_MESSAGES = 24;
|
|
180
|
+
const MAX_TURN_SYSTEM_MESSAGES = 4;
|
|
181
|
+
function boundTurnMessages(messages) {
|
|
182
|
+
if (messages.length <= MAX_TURN_MESSAGES)
|
|
183
|
+
return messages;
|
|
184
|
+
const system = messages.filter((m) => m.role === "system").slice(0, MAX_TURN_SYSTEM_MESSAGES);
|
|
185
|
+
const rest = messages.filter((m) => m.role !== "system");
|
|
186
|
+
const keep = Math.max(MAX_TURN_MESSAGES - system.length, 1);
|
|
187
|
+
return [...system, ...rest.slice(-keep)];
|
|
188
|
+
}
|
|
189
|
+
function supportsWebCodecsH264() {
|
|
190
|
+
return typeof VideoDecoder === "function" && typeof EncodedVideoChunk === "function";
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { components } from "./generated/openapi";
|
|
2
|
+
export type ArtifactStatus = components["schemas"]["ArtifactStatus"];
|
|
3
|
+
export type HealthResponse = components["schemas"]["HealthResponse"];
|
|
4
|
+
export type LiveChunkInfo = components["schemas"]["LiveChunkInfo"];
|
|
5
|
+
export type RealtimeChatMessage = components["schemas"]["RealtimeChatMessage"];
|
|
6
|
+
export type RealtimeTurnRequest = components["schemas"]["RealtimeTurnRequest"] & {
|
|
7
|
+
/**
|
|
8
|
+
* source_video turns: ping-pong playback cursor to start rendering from.
|
|
9
|
+
* Clients pass the idle loop's current position so the live render continues
|
|
10
|
+
* seamlessly; the `done` event returns the final cursor as `sourceVideo`.
|
|
11
|
+
* (Server-supported; not yet present in the generated OpenAPI snapshot.)
|
|
12
|
+
*/
|
|
13
|
+
source_start_frame?: number | null;
|
|
14
|
+
};
|
|
15
|
+
export type RealtimePrepareRequest = components["schemas"]["RealtimePrepareRequest"];
|
|
16
|
+
export type RealtimePrepareResponse = components["schemas"]["RealtimePrepareResponse"];
|
|
17
|
+
export type SourceVideoCacheSettings = components["schemas"]["SourceVideoCacheSettings"];
|
|
18
|
+
export type VideoAvatarCacheManifest = components["schemas"]["VideoAvatarCacheManifest"];
|
|
19
|
+
export type VideoCachePaths = components["schemas"]["VideoCachePaths"];
|
|
20
|
+
export type VideoCachePlan = components["schemas"]["VideoCachePlan"];
|
|
21
|
+
export type VideoCachePlanRequest = components["schemas"]["VideoCachePlanRequest"];
|
|
22
|
+
export type VideoCachePlanResponse = components["schemas"]["VideoCachePlanResponse"];
|
|
23
|
+
export type AvatarSourceKind = NonNullable<RealtimeTurnRequest["source_kind"]>;
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACrE,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACrE,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC;AACnE,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC;AAC/E,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,GAAG;IAC/E;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,CAAC;AACrF,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,yBAAyB,CAAC,CAAC;AACvF,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,0BAA0B,CAAC,CAAC;AACzF,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,0BAA0B,CAAC,CAAC;AACzF,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC;AACrE,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,uBAAuB,CAAC,CAAC;AACnF,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,wBAAwB,CAAC,CAAC;AAErF,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "realtime-avatar",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Agent-ready TypeScript SDK for realtime AI avatars, lipsync MP4 rendering, and audio-clocked talking-avatar streams.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "The Influence Company",
|
|
7
|
+
"homepage": "https://docs.realtimeavatar.ai/sdks/typescript",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/theinfluencecompany/realtime-avatar.git",
|
|
11
|
+
"directory": "packages/realtime-avatar"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/theinfluencecompany/realtime-avatar/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"realtime-avatar",
|
|
18
|
+
"realtime avatar",
|
|
19
|
+
"ai avatar",
|
|
20
|
+
"talking avatar",
|
|
21
|
+
"talking head",
|
|
22
|
+
"avatar",
|
|
23
|
+
"lipsync",
|
|
24
|
+
"lip sync",
|
|
25
|
+
"ai",
|
|
26
|
+
"video",
|
|
27
|
+
"sdk",
|
|
28
|
+
"tts",
|
|
29
|
+
"mcp",
|
|
30
|
+
"agents"
|
|
31
|
+
],
|
|
32
|
+
"private": false,
|
|
33
|
+
"type": "module",
|
|
34
|
+
"sideEffects": false,
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"main": "./dist/index.js",
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"default": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./browser": {
|
|
43
|
+
"types": "./dist/browser/index.d.ts",
|
|
44
|
+
"default": "./dist/browser/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./server": {
|
|
47
|
+
"types": "./dist/server.d.ts",
|
|
48
|
+
"default": "./dist/server.js"
|
|
49
|
+
},
|
|
50
|
+
"./generated/openapi": {
|
|
51
|
+
"types": "./dist/generated/openapi.d.ts",
|
|
52
|
+
"default": "./dist/generated/openapi.js"
|
|
53
|
+
},
|
|
54
|
+
"./react": {
|
|
55
|
+
"types": "./dist/react/index.d.ts",
|
|
56
|
+
"default": "./dist/react/index.js"
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
"files": [
|
|
60
|
+
"dist",
|
|
61
|
+
"README.md",
|
|
62
|
+
"AGENTS.md",
|
|
63
|
+
"CLAUDE.md",
|
|
64
|
+
"LICENSE"
|
|
65
|
+
],
|
|
66
|
+
"publishConfig": {
|
|
67
|
+
"access": "public"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
71
|
+
"check": "tsc --noEmit",
|
|
72
|
+
"test": "bun test",
|
|
73
|
+
"prepublishOnly": "bun run build",
|
|
74
|
+
"publish:dry": "bun run build && npm publish --dry-run",
|
|
75
|
+
"contracts:openapi": "uv run --project ../.. python ../../scripts/export_realtime_avatar_openapi.py",
|
|
76
|
+
"contracts:ts": "bunx openapi-typescript openapi/realtime-avatar.openapi.json --default-non-nullable false -o src/generated/openapi.ts"
|
|
77
|
+
},
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"zod": "4.4.3"
|
|
80
|
+
},
|
|
81
|
+
"devDependencies": {
|
|
82
|
+
"typescript": "6.0.3",
|
|
83
|
+
"react": "19.2.7",
|
|
84
|
+
"@types/react": "19.2.7"
|
|
85
|
+
},
|
|
86
|
+
"peerDependencies": {
|
|
87
|
+
"react": ">=18"
|
|
88
|
+
},
|
|
89
|
+
"peerDependenciesMeta": {
|
|
90
|
+
"react": {
|
|
91
|
+
"optional": true
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|