@runanywhere/web 0.1.0-beta.6 → 0.1.0-beta.7

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 (189) hide show
  1. package/dist/Foundation/ErrorTypes.d.ts +1 -0
  2. package/dist/Foundation/ErrorTypes.d.ts.map +1 -1
  3. package/dist/Foundation/ErrorTypes.js +3 -0
  4. package/dist/Foundation/ErrorTypes.js.map +1 -1
  5. package/dist/Foundation/EventBus.d.ts +0 -1
  6. package/dist/Foundation/EventBus.d.ts.map +1 -1
  7. package/dist/Foundation/StructOffsets.d.ts +5 -37
  8. package/dist/Foundation/StructOffsets.d.ts.map +1 -1
  9. package/dist/Foundation/StructOffsets.js +6 -157
  10. package/dist/Foundation/StructOffsets.js.map +1 -1
  11. package/dist/Foundation/WASMBridge.d.ts +8 -236
  12. package/dist/Foundation/WASMBridge.d.ts.map +1 -1
  13. package/dist/Foundation/WASMBridge.js +7 -388
  14. package/dist/Foundation/WASMBridge.js.map +1 -1
  15. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -1
  16. package/dist/Infrastructure/DeviceCapabilities.js +1 -3
  17. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -1
  18. package/dist/Infrastructure/ExtensionPoint.d.ts +114 -0
  19. package/dist/Infrastructure/ExtensionPoint.d.ts.map +1 -0
  20. package/dist/Infrastructure/ExtensionPoint.js +178 -0
  21. package/dist/Infrastructure/ExtensionPoint.js.map +1 -0
  22. package/dist/Infrastructure/LocalFileStorage.d.ts +134 -0
  23. package/dist/Infrastructure/LocalFileStorage.d.ts.map +1 -0
  24. package/dist/Infrastructure/LocalFileStorage.js +428 -0
  25. package/dist/Infrastructure/LocalFileStorage.js.map +1 -0
  26. package/dist/Infrastructure/ModelDownloader.d.ts +21 -5
  27. package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -1
  28. package/dist/Infrastructure/ModelDownloader.js +79 -7
  29. package/dist/Infrastructure/ModelDownloader.js.map +1 -1
  30. package/dist/Infrastructure/ModelFileInference.d.ts +39 -0
  31. package/dist/Infrastructure/ModelFileInference.d.ts.map +1 -0
  32. package/dist/Infrastructure/ModelFileInference.js +119 -0
  33. package/dist/Infrastructure/ModelFileInference.js.map +1 -0
  34. package/dist/Infrastructure/ModelLoaderTypes.d.ts +91 -12
  35. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -1
  36. package/dist/Infrastructure/ModelLoaderTypes.js +7 -1
  37. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -1
  38. package/dist/Infrastructure/ModelManager.d.ts +31 -104
  39. package/dist/Infrastructure/ModelManager.d.ts.map +1 -1
  40. package/dist/Infrastructure/ModelManager.js +207 -568
  41. package/dist/Infrastructure/ModelManager.js.map +1 -1
  42. package/dist/Infrastructure/ModelRegistry.d.ts +6 -8
  43. package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -1
  44. package/dist/Infrastructure/ModelRegistry.js +11 -4
  45. package/dist/Infrastructure/ModelRegistry.js.map +1 -1
  46. package/dist/Infrastructure/OPFSStorage.d.ts +8 -0
  47. package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -1
  48. package/dist/Infrastructure/OPFSStorage.js +37 -0
  49. package/dist/Infrastructure/OPFSStorage.js.map +1 -1
  50. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +12 -4
  51. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -1
  52. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +23 -51
  53. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -1
  54. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +42 -10
  55. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -1
  56. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +63 -161
  57. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -1
  58. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +3 -29
  59. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -1
  60. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +26 -42
  61. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -1
  62. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +28 -37
  63. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -1
  64. package/dist/Public/Extensions/VoicePipelineTypes.js +4 -1
  65. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -1
  66. package/dist/Public/RunAnywhere.d.ts +29 -85
  67. package/dist/Public/RunAnywhere.d.ts.map +1 -1
  68. package/dist/Public/RunAnywhere.js +169 -211
  69. package/dist/Public/RunAnywhere.js.map +1 -1
  70. package/dist/index.d.ts +19 -39
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +15 -31
  73. package/dist/index.js.map +1 -1
  74. package/dist/types/index.d.ts +0 -1
  75. package/dist/types/index.d.ts.map +1 -1
  76. package/dist/types/index.js +1 -0
  77. package/dist/types/index.js.map +1 -1
  78. package/package.json +4 -10
  79. package/dist/Foundation/PlatformAdapter.d.ts +0 -101
  80. package/dist/Foundation/PlatformAdapter.d.ts.map +0 -1
  81. package/dist/Foundation/PlatformAdapter.js +0 -417
  82. package/dist/Foundation/PlatformAdapter.js.map +0 -1
  83. package/dist/Foundation/SherpaONNXBridge.d.ts +0 -147
  84. package/dist/Foundation/SherpaONNXBridge.d.ts.map +0 -1
  85. package/dist/Foundation/SherpaONNXBridge.js +0 -345
  86. package/dist/Foundation/SherpaONNXBridge.js.map +0 -1
  87. package/dist/Infrastructure/AudioCapture.d.ts +0 -99
  88. package/dist/Infrastructure/AudioCapture.d.ts.map +0 -1
  89. package/dist/Infrastructure/AudioCapture.js +0 -264
  90. package/dist/Infrastructure/AudioCapture.js.map +0 -1
  91. package/dist/Infrastructure/AudioPlayback.d.ts +0 -53
  92. package/dist/Infrastructure/AudioPlayback.d.ts.map +0 -1
  93. package/dist/Infrastructure/AudioPlayback.js +0 -117
  94. package/dist/Infrastructure/AudioPlayback.js.map +0 -1
  95. package/dist/Infrastructure/VLMWorkerBridge.d.ts +0 -211
  96. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +0 -1
  97. package/dist/Infrastructure/VLMWorkerBridge.js +0 -264
  98. package/dist/Infrastructure/VLMWorkerBridge.js.map +0 -1
  99. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +0 -38
  100. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +0 -1
  101. package/dist/Infrastructure/VLMWorkerRuntime.js +0 -503
  102. package/dist/Infrastructure/VLMWorkerRuntime.js.map +0 -1
  103. package/dist/Infrastructure/VideoCapture.d.ts +0 -130
  104. package/dist/Infrastructure/VideoCapture.d.ts.map +0 -1
  105. package/dist/Infrastructure/VideoCapture.js +0 -236
  106. package/dist/Infrastructure/VideoCapture.js.map +0 -1
  107. package/dist/Public/Extensions/DiffusionTypes.d.ts +0 -64
  108. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +0 -1
  109. package/dist/Public/Extensions/DiffusionTypes.js +0 -28
  110. package/dist/Public/Extensions/DiffusionTypes.js.map +0 -1
  111. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +0 -33
  112. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +0 -1
  113. package/dist/Public/Extensions/EmbeddingsTypes.js +0 -13
  114. package/dist/Public/Extensions/EmbeddingsTypes.js.map +0 -1
  115. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +0 -44
  116. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +0 -1
  117. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +0 -189
  118. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +0 -1
  119. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +0 -56
  120. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +0 -1
  121. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +0 -240
  122. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +0 -1
  123. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +0 -97
  124. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +0 -1
  125. package/dist/Public/Extensions/RunAnywhere+STT.js +0 -417
  126. package/dist/Public/Extensions/RunAnywhere+STT.js.map +0 -1
  127. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +0 -69
  128. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +0 -1
  129. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +0 -196
  130. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +0 -1
  131. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +0 -55
  132. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +0 -1
  133. package/dist/Public/Extensions/RunAnywhere+TTS.js +0 -253
  134. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +0 -1
  135. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +0 -80
  136. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +0 -1
  137. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +0 -470
  138. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +0 -1
  139. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +0 -82
  140. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +0 -1
  141. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +0 -576
  142. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +0 -1
  143. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +0 -70
  144. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +0 -1
  145. package/dist/Public/Extensions/RunAnywhere+VAD.js +0 -231
  146. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +0 -1
  147. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +0 -58
  148. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +0 -1
  149. package/dist/Public/Extensions/RunAnywhere+VLM.js +0 -262
  150. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +0 -1
  151. package/dist/Public/Extensions/STTTypes.d.ts +0 -61
  152. package/dist/Public/Extensions/STTTypes.d.ts.map +0 -1
  153. package/dist/Public/Extensions/STTTypes.js +0 -16
  154. package/dist/Public/Extensions/STTTypes.js.map +0 -1
  155. package/dist/Public/Extensions/TTSTypes.d.ts +0 -31
  156. package/dist/Public/Extensions/TTSTypes.d.ts.map +0 -1
  157. package/dist/Public/Extensions/TTSTypes.js +0 -3
  158. package/dist/Public/Extensions/TTSTypes.js.map +0 -1
  159. package/dist/Public/Extensions/ToolCallingTypes.d.ts +0 -78
  160. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +0 -1
  161. package/dist/Public/Extensions/ToolCallingTypes.js +0 -8
  162. package/dist/Public/Extensions/ToolCallingTypes.js.map +0 -1
  163. package/dist/Public/Extensions/VADTypes.d.ts +0 -30
  164. package/dist/Public/Extensions/VADTypes.d.ts.map +0 -1
  165. package/dist/Public/Extensions/VADTypes.js +0 -8
  166. package/dist/Public/Extensions/VADTypes.js.map +0 -1
  167. package/dist/Public/Extensions/VLMTypes.d.ts +0 -56
  168. package/dist/Public/Extensions/VLMTypes.d.ts.map +0 -1
  169. package/dist/Public/Extensions/VLMTypes.js +0 -24
  170. package/dist/Public/Extensions/VLMTypes.js.map +0 -1
  171. package/dist/types/LLMTypes.d.ts +0 -48
  172. package/dist/types/LLMTypes.d.ts.map +0 -1
  173. package/dist/types/LLMTypes.js +0 -8
  174. package/dist/types/LLMTypes.js.map +0 -1
  175. package/dist/workers/vlm-worker.d.ts +0 -9
  176. package/dist/workers/vlm-worker.d.ts.map +0 -1
  177. package/dist/workers/vlm-worker.js +0 -10
  178. package/dist/workers/vlm-worker.js.map +0 -1
  179. package/wasm/racommons-webgpu.js +0 -156
  180. package/wasm/racommons-webgpu.wasm +0 -0
  181. package/wasm/racommons.js +0 -126
  182. package/wasm/racommons.wasm +0 -0
  183. package/wasm/sherpa/sherpa-onnx-asr.js +0 -1538
  184. package/wasm/sherpa/sherpa-onnx-glue-original.js +0 -19
  185. package/wasm/sherpa/sherpa-onnx-glue.js +0 -17
  186. package/wasm/sherpa/sherpa-onnx-tts.js +0 -657
  187. package/wasm/sherpa/sherpa-onnx-vad.js +0 -337
  188. package/wasm/sherpa/sherpa-onnx-wave.js +0 -88
  189. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * ExtensionPoint - Backend registration API
