@aotter/mantle-runtime 0.0.11-alpha.14 → 0.0.11-alpha.16

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 (66) hide show
  1. package/dist/domain/model/TemplateRegistry.d.ts +3 -0
  2. package/dist/domain/model/TemplateRegistry.d.ts.map +1 -1
  3. package/dist/domain/model/TemplateRegistry.js.map +1 -1
  4. package/dist/domain/port/MediaStorage.d.ts +41 -0
  5. package/dist/domain/port/MediaStorage.d.ts.map +1 -1
  6. package/dist/domain/port/MediaStorage.js.map +1 -1
  7. package/dist/domain/service/HtmlRenderer.d.ts +3 -0
  8. package/dist/domain/service/HtmlRenderer.d.ts.map +1 -1
  9. package/dist/domain/service/HtmlRenderer.js +7 -1
  10. package/dist/domain/service/HtmlRenderer.js.map +1 -1
  11. package/dist/domain/service/McpToolNaming.d.ts +19 -0
  12. package/dist/domain/service/McpToolNaming.d.ts.map +1 -1
  13. package/dist/domain/service/McpToolNaming.js +33 -0
  14. package/dist/domain/service/McpToolNaming.js.map +1 -1
  15. package/dist/domain/service/io/MediaAssetReferences.d.ts +13 -0
  16. package/dist/domain/service/io/MediaAssetReferences.d.ts.map +1 -0
  17. package/dist/domain/service/io/MediaAssetReferences.js +48 -0
  18. package/dist/domain/service/io/MediaAssetReferences.js.map +1 -0
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +20 -7
  23. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
  24. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +89 -0
  25. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -1
  26. package/dist/infrastructure/mcp/McpToolCatalog.d.ts +7 -1
  27. package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -1
  28. package/dist/infrastructure/mcp/McpToolCatalog.js +83 -11
  29. package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
  30. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +3 -1
  31. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -1
  32. package/dist/infrastructure/render/HtmlPublishOrchestrator.js +8 -2
  33. package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -1
  34. package/dist/runtime.d.ts +2 -1
  35. package/dist/runtime.d.ts.map +1 -1
  36. package/dist/runtime.js +7 -6
  37. package/dist/runtime.js.map +1 -1
  38. package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
  39. package/dist/usecase/boot/ValidateBootUseCase.js +48 -8
  40. package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
  41. package/dist/usecase/dto/media/index.d.ts +11 -0
  42. package/dist/usecase/dto/media/index.d.ts.map +1 -1
  43. package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -1
  44. package/dist/usecase/media/CreateMediaUploadUseCase.js +39 -21
  45. package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -1
  46. package/dist/usecase/media/UploadMediaVariantUseCase.d.ts +35 -0
  47. package/dist/usecase/media/UploadMediaVariantUseCase.d.ts.map +1 -0
  48. package/dist/usecase/media/UploadMediaVariantUseCase.js +75 -0
  49. package/dist/usecase/media/UploadMediaVariantUseCase.js.map +1 -0
  50. package/dist/usecase/media/index.d.ts +1 -0
  51. package/dist/usecase/media/index.d.ts.map +1 -1
  52. package/dist/usecase/media/index.js +1 -0
  53. package/dist/usecase/media/index.js.map +1 -1
  54. package/dist/usecase/render/PreviewEntryUseCase.d.ts +3 -1
  55. package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -1
  56. package/dist/usecase/render/PreviewEntryUseCase.js +6 -1
  57. package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -1
  58. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +3 -1
  59. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -1
  60. package/dist/usecase/render/RenderEntryLiveUseCase.js +6 -1
  61. package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -1
  62. package/dist/usecase/render/RenderListLiveUseCase.d.ts +3 -1
  63. package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -1
  64. package/dist/usecase/render/RenderListLiveUseCase.js +6 -1
  65. package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -1
  66. package/package.json +4 -4
