@vibesdotdev/media 0.0.0-stage → 1.0.0-rc.3

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 (278) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +95 -2
  3. package/dist/analyzers/frame-guard.d.ts +6 -0
  4. package/dist/analyzers/frame-guard.d.ts.map +1 -0
  5. package/dist/analyzers/frame-guard.js +10 -0
  6. package/dist/analyzers/frame-guard.js.map +1 -0
  7. package/dist/analyzers/motion-math.d.ts +66 -0
  8. package/dist/analyzers/motion-math.d.ts.map +1 -0
  9. package/dist/analyzers/motion-math.js +356 -0
  10. package/dist/analyzers/motion-math.js.map +1 -0
  11. package/dist/analyzers/reference-motion-analyzer.impl.d.ts +23 -0
  12. package/dist/analyzers/reference-motion-analyzer.impl.d.ts.map +1 -0
  13. package/dist/analyzers/reference-motion-analyzer.impl.js +69 -0
  14. package/dist/analyzers/reference-motion-analyzer.impl.js.map +1 -0
  15. package/dist/analyzers/reference-motion.descriptor.d.ts +11 -0
  16. package/dist/analyzers/reference-motion.descriptor.d.ts.map +1 -0
  17. package/dist/analyzers/reference-motion.descriptor.js +21 -0
  18. package/dist/analyzers/reference-motion.descriptor.js.map +1 -0
  19. package/dist/capture-client.d.ts +34 -0
  20. package/dist/capture-client.d.ts.map +1 -0
  21. package/dist/capture-client.js +163 -0
  22. package/dist/capture-client.js.map +1 -0
  23. package/dist/config/media.uploads.config.descriptor.d.ts +27 -0
  24. package/dist/config/media.uploads.config.descriptor.d.ts.map +1 -0
  25. package/dist/config/media.uploads.config.descriptor.js +46 -0
  26. package/dist/config/media.uploads.config.descriptor.js.map +1 -0
  27. package/dist/config/uploads.d.ts +11 -0
  28. package/dist/config/uploads.d.ts.map +1 -0
  29. package/dist/config/uploads.js +25 -0
  30. package/dist/config/uploads.js.map +1 -0
  31. package/dist/docs/artifact-references.docs.descriptor.d.ts +4 -0
  32. package/dist/docs/artifact-references.docs.descriptor.d.ts.map +1 -0
  33. package/dist/docs/artifact-references.docs.descriptor.js +69 -0
  34. package/dist/docs/artifact-references.docs.descriptor.js.map +1 -0
  35. package/dist/docs/image-transform.docs.descriptor.d.ts +4 -0
  36. package/dist/docs/image-transform.docs.descriptor.d.ts.map +1 -0
  37. package/dist/docs/image-transform.docs.descriptor.js +52 -0
  38. package/dist/docs/image-transform.docs.descriptor.js.map +1 -0
  39. package/dist/index.d.ts +48 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +49 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/interfaces/capture-provider.d.ts +33 -0
  44. package/dist/interfaces/capture-provider.d.ts.map +1 -0
  45. package/dist/interfaces/capture-provider.js +10 -0
  46. package/dist/interfaces/capture-provider.js.map +1 -0
  47. package/dist/interfaces/image-transformer.d.ts +7 -0
  48. package/dist/interfaces/image-transformer.d.ts.map +1 -0
  49. package/dist/interfaces/image-transformer.js +2 -0
  50. package/dist/interfaces/image-transformer.js.map +1 -0
  51. package/dist/interfaces/index.d.ts +7 -0
  52. package/dist/interfaces/index.d.ts.map +1 -0
  53. package/dist/interfaces/index.js +5 -0
  54. package/dist/interfaces/index.js.map +1 -0
  55. package/dist/interfaces/motion-analyzer.d.ts +55 -0
  56. package/dist/interfaces/motion-analyzer.d.ts.map +1 -0
  57. package/dist/interfaces/motion-analyzer.js +14 -0
  58. package/dist/interfaces/motion-analyzer.js.map +1 -0
  59. package/dist/kinds/capture.d.ts +58 -0
  60. package/dist/kinds/capture.d.ts.map +1 -0
  61. package/dist/kinds/capture.js +34 -0
  62. package/dist/kinds/capture.js.map +1 -0
  63. package/dist/kinds/image-transform.d.ts +91 -0
  64. package/dist/kinds/image-transform.d.ts.map +1 -0
  65. package/dist/kinds/image-transform.js +12 -0
  66. package/dist/kinds/image-transform.js.map +1 -0
  67. package/dist/kinds/index.d.ts +10 -0
  68. package/dist/kinds/index.d.ts.map +1 -0
  69. package/dist/kinds/index.js +7 -0
  70. package/dist/kinds/index.js.map +1 -0
  71. package/dist/kinds/motion.d.ts +57 -0
  72. package/dist/kinds/motion.d.ts.map +1 -0
  73. package/dist/kinds/motion.js +34 -0
  74. package/dist/kinds/motion.js.map +1 -0
  75. package/dist/media.plugin.d.ts +23 -0
  76. package/dist/media.plugin.d.ts.map +1 -0
  77. package/dist/media.plugin.js +48 -0
  78. package/dist/media.plugin.js.map +1 -0
  79. package/dist/schemas/artifact-reference.d.ts +59 -0
  80. package/dist/schemas/artifact-reference.d.ts.map +1 -0
  81. package/dist/schemas/artifact-reference.js +77 -0
  82. package/dist/schemas/artifact-reference.js.map +1 -0
  83. package/dist/schemas/capture-descriptor.d.ts +71 -0
  84. package/dist/schemas/capture-descriptor.d.ts.map +1 -0
  85. package/dist/schemas/capture-descriptor.js +74 -0
  86. package/dist/schemas/capture-descriptor.js.map +1 -0
  87. package/dist/schemas/capture-options.d.ts +51 -0
  88. package/dist/schemas/capture-options.d.ts.map +1 -0
  89. package/dist/schemas/capture-options.js +68 -0
  90. package/dist/schemas/capture-options.js.map +1 -0
  91. package/dist/schemas/capture-parse.d.ts +10 -0
  92. package/dist/schemas/capture-parse.d.ts.map +1 -0
  93. package/dist/schemas/capture-parse.js +30 -0
  94. package/dist/schemas/capture-parse.js.map +1 -0
  95. package/dist/schemas/capture-state.d.ts +77 -0
  96. package/dist/schemas/capture-state.d.ts.map +1 -0
  97. package/dist/schemas/capture-state.js +25 -0
  98. package/dist/schemas/capture-state.js.map +1 -0
  99. package/dist/schemas/image-transform.d.ts +269 -0
  100. package/dist/schemas/image-transform.d.ts.map +1 -0
  101. package/dist/schemas/image-transform.js +161 -0
  102. package/dist/schemas/image-transform.js.map +1 -0
  103. package/dist/schemas/index.d.ts +20 -0
  104. package/dist/schemas/index.d.ts.map +1 -0
  105. package/dist/schemas/index.js +17 -0
  106. package/dist/schemas/index.js.map +1 -0
  107. package/dist/schemas/motion-analysis.d.ts +187 -0
  108. package/dist/schemas/motion-analysis.d.ts.map +1 -0
  109. package/dist/schemas/motion-analysis.js +213 -0
  110. package/dist/schemas/motion-analysis.js.map +1 -0
  111. package/dist/schemas/motion-descriptor.d.ts +53 -0
  112. package/dist/schemas/motion-descriptor.d.ts.map +1 -0
  113. package/dist/schemas/motion-descriptor.js +47 -0
  114. package/dist/schemas/motion-descriptor.js.map +1 -0
  115. package/dist/schemas/motion-frame.d.ts +63 -0
  116. package/dist/schemas/motion-frame.d.ts.map +1 -0
  117. package/dist/schemas/motion-frame.js +86 -0
  118. package/dist/schemas/motion-frame.js.map +1 -0
  119. package/dist/schemas/opaque-id.d.ts +10 -0
  120. package/dist/schemas/opaque-id.d.ts.map +1 -0
  121. package/dist/schemas/opaque-id.js +24 -0
  122. package/dist/schemas/opaque-id.js.map +1 -0
  123. package/dist/schemas/sharing-state.d.ts +43 -0
  124. package/dist/schemas/sharing-state.d.ts.map +1 -0
  125. package/dist/schemas/sharing-state.js +11 -0
  126. package/dist/schemas/sharing-state.js.map +1 -0
  127. package/dist/svelte/CaptureLoader.svelte +29 -0
  128. package/dist/svelte/CaptureLoader.svelte.d.ts +11 -0
  129. package/dist/svelte/CaptureLoader.svelte.d.ts.map +1 -0
  130. package/dist/svelte/CapturePanel.svelte +189 -0
  131. package/dist/svelte/CapturePanel.svelte.d.ts +12 -0
  132. package/dist/svelte/CapturePanel.svelte.d.ts.map +1 -0
  133. package/dist/svelte/MediaUploader.svelte +109 -0
  134. package/dist/svelte/MediaUploader.svelte.d.ts +5 -0
  135. package/dist/svelte/MediaUploader.svelte.d.ts.map +1 -0
  136. package/dist/svelte/capture-parse.d.ts +2 -0
  137. package/dist/svelte/capture-parse.d.ts.map +1 -0
  138. package/dist/svelte/capture-parse.js +1 -0
  139. package/dist/svelte/failure-message.d.ts +2 -0
  140. package/dist/svelte/failure-message.d.ts.map +1 -0
  141. package/dist/svelte/failure-message.js +1 -0
  142. package/dist/svelte/index.d.ts +8 -0
  143. package/dist/svelte/index.d.ts.map +1 -0
  144. package/dist/svelte/index.js +6 -0
  145. package/dist/svelte/runtime-log.d.ts +14 -0
  146. package/dist/svelte/runtime-log.d.ts.map +1 -0
  147. package/dist/svelte/runtime-log.js +19 -0
  148. package/dist/svelte/runtime.d.ts +9 -0
  149. package/dist/svelte/runtime.d.ts.map +1 -0
  150. package/dist/svelte/runtime.js +27 -0
  151. package/dist/svelte/sharing/README.md +38 -0
  152. package/dist/svelte/sharing/components/ShareButton.svelte +57 -0
  153. package/dist/svelte/sharing/components/ShareButton.svelte.d.ts +11 -0
  154. package/dist/svelte/sharing/components/ShareButton.svelte.d.ts.map +1 -0
  155. package/dist/svelte/sharing/components/ShareDialog.svelte +222 -0
  156. package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts +8 -0
  157. package/dist/svelte/sharing/components/ShareDialog.svelte.d.ts.map +1 -0
  158. package/dist/svelte/sharing/components/ShareLoader.svelte +19 -0
  159. package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts +7 -0
  160. package/dist/svelte/sharing/components/ShareLoader.svelte.d.ts.map +1 -0
  161. package/dist/svelte/sharing/index.d.ts +20 -0
  162. package/dist/svelte/sharing/index.d.ts.map +1 -0
  163. package/dist/svelte/sharing/index.js +19 -0
  164. package/dist/svelte/sharing/runtime.d.ts +44 -0
  165. package/dist/svelte/sharing/runtime.d.ts.map +1 -0
  166. package/dist/svelte/sharing/runtime.js +81 -0
  167. package/dist/svelte/sharing/state.svelte.d.ts +28 -0
  168. package/dist/svelte/sharing/state.svelte.d.ts.map +1 -0
  169. package/dist/svelte/sharing/state.svelte.js +101 -0
  170. package/dist/svelte/sharing/styles.css +8 -0
  171. package/dist/svelte/state.svelte.d.ts +38 -0
  172. package/dist/svelte/state.svelte.d.ts.map +1 -0
  173. package/dist/svelte/state.svelte.js +102 -0
  174. package/dist/svelte/styles.css +2 -0
  175. package/dist/svelte/uploader.d.ts +17 -0
  176. package/dist/svelte/uploader.d.ts.map +1 -0
  177. package/dist/svelte/uploader.js +9 -0
  178. package/dist/uploads/adapters/local/index.d.ts +9 -0
  179. package/dist/uploads/adapters/local/index.d.ts.map +1 -0
  180. package/dist/uploads/adapters/local/index.js +12 -0
  181. package/dist/uploads/adapters/local/index.js.map +1 -0
  182. package/dist/uploads/adapters/local/local-storage.descriptor.d.ts +24 -0
  183. package/dist/uploads/adapters/local/local-storage.descriptor.d.ts.map +1 -0
  184. package/dist/uploads/adapters/local/local-storage.descriptor.js +20 -0
  185. package/dist/uploads/adapters/local/local-storage.descriptor.js.map +1 -0
  186. package/dist/uploads/adapters/local/local-storage.impl.d.ts +123 -0
  187. package/dist/uploads/adapters/local/local-storage.impl.d.ts.map +1 -0
  188. package/dist/uploads/adapters/local/local-storage.impl.js +231 -0
  189. package/dist/uploads/adapters/local/local-storage.impl.js.map +1 -0
  190. package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts +9 -0
  191. package/dist/uploads/adapters/local/uploads-adapter-local.plugin.d.ts.map +1 -0
  192. package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js +41 -0
  193. package/dist/uploads/adapters/local/uploads-adapter-local.plugin.js.map +1 -0
  194. package/dist/uploads/client/helper.d.ts +26 -0
  195. package/dist/uploads/client/helper.d.ts.map +1 -0
  196. package/dist/uploads/client/helper.js +27 -0
  197. package/dist/uploads/client/helper.js.map +1 -0
  198. package/dist/uploads/client/index.d.ts +11 -0
  199. package/dist/uploads/client/index.d.ts.map +1 -0
  200. package/dist/uploads/client/index.js +9 -0
  201. package/dist/uploads/client/index.js.map +1 -0
  202. package/dist/uploads/client/sharing-client.d.ts +45 -0
  203. package/dist/uploads/client/sharing-client.d.ts.map +1 -0
  204. package/dist/uploads/client/sharing-client.js +153 -0
  205. package/dist/uploads/client/sharing-client.js.map +1 -0
  206. package/dist/uploads/client/uploads-client.d.ts +200 -0
  207. package/dist/uploads/client/uploads-client.d.ts.map +1 -0
  208. package/dist/uploads/client/uploads-client.js +487 -0
  209. package/dist/uploads/client/uploads-client.js.map +1 -0
  210. package/dist/uploads/docs/uploads.docs.descriptor.d.ts +4 -0
  211. package/dist/uploads/docs/uploads.docs.descriptor.d.ts.map +1 -0
  212. package/dist/uploads/docs/uploads.docs.descriptor.js +65 -0
  213. package/dist/uploads/docs/uploads.docs.descriptor.js.map +1 -0
  214. package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts +22 -0
  215. package/dist/uploads/docs/uploads.share-links.docs.descriptor.d.ts.map +1 -0
  216. package/dist/uploads/docs/uploads.share-links.docs.descriptor.js +86 -0
  217. package/dist/uploads/docs/uploads.share-links.docs.descriptor.js.map +1 -0
  218. package/dist/uploads/index.d.ts +12 -0
  219. package/dist/uploads/index.d.ts.map +1 -0
  220. package/dist/uploads/index.js +13 -0
  221. package/dist/uploads/index.js.map +1 -0
  222. package/dist/uploads/schemas/common.d.ts +135 -0
  223. package/dist/uploads/schemas/common.d.ts.map +1 -0
  224. package/dist/uploads/schemas/common.js +152 -0
  225. package/dist/uploads/schemas/common.js.map +1 -0
  226. package/dist/uploads/schemas/forms.d.ts +59 -0
  227. package/dist/uploads/schemas/forms.d.ts.map +1 -0
  228. package/dist/uploads/schemas/forms.js +41 -0
  229. package/dist/uploads/schemas/forms.js.map +1 -0
  230. package/dist/uploads/schemas/index.d.ts +18 -0
  231. package/dist/uploads/schemas/index.d.ts.map +1 -0
  232. package/dist/uploads/schemas/index.js +13 -0
  233. package/dist/uploads/schemas/index.js.map +1 -0
  234. package/dist/uploads/schemas/records.d.ts +81 -0
  235. package/dist/uploads/schemas/records.d.ts.map +1 -0
  236. package/dist/uploads/schemas/records.js +82 -0
  237. package/dist/uploads/schemas/records.js.map +1 -0
  238. package/dist/uploads/schemas/requests.d.ts +32 -0
  239. package/dist/uploads/schemas/requests.d.ts.map +1 -0
  240. package/dist/uploads/schemas/requests.js +30 -0
  241. package/dist/uploads/schemas/requests.js.map +1 -0
  242. package/dist/uploads/schemas/shares.d.ts +67 -0
  243. package/dist/uploads/schemas/shares.d.ts.map +1 -0
  244. package/dist/uploads/schemas/shares.js +39 -0
  245. package/dist/uploads/schemas/shares.js.map +1 -0
  246. package/dist/uploads/server/backend.d.ts +8 -0
  247. package/dist/uploads/server/backend.d.ts.map +1 -0
  248. package/dist/uploads/server/backend.js +11 -0
  249. package/dist/uploads/server/backend.js.map +1 -0
  250. package/dist/uploads/server/config.d.ts +5 -0
  251. package/dist/uploads/server/config.d.ts.map +1 -0
  252. package/dist/uploads/server/config.js +38 -0
  253. package/dist/uploads/server/config.js.map +1 -0
  254. package/dist/uploads/server/service.d.ts +77 -0
  255. package/dist/uploads/server/service.d.ts.map +1 -0
  256. package/dist/uploads/server/service.js +152 -0
  257. package/dist/uploads/server/service.js.map +1 -0
  258. package/dist/uploads/server/storage-client.d.ts +11 -0
  259. package/dist/uploads/server/storage-client.d.ts.map +1 -0
  260. package/dist/uploads/server/storage-client.js +23 -0
  261. package/dist/uploads/server/storage-client.js.map +1 -0
  262. package/dist/uploads/server/storage.d.ts +40 -0
  263. package/dist/uploads/server/storage.d.ts.map +1 -0
  264. package/dist/uploads/server/storage.js +59 -0
  265. package/dist/uploads/server/storage.js.map +1 -0
  266. package/dist/uploads/uploads.plugin.d.ts +11 -0
  267. package/dist/uploads/uploads.plugin.d.ts.map +1 -0
  268. package/dist/uploads/uploads.plugin.js +89 -0
  269. package/dist/uploads/uploads.plugin.js.map +1 -0
  270. package/dist/utils/attempt.d.ts +27 -0
  271. package/dist/utils/attempt.d.ts.map +1 -0
  272. package/dist/utils/attempt.js +39 -0
  273. package/dist/utils/attempt.js.map +1 -0
  274. package/dist/utils/failure-message.d.ts +8 -0
  275. package/dist/utils/failure-message.d.ts.map +1 -0
  276. package/dist/utils/failure-message.js +28 -0
  277. package/dist/utils/failure-message.js.map +1 -0
  278. package/package.json +257 -4
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Upload Storage Service
3
+ *
4
+ * Core service class for handling file uploads.
5
+ * Delegates backend operations to adapter packages via runtime resolution:
6
+ * - uploads-adapter-s3 for S3 backend
7
+ * - uploads-adapter-local for local filesystem backend
8
+ * - uploads-adapter-r2 for Cloudflare R2 backend
9
+ *
10
+ * Adapters are resolved via runtime.query('uploads/store').withId(backend).resolve()
11
+ * NOT via if (config.backend === 's3') branching.
12
+ */
13
+ import { CapabilityError } from '@vibesdotdev/kernel';
14
+ import { defaultUploadsBackend } from "./backend.js";
15
+ import { loadUploadsConfig } from "../../config/uploads.js";
16
+ import { parseRequest } from "../schemas/requests.js";
17
+ import { uploadStorageOptionsSchema, validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES, } from "../schemas/common.js";
18
+ /** Local path when the uploads config does not name one. */
19
+ const DEFAULT_LOCAL_PATH = 'uploads';
20
+ export class UploadStorageService {
21
+ runtime;
22
+ config;
23
+ adapter = null;
24
+ backendWasExplicit;
25
+ backendFromManifest = false;
26
+ constructor(runtime, config) {
27
+ this.runtime = runtime;
28
+ this.backendWasExplicit = config?.backend !== undefined;
29
+ this.config = {
30
+ localPath: DEFAULT_LOCAL_PATH,
31
+ ...config,
32
+ backend: config?.backend ?? defaultUploadsBackend()
33
+ };
34
+ }
35
+ /**
36
+ * Get or create the storage adapter instance via runtime resolution.
37
+ *
38
+ * Uses runtime.query('uploads/store').withId(backend).resolve() to select
39
+ * the appropriate adapter based on config.backend ('local', 's3', 'r2').
40
+ * This replaces the prior if (config.backend === 's3') branching pattern.
41
+ *
42
+ * Adapters (uploads-adapter-local, uploads-adapter-s3, uploads-adapter-r2)
43
+ * self-register with ids 'local', 's3', 'r2' matching config.backend values.
44
+ */
45
+ async getAdapter() {
46
+ if (this.adapter) {
47
+ return this.adapter;
48
+ }
49
+ if (!this.backendWasExplicit && !this.backendFromManifest) {
50
+ const uploads = await loadUploadsConfig(this.runtime);
51
+ this.config = { ...this.config, backend: uploads.backend, localPath: uploads.localPath };
52
+ this.backendFromManifest = true;
53
+ }
54
+ // Runtime resolution: select adapter by backend id
55
+ this.adapter = await this.runtime
56
+ .query('uploads/store')
57
+ .withId(this.config.backend)
58
+ .resolve();
59
+ return this.adapter;
60
+ }
61
+ /**
62
+ * Validates file size and MIME type before storage
63
+ */
64
+ validateFile(buffer, contentType) {
65
+ const parsed = parseRequest(uploadStorageOptionsSchema.pick({ buffer: true, contentType: true }), { buffer, contentType });
66
+ if (!parsed.success) {
67
+ return { valid: false, error: new CapabilityError('The upload payload is invalid.', 'INVALID_INPUT', { reason: 'upload-options-invalid' }) };
68
+ }
69
+ const result = validateUpload(parsed.data.buffer.byteLength, parsed.data.contentType);
70
+ if (!result.valid) {
71
+ return { valid: false, error: result.error };
72
+ }
73
+ return { valid: true };
74
+ }
75
+ /**
76
+ * Saves a file to storage (local or S3)
77
+ */
78
+ async saveFile(input) {
79
+ const parsed = parseRequest(uploadStorageOptionsSchema, input);
80
+ if (!parsed.success) {
81
+ throw new CapabilityError('The storage upload request is invalid.', 'INVALID_INPUT', { reason: 'upload-options-invalid' });
82
+ }
83
+ const options = parsed.data;
84
+ // Validate before saving
85
+ const validation = validateUpload(options.buffer.byteLength, options.contentType);
86
+ if (!validation.valid) {
87
+ throw validation.error;
88
+ }
89
+ const adapter = await this.getAdapter();
90
+ return adapter.save(options);
91
+ }
92
+ /**
93
+ * Retrieves file content from storage
94
+ */
95
+ async getFile(storagePath) {
96
+ const adapter = await this.getAdapter();
97
+ return adapter.get(storagePath);
98
+ }
99
+ /**
100
+ * Deletes a file from storage
101
+ */
102
+ async deleteFile(storagePath) {
103
+ const adapter = await this.getAdapter();
104
+ return adapter.delete(storagePath);
105
+ }
106
+ /**
107
+ * Generates a signed URL for temporary access to private S3 objects
108
+ */
109
+ async getSignedUrl(storagePath, expiresSeconds = 3600) {
110
+ const adapter = await this.getAdapter();
111
+ return adapter.getSignedUrl(storagePath, expiresSeconds);
112
+ }
113
+ /**
114
+ * Returns a public URL for accessing the file
115
+ */
116
+ async getPublicUrl(storagePath) {
117
+ const adapter = await this.getAdapter();
118
+ return adapter.getPublicUrl(storagePath);
119
+ }
120
+ /**
121
+ * Checks if a storage path is a local path
122
+ */
123
+ isLocalPath(storagePath) {
124
+ return storagePath.startsWith('/uploads/');
125
+ }
126
+ /**
127
+ * Parses an s3:// URI into bucket and key components
128
+ */
129
+ parseS3Path(storagePath) {
130
+ if (!storagePath.startsWith('s3://'))
131
+ return null;
132
+ const rest = storagePath.slice(5);
133
+ const slashIndex = rest.indexOf('/');
134
+ if (slashIndex < 0)
135
+ return null;
136
+ return {
137
+ bucket: rest.slice(0, slashIndex),
138
+ key: rest.slice(slashIndex + 1)
139
+ };
140
+ }
141
+ // Configuration getters
142
+ getConfig() {
143
+ return { ...this.config };
144
+ }
145
+ getMaxFileSize() {
146
+ return MAX_FILE_SIZE;
147
+ }
148
+ getAllowedMimeTypes() {
149
+ return ALLOWED_MIME_TYPES;
150
+ }
151
+ }
152
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/uploads/server/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
2
+ import { UploadStorageService } from './service.ts';
3
+ /** Runtime-owned default storage service; BaseRuntimeClient retries failed loads. */
4
+ export declare class UploadStorageClient extends BaseRuntimeClient {
5
+ private service?;
6
+ protected onLoad(): Promise<void>;
7
+ getService(): Promise<UploadStorageService>;
8
+ protected onDispose(): void;
9
+ }
10
+ export default UploadStorageClient;
11
+ //# sourceMappingURL=storage-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-client.d.ts","sourceRoot":"","sources":["../../../src/uploads/server/storage-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,qFAAqF;AACrF,qBAAa,mBAAoB,SAAQ,iBAAiB;IACzD,OAAO,CAAC,OAAO,CAAC,CAAuB;cAEd,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1C,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;cAM9B,SAAS,IAAI,IAAI;CAGpC;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { CapabilityError } from '@vibesdotdev/kernel';
2
+ import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
3
+ import { UploadStorageService } from "./service.js";
4
+ import { buildConfig } from "./config.js";
5
+ /** Runtime-owned default storage service; BaseRuntimeClient retries failed loads. */
6
+ export class UploadStorageClient extends BaseRuntimeClient {
7
+ service;
8
+ async onLoad() {
9
+ await super.onLoad();
10
+ this.service = new UploadStorageService(this.runtime, await buildConfig(this.runtime));
11
+ }
12
+ async getService() {
13
+ await this.ensureLoaded();
14
+ if (!this.service)
15
+ throw new CapabilityError('Upload storage is unavailable.', 'UNAVAILABLE', { reason: 'upload-storage-unavailable' });
16
+ return this.service;
17
+ }
18
+ onDispose() {
19
+ this.service = undefined;
20
+ }
21
+ }
22
+ export default UploadStorageClient;
23
+ //# sourceMappingURL=storage-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-client.js","sourceRoot":"","sources":["../../../src/uploads/server/storage-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qFAAqF;AACrF,MAAM,OAAO,mBAAoB,SAAQ,iBAAiB;IACjD,OAAO,CAAwB;IAEpB,KAAK,CAAC,MAAM;QAC9B,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,UAAU;QACf,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,gCAAgC,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;QACxI,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAEkB,SAAS;QAC3B,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC1B,CAAC;CACD;AAED,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Upload Storage - Legacy Function Exports
3
+ *
4
+ * Maintains backward compatibility with existing API endpoints.
5
+ */
6
+ import { type VibesRuntime } from '@vibesdotdev/kernel';
7
+ import { UploadStorageService } from './service.ts';
8
+ import type { UploadOptions, StorageResult } from '../schemas/index.ts';
9
+ /** True when this host's uploads config selects the S3 backend. */
10
+ export declare function isS3Enabled(runtime: VibesRuntime): Promise<boolean>;
11
+ /** Compatibility entrypoint; the kernel owns the client and its initialization lifecycle. */
12
+ export declare function createDefaultService(runtime: VibesRuntime): Promise<UploadStorageService>;
13
+ /**
14
+ * Validates file metadata before saving
15
+ */
16
+ export declare function validateFile(runtime: VibesRuntime, buffer: Buffer, contentType?: string): Promise<{
17
+ valid: true;
18
+ } | {
19
+ valid: false;
20
+ error: Error;
21
+ }>;
22
+ export declare function saveToStorage(runtime: VibesRuntime, options: UploadOptions): Promise<StorageResult>;
23
+ export declare function getSignedUrl(runtime: VibesRuntime, storagePath: string, expiresSeconds?: number): Promise<string | null>;
24
+ export declare function getPublicUrlFromS3Key(runtime: VibesRuntime, key: string): Promise<string | null>;
25
+ export declare function isLocalPath(runtime: VibesRuntime, storagePath: string): Promise<boolean>;
26
+ export declare function parseS3(runtime: VibesRuntime, storagePath: string): Promise<{
27
+ bucket: string;
28
+ key: string;
29
+ } | null>;
30
+ /**
31
+ * Retrieves file content from storage
32
+ */
33
+ export declare function getFile(runtime: VibesRuntime, storagePath: string): Promise<Buffer | null>;
34
+ /**
35
+ * Deletes a file from storage
36
+ */
37
+ export declare function deleteFile(runtime: VibesRuntime, storagePath: string): Promise<boolean>;
38
+ export { UploadStorageService } from './service.ts';
39
+ export { validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES } from '../schemas/common.ts';
40
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/uploads/server/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKpD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,mEAAmE;AACnE,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED,6FAA6F;AAC7F,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAG/F;AAED;;GAEG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAE3D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAEzG;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,SAAO,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAItG;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9F;AAED,wBAAsB,OAAO,CAC5B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAEjD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEhG;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7F;AAGD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Upload Storage - Legacy Function Exports
3
+ *
4
+ * Maintains backward compatibility with existing API endpoints.
5
+ */
6
+ import {} from '@vibesdotdev/kernel';
7
+ import { UploadStorageService } from "./service.js";
8
+ import { getVibesClient } from '@vibesdotdev/kernel/client';
9
+ import { requireBucket } from "./config.js";
10
+ import { loadUploadsConfig } from "../../config/uploads.js";
11
+ /** True when this host's uploads config selects the S3 backend. */
12
+ export async function isS3Enabled(runtime) {
13
+ return (await loadUploadsConfig(runtime)).backend === 's3';
14
+ }
15
+ /** Compatibility entrypoint; the kernel owns the client and its initialization lifecycle. */
16
+ export async function createDefaultService(runtime) {
17
+ const client = await getVibesClient('uploads-storage', runtime);
18
+ return client.getService();
19
+ }
20
+ /**
21
+ * Validates file metadata before saving
22
+ */
23
+ export async function validateFile(runtime, buffer, contentType) {
24
+ return (await createDefaultService(runtime)).validateFile(buffer, contentType);
25
+ }
26
+ export async function saveToStorage(runtime, options) {
27
+ return (await createDefaultService(runtime)).saveFile(options);
28
+ }
29
+ export async function getSignedUrl(runtime, storagePath, expiresSeconds = 3600) {
30
+ return (await createDefaultService(runtime)).getSignedUrl(storagePath, expiresSeconds);
31
+ }
32
+ export async function getPublicUrlFromS3Key(runtime, key) {
33
+ const uploads = await loadUploadsConfig(runtime);
34
+ const bucket = requireBucket(uploads.s3Bucket);
35
+ return (await createDefaultService(runtime)).getPublicUrl(`s3://${bucket}/${key}`);
36
+ }
37
+ export async function isLocalPath(runtime, storagePath) {
38
+ return (await createDefaultService(runtime)).isLocalPath(storagePath);
39
+ }
40
+ export async function parseS3(runtime, storagePath) {
41
+ return (await createDefaultService(runtime)).parseS3Path(storagePath);
42
+ }
43
+ /**
44
+ * Retrieves file content from storage
45
+ */
46
+ export async function getFile(runtime, storagePath) {
47
+ return (await createDefaultService(runtime)).getFile(storagePath);
48
+ }
49
+ /**
50
+ * Deletes a file from storage
51
+ */
52
+ export async function deleteFile(runtime, storagePath) {
53
+ return (await createDefaultService(runtime)).deleteFile(storagePath);
54
+ }
55
+ // Re-export service for new implementations
56
+ export { UploadStorageService } from "./service.js";
57
+ // Re-export validation utilities
58
+ export { validateUpload, MAX_FILE_SIZE, ALLOWED_MIME_TYPES } from "../schemas/common.js";
59
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/uploads/server/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Uploads Plugin
3
+ *
4
+ * Runtime plugin that registers:
5
+ * - uploads/store kind (capability descriptor)
6
+ * - uploads logger + output descriptors
7
+ * - runtime/client 'uploads' registration backed by UploadsClient
8
+ */
9
+ export declare const uploadsPlugin: import("@vibesdotdev/kernel").RuntimePlugin;
10
+ export default uploadsPlugin;
11
+ //# sourceMappingURL=uploads.plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.plugin.d.ts","sourceRoot":"","sources":["../../src/uploads/uploads.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgEH,eAAO,MAAM,aAAa,6CA0BxB,CAAC;AAEH,eAAe,aAAa,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Uploads Plugin
3
+ *
4
+ * Runtime plugin that registers:
5
+ * - uploads/store kind (capability descriptor)
6
+ * - uploads logger + output descriptors
7
+ * - runtime/client 'uploads' registration backed by UploadsClient
8
+ */
9
+ import { createRuntimePlugin, loader, createRuntimeAsset } from '@vibesdotdev/kernel';
10
+ import * as z from 'zod/v4';
11
+ import uploadsDocs from "./docs/uploads.docs.descriptor.js";
12
+ import uploadsShareLinksDocs from "./docs/uploads.share-links.docs.descriptor.js";
13
+ import mediaUploadsConfigDescriptor from "../config/media.uploads.config.descriptor.js";
14
+ // Descriptors
15
+ const uploadsStoreDescriptor = createRuntimeAsset({
16
+ id: 'uploads/store',
17
+ kind: 'uploads/store',
18
+ name: 'Uploads Store',
19
+ description: 'File storage backend adapter'
20
+ });
21
+ // Kind definitions - enables runtime.query('uploads/store') to work.
22
+ // Adapters (uploads-adapter-{local,s3,r2}) register descriptors+loaders for
23
+ // this kind via their own plugins; consumers select with withId().
24
+ const uploadsStoreDescriptorSchema = z.object({
25
+ id: z.string(),
26
+ kind: z.literal('uploads/store'),
27
+ name: z.string(),
28
+ description: z.string().optional(),
29
+ tags: z.array(z.string()).optional(),
30
+ hardware: z.array(z.enum(['consumer', 'cloud'])).optional(),
31
+ enabled: z.boolean().default(true)
32
+ });
33
+ const uploadsStoreKind = {
34
+ id: 'uploads/store',
35
+ descriptorSchema: uploadsStoreDescriptorSchema,
36
+ contexts: ['runtime']
37
+ };
38
+ const uploadsLoggerDescriptor = createRuntimeAsset({
39
+ id: 'uploads',
40
+ kind: 'logging/logger',
41
+ name: 'Uploads Logger',
42
+ description: 'Logger for uploads module',
43
+ namespace: 'uploads',
44
+ level: 'info'
45
+ });
46
+ const uploadsOutputDescriptor = createRuntimeAsset({
47
+ id: 'uploads',
48
+ kind: 'logging/output',
49
+ name: 'Uploads Output',
50
+ description: 'Output for uploads logs',
51
+ // `storage` is REQUIRED by OutputDescriptorSchema (no default). Omitting it
52
+ // makes registerPlugin throw at runtime init, which 500s EVERY request of
53
+ // any app composing this plugin (took down account-web prod on 2026-07-15).
54
+ storage: 'file',
55
+ format: 'jsonl',
56
+ path: 'logs/uploads.jsonl'
57
+ });
58
+ const uploadsClientDescriptor = createRuntimeAsset({
59
+ id: 'uploads',
60
+ kind: 'runtime/client',
61
+ name: 'Uploads Client',
62
+ description: 'Canonical client for uploads'
63
+ });
64
+ export const uploadsPlugin = createRuntimePlugin({
65
+ id: 'uploads',
66
+ name: 'Uploads',
67
+ description: 'Runtime-resolved file upload client and storage store kind.',
68
+ dependencies: ['runtime-client'],
69
+ kinds: [uploadsStoreKind],
70
+ descriptors: [
71
+ uploadsStoreDescriptor,
72
+ uploadsLoggerDescriptor,
73
+ uploadsOutputDescriptor,
74
+ uploadsDocs,
75
+ uploadsShareLinksDocs,
76
+ mediaUploadsConfigDescriptor,
77
+ uploadsClientDescriptor,
78
+ createRuntimeAsset({ id: 'uploads.sharing', kind: 'runtime/client', name: 'Sharing Client' }),
79
+ createRuntimeAsset({ id: 'uploads-storage', kind: 'runtime/client', name: 'Upload Storage Client' })
80
+ ],
81
+ loaders: [
82
+ // Return the class so AssetAccessor instantiates it with (descriptor, context).
83
+ loader('uploads.sharing', { kind: 'runtime/client' }, () => import('./client/sharing-client.js')),
84
+ loader('uploads', { kind: 'runtime/client' }, () => import('./client/uploads-client.js')),
85
+ loader('uploads-storage', { kind: 'runtime/client' }, () => import('./server/storage-client.js'))
86
+ ]
87
+ });
88
+ export default uploadsPlugin;
89
+ //# sourceMappingURL=uploads.plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.plugin.js","sourceRoot":"","sources":["../../src/uploads/uploads.plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * One attempt, captured once as an outcome: the value, or the failure that
3
+ * ended it. The caller reads the failure and decides (branch on its `code` /
4
+ * `reason`, report its value-free facts, or rethrow it); the capture itself
5
+ * never decides, drops or rewrites it.
6
+ */
7
+ import { type CaughtFailure } from '@vibesdotdev/kernel';
8
+ export type Attempt<T> = {
9
+ readonly ok: true;
10
+ readonly value: T;
11
+ } | {
12
+ readonly ok: false;
13
+ readonly failure: CaughtFailure;
14
+ };
15
+ /** Run `work`; an async failure is the outcome, never thrown. */
16
+ export declare function attempt<T>(work: () => Promise<T>): Promise<Attempt<T>>;
17
+ /** Run `work`; a synchronous failure is the outcome, never thrown. */
18
+ export declare function attemptSync<T>(work: () => T): Attempt<T>;
19
+ /** Throw a captured failure again: the `Error` itself, or the non-Error value that was thrown. */
20
+ export declare function rethrowFailure(failure: CaughtFailure): never;
21
+ /**
22
+ * The failure named by its value-free facts only (`CapabilityError UNAVAILABLE
23
+ * upload-response-invalid`, `Error ENOENT`): safe in a log field or a message,
24
+ * never the failure's own text.
25
+ */
26
+ export declare function failureLabel(failure: CaughtFailure): string;
27
+ //# sourceMappingURL=attempt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt.d.ts","sourceRoot":"","sources":["../../src/utils/attempt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEhG,MAAM,MAAM,OAAO,CAAC,CAAC,IAClB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC;AAE3D,iEAAiE;AACjE,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAM5E;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMxD;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,KAAK,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAG3D"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * One attempt, captured once as an outcome: the value, or the failure that
3
+ * ended it. The caller reads the failure and decides (branch on its `code` /
4
+ * `reason`, report its value-free facts, or rethrow it); the capture itself
5
+ * never decides, drops or rewrites it.
6
+ */
7
+ import { CaughtFailureSchema, valueFreeFailure } from '@vibesdotdev/kernel';
8
+ /** Run `work`; an async failure is the outcome, never thrown. */
9
+ export async function attempt(work) {
10
+ try {
11
+ return { ok: true, value: await work() };
12
+ }
13
+ catch (error) {
14
+ return { ok: false, failure: CaughtFailureSchema.parse(error) };
15
+ }
16
+ }
17
+ /** Run `work`; a synchronous failure is the outcome, never thrown. */
18
+ export function attemptSync(work) {
19
+ try {
20
+ return { ok: true, value: work() };
21
+ }
22
+ catch (error) {
23
+ return { ok: false, failure: CaughtFailureSchema.parse(error) };
24
+ }
25
+ }
26
+ /** Throw a captured failure again: the `Error` itself, or the non-Error value that was thrown. */
27
+ export function rethrowFailure(failure) {
28
+ throw failure instanceof Error ? failure : failure.value;
29
+ }
30
+ /**
31
+ * The failure named by its value-free facts only (`CapabilityError UNAVAILABLE
32
+ * upload-response-invalid`, `Error ENOENT`): safe in a log field or a message,
33
+ * never the failure's own text.
34
+ */
35
+ export function failureLabel(failure) {
36
+ const facts = valueFreeFailure(failure);
37
+ return [facts.name, facts.code, facts.reason].filter((fact) => fact !== undefined).join(' ');
38
+ }
39
+ //# sourceMappingURL=attempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt.js","sourceRoot":"","sources":["../../src/utils/attempt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAMhG,iEAAiE;AACjE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,IAAsB;IACtD,IAAI,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,CAAC;AACF,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW,CAAI,IAAa;IAC3C,IAAI,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;IACjE,CAAC;AACF,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,cAAc,CAAC,OAAsB;IACpD,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAsB;IAClD,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type CaughtFailure } from '@vibesdotdev/kernel';
2
+ /**
3
+ * A message safe to show a user for a failed media call: fixed text chosen by
4
+ * the failure's reason or code, never the failure's own message, which can
5
+ * carry a server's answer or a request value. Anything else is `fallback`.
6
+ */
7
+ export declare function failureMessage(failure: CaughtFailure, fallback: string): string;
8
+ //# sourceMappingURL=failure-message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-message.d.ts","sourceRoot":"","sources":["../../src/utils/failure-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoB5E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG/E"}
@@ -0,0 +1,28 @@
1
+ import { isCapabilityError } from '@vibesdotdev/kernel';
2
+ /** What a user is told for the refusals they can act on; any other failure gets the caller's fixed fallback. */
3
+ const REASON_MESSAGES = new Map(Object.entries({
4
+ 'upload-file-empty': 'That file is empty.',
5
+ 'upload-file-too-large': 'That file is too large.',
6
+ 'upload-type-not-allowed': 'That file type is not allowed.',
7
+ 'upload-size-invalid': 'That file could not be read.',
8
+ 'uploads-origin-unresolved': 'Uploads are not available here.',
9
+ 'media-capture-provider-unavailable': 'No capture provider is available.',
10
+ 'media-capture-result-invalid': 'The capture could not be read.'
11
+ }));
12
+ /** What a user is told by a failure's code when its reason has no message of its own. */
13
+ const CODE_MESSAGES = new Map(Object.entries({
14
+ AUTH_REQUIRED: 'Sign in to continue.',
15
+ PERMISSION_DENIED: 'You do not have permission to do that.',
16
+ RATE_LIMITED: 'Too many requests. Try again shortly.'
17
+ }));
18
+ /**
19
+ * A message safe to show a user for a failed media call: fixed text chosen by
20
+ * the failure's reason or code, never the failure's own message, which can
21
+ * carry a server's answer or a request value. Anything else is `fallback`.
22
+ */
23
+ export function failureMessage(failure, fallback) {
24
+ if (!isCapabilityError(failure))
25
+ return fallback;
26
+ return REASON_MESSAGES.get(failure.reason) ?? CODE_MESSAGES.get(failure.code) ?? fallback;
27
+ }
28
+ //# sourceMappingURL=failure-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failure-message.js","sourceRoot":"","sources":["../../src/utils/failure-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,qBAAqB,CAAC;AAE5E,gHAAgH;AAChH,MAAM,eAAe,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC;IAC9D,mBAAmB,EAAE,qBAAqB;IAC1C,uBAAuB,EAAE,yBAAyB;IAClD,yBAAyB,EAAE,gCAAgC;IAC3D,qBAAqB,EAAE,8BAA8B;IACrD,2BAA2B,EAAE,iCAAiC;IAC9D,oCAAoC,EAAE,mCAAmC;IACzE,8BAA8B,EAAE,gCAAgC;CAChE,CAAC,CAAC,CAAC;AAEJ,yFAAyF;AACzF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAiB,MAAM,CAAC,OAAO,CAAC;IAC5D,aAAa,EAAE,sBAAsB;IACrC,iBAAiB,EAAE,wCAAwC;IAC3D,YAAY,EAAE,uCAAuC;CACrD,CAAC,CAAC,CAAC;AAEJ;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE,QAAgB;IACtE,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,OAAO,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;AAC3F,CAAC"}