@runanywhere/web 0.1.0-beta.1 → 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 (269) hide show
  1. package/README.md +85 -34
  2. package/dist/Foundation/ErrorTypes.js +7 -0
  3. package/dist/Foundation/ErrorTypes.js.map +1 -1
  4. package/dist/Foundation/EventBus.js.map +1 -1
  5. package/dist/Foundation/StructOffsets.js +6 -156
  6. package/dist/Foundation/StructOffsets.js.map +1 -1
  7. package/dist/Foundation/WASMBridge.js +7 -388
  8. package/dist/Foundation/WASMBridge.js.map +1 -1
  9. package/dist/Infrastructure/AudioFileLoader.js +57 -0
  10. package/dist/Infrastructure/AudioFileLoader.js.map +1 -0
  11. package/dist/Infrastructure/DeviceCapabilities.js +8 -3
  12. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -1
  13. package/dist/Infrastructure/ExtensionPoint.js +225 -0
  14. package/dist/Infrastructure/ExtensionPoint.js.map +1 -0
  15. package/dist/Infrastructure/LocalFileStorage.js +462 -0
  16. package/dist/Infrastructure/LocalFileStorage.js.map +1 -0
  17. package/dist/Infrastructure/ModelDownloader.js +186 -16
  18. package/dist/Infrastructure/ModelDownloader.js.map +1 -1
  19. package/dist/Infrastructure/ModelFileInference.js +119 -0
  20. package/dist/Infrastructure/ModelFileInference.js.map +1 -0
  21. package/dist/Infrastructure/ModelLoaderTypes.js +7 -1
  22. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -1
  23. package/dist/Infrastructure/ModelManager.js +233 -566
  24. package/dist/Infrastructure/ModelManager.js.map +1 -1
  25. package/dist/Infrastructure/ModelRegistry.js +11 -0
  26. package/dist/Infrastructure/ModelRegistry.js.map +1 -1
  27. package/dist/Infrastructure/OPFSStorage.js +77 -0
  28. package/dist/Infrastructure/OPFSStorage.js.map +1 -1
  29. package/dist/Infrastructure/ProviderTypes.js +13 -0
  30. package/dist/Infrastructure/ProviderTypes.js.map +1 -0
  31. package/dist/Infrastructure/VideoCapture.js +15 -0
  32. package/dist/Infrastructure/VideoCapture.js.map +1 -1
  33. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +23 -51
  34. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -1
  35. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +63 -161
  36. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -1
  37. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +30 -44
  38. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -1
  39. package/dist/Public/Extensions/VoicePipelineTypes.js +4 -1
  40. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -1
  41. package/dist/Public/RunAnywhere.js +167 -211
  42. package/dist/Public/RunAnywhere.js.map +1 -1
  43. package/dist/index.js +24 -27
  44. package/dist/index.js.map +1 -1
  45. package/dist/services/AnalyticsEmitter.js +85 -0
  46. package/dist/services/AnalyticsEmitter.js.map +1 -0
  47. package/dist/services/HTTPService.js +255 -0
  48. package/dist/services/HTTPService.js.map +1 -0
  49. package/dist/{Foundation → types/Foundation}/ErrorTypes.d.ts +3 -0
  50. package/dist/types/Foundation/ErrorTypes.d.ts.map +1 -0
  51. package/dist/{Foundation → types/Foundation}/EventBus.d.ts +13 -2
  52. package/dist/types/Foundation/EventBus.d.ts.map +1 -0
  53. package/dist/types/Foundation/SDKLogger.d.ts.map +1 -0
  54. package/dist/{Foundation → types/Foundation}/StructOffsets.d.ts +6 -37
  55. package/dist/types/Foundation/StructOffsets.d.ts.map +1 -0
  56. package/dist/types/Foundation/WASMBridge.d.ts +13 -0
  57. package/dist/types/Foundation/WASMBridge.d.ts.map +1 -0
  58. package/dist/types/Infrastructure/ArchiveUtility.d.ts.map +1 -0
  59. package/dist/types/Infrastructure/AudioCapture.d.ts.map +1 -0
  60. package/dist/types/Infrastructure/AudioFileLoader.d.ts +32 -0
  61. package/dist/types/Infrastructure/AudioFileLoader.d.ts.map +1 -0
  62. package/dist/types/Infrastructure/AudioPlayback.d.ts.map +1 -0
  63. package/dist/types/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
  64. package/dist/types/Infrastructure/ExtensionPoint.d.ts +138 -0
  65. package/dist/types/Infrastructure/ExtensionPoint.d.ts.map +1 -0
  66. package/dist/types/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
  67. package/dist/types/Infrastructure/LocalFileStorage.d.ts +146 -0
  68. package/dist/types/Infrastructure/LocalFileStorage.d.ts.map +1 -0
  69. package/dist/{Infrastructure → types/Infrastructure}/ModelDownloader.d.ts +35 -5
  70. package/dist/types/Infrastructure/ModelDownloader.d.ts.map +1 -0
  71. package/dist/types/Infrastructure/ModelFileInference.d.ts +39 -0
  72. package/dist/types/Infrastructure/ModelFileInference.d.ts.map +1 -0
  73. package/dist/types/Infrastructure/ModelLoaderTypes.d.ts +124 -0
  74. package/dist/types/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
  75. package/dist/types/Infrastructure/ModelManager.d.ts +146 -0
  76. package/dist/types/Infrastructure/ModelManager.d.ts.map +1 -0
  77. package/dist/{Infrastructure → types/Infrastructure}/ModelRegistry.d.ts +6 -0
  78. package/dist/types/Infrastructure/ModelRegistry.d.ts.map +1 -0
  79. package/dist/{Infrastructure → types/Infrastructure}/OPFSStorage.d.ts +22 -0
  80. package/dist/types/Infrastructure/OPFSStorage.d.ts.map +1 -0
  81. package/dist/types/Infrastructure/ProviderTypes.d.ts +55 -0
  82. package/dist/types/Infrastructure/ProviderTypes.d.ts.map +1 -0
  83. package/dist/{Infrastructure → types/Infrastructure}/VideoCapture.d.ts +2 -0
  84. package/dist/types/Infrastructure/VideoCapture.d.ts.map +1 -0
  85. package/dist/{Public → types/Public}/Extensions/RunAnywhere+ModelManagement.d.ts +12 -4
  86. package/dist/types/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
  87. package/dist/types/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +81 -0
  88. package/dist/types/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
  89. package/dist/types/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +37 -0
  90. package/dist/types/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
  91. package/dist/types/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
  92. package/dist/types/Public/Extensions/VoicePipelineTypes.d.ts +60 -0
  93. package/dist/types/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
  94. package/dist/types/Public/RunAnywhere.d.ts +65 -0
  95. package/dist/types/Public/RunAnywhere.d.ts.map +1 -0
  96. package/dist/types/STTTypes.js +9 -0
  97. package/dist/types/STTTypes.js.map +1 -0
  98. package/dist/types/TTSTypes.js +8 -0
  99. package/dist/types/TTSTypes.js.map +1 -0
  100. package/dist/types/VADTypes.js +13 -0
  101. package/dist/types/VADTypes.js.map +1 -0
  102. package/dist/types/VLMTypes.js +13 -0
  103. package/dist/types/VLMTypes.js.map +1 -0
  104. package/dist/types/enums.js +7 -0
  105. package/dist/types/enums.js.map +1 -1
  106. package/dist/types/index.d.ts +59 -5
  107. package/dist/types/index.d.ts.map +1 -1
  108. package/dist/types/index.js +6 -0
  109. package/dist/types/index.js.map +1 -1
  110. package/dist/types/services/AnalyticsEmitter.d.ts +53 -0
  111. package/dist/types/services/AnalyticsEmitter.d.ts.map +1 -0
  112. package/dist/types/services/HTTPService.d.ts +87 -0
  113. package/dist/types/services/HTTPService.d.ts.map +1 -0
  114. package/dist/types/{LLMTypes.d.ts → types/LLMTypes.d.ts} +1 -0
  115. package/dist/types/types/LLMTypes.d.ts.map +1 -0
  116. package/dist/types/types/STTTypes.d.ts +44 -0
  117. package/dist/types/types/STTTypes.d.ts.map +1 -0
  118. package/dist/types/types/TTSTypes.d.ts +24 -0
  119. package/dist/types/types/TTSTypes.d.ts.map +1 -0
  120. package/dist/types/types/VADTypes.d.ts +19 -0
  121. package/dist/types/types/VADTypes.d.ts.map +1 -0
  122. package/dist/{Public/Extensions → types/types}/VLMTypes.d.ts +6 -12
  123. package/dist/types/types/VLMTypes.d.ts.map +1 -0
  124. package/dist/types/{enums.d.ts → types/enums.d.ts} +7 -0
  125. package/dist/types/types/enums.d.ts.map +1 -0
  126. package/dist/types/types/index.d.ts +17 -0
  127. package/dist/types/types/index.d.ts.map +1 -0
  128. package/dist/types/{models.d.ts → types/models.d.ts} +1 -0
  129. package/dist/types/types/models.d.ts.map +1 -0
  130. package/dist/types/types.d.ts +65 -0
  131. package/dist/types/types.d.ts.map +1 -0
  132. package/dist/types.js +21 -0
  133. package/dist/types.js.map +1 -0
  134. package/package.json +28 -42
  135. package/dist/Foundation/ErrorTypes.d.ts.map +0 -1
  136. package/dist/Foundation/EventBus.d.ts.map +0 -1
  137. package/dist/Foundation/PlatformAdapter.d.ts +0 -101
  138. package/dist/Foundation/PlatformAdapter.d.ts.map +0 -1
  139. package/dist/Foundation/PlatformAdapter.js +0 -417
  140. package/dist/Foundation/PlatformAdapter.js.map +0 -1
  141. package/dist/Foundation/SDKLogger.d.ts.map +0 -1
  142. package/dist/Foundation/SherpaONNXBridge.d.ts +0 -134
  143. package/dist/Foundation/SherpaONNXBridge.d.ts.map +0 -1
  144. package/dist/Foundation/SherpaONNXBridge.js +0 -332
  145. package/dist/Foundation/SherpaONNXBridge.js.map +0 -1
  146. package/dist/Foundation/StructOffsets.d.ts.map +0 -1
  147. package/dist/Foundation/WASMBridge.d.ts +0 -241
  148. package/dist/Foundation/WASMBridge.d.ts.map +0 -1
  149. package/dist/Infrastructure/ArchiveUtility.d.ts.map +0 -1
  150. package/dist/Infrastructure/AudioCapture.d.ts.map +0 -1
  151. package/dist/Infrastructure/AudioPlayback.d.ts.map +0 -1
  152. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +0 -1
  153. package/dist/Infrastructure/ExtensionRegistry.d.ts.map +0 -1
  154. package/dist/Infrastructure/ModelDownloader.d.ts.map +0 -1
  155. package/dist/Infrastructure/ModelLoaderTypes.d.ts +0 -34
  156. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +0 -1
  157. package/dist/Infrastructure/ModelManager.d.ts +0 -219
  158. package/dist/Infrastructure/ModelManager.d.ts.map +0 -1
  159. package/dist/Infrastructure/ModelRegistry.d.ts.map +0 -1
  160. package/dist/Infrastructure/OPFSStorage.d.ts.map +0 -1
  161. package/dist/Infrastructure/VLMWorkerBridge.d.ts +0 -211
  162. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +0 -1
  163. package/dist/Infrastructure/VLMWorkerBridge.js +0 -264
  164. package/dist/Infrastructure/VLMWorkerBridge.js.map +0 -1
  165. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +0 -38
  166. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +0 -1
  167. package/dist/Infrastructure/VLMWorkerRuntime.js +0 -503
  168. package/dist/Infrastructure/VLMWorkerRuntime.js.map +0 -1
  169. package/dist/Infrastructure/VideoCapture.d.ts.map +0 -1
  170. package/dist/Public/Extensions/DiffusionTypes.d.ts +0 -64
  171. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +0 -1
  172. package/dist/Public/Extensions/DiffusionTypes.js +0 -28
  173. package/dist/Public/Extensions/DiffusionTypes.js.map +0 -1
  174. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +0 -33
  175. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +0 -1
  176. package/dist/Public/Extensions/EmbeddingsTypes.js +0 -13
  177. package/dist/Public/Extensions/EmbeddingsTypes.js.map +0 -1
  178. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +0 -44
  179. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +0 -1
  180. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +0 -189
  181. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +0 -1
  182. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +0 -56
  183. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +0 -1
  184. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +0 -240
  185. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +0 -1
  186. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +0 -1
  187. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +0 -95
  188. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +0 -1
  189. package/dist/Public/Extensions/RunAnywhere+STT.js +0 -417
  190. package/dist/Public/Extensions/RunAnywhere+STT.js.map +0 -1
  191. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +0 -69
  192. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +0 -1
  193. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +0 -196
  194. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +0 -1
  195. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +0 -55
  196. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +0 -1
  197. package/dist/Public/Extensions/RunAnywhere+TTS.js +0 -253
  198. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +0 -1
  199. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +0 -80
  200. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +0 -1
  201. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +0 -436
  202. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +0 -1
  203. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +0 -82
  204. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +0 -1
  205. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +0 -576
  206. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +0 -1
  207. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +0 -70
  208. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +0 -1
  209. package/dist/Public/Extensions/RunAnywhere+VAD.js +0 -231
  210. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +0 -1
  211. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +0 -58
  212. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +0 -1
  213. package/dist/Public/Extensions/RunAnywhere+VLM.js +0 -262
  214. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +0 -1
  215. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +0 -49
  216. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +0 -1
  217. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +0 -63
  218. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +0 -1
  219. package/dist/Public/Extensions/STTTypes.d.ts +0 -53
  220. package/dist/Public/Extensions/STTTypes.d.ts.map +0 -1
  221. package/dist/Public/Extensions/STTTypes.js +0 -16
  222. package/dist/Public/Extensions/STTTypes.js.map +0 -1
  223. package/dist/Public/Extensions/TTSTypes.d.ts +0 -31
  224. package/dist/Public/Extensions/TTSTypes.d.ts.map +0 -1
  225. package/dist/Public/Extensions/TTSTypes.js +0 -3
  226. package/dist/Public/Extensions/TTSTypes.js.map +0 -1
  227. package/dist/Public/Extensions/ToolCallingTypes.d.ts +0 -78
  228. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +0 -1
  229. package/dist/Public/Extensions/ToolCallingTypes.js +0 -8
  230. package/dist/Public/Extensions/ToolCallingTypes.js.map +0 -1
  231. package/dist/Public/Extensions/VADTypes.d.ts +0 -30
  232. package/dist/Public/Extensions/VADTypes.d.ts.map +0 -1
  233. package/dist/Public/Extensions/VADTypes.js +0 -8
  234. package/dist/Public/Extensions/VADTypes.js.map +0 -1
  235. package/dist/Public/Extensions/VLMTypes.d.ts.map +0 -1
  236. package/dist/Public/Extensions/VLMTypes.js +0 -24
  237. package/dist/Public/Extensions/VLMTypes.js.map +0 -1
  238. package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +0 -1
  239. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +0 -69
  240. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +0 -1
  241. package/dist/Public/RunAnywhere.d.ts +0 -121
  242. package/dist/Public/RunAnywhere.d.ts.map +0 -1
  243. package/dist/index.d.ts +0 -67
  244. package/dist/index.d.ts.map +0 -1
  245. package/dist/types/LLMTypes.d.ts.map +0 -1
  246. package/dist/types/enums.d.ts.map +0 -1
  247. package/dist/types/models.d.ts.map +0 -1
  248. package/dist/workers/vlm-worker.d.ts +0 -9
  249. package/dist/workers/vlm-worker.d.ts.map +0 -1
  250. package/dist/workers/vlm-worker.js +0 -10
  251. package/dist/workers/vlm-worker.js.map +0 -1
  252. package/wasm/racommons-webgpu.js +0 -156
  253. package/wasm/racommons-webgpu.wasm +0 -0
  254. package/wasm/racommons.js +0 -126
  255. package/wasm/racommons.wasm +0 -0
  256. package/wasm/sherpa/sherpa-onnx-asr.js +0 -1538
  257. package/wasm/sherpa/sherpa-onnx-glue-original.js +0 -19
  258. package/wasm/sherpa/sherpa-onnx-glue.js +0 -17
  259. package/wasm/sherpa/sherpa-onnx-tts.js +0 -657
  260. package/wasm/sherpa/sherpa-onnx-vad.js +0 -337
  261. package/wasm/sherpa/sherpa-onnx-wave.js +0 -88
  262. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
  263. /package/dist/{Foundation → types/Foundation}/SDKLogger.d.ts +0 -0
  264. /package/dist/{Infrastructure → types/Infrastructure}/ArchiveUtility.d.ts +0 -0
  265. /package/dist/{Infrastructure → types/Infrastructure}/AudioCapture.d.ts +0 -0
  266. /package/dist/{Infrastructure → types/Infrastructure}/AudioPlayback.d.ts +0 -0
  267. /package/dist/{Infrastructure → types/Infrastructure}/DeviceCapabilities.d.ts +0 -0
  268. /package/dist/{Infrastructure → types/Infrastructure}/ExtensionRegistry.d.ts +0 -0
  269. /package/dist/{Public → types/Public}/Extensions/VoiceAgentTypes.d.ts +0 -0