@@ -1,4 +1,4 @@
1
- import { DiagnosticError } from "@aotter/mantle-spec";
1
+ import { DiagnosticError, expandPolicyRequired, } from "@aotter/mantle-spec";
2
2
  import { mediaMimeRejectedDiagnostic, mediaPurposeRejectedDiagnostic, mediaSvgRejectedDiagnostic, mediaVariantSizeExceededDiagnostic, mediaVariantsIncompleteDiagnostic, mediaVariantsSuspiciousSizeDiagnostic, } from "./diagnostics.js";
3
3
  import { MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, isAllowedMime, } from "./mediaAllowlist.js";
4
4
  /**
@@ -92,37 +92,55 @@ export class CreateMediaUploadUseCase {
92
92
  };
93
93
  }
94
94
  assertVariantsCoverPolicy(opPath, request, policy) {
95
+ // Expand the `<input accept>`-style grammar (#282) into per-slot
96
+ // acceptable mime sets. The policy validator already rejected
97
+ // overlapping mime sets across slots + empty slots, so variant→slot
98
+ // mapping here is unambiguous: each supplied mime appears in
99
+ // exactly one slot. Role (primary vs alternate) stays free per
100
+ // variant — the agent picks which mime is primary, constrained
101
+ // only by the exactly-one-primary rule below.
102
+ const slots = expandPolicyRequired(policy.required);
103
+ const expandedSet = new Set();
104
+ const mimeToSlot = new Map();
105
+ slots.forEach((mimes, slotIdx) => {
106
+ for (const m of mimes) {
107
+ expandedSet.add(m);
108
+ mimeToSlot.set(m, slotIdx);
109
+ }
110
+ });
95
111
  const supplied = request.variants.map((v) => v.mimeType);
96
- const missing = policy.required.filter((m) => !supplied.includes(m));
97
- if (missing.length > 0) {
112
+ // Closed set: any supplied mime outside the expanded acceptable
113
+ // set has no maxBytes coverage and no slot assignment. Reject.
114
+ const extras = request.variants.filter((v) => !expandedSet.has(v.mimeType));
115
+ if (extras.length > 0) {
98
116
  throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
99
117
  }
100
- // Closed set: the policy declares which mimes belong to this
101
- // purpose. Extras (e.g. an `image/png` alongside the declared
102
- // avif/webp/jpeg trio) would land without a per-mime byte cap
103
- // and bypass the size gate entirely. Reject any supplied mime
104
- // outside `policy.required`.
105
- const allowed = new Set(policy.required);
106
- const extras = request.variants.filter((v) => !allowed.has(v.mimeType));
107
- if (extras.length > 0) {
118
+ // Exactly one variant per slot — covers "missing slot" and
119
+ // "two variants for the same slot" (e.g. an extra `image/jpeg`
120
+ // when slot 0 = `image/jpg,image/png`: both jpg and png supplied
121
+ // would fill slot 0 twice and leave the png slot unfilled if you
122
+ // count by mime-set).
123
+ const filledSlots = new Set();
124
+ for (const v of request.variants) {
125
+ const slotIdx = mimeToSlot.get(v.mimeType); // safe: extras rejected above
126
+ if (filledSlots.has(slotIdx)) {
127
+ throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
128
+ }
129
+ filledSlots.add(slotIdx);
130
+ }
131
+ if (filledSlots.size !== slots.length) {
108
132
  throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
109
133
  }
110
134
  // Exactly one primary. Storage key layout is `<group>/<role>.<ext>`,
111
135
  // so two primaries collide on the same R2 key + ambiguate which
112
- // variant `<img>` falls back to. Same for any duplicated (mime, role)
113
- // pair — two `image/jpeg` alternates would also collide on key.
136
+ // variant `<img>` falls back to. Two alternates with different
137
+ // mimes don't collide (different ext); two alternates with the
138
+ // same mime are impossible here because the mime-to-slot mapping
139
+ // would have caught the duplicate above.
114
140
  const primaries = request.variants.filter((v) => v.role === "primary");
115
141
  if (primaries.length !== 1) {
116
142
  throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
117
143
  }
118
- const seen = new Set();
119
- for (const v of request.variants) {
120
- const key = `${v.mimeType}/${v.role}`;
121
- if (seen.has(key)) {
122
- throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
123
- }
124
- seen.add(key);
125
- }
126
144
  }
127
145
  /** Enforce per-mime byte caps from the purpose policy BEFORE the
128
146
  * adapter signs presigned PUT URLs. Mantle docs / ADR-0017
@@ -1 +1 @@
1
- {"version":3,"file":"CreateMediaUploadUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/CreateMediaUploadUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA2B,MAAM,qBAAqB,CAAC;AAc/E,OAAO,EACL,2BAA2B,EAC3B,8BAA8B,EAC9B,0BAA0B,EAC1B,kCAAkC,EAClC,iCAAiC,EACjC,qCAAqC,GACtC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAM7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,wBAAwB;IAEhB;IACA;IACA;IACA;IACA;IACA;IANnB,YACmB,OAAqB,EACrB,EAAW,EACX,KAAY,EACZ,KAAkB,EAClB,UAAgC,EAChC,OAAuC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAL1D,YAAO,GAAP,OAAO,CAAc;QACrB,OAAE,GAAF,EAAE,CAAS;QACX,UAAK,GAAL,KAAK,CAAO;QACZ,UAAK,GAAL,KAAK,CAAa;QAClB,eAAU,GAAV,UAAU,CAAsB;QAChC,SAAI,GAAJ,IAAI,CAAsD;IAC1E,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAAiC;QAC7C,MAAM,MAAM,GAAG,2BAA2B,CAAC;QAE3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC3D,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CACvB,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CACvE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,GAAG,sBAAsB,GAAG,IAAI,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAExC,MAAM,YAAY,GAA2C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxF,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,gBAAgB;YAChE,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,aAAa;YACb,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,YAAY;YACtB,GAAG;YACH,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,eAAe,GAA2B,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnF,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,YAAY,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,QAAQ;YACvC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAE,CAAC,QAAQ;SACpC,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAwB;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,eAAe;YACzB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,GAAG;SACf,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACf,GAAG,wBAAwB,GAAG,MAAM,CAAC,aAAa,EAAE,EACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EACtB,EAAE,aAAa,EAAE,6BAA6B,EAAE,CACjD,CAAC;QAEF,OAAO;YACL,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC9C,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,eAAe,EAAE,GAAG,CAAC,eAAe;aACrC,CAAC,CAAC;YACH,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAEO,yBAAyB,CAC/B,MAAc,EACd,OAAiC,EACjC,MAA0B;QAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CACvB,iCAAiC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAClF,CAAC;QACJ,CAAC;QACD,6DAA6D;QAC7D,8DAA8D;QAC9D,8DAA8D;QAC9D,8DAA8D;QAC9D,6BAA6B;QAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CACvB,iCAAiC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAClF,CAAC;QACJ,CAAC;QACD,qEAAqE;QACrE,gEAAgE;QAChE,sEAAsE;QACtE,gEAAgE;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACvE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,eAAe,CACvB,iCAAiC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAClF,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,eAAe,CACvB,iCAAiC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAClF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;;;;;;;;wCASoC;IAC5B,0BAA0B,CAChC,MAAc,EACd,OAAiC,EACjC,MAA0B;QAE1B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,eAAe,CACvB,kCAAkC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CACtE,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACxC,uDAAuD;YACvD,yDAAyD;YACzD,mCAAmC;YACnC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,eAAe,CACvB,kCAAkC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CACtE,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;gBACrB,MAAM,IAAI,eAAe,CACvB,kCAAkC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CACxE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,yBAAyB,CAC/B,MAAc,EACd,OAAiC;QAEjC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,QAAQ,KAAK,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACzD,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAEO,wBAAwB,CAC9B,MAAc,EACd,OAAiC;QAEjC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,QAAQ;gBAAE,SAAS;YAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC9C,IAAI,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACnC,MAAM,IAAI,eAAe,CACvB,qCAAqC,CACnC,MAAM,EACN,GAAG,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,QAAQ,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,CAChF,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;;sDAGsD;AACtD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7D;;;yCAGyC;AACzC,SAAS,qBAAqB,CAC5B,QAAoD;IAEpD,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC;QACxD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"CreateMediaUploadUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/CreateMediaUploadUseCase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Clock } from "../../domain/port/Clock.js";
2
+ import type { KvCache } from "../../domain/port/KvCache.js";
3
+ import type { MediaStorage } from "../../domain/port/MediaStorage.js";
4
+ import type { UploadMediaVariantRequest } from "../dto/media/index.js";
5
+ /**
6
+ * Server-side byte write for one variant of a pending upload — the
7
+ * sandboxed-agent alternative to the presigned-PUT path produced by
8
+ * `createUpload`. Used by the `upload_media_variant` MCP tool when
9
+ * the caller can't reach the storage backend directly (#283 — Claude
10
+ * Cowork's outbound proxy doesn't allowlist R2 hosts; the MCP
11
+ * transport gets traffic to the Worker via api.anthropic.com).
12
+ *
13
+ * Validates the request against the existing `PendingUploadRecord`
14
+ * (must match purpose + role + mimeType + size cap) then asks the
15
+ * storage adapter to write the bytes. The pending record is NOT
16
+ * deleted here — commit still HEAD-verifies the object via the same
17
+ * code path as the presigned-PUT case. All-or-nothing across the
18
+ * variant bundle still applies at commit time; this use case just
19
+ * lands one variant's bytes.
20
+ *
21
+ * Same purpose policies as the presigned path: per-mime `maxBytes`,
22
+ * per-purpose declared variant set, all already validated by
23
+ * `CreateMediaUploadUseCase` when the agent first opened the group.
24
+ */
25
+ export declare class UploadMediaVariantUseCase {
26
+ private readonly storage;
27
+ private readonly kv;
28
+ private readonly clock;
29
+ constructor(storage: MediaStorage, kv: KvCache, clock: Clock);
30
+ execute(request: UploadMediaVariantRequest): Promise<{
31
+ storageKey: string;
32
+ byteSize: number;
33
+ }>;
34
+ }
35
+ //# sourceMappingURL=UploadMediaVariantUseCase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadMediaVariantUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/UploadMediaVariantUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAYvE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAFL,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,KAAK;IAGzB,OAAO,CACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAyDrD"}
@@ -0,0 +1,75 @@
1
+ import { DiagnosticError } from "@aotter/mantle-spec";
2
+ import { mediaUploadExpiredDiagnostic, mediaVariantSizeExceededDiagnostic, mediaMimeRejectedDiagnostic, } from "./diagnostics.js";
3
+ import { PENDING_UPLOAD_KV_PREFIX } from "./mediaAllowlist.js";
4
+ /**
5
+ * Server-side byte write for one variant of a pending upload — the
6
+ * sandboxed-agent alternative to the presigned-PUT path produced by
7
+ * `createUpload`. Used by the `upload_media_variant` MCP tool when
8
+ * the caller can't reach the storage backend directly (#283 — Claude
9
+ * Cowork's outbound proxy doesn't allowlist R2 hosts; the MCP
10
+ * transport gets traffic to the Worker via api.anthropic.com).
11
+ *
12
+ * Validates the request against the existing `PendingUploadRecord`
13
+ * (must match purpose + role + mimeType + size cap) then asks the
14
+ * storage adapter to write the bytes. The pending record is NOT
15
+ * deleted here — commit still HEAD-verifies the object via the same
16
+ * code path as the presigned-PUT case. All-or-nothing across the
17
+ * variant bundle still applies at commit time; this use case just
18
+ * lands one variant's bytes.
19
+ *
20
+ * Same purpose policies as the presigned path: per-mime `maxBytes`,
21
+ * per-purpose declared variant set, all already validated by
22
+ * `CreateMediaUploadUseCase` when the agent first opened the group.
23
+ */
24
+ export class UploadMediaVariantUseCase {
25
+ storage;
26
+ kv;
27
+ clock;
28
+ constructor(storage, kv, clock) {
29
+ this.storage = storage;
30
+ this.kv = kv;
31
+ this.clock = clock;
32
+ }
33
+ async execute(request) {
34
+ const opPath = "usecase/UploadMediaVariant";
35
+ const kvKey = `${PENDING_UPLOAD_KV_PREFIX}${request.uploadGroupId}`;
36
+ const raw = await this.kv.get(kvKey);
37
+ if (!raw) {
38
+ throw new DiagnosticError(mediaUploadExpiredDiagnostic(opPath, request.uploadGroupId));
39
+ }
40
+ const record = JSON.parse(raw);
41
+ // Wall-clock expiry check. KV TTL covers the eventual-deletion
42
+ // case, but during the window between `expiresAt` and the TTL
43
+ // firing the record is still readable — reject explicitly so the
44
+ // agent can't ship variant bytes against a stale capability.
45
+ if (this.clock.now() >= record.expiresAt) {
46
+ throw new DiagnosticError(mediaUploadExpiredDiagnostic(opPath, request.uploadGroupId));
47
+ }
48
+ // Find the matching declared variant. The pending record's
49
+ // variants[] is the source of truth for "what role + mime are
50
+ // valid in this group"; an agent uploading something not in the
51
+ // declared set is rejected the same way create-then-PUT would
52
+ // have rejected an unknown storageKey.
53
+ const declared = findMatchingVariant(record.variants, request.role, request.mimeType);
54
+ if (!declared) {
55
+ throw new DiagnosticError(mediaMimeRejectedDiagnostic(opPath, request.mimeType));
56
+ }
57
+ const byteSize = request.bytes.byteLength;
58
+ if (byteSize > declared.maxBytes) {
59
+ throw new DiagnosticError(mediaVariantSizeExceededDiagnostic(opPath, request.mimeType, byteSize, declared.maxBytes));
60
+ }
61
+ const result = await this.storage.putVariantBytes({
62
+ uploadGroupId: request.uploadGroupId,
63
+ purpose: record.purpose,
64
+ role: request.role,
65
+ mimeType: request.mimeType,
66
+ filename: record.filename,
67
+ bytes: request.bytes,
68
+ });
69
+ return { storageKey: result.storageKey, byteSize };
70
+ }
71
+ }
72
+ function findMatchingVariant(variants, role, mimeType) {
73
+ return variants.find((v) => v.role === role && v.mimeType === mimeType);
74
+ }
75
+ //# sourceMappingURL=UploadMediaVariantUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadMediaVariantUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/UploadMediaVariantUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQtD,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAM/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,yBAAyB;IAEjB;IACA;IACA;IAHnB,YACmB,OAAqB,EACrB,EAAW,EACX,KAAY;QAFZ,YAAO,GAAP,OAAO,CAAc;QACrB,OAAE,GAAF,EAAE,CAAS;QACX,UAAK,GAAL,KAAK,CAAO;IAC5B,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,OAAkC;QAElC,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAE5C,MAAM,KAAK,GAAG,GAAG,wBAAwB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QAEtD,+DAA+D;QAC/D,8DAA8D;QAC9D,iEAAiE;QACjE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAC5D,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,8DAA8D;QAC9D,gEAAgE;QAChE,8DAA8D;QAC9D,uCAAuC;QACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CACvB,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CACtD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1C,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,eAAe,CACvB,kCAAkC,CAChC,MAAM,EACN,OAAO,CAAC,QAAQ,EAChB,QAAQ,EACR,QAAQ,CAAC,QAAQ,CAClB,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAChD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACrD,CAAC;CACF;AAED,SAAS,mBAAmB,CAC1B,QAA6C,EAC7C,IAAsB,EACtB,QAAgB;IAEhB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
2
2
  export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
