@runanywhere/web 0.1.0-beta.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.
Files changed (205) hide show
  1. package/README.md +795 -0
  2. package/dist/Foundation/ErrorTypes.d.ts +61 -0
  3. package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
  4. package/dist/Foundation/ErrorTypes.js +90 -0
  5. package/dist/Foundation/ErrorTypes.js.map +1 -0
  6. package/dist/Foundation/EventBus.d.ts +171 -0
  7. package/dist/Foundation/EventBus.d.ts.map +1 -0
  8. package/dist/Foundation/EventBus.js +113 -0
  9. package/dist/Foundation/EventBus.js.map +1 -0
  10. package/dist/Foundation/PlatformAdapter.d.ts +101 -0
  11. package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
  12. package/dist/Foundation/PlatformAdapter.js +417 -0
  13. package/dist/Foundation/PlatformAdapter.js.map +1 -0
  14. package/dist/Foundation/SDKLogger.d.ts +33 -0
  15. package/dist/Foundation/SDKLogger.d.ts.map +1 -0
  16. package/dist/Foundation/SDKLogger.js +82 -0
  17. package/dist/Foundation/SDKLogger.js.map +1 -0
  18. package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
  19. package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
  20. package/dist/Foundation/SherpaONNXBridge.js +332 -0
  21. package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
  22. package/dist/Foundation/StructOffsets.d.ts +147 -0
  23. package/dist/Foundation/StructOffsets.d.ts.map +1 -0
  24. package/dist/Foundation/StructOffsets.js +161 -0
  25. package/dist/Foundation/StructOffsets.js.map +1 -0
  26. package/dist/Foundation/WASMBridge.d.ts +241 -0
  27. package/dist/Foundation/WASMBridge.d.ts.map +1 -0
  28. package/dist/Foundation/WASMBridge.js +393 -0
  29. package/dist/Foundation/WASMBridge.js.map +1 -0
  30. package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
  31. package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
  32. package/dist/Infrastructure/ArchiveUtility.js +139 -0
  33. package/dist/Infrastructure/ArchiveUtility.js.map +1 -0
  34. package/dist/Infrastructure/AudioCapture.d.ts +87 -0
  35. package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
  36. package/dist/Infrastructure/AudioCapture.js +231 -0
  37. package/dist/Infrastructure/AudioCapture.js.map +1 -0
  38. package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
  39. package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
  40. package/dist/Infrastructure/AudioPlayback.js +117 -0
  41. package/dist/Infrastructure/AudioPlayback.js.map +1 -0
  42. package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
  43. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
  44. package/dist/Infrastructure/DeviceCapabilities.js +111 -0
  45. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
  46. package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
  47. package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
  48. package/dist/Infrastructure/ExtensionRegistry.js +41 -0
  49. package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
  50. package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
  51. package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
  52. package/dist/Infrastructure/ModelDownloader.js +431 -0
  53. package/dist/Infrastructure/ModelDownloader.js.map +1 -0
  54. package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
  55. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
  56. package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
  57. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
  58. package/dist/Infrastructure/ModelManager.d.ts +219 -0
  59. package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
  60. package/dist/Infrastructure/ModelManager.js +885 -0
  61. package/dist/Infrastructure/ModelManager.js.map +1 -0
  62. package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
  63. package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
  64. package/dist/Infrastructure/ModelRegistry.js +122 -0
  65. package/dist/Infrastructure/ModelRegistry.js.map +1 -0
  66. package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
  67. package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
  68. package/dist/Infrastructure/OPFSStorage.js +330 -0
  69. package/dist/Infrastructure/OPFSStorage.js.map +1 -0
  70. package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
  71. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
  72. package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
  73. package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
  74. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
  75. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
  76. package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
  77. package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
  78. package/dist/Infrastructure/VideoCapture.d.ts +118 -0
  79. package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
  80. package/dist/Infrastructure/VideoCapture.js +207 -0
  81. package/dist/Infrastructure/VideoCapture.js.map +1 -0
  82. package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
  83. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
  84. package/dist/Public/Extensions/DiffusionTypes.js +28 -0
  85. package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
  86. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
  87. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
  88. package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
  89. package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
  90. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
  91. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
  92. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
  93. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
  94. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
  95. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
  96. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
  97. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
  98. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
  99. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
  100. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
  101. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
  102. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
  103. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
  104. package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
  105. package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
  106. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
  107. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
  108. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
  109. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
  110. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
  111. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
  112. package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
  113. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
  114. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
  115. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
  116. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
  117. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
  118. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
  119. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
  120. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
  121. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
  122. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
  123. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
  124. package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
  125. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
  126. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
  127. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
  128. package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
  129. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
  130. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
  131. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
  132. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
  133. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
  134. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
  135. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
  136. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
  137. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
  138. package/dist/Public/Extensions/STTTypes.d.ts +53 -0
  139. package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
  140. package/dist/Public/Extensions/STTTypes.js +16 -0
  141. package/dist/Public/Extensions/STTTypes.js.map +1 -0
  142. package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
  143. package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
  144. package/dist/Public/Extensions/TTSTypes.js +3 -0
  145. package/dist/Public/Extensions/TTSTypes.js.map +1 -0
  146. package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
  147. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
  148. package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
  149. package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
  150. package/dist/Public/Extensions/VADTypes.d.ts +30 -0
  151. package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
  152. package/dist/Public/Extensions/VADTypes.js +8 -0
  153. package/dist/Public/Extensions/VADTypes.js.map +1 -0
  154. package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
  155. package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
  156. package/dist/Public/Extensions/VLMTypes.js +24 -0
  157. package/dist/Public/Extensions/VLMTypes.js.map +1 -0
  158. package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
  159. package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
  160. package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
  161. package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
  162. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
  163. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
  164. package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
  165. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
  166. package/dist/Public/RunAnywhere.d.ts +121 -0
  167. package/dist/Public/RunAnywhere.d.ts.map +1 -0
  168. package/dist/Public/RunAnywhere.js +332 -0
  169. package/dist/Public/RunAnywhere.js.map +1 -0
  170. package/dist/index.d.ts +67 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +53 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/types/LLMTypes.d.ts +48 -0
  175. package/dist/types/LLMTypes.d.ts.map +1 -0
  176. package/dist/types/LLMTypes.js +8 -0
  177. package/dist/types/LLMTypes.js.map +1 -0
  178. package/dist/types/enums.d.ts +144 -0
  179. package/dist/types/enums.d.ts.map +1 -0
  180. package/dist/types/enums.js +159 -0
  181. package/dist/types/enums.js.map +1 -0
  182. package/dist/types/index.d.ts +9 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/index.js +8 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/dist/types/models.d.ts +154 -0
  187. package/dist/types/models.d.ts.map +1 -0
  188. package/dist/types/models.js +8 -0
  189. package/dist/types/models.js.map +1 -0
  190. package/dist/workers/vlm-worker.d.ts +9 -0
  191. package/dist/workers/vlm-worker.d.ts.map +1 -0
  192. package/dist/workers/vlm-worker.js +10 -0
  193. package/dist/workers/vlm-worker.js.map +1 -0
  194. package/package.json +62 -0
  195. package/wasm/racommons-webgpu.js +156 -0
  196. package/wasm/racommons-webgpu.wasm +0 -0
  197. package/wasm/racommons.js +126 -0
  198. package/wasm/racommons.wasm +0 -0
  199. package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
  200. package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
  201. package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
  202. package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
  203. package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
  204. package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
  205. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Extension Registry - Manages SDK extension lifecycle
