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

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,487 @@
1
+ /**
2
+ * Uploads Client
3
+ *
4
+ * Runtime-resolved HTTP client for file uploads. Communicates with platform-web's
5
+ * storage endpoints at /api/storage/*.
6
+ *
7
+ * Cross-app upload access goes through getVibesUploadsClient(runtime) — never raw fetch
8
+ * against platform-web, never new UploadStorageService().
9
+ *
10
+ * Every id that reaches a URL is an opaque token and is percent-encoded into its
11
+ * path segment; every response is parsed by a schema; an error names the failed
12
+ * fact and the HTTP status, never the response body or any request value.
13
+ */
14
+ import * as z from 'zod/v4';
15
+ import { getLogger } from '@vibesdotdev/logging';
16
+ import { CapabilityError } from '@vibesdotdev/kernel';
17
+ import { BaseRuntimeClient } from '@vibesdotdev/kernel/client';
18
+ import { OpaqueMediaIdSchema } from "../../schemas/opaque-id.js";
19
+ import { attempt, failureLabel } from "../../utils/attempt.js";
20
+ import { validateUpload } from "../schemas/common.js";
21
+ import { uploadClientOptionsSchema, parseRequest } from "../schemas/requests.js";
22
+ import { uploadServerResponseSchema } from "../schemas/forms.js";
23
+ import { createShareLinkOptionsSchema, shareLinkResultSchema, shareLinkListResultSchema } from "../schemas/shares.js";
24
+ /** The file metadata platform-web's `/meta` endpoint answers; fields beyond these are ignored. */
25
+ const fileMetaSchema = z.looseObject({
26
+ id: z.string(),
27
+ title: z.string().optional(),
28
+ filename: z.string(),
29
+ originalFilename: z.string().optional(),
30
+ mediaType: z.string().optional(),
31
+ mimeType: z.string().optional(),
32
+ fileSize: z.number(),
33
+ isPublic: z.boolean(),
34
+ storageProviderId: z.string().optional(),
35
+ createdAt: z.string(),
36
+ updatedAt: z.string(),
37
+ thumbnailPath: z.string().nullish(),
38
+ width: z.number().nullish(),
39
+ height: z.number().nullish(),
40
+ userId: z.string().optional()
41
+ });
42
+ /** The page origin where there is a page: read from the global scope's `window`, absent in SSR, workers and node. */
43
+ const PageHostSchema = z.looseObject({
44
+ window: z.looseObject({ location: z.looseObject({ origin: z.string().min(1) }) }).optional()
45
+ });
46
+ function browserWindowOrigin() {
47
+ const origin = PageHostSchema.safeParse(globalThis).data?.window?.location.origin;
48
+ return origin?.replace(/\/$/, '');
49
+ }
50
+ /** The taxonomy code an HTTP status maps to. */
51
+ function codeForStatus(status) {
52
+ if (status === undefined)
53
+ return 'UNAVAILABLE';
54
+ if (status === 400 || status === 413 || status === 415 || status === 422)
55
+ return 'INVALID_INPUT';
56
+ if (status === 401)
57
+ return 'AUTH_REQUIRED';
58
+ if (status === 403)
59
+ return 'PERMISSION_DENIED';
60
+ if (status === 404)
61
+ return 'NOT_FOUND';
62
+ if (status === 409)
63
+ return 'CONFLICT';
64
+ if (status === 429)
65
+ return 'RATE_LIMITED';
66
+ if (status === 408 || status === 504)
67
+ return 'TIMEOUT';
68
+ return 'UNAVAILABLE';
69
+ }
70
+ /**
71
+ * Runtime-resolved uploads client extending BaseRuntimeClient.
72
+ *
73
+ * Communicates with apps/platform-web storage endpoints:
74
+ * - POST /api/storage/upload
75
+ * - GET /api/storage/files
76
+ * - GET /api/storage/files/[id]
77
+ * - DELETE /api/storage/files/[id]
78
+ */
79
+ export class UploadsClient extends BaseRuntimeClient {
80
+ apiBaseUrl = null;
81
+ httpClient = null;
82
+ constructor(descriptor = { id: 'uploads', kind: 'runtime/client' }, context, runtime) {
83
+ super(descriptor, context, runtime);
84
+ }
85
+ async onLoad() {
86
+ await super.onLoad();
87
+ this.apiBaseUrl = await this.resolveUploadsApiBaseUrl();
88
+ }
89
+ dispose() {
90
+ this.httpClient = null;
91
+ super.dispose();
92
+ }
93
+ /**
94
+ * Upload a file to storage.
95
+ *
96
+ * POSTs to platform-web's /api/storage/upload endpoint.
97
+ * Creates the canonical mediaItems row via platform-web.
98
+ */
99
+ async upload(input) {
100
+ const parsed = parseRequest(uploadClientOptionsSchema, input);
101
+ if (!parsed.success) {
102
+ const reason = parsed.field === 'kind' ? 'upload-kind-invalid'
103
+ : parsed.field === 'sourceApp' || parsed.field === 'sourceId' ? 'upload-provenance-invalid'
104
+ : parsed.field === 'maxSize' || parsed.field === 'allowList' ? 'upload-limits-invalid'
105
+ : 'upload-options-invalid';
106
+ throw new UploadsClientError('The upload request is invalid.', { status: 400, reason });
107
+ }
108
+ const options = parsed.data;
109
+ this.validateUploadOptions(options);
110
+ await this.ensureLoaded();
111
+ // The internal endpoint reads the owning user from `x-vibes-user-id`;
112
+ // fail fast rather than letting platform-web reject the request.
113
+ if (options.serviceToken && !options.userId) {
114
+ throw new UploadsClientError('Internal-service uploads require a userId.', {
115
+ status: 400,
116
+ reason: 'upload-service-token-without-user'
117
+ });
118
+ }
119
+ const url = await this.buildUploadUrl(options);
120
+ const formData = new FormData();
121
+ const filePart = options.file instanceof Blob
122
+ ? options.file
123
+ : new Blob([new Uint8Array(options.file)], options.contentType ? { type: options.contentType } : undefined);
124
+ formData.append('file', filePart, options.originalName || 'upload');
125
+ if (options.originalName) {
126
+ formData.append('title', options.originalName);
127
+ }
128
+ const headers = {};
129
+ if (options.serviceToken) {
130
+ headers['Authorization'] = `Bearer ${options.serviceToken}`;
131
+ if (options.userId)
132
+ headers['x-vibes-user-id'] = options.userId;
133
+ if (options.organizationId)
134
+ headers['x-vibes-organization-id'] = options.organizationId;
135
+ }
136
+ const init = { method: 'POST', headers, body: formData };
137
+ if (!options.serviceToken)
138
+ init.credentials = 'include';
139
+ const response = await this.fetch(url.toString(), init);
140
+ if (!response.ok)
141
+ throw httpFailure('Upload', response.status);
142
+ const data = await this.readJson(response, uploadServerResponseSchema, 'upload');
143
+ return {
144
+ id: data.id,
145
+ url: data.url,
146
+ name: data.filename ?? options.originalName,
147
+ contentType: data.mediaType ?? options.contentType,
148
+ size: data.fileSize,
149
+ storagePath: `/api/storage/files/${encodeURIComponent(data.id)}`
150
+ };
151
+ }
152
+ /**
153
+ * Get file metadata for one or more file IDs.
154
+ *
155
+ * GETs from platform-web's /api/storage/files endpoint.
156
+ */
157
+ async getFiles(ids) {
158
+ await this.ensureLoaded();
159
+ // Fetch each file individually since the API is per-file
160
+ const results = [];
161
+ for (const id of ids) {
162
+ const fetched = await attempt(() => this.getFile(id));
163
+ if (!fetched.ok) {
164
+ // Skipped, not dropped: the failure's class and reason are logged, never its text or the id.
165
+ getLogger('media', this.runtime).child({ context: 'uploads.client' }).warn('uploads.getFiles: skipped unfetchable file', { failure: failureLabel(fetched.failure) });
166
+ }
167
+ else if (fetched.value) {
168
+ results.push(fetched.value);
169
+ }
170
+ }
171
+ return results;
172
+ }
173
+ /**
174
+ * Get a single file's metadata.
175
+ *
176
+ * Calls the JSON metadata endpoint (/api/storage/files/[id]/meta) rather than
177
+ * issuing a HEAD against the binary-download route. The download route returns
178
+ * a binary stream (or 302 redirect) and does not expose filename or MIME type
179
+ * in headers, so a HEAD request cannot populate a usable FileRecord.
180
+ */
181
+ async getFile(id, serviceToken) {
182
+ await this.ensureLoaded();
183
+ const headers = {};
184
+ if (serviceToken) {
185
+ headers['Authorization'] = `Bearer ${serviceToken}`;
186
+ }
187
+ const metaInit = { method: 'GET', headers };
188
+ if (!serviceToken)
189
+ metaInit.credentials = 'include';
190
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(id)}/meta`, metaInit);
191
+ if (response.status === 404) {
192
+ return null;
193
+ }
194
+ if (!response.ok)
195
+ throw httpFailure('Get file metadata', response.status);
196
+ const data = await this.readJson(response, fileMetaSchema, 'file metadata');
197
+ return {
198
+ id: data.id,
199
+ title: data.title,
200
+ filename: data.filename,
201
+ originalFilename: data.originalFilename,
202
+ mediaType: data.mediaType,
203
+ mimeType: data.mimeType,
204
+ fileSize: data.fileSize,
205
+ isPublic: data.isPublic,
206
+ storageProviderId: data.storageProviderId,
207
+ createdAt: data.createdAt,
208
+ updatedAt: data.updatedAt,
209
+ thumbnailPath: data.thumbnailPath ?? undefined,
210
+ width: data.width ?? undefined,
211
+ height: data.height ?? undefined
212
+ };
213
+ }
214
+ /**
215
+ * Get the public serve URL for a file.
216
+ *
217
+ * Returns the path that can be used to serve/download the file.
218
+ */
219
+ getServeUrl(fileId) {
220
+ const baseUrl = this.apiBaseUrl;
221
+ if (!baseUrl) {
222
+ throw new UploadsClientError('Uploads origin is not resolved; load the client first.', {
223
+ status: 503,
224
+ reason: 'uploads-origin-unresolved'
225
+ });
226
+ }
227
+ return `${baseUrl}/api/storage/files/${idSegment(fileId)}`;
228
+ }
229
+ /**
230
+ * Create a revocable, public share link for a file (owner-only).
231
+ *
232
+ * POSTs to platform-web's `/api/storage/files/[id]/shares`. The returned
233
+ * `shareUrl` is an absolute, anonymously-fetchable URL pointing at the
234
+ * session-bypassed `/api/storage/shared/[token]` serving route — never the
235
+ * private files/[id] path. Egress on share downloads is billed to the owner.
236
+ */
237
+ async createShareLink(fileId, options = {}) {
238
+ const parsed = parseRequest(createShareLinkOptionsSchema, options);
239
+ if (!parsed.success) {
240
+ throw new UploadsClientError('The share link options are invalid.', {
241
+ status: 400, reason: 'upload-share-options-invalid'
242
+ });
243
+ }
244
+ await this.ensureLoaded();
245
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(fileId)}/shares`, {
246
+ method: 'POST',
247
+ headers: { 'Content-Type': 'application/json' },
248
+ body: JSON.stringify(parsed.data),
249
+ ...this.crossOriginCookieInit()
250
+ });
251
+ if (!response.ok)
252
+ throw httpFailure('Create share link', response.status);
253
+ return (await this.readJson(response, shareLinkResultSchema, 'share link')).result;
254
+ }
255
+ /**
256
+ * List active + revoked share links for a file (owner-only).
257
+ *
258
+ * GETs from platform-web's `/api/storage/files/[id]/shares`.
259
+ */
260
+ async listShareLinks(fileId) {
261
+ await this.ensureLoaded();
262
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(fileId)}/shares`, {
263
+ method: 'GET',
264
+ ...this.crossOriginCookieInit()
265
+ });
266
+ if (!response.ok)
267
+ throw httpFailure('List share links', response.status);
268
+ return (await this.readJson(response, shareLinkListResultSchema, 'share link list')).results;
269
+ }
270
+ /**
271
+ * Revoke a share link (owner-only). Soft-revokes server-side so audit data
272
+ * survives. Returns false when the link does not exist or is not owned.
273
+ *
274
+ * DELETEs platform-web's `/api/storage/files/[id]/shares/[shareId]`.
275
+ */
276
+ async revokeShareLink(fileId, shareId) {
277
+ await this.ensureLoaded();
278
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(fileId)}/shares/${idSegment(shareId)}`, { method: 'DELETE', ...this.crossOriginCookieInit() });
279
+ if (response.status === 404) {
280
+ return false;
281
+ }
282
+ if (!response.ok)
283
+ throw httpFailure('Revoke share link', response.status);
284
+ return true;
285
+ }
286
+ /**
287
+ * Assert that a file is owned by a specific user.
288
+ *
289
+ * Uses the /meta endpoint with an optional service token for server-to-server
290
+ * calls. Compares the file's userId field (returned in the JSON metadata)
291
+ * against the supplied userId. The X-User-Id header approach is not used
292
+ * because platform-web never reads that header for authorization.
293
+ *
294
+ * Any failure (a refused id, a failed request, an unreadable answer) is "not
295
+ * owned": the check fails closed and logs the failure's class only.
296
+ *
297
+ * @param fileId - The file ID to check.
298
+ * @param userId - The user ID to compare against the file's owner.
299
+ * @param serviceToken - Optional VIBES_INTERNAL_SERVICE_TOKEN for server-side
300
+ * calls made without a forwarded user session cookie.
301
+ */
302
+ async assertOwnedBy(fileId, userId, serviceToken) {
303
+ await this.ensureLoaded();
304
+ const checked = await attempt(async () => {
305
+ const headers = {};
306
+ if (serviceToken) {
307
+ headers['Authorization'] = `Bearer ${serviceToken}`;
308
+ }
309
+ const metaInit = { method: 'GET', headers };
310
+ if (!serviceToken)
311
+ metaInit.credentials = 'include';
312
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(fileId)}/meta`, metaInit);
313
+ if (!response.ok)
314
+ return false;
315
+ const data = await this.readJson(response, z.looseObject({ userId: z.string().optional() }), 'file metadata');
316
+ return data.userId === userId;
317
+ });
318
+ if (!checked.ok) {
319
+ getLogger('media', this.runtime).child({ context: 'uploads.client' }).warn('uploads.verifyOwnership: request failed; treating as not owned', {
320
+ failure: failureLabel(checked.failure)
321
+ });
322
+ return false;
323
+ }
324
+ return checked.value;
325
+ }
326
+ /**
327
+ * Delete a file.
328
+ *
329
+ * DELETEs from platform-web's /api/storage/files/[id] endpoint.
330
+ */
331
+ async delete(fileId) {
332
+ await this.ensureLoaded();
333
+ const response = await this.fetch(`${this.apiBaseUrl}/api/storage/files/${idSegment(fileId)}`, {
334
+ method: 'DELETE',
335
+ ...this.crossOriginCookieInit()
336
+ });
337
+ if (response.status === 404) {
338
+ return false;
339
+ }
340
+ if (!response.ok)
341
+ throw httpFailure('Delete file', response.status);
342
+ return true;
343
+ }
344
+ /**
345
+ * Storage usage for a user.
346
+ *
347
+ * platform-web exposes no usage endpoint to this client, so there is no
348
+ * answer to give: the call refuses (`upload-usage-unavailable`) instead of
349
+ * answering zeros that a caller would read as "nothing stored". Query
350
+ * platform-web directly for usage.
351
+ */
352
+ async getUserStorageUsage(_userId) {
353
+ await this.ensureLoaded();
354
+ throw new UploadsClientError('Storage usage is not available through the uploads client.', {
355
+ status: 501,
356
+ reason: 'upload-usage-unavailable'
357
+ });
358
+ }
359
+ // ------------------------------------------------------------------
360
+ // Internal helpers
361
+ // ------------------------------------------------------------------
362
+ /**
363
+ * Refuse an upload that cannot succeed, before any request: unknown kind,
364
+ * empty provenance, a size or type the package forbids, a size over the
365
+ * caller's own cap, or a type outside the caller's own allowlist.
366
+ */
367
+ validateUploadOptions(options) {
368
+ const size = options.file instanceof Blob ? options.file.size : options.file.byteLength;
369
+ const contentType = options.contentType ?? (options.file instanceof Blob ? options.file.type : undefined);
370
+ const checked = validateUpload(size, contentType || undefined, {
371
+ maxSize: options.maxSize,
372
+ allowList: options.allowList
373
+ });
374
+ if (!checked.valid)
375
+ throw checked.error;
376
+ }
377
+ /** The response's JSON body, parsed by `schema`; an unreadable or mismatching body is `upload-response-invalid`. */
378
+ async readJson(response, schema, what) {
379
+ const read = await attempt(() => response.json());
380
+ const parsed = read.ok ? schema.safeParse(read.value) : undefined;
381
+ if (parsed?.success)
382
+ return parsed.data;
383
+ throw new UploadsClientError(`The uploads service answered ${what} in a shape this client does not accept.`, {
384
+ status: 502,
385
+ reason: 'upload-response-invalid'
386
+ });
387
+ }
388
+ /**
389
+ * Build the upload URL with query parameters.
390
+ */
391
+ async buildUploadUrl(options) {
392
+ const baseUrl = this.apiBaseUrl ?? (await this.resolveUploadsApiBaseUrl());
393
+ // Internal-service uploads (no user cookie) go to the token-gated internal
394
+ // route; cookie-authenticated browser uploads use the public one.
395
+ const path = options.serviceToken
396
+ ? '/api/internal/storage/upload'
397
+ : '/api/storage/upload';
398
+ const url = new URL(`${baseUrl}${path}`);
399
+ url.searchParams.set('sourceApp', options.sourceApp);
400
+ url.searchParams.set('sourceId', options.sourceId);
401
+ if (options.isPublic) {
402
+ url.searchParams.set('isPublic', 'true');
403
+ }
404
+ return url;
405
+ }
406
+ /**
407
+ * Cookie-authenticated requests carry session cookies so the catalogued
408
+ * platform origin can authenticate the browser user even when that origin
409
+ * differs from the page origin (cross-origin deployments must also allow
410
+ * the credentials on the platform side). Service-token requests carry their
411
+ * own Authorization identity instead, so they never depend on cookies.
412
+ */
413
+ crossOriginCookieInit() {
414
+ return { credentials: 'include' };
415
+ }
416
+ /**
417
+ * Resolve the uploads API base URL from the `platform` service catalog.
418
+ * When that service is undeclared, the browser page origin is the host fact.
419
+ */
420
+ async resolveUploadsApiBaseUrl() {
421
+ const platformDeclared = this.runtime.hasKind('infra/service') &&
422
+ this.runtime.query('infra/service').withId('platform').descriptors().length > 0;
423
+ if (platformDeclared) {
424
+ // Resolved lazily so hosts without a platform catalog (every browser
425
+ // mount, which falls through to the page origin below) never load
426
+ // the service reader on the client's critical path.
427
+ const { serviceOrigin } = await import('@vibesdotdev/infra-contracts/service');
428
+ return (await serviceOrigin(this.runtime, 'platform')).replace(/\/$/, '');
429
+ }
430
+ const browserOrigin = browserWindowOrigin();
431
+ if (browserOrigin)
432
+ return browserOrigin;
433
+ throw new UploadsClientError('The platform origin is not declared for this host (compose the platform infra/service catalog).', { status: 503, reason: 'uploads-origin-unresolved' });
434
+ }
435
+ /**
436
+ * Perform a fetch request.
437
+ */
438
+ async fetch(url, init) {
439
+ // `globalThis.fetch` must stay bound to `globalThis`; a detached reference
440
+ // throws "Illegal invocation" on workerd (Cloudflare Workers), which is
441
+ // where server-side uploads (e.g. account-web avatars) run.
442
+ const fetchFn = this.httpClient?.fetch ?? globalThis.fetch.bind(globalThis);
443
+ return fetchFn(url, init);
444
+ }
445
+ }
446
+ /**
447
+ * Error thrown by UploadsClient: a `CapabilityError` whose code follows the
448
+ * HTTP status, carrying `status` and a `reason`, naming no response body.
449
+ */
450
+ export class UploadsClientError extends CapabilityError {
451
+ status;
452
+ constructor(message, options) {
453
+ super(message, codeForStatus(options?.status), {
454
+ reason: options?.reason ?? 'upload-request-failed',
455
+ retryable: false,
456
+ details: options?.status === undefined ? undefined : { status: options.status },
457
+ cause: options?.cause
458
+ });
459
+ this.name = 'UploadsClientError';
460
+ this.status = options?.status;
461
+ }
462
+ }
463
+ /** An HTTP failure: the operation and the status, never the response body. */
464
+ function httpFailure(operation, status) {
465
+ return new UploadsClientError(`${operation} failed (HTTP ${status}).`, { status });
466
+ }
467
+ /** One path segment for `id`: an opaque token, percent-encoded; anything else is `upload-id-invalid`. */
468
+ function idSegment(id) {
469
+ const token = OpaqueMediaIdSchema.safeParse(id);
470
+ if (!token.success) {
471
+ throw new UploadsClientError('An upload id is not an opaque token.', {
472
+ status: 400,
473
+ reason: 'upload-id-invalid'
474
+ });
475
+ }
476
+ return encodeURIComponent(token.data);
477
+ }
478
+ /**
479
+ * Create an uploads client instance directly.
480
+ *
481
+ * Prefer getVibesUploadsClient(runtime) for runtime-resolved access.
482
+ */
483
+ export function createUploadsClient(runtime, context) {
484
+ return new UploadsClient({ id: 'uploads', kind: 'runtime/client' }, context, runtime);
485
+ }
486
+ export default UploadsClient;
487
+ //# sourceMappingURL=uploads-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads-client.js","sourceRoot":"","sources":["../../../src/uploads/client/uploads-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DocsTopicDescriptor } from '@vibesdotdev/docs-contracts';
2
+ declare const descriptor: DocsTopicDescriptor;
3
+ export default descriptor;
4
+ //# sourceMappingURL=uploads.docs.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.docs.descriptor.d.ts","sourceRoot":"","sources":["../../../src/uploads/docs/uploads.docs.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,QAAA,MAAM,UAAU,EAAE,mBA8DjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,65 @@
1
+ const descriptor = {
2
+ kind: 'docs/topic',
3
+ id: 'uploads',
4
+ title: 'Uploads',
5
+ summary: 'Runtime-resolved file uploads: the uploads/store kind, the uploads client, and share links.',
6
+ body: {
7
+ type: 'markdown',
8
+ sourceType: 'raw',
9
+ source: `---
10
+ title: Uploads
11
+ summary: Store and share files through the runtime-resolved uploads surface.
12
+ tags: [uploads, storage, media]
13
+ order: 1
14
+ surfaces: [cli, web, in-app]
15
+ hardware: [consumer, cloud]
16
+ id: uploads
17
+ ---
18
+
19
+ Apps upload files through the \`uploads\` runtime client, never through raw
20
+ \`fetch\` against platform-web and never by constructing a storage service:
21
+
22
+ \`\`\`ts
23
+ import { getVibesUploadsClient } from '@vibesdotdev/media/uploads/client';
24
+
25
+ const uploads = await getVibesUploadsClient(runtime);
26
+ const file = await uploads.upload({
27
+ file: buffer,
28
+ kind: 'chat',
29
+ sourceApp: 'chat',
30
+ sourceId: roomId
31
+ });
32
+ \`\`\`
33
+
34
+ The \`uploads/store\` kind names the storage backend. Hosts compose the
35
+ adapter their scope can support (local filesystem on consumer hardware,
36
+ R2/S3 in the cloud); features resolve it from the runtime and never import
37
+ an adapter. The plugin also registers the runtime-owned
38
+ \`uploads-storage\` client used by the internal legacy storage helpers.
39
+ Initialization failures remain retryable and separate runtimes own separate
40
+ services. Complete upload requests parse through \`uploadClientOptionsSchema\`
41
+ before metadata reads or transport; provenance is trimmed and malformed or
42
+ throwing inputs produce value-free typed refusals. The \`UploadsClient\` share-link methods create revocable public
43
+ links for private files. Hosts configure the local adapter root with
44
+ \`media.uploads.localPath\`: relative roots use the bound workspace, absolute
45
+ roots are used directly, and an omitted root uses \`uploads\`. Save, read, and
46
+ delete share this runtime-owned root and cannot escape it.
47
+
48
+ \`validateUpload\` and HTTP requests share \`uploadLimitsSchema\`: optional caps
49
+ are positive safe integers and allowlists contain strings. A malformed cap or
50
+ allowlist is refused instead of compared against. \`validateUpload\` returns
51
+ \`upload-limits-invalid\` (throwing accessors included) and uses the parsed
52
+ snapshot; the HTTP boundary reports readable malformed caps as
53
+ \`upload-limits-invalid\` and unreadable or throwing requests as
54
+ \`upload-options-invalid\`. Defaults are 50 MiB and the canonical MIME allowlist.
55
+ See the \`uploads.share-links\` topic.
56
+ `
57
+ },
58
+ order: 1,
59
+ tags: ['uploads', 'storage', 'media'],
60
+ surfaces: ['cli', 'web', 'in-app'],
61
+ hardware: ['consumer', 'cloud'],
62
+ enabled: true
63
+ };
64
+ export default descriptor;
65
+ //# sourceMappingURL=uploads.docs.descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.docs.descriptor.js","sourceRoot":"","sources":["../../../src/uploads/docs/uploads.docs.descriptor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAwB;IACvC,IAAI,EAAE,YAAY;IAClB,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,6FAA6F;IACtG,IAAI,EAAE;QACL,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,KAAK;QACjB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CT;KACC;IACD,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC;IAClC,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IAC/B,OAAO,EAAE,IAAI;CACb,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Descriptor for uploads.share-links
3
+ */
4
+ declare const descriptor: {
5
+ kind: "docs/topic";
6
+ id: string;
7
+ title: string;
8
+ summary: string;
9
+ body: {
10
+ type: "markdown";
11
+ sourceType: "raw";
12
+ source: string;
13
+ };
14
+ parent: string;
15
+ order: number;
16
+ tags: string[];
17
+ surfaces: readonly ["cli", "web", "in-app"];
18
+ hardware: readonly ["consumer", "cloud"];
19
+ enabled: boolean;
20
+ };
21
+ export default descriptor;
22
+ //# sourceMappingURL=uploads.share-links.docs.descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploads.share-links.docs.descriptor.d.ts","sourceRoot":"","sources":["../../../src/uploads/docs/uploads.share-links.docs.descriptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmEH,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;CAgBf,CAAC;AAEF,eAAe,UAAU,CAAC"}