@runanywhere/web-llamacpp 0.1.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +75 -0
  2. package/dist/Extensions/DiffusionTypes.d.ts +64 -0
  3. package/dist/Extensions/DiffusionTypes.d.ts.map +1 -0
  4. package/dist/Extensions/DiffusionTypes.js +28 -0
  5. package/dist/Extensions/DiffusionTypes.js.map +1 -0
  6. package/dist/Extensions/EmbeddingsTypes.d.ts +33 -0
  7. package/dist/Extensions/EmbeddingsTypes.d.ts.map +1 -0
  8. package/dist/Extensions/EmbeddingsTypes.js +13 -0
  9. package/dist/Extensions/EmbeddingsTypes.js.map +1 -0
  10. package/dist/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
  11. package/dist/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
  12. package/dist/Extensions/RunAnywhere+Diffusion.js +185 -0
  13. package/dist/Extensions/RunAnywhere+Diffusion.js.map +1 -0
  14. package/dist/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
  15. package/dist/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
  16. package/dist/Extensions/RunAnywhere+Embeddings.js +236 -0
  17. package/dist/Extensions/RunAnywhere+Embeddings.js.map +1 -0
  18. package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
  19. package/dist/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
  20. package/dist/Extensions/RunAnywhere+StructuredOutput.js +194 -0
  21. package/dist/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
  22. package/dist/Extensions/RunAnywhere+TextGeneration.d.ts +87 -0
  23. package/dist/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
  24. package/dist/Extensions/RunAnywhere+TextGeneration.js +525 -0
  25. package/dist/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
  26. package/dist/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
  27. package/dist/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
  28. package/dist/Extensions/RunAnywhere+ToolCalling.js +574 -0
  29. package/dist/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
  30. package/dist/Extensions/RunAnywhere+VLM.d.ts +57 -0
  31. package/dist/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
  32. package/dist/Extensions/RunAnywhere+VLM.js +258 -0
  33. package/dist/Extensions/RunAnywhere+VLM.js.map +1 -0
  34. package/dist/Extensions/ToolCallingTypes.d.ts +78 -0
  35. package/dist/Extensions/ToolCallingTypes.d.ts.map +1 -0
  36. package/dist/Extensions/ToolCallingTypes.js +8 -0
  37. package/dist/Extensions/ToolCallingTypes.js.map +1 -0
  38. package/dist/Extensions/VLMTypes.d.ts +16 -0
  39. package/dist/Extensions/VLMTypes.d.ts.map +1 -0
  40. package/dist/Extensions/VLMTypes.js +18 -0
  41. package/dist/Extensions/VLMTypes.js.map +1 -0
  42. package/dist/Foundation/AnalyticsEventsBridge.d.ts +38 -0
  43. package/dist/Foundation/AnalyticsEventsBridge.d.ts.map +1 -0
  44. package/dist/Foundation/AnalyticsEventsBridge.js +394 -0
  45. package/dist/Foundation/AnalyticsEventsBridge.js.map +1 -0
  46. package/dist/Foundation/LlamaCppBridge.d.ts +182 -0
  47. package/dist/Foundation/LlamaCppBridge.d.ts.map +1 -0
  48. package/dist/Foundation/LlamaCppBridge.js +483 -0
  49. package/dist/Foundation/LlamaCppBridge.js.map +1 -0
  50. package/dist/Foundation/LlamaCppOffsets.d.ts +32 -0
  51. package/dist/Foundation/LlamaCppOffsets.d.ts.map +1 -0
  52. package/dist/Foundation/LlamaCppOffsets.js +191 -0
  53. package/dist/Foundation/LlamaCppOffsets.js.map +1 -0
  54. package/dist/Foundation/PlatformAdapter.d.ts +109 -0
  55. package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
  56. package/dist/Foundation/PlatformAdapter.js +417 -0
  57. package/dist/Foundation/PlatformAdapter.js.map +1 -0
  58. package/dist/Foundation/TelemetryService.d.ts +96 -0
  59. package/dist/Foundation/TelemetryService.d.ts.map +1 -0
  60. package/dist/Foundation/TelemetryService.js +345 -0
  61. package/dist/Foundation/TelemetryService.js.map +1 -0
  62. package/dist/Foundation/WASMAnalyticsEmitter.d.ts +29 -0
  63. package/dist/Foundation/WASMAnalyticsEmitter.d.ts.map +1 -0
  64. package/dist/Foundation/WASMAnalyticsEmitter.js +70 -0
  65. package/dist/Foundation/WASMAnalyticsEmitter.js.map +1 -0
  66. package/dist/Infrastructure/VLMWorkerBridge.d.ts +219 -0
  67. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
  68. package/dist/Infrastructure/VLMWorkerBridge.js +288 -0
  69. package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
  70. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
  71. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
  72. package/dist/Infrastructure/VLMWorkerRuntime.js +620 -0
  73. package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
  74. package/dist/LlamaCPP.d.ts +49 -0
  75. package/dist/LlamaCPP.d.ts.map +1 -0
  76. package/dist/LlamaCPP.js +63 -0
  77. package/dist/LlamaCPP.js.map +1 -0
  78. package/dist/LlamaCppProvider.d.ts +32 -0
  79. package/dist/LlamaCppProvider.d.ts.map +1 -0
  80. package/dist/LlamaCppProvider.js +106 -0
  81. package/dist/LlamaCppProvider.js.map +1 -0
  82. package/dist/index.d.ts +43 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +41 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/workers/vlm-worker.d.ts +9 -0
  87. package/dist/workers/vlm-worker.d.ts.map +1 -0
  88. package/dist/workers/vlm-worker.js +10 -0
  89. package/dist/workers/vlm-worker.js.map +1 -0
  90. package/package.json +69 -0
  91. package/wasm/racommons-llamacpp-webgpu.js +159 -0
  92. package/wasm/racommons-llamacpp-webgpu.wasm +0 -0
  93. package/wasm/racommons-llamacpp.js +129 -0
  94. package/wasm/racommons-llamacpp.wasm +0 -0