3
+ *
4
+ * Follows the React Native SDK's Provider pattern. Backend packages
5
+ * (e.g. @runanywhere/web-llamacpp, @runanywhere/web-onnx) register
6
+ * themselves with the core SDK via this API, declaring what capabilities
7
+ * they provide.
8
+ *
9
+ * Usage:
10
+ * // In @runanywhere/web-llamacpp:
11
+ * import { ExtensionPoint, BackendCapability } from '@runanywhere/web';
12
+ *
13
+ * ExtensionPoint.registerBackend({
14
+ * id: 'llamacpp',
15
+ * capabilities: [BackendCapability.LLM, BackendCapability.VLM, ...],
16
+ * cleanup() { ... },
17
+ * });
18
+ *
19
+ * // In core (VoicePipeline, etc.) — runtime lookup:
20
+ * const stt = ExtensionPoint.getExtensionForCapability(BackendCapability.STT);
21
+ */
22
+ import { SDKLogger } from '../Foundation/SDKLogger';
23
+ const logger = new SDKLogger('ExtensionPoint');
24
+ // ---------------------------------------------------------------------------
25
+ // Types
26
+ // ---------------------------------------------------------------------------
27
+ /** Capabilities that a backend can provide. */
28
+ export var BackendCapability;
29
+ (function (BackendCapability) {
30
+ BackendCapability["LLM"] = "llm";
31
+ BackendCapability["VLM"] = "vlm";
32
+ BackendCapability["STT"] = "stt";
33
+ BackendCapability["TTS"] = "tts";
34
+ BackendCapability["VAD"] = "vad";
35
+ BackendCapability["Embeddings"] = "embeddings";
36
+ BackendCapability["Diffusion"] = "diffusion";
37
+ BackendCapability["ToolCalling"] = "toolCalling";
38
+ BackendCapability["StructuredOutput"] = "structuredOutput";
39
+ })(BackendCapability || (BackendCapability = {}));
40
+ /**
41
+ * Typed service keys for cross-package singleton access.
42
+ *
43
+ * Backend packages register service instances (e.g. TextGeneration, STT, TTS)
44
+ * under these keys during their registration phase. Core code (e.g. VoicePipeline)
45
+ * retrieves them at runtime via `ExtensionPoint.getService(ServiceKey.XXX)` instead
46
+ * of relying on untyped globalThis keys.
47
+ */
48
+ export var ServiceKey;
49
+ (function (ServiceKey) {
50
+ ServiceKey["TextGeneration"] = "textGeneration";
51
+ ServiceKey["STT"] = "stt";
52
+ ServiceKey["TTS"] = "tts";
53
+ ServiceKey["VLM"] = "vlm";
54
+ ServiceKey["Embeddings"] = "embeddings";
55
+ ServiceKey["Diffusion"] = "diffusion";
56
+ ServiceKey["ToolCalling"] = "toolCalling";
57
+ ServiceKey["VAD"] = "vad";
58
+ })(ServiceKey || (ServiceKey = {}));
59
+ // ---------------------------------------------------------------------------
60
+ // ExtensionPoint Singleton
61
+ // ---------------------------------------------------------------------------
62
+ class ExtensionPointImpl {
63
+ backends = new Map();
64
+ capabilityMap = new Map();
65
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
+ services = new Map();
67
+ /**
68
+ * Register a backend extension.
69
+ * Idempotent — re-registering the same id is a no-op.
70
+ */
71
+ registerBackend(extension) {
72
+ if (this.backends.has(extension.id)) {
73
+ logger.debug(`Backend '${extension.id}' already registered, skipping`);
74
+ return;
75
+ }
76
+ this.backends.set(extension.id, extension);
77
+ for (const cap of extension.capabilities) {
78
+ if (this.capabilityMap.has(cap)) {
79
+ logger.warning(`Capability '${cap}' already provided by '${this.capabilityMap.get(cap).id}', ` +
80
+ `overriding with '${extension.id}'`);
81
+ }
82
+ this.capabilityMap.set(cap, extension);
83
+ }
84
+ logger.info(`Backend '${extension.id}' registered — capabilities: [${extension.capabilities.join(', ')}]`);
85
+ }
86
+ /** Get a backend by its id. */
87
+ getBackend(id) {
88
+ return this.backends.get(id);
89
+ }
90
+ /** Check if a capability is available (i.e. a backend providing it is registered). */
91
+ hasCapability(capability) {
92
+ return this.capabilityMap.has(capability);
93
+ }
94
+ /** Get the backend extension providing a given capability. */
95
+ getExtensionForCapability(capability) {
96
+ return this.capabilityMap.get(capability);
97
+ }
98
+ /**
99
+ * Require that a capability is available. Throws a clear error if not.
100
+ * Use in extension methods that depend on a backend being registered.
101
+ */
102
+ requireCapability(capability) {
103
+ if (!this.capabilityMap.has(capability)) {
104
+ const packageHint = capability === BackendCapability.LLM ||
105
+ capability === BackendCapability.VLM ||
106
+ capability === BackendCapability.Embeddings ||
107
+ capability === BackendCapability.Diffusion ||
108
+ capability === BackendCapability.ToolCalling ||
109
+ capability === BackendCapability.StructuredOutput
110
+ ? '@runanywhere/web-llamacpp'
111
+ : '@runanywhere/web-onnx';
112
+ throw new Error(`Capability '${capability}' not available. ` +
113
+ `Install and register the ${packageHint} package.`);
114
+ }
115
+ }
116
+ // -------------------------------------------------------------------------
117
+ // Service Registry — typed singleton access for cross-package communication
118
+ // -------------------------------------------------------------------------
119
+ /**
120
+ * Register a service singleton under a typed key.
121
+ * Backend packages call this during their registration phase.
122
+ */
123
+ registerService(key, service) {
124
+ if (this.services.has(key)) {
125
+ logger.debug(`Service '${key}' already registered, overwriting`);
126
+ }
127
+ this.services.set(key, service);
128
+ }
129
+ /**
130
+ * Retrieve a registered service singleton.
131
+ * Returns undefined if the service is not registered yet.
132
+ */
133
+ getService(key) {
134
+ return this.services.get(key);
135
+ }
136
+ /**
137
+ * Retrieve a registered service or throw a descriptive error.
138
+ * Use in code that requires a specific backend to be registered.
139
+ */
140
+ requireService(key, packageHint) {
141
+ const service = this.services.get(key);
142
+ if (!service) {
143
+ const hint = packageHint ?? (key === ServiceKey.STT || key === ServiceKey.TTS || key === ServiceKey.VAD
144
+ ? '@runanywhere/web-onnx'
145
+ : '@runanywhere/web-llamacpp');
146
+ throw new Error(`Service '${key}' not available. Install and register the ${hint} package.`);
147
+ }
148
+ return service;
149
+ }
150
+ /** Remove a registered service. */
151
+ removeService(key) {
152
+ this.services.delete(key);
153
+ }
154
+ /**
155
+ * Cleanup all registered backends in reverse registration order.
156
+ * Called during SDK shutdown.
157
+ */
158
+ cleanupAll() {
159
+ const entries = [...this.backends.entries()].reverse();
160
+ for (const [id, backend] of entries) {
161
+ try {
162
+ backend.cleanup();
163
+ logger.debug(`Backend '${id}' cleaned up`);
164
+ }
165
+ catch {
166
+ // Ignore errors during shutdown
167
+ }
168
+ }
169
+ }
170
+ /** Reset the registry (call after full shutdown). */
171
+ reset() {
172
+ this.backends.clear();
173
+ this.capabilityMap.clear();
174
+ this.services.clear();
175
+ }
176
+ }
177
+ export const ExtensionPoint = new ExtensionPointImpl();
178
+ //# sourceMappingURL=ExtensionPoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionPoint.js","sourceRoot":"","sources":["../../src/Infrastructure/ExtensionPoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
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
+ export declare class LocalFileStorage {
29
+ private dirHandle;
30
+ private _isReady;
31
+ private _hasStoredHandle;
32
+ /** Per-key write lock to prevent concurrent writes to the same file. */
33
+ private writeLocks;
34
+ /** Whether the File System Access API is available in this browser. */
35
+ static get isSupported(): boolean;
36
+ /**
37
+ * Get the stored directory name from localStorage (fast, synchronous).
38
+ * Available immediately on page load before IndexedDB restores the handle.
39
+ * Returns the folder name only (e.g. "ai-models"), not the full path.
40
+ */
41
+ static get storedDirectoryName(): string | null;
42
+ /** Whether the storage is ready for use (directory selected + permission granted). */
43
+ get isReady(): boolean;
44
+ /** Whether a handle was found in IndexedDB (even if permission isn't granted yet). */
45
+ get hasStoredHandle(): boolean;
46
+ /** The name of the chosen directory (for display in UI). */
47
+ get directoryName(): string | null;
48
+ /**
49
+ * Prompt the user to choose a directory for model storage.
50
+ * Opens the OS folder picker dialog.
51
+ * Stores the directory handle in IndexedDB for future sessions.
52
+ *
53
+ * @returns true if a directory was selected, false if cancelled
54
+ */
55
+ chooseDirectory(): Promise<boolean>;
56
+ /**
57
+ * Attempt to restore a previously chosen directory from IndexedDB.
58
+ *
59
+ * On Chrome 122+, if the user selected "Allow on every visit",
60
+ * permission is automatically granted without any prompt.
61
+ *
62
+ * @returns true if directory was restored and permission is granted.
63
+ * false if no handle stored or permission not granted (UI
64
+ * should show a "Re-authorize" button).
65
+ */
66
+ restoreDirectory(): Promise<boolean>;
67
+ /**
68
+ * Request readwrite permission on a previously stored handle.
69
+ * MUST be called from a user gesture (button click handler).
70
+ *
71
+ * @returns true if permission was granted
72
+ */
73
+ requestAccess(): Promise<boolean>;
74
+ /**
75
+ * Save model data to the local filesystem.
76
+ * Uses a per-key lock to prevent concurrent writes from corrupting files.
77
+ * @param key - Model identifier (used as filename)
78
+ * @param data - Model file data
79
+ */
80
+ saveModel(key: string, data: ArrayBuffer): Promise<void>;
81
+ /**
82
+ * Save model data from a ReadableStream to the local filesystem.
83
+ * Streams data directly to disk without buffering the entire file in memory.
84
+ * Uses a per-key lock to prevent concurrent writes from corrupting files.
85
+ * @param key - Model identifier (used as filename)
86
+ * @param stream - Readable stream of model data
87
+ */
88
+ saveModelFromStream(key: string, stream: ReadableStream<Uint8Array>): Promise<void>;
89
+ private _saveModelImpl;
90
+ private _saveStreamImpl;
91
+ /**
92
+ * Per-key write lock: ensures only one write operation per key at a time.
93
+ * Concurrent calls for the same key will be serialized.
94
+ */
95
+ private withWriteLock;
96
+ /**
97
+ * Load model data from the local filesystem.
98
+ * @param key - Model identifier
99
+ * @returns Model data, or null if not found
100
+ */
101
+ loadModel(key: string): Promise<ArrayBuffer | null>;
102
+ /**
103
+ * Check if a model file exists in local storage.
104
+ * @param key - Model identifier
105
+ */
106
+ hasModel(key: string): Promise<boolean>;
107
+ /**
108
+ * Delete a model file from local storage.
109
+ * @param key - Model identifier
110
+ */
111
+ deleteModel(key: string): Promise<void>;
112
+ /**
113
+ * Get file size without reading into memory.
114
+ * @param key - Model identifier
115
+ */
116
+ getFileSize(key: string): Promise<number | null>;
117
+ /**
118
+ * List all model files in the directory.
119
+ */
120
+ listModels(): Promise<Array<{
121
+ id: string;
122
+ sizeBytes: number;
123
+ lastModified: number;
124
+ }>>;
125
+ private openDB;
126
+ private storeHandle;
127
+ private retrieveHandle;
128
+ /**
129
+ * Sanitize a key for use as a filename.
130
+ * Keeps alphanumeric, dots, dashes, underscores. Replaces everything else.
131
+ */
132
+ private sanitizeFilename;
133
+ }
134
+ //# sourceMappingURL=LocalFileStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalFileStorage.d.ts","sourceRoot":"","sources":["../../src/Infrastructure/LocalFileStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAoCH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,gBAAgB,CAAS;IAEjC,wEAAwE;IACxE,OAAO,CAAC,UAAU,CAAyC;IAM3D,uEAAuE;IACvE,MAAM,KAAK,WAAW,IAAI,OAAO,CAEhC;IAED;;;;OAIG;IACH,MAAM,KAAK,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAM9C;IAMD,sFAAsF;IACtF,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,sFAAsF;IACtF,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,4DAA4D;IAC5D,IAAI,aAAa,IAAI,MAAM,GAAG,IAAI,CAEjC;IAMD;;;;;;OAMG;IACG,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC;IAiCzC;;;;;;;;;OASG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAkC1C;;;;;OAKG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IA0BvC;;;;;OAKG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D;;;;;;OAMG;IACG,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3E,cAAc;YAmBd,eAAe;IAwB7B;;;OAGG;YACW,aAAa;IAc3B;;;;OAIG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAczD;;;OAGG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY7C;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAatD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;YAwB7E,MAAM;YAgBN,WAAW;YAiBX,cAAc;IAsB5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAGzB"}