@@ -0,0 +1,462 @@
1
+ /**
2
+ * LocalFileStorage - Persistent model storage using the File System Access API
3
+ *
4
+ * Allows users to choose a real folder on their local filesystem for model
5
+ * storage. Models are saved as actual files (e.g. ~/ai-models/smollm2.gguf)
6
+ * that persist permanently — no browser eviction, no re-downloads.
7
+ *
8
+ * The directory handle is stored in IndexedDB (not cookies — handles are
9
+ * structured-cloneable objects that can't be serialized to strings).
10
+ *
11
+ * Browser support:
12
+ * - Chrome 122+: Full support with persistent permissions ("Allow on every visit")
13
+ * - Chrome 86-121: Supported but re-prompts for permission each session
14
+ * - Edge: Same as Chrome (Chromium-based)
15
+ * - Firefox/Safari: NOT supported — falls back to OPFS storage
16
+ *
17
+ * Usage:
18
+ * const storage = new LocalFileStorage();
19
+ * await storage.chooseDirectory(); // User picks a folder
20
+ * await storage.saveModel('model-id', data);
21
+ *
22
+ * // On return visit:
23
+ * const restored = await storage.restoreDirectory();
24
+ * if (restored) {
25
+ * const data = await storage.loadModel('model-id');
26
+ * }
27
+ */
28
+ import { SDKLogger } from '../Foundation/SDKLogger';
29
+ const logger = new SDKLogger('LocalFileStorage');
30
+ // ---------------------------------------------------------------------------
31
+ // IndexedDB Constants
32
+ // ---------------------------------------------------------------------------
33
+ const DB_NAME = 'runanywhere-storage';
34
+ const DB_VERSION = 1;
35
+ const STORE_NAME = 'handles';
36
+ const HANDLE_KEY = 'modelDirectory';
37
+ const LS_DIR_NAME_KEY = 'runanywhere_storage_dir_name';
38
+ // ---------------------------------------------------------------------------
39
+ // LocalFileStorage
40
+ // ---------------------------------------------------------------------------
41
+ export class LocalFileStorage {
42
+ dirHandle = null;
43
+ _isReady = false;
44
+ _hasStoredHandle = false;
45
+ /** Per-key write lock to prevent concurrent writes to the same file. */
46
+ writeLocks = new Map();
47
+ // -------------------------------------------------------------------------
48
+ // Static
49
+ // -------------------------------------------------------------------------
50
+ /** Whether the File System Access API is available in this browser. */
51
+ static get isSupported() {
52
+ return typeof window !== 'undefined' && 'showDirectoryPicker' in window;
53
+ }
54
+ /**
55
+ * Get the stored directory name from localStorage (fast, synchronous).
56
+ * Available immediately on page load before IndexedDB restores the handle.
57
+ * Returns the folder name only (e.g. "ai-models"), not the full path.
58
+ */
59
+ static get storedDirectoryName() {
60
+ try {
61
+ return localStorage.getItem(LS_DIR_NAME_KEY);
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ // -------------------------------------------------------------------------
68
+ // State
69
+ // -------------------------------------------------------------------------
70
+ /** Whether the storage is ready for use (directory selected + permission granted). */
71
+ get isReady() {
72
+ return this._isReady && this.dirHandle !== null;
73
+ }
74
+ /** Whether a handle was found in IndexedDB (even if permission isn't granted yet). */
75
+ get hasStoredHandle() {
76
+ return this._hasStoredHandle;
77
+ }
78
+ /** The name of the chosen directory (for display in UI). */
79
+ get directoryName() {
80
+ return this.dirHandle?.name ?? null;
81
+ }
82
+ // -------------------------------------------------------------------------
83
+ // Directory Selection
84
+ // -------------------------------------------------------------------------
85
+ /**
86
+ * Prompt the user to choose a directory for model storage.
87
+ * Opens the OS folder picker dialog.
88
+ * Stores the directory handle in IndexedDB for future sessions.
89
+ *
90
+ * @returns true if a directory was selected, false if cancelled
91
+ */
92
+ async chooseDirectory() {
93
+ if (!LocalFileStorage.isSupported) {
94
+ logger.warning('File System Access API not supported in this browser');
95
+ return false;
96
+ }
97
+ try {
98
+ // showDirectoryPicker requires user gesture (button click)
99
+ const win = window;
100
+ this.dirHandle = await win.showDirectoryPicker({
101
+ mode: 'readwrite',
102
+ });
103
+ await this.storeHandle(this.dirHandle);
104
+ this._isReady = true;
105
+ this._hasStoredHandle = true;
106
+ // Persist directory name in localStorage for fast UI display on next visit
107
+ try {
108
+ localStorage.setItem(LS_DIR_NAME_KEY, this.dirHandle.name);
109
+ }
110
+ catch { /* non-critical */ }
111
+ logger.info(`Local storage directory selected: ${this.dirHandle.name}`);
112
+ return true;
113
+ }
114
+ catch (err) {
115
+ if (err instanceof Error && err.name === 'AbortError') {
116
+ logger.debug('User cancelled directory picker');
117
+ return false;
118
+ }
119
+ const message = err instanceof Error ? err.message : String(err);
120
+ logger.error(`Failed to choose directory: ${message}`);
121
+ return false;
122
+ }
123
+ }
124
+ /**
125
+ * Attempt to restore a previously chosen directory from IndexedDB.
126
+ *
127
+ * On Chrome 122+, if the user selected "Allow on every visit",
128
+ * permission is automatically granted without any prompt.
129
+ *
130
+ * @returns true if directory was restored and permission is granted.
131
+ * false if no handle stored or permission not granted (UI
132
+ * should show a "Re-authorize" button).
133
+ */
134
+ async restoreDirectory() {
135
+ if (!LocalFileStorage.isSupported)
136
+ return false;
137
+ try {
138
+ const handle = await this.retrieveHandle();
139
+ if (!handle) {
140
+ logger.debug('No stored directory handle found');
141
+ return false;
142
+ }
143
+ this._hasStoredHandle = true;
144
+ this.dirHandle = handle;
145
+ // queryPermission does NOT require user gesture
146
+ const permission = await handle.queryPermission({ mode: 'readwrite' });
147
+ if (permission === 'granted') {
148
+ this._isReady = true;
149
+ logger.info(`Local storage restored: ${handle.name}`);
150
+ return true;
151
+ }
152
+ // Permission not granted yet — user needs to click a button
153
+ // to trigger requestPermission() via requestAccess()
154
+ logger.debug(`Local storage handle found but permission is '${permission}' — needs re-authorization`);
155
+ this._isReady = false;
156
+ return false;
157
+ }
158
+ catch (err) {
159
+ const message = err instanceof Error ? err.message : String(err);
160
+ logger.warning(`Failed to restore directory: ${message}`);
161
+ return false;
162
+ }
163
+ }
164
+ /**
165
+ * Request readwrite permission on a previously stored handle.
166
+ * MUST be called from a user gesture (button click handler).
167
+ *
168
+ * @returns true if permission was granted
169
+ */
170
+ async requestAccess() {
171
+ if (!this.dirHandle) {
172
+ logger.warning('No directory handle to request access for');
173
+ return false;
174
+ }
175
+ try {
176
+ const permission = await this.dirHandle.requestPermission({ mode: 'readwrite' });
177
+ if (permission === 'granted') {
178
+ this._isReady = true;
179
+ logger.info(`Local storage re-authorized: ${this.dirHandle.name}`);
180
+ return true;
181
+ }
182
+ logger.debug(`Permission request result: ${permission}`);
183
+ return false;
184
+ }
185
+ catch (err) {
186
+ const message = err instanceof Error ? err.message : String(err);
187
+ logger.warning(`Permission request failed: ${message}`);
188
+ return false;
189
+ }
190
+ }
191
+ // -------------------------------------------------------------------------
192
+ // Model Operations
193
+ // -------------------------------------------------------------------------
194
+ /**
195
+ * Save model data to the local filesystem.
196
+ * Uses a per-key lock to prevent concurrent writes from corrupting files.
197
+ * @param key - Model identifier (used as filename)
198
+ * @param data - Model file data
199
+ */
200
+ async saveModel(key, data) {
201
+ return this.withWriteLock(key, () => this._saveModelImpl(key, data));
202
+ }
203
+ /**
204
+ * Save model data from a ReadableStream to the local filesystem.
205
+ * Streams data directly to disk without buffering the entire file in memory.
206
+ * Uses a per-key lock to prevent concurrent writes from corrupting files.
207
+ * @param key - Model identifier (used as filename)
208
+ * @param stream - Readable stream of model data
209
+ */
210
+ async saveModelFromStream(key, stream) {
211
+ return this.withWriteLock(key, () => this._saveStreamImpl(key, stream));
212
+ }
213
+ async _saveModelImpl(key, data) {
214
+ if (!this.dirHandle || !this._isReady) {
215
+ throw new Error('LocalFileStorage not ready — call chooseDirectory() or restoreDirectory() first.');
216
+ }
217
+ const filename = this.sanitizeFilename(key);
218
+ const fileHandle = await this.dirHandle.getFileHandle(filename, { create: true });
219
+ const writable = await fileHandle.createWritable();
220
+ try {
221
+ await writable.write(data);
222
+ await writable.close();
223
+ logger.info(`Saved model to local storage: ${filename} (${(data.byteLength / 1024 / 1024).toFixed(1)} MB)`);
224
+ }
225
+ catch (err) {
226
+ try {
227
+ await writable.abort();
228
+ }
229
+ catch { /* ignore */ }
230
+ throw err;
231
+ }
232
+ }
233
+ async _saveStreamImpl(key, stream) {
234
+ if (!this.dirHandle || !this._isReady) {
235
+ throw new Error('LocalFileStorage not ready — call chooseDirectory() or restoreDirectory() first.');
236
+ }
237
+ const filename = this.sanitizeFilename(key);
238
+ const fileHandle = await this.dirHandle.getFileHandle(filename, { create: true });
239
+ const writable = await fileHandle.createWritable();
240
+ try {
241
+ const reader = stream.getReader();
242
+ while (true) {
243
+ const { done, value } = await reader.read();
244
+ if (done)
245
+ break;
246
+ await writable.write(value);
247
+ }
248
+ await writable.close();
249
+ logger.info(`Streamed model to local storage: ${filename}`);
250
+ }
251
+ catch (err) {
252
+ try {
253
+ await writable.abort();
254
+ }
255
+ catch { /* ignore */ }
256
+ throw err;
257
+ }
258
+ }
259
+ /**
260
+ * Per-key write lock: ensures only one write operation per key at a time.
261
+ * Concurrent calls for the same key will be serialized.
262
+ */
263
+ async withWriteLock(key, fn) {
264
+ const prev = this.writeLocks.get(key) ?? Promise.resolve();
265
+ const next = prev.then(fn, fn); // chain even if previous rejected
266
+ this.writeLocks.set(key, next);
267
+ try {
268
+ await next;
269
+ }
270
+ finally {
271
+ // Clean up lock if this was the last write in the chain
272
+ if (this.writeLocks.get(key) === next) {
273
+ this.writeLocks.delete(key);
274
+ }
275
+ }
276
+ }
277
+ /**
278
+ * Load model data from the local filesystem.
279
+ * @param key - Model identifier
280
+ * @returns Model data, or null if not found
281
+ */
282
+ async loadModel(key) {
283
+ if (!this.dirHandle || !this._isReady)
284
+ return null;
285
+ try {
286
+ const filename = this.sanitizeFilename(key);
287
+ const fileHandle = await this.dirHandle.getFileHandle(filename);
288
+ const file = await fileHandle.getFile();
289
+ logger.info(`Loaded model from local storage: ${filename} (${(file.size / 1024 / 1024).toFixed(1)} MB)`);
290
+ return await file.arrayBuffer();
291
+ }
292
+ catch {
293
+ return null; // File not found
294
+ }
295
+ }
296
+ /**
297
+ * Load model data from the local filesystem as a ReadableStream.
298
+ * @param key - Model identifier
299
+ * @returns Readable stream of the model data, or null if not found
300
+ */
301
+ async loadModelStream(key) {
302
+ if (!this.dirHandle || !this._isReady)
303
+ return null;
304
+ try {
305
+ const filename = this.sanitizeFilename(key);
306
+ const fileHandle = await this.dirHandle.getFileHandle(filename);
307
+ const file = await fileHandle.getFile();
308
+ logger.info(`Loading model stream from local storage: ${filename} (${(file.size / 1024 / 1024).toFixed(1)} MB)`);
309
+ return file.stream();
310
+ }
311
+ catch {
312
+ return null; // File not found
313
+ }
314
+ }
315
+ /**
316
+ * Get the File object for a model without reading into memory.
317
+ * Enables streaming / mounting for locally stored files.
318
+ * @param key - Model identifier
319
+ */
320
+ async loadModelFile(key) {
321
+ if (!this.dirHandle || !this._isReady)
322
+ return null;
323
+ try {
324
+ const filename = this.sanitizeFilename(key);
325
+ const fileHandle = await this.dirHandle.getFileHandle(filename);
326
+ return await fileHandle.getFile();
327
+ }
328
+ catch {
329
+ return null;
330
+ }
331
+ }
332
+ /**
333
+ * Check if a model file exists in local storage.
334
+ * @param key - Model identifier
335
+ */
336
+ async hasModel(key) {
337
+ if (!this.dirHandle || !this._isReady)
338
+ return false;
339
+ try {
340
+ const filename = this.sanitizeFilename(key);
341
+ await this.dirHandle.getFileHandle(filename);
342
+ return true;
343
+ }
344
+ catch {
345
+ return false;
346
+ }
347
+ }
348
+ /**
349
+ * Delete a model file from local storage.
350
+ * @param key - Model identifier
351
+ */
352
+ async deleteModel(key) {
353
+ if (!this.dirHandle || !this._isReady)
354
+ return;
355
+ try {
356
+ const filename = this.sanitizeFilename(key);
357
+ await this.dirHandle.removeEntry(filename);
358
+ logger.info(`Deleted model from local storage: ${filename}`);
359
+ }
360
+ catch {
361
+ // File doesn't exist
362
+ }
363
+ }
364
+ /**
365
+ * Get file size without reading into memory.
366
+ * @param key - Model identifier
367
+ */
368
+ async getFileSize(key) {
369
+ if (!this.dirHandle || !this._isReady)
370
+ return null;
371
+ try {
372
+ const filename = this.sanitizeFilename(key);
373
+ const fileHandle = await this.dirHandle.getFileHandle(filename);
374
+ const file = await fileHandle.getFile();
375
+ return file.size;
376
+ }
377
+ catch {
378
+ return null;
379
+ }
380
+ }
381
+ /**
382
+ * List all model files in the directory.
383
+ */
384
+ async listModels() {
385
+ if (!this.dirHandle || !this._isReady)
386
+ return [];
387
+ const models = [];
388
+ for await (const [name, handle] of this.dirHandle.entries()) {
389
+ if (handle.kind === 'file') {
390
+ const file = await handle.getFile();
391
+ models.push({
392
+ id: name,
393
+ sizeBytes: file.size,
394
+ lastModified: file.lastModified,
395
+ });
396
+ }
397
+ }
398
+ return models;
399
+ }
400
+ // -------------------------------------------------------------------------
401
+ // IndexedDB Handle Persistence
402
+ // -------------------------------------------------------------------------
403
+ async openDB() {
404
+ return new Promise((resolve, reject) => {
405
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
406
+ request.onupgradeneeded = () => {
407
+ const db = request.result;
408
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
409
+ db.createObjectStore(STORE_NAME);
410
+ }
411
+ };
412
+ request.onsuccess = () => resolve(request.result);
413
+ request.onerror = () => reject(request.error);
414
+ });
415
+ }
416
+ async storeHandle(handle) {
417
+ try {
418
+ const db = await this.openDB();
419
+ const tx = db.transaction(STORE_NAME, 'readwrite');
420
+ tx.objectStore(STORE_NAME).put(handle, HANDLE_KEY);
421
+ await new Promise((resolve, reject) => {
422
+ tx.oncomplete = () => resolve();
423
+ tx.onerror = () => reject(tx.error);
424
+ });
425
+ db.close();
426
+ logger.debug('Directory handle stored in IndexedDB');
427
+ }
428
+ catch (err) {
429
+ const message = err instanceof Error ? err.message : String(err);
430
+ logger.warning(`Failed to store handle in IndexedDB: ${message}`);
431
+ }
432
+ }
433
+ async retrieveHandle() {
434
+ try {
435
+ const db = await this.openDB();
436
+ const tx = db.transaction(STORE_NAME, 'readonly');
437
+ const handle = await new Promise((resolve, reject) => {
438
+ const req = tx.objectStore(STORE_NAME).get(HANDLE_KEY);
439
+ req.onsuccess = () => resolve(req.result ?? null);
440
+ req.onerror = () => reject(req.error);
441
+ });
442
+ db.close();
443
+ return handle;
444
+ }
445
+ catch (err) {
446
+ const message = err instanceof Error ? err.message : String(err);
447
+ logger.warning(`Failed to retrieve handle from IndexedDB: ${message}`);
448
+ return null;
449
+ }
450
+ }
451
+ // -------------------------------------------------------------------------
452
+ // Helpers
453
+ // -------------------------------------------------------------------------
454
+ /**
455
+ * Sanitize a key for use as a filename.
456
+ * Keeps alphanumeric, dots, dashes, underscores. Replaces everything else.
457
+ */
458
+ sanitizeFilename(key) {
459
+ return key.replace(/[<>:"/\\|?*\x00-\x1F]/g, '_');
460
+ }
461
+ }
462
+ //# sourceMappingURL=LocalFileStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFileStorage.js","sourceRoot":"","sources":["../../src/Infrastructure/LocalFileStorage.ts"],"names":[],"mappings":"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"}