@jini-ai/cms 0.3.4 → 0.3.6

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 (104) hide show
  1. package/README.md +22 -17
  2. package/dist/content-types/agent-tools.d.ts.map +1 -1
  3. package/dist/content-types/agent-tools.js +1 -1
  4. package/dist/content-types/agent-tools.js.map +1 -1
  5. package/dist/content-types/errors.d.ts +19 -1
  6. package/dist/content-types/errors.d.ts.map +1 -1
  7. package/dist/content-types/errors.js +22 -1
  8. package/dist/content-types/errors.js.map +1 -1
  9. package/dist/content-types/index-provisioning.d.ts +56 -10
  10. package/dist/content-types/index-provisioning.d.ts.map +1 -1
  11. package/dist/content-types/index-provisioning.js +86 -13
  12. package/dist/content-types/index-provisioning.js.map +1 -1
  13. package/dist/content-types/index.d.ts +15 -3
  14. package/dist/content-types/index.d.ts.map +1 -1
  15. package/dist/content-types/index.js +14 -2
  16. package/dist/content-types/index.js.map +1 -1
  17. package/dist/content-types/lifecycle.js +3 -3
  18. package/dist/content-types/lifecycle.js.map +1 -1
  19. package/dist/content-types/types.d.ts +64 -3
  20. package/dist/content-types/types.d.ts.map +1 -1
  21. package/dist/content-types/types.js +67 -3
  22. package/dist/content-types/types.js.map +1 -1
  23. package/dist/content-types/write-service.d.ts +18 -3
  24. package/dist/content-types/write-service.d.ts.map +1 -1
  25. package/dist/content-types/write-service.js +28 -2
  26. package/dist/content-types/write-service.js.map +1 -1
  27. package/dist/core/ports.d.ts +12 -2
  28. package/dist/core/ports.d.ts.map +1 -1
  29. package/dist/entries/field-validation.d.ts.map +1 -1
  30. package/dist/entries/field-validation.js +96 -1
  31. package/dist/entries/field-validation.js.map +1 -1
  32. package/dist/entries/write-service.d.ts +14 -0
  33. package/dist/entries/write-service.d.ts.map +1 -1
  34. package/dist/entries/write-service.js +2 -2
  35. package/dist/entries/write-service.js.map +1 -1
  36. package/dist/identity/admin-crud-service.d.ts +28 -0
  37. package/dist/identity/admin-crud-service.d.ts.map +1 -1
  38. package/dist/identity/admin-crud-service.js +30 -0
  39. package/dist/identity/admin-crud-service.js.map +1 -1
  40. package/dist/identity/auth-service.d.ts +32 -1
  41. package/dist/identity/auth-service.d.ts.map +1 -1
  42. package/dist/identity/auth-service.js +44 -15
  43. package/dist/identity/auth-service.js.map +1 -1
  44. package/dist/identity/index.d.ts +4 -1
  45. package/dist/identity/index.d.ts.map +1 -1
  46. package/dist/identity/index.js +4 -1
  47. package/dist/identity/index.js.map +1 -1
  48. package/dist/identity/seed.d.ts +14 -2
  49. package/dist/identity/seed.d.ts.map +1 -1
  50. package/dist/identity/seed.js +197 -45
  51. package/dist/identity/seed.js.map +1 -1
  52. package/dist/media/blob-store.fs.d.ts +7 -0
  53. package/dist/media/blob-store.fs.d.ts.map +1 -1
  54. package/dist/media/blob-store.fs.js +12 -2
  55. package/dist/media/blob-store.fs.js.map +1 -1
  56. package/dist/media/content-type-sniffer.d.ts +1 -1
  57. package/dist/media/content-type-sniffer.d.ts.map +1 -1
  58. package/dist/media/content-type-sniffer.js +52 -4
  59. package/dist/media/content-type-sniffer.js.map +1 -1
  60. package/dist/media/html-attributes.d.ts +90 -0
  61. package/dist/media/html-attributes.d.ts.map +1 -0
  62. package/dist/media/html-attributes.js +161 -0
  63. package/dist/media/html-attributes.js.map +1 -0
  64. package/dist/media/image-transformer.sharp.d.ts +35 -1
  65. package/dist/media/image-transformer.sharp.d.ts.map +1 -1
  66. package/dist/media/image-transformer.sharp.js +44 -2
  67. package/dist/media/image-transformer.sharp.js.map +1 -1
  68. package/dist/media/index.d.ts +2 -1
  69. package/dist/media/index.d.ts.map +1 -1
  70. package/dist/media/index.js +2 -1
  71. package/dist/media/index.js.map +1 -1
  72. package/dist/media/media-service.d.ts +93 -1
  73. package/dist/media/media-service.d.ts.map +1 -1
  74. package/dist/media/media-service.js +254 -7
  75. package/dist/media/media-service.js.map +1 -1
  76. package/dist/media/ports.d.ts +8 -1
  77. package/dist/media/ports.d.ts.map +1 -1
  78. package/dist/media/rendition-service.d.ts +7 -1
  79. package/dist/media/rendition-service.d.ts.map +1 -1
  80. package/dist/media/rendition-service.js +10 -4
  81. package/dist/media/rendition-service.js.map +1 -1
  82. package/dist/media/repo.memory.d.ts +4 -0
  83. package/dist/media/repo.memory.d.ts.map +1 -1
  84. package/dist/media/repo.memory.js +3 -0
  85. package/dist/media/repo.memory.js.map +1 -1
  86. package/dist/media/tool-registrations.d.ts +6 -2
  87. package/dist/media/tool-registrations.d.ts.map +1 -1
  88. package/dist/media/tool-registrations.js +19 -2
  89. package/dist/media/tool-registrations.js.map +1 -1
  90. package/dist/media/types.d.ts +26 -0
  91. package/dist/media/types.d.ts.map +1 -1
  92. package/dist/media/types.js.map +1 -1
  93. package/dist/navigation/agent-tools.d.ts.map +1 -1
  94. package/dist/navigation/agent-tools.js +8 -1
  95. package/dist/navigation/agent-tools.js.map +1 -1
  96. package/dist/navigation/index.d.ts +10 -1
  97. package/dist/navigation/index.d.ts.map +1 -1
  98. package/dist/navigation/index.js +10 -1
  99. package/dist/navigation/index.js.map +1 -1
  100. package/dist/navigation/menu-service.d.ts +60 -4
  101. package/dist/navigation/menu-service.d.ts.map +1 -1
  102. package/dist/navigation/menu-service.js +106 -8
  103. package/dist/navigation/menu-service.js.map +1 -1
  104. package/package.json +1 -1