@@ -0,0 +1,345 @@
1
+ /**
2
+ * TelemetryService.ts
3
+ *
4
+ * Web SDK bridge to the C++ telemetry manager (rac_telemetry_manager_*).
5
+ * Mirrors the role of TelemetryBridge.cpp in React Native.
6
+ *
7
+ * Architecture:
8
+ * - Creates rac_telemetry_manager_t via WASM
9
+ * - Registers an HTTP callback that C++ calls when events need sending
10
+ * - The HTTP callback uses HTTPService (browser fetch) to POST to the endpoint
11
+ * - Calls rac_telemetry_manager_http_complete() with the result
12
+ * - Also provides AnalyticsEventCallback for forwarding events from AnalyticsEventsBridge
13
+ *
14
+ * Device UUID:
15
+ * - Persisted in localStorage under 'rac_device_id'
16
+ * - Generated with crypto.randomUUID() on first run
17
+ */
18
+ import { SDKLogger, SDKEnvironment, HTTPService } from '@runanywhere/web';
19
+ const logger = new SDKLogger('TelemetryService');
20
+ const DEVICE_ID_KEY = 'rac_device_id';
21
+ const SDK_VERSION = '0.1.0-beta.8';
22
+ // C++ rac_environment_t values
23
+ const RAC_ENV_DEVELOPMENT = 0;
24
+ const RAC_ENV_STAGING = 1;
25
+ const RAC_ENV_PRODUCTION = 2;
26
+ /**
27
+ * Columns in the V2 `telemetry_events` Supabase table.
28
+ * The C++ telemetry manager serializes modality-specific fields (e.g.
29
+ * `speech_duration_ms`, `audio_duration_ms`, `word_count`) into the same
30
+ * flat JSON payload. In production these go through the backend API which
31
+ * splits them into child tables (`stt_telemetry`, `tts_telemetry`, etc.),
32
+ * but in dev mode we POST directly to Supabase REST API — PostgREST
33
+ * rejects any column not in the target table with HTTP 400.
34
+ */
35
+ const TELEMETRY_V2_COLUMNS = new Set([
36
+ 'id', 'org_id', 'api_key_id', 'device_id', 'sdk_event_id',
37
+ 'event_type', 'modality', 'session_id', 'framework',
38
+ 'model_id', 'model_name', 'device', 'os_version', 'platform',
39
+ 'sdk_version', 'processing_time_ms', 'success',
40
+ 'error_message', 'error_code', 'event_timestamp', 'created_at',
41
+ 'received_at', 'migrated_from_v1', 'v1_source_id', 'synced_from_prod',
42
+ ]);
43
+ // ---------------------------------------------------------------------------
44
+ // Device UUID helper
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Returns the persistent device UUID, creating one if it doesn't exist.
48
+ * Uses localStorage for persistence across page loads.
49
+ */
50
+ export function getOrCreateDeviceId() {
51
+ try {
52
+ const existing = localStorage.getItem(DEVICE_ID_KEY);
53
+ if (existing)
54
+ return existing;
55
+ const id = crypto.randomUUID();
56
+ localStorage.setItem(DEVICE_ID_KEY, id);
57
+ return id;
58
+ }
59
+ catch {
60
+ // Fallback when localStorage is unavailable (e.g., private browsing restrictions)
61
+ return crypto.randomUUID();
62
+ }
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // TelemetryService
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Manages the lifecycle of the C++ telemetry manager and bridges HTTP calls
69
+ * to browser fetch for telemetry event batching and delivery.
70
+ */
71
+ export class TelemetryService {
72
+ static _instance = null;
73
+ static get shared() {
74
+ if (!TelemetryService._instance) {
75
+ TelemetryService._instance = new TelemetryService();
76
+ }
77
+ return TelemetryService._instance;
78
+ }
79
+ _module = null;
80
+ _handle = 0; // rac_telemetry_manager_t*
81
+ _httpCallbackPtr = 0; // Emscripten function table ptr
82
+ _initialized = false;
83
+ _initPromise = null; // guards concurrent initialize() calls
84
+ constructor() { }
85
+ // ---------------------------------------------------------------------------
86
+ // Lifecycle
87
+ // ---------------------------------------------------------------------------
88
+ /**
89
+ * Initialize the telemetry manager.
90
+ * Called from LlamaCppBridge._doLoad() after WASM is loaded.
91
+ *
92
+ * Concurrent calls are safe: a second caller awaits the in-flight promise
93
+ * rather than starting a duplicate initialization, preventing duplicate
94
+ * WASM handles and leaked function-table entries.
95
+ */
96
+ async initialize(module, environment, deviceInfo) {
97
+ if (this._initialized) {
98
+ logger.warning('TelemetryService already initialized');
99
+ return;
100
+ }
101
+ // If initialization is already in flight, wait for it rather than
102
+ // starting a second one — mirrors the LlamaCppBridge.ensureLoaded() pattern.
103
+ if (this._initPromise) {
104
+ await this._initPromise;
105
+ return;
106
+ }
107
+ this._initPromise = this._doInitialize(module, environment, deviceInfo);
108
+ try {
109
+ await this._initPromise;
110
+ }
111
+ finally {
112
+ this._initPromise = null;
113
+ }
114
+ }
115
+ /**
116
+ * Callback for AnalyticsEventsBridge — forwards raw C++ event to telemetry manager.
117
+ */
118
+ trackAnalyticsEvent(eventType, dataPtr) {
119
+ if (!this._initialized || !this._module || !this._handle)
120
+ return;
121
+ try {
122
+ if (typeof this._module._rac_telemetry_manager_track_analytics === 'function') {
123
+ this._module._rac_telemetry_manager_track_analytics(this._handle, eventType, dataPtr);
124
+ }
125
+ }
126
+ catch {
127
+ // Silent — telemetry must never crash the app
128
+ }
129
+ }
130
+ /**
131
+ * Flush all queued telemetry events immediately.
132
+ */
133
+ flush() {
134
+ if (!this._initialized || !this._module || !this._handle)
135
+ return;
136
+ try {
137
+ if (typeof this._module._rac_telemetry_manager_flush === 'function') {
138
+ this._module._rac_telemetry_manager_flush(this._handle);
139
+ }
140
+ }
141
+ catch {
142
+ // Silent — telemetry must never crash the app
143
+ }
144
+ }
145
+ /**
146
+ * Flush and tear down the telemetry manager.
147
+ */
148
+ shutdown() {
149
+ if (!this._initialized)
150
+ return;
151
+ this.flush();
152
+ try {
153
+ if (this._module && this._handle) {
154
+ if (typeof this._module._rac_telemetry_manager_set_http_callback === 'function') {
155
+ this._module._rac_telemetry_manager_set_http_callback(this._handle, 0, 0);
156
+ }
157
+ if (typeof this._module._rac_telemetry_manager_destroy === 'function') {
158
+ this._module._rac_telemetry_manager_destroy(this._handle);
159
+ }
160
+ }
161
+ if (this._module && this._httpCallbackPtr !== 0) {
162
+ if (typeof this._module.removeFunction === 'function') {
163
+ this._module.removeFunction(this._httpCallbackPtr);
164
+ }
165
+ }
166
+ }
167
+ catch {
168
+ // Silent — cleanup must not throw
169
+ }
170
+ this._handle = 0;
171
+ this._httpCallbackPtr = 0;
172
+ this._module = null;
173
+ this._initialized = false;
174
+ TelemetryService._instance = null;
175
+ logger.debug('TelemetryService shut down');
176
+ }
177
+ // ---------------------------------------------------------------------------
178
+ // Private
179
+ // ---------------------------------------------------------------------------
180
+ /**
181
+ * Core initialization logic — only called once, guarded by initialize().
182
+ */
183
+ async _doInitialize(module, environment, deviceInfo) {
184
+ if (typeof module._rac_telemetry_manager_create !== 'function') {
185
+ logger.warning('rac_telemetry_manager_create not available — telemetry disabled');
186
+ return;
187
+ }
188
+ this._module = module;
189
+ // Map TypeScript SDKEnvironment to C++ rac_environment_t
190
+ const racEnv = this.mapEnvironment(environment);
191
+ const deviceId = getOrCreateDeviceId();
192
+ // Alloc C strings
193
+ const deviceIdPtr = this.allocString(deviceId);
194
+ const platformPtr = this.allocString('web');
195
+ const versionPtr = this.allocString(SDK_VERSION);
196
+ this._handle = module._rac_telemetry_manager_create(racEnv, deviceIdPtr, platformPtr, versionPtr);
197
+ this.freeAll([deviceIdPtr, platformPtr, versionPtr]);
198
+ if (!this._handle) {
199
+ logger.warning('rac_telemetry_manager_create returned null — telemetry disabled');
200
+ this._module = null;
201
+ return;
202
+ }
203
+ // Set device info
204
+ if (typeof module._rac_telemetry_manager_set_device_info === 'function') {
205
+ const modelPtr = this.allocString(deviceInfo.model ?? 'Browser');
206
+ const osVersionPtr = this.allocString(deviceInfo.osVersion ?? 'unknown');
207
+ module._rac_telemetry_manager_set_device_info(this._handle, modelPtr, osVersionPtr);
208
+ this.freeAll([modelPtr, osVersionPtr]);
209
+ }
210
+ // Register HTTP callback
211
+ this.registerHttpCallback(environment);
212
+ // Configure HTTPService in dev mode using WASM dev config
213
+ if (environment === SDKEnvironment.Development) {
214
+ this.configureDevHTTP(module);
215
+ }
216
+ this._initialized = true;
217
+ logger.info(`TelemetryService initialized (env=${environment}, device=${deviceId.substring(0, 8)}...)`);
218
+ }
219
+ /**
220
+ * Registers the HTTP callback with the WASM telemetry manager.
221
+ * C++ will call this when it wants to POST a telemetry batch.
222
+ *
223
+ * C signature: void(void* user_data, const char* endpoint, const char* json_body,
224
+ * size_t json_length, rac_bool_t requires_auth)
225
+ * Emscripten signature: 'viiiii'
226
+ *
227
+ * IMPORTANT: We call http_complete SYNCHRONOUSLY (before the async fetch) to
228
+ * prevent C++ from re-flushing the same event while awaiting the HTTP response,
229
+ * which caused duplicate POSTs. The actual fetch continues in the background.
230
+ */
231
+ registerHttpCallback(environment) {
232
+ const m = this._module;
233
+ if (typeof m._rac_telemetry_manager_set_http_callback !== 'function')
234
+ return;
235
+ this._httpCallbackPtr = m.addFunction((_userData, endpointPtr, jsonBodyPtr, _jsonLength, _requiresAuth) => {
236
+ const endpoint = m.UTF8ToString(endpointPtr);
237
+ const jsonBody = m.UTF8ToString(jsonBodyPtr);
238
+ // Tell C++ immediately that the request is being handled (prevents retry/re-flush)
239
+ if (typeof m._rac_telemetry_manager_http_complete === 'function') {
240
+ m._rac_telemetry_manager_http_complete(this._handle, 1, 0, 0);
241
+ }
242
+ // Fire-and-forget async HTTP POST (actual delivery happens in background)
243
+ this.performHttpPost(endpoint, jsonBody, environment).catch((err) => {
244
+ logger.debug(`Telemetry POST failed: ${err instanceof Error ? err.message : String(err)}`);
245
+ });
246
+ }, 'viiiii');
247
+ m._rac_telemetry_manager_set_http_callback(this._handle, this._httpCallbackPtr, 0);
248
+ logger.debug('Telemetry HTTP callback registered');
249
+ }
250
+ /**
251
+ * Perform the actual HTTP POST for a telemetry batch.
252
+ * Returns the response JSON string on success.
253
+ */
254
+ async performHttpPost(endpoint, jsonBody, environment) {
255
+ if (!HTTPService.shared.isConfigured) {
256
+ logger.debug('HTTPService not configured — skipping telemetry POST');
257
+ return null;
258
+ }
259
+ try {
260
+ let body;
261
+ try {
262
+ body = JSON.parse(jsonBody);
263
+ }
264
+ catch {
265
+ body = jsonBody;
266
+ }
267
+ // In dev mode we POST directly to Supabase REST API which rejects
268
+ // columns that don't exist on the target table. The C++ telemetry
269
+ // manager includes modality-specific metrics (e.g. speech_duration_ms,
270
+ // audio_duration_ms) that belong in child tables in V2. Strip them
271
+ // so PostgREST accepts the payload.
272
+ if (environment === SDKEnvironment.Development && endpoint.includes('telemetry_events')) {
273
+ body = this.filterForDevTable(body);
274
+ }
275
+ const response = await HTTPService.shared.post(endpoint, body);
276
+ return typeof response === 'string' ? response : JSON.stringify(response);
277
+ }
278
+ catch (err) {
279
+ logger.debug(`Telemetry POST failed (${environment}): ${err instanceof Error ? err.message : String(err)}`);
280
+ return null;
281
+ }
282
+ }
283
+ /**
284
+ * Strip keys that don't exist in the V2 `telemetry_events` table.
285
+ * Handles both array format (dev flat batch) and single-object format.
286
+ */
287
+ filterForDevTable(body) {
288
+ if (Array.isArray(body)) {
289
+ return body.map((item) => this.filterObject(item));
290
+ }
291
+ if (body !== null && typeof body === 'object') {
292
+ return this.filterObject(body);
293
+ }
294
+ return body;
295
+ }
296
+ filterObject(obj) {
297
+ const filtered = {};
298
+ for (const key of Object.keys(obj)) {
299
+ if (TELEMETRY_V2_COLUMNS.has(key)) {
300
+ filtered[key] = obj[key];
301
+ }
302
+ }
303
+ return filtered;
304
+ }
305
+ /**
306
+ * If the WASM module has dev config compiled in, use it to configure HTTPService.
307
+ */
308
+ configureDevHTTP(module) {
309
+ if (typeof module._rac_wasm_dev_config_is_available !== 'function')
310
+ return;
311
+ if (!module._rac_wasm_dev_config_is_available())
312
+ return;
313
+ const urlPtr = module._rac_wasm_dev_config_get_supabase_url?.() ?? 0;
314
+ const keyPtr = module._rac_wasm_dev_config_get_supabase_key?.() ?? 0;
315
+ const url = urlPtr ? module.UTF8ToString(urlPtr) : '';
316
+ const key = keyPtr ? module.UTF8ToString(keyPtr) : '';
317
+ if (url && key) {
318
+ HTTPService.shared.configureDev({ supabaseURL: url, supabaseKey: key });
319
+ logger.info('HTTPService configured with WASM dev config (Supabase)');
320
+ }
321
+ }
322
+ mapEnvironment(env) {
323
+ switch (env) {
324
+ case SDKEnvironment.Development: return RAC_ENV_DEVELOPMENT;
325
+ case SDKEnvironment.Staging: return RAC_ENV_STAGING;
326
+ case SDKEnvironment.Production: return RAC_ENV_PRODUCTION;
327
+ default: return RAC_ENV_PRODUCTION;
328
+ }
329
+ }
330
+ allocString(str) {
331
+ const m = this._module;
332
+ const len = m.lengthBytesUTF8(str) + 1;
333
+ const ptr = m._malloc(len);
334
+ m.stringToUTF8(str, ptr, len);
335
+ return ptr;
336
+ }
337
+ freeAll(ptrs) {
338
+ const m = this._module;
339
+ for (const ptr of ptrs) {
340
+ if (ptr)
341
+ m._free(ptr);
342
+ }
343
+ }
344
+ }
345
+ //# sourceMappingURL=TelemetryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelemetryService.js","sourceRoot":"","sources":["../../src/Foundation/TelemetryService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * WASMAnalyticsEmitter — routes analytics events into the C++ telemetry
3
+ * manager via Emscripten ccall() on the LlamaCpp WASM module.
4
+ *
5
+ * Each method maps 1:1 to a C-linkage function in events.cpp:
6
+ * rac_analytics_emit_stt_transcription_completed(...)
7
+ * → ccall('rac_analytics_emit_stt_transcription_completed', ...)
8
+ *
9
+ * Emscripten handles string marshalling: allocates C strings in WASM heap,
10
+ * copies UTF-8 data, and frees after the call returns.
11
+ */
12
+ import type { AnalyticsEmitterBackend } from '@runanywhere/web';
13
+ export declare class WASMAnalyticsEmitter implements AnalyticsEmitterBackend {
14
+ emitSTTModelLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
15
+ emitSTTModelLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
16
+ emitSTTTranscriptionCompleted(transcriptionId: string, modelId: string, text: string, confidence: number, durationMs: number, audioLengthMs: number, audioSizeBytes: number, wordCount: number, realTimeFactor: number, language: string, sampleRate: number, framework: number): void;
17
+ emitSTTTranscriptionFailed(transcriptionId: string, modelId: string, errorCode: number, errorMessage: string): void;
18
+ emitTTSVoiceLoadCompleted(modelId: string, modelName: string, durationMs: number, framework: number): void;
19
+ emitTTSVoiceLoadFailed(modelId: string, errorCode: number, errorMessage: string): void;
20
+ emitTTSSynthesisCompleted(synthesisId: string, modelId: string, characterCount: number, audioDurationMs: number, audioSizeBytes: number, processingDurationMs: number, charactersPerSecond: number, sampleRate: number, framework: number): void;
21
+ emitTTSSynthesisFailed(synthesisId: string, modelId: string, errorCode: number, errorMessage: string): void;
22
+ emitVADSpeechStarted(): void;
23
+ emitVADSpeechEnded(speechDurationMs: number, energyLevel: number): void;
24
+ emitModelDownloadStarted(modelId: string): void;
25
+ emitModelDownloadCompleted(modelId: string, fileSizeBytes: number, durationMs: number): void;
26
+ emitModelDownloadFailed(modelId: string, errorMessage: string): void;
27
+ private call;
28
+ }
29
+ //# sourceMappingURL=WASMAnalyticsEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WASMAnalyticsEmitter.d.ts","sourceRoot":"","sources":["../../src/Foundation/WASMAnalyticsEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,qBAAa,oBAAqB,YAAW,uBAAuB;IAGlE,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1G,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMtF,6BAA6B,CAC3B,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAC1E,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EACjE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAC3D,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACpC,IAAI;IAQP,0BAA0B,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQnH,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1G,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMtF,yBAAyB,CACvB,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAC5D,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAC7E,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GACjE,IAAI;IAOP,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQ3G,oBAAoB,IAAI,IAAI;IAI5B,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAQvE,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/C,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAM5F,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAQpE,OAAO,CAAC,IAAI;CAOb"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * WASMAnalyticsEmitter — routes analytics events into the C++ telemetry
3
+ * manager via Emscripten ccall() on the LlamaCpp WASM module.
4
+ *
5
+ * Each method maps 1:1 to a C-linkage function in events.cpp:
6
+ * rac_analytics_emit_stt_transcription_completed(...)
7
+ * → ccall('rac_analytics_emit_stt_transcription_completed', ...)
8
+ *
9
+ * Emscripten handles string marshalling: allocates C strings in WASM heap,
10
+ * copies UTF-8 data, and frees after the call returns.
11
+ */
12
+ import { LlamaCppBridge } from './LlamaCppBridge';
13
+ export class WASMAnalyticsEmitter {
14
+ // -- STT -----------------------------------------------------------------
15
+ emitSTTModelLoadCompleted(modelId, modelName, durationMs, framework) {
16
+ this.call('rac_analytics_emit_stt_model_load_completed', ['string', 'string', 'number', 'number'], [modelId, modelName, durationMs, framework]);
17
+ }
18
+ emitSTTModelLoadFailed(modelId, errorCode, errorMessage) {
19
+ this.call('rac_analytics_emit_stt_model_load_failed', ['string', 'number', 'string'], [modelId, errorCode, errorMessage]);
20
+ }
21
+ emitSTTTranscriptionCompleted(transcriptionId, modelId, text, confidence, durationMs, audioLengthMs, audioSizeBytes, wordCount, realTimeFactor, language, sampleRate, framework) {
22
+ this.call('rac_analytics_emit_stt_transcription_completed', ['string', 'string', 'string', 'number', 'number', 'number',
23
+ 'number', 'number', 'number', 'string', 'number', 'number'], [transcriptionId, modelId, text, confidence, durationMs, audioLengthMs,
24
+ audioSizeBytes, wordCount, realTimeFactor, language, sampleRate, framework]);
25
+ }
26
+ emitSTTTranscriptionFailed(transcriptionId, modelId, errorCode, errorMessage) {
27
+ this.call('rac_analytics_emit_stt_transcription_failed', ['string', 'string', 'number', 'string'], [transcriptionId, modelId, errorCode, errorMessage]);
28
+ }
29
+ // -- TTS -----------------------------------------------------------------
30
+ emitTTSVoiceLoadCompleted(modelId, modelName, durationMs, framework) {
31
+ this.call('rac_analytics_emit_tts_voice_load_completed', ['string', 'string', 'number', 'number'], [modelId, modelName, durationMs, framework]);
32
+ }
33
+ emitTTSVoiceLoadFailed(modelId, errorCode, errorMessage) {
34
+ this.call('rac_analytics_emit_tts_voice_load_failed', ['string', 'number', 'string'], [modelId, errorCode, errorMessage]);
35
+ }
36
+ emitTTSSynthesisCompleted(synthesisId, modelId, characterCount, audioDurationMs, audioSizeBytes, processingDurationMs, charactersPerSecond, sampleRate, framework) {
37
+ this.call('rac_analytics_emit_tts_synthesis_completed', ['string', 'string', 'number', 'number', 'number', 'number', 'number', 'number', 'number'], [synthesisId, modelId, characterCount, audioDurationMs, audioSizeBytes,
38
+ processingDurationMs, charactersPerSecond, sampleRate, framework]);
39
+ }
40
+ emitTTSSynthesisFailed(synthesisId, modelId, errorCode, errorMessage) {
41
+ this.call('rac_analytics_emit_tts_synthesis_failed', ['string', 'string', 'number', 'string'], [synthesisId, modelId, errorCode, errorMessage]);
42
+ }
43
+ // -- VAD -----------------------------------------------------------------
44
+ emitVADSpeechStarted() {
45
+ this.call('rac_analytics_emit_vad_speech_started', [], []);
46
+ }
47
+ emitVADSpeechEnded(speechDurationMs, energyLevel) {
48
+ this.call('rac_analytics_emit_vad_speech_ended', ['number', 'number'], [speechDurationMs, energyLevel]);
49
+ }
50
+ // -- Download ------------------------------------------------------------
51
+ emitModelDownloadStarted(modelId) {
52
+ this.call('rac_analytics_emit_model_download_started', ['string'], [modelId]);
53
+ }
54
+ emitModelDownloadCompleted(modelId, fileSizeBytes, durationMs) {
55
+ this.call('rac_analytics_emit_model_download_completed', ['string', 'number', 'number'], [modelId, fileSizeBytes, durationMs]);
56
+ }
57
+ emitModelDownloadFailed(modelId, errorMessage) {
58
+ this.call('rac_analytics_emit_model_download_failed', ['string', 'string'], [modelId, errorMessage]);
59
+ }
60
+ // -- Internals -----------------------------------------------------------
61
+ call(funcName, argTypes, args) {
62
+ try {
63
+ LlamaCppBridge.shared.callFunction(funcName, null, argTypes, args);
64
+ }
65
+ catch {
66
+ // Silently ignore — telemetry must never crash the app
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=WASMAnalyticsEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WASMAnalyticsEmitter.js","sourceRoot":"","sources":["../../src/Foundation/WASMAnalyticsEmitter.ts"],"names":[],"mappings":"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"}