3
+ export { UploadMediaVariantUseCase } from "./UploadMediaVariantUseCase.js";
3
4
  export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, type MediaMimeType, } from "./mediaAllowlist.js";
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
2
2
  export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
3
+ export { UploadMediaVariantUseCase } from "./UploadMediaVariantUseCase.js";
3
4
  export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, } from "./mediaAllowlist.js";
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { SchemaManifest } from "@aotter/mantle-spec";
2
2
  import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
3
+ import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
3
4
  import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
4
5
  import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
5
6
  import type { PreviewEntryRequest } from "../dto/render/PreviewEntryRequest.js";
@@ -20,7 +21,8 @@ export declare class PreviewEntryUseCase {
20
21
  private readonly paths;
21
22
  private readonly composeSeo;
22
23
  private readonly schemas;
23
- constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>);
24
+ private readonly mediaAssets;
25
+ constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
24
26
  execute(request: PreviewEntryRequest): Promise<string | null>;
25
27
  }
26
28
  //# sourceMappingURL=PreviewEntryUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAQrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAUjD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA6BpE"}
1
+ {"version":3,"file":"PreviewEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAQrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAWjD;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBALX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+BpE"}
@@ -3,6 +3,7 @@ import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryRead
3
3
  import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
4
4
  import { defaultPreviewBanner, injectPreviewBanner, } from "../../domain/service/PreviewBanner.js";