@@ -54,6 +54,7 @@ import { createHash } from "node:crypto";
54
54
  import { MediaConflictError, MediaNotFoundError, MediaSourceImmutableError, MediaStillReferencedError, MediaValidationError, } from "./types.js";
55
55
  import { withSha256Lock } from "./blob-gc-lock.js";
56
56
  import { tombstoneBlobIfUnreferenced } from "./blob-gc.js";
57
+ import { describeMediaHtmlAttributeError, parseMediaHtmlAttributes } from "./html-attributes.js";
57
58
  export { MediaConflictError, MediaNotFoundError, MediaSourceImmutableError, MediaStillReferencedError, MediaValidationError, };
58
59
  /** Default byte-size cap (this pass's stand-in for the real ingress policy's streaming cap). */
59
60
  export const DEFAULT_MAX_UPLOAD_BYTES = 10 * 1024 * 1024; // 10 MiB
@@ -63,6 +64,14 @@ export const DEFAULT_MAX_UPLOAD_BYTES = 10 * 1024 * 1024; // 10 MiB
63
64
  * that sanitizer is not built in this pass, so SVG upload is rejected rather
64
65
  * than accepted unsanitized.
65
66
  *
67
+ * `image/avif` (owner-directed, 2026-09-06): a fifth still-image type, on the
68
+ * same footing as the four above — `content-type-sniffer.ts` identifies it by
69
+ * ISO-BMFF brand and the installed `sharp`/libvips build decodes it, so it
70
+ * flows through the ordinary transform/rendition pipeline and is re-encoded
71
+ * like any other image. Adding it required a matching sniffer fix, not just
72
+ * this line: AVIF shares MP4's `ftyp` container tag, so before that fix an
73
+ * AVIF was sniffed as `video/mp4` and served as an unplayable video.
74
+ *
66
75
  * `video/mp4`/`video/webm` (owner-directed, 2026-08-24): the two formats
67
76
  * `content-type-sniffer.ts` already recognizes by magic bytes. Unlike the four
68
77
  * image types above, an accepted video is never re-encoded — there is no
@@ -78,6 +87,7 @@ export const DEFAULT_ALLOWED_MIME_TYPES = new Set([
78
87
  "image/png",
79
88
  "image/webp",
80
89
  "image/gif",
90
+ "image/avif",
81
91
  "video/mp4",
82
92
  "video/webm",
83
93
  ]);
@@ -108,6 +118,103 @@ function deriveTitleFromFilename(filename) {
108
118
  const base = filename.trim().replace(/\.[^./\\]+$/, "");
109
119
  return base.trim() || "Untitled";
110
120
  }
