@sarxina/sarxina-tools 0.1.5 → 0.1.6

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.
@@ -8,11 +8,6 @@ export interface VTSClientOptions {
8
8
  /** Timeout for individual requests in ms. Defaults to 10000. */
9
9
  requestTimeoutMs?: number;
10
10
  }
11
- /**
12
- * Shape of a VTube Studio API response. Responses always have a requestID
13
- * that echoes the one from the request, a messageType describing what came
14
- * back, and an opaque data payload.
15
- */
16
11
  interface VTSResponse {
17
12
  apiName: string;
18
13
  apiVersion: string;
@@ -20,91 +15,84 @@ interface VTSResponse {
20
15
  messageType: string;
21
16
  data: Record<string, unknown>;
22
17
  }
23
- /**
24
- * Error thrown when the VTS API returns an APIError messageType.
25
- */
26
18
  export declare class VTSApiError extends Error {
27
19
  readonly code: number | undefined;
28
20
  constructor(message: string, code?: number);
29
21
  }
30
- /**
31
- * A connected, authenticated client for the VTube Studio API.
32
- *
33
- * Use the static `connect` factory to create an instance — it handles the
34
- * websocket handshake and plugin authentication in one step.
35
- */
36
22
  export declare class VTSClient {
37
23
  private readonly ws;
38
24
  private readonly pendingRequests;
25
+ private readonly eventListeners;
39
26
  private readonly requestTimeoutMs;
40
27
  private nextRequestId;
41
28
  private authenticated;
42
29
  private constructor();
43
- /**
44
- * Open a connection to VTube Studio and authenticate as a plugin.
45
- *
46
- * Authentication is a two-step handshake: the client first asks VTS for
47
- * a token, the user approves the plugin in the VTS UI, and then the
48
- * client uses the token to authenticate for the session. The user only
49
- * sees the approval prompt the first time a plugin connects.
50
- */
51
30
  static connect(opts: VTSClientOptions): Promise<VTSClient>;
52
- /**
53
- * Send a raw request and get the response. Throws VTSApiError if VTS
54
- * returns an APIError messageType.
55
- */
56
31
  sendRequest(messageType: string, data?: Record<string, unknown>): Promise<VTSResponse>;
57
- /**
58
- * Close the connection cleanly.
59
- */
60
32
  disconnect(): void;
61
33
  private authenticate;
34
+ isAuthenticated(): boolean;
62
35
  /**
63
- * Whether the client has completed authentication.
36
+ * Subscribe to a VTS event. The callback fires every time the event
37
+ * occurs until you unsubscribe.
64
38
  */
65
- isAuthenticated(): boolean;
39
+ subscribeToEvent(eventName: string, callback: (data: Record<string, unknown>) => void, config?: Record<string, unknown>): Promise<void>;
66
40
  /**
67
- * Load an item (image, gif, etc.) into the VTS scene from base64-encoded data.
68
- * Returns the instanceID that can be used to unload or pin the item later.
41
+ * Unsubscribe from a VTS event.
69
42
  */
70
- loadItem(opts: LoadItemOptions): Promise<string>;
43
+ unsubscribeFromEvent(eventName: string): Promise<void>;
71
44
  /**
72
- * Unload a previously-loaded item by its instanceID.
45
+ * Wait for the user to click on their model in VTS. Returns the exact
46
+ * artmesh and vertex-level position of the click, which can be passed
47
+ * directly to pinItem() with vertexPinType "Provided" for pixel-perfect
48
+ * pinning.
49
+ *
50
+ * Subscribes to ModelClickedEvent, waits for one click, unsubscribes,
51
+ * and returns the topmost artmesh hit info.
52
+ *
53
+ * The caller is responsible for telling the user what to click (e.g.
54
+ * via a UI prompt in the launcher).
73
55
  */
56
+ requestUserClick(): Promise<ClickPinResult>;
57
+ loadItem(opts: LoadItemOptions): Promise<string>;
74
58
  unloadItem(instanceID: string): Promise<void>;
75
59
  /**
76
- * Pin an item to a specific art mesh on the current model.
60
+ * Pin an item to a mesh using center-point pinning.
77
61
  */
78
62
  pinItem(instanceID: string, pinInfo: PinInfo): Promise<void>;
79
63
  /**
80
- * Unpin an item without unloading it.
64
+ * Pin an item to an exact position on the model using vertex-level
65
+ * coordinates from requestUserClick() or a saved ClickPinResult.
81
66
  */
67
+ pinItemExact(instanceID: string, pin: ClickPinResult, opts?: {
68
+ angleRelativeTo?: PinInfo["angleRelativeTo"];
69
+ sizeRelativeTo?: PinInfo["sizeRelativeTo"];
70
+ size?: number;
71
+ }): Promise<void>;
82
72
  unpinItem(instanceID: string): Promise<void>;
83
- /**
84
- * Get the list of art mesh names on the currently loaded model.
85
- */
86
73
  listArtMeshes(): Promise<string[]>;
87
- /**
88
- * Find the first art mesh whose name contains one of the given patterns.
89
- * Useful for pinning items to face parts across different models where
90
- * the exact mesh name isn't known up front.
91
- *
92
- * Patterns are tried in order — the first match wins.
93
- */
94
74
  findArtMesh(patterns: string[]): Promise<string | null>;
95
- /**
96
- * Get the list of input parameters on the current model (e.g. FaceAngleX,
97
- * LeftEyeOpenAmount). Each parameter has a min/max range that describes
98
- * what values the model accepts.
99
- */
100
75
  getInputParameters(): Promise<ModelParameter[]>;
101
- /**
102
- * Send parameter values to VTS. Mode "set" replaces the value, "add" adds
103
- * to the current value. The default is "set".
104
- */
105
76
  injectParameters(values: ParameterValue[], mode?: "set" | "add"): void;
106
77
  private handleMessage;
107
78
  }
79
+ /**
80
+ * The result of a user clicking on their model. Contains the exact
81
+ * artmesh and vertex-level position of the click. Can be saved to
82
+ * config and reused with pinItemExact().
83
+ */
84
+ export interface ClickPinResult {
85
+ modelID: string;
86
+ artMeshID: string;
87
+ angle: number;
88
+ size: number;
89
+ vertexID1: number;
90
+ vertexID2: number;
91
+ vertexID3: number;
92
+ vertexWeight1: number;
93
+ vertexWeight2: number;
94
+ vertexWeight3: number;
95
+ }
108
96
  export interface LoadItemOptions {
109
97
  fileName: string;
110
98
  customDataBase64: string;
@@ -1 +1 @@
1
- {"version":3,"file":"VTSClient.d.ts","sourceRoot":"","sources":["../../src/vts/VTSClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VTSClient.d.ts","sourceRoot":"","sources":["../../src/vts/VTSClient.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,4 @@
1
1
  import WebSocket from "ws";
2
- /**
3
- * Error thrown when the VTS API returns an APIError messageType.
4
- */
5
2
  export class VTSApiError extends Error {
6
3
  code;
7
4
  constructor(message, code) {
@@ -10,15 +7,10 @@ export class VTSApiError extends Error {
10
7
  this.code = code;
11
8
  }
12
9
  }
13
- /**
14
- * A connected, authenticated client for the VTube Studio API.
15
- *
16
- * Use the static `connect` factory to create an instance — it handles the
17
- * websocket handshake and plugin authentication in one step.
18
- */
19
10
  export class VTSClient {
20
11
  ws;
21
12
  pendingRequests = new Map();
13
+ eventListeners = new Map();
22
14
  requestTimeoutMs;
23
15
  nextRequestId = 0;
24
16
  authenticated = false;
@@ -29,14 +21,6 @@ export class VTSClient {
29
21
  this.handleMessage(raw);
30
22
  });
31
23
  }
32
- /**
33
- * Open a connection to VTube Studio and authenticate as a plugin.
34
- *
35
- * Authentication is a two-step handshake: the client first asks VTS for
36
- * a token, the user approves the plugin in the VTS UI, and then the
37
- * client uses the token to authenticate for the session. The user only
38
- * sees the approval prompt the first time a plugin connects.
39
- */
40
24
  static async connect(opts) {
41
25
  const url = opts.url ?? "ws://localhost:8001";
42
26
  const requestTimeoutMs = opts.requestTimeoutMs ?? 10000;
@@ -49,10 +33,6 @@ export class VTSClient {
49
33
  await client.authenticate(opts.pluginName, opts.pluginDeveloper);
50
34
  return client;
51
35
  }
52
- /**
53
- * Send a raw request and get the response. Throws VTSApiError if VTS
54
- * returns an APIError messageType.
55
- */
56
36
  async sendRequest(messageType, data) {
57
37
  const requestID = String(++this.nextRequestId);
58
38
  const request = {
@@ -78,16 +58,13 @@ export class VTSClient {
78
58
  }
79
59
  return response;
80
60
  }
81
- /**
82
- * Close the connection cleanly.
83
- */
84
61
  disconnect() {
85
- // Cancel all pending request timeouts
86
62
  for (const pending of this.pendingRequests.values()) {
87
63
  clearTimeout(pending.timeout);
88
64
  pending.reject(new Error("VTSClient was disconnected"));
89
65
  }
90
66
  this.pendingRequests.clear();
67
+ this.eventListeners.clear();
91
68
  this.ws.close();
92
69
  }
93
70
  // --- Plugin authentication ---
@@ -100,7 +77,6 @@ export class VTSClient {
100
77
  if (!token) {
101
78
  throw new Error("VTS did not return an authentication token");
102
79
  }
103
- // Give the user a moment to approve the plugin in VTS if prompted.
104
80
  await new Promise((r) => setTimeout(r, 2000));
105
81
  const authResp = await this.sendRequest("AuthenticationRequest", {
106
82
  pluginName,
@@ -113,17 +89,83 @@ export class VTSClient {
113
89
  }
114
90
  this.authenticated = true;
115
91
  }
116
- /**
117
- * Whether the client has completed authentication.
118
- */
119
92
  isAuthenticated() {
120
93
  return this.authenticated;
121
94
  }
122
- // --- Item management ---
95
+ // --- Event subscriptions ---
123
96
  /**
124
- * Load an item (image, gif, etc.) into the VTS scene from base64-encoded data.
125
- * Returns the instanceID that can be used to unload or pin the item later.
97
+ * Subscribe to a VTS event. The callback fires every time the event
98
+ * occurs until you unsubscribe.
126
99
  */
100
+ async subscribeToEvent(eventName, callback, config = {}) {
101
+ await this.sendRequest("EventSubscriptionRequest", {
102
+ eventName,
103
+ subscribe: true,
104
+ config,
105
+ });
106
+ const listeners = this.eventListeners.get(eventName) ?? [];
107
+ listeners.push(callback);
108
+ this.eventListeners.set(eventName, listeners);
109
+ }
110
+ /**
111
+ * Unsubscribe from a VTS event.
112
+ */
113
+ async unsubscribeFromEvent(eventName) {
114
+ await this.sendRequest("EventSubscriptionRequest", {
115
+ eventName,
116
+ subscribe: false,
117
+ config: {},
118
+ });
119
+ this.eventListeners.delete(eventName);
120
+ }
121
+ // --- User click ---
122
+ /**
123
+ * Wait for the user to click on their model in VTS. Returns the exact
124
+ * artmesh and vertex-level position of the click, which can be passed
125
+ * directly to pinItem() with vertexPinType "Provided" for pixel-perfect
126
+ * pinning.
127
+ *
128
+ * Subscribes to ModelClickedEvent, waits for one click, unsubscribes,
129
+ * and returns the topmost artmesh hit info.
130
+ *
131
+ * The caller is responsible for telling the user what to click (e.g.
132
+ * via a UI prompt in the launcher).
133
+ */
134
+ async requestUserClick() {
135
+ return new Promise((resolve, reject) => {
136
+ const onEvent = (data) => {
137
+ const modelWasClicked = data["modelWasClicked"];
138
+ if (!modelWasClicked)
139
+ return; // click wasn't on the model
140
+ const hits = data["artMeshHits"];
141
+ if (!hits || hits.length === 0)
142
+ return;
143
+ // Take the topmost (order 0) hit
144
+ const topHit = hits.find((h) => h.artMeshOrder === 0) ?? hits[0];
145
+ const info = topHit.hitInfo;
146
+ // Unsubscribe and resolve
147
+ this.unsubscribeFromEvent("ModelClickedEvent").catch(() => {
148
+ // Best effort
149
+ });
150
+ resolve({
151
+ modelID: info.modelID,
152
+ artMeshID: info.artMeshID,
153
+ angle: info.angle,
154
+ size: info.size,
155
+ vertexID1: info.vertexID1,
156
+ vertexID2: info.vertexID2,
157
+ vertexID3: info.vertexID3,
158
+ vertexWeight1: info.vertexWeight1,
159
+ vertexWeight2: info.vertexWeight2,
160
+ vertexWeight3: info.vertexWeight3,
161
+ });
162
+ };
163
+ this.subscribeToEvent("ModelClickedEvent", onEvent, {
164
+ onlyClicksOnModel: true,
165
+ }).catch(reject);
166
+ });
167
+ }
168
+ // --- Item management ---
127
169
  async loadItem(opts) {
128
170
  const resp = await this.sendRequest("ItemLoadRequest", {
129
171
  fileName: opts.fileName,
@@ -150,9 +192,6 @@ export class VTSClient {
150
192
  }
151
193
  return instanceID;
152
194
  }
153
- /**
154
- * Unload a previously-loaded item by its instanceID.
155
- */
156
195
  async unloadItem(instanceID) {
157
196
  await this.sendRequest("ItemUnloadRequest", {
158
197
  instanceIDs: [instanceID],
@@ -162,7 +201,7 @@ export class VTSClient {
162
201
  });
163
202
  }
164
203
  /**
165
- * Pin an item to a specific art mesh on the current model.
204
+ * Pin an item to a mesh using center-point pinning.
166
205
  */
167
206
  async pinItem(instanceID, pinInfo) {
168
207
  await this.sendRequest("ItemPinRequest", {
@@ -180,8 +219,30 @@ export class VTSClient {
180
219
  });
181
220
  }
182
221
  /**
183
- * Unpin an item without unloading it.
222
+ * Pin an item to an exact position on the model using vertex-level
223
+ * coordinates from requestUserClick() or a saved ClickPinResult.
184
224
  */
225
+ async pinItemExact(instanceID, pin, opts) {
226
+ await this.sendRequest("ItemPinRequest", {
227
+ pin: true,
228
+ itemInstanceID: instanceID,
229
+ angleRelativeTo: opts?.angleRelativeTo ?? "RelativeToModel",
230
+ sizeRelativeTo: opts?.sizeRelativeTo ?? "RelativeToWorld",
231
+ vertexPinType: "Provided",
232
+ pinInfo: {
233
+ modelID: pin.modelID,
234
+ artMeshID: pin.artMeshID,
235
+ angle: pin.angle,
236
+ size: opts?.size ?? pin.size,
237
+ vertexID1: pin.vertexID1,
238
+ vertexID2: pin.vertexID2,
239
+ vertexID3: pin.vertexID3,
240
+ vertexWeight1: pin.vertexWeight1,
241
+ vertexWeight2: pin.vertexWeight2,
242
+ vertexWeight3: pin.vertexWeight3,
243
+ },
244
+ });
245
+ }
185
246
  async unpinItem(instanceID) {
186
247
  await this.sendRequest("ItemPinRequest", {
187
248
  pin: false,
@@ -189,20 +250,10 @@ export class VTSClient {
189
250
  });
190
251
  }
191
252
  // --- Art mesh helpers ---
192
- /**
193
- * Get the list of art mesh names on the currently loaded model.
194
- */
195
253
  async listArtMeshes() {
196
254
  const resp = await this.sendRequest("ArtMeshListRequest");
197
255
  return resp.data.artMeshNames ?? [];
198
256
  }
199
- /**
200
- * Find the first art mesh whose name contains one of the given patterns.
201
- * Useful for pinning items to face parts across different models where
202
- * the exact mesh name isn't known up front.
203
- *
204
- * Patterns are tried in order — the first match wins.
205
- */
206
257
  async findArtMesh(patterns) {
207
258
  const meshNames = await this.listArtMeshes();
208
259
  for (const pattern of patterns) {
@@ -213,23 +264,15 @@ export class VTSClient {
213
264
  return null;
214
265
  }
215
266
  // --- Parameter injection ---
216
- /**
217
- * Get the list of input parameters on the current model (e.g. FaceAngleX,
218
- * LeftEyeOpenAmount). Each parameter has a min/max range that describes
219
- * what values the model accepts.
220
- */
221
267
  async getInputParameters() {
222
268
  const resp = await this.sendRequest("InputParameterListRequest");
223
269
  const data = resp.data;
224
- // VTS returns parameters under various keys depending on the kind.
225
- // Collect anything that looks like a parameter list.
226
270
  const candidates = [];
227
271
  for (const key of ["modelParameters", "defaultParameters", "customParameters"]) {
228
272
  const val = data[key];
229
273
  if (Array.isArray(val))
230
274
  candidates.push(...val);
231
275
  }
232
- // Fall back to collecting any array values if the known keys were empty.
233
276
  if (candidates.length === 0) {
234
277
  for (const val of Object.values(data)) {
235
278
  if (Array.isArray(val))
@@ -243,13 +286,7 @@ export class VTSClient {
243
286
  typeof p.min === "number" &&
244
287
  typeof p.max === "number");
245
288
  }
246
- /**
247
- * Send parameter values to VTS. Mode "set" replaces the value, "add" adds
248
- * to the current value. The default is "set".
249
- */
250
289
  injectParameters(values, mode = "set") {
251
- // Fire-and-forget for performance — high-frequency callers (e.g. 30fps
252
- // animation loops) don't want to await a round-trip per frame.
253
290
  const request = {
254
291
  apiName: "VTubeStudioPublicAPI",
255
292
  apiVersion: "1.0",
@@ -265,19 +302,28 @@ export class VTSClient {
265
302
  }
266
303
  // --- Internal ---
267
304
  handleMessage(raw) {
268
- let response;
305
+ let message;
269
306
  try {
270
- response = JSON.parse(raw.toString());
307
+ message = JSON.parse(raw.toString());
271
308
  }
272
309
  catch {
273
- return; // ignore malformed messages
310
+ return;
311
+ }
312
+ // Check if this is a pending request response
313
+ const pending = this.pendingRequests.get(message.requestID);
314
+ if (pending) {
315
+ clearTimeout(pending.timeout);
316
+ this.pendingRequests.delete(message.requestID);
317
+ pending.resolve(message);
318
+ return;
319
+ }
320
+ // Check if this is a pushed event
321
+ const listeners = this.eventListeners.get(message.messageType);
322
+ if (listeners) {
323
+ for (const listener of listeners) {
324
+ listener(message.data);
325
+ }
274
326
  }
275
- const pending = this.pendingRequests.get(response.requestID);
276
- if (!pending)
277
- return; // unknown requestID (e.g. from injectParameters fire-and-forget)
278
- clearTimeout(pending.timeout);
279
- this.pendingRequests.delete(response.requestID);
280
- pending.resolve(response);
281
327
  }
282
328
  }
283
329
  //# sourceMappingURL=VTSClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VTSClient.js","sourceRoot":"","sources":["../../src/vts/VTSClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VTSClient.js","sourceRoot":"","sources":["../../src/vts/VTSClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { VTSClient, ClickPinResult } from "./VTSClient.js";
2
+ /**
3
+ * Storage interface for persisting forehead pin data. The caller provides
4
+ * the implementation — could be a JSON file, Electron config store, etc.
5
+ */
6
+ export interface PinStorage {
7
+ /** Load a previously saved forehead pin, or null if none exists. */
8
+ load(): ClickPinResult | null;
9
+ /** Save a forehead pin for future use. */
10
+ save(pin: ClickPinResult): void;
11
+ }
12
+ /**
13
+ * Get the user's forehead pin coordinates. If a pin was previously saved
14
+ * in the provided storage, returns it immediately. Otherwise, waits for
15
+ * the user to click their forehead in VTS and saves the result.
16
+ *
17
+ * The caller is responsible for prompting the user (via UI, console, etc.)
18
+ * BEFORE calling this function, since it blocks waiting for a click.
19
+ *
20
+ * @param vts - Connected VTSClient instance
21
+ * @param storage - Where to load/save the pin coordinates
22
+ * @param forceNew - If true, ignores saved pin and asks the user again
23
+ * @returns The forehead pin coordinates, ready for pinItemExact()
24
+ */
25
+ export declare function getForeheadPin(vts: VTSClient, storage: PinStorage, forceNew?: boolean): Promise<ClickPinResult>;
26
+ //# sourceMappingURL=getForeheadPin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getForeheadPin.d.ts","sourceRoot":"","sources":["../../src/vts/getForeheadPin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACvB,oEAAoE;IACpE,IAAI,IAAI,cAAc,GAAG,IAAI,CAAC;IAC9B,0CAA0C;IAC1C,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAChC,GAAG,EAAE,SAAS,EACd,OAAO,EAAE,UAAU,EACnB,QAAQ,GAAE,OAAe,GAC1B,OAAO,CAAC,cAAc,CAAC,CASzB"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Get the user's forehead pin coordinates. If a pin was previously saved
3
+ * in the provided storage, returns it immediately. Otherwise, waits for
4
+ * the user to click their forehead in VTS and saves the result.
5
+ *
6
+ * The caller is responsible for prompting the user (via UI, console, etc.)
7
+ * BEFORE calling this function, since it blocks waiting for a click.
8
+ *
9
+ * @param vts - Connected VTSClient instance
10
+ * @param storage - Where to load/save the pin coordinates
11
+ * @param forceNew - If true, ignores saved pin and asks the user again
12
+ * @returns The forehead pin coordinates, ready for pinItemExact()
13
+ */
14
+ export async function getForeheadPin(vts, storage, forceNew = false) {
15
+ if (!forceNew) {
16
+ const saved = storage.load();
17
+ if (saved)
18
+ return saved;
19
+ }
20
+ const pin = await vts.requestUserClick();
21
+ storage.save(pin);
22
+ return pin;
23
+ }
24
+ //# sourceMappingURL=getForeheadPin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getForeheadPin.js","sourceRoot":"","sources":["../../src/vts/getForeheadPin.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,GAAc,EACd,OAAmB,EACnB,WAAoB,KAAK;IAEzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC5B,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -1,2 +1,3 @@
1
- export { VTSClient, VTSApiError, type VTSClientOptions, type LoadItemOptions, type PinInfo, type ModelParameter, type ParameterValue, } from "./VTSClient.js";
1
+ export { VTSClient, VTSApiError, type VTSClientOptions, type ClickPinResult, type LoadItemOptions, type PinInfo, type ModelParameter, type ParameterValue, } from "./VTSClient.js";
2
+ export { getForeheadPin, type PinStorage, } from "./getForeheadPin.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,GACtB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,cAAc,EACd,KAAK,UAAU,GAClB,MAAM,qBAAqB,CAAC"}
package/dist/vts/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { VTSClient, VTSApiError, } from "./VTSClient.js";
2
+ export { getForeheadPin, } from "./getForeheadPin.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,WAAW,GAMd,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,SAAS,EACT,WAAW,GAOd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACH,cAAc,GAEjB,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sarxina/sarxina-tools",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Shared streaming utilities — Twitch chat manager, VTube Studio client, etc.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",