3
+ *
4
+ * Provides a centralised registry so that RunAnywhere.shutdown() does not
5
+ * need to hard-code every extension cleanup call. Extensions are registered
6
+ * during SDK initialisation and cleaned up in reverse order on shutdown.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Extension Registry Singleton
10
+ // ---------------------------------------------------------------------------
11
+ class ExtensionRegistryImpl {
12
+ extensions = [];
13
+ /** Register an extension. Call in dependency order (low-level first). */
14
+ register(extension) {
15
+ // Avoid double-registration (e.g. if initialize() is called twice)
16
+ if (!this.extensions.includes(extension)) {
17
+ this.extensions.push(extension);
18
+ }
19
+ }
20
+ /**
21
+ * Cleanup all registered extensions in reverse registration order.
22
+ * Each cleanup is individually wrapped in try-catch so one failure
23
+ * does not prevent the rest from being cleaned up.
24
+ */
25
+ cleanupAll() {
26
+ for (let i = this.extensions.length - 1; i >= 0; i--) {
27
+ try {
28
+ this.extensions[i].cleanup();
29
+ }
30
+ catch {
31
+ // Ignore errors during shutdown
32
+ }
33
+ }
34
+ }
35
+ /** Reset the registry (call after full shutdown). */
36
+ reset() {
37
+ this.extensions = [];
38
+ }
39
+ }
40
+ export const ExtensionRegistry = new ExtensionRegistryImpl();
41
+ //# sourceMappingURL=ExtensionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionRegistry.js","sourceRoot":"","sources":["../../src/Infrastructure/ExtensionRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,MAAM,qBAAqB;IACjB,UAAU,GAAmB,EAAE,CAAC;IAExC,yEAAyE;IACzE,QAAQ,CAAC,SAAuB;QAC9B,mEAAmE;QACnE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK;QACH,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Model Downloader - Download orchestration with OPFS persistence
3
+ *
4
+ * Handles single-file and multi-file model downloads with progress tracking.
5
+ * Delegates all OPFS storage operations to the enhanced OPFSStorage class.
6
+ * Extracted from ModelManager to separate download concerns from load/catalog logic.
7
+ */
8
+ import { OPFSStorage } from './OPFSStorage';
9
+ import type { MetadataMap } from './OPFSStorage';
10
+ import type { ManagedModel } from './ModelRegistry';
11
+ import type { ModelRegistry } from './ModelRegistry';
12
+ /** Candidate model that could be evicted to free space. */
13
+ export interface EvictionCandidateInfo {
14
+ id: string;
15
+ name: string;
16
+ sizeBytes: number;
17
+ lastUsedAt: number;
18
+ }
19
+ /** Result of a pre-download quota check. */
20
+ export interface QuotaCheckResult {
21
+ /** Whether the model fits in available storage without eviction. */
22
+ fits: boolean;
23
+ /** Currently available bytes (estimate). */
24
+ availableBytes: number;
25
+ /** Total bytes needed for the model (primary + additional files). */
26
+ neededBytes: number;
27
+ /**
28
+ * Models that could be evicted to free space, sorted by lastUsedAt ascending
29
+ * (least recently used first). Only populated when `fits` is false.
30
+ */
31
+ evictionCandidates: EvictionCandidateInfo[];
32
+ }
33
+ export declare class ModelDownloader {
34
+ private readonly storage;
35
+ private readonly registry;
36
+ /**
37
+ * In-memory fallback cache for models that were downloaded successfully
38
+ * but failed to persist to OPFS (e.g. storage quota exceeded).
39
+ * Keyed by modelId/file key. Cleared once the data is consumed by loadFromOPFS.
40
+ */
41
+ private readonly memoryCache;
42
+ constructor(registry: ModelRegistry, storage: OPFSStorage);
43
+ /**
44
+ * Check whether a model will fit in OPFS without eviction.
45
+ *
46
+ * Uses `navigator.storage.estimate()` for available space and compares
47
+ * against the model's total size (primary + additional files).
48
+ * If the model won't fit, returns eviction candidates sorted by LRU.
49
+ *
50
+ * @param model - The model to check
51
+ * @param metadata - LRU metadata map (lastUsedAt per model)
52
+ * @param loadedModelId - Currently loaded model ID (excluded from eviction)
53
+ */
54
+ checkStorageQuota(model: ManagedModel, metadata: MetadataMap, loadedModelId?: string): Promise<QuotaCheckResult>;
55
+ /**
56
+ * Download a model (and any additional companion files).
57
+ * Handles both single-file and multi-file models.
58
+ */
59
+ downloadModel(modelId: string): Promise<void>;
60
+ /**
61
+ * Download a file from a URL with optional progress callback.
62
+ * Exposed so ModelManager can use it for on-demand file downloads during load.
63
+ *
64
+ * URLs are validated before fetching to prevent SSRF and enforce HTTPS.
65
+ */
66
+ downloadFile(url: string, onProgress?: (progress: number, bytesDownloaded: number, totalBytes: number) => void): Promise<Uint8Array>;
67
+ /** Store data in OPFS via OPFSStorage. Auto-evicts old models if quota is exceeded, falls back to in-memory cache. */
68
+ storeInOPFS(key: string, data: Uint8Array): Promise<void>;
69
+ /**
70
+ * Evict old models from OPFS to free space for a new model.
71
+ * Deletes models sorted by oldest-first until enough space is freed,
72
+ * skipping the model being stored AND any sibling files that belong
73
+ * to the same model (e.g. main model file and its mmproj companion).
74
+ *
75
+ * Sibling detection: files are siblings if one key is a prefix of
76
+ * the other, separated by "__" (e.g. "modelA" and "modelA__mmproj-...").
77
+ */
78
+ private evictOPFSModels;
79
+ /** Load data from OPFS via OPFSStorage, falling back to in-memory cache. */
80
+ loadFromOPFS(key: string): Promise<Uint8Array | null>;
81
+ /** Check existence in OPFS or in-memory cache. */
82
+ existsInOPFS(key: string): Promise<boolean>;
83
+ /** Check if data exists in actual OPFS storage (NOT memory cache). */
84
+ existsInActualOPFS(key: string): Promise<boolean>;
85
+ /** Delete from OPFS and memory cache. */
86
+ deleteFromOPFS(key: string): Promise<void>;
87
+ /** Get file size from OPFS without reading into memory. */
88
+ getOPFSFileSize(key: string): Promise<number | null>;
89
+ /**
90
+ * Build an OPFS key for additional files (e.g., mmproj).
91
+ * Uses `__` separator to avoid name collisions between
92
+ * a primary model FILE and a directory with the same name.
93
+ */
94
+ additionalFileKey(modelId: string, filename: string): string;
95
+ /** Emit a structured download progress event via EventBus */
96
+ private emitDownloadProgress;
97
+ }
98
+ //# sourceMappingURL=ModelDownloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelDownloader.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/ModelDownloader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,2DAA2D;AAC3D,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,IAAI,EAAE,OAAO,CAAC;IACd,4CAA4C;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,kBAAkB,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAkED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;gBAEjD,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW;IASzD;;;;;;;;;;OAUG;IACG,iBAAiB,CACrB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,WAAW,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,CAAC;IAmD5B;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyGnD;;;;;OAKG;IACG,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GACnF,OAAO,CAAC,UAAU,CAAC;IA+BtB,sHAAsH;IAChH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC/D;;;;;;;;OAQG;YACW,eAAe;IAmD7B,4EAA4E;IACtE,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA6B3D,kDAAkD;IAC5C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKjD,sEAAsE;IAChE,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD,yCAAyC;IACnC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhD,2DAA2D;IACrD,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ1D;;;;OAIG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI5D,6DAA6D;IAC7D,OAAO,CAAC,oBAAoB;CAS7B"}
@@ -0,0 +1,431 @@
1
+ /**
2
+ * Model Downloader - Download orchestration with OPFS persistence
3
+ *
4
+ * Handles single-file and multi-file model downloads with progress tracking.
5
+ * Delegates all OPFS storage operations to the enhanced OPFSStorage class.
6
+ * Extracted from ModelManager to separate download concerns from load/catalog logic.
7
+ */
8
+ import { EventBus } from '../Foundation/EventBus';
9
+ import { SDKLogger } from '../Foundation/SDKLogger';
10
+ import { ModelStatus, DownloadStage, SDKEventType } from '../types/enums';
11
+ // ---------------------------------------------------------------------------
12
+ // Model Downloader
13
+ // ---------------------------------------------------------------------------
14
+ /**
15
+ * Validate that a URL is safe to fetch from.
16
+ *
17
+ * Security: Prevents SSRF-like attacks where user-controlled model URLs
18
+ * could be pointed at internal/private network addresses. Only HTTPS is
19
+ * allowed in production. HTTP is permitted for localhost during development.
20
+ *
21
+ * @param url - The URL to validate
22
+ * @throws Error if the URL is not allowed
23
+ */
24
+ function validateModelUrl(url) {
25
+ let parsed;
26
+ try {
27
+ parsed = new URL(url);
28
+ }
29
+ catch {
30
+ throw new Error(`Invalid model URL: ${url}`);
31
+ }
32
+ // Only allow HTTPS (and HTTP for localhost during development)
33
+ const isLocalhost = parsed.hostname === 'localhost' ||
34
+ parsed.hostname === '127.0.0.1' ||
35
+ parsed.hostname === '[::1]';
36
+ if (parsed.protocol === 'http:' && !isLocalhost) {
37
+ throw new Error(`Model URL must use HTTPS (got HTTP for ${parsed.hostname}). ` +
38
+ 'HTTP is only allowed for localhost during development.');
39
+ }
40
+ if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
41
+ throw new Error(`Model URL has unsupported protocol: ${parsed.protocol}`);
42
+ }
43
+ // Block common private/internal network ranges
44
+ const blockedPatterns = [
45
+ /^10\./,
46
+ /^172\.(1[6-9]|2\d|3[0-1])\./,
47
+ /^192\.168\./,
48
+ /^169\.254\./,
49
+ /^0\./,
50
+ ];
51
+ if (!isLocalhost) {
52
+ for (const pattern of blockedPatterns) {
53
+ if (pattern.test(parsed.hostname)) {
54
+ throw new Error(`Model URL points to private network address: ${parsed.hostname}`);
55
+ }
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * ModelDownloader — downloads model files (single or multi-file) and
61
+ * persists them in OPFS via `OPFSStorage`. Reports progress to the
62
+ * `ModelRegistry` and emits events via `EventBus`.
63
+ */
64
+ const logger = new SDKLogger('ModelDownloader');
65
+ export class ModelDownloader {
66
+ storage;
67
+ registry;
68
+ /**
69
+ * In-memory fallback cache for models that were downloaded successfully
70
+ * but failed to persist to OPFS (e.g. storage quota exceeded).
71
+ * Keyed by modelId/file key. Cleared once the data is consumed by loadFromOPFS.
72
+ */
73
+ memoryCache = new Map();
74
+ constructor(registry, storage) {
75
+ this.registry = registry;
76
+ this.storage = storage;
77
+ }
78
+ // ---------------------------------------------------------------------------
79
+ // Public API
80
+ // ---------------------------------------------------------------------------
81
+ /**
82
+ * Check whether a model will fit in OPFS without eviction.
83
+ *
84
+ * Uses `navigator.storage.estimate()` for available space and compares
85
+ * against the model's total size (primary + additional files).
86
+ * If the model won't fit, returns eviction candidates sorted by LRU.
87
+ *
88
+ * @param model - The model to check
89
+ * @param metadata - LRU metadata map (lastUsedAt per model)
90
+ * @param loadedModelId - Currently loaded model ID (excluded from eviction)
91
+ */
92
+ async checkStorageQuota(model, metadata, loadedModelId) {
93
+ const { usedBytes, quotaBytes } = await this.storage.getStorageUsage();
94
+ const availableBytes = Math.max(0, quotaBytes - usedBytes);
95
+ // Estimate total download size
96
+ const neededBytes = model.memoryRequirement ?? 0;
97
+ if (availableBytes >= neededBytes) {
98
+ return { fits: true, availableBytes, neededBytes, evictionCandidates: [] };
99
+ }
100
+ // Not enough space — build eviction candidate list
101
+ const stored = await this.storage.listModels();
102
+ const keepBase = model.id.split('__')[0];
103
+ const candidates = [];
104
+ for (const s of stored) {
105
+ // Skip the model being downloaded and its siblings
106
+ const storedBase = s.id.split('__')[0];
107
+ if (storedBase === keepBase)
108
+ continue;
109
+ // Skip currently loaded model
110
+ if (loadedModelId && s.id === loadedModelId)
111
+ continue;
112
+ // Skip metadata file
113
+ if (s.id === '_metadata.json')
114
+ continue;
115
+ const registered = this.registry.getModel(s.id) ?? this.registry.getModel(storedBase);
116
+ candidates.push({
117
+ id: storedBase,
118
+ name: registered?.name ?? s.id,
119
+ sizeBytes: s.sizeBytes,
120
+ lastUsedAt: metadata[storedBase]?.lastUsedAt ?? s.lastModified,
121
+ });
122
+ }
123
+ // Deduplicate by base id (main model + companion files combined)
124
+ const deduped = new Map();
125
+ for (const c of candidates) {
126
+ const existing = deduped.get(c.id);
127
+ if (existing) {
128
+ existing.sizeBytes += c.sizeBytes;
129
+ }
130
+ else {
131
+ deduped.set(c.id, { ...c });
132
+ }
133
+ }
134
+ // Sort by least-recently-used first
135
+ const sorted = [...deduped.values()].sort((a, b) => a.lastUsedAt - b.lastUsedAt);
136
+ return { fits: false, availableBytes, neededBytes, evictionCandidates: sorted };
137
+ }
138
+ /**
139
+ * Download a model (and any additional companion files).
140
+ * Handles both single-file and multi-file models.
141
+ */
142
+ async downloadModel(modelId) {
143
+ const model = this.registry.getModel(modelId);
144
+ if (!model)
145
+ return;
146
+ this.registry.updateModel(modelId, { status: ModelStatus.Downloading, downloadProgress: 0 });
147
+ EventBus.shared.emit('model.downloadStarted', SDKEventType.Model, { modelId, url: model.url });
148
+ try {
149
+ const totalFiles = 1 + (model.additionalFiles?.length ?? 0);
150
+ let totalBytesDownloaded = 0;
151
+ let totalBytesExpected = 0;
152
+ // Download the primary file
153
+ const primaryData = await this.downloadFile(model.url, (progress, bytesDown, bytesTotal) => {
154
+ totalBytesDownloaded = bytesDown;
155
+ totalBytesExpected = bytesTotal * totalFiles; // rough estimate
156
+ const overallProgress = progress / totalFiles;
157
+ this.registry.updateModel(modelId, { downloadProgress: overallProgress });
158
+ this.emitDownloadProgress({
159
+ modelId,
160
+ stage: DownloadStage.Downloading,
161
+ progress: overallProgress,
162
+ bytesDownloaded: totalBytesDownloaded,
163
+ totalBytes: totalBytesExpected,
164
+ currentFile: model.url.split('/').pop(),
165
+ filesCompleted: 0,
166
+ filesTotal: totalFiles,
167
+ });
168
+ });
169
+ await this.storeInOPFS(modelId, primaryData);
170
+ // Download additional files (e.g., mmproj for VLM)
171
+ if (model.additionalFiles && model.additionalFiles.length > 0) {
172
+ for (let i = 0; i < model.additionalFiles.length; i++) {
173
+ const file = model.additionalFiles[i];
174
+ const fileKey = this.additionalFileKey(modelId, file.filename);
175
+ const fileData = await this.downloadFile(file.url, (progress, bytesDown, bytesTotal) => {
176
+ const baseProgress = (1 + i) / totalFiles;
177
+ const fileProgress = progress / totalFiles;
178
+ const overallProgress = baseProgress + fileProgress;
179
+ this.registry.updateModel(modelId, { downloadProgress: overallProgress });
180
+ this.emitDownloadProgress({
181
+ modelId,
182
+ stage: DownloadStage.Downloading,
183
+ progress: overallProgress,
184
+ bytesDownloaded: bytesDown,
185
+ totalBytes: bytesTotal,
186
+ currentFile: file.filename,
187
+ filesCompleted: 1 + i,
188
+ filesTotal: totalFiles,
189
+ });
190
+ });
191
+ await this.storeInOPFS(fileKey, fileData);
192
+ }
193
+ }
194
+ // Validating stage
195
+ this.emitDownloadProgress({
196
+ modelId,
197
+ stage: DownloadStage.Validating,
198
+ progress: 0.95,
199
+ bytesDownloaded: totalBytesDownloaded,
200
+ totalBytes: totalBytesExpected,
201
+ filesCompleted: totalFiles,
202
+ filesTotal: totalFiles,
203
+ });
204
+ let totalSize = primaryData.length;
205
+ if (model.additionalFiles) {
206
+ for (const file of model.additionalFiles) {
207
+ const fileKey = this.additionalFileKey(modelId, file.filename);
208
+ const size = await this.storage.getFileSize(fileKey);
209
+ if (size !== null)
210
+ totalSize += size;
211
+ }
212
+ }
213
+ this.registry.updateModel(modelId, {
214
+ status: ModelStatus.Downloaded,
215
+ downloadProgress: 1,
216
+ sizeBytes: totalSize,
217
+ });
218
+ // Completed stage
219
+ this.emitDownloadProgress({
220
+ modelId,
221
+ stage: DownloadStage.Completed,
222
+ progress: 1,
223
+ bytesDownloaded: totalSize,
224
+ totalBytes: totalSize,
225
+ filesCompleted: totalFiles,
226
+ filesTotal: totalFiles,
227
+ });
228
+ EventBus.shared.emit('model.downloadCompleted', SDKEventType.Model, { modelId, sizeBytes: totalSize });
229
+ }
230
+ catch (err) {
231
+ const message = err instanceof Error ? err.message : String(err);
232
+ this.registry.updateModel(modelId, { status: ModelStatus.Error, error: message });
233
+ EventBus.shared.emit('model.downloadFailed', SDKEventType.Model, { modelId, error: message });
234
+ }
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // OPFS delegation helpers (used by ModelManager for load-time operations)
238
+ // ---------------------------------------------------------------------------
239
+ /**
240
+ * Download a file from a URL with optional progress callback.
241
+ * Exposed so ModelManager can use it for on-demand file downloads during load.
242
+ *
243
+ * URLs are validated before fetching to prevent SSRF and enforce HTTPS.
244
+ */
245
+ async downloadFile(url, onProgress) {
246
+ validateModelUrl(url);
247
+ const response = await fetch(url);
248
+ if (!response.ok)
249
+ throw new Error(`HTTP ${response.status} for ${url}`);
250
+ const total = Number(response.headers.get('content-length') || 0);
251
+ const reader = response.body?.getReader();
252
+ if (!reader)
253
+ throw new Error('No response body');
254
+ const chunks = [];
255
+ let received = 0;
256
+ while (true) {
257
+ const { done, value } = await reader.read();
258
+ if (done)
259
+ break;
260
+ chunks.push(value);
261
+ received += value.length;
262
+ const progress = total > 0 ? received / total : 0;
263
+ onProgress?.(progress, received, total);
264
+ }
265
+ const data = new Uint8Array(received);
266
+ let offset = 0;
267
+ for (const chunk of chunks) {
268
+ data.set(chunk, offset);
269
+ offset += chunk.length;
270
+ }
271
+ return data;
272
+ }
273
+ /** Store data in OPFS via OPFSStorage. Auto-evicts old models if quota is exceeded, falls back to in-memory cache. */
274
+ async storeInOPFS(key, data) {
275
+ const sizeMB = (data.length / 1024 / 1024).toFixed(1);
276
+ try {
277
+ // First attempt
278
+ await this.storage.saveModel(key, data.buffer);
279
+ logger.info(`Stored ${key} in OPFS (${sizeMB} MB)`);
280
+ this.memoryCache.delete(key);
281
+ return;
282
+ }
283
+ catch (err) {
284
+ const msg = err instanceof Error ? err.message : String(err);
285
+ const isQuota = msg.toLowerCase().includes('quota');
286
+ if (!isQuota) {
287
+ // Non-quota error — fall back to memory cache directly
288
+ logger.warning(`OPFS store failed for "${key}": ${msg}`);
289
+ logger.info(`Caching "${key}" in memory (${sizeMB} MB) for current session`);
290
+ this.memoryCache.set(key, data);
291
+ return;
292
+ }
293
+ // Quota exceeded — try to evict old models and retry
294
+ logger.warning(`OPFS quota exceeded for "${key}" (${sizeMB} MB), evicting old models...`);
295
+ await this.evictOPFSModels(key, data.length);
296
+ }
297
+ // Retry after eviction
298
+ try {
299
+ await this.storage.saveModel(key, data.buffer);
300
+ logger.info(`Stored ${key} in OPFS after eviction (${sizeMB} MB)`);
301
+ this.memoryCache.delete(key);
302
+ }
303
+ catch (retryErr) {
304
+ const retryMsg = retryErr instanceof Error ? retryErr.message : String(retryErr);
305
+ logger.warning(`OPFS store still failed after eviction for "${key}": ${retryMsg}`);
306
+ logger.info(`Caching "${key}" in memory (${sizeMB} MB) for current session`);
307
+ this.memoryCache.set(key, data);
308
+ }
309
+ }
310
+ /**
311
+ * Evict old models from OPFS to free space for a new model.
312
+ * Deletes models sorted by oldest-first until enough space is freed,
313
+ * skipping the model being stored AND any sibling files that belong
314
+ * to the same model (e.g. main model file and its mmproj companion).
315
+ *
316
+ * Sibling detection: files are siblings if one key is a prefix of
317
+ * the other, separated by "__" (e.g. "modelA" and "modelA__mmproj-...").
318
+ */
319
+ async evictOPFSModels(keepKey, neededBytes) {
320
+ const stored = await this.storage.listModels();
321
+ if (stored.length === 0)
322
+ return;
323
+ // Extract the base model ID (everything before the first "__" separator).
324
+ // This links companion files: "modelA__mmproj-..." → base "modelA".
325
+ const keepBase = keepKey.split('__')[0];
326
+ // Sort by oldest first (least recently modified)
327
+ stored.sort((a, b) => a.lastModified - b.lastModified);
328
+ let freedBytes = 0;
329
+ for (const model of stored) {
330
+ // Never evict the file we're about to store
331
+ if (model.id === keepKey)
332
+ continue;
333
+ // Never evict internal metadata files
334
+ if (model.id === '_metadata.json')
335
+ continue;
336
+ // Never evict sibling files that belong to the same model.
337
+ // A stored file is a sibling if its base (before "__") matches keepBase,
338
+ // or if keepBase starts with the stored file's ID (the stored file IS
339
+ // the main model and we're storing a companion like mmproj).
340
+ const storedBase = model.id.split('__')[0];
341
+ if (storedBase === keepBase)
342
+ continue;
343
+ const sizeMBEvict = (model.sizeBytes / 1024 / 1024).toFixed(1);
344
+ logger.info(`Evicting "${model.id}" (${sizeMBEvict} MB) from OPFS`);
345
+ await this.storage.deleteModel(model.id);
346
+ // Also update registry status if this model is registered
347
+ const registered = this.registry.getModel(model.id);
348
+ if (registered && registered.status === ModelStatus.Downloaded) {
349
+ this.registry.updateModel(model.id, { status: ModelStatus.Registered });
350
+ }
351
+ // Emit event so UI can show a toast notification
352
+ EventBus.shared.emit('model.evicted', SDKEventType.Storage, {
353
+ modelId: model.id,
354
+ modelName: registered?.name ?? model.id,
355
+ freedBytes: model.sizeBytes,
356
+ });
357
+ freedBytes += model.sizeBytes;
358
+ if (freedBytes >= neededBytes) {
359
+ logger.info(`Evicted ${(freedBytes / 1024 / 1024).toFixed(1)} MB, should have room now`);
360
+ break;
361
+ }
362
+ }
363
+ }
364
+ /** Load data from OPFS via OPFSStorage, falling back to in-memory cache. */
365
+ async loadFromOPFS(key) {
366
+ // Try OPFS first (persistent storage)
367
+ const buffer = await this.storage.loadModel(key);
368
+ if (buffer && buffer.byteLength > 0) {
369
+ const sizeMB = buffer.byteLength / 1024 / 1024;
370
+ logger.debug(`Loading ${key} from OPFS (${sizeMB.toFixed(1)} MB)`);
371
+ return new Uint8Array(buffer);
372
+ }
373
+ // Clean up corrupted 0-byte OPFS entries
374
+ if (buffer && buffer.byteLength === 0) {
375
+ logger.warning(`OPFS entry for "${key}" is 0 bytes (corrupted), deleting`);
376
+ await this.deleteFromOPFS(key);
377
+ }
378
+ // Fall back to in-memory cache (populated when OPFS store failed, e.g. quota exceeded).
379
+ // IMPORTANT: Do NOT delete from cache here — the model may be unloaded and
380
+ // reloaded later (switching between models). Memory cache entries are only
381
+ // cleared on explicit model deletion via deleteFromOPFS().
382
+ const cached = this.memoryCache.get(key);
383
+ if (cached) {
384
+ const sizeMB = cached.length / 1024 / 1024;
385
+ logger.debug(`Loading ${key} from memory cache (${sizeMB.toFixed(1)} MB) — not persisted to OPFS`);
386
+ return cached;
387
+ }
388
+ return null;
389
+ }
390
+ /** Check existence in OPFS or in-memory cache. */
391
+ async existsInOPFS(key) {
392
+ if (this.memoryCache.has(key))
393
+ return true;
394
+ return this.storage.hasModel(key);
395
+ }
396
+ /** Check if data exists in actual OPFS storage (NOT memory cache). */
397
+ async existsInActualOPFS(key) {
398
+ return this.storage.hasModel(key);
399
+ }
400
+ /** Delete from OPFS and memory cache. */
401
+ async deleteFromOPFS(key) {
402
+ this.memoryCache.delete(key);
403
+ await this.storage.deleteModel(key);
404
+ }
405
+ /** Get file size from OPFS without reading into memory. */
406
+ async getOPFSFileSize(key) {
407
+ return this.storage.getFileSize(key);
408
+ }
409
+ // ---------------------------------------------------------------------------
410
+ // Helpers
411
+ // ---------------------------------------------------------------------------
412
+ /**
413
+ * Build an OPFS key for additional files (e.g., mmproj).
414
+ * Uses `__` separator to avoid name collisions between
415
+ * a primary model FILE and a directory with the same name.
416
+ */
417
+ additionalFileKey(modelId, filename) {
418
+ return `${modelId}__${filename}`;
419
+ }
420
+ /** Emit a structured download progress event via EventBus */
421
+ emitDownloadProgress(progress) {
422
+ EventBus.shared.emit('model.downloadProgress', SDKEventType.Model, {
423
+ modelId: progress.modelId,
424
+ progress: progress.progress,
425
+ bytesDownloaded: progress.bytesDownloaded,
426
+ totalBytes: progress.totalBytes,
427
+ stage: progress.stage,
428
+ });
429
+ }
430
+ }
431
+ //# sourceMappingURL=ModelDownloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelDownloader.js","sourceRoot":"","sources":["../../src/Infrastructure/ModelDownloader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA+B1E,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GACf,MAAM,CAAC,QAAQ,KAAK,WAAW;QAC/B,MAAM,CAAC,QAAQ,KAAK,WAAW;QAC/B,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC;IAE9B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,0CAA0C,MAAM,CAAC,QAAQ,KAAK;YAC9D,wDAAwD,CACzD,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,+CAA+C;IAC/C,MAAM,eAAe,GAAG;QACtB,OAAO;QACP,6BAA6B;QAC7B,aAAa;QACb,aAAa;QACb,MAAM;KACP,CAAC;IAEF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACtC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAEhD,MAAM,OAAO,eAAe;IACT,OAAO,CAAc;IACrB,QAAQ,CAAgB;IAEzC;;;;OAIG;IACc,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE7D,YAAY,QAAuB,EAAE,OAAoB;QACvD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E;;;;;;;;;;OAUG;IACH,KAAK,CAAC,iBAAiB,CACrB,KAAmB,EACnB,QAAqB,EACrB,aAAsB;QAEtB,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;QAE3D,+BAA+B;QAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC;QAEjD,IAAI,cAAc,IAAI,WAAW,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,EAAE,CAAC;QAC7E,CAAC;QAED,mDAAmD;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,UAAU,GAA4B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,mDAAmD;YACnD,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,UAAU,KAAK,QAAQ;gBAAE,SAAS;YACtC,8BAA8B;YAC9B,IAAI,aAAa,IAAI,CAAC,CAAC,EAAE,KAAK,aAAa;gBAAE,SAAS;YACtD,qBAAqB;YACrB,IAAI,CAAC,CAAC,EAAE,KAAK,gBAAgB;gBAAE,SAAS;YAExC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACtF,UAAU,CAAC,IAAI,CAAC;gBACd,EAAE,EAAE,UAAU;gBACd,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE;gBAC9B,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC,YAAY;aAC/D,CAAC,CAAC;QACL,CAAC;QAED,iEAAiE;QACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,oCAAoC;QACpC,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAEjF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAClF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7F,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;YAC5D,IAAI,oBAAoB,GAAG,CAAC,CAAC;YAC7B,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAE3B,4BAA4B;YAC5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;gBACzF,oBAAoB,GAAG,SAAS,CAAC;gBACjC,kBAAkB,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC,iBAAiB;gBAC/D,MAAM,eAAe,GAAG,QAAQ,GAAG,UAAU,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC1E,IAAI,CAAC,oBAAoB,CAAC;oBACxB,OAAO;oBACP,KAAK,EAAE,aAAa,CAAC,WAAW;oBAChC,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,oBAAoB;oBACrC,UAAU,EAAE,kBAAkB;oBAC9B,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;oBACvC,cAAc,EAAE,CAAC;oBACjB,UAAU,EAAE,UAAU;iBACvB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAE7C,mDAAmD;YACnD,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;oBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE;wBACrF,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC;wBAC1C,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,CAAC;wBAC3C,MAAM,eAAe,GAAG,YAAY,GAAG,YAAY,CAAC;wBACpD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,CAAC;wBAC1E,IAAI,CAAC,oBAAoB,CAAC;4BACxB,OAAO;4BACP,KAAK,EAAE,aAAa,CAAC,WAAW;4BAChC,QAAQ,EAAE,eAAe;4BACzB,eAAe,EAAE,SAAS;4BAC1B,UAAU,EAAE,UAAU;4BACtB,WAAW,EAAE,IAAI,CAAC,QAAQ;4BAC1B,cAAc,EAAE,CAAC,GAAG,CAAC;4BACrB,UAAU,EAAE,UAAU;yBACvB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,oBAAoB,CAAC;gBACxB,OAAO;gBACP,KAAK,EAAE,aAAa,CAAC,UAAU;gBAC/B,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,oBAAoB;gBACrC,UAAU,EAAE,kBAAkB;gBAC9B,cAAc,EAAE,UAAU;gBAC1B,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;YAEH,IAAI,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC;YACnC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBACrD,IAAI,IAAI,KAAK,IAAI;wBAAE,SAAS,IAAI,IAAI,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE;gBACjC,MAAM,EAAE,WAAW,CAAC,UAAU;gBAC9B,gBAAgB,EAAE,CAAC;gBACnB,SAAS,EAAE,SAAS;aACrB,CAAC,CAAC;YAEH,kBAAkB;YAClB,IAAI,CAAC,oBAAoB,CAAC;gBACxB,OAAO;gBACP,KAAK,EAAE,aAAa,CAAC,SAAS;gBAC9B,QAAQ,EAAE,CAAC;gBACX,eAAe,EAAE,SAAS;gBAC1B,UAAU,EAAE,SAAS;gBACrB,cAAc,EAAE,UAAU;gBAC1B,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;YACH,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QACzG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAClF,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAE9E;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAChB,GAAW,EACX,UAAoF;QAEpF,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC;QAExE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC;YACzB,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;QACzB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sHAAsH;IACtH,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,IAAgB;QAC7C,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,gBAAgB;YAChB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAqB,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,aAAa,MAAM,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,uDAAuD;gBACvD,MAAM,CAAC,OAAO,CAAC,0BAA0B,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,gBAAgB,MAAM,0BAA0B,CAAC,CAAC;gBAC7E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,qDAAqD;YACrD,MAAM,CAAC,OAAO,CAAC,4BAA4B,GAAG,MAAM,MAAM,8BAA8B,CAAC,CAAC;YAC1F,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,MAAqB,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,4BAA4B,MAAM,MAAM,CAAC,CAAC;YACnE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjF,MAAM,CAAC,OAAO,CAAC,+CAA+C,GAAG,MAAM,QAAQ,EAAE,CAAC,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,YAAY,GAAG,gBAAgB,MAAM,0BAA0B,CAAC,CAAC;YAC7E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,eAAe,CAAC,OAAe,EAAE,WAAmB;QAChE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAExC,iDAAiD;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QAEvD,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,4CAA4C;YAC5C,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO;gBAAE,SAAS;YAEnC,sCAAsC;YACtC,IAAI,KAAK,CAAC,EAAE,KAAK,gBAAgB;gBAAE,SAAS;YAE5C,2DAA2D;YAC3D,yEAAyE;YACzE,sEAAsE;YACtE,6DAA6D;YAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,UAAU,KAAK,QAAQ;gBAAE,SAAS;YAEtC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,EAAE,MAAM,WAAW,gBAAgB,CAAC,CAAC;YACpE,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEzC,0DAA0D;YAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpD,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,UAAU,EAAE,CAAC;gBAC/D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,iDAAiD;YACjD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,OAAO,EAAE;gBAC1D,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,SAAS,EAAE,UAAU,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE;gBACvC,UAAU,EAAE,KAAK,CAAC,SAAS;aAC5B,CAAC,CAAC;YAEH,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC;YAC9B,IAAI,UAAU,IAAI,WAAW,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;gBACzF,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,sCAAsC;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,eAAe,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,yCAAyC;QACzC,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,OAAO,CAAC,mBAAmB,GAAG,oCAAoC,CAAC,CAAC;YAC3E,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAED,wFAAwF;QACxF,2EAA2E;QAC3E,2EAA2E;QAC3E,2DAA2D;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,uBAAuB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;YACnG,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,YAAY,CAAC,GAAW;QAC5B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,kBAAkB,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,cAAc,CAAC,GAAW;QAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,2DAA2D;IAC3D,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAE9E;;;;OAIG;IACH,iBAAiB,CAAC,OAAe,EAAE,QAAgB;QACjD,OAAO,GAAG,OAAO,KAAK,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED,6DAA6D;IACrD,oBAAoB,CAAC,QAA0B;QACrD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,YAAY,CAAC,KAAK,EAAE;YACjE,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,KAAK,EAAE,QAAQ,CAAC,KAA2B;SAC5C,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Model Loader Interfaces
3
+ *
4
+ * Defines the contracts that model-loading extensions must implement.
5
+ * ModelManager depends on these interfaces (Infrastructure layer) rather
6
+ * than on the concrete extension objects in the Public layer, keeping the
7
+ * dependency flow correct: Public -> Infrastructure -> Foundation.
8
+ *
9
+ * Registrations are performed by the Public layer during SDK initialisation.
10
+ */
11
+ import type { STTModelConfig } from '../Public/Extensions/STTTypes';
12
+ import type { TTSVoiceConfig } from '../Public/Extensions/TTSTypes';
13
+ import type { VADModelConfig } from '../Public/Extensions/VADTypes';
14
+ /** Loader for LLM text generation models (RACommons WASM). */
15
+ export interface LLMModelLoader {
16
+ loadModel(modelPath: string, modelId: string, modelName?: string): Promise<void>;
17
+ unloadModel(): Promise<void>;
18
+ }
19
+ /** Loader for STT models (sherpa-onnx). */
20
+ export interface STTModelLoader {
21
+ loadModel(config: STTModelConfig): Promise<void>;
22
+ unloadModel(): Promise<void>;
23
+ }
24
+ /** Loader for TTS voice models (sherpa-onnx). */
25
+ export interface TTSModelLoader {
26
+ loadVoice(config: TTSVoiceConfig): Promise<void>;
27
+ unloadVoice(): Promise<void>;
28
+ }
29
+ /** Loader for VAD models (sherpa-onnx). */
30
+ export interface VADModelLoader {
31
+ loadModel(config: VADModelConfig): Promise<void>;
32
+ cleanup(): void;
33
+ }
34
+ //# sourceMappingURL=ModelLoaderTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelLoaderTypes.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/ModelLoaderTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAMpE,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Model Loader Interfaces
3
+ *
4
+ * Defines the contracts that model-loading extensions must implement.
5
+ * ModelManager depends on these interfaces (Infrastructure layer) rather
6
+ * than on the concrete extension objects in the Public layer, keeping the
7
+ * dependency flow correct: Public -> Infrastructure -> Foundation.
8
+ *
9
+ * Registrations are performed by the Public layer during SDK initialisation.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=ModelLoaderTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelLoaderTypes.js","sourceRoot":"","sources":["../../src/Infrastructure/ModelLoaderTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}