121
+ /** Shared slug-format rule (2026-09-07) — same shape as `post`'s `SLUG_FORMAT_PATTERN`: lowercase
122
+ * letters, digits, and dashes only. Media slugs have no reserved-word list (`post`'s `admin`/`api`
123
+ * exclusions exist because a post slug can become a literal URL path segment a route dispatches
124
+ * on; a media slug is only ever a lookup key, never a route itself, so that hazard doesn't apply). */
125
+ const MEDIA_SLUG_FORMAT_PATTERN = /^[a-z0-9-]+$/;
126
+ /**
127
+ * Slugs that spell a UUID are refused outright (2026-09-07 fix).
128
+ *
129
+ * A lowercase UUID is `[a-z0-9-]+` character for character, so {@link MEDIA_SLUG_FORMAT_PATTERN}
130
+ * happily accepted one — and {@link findMediaByIdOrSlug} used to resolve SLUG FIRST, so pointing one
131
+ * asset's slug at another asset's `id` silently took over every reference already authored against
132
+ * that id (every `/m/{id}/…` URL a host's renderer has ever emitted for the victim). That resolution
133
+ * order is now id-first, which closes the hijack for rows that already carry such a slug; this rule
134
+ * is the write-path half — a slug that can only ever shadow an id is not a slug anyone wants, so it
135
+ * is refused where a human can still see why rather than silently shadowed at read time.
136
+ *
137
+ * Shape-based, not a lookup: it rejects EVERY UUID-shaped value, not only ones that currently
138
+ * collide, so a slug cannot become a hijack later when some future upload happens to mint that id.
139
+ * Ordinary hex-and-dash slugs (`abc-123-def`, `2026-09-07-launch-clip`) are unaffected — nothing but
140
+ * the exact 8-4-4-4-12 hex grouping matches.
141
+ */
142
+ const MEDIA_SLUG_UUID_SHAPE_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
143
+ /** Shared slug max-length rule (2026-09-07) — same bound as `post.ts`'s `MAX_SLUG_LENGTH`, reused
144
+ * rather than inventing a second number. `post.ts` only enforces this on its EXPLICIT/caller-
145
+ * supplied slug path (`resolveExplicitSlug`, reject-with-error); its own title-derived path is
146
+ * uncapped. Media applies the same bound to BOTH paths, but differently per path's nature: an
147
+ * explicit edit ({@link resolveSlugForUpdate}) rejects with an error, exactly like `post.ts`,
148
+ * because a human typed it and should see why it was refused; a derived slug
149
+ * ({@link deriveUniqueMediaSlug}) truncates instead of rejecting, because nothing is prompting a
150
+ * human for a shorter value — silently truncating an internally-derived value is the same
151
+ * "coerce, don't fail" convention `deriveTitleFromFilename`/`slugifyMediaTitle` already use. */
152
+ const MEDIA_MAX_SLUG_LENGTH = 120;
153
+ function isValidMediaSlugFormat(slug) {
154
+ return MEDIA_SLUG_FORMAT_PATTERN.test(slug) && !MEDIA_SLUG_UUID_SHAPE_PATTERN.test(slug);
155
+ }
156
+ /** Truncates a slug candidate to `maxLength`, stripping a trailing dash the cut can introduce (so a
157
+ * truncation never leaves a slug ending mid-word with a dangling "-"), falling back to `"untitled"`
158
+ * if nothing legible survives (only reachable when `maxLength` itself is tiny, e.g. while reserving
159
+ * room for a long numeric suffix — see {@link deriveUniqueMediaSlug}). A no-op when `candidate` is
160
+ * already within bounds. */
161
+ function capSlugCandidate(candidate, maxLength) {
162
+ if (candidate.length <= maxLength)
163
+ return candidate;
164
+ return candidate.slice(0, Math.max(maxLength, 0)).replace(/-+$/, "") || "untitled";
165
+ }
166
+ /** Turns free text into a slug candidate: lowercase, non-alphanumeric runs collapsed to one dash,
167
+ * leading/trailing dashes trimmed. Same algorithm as `post.ts`'s private `slugify` (duplicated, not
168
+ * imported — cross-repo: `post.ts` lives in Tovu, this file in `@jini-ai/cms`; this codebase's own
169
+ * precedent for a small hand-copied helper mirrored across a repo boundary is `DEFAULT_ALLOWED_MIME_TYPES`
170
+ * vs. Tovu's `FILE_HANDLER_ALLOWED_MIME_TYPES`/`IMPORTABLE_CONTENT_TYPES`). Never throws and never
171
+ * returns `undefined` — an all-punctuation input collapses to `""`, which every caller here treats
172
+ * as "derive nothing, fall back to a fixed default" rather than a malformed-input error. */
173
+ function slugifyMediaTitle(title) {
174
+ return title
175
+ .toLowerCase()
176
+ .trim()
177
+ .replace(/[^a-z0-9]+/g, "-")
178
+ .replace(/^-+|-+$/g, "");
179
+ }
180
+ /**
181
+ * Derives a unique-per-workspace slug from `title`, suffixing `-2`, `-3`, … on collision — the
182
+ * identical loop shape `post.ts`'s `createPost` uses for its own derived-slug path. Shared by
183
+ * {@link uploadMedia} (derive-on-create) and the backfill a host runs once for pre-existing rows
184
+ * with no slug yet (see Tovu's `development/scripts/backfill-media-slugs.ts`).
185
+ *
186
+ * `base` falls back to `"untitled"` when `title` slugifies to the empty string (all-punctuation or
187
+ * non-Latin titles that `slugifyMediaTitle` strips to nothing) — `uploadMedia`'s own title is never
188
+ * empty (`deriveTitleFromFilename` guarantees a non-empty string), but the backfill script
189
+ * (`development/scripts/backfill-media-slugs.ts`, Tovu) calls this against arbitrary pre-existing
190
+ * titles, so this fallback is load-bearing there, not just a defensive floor. Note this is the SAME
191
+ * fallback base every empty-slugifying title collapses onto, so two such titles in one workspace
192
+ * collide on `"untitled"` and are disambiguated by the ordinary suffix loop below exactly like any
193
+ * other collision — an empty derived slug is never inserted as a bare empty string (which a unique
194
+ * index would treat as one specific value, not "no value," and a SECOND empty string would then
195
+ * violate it outright rather than surfacing a friendly conflict).
196
+ *
197
+ * `base` (after the empty-string fallback) is also capped at {@link MEDIA_MAX_SLUG_LENGTH} via
198
+ * {@link capSlugCandidate} before any suffix is considered — a long machine-generated title must not
199
+ * produce an equally long slug. When a collision forces a suffix, the BASE (never the suffix itself)
200
+ * is re-truncated just enough to keep the whole `base-suffix` candidate within the cap, so every
201
+ * candidate this loop ever checks already obeys the length bound, not just the first one.
202
+ *
203
+ * @complexity O(n) repo round-trips in the worst case, where n is the number of prior collisions on
204
+ * the same base slug — bounded in practice by how many same-titled uploads exist in one workspace.
205
+ */
206
+ async function deriveUniqueMediaSlug(mediaRepo, workspaceId, title) {
207
+ const base = capSlugCandidate(slugifyMediaTitle(title) || "untitled", MEDIA_MAX_SLUG_LENGTH);
208
+ let slug = base;
209
+ let suffix = 1;
210
+ while (await mediaRepo.findBySlug({ workspaceId, slug })) {
211
+ suffix += 1;
212
+ const suffixText = `-${suffix}`;
213
+ const truncatedBase = capSlugCandidate(base, MEDIA_MAX_SLUG_LENGTH - suffixText.length);
214
+ slug = `${truncatedBase}${suffixText}`;
215
+ }
216
+ return slug;
217
+ }
111
218
  /**
112
219
  * Validates, hashes, dedups by `(workspaceId, sha256)`, and writes a new media
113
220
  * asset. Ordering (INV-1a): bytes are written (or found already
@@ -126,7 +233,8 @@ function deriveTitleFromFilename(filename) {
126
233
  *
127
234
  * @complexity O(1) — one hash, one blob lookup, at most one blob write, one
128
235
  * media write, one rendition write (the lock itself adds O(1) scheduling
129
- * overhead, not a scan).
236
+ * overhead, not a scan) — plus {@link deriveUniqueMediaSlug}'s own O(n) in the number of prior
237
+ * same-base-slug collisions (see that function's doc).
130
238
  * @overallScore 100
131
239
  */