5
5
  import { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
6
+ import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
6
7
  /** Default fallback: prefer drafts, fall back to published, then
7
8
  * archived. Authors typically open `?preview=1` to see WIP. */
8
9
  const DEFAULT_PREVIEW_STATUS_ORDER = [
@@ -26,12 +27,14 @@ export class PreviewEntryUseCase {
26
27
  paths;
27
28
  composeSeo;
28
29
  schemas;
29
- constructor(db, templates, paths, composeSeo, schemas) {
30
+ mediaAssets;
31
+ constructor(db, templates, paths, composeSeo, schemas, mediaAssets = null) {
30
32
  this.db = db;
31
33
  this.templates = templates;
32
34
  this.paths = paths;
33
35
  this.composeSeo = composeSeo;
34
36
  this.schemas = schemas;
37
+ this.mediaAssets = mediaAssets;
35
38
  }
36
39
  async execute(request) {
37
40
  const order = request.statusOrder ?? DEFAULT_PREVIEW_STATUS_ORDER;
@@ -54,10 +57,12 @@ export class PreviewEntryUseCase {
54
57
  // published-parent invariant at publish time.
55
58
  const entry = await joinParentIfTranslation(this.db, this.schemas, raw);
56
59
  const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
60
+ const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, [entry]);
57
61
  const html = renderEntryHtml({
58
62
  entry,
59
63
  site: request.site,
60
64
  templates: this.templates,
65
+ mediaAssets,
61
66
  seo,
62
67
  });
63
68
  if (html === null)
@@ -1 +1 @@
1
- {"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,kBAAkB,GAEnB,MAAM,yCAAyC,CAAC;AAEjD;gEACgE;AAChE,MAAM,4BAA4B,GAAgC;IAChE,OAAO;IACP,WAAW;IACX,UAAU;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAEX;IACA;IACA;IACA;IACA;IALnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuB,EACvB,OAA4C;QAJ5C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;IAC5D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;QAClE,IAAI,GAAG,GAAiB,IAAI,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,GAAG;gBAAE,MAAM;QACjB,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,oEAAoE;QACpE,8DAA8D;QAC9D,+DAA+D;QAC/D,8CAA8C;QAC9C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,kBAAkB,GAEnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;gEACgE;AAChE,MAAM,4BAA4B,GAAgC;IAChE,OAAO;IACP,WAAW;IACX,UAAU;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAEX;IACA;IACA;IACA;IACA;IACA;IANnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuB,EACvB,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;QAClE,IAAI,GAAG,GAAiB,IAAI,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,GAAG;gBAAE,MAAM;QACjB,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,oEAAoE;QACpE,8DAA8D;QAC9D,+DAA+D;QAC/D,8CAA8C;QAC9C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;YACX,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
1
  import type { SchemaManifest } from "@aotter/mantle-spec";
2
2
  import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
3
+ import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
3
4
  import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
4
5
  import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
5
6
  import type { RenderEntryLiveRequest } from "../dto/render/RenderEntryLiveRequest.js";
@@ -29,7 +30,8 @@ export declare class RenderEntryLiveUseCase {
29
30
  private readonly paths;
30
31
  private readonly composeSeo;
31
32
  private readonly schemas;
32
- constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>);
33
+ private readonly mediaAssets;
34
+ constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
33
35
  execute(request: RenderEntryLiveRequest): Promise<string | null>;
34
36
  }
35
37
  //# sourceMappingURL=RenderEntryLiveUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderEntryLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAoBvE"}
1
+ {"version":3,"file":"RenderEntryLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAGjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBALX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,WAAW,EACvB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAsBvE"}
@@ -2,6 +2,7 @@ import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
2
2
  import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryReader.js";
3
3
  import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
4
4
  import { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
5
+ import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
5
6
  /**
6
7
  * Render a single entry from current DB state. Used by adapter live-
7
8
  * dev routes (`MANTLE_LOCAL_DEV=1`) to bypass the KV cache and pick up
@@ -27,12 +28,14 @@ export class RenderEntryLiveUseCase {
27
28
  paths;
28
29
  composeSeo;
29
30
  schemas;
30
- constructor(db, templates, paths, composeSeo, schemas) {
31
+ mediaAssets;
32
+ constructor(db, templates, paths, composeSeo, schemas, mediaAssets = null) {
31
33
  this.db = db;
32
34
  this.templates = templates;
33
35
  this.paths = paths;
34
36
  this.composeSeo = composeSeo;
35
37
  this.schemas = schemas;
38
+ this.mediaAssets = mediaAssets;
36
39
  }
37
40
  async execute(request) {
38
41
  const status = request.status ?? "published";
@@ -48,10 +51,12 @@ export class RenderEntryLiveUseCase {
48
51
  parentStatus: status,
49
52
  });
50
53
  const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
54
+ const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, [entry]);
51
55
  return renderEntryHtml({
52
56
  entry,
53
57
  site: request.site,
54
58
  templates: this.templates,
59
+ mediaAssets,
55
60
  seo,
56
61
  });
57
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RenderEntryLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EACL,kBAAkB,GAEnB,MAAM,yCAAyC,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,sBAAsB;IAEd;IACA;IACA;IACA;IACA;IALnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuB,EACvB,OAA4C;QAJ5C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;IAC5D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;YACzC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACtE,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,OAAO,eAAe,CAAC;YACrB,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"RenderEntryLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EACL,kBAAkB,GAEnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,sBAAsB;IAEd;IACA;IACA;IACA;IACA;IACA;IANnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuB,EACvB,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;YACzC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACtE,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,eAAe,CAAC;YACrB,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;YACX,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
1
  import type { SchemaManifest } from "@aotter/mantle-spec";
2
2
  import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
3
+ import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
3
4
  import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
4
5
  import type { RenderListLiveRequest } from "../dto/render/RenderListLiveRequest.js";
5
6
  /**
@@ -17,7 +18,8 @@ export declare class RenderListLiveUseCase {
17
18
  private readonly db;
18
19
  private readonly templates;
19
20
  private readonly schemas;
20
- constructor(db: DatabaseDriver, templates: TemplateRegistry, schemas: ReadonlyMap<string, SchemaManifest>);
21
+ private readonly mediaAssets;
22
+ constructor(db: DatabaseDriver, templates: TemplateRegistry, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
21
23
  execute(request: RenderListLiveRequest): Promise<string | null>;
22
24
  }
23
25
  //# sourceMappingURL=RenderListLiveUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAEpF;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC;IAGzD,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAgBtE"}
1
+ {"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAGpF;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAkBtE"}
@@ -1,6 +1,7 @@
1
1
  import { readPublishedEntries } from "../../domain/service/io/PublishedEntries.js";
2
2
  import { joinParentForList } from "../../domain/service/io/JoinedEntryReader.js";
3
3
  import { renderListHtml } from "../../domain/service/HtmlRenderer.js";
4
+ import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
4
5
  /**
5
6
  * Render a collection's list page from current DB state. Sibling to
6
7
  * `RenderEntryLiveUseCase` for the post-list / page-list surfaces.
@@ -16,10 +17,12 @@ export class RenderListLiveUseCase {
16
17
  db;
17
18
  templates;
18
19
  schemas;
19
- constructor(db, templates, schemas) {
20
+ mediaAssets;
21
+ constructor(db, templates, schemas, mediaAssets = null) {
20
22
  this.db = db;
21
23
  this.templates = templates;
22
24
  this.schemas = schemas;
25
+ this.mediaAssets = mediaAssets;
23
26
  }
24
27
  async execute(request) {
25
28
  const raw = await readPublishedEntries(this.db, {
@@ -29,12 +32,14 @@ export class RenderListLiveUseCase {
29
32
  const entries = await joinParentForList(this.db, this.schemas, raw, {
30
33
  parentStatus: "published",
31
34
  });
35
+ const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, entries);
32
36
  return renderListHtml({
33
37
  collection: request.collection,
34
38
  locale: request.locale,
35
39
  entries,
36
40
  site: request.site,
37
41
  templates: this.templates,
42
+ mediaAssets,
38
43
  });
39
44
  }
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAGtE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IAHnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,OAA4C;QAF5C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAqC;IAC5D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE;YAC9C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAClE,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,OAAO,cAAc,CAAC;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IACA;IAJnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,OAA4C,EAC5C,cAA2C,IAAI;QAH/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE;YAC9C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAClE,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,cAAc,CAAC;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@aotter/mantle-runtime",
3
- "version": "0.0.11-alpha.14",
3
+ "version": "0.0.11-alpha.16",
4
4
  "description": "Runtime engine for mantle: dispatcher + entry-writer + view executor + content-ops + render pipeline + auth + MCP. Defines adapter-agnostic ports. MUST NOT import D1Database / KVNamespace types.",
5
5
  "license": "Apache-2.0",
6
- "homepage": "https://github.com/aotter/mantle/tree/develop/packages/mantle-runtime",
6
+ "homepage": "https://mantle.tools/",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/aotter/mantle.git",
@@ -29,7 +29,7 @@
29
29
  "README.md"
30
30
  ],
31
31
  "dependencies": {
32
- "@aotter/mantle-spec": "0.0.11-alpha.14"
32
+ "@aotter/mantle-spec": "0.0.11-alpha.16"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "zod": "^4.0.0"
@@ -37,7 +37,7 @@
37
37
  "devDependencies": {
38
38
  "@types/node": "^25",
39
39
  "typescript": "^6.0.3",
40
- "vitest": "^4.1.6",
40
+ "vitest": "^4.1.7",
41
41
  "zod": "^4.4.2"
42
42
  },
43
43
  "scripts": {