132
240
  export async function uploadMedia(required, optional = {}) {
@@ -170,10 +278,13 @@ export async function uploadMedia(required, optional = {}) {
170
278
  });
171
279
  return written.storageKey;
172
280
  });
281
+ const title = deriveTitleFromFilename(input.filename);
282
+ const slug = await deriveUniqueMediaSlug(deps.mediaRepo, input.workspaceId, title);
173
283
  const media = {
174
284
  id: deps.idGen.newId(),
175
285
  workspaceId: input.workspaceId,
176
- title: deriveTitleFromFilename(input.filename),
286
+ title,
287
+ slug,
177
288
  alt: input.alt?.trim() ?? "",
178
289
  caption: input.caption?.trim() ?? "",
179
290
  credit: input.credit?.trim() ?? "",
@@ -187,6 +298,7 @@ export async function uploadMedia(required, optional = {}) {
187
298
  width: null,
188
299
  height: null,
189
300
  cssClass: null,
301
+ htmlAttributes: null,
190
302
  };
191
303
  await deps.mediaRepo.save(media);
192
304
  await deps.renditionRepo.save({
@@ -228,12 +340,45 @@ export async function getMediaById(required, _optional = {}) {
228
340
  return { media };
229
341
  }
230
342
  /**
231
- * Updates editorial-only fields (title/alt/caption/credit). `source.sha256` is
232
- * write-once — this function's input type has no `sha256` field,
343
+ * Resolves a media asset by either its id or its slug — ID FIRST, slug second. The slug is the
344
+ * handle a human typed into an embed marker or a hand-authored `<img>`/`<video>` tag; the id is the
345
+ * opaque UUID every existing reference already uses, and every URL a host's renderer emits.
346
+ *
347
+ * THE ORDER IS A SECURITY PROPERTY, not a preference (2026-09-07). This resolved slug-first, on the
348
+ * documented assumption that "an id never collides with a slug in practice since slugs pass through
349
+ * {@link isValidMediaSlugFormat}". That assumption was false: a lowercase UUID matched the old slug
350
+ * pattern `[a-z0-9-]+` exactly, so setting asset B's slug to asset A's id made every `/m/{A.id}/…`
351
+ * URL — the ones a renderer emitted for A, already live in published pages — resolve to B instead.
352
+ * An id is minted by the system and is never a value a human chooses, so it must always win; the
353
+ * write path additionally refuses UUID-shaped slugs now (see
354
+ * {@link MEDIA_SLUG_UUID_SHAPE_PATTERN}), but ordering is what protects rows written before that
355
+ * rule existed. Id-first costs nothing on the slug path: a real slug simply misses the id lookup and
356
+ * falls through.
357
+ *
358
+ * Never throws (unlike {@link getMediaById}): every call site that needs this (an embed resolver, a
359
+ * public rendition route) already has its own REQ-27-style non-throwing-miss contract, so this
360
+ * returns `null` on failure and lets the caller apply its own not-found handling rather than forcing
361
+ * one shape on every caller.
362
+ *
363
+ * @complexity O(1) — at most two indexed repo lookups, short-circuited on the first hit.
364
+ */
365
+ export async function findMediaByIdOrSlug(required, _optional = {}) {
366
+ const { deps, input } = required;
367
+ const byId = await deps.mediaRepo.findById({ workspaceId: input.workspaceId, id: input.idOrSlug });
368
+ if (byId)
369
+ return byId;
370
+ return deps.mediaRepo.findBySlug({ workspaceId: input.workspaceId, slug: input.idOrSlug });
371
+ }
372
+ /**
373
+ * Updates editorial-only fields (title/alt/caption/credit/slug/width/height/cssClass).
374
+ * `source.sha256` is write-once — this function's input type has no `sha256` field,
233
375
  * so there is no code path here that can touch it (see `resolveWriteOnceSource`
234
376
  * doc for the directly-tested invariant this relies on).
235
377
  *
236
- * @complexity O(1).
378
+ * `slug` (2026-09-07) is validated and uniqueness-checked by {@link resolveSlugForUpdate} when
379
+ * provided; every other field keeps its pre-existing undefined-means-unchanged contract.
380
+ *
381
+ * @complexity O(1) plus {@link resolveSlugForUpdate}'s own O(1) when `input.slug` is provided.
237
382
  * @overallScore 100
238
383
  */
239
384
  /** Validates a `width`/`height` override: must be a positive integer. `null` (explicit clear) and
@@ -243,6 +388,54 @@ function assertPositiveIntegerOrThrow(value, field) {
243
388
  throw new MediaValidationError(`media.${field} must be a positive integer, got ${value}`);
244
389
  }
245
390
  }
391
+ /**
392
+ * Validates and normalizes an explicit `slug` edit, then enforces per-workspace uniqueness against
393
+ * every OTHER row — an app-level courtesy check, not the enforcement itself (see `MediaRecord.slug`'s
394
+ * doc): the host's DB unique index is what actually prevents two rows from landing on the same slug
395
+ * under a concurrent write; this check only exists so a normal, non-racing caller sees a clear
396
+ * `MediaConflictError` naming the conflict instead of a raw constraint-violation message surfacing
397
+ * from whatever the host's repo adapter throws. Mirrors `post.ts`'s `assertSlugAvailableForUpdate`
398
+ * (same "claiming your own current slug is not a conflict" rule).
399
+ *
400
+ * @complexity O(1) — one format check, one uniqueness lookup.
401
+ */
402
+ async function resolveSlugForUpdate(mediaRepo, workspaceId, id, rawSlug) {
403
+ const slug = rawSlug.trim().toLowerCase();
404
+ if (!slug || !isValidMediaSlugFormat(slug)) {
405
+ throw new MediaValidationError("slug must use lowercase letters, numbers, and dashes, and must not be shaped like a UUID");
406
+ }
407
+ // Same bound and rejection style as `post.ts`'s `resolveExplicitSlug` — a human typed this value,
408
+ // so it is refused with a clear reason rather than silently truncated (unlike the derived-on-
409
+ // upload path, see `MEDIA_MAX_SLUG_LENGTH`'s doc).
410
+ if (slug.length > MEDIA_MAX_SLUG_LENGTH) {
411
+ throw new MediaValidationError(`slug must be ${MEDIA_MAX_SLUG_LENGTH} characters or fewer`);
412
+ }
413
+ const duplicate = await mediaRepo.findBySlug({ workspaceId, slug });
414
+ if (duplicate && duplicate.id !== id) {
415
+ throw new MediaConflictError(`slug '${slug}' is already used by media '${duplicate.id}'`);
416
+ }
417
+ return slug;
418
+ }
419
+ /**
420
+ * Validates an explicit `htmlAttributes` edit against `html-attributes.ts`'s allowlist — a stored-
421
+ * XSS boundary, not a syntax convenience (see `MediaRecord.htmlAttributes`'s own doc). Throws
422
+ * `MediaValidationError` naming the exact rejected attribute the moment `parseMediaHtmlAttributes`
423
+ * reports one; the caller (`updateMediaMetadata`) must never reach its own `save()` call when this
424
+ * throws, so an invalid value is never partially or fully persisted. A value that validates but
425
+ * trims to empty stores as `null`, matching `cssClass`'s identical "empty means unset" convention.
426
+ *
427
+ * @complexity O(n) in the input string's length (one `parseMediaHtmlAttributes` pass).
428
+ */
429
+ function resolveHtmlAttributesForUpdate(rawValue) {
430
+ const trimmed = rawValue.trim();
431
+ if (trimmed === "")
432
+ return null;
433
+ const parsed = parseMediaHtmlAttributes(trimmed);
434
+ if (parsed.error) {
435
+ throw new MediaValidationError(`media.htmlAttributes: ${describeMediaHtmlAttributeError(parsed.error)}`);
436
+ }
437
+ return trimmed;
438
+ }
246
439
  export async function updateMediaMetadata(required, _optional = {}) {
247
440
  const { deps, input } = required;
248
441
  const existing = await deps.mediaRepo.findById({ workspaceId: input.workspaceId, id: input.id });
@@ -252,15 +445,29 @@ export async function updateMediaMetadata(required, _optional = {}) {
252
445
  assertPositiveIntegerOrThrow(input.width, "width");
253
446
  if (input.height !== undefined && input.height !== null)
254
447
  assertPositiveIntegerOrThrow(input.height, "height");
448
+ const slug = input.slug !== undefined
449
+ ? await resolveSlugForUpdate(deps.mediaRepo, input.workspaceId, input.id, input.slug)
450
+ : existing.slug;
451
+ // Validated BEFORE the record is built (same "fail before any write" discipline `assertPositive
452
+ // IntegerOrThrow` above already follows) — an invalid value must never reach `save()`.
453
+ const htmlAttributes = input.htmlAttributes !== undefined
454
+ ? input.htmlAttributes === null
455
+ ? null
456
+ : resolveHtmlAttributesForUpdate(input.htmlAttributes)
457
+ : existing.htmlAttributes;
255
458
  const media = {
256
459
  ...existing,
460
+ // `title` and `slug` are deliberately independent (see `MediaRecord.slug`'s doc): renaming the
461
+ // title never recomputes `slug`, and editing `slug` never touches `title`.
257
462
  title: input.title !== undefined ? input.title.trim() || existing.title : existing.title,
463
+ slug,
258
464
  alt: input.alt !== undefined ? input.alt.trim() : existing.alt,
259
465
  caption: input.caption !== undefined ? input.caption.trim() : existing.caption,
260
466
  credit: input.credit !== undefined ? input.credit.trim() : existing.credit,
261
467
  width: input.width !== undefined ? input.width : existing.width,
262
468
  height: input.height !== undefined ? input.height : existing.height,
263
469
  cssClass: input.cssClass !== undefined ? (input.cssClass === null ? null : input.cssClass.trim() || null) : existing.cssClass,
470
+ htmlAttributes,
264
471
  updatedAt: deps.clock.nowIso(),
265
472
  version: existing.version + 1,
266
473
  };
@@ -333,13 +540,53 @@ export async function purgeMedia(required, _optional = {}) {
333
540
  `where-used index, which is not implemented — see purgeMedia's doc comment)`,
334
541
  ]);
335
542
  }
543
+ await removeMediaRowsAndTombstoneBlob(deps, {
544
+ workspaceId: input.workspaceId,
545
+ id: input.id,
546
+ sha256: existing.source.sha256,
547
+ });
548
+ return { purged: true };
549
+ }
550
+ /**
551
+ * Shared row/blob cleanup: removes an asset's renditions and media row, then tombstones its blob
552
+ * if-and-only-if no other active media row in the workspace still references the same sha256 (the
553
+ * same predicate {@link tombstoneBlobIfUnreferenced} always applies). Used by both `purgeMedia`
554
+ * (after its trash guard passes) and {@link rollbackUploadedMedia} (an unconditional internal
555
+ * compensating rollback) — the same three-step deletion, triggered from two different callers.
556
+ *
557
+ * @complexity O(n) in the workspace's media row count, inherited from the tombstone-pass's
558
+ * `isBlobUnreferenced` scan.
559
+ */
560
+ async function removeMediaRowsAndTombstoneBlob(deps, input) {
336
561
  await deps.renditionRepo.removeByAsset({ workspaceId: input.workspaceId, assetId: input.id });
337
562
  await deps.mediaRepo.remove({ workspaceId: input.workspaceId, id: input.id });
338
563
  const clock = deps.clock ?? { nowIso: () => new Date().toISOString() };
339
564
  await tombstoneBlobIfUnreferenced({
340
565
  deps: { mediaRepo: deps.mediaRepo, blobRepo: deps.blobRepo, clock },
341
- input: { workspaceId: input.workspaceId, sha256: existing.source.sha256 },
566
+ input: { workspaceId: input.workspaceId, sha256: input.sha256 },
567
+ });
568
+ }
569
+ /**
570
+ * Compensating rollback for {@link uploadMedia}: removes the rendition + media rows it just wrote
571
+ * and tombstones the blob if no other active media row in the workspace still references its
572
+ * sha256 (delegates to {@link removeMediaRowsAndTombstoneBlob}, `purgeMedia`'s own cleanup step).
573
+ *
574
+ * For a caller-side step that runs AFTER `uploadMedia()` has already committed and then fails
575
+ * (e.g. `tool-registrations.ts`'s optional `recordUploadContentType` hook) — without this, the
576
+ * rows `uploadMedia()` wrote survive as orphans (bytes and/or rows nothing points at) even though
577
+ * the caller sees the whole upload as failed. Unlike `purgeMedia`, this performs no trashed-status
578
+ * guard: it is an internal compensating action for a partially-failed operation, not a user-facing
579
+ * delete.
580
+ *
581
+ * @complexity O(n) in the workspace's media row count, inherited from
582
+ * {@link removeMediaRowsAndTombstoneBlob}.
583
+ */
584
+ export async function rollbackUploadedMedia(required, _optional = {}) {
585
+ const { deps, input } = required;
586
+ await removeMediaRowsAndTombstoneBlob(deps, {
587
+ workspaceId: input.workspaceId,
588
+ id: input.media.id,
589
+ sha256: input.media.source.sha256,
342
590
  });
343
- return { purged: true };
344
591
  }
345
592
  //# sourceMappingURL=media-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"media-service.js","sourceRoot":"","sources":["../../src/media/media-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media-service.js","sourceRoot":"","sources":["../../src/media/media-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GAIrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEjG,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,oBAAoB,GACrB,CAAC;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS;AAEnE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IACrE,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAwE,EACxE,YAAmC,EAAE;IAErC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC;IAC/C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QACpD,MAAM,IAAI,yBAAyB,CACjC,+CAA+C,QAAQ,CAAC,MAAM,SAAS,eAAe,GAAG,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC;AACnC,CAAC;AAED;;;uGAGuG;AACvG,MAAM,yBAAyB,GAAG,cAAc,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,6BAA6B,GAAG,gEAAgE,CAAC;AAEvG;;;;;;;;iGAQiG;AACjG,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,SAAS,sBAAsB,CAAC,IAAY;IAC1C,OAAO,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3F,CAAC;AAED;;;;6BAI6B;AAC7B,SAAS,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IAC5D,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;AACrF,CAAC;AAED;;;;;;6FAM6F;AAC7F,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,WAAW,EAAE;SACb,IAAI,EAAE;SACN,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,KAAK,UAAU,qBAAqB,CAAC,SAAwB,EAAE,WAAiB,EAAE,KAAa;IAC7F,MAAM,IAAI,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAC7F,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,CAAC,CAAC;QACZ,MAAM,UAAU,GAAG,IAAI,MAAM,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACxF,IAAI,GAAG,GAAG,aAAa,GAAG,UAAU,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAqCD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAA6B,EAC7B,WAAgC,EAAE;IAElC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,IAAI,wBAAwB,CAAC;IAC3E,MAAM,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IAEjF,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,oBAAoB,CAC5B,iBAAiB,KAAK,CAAC,WAAW,6BAA6B,CAChE,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAC5B,6BAA6B,cAAc,gBAAgB,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAEnC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAChG,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACzC,qEAAqE;gBACrE,oDAAoD;gBACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO,YAAY,CAAC,UAAU,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACvB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,QAAQ;YAChB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,uBAAuB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEnF,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK;QACL,IAAI;QACJ,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;QAClC,MAAM,EAAE,sBAAsB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAChF,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC;QACV,2FAA2F;QAC3F,4FAA4F;QAC5F,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,IAAI;KACrB,CAAC;IACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAC5B,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,aAAa,EAAE,UAAU;QACzB,OAAO,EAAE,CAAC;QACV,UAAU;QACV,SAAS,EAAE,MAAM;KAClB,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAWD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAA2B,EAC3B,YAAmC,EAAE;IAErC,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAOD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA8B,EAC9B,YAAmC,EAAE;IAErC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IACxE,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAOD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAqC,EACrC,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnG,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC7F,CAAC;AAwDD;;;;;;;;;;;GAWG;AACH;+FAC+F;AAC/F,SAAS,4BAA4B,CAAC,KAAa,EAAE,KAAyB;IAC5E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,oBAAoB,CAAC,SAAS,KAAK,oCAAoC,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,oBAAoB,CAAC,SAAwB,EAAE,WAAiB,EAAE,EAAQ,EAAE,OAAe;IACxG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,oBAAoB,CAC5B,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,kGAAkG;IAClG,8FAA8F;IAC9F,mDAAmD;IACnD,IAAI,IAAI,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QACxC,MAAM,IAAI,oBAAoB,CAAC,gBAAgB,qBAAqB,sBAAsB,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,IAAI,SAAS,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,kBAAkB,CAAC,SAAS,IAAI,+BAA+B,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,8BAA8B,CAAC,QAAgB;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,oBAAoB,CAAC,yBAAyB,+BAA+B,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAqC,EACrC,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,UAAU,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAEjF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI;QAAE,4BAA4B,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1G,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,4BAA4B,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9G,MAAM,IAAI,GACR,KAAK,CAAC,IAAI,KAAK,SAAS;QACtB,CAAC,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;QACrF,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;IACpB,gGAAgG;IAChG,uFAAuF;IACvF,MAAM,cAAc,GAClB,KAAK,CAAC,cAAc,KAAK,SAAS;QAChC,CAAC,CAAC,KAAK,CAAC,cAAc,KAAK,IAAI;YAC7B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,8BAA8B,CAAC,KAAK,CAAC,cAAc,CAAC;QACxD,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;IAE9B,MAAM,KAAK,GAAgB;QACzB,GAAG,QAAQ;QACX,+FAA+F;QAC/F,2EAA2E;QAC3E,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;QACxF,IAAI;QACJ,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG;QAC9D,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;QAC9E,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;QAC1E,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK;QAC/D,MAAM,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM;QACnE,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;QAC7H,cAAc;QACd,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QAC9B,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;KAC9B,CAAC;IACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAgBD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA4B,EAC5B,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,UAAU,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACjF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAE9D,MAAM,KAAK,GAAgB;QACzB,GAAG,QAAQ;QACX,MAAM,EAAE,SAAwB;QAChC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;QAC9B,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC;KAC9B,CAAC;IACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA4B,EAC5B,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,kBAAkB,CAAC,UAAU,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAEjF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,yBAAyB,CACjC,UAAU,KAAK,CAAC,EAAE,2CAA2C,EAC7D;YACE,UAAU,KAAK,CAAC,EAAE,sDAAsD;gBACtE,4EAA4E;SAC/E,CACF,CAAC;IACJ,CAAC;IAED,MAAM,+BAA+B,CAAC,IAAI,EAAE;QAC1C,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC;AAaD;;;;;;;;;GASG;AACH,KAAK,UAAU,+BAA+B,CAC5C,IAAyB,EACzB,KAAsD;IAEtD,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAE9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IACvE,MAAM,2BAA2B,CAAC;QAChC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE;QACnE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;KAChE,CAAC,CAAC;AACL,CAAC;AAOD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAuC,EACvC,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IACjC,MAAM,+BAA+B,CAAC,IAAI,EAAE;QAC1C,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;QAClB,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM;KAClC,CAAC,CAAC;AACL,CAAC"}
@@ -31,11 +31,18 @@ export interface MediaRepoPort {
31
31
  workspaceId: UUID;
32
32
  id: UUID;
33
33
  }): Promise<MediaRecord | null>;
34
+ /** Second lookup key (2026-09-07) — `MediaRecord.slug`'s own doc has the full identity-model
35
+ * rationale. Mirrors `AssetBlobRepoPort.findByHash`'s shape: one indexed field, one row or `null`. */
36
+ findBySlug(required: {
37
+ workspaceId: UUID;
38
+ slug: string;
39
+ }): Promise<MediaRecord | null>;
34
40
  list(required: {
35
41
  workspaceId: UUID;
36
42
  }): Promise<MediaRecord[]>;
37
43
  save(record: MediaRecord): Promise<void>;
38
- /** Hard delete — only ever called by `purgeMedia` after the trash guard passes. */
44
+ /** Hard delete — called by `purgeMedia` after the trash guard passes, and by
45
+ * `rollbackUploadedMedia` as an unconditional compensating rollback for a failed upload. */
39
46
  remove(required: {
40
47
  workspaceId: UUID;
41
48
  id: UUID;
@@ -1 +1 @@
1
- {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/media/ports.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/media/ports.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,13 @@ export interface ResolveMediaRenditionDeps {
13
13
  }
14
14
  export interface ResolveMediaRenditionInput {
15
15
  workspaceId: UUID;
16
- assetId: UUID;
16
+ /** The `{assetId}` path segment, verbatim — despite the name, this may be either the asset's real
17
+ * `id` (a UUID) OR its `slug` (2026-09-07: `resolveMediaRendition` now resolves either via
18
+ * `findMediaByIdOrSlug`, so a hand-authored `<img src="/m/{slug}/...">` resolves the same asset a
19
+ * UUID-based one always has). Every rendition-table operation inside this function uses the
20
+ * RESOLVED record's own `media.id`, never this raw field, once the lookup succeeds — see that
21
+ * local rebinding's own comment for why that distinction matters. */
22
+ assetId: string;
17
23
  /** The `{transformName}` path segment — cosmetic slug/ext are stripped by the caller (route). */
18
24
  transformName: string;
19
25
  /** The `{version}` parsed out of the `.v{version}` path segment. */
@@ -1 +1 @@
1
- {"version":3,"file":"rendition-service.d.ts","sourceRoot":"","sources":["../../src/media/rendition-service.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,aAAa,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAKvI,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,aAAa,EAAE,sBAAsB,CAAC;IACtC,aAAa,EAAE,2BAA2B,CAAC;IAC3C,SAAS,EAAE,aAAa,CAAC;IACzB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,IAAI,CAAC;IAClB,OAAO,EAAE,IAAI,CAAC;IACd,iGAAiG;IACjG,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,yBAAyB,CAAC;IAChC,KAAK,EAAE,0BAA0B,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GACnC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACnB;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,6BAA6B,EACvC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAkFtC"}
1
+ {"version":3,"file":"rendition-service.d.ts","sourceRoot":"","sources":["../../src/media/rendition-service.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,aAAa,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAMvI,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,aAAa,EAAE,sBAAsB,CAAC;IACtC,aAAa,EAAE,2BAA2B,CAAC;IAC3C,SAAS,EAAE,aAAa,CAAC;IACzB,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,IAAI,CAAC;IAClB;;;;;0EAKsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,aAAa,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,yBAAyB,CAAC;IAChC,KAAK,EAAE,0BAA0B,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,2BAA2B,GACnC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GACnB;IAAE,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,6BAA6B,EACvC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC,2BAA2B,CAAC,CAuFtC"}
@@ -29,6 +29,7 @@
29
29
  * - The real `entry_refs` "referenced by published content" check.
30
30
  */
31
31
  import { createHash } from "node:crypto";
32
+ import { findMediaByIdOrSlug } from "./media-service.js";
32
33
  import { mimeForTransformFormat } from "./transform-types.js";
33
34
  import { isLatestTransformVersion, isReferencedByPublishedContent } from "./transform-registry.js";
34
35
  import { withRenditionLock } from "./transform-lock.js";
@@ -56,11 +57,16 @@ import { withRenditionLock } from "./transform-lock.js";
56
57
  */
57
58
  export async function resolveMediaRendition(required, _optional = {}) {
58
59
  const { deps, input } = required;
59
- const media = await deps.mediaRepo.findById({ workspaceId: input.workspaceId, id: input.assetId });
60
+ const media = await findMediaByIdOrSlug({ deps: { mediaRepo: deps.mediaRepo }, input: { workspaceId: input.workspaceId, idOrSlug: input.assetId } });
60
61
  if (!media)
61
62
  return { outcome: "not-found" };
62
63
  if (media.status === "trashed")
63
64
  return { outcome: "gone" };
65
+ // From here on, every `asset_renditions`/blob operation keys on the RESOLVED record's own `id` —
66
+ // never the raw `input.assetId`, which may have been a slug. `asset_renditions.assetId` is a FK to
67
+ // `media.id`; keying it on the slug text instead would both miss every rendition already stored
68
+ // under the real id and, on the generation path below, write a second, slug-keyed row alongside it.
69
+ const assetId = media.id;
64
70
  const definition = await deps.transformRepo.findByNameVersion({
65
71
  workspaceId: input.workspaceId,
66
72
  name: input.transformName,
@@ -70,7 +76,7 @@ export async function resolveMediaRendition(required, _optional = {}) {
70
76
  return { outcome: "not-found" };
71
77
  const existing = await deps.renditionRepo.findOne({
72
78
  workspaceId: input.workspaceId,
73
- assetId: input.assetId,
79
+ assetId,
74
80
  transformName: input.transformName,
75
81
  version: input.version,
76
82
  });
@@ -100,7 +106,7 @@ export async function resolveMediaRendition(required, _optional = {}) {
100
106
  // `imageTransformer.transform` a second time.
101
107
  const racedExisting = await deps.renditionRepo.findOne({
102
108
  workspaceId: input.workspaceId,
103
- assetId: input.assetId,
109
+ assetId,
104
110
  transformName: input.transformName,
105
111
  version: input.version,
106
112
  });
@@ -120,7 +126,7 @@ export async function resolveMediaRendition(required, _optional = {}) {
120
126
  const row = {
121
127
  id: deps.idGen.newId(),
122
128
  workspaceId: input.workspaceId,
123
- assetId: input.assetId,
129
+ assetId,
124
130
  transformName: input.transformName,
125
131
  version: input.version,
126
132
  storageKey,
@@ -1 +1 @@
1
- {"version":3,"file":"rendition-service.js","sourceRoot":"","sources":["../../src/media/rendition-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rendition-service.js","sourceRoot":"","sources":["../../src/media/rendition-service.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,10 @@ export declare class InMemoryMediaRepo implements MediaRepoPort {
20
20
  workspaceId: UUID;
21
21
  id: UUID;
22
22
  }): Promise<MediaRecord | null>;
23
+ findBySlug(required: {
24
+ workspaceId: UUID;
25
+ slug: string;
26
+ }): Promise<MediaRecord | null>;
23
27
  list(required: {
24
28
  workspaceId: UUID;
25
29
  }): Promise<MediaRecord[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/media/repo.memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/media/repo.memory.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,9 @@ export class InMemoryMediaRepo {
6
6
  async findById(required) {
7
7
  return (this.rows.find((row) => row.workspaceId === required.workspaceId && row.id === required.id) ?? null);
8
8
  }
9
+ async findBySlug(required) {
10
+ return (this.rows.find((row) => row.workspaceId === required.workspaceId && row.slug === required.slug) ?? null);
11
+ }
9
12
  async list(required) {
10
13
  return this.rows.filter((row) => row.workspaceId === required.workspaceId);
11
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/media/repo.memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/media/repo.memory.ts"],"names":[],"mappings":"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"}
@@ -81,8 +81,12 @@ export interface MediaToolDeps {
81
81
  * Any rejection from this hook propagates out of the `media_upload_asset` handler uncaught — a
82
82
  * failure to record the type is a real failure, not swallowed to report a false success (mirrors
83
83
  * `resolveCredentialForProvider`'s "never silently fall through" discipline elsewhere in this
84
- * package's siblings). Omitted entirely: never called, matching this field's own pre-fix absence
85
- * for every host that has not opted in yet — the exact `resolvePublicUrls`-precedent contract.
84
+ * package's siblings). Before rethrowing, the handler calls `rollbackUploadedMedia`
85
+ * (`media-service.ts`) to remove the rendition + media rows `uploadMedia()` just wrote (and
86
+ * tombstone the blob if unreferenced) — the fix for the sibling defect where those rows survived
87
+ * as orphans even though the caller saw the upload as failed. Omitted entirely: never called,
88
+ * matching this field's own pre-fix absence for every host that has not opted in yet — the exact
89
+ * `resolvePublicUrls`-precedent contract.
86
90
  */
87
91
  recordUploadContentType?: (params: {
88
92
  media: MediaRecord;