@aotter/mantle-runtime 0.0.11-alpha.11

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 (439) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +14 -0
  3. package/dist/domain/index.d.ts +4 -0
  4. package/dist/domain/index.d.ts.map +1 -0
  5. package/dist/domain/index.js +4 -0
  6. package/dist/domain/index.js.map +1 -0
  7. package/dist/domain/model/EntryRow.d.ts +59 -0
  8. package/dist/domain/model/EntryRow.d.ts.map +1 -0
  9. package/dist/domain/model/EntryRow.js +42 -0
  10. package/dist/domain/model/EntryRow.js.map +1 -0
  11. package/dist/domain/model/HandlerContext.d.ts +65 -0
  12. package/dist/domain/model/HandlerContext.d.ts.map +1 -0
  13. package/dist/domain/model/HandlerContext.js +2 -0
  14. package/dist/domain/model/HandlerContext.js.map +1 -0
  15. package/dist/domain/model/SeoMeta.d.ts +49 -0
  16. package/dist/domain/model/SeoMeta.d.ts.map +1 -0
  17. package/dist/domain/model/SeoMeta.js +2 -0
  18. package/dist/domain/model/SeoMeta.js.map +1 -0
  19. package/dist/domain/model/TemplateRegistry.d.ts +47 -0
  20. package/dist/domain/model/TemplateRegistry.d.ts.map +1 -0
  21. package/dist/domain/model/TemplateRegistry.js +17 -0
  22. package/dist/domain/model/TemplateRegistry.js.map +1 -0
  23. package/dist/domain/model/index.d.ts +7 -0
  24. package/dist/domain/model/index.d.ts.map +1 -0
  25. package/dist/domain/model/index.js +6 -0
  26. package/dist/domain/model/index.js.map +1 -0
  27. package/dist/domain/port/AssetServer.d.ts +21 -0
  28. package/dist/domain/port/AssetServer.d.ts.map +1 -0
  29. package/dist/domain/port/AssetServer.js +2 -0
  30. package/dist/domain/port/AssetServer.js.map +1 -0
  31. package/dist/domain/port/Clock.d.ts +13 -0
  32. package/dist/domain/port/Clock.d.ts.map +1 -0
  33. package/dist/domain/port/Clock.js +2 -0
  34. package/dist/domain/port/Clock.js.map +1 -0
  35. package/dist/domain/port/DatabaseDriver.d.ts +91 -0
  36. package/dist/domain/port/DatabaseDriver.d.ts.map +1 -0
  37. package/dist/domain/port/DatabaseDriver.js +2 -0
  38. package/dist/domain/port/DatabaseDriver.js.map +1 -0
  39. package/dist/domain/port/DeferredHookDispatcher.d.ts +55 -0
  40. package/dist/domain/port/DeferredHookDispatcher.d.ts.map +1 -0
  41. package/dist/domain/port/DeferredHookDispatcher.js +16 -0
  42. package/dist/domain/port/DeferredHookDispatcher.js.map +1 -0
  43. package/dist/domain/port/EmailSender.d.ts +31 -0
  44. package/dist/domain/port/EmailSender.d.ts.map +1 -0
  45. package/dist/domain/port/EmailSender.js +2 -0
  46. package/dist/domain/port/EmailSender.js.map +1 -0
  47. package/dist/domain/port/EntryRepository.d.ts +132 -0
  48. package/dist/domain/port/EntryRepository.d.ts.map +1 -0
  49. package/dist/domain/port/EntryRepository.js +2 -0
  50. package/dist/domain/port/EntryRepository.js.map +1 -0
  51. package/dist/domain/port/HandlerRegistry.d.ts +38 -0
  52. package/dist/domain/port/HandlerRegistry.d.ts.map +1 -0
  53. package/dist/domain/port/HandlerRegistry.js +27 -0
  54. package/dist/domain/port/HandlerRegistry.js.map +1 -0
  55. package/dist/domain/port/IdGenerator.d.ts +28 -0
  56. package/dist/domain/port/IdGenerator.d.ts.map +1 -0
  57. package/dist/domain/port/IdGenerator.js +5 -0
  58. package/dist/domain/port/IdGenerator.js.map +1 -0
  59. package/dist/domain/port/KvCache.d.ts +34 -0
  60. package/dist/domain/port/KvCache.d.ts.map +1 -0
  61. package/dist/domain/port/KvCache.js +2 -0
  62. package/dist/domain/port/KvCache.js.map +1 -0
  63. package/dist/domain/port/LifecycleHookRunner.d.ts +41 -0
  64. package/dist/domain/port/LifecycleHookRunner.d.ts.map +1 -0
  65. package/dist/domain/port/LifecycleHookRunner.js +2 -0
  66. package/dist/domain/port/LifecycleHookRunner.js.map +1 -0
  67. package/dist/domain/port/MediaStorage.d.ts +102 -0
  68. package/dist/domain/port/MediaStorage.d.ts.map +1 -0
  69. package/dist/domain/port/MediaStorage.js +2 -0
  70. package/dist/domain/port/MediaStorage.js.map +1 -0
  71. package/dist/domain/port/PublishOrchestrator.d.ts +25 -0
  72. package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -0
  73. package/dist/domain/port/PublishOrchestrator.js +2 -0
  74. package/dist/domain/port/PublishOrchestrator.js.map +1 -0
  75. package/dist/domain/port/SiteConfigRepository.d.ts +27 -0
  76. package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -0
  77. package/dist/domain/port/SiteConfigRepository.js +2 -0
  78. package/dist/domain/port/SiteConfigRepository.js.map +1 -0
  79. package/dist/domain/port/index.d.ts +30 -0
  80. package/dist/domain/port/index.d.ts.map +1 -0
  81. package/dist/domain/port/index.js +5 -0
  82. package/dist/domain/port/index.js.map +1 -0
  83. package/dist/domain/service/AbsoluteUrl.d.ts +6 -0
  84. package/dist/domain/service/AbsoluteUrl.d.ts.map +1 -0
  85. package/dist/domain/service/AbsoluteUrl.js +33 -0
  86. package/dist/domain/service/AbsoluteUrl.js.map +1 -0
  87. package/dist/domain/service/AuthPredicateEvaluator.d.ts +29 -0
  88. package/dist/domain/service/AuthPredicateEvaluator.d.ts.map +1 -0
  89. package/dist/domain/service/AuthPredicateEvaluator.js +48 -0
  90. package/dist/domain/service/AuthPredicateEvaluator.js.map +1 -0
  91. package/dist/domain/service/BuiltinProjector.d.ts +50 -0
  92. package/dist/domain/service/BuiltinProjector.d.ts.map +1 -0
  93. package/dist/domain/service/BuiltinProjector.js +61 -0
  94. package/dist/domain/service/BuiltinProjector.js.map +1 -0
  95. package/dist/domain/service/EntrySeoSupport.d.ts +27 -0
  96. package/dist/domain/service/EntrySeoSupport.d.ts.map +1 -0
  97. package/dist/domain/service/EntrySeoSupport.js +13 -0
  98. package/dist/domain/service/EntrySeoSupport.js.map +1 -0
  99. package/dist/domain/service/HtmlRenderer.d.ts +32 -0
  100. package/dist/domain/service/HtmlRenderer.d.ts.map +1 -0
  101. package/dist/domain/service/HtmlRenderer.js +38 -0
  102. package/dist/domain/service/HtmlRenderer.js.map +1 -0
  103. package/dist/domain/service/LocaleNegotiator.d.ts +29 -0
  104. package/dist/domain/service/LocaleNegotiator.d.ts.map +1 -0
  105. package/dist/domain/service/LocaleNegotiator.js +62 -0
  106. package/dist/domain/service/LocaleNegotiator.js.map +1 -0
  107. package/dist/domain/service/MarkdownSerializer.d.ts +48 -0
  108. package/dist/domain/service/MarkdownSerializer.d.ts.map +1 -0
  109. package/dist/domain/service/MarkdownSerializer.js +109 -0
  110. package/dist/domain/service/MarkdownSerializer.js.map +1 -0
  111. package/dist/domain/service/McpToolNaming.d.ts +12 -0
  112. package/dist/domain/service/McpToolNaming.d.ts.map +1 -0
  113. package/dist/domain/service/McpToolNaming.js +14 -0
  114. package/dist/domain/service/McpToolNaming.js.map +1 -0
  115. package/dist/domain/service/Pagination.d.ts +15 -0
  116. package/dist/domain/service/Pagination.d.ts.map +1 -0
  117. package/dist/domain/service/Pagination.js +29 -0
  118. package/dist/domain/service/Pagination.js.map +1 -0
  119. package/dist/domain/service/PathMatcher.d.ts +15 -0
  120. package/dist/domain/service/PathMatcher.d.ts.map +1 -0
  121. package/dist/domain/service/PathMatcher.js +54 -0
  122. package/dist/domain/service/PathMatcher.js.map +1 -0
  123. package/dist/domain/service/PreviewBanner.d.ts +10 -0
  124. package/dist/domain/service/PreviewBanner.d.ts.map +1 -0
  125. package/dist/domain/service/PreviewBanner.js +37 -0
  126. package/dist/domain/service/PreviewBanner.js.map +1 -0
  127. package/dist/domain/service/PublicPathResolver.d.ts +41 -0
  128. package/dist/domain/service/PublicPathResolver.d.ts.map +1 -0
  129. package/dist/domain/service/PublicPathResolver.js +24 -0
  130. package/dist/domain/service/PublicPathResolver.js.map +1 -0
  131. package/dist/domain/service/PublishKeys.d.ts +42 -0
  132. package/dist/domain/service/PublishKeys.d.ts.map +1 -0
  133. package/dist/domain/service/PublishKeys.js +69 -0
  134. package/dist/domain/service/PublishKeys.js.map +1 -0
  135. package/dist/domain/service/SeoMetaComposer.d.ts +47 -0
  136. package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -0
  137. package/dist/domain/service/SeoMetaComposer.js +174 -0
  138. package/dist/domain/service/SeoMetaComposer.js.map +1 -0
  139. package/dist/domain/service/SitemapSerializer.d.ts +19 -0
  140. package/dist/domain/service/SitemapSerializer.d.ts.map +1 -0
  141. package/dist/domain/service/SitemapSerializer.js +27 -0
  142. package/dist/domain/service/SitemapSerializer.js.map +1 -0
  143. package/dist/domain/service/TriggerIndex.d.ts +27 -0
  144. package/dist/domain/service/TriggerIndex.d.ts.map +1 -0
  145. package/dist/domain/service/TriggerIndex.js +52 -0
  146. package/dist/domain/service/TriggerIndex.js.map +1 -0
  147. package/dist/domain/service/ViewParamCoercer.d.ts +20 -0
  148. package/dist/domain/service/ViewParamCoercer.d.ts.map +1 -0
  149. package/dist/domain/service/ViewParamCoercer.js +82 -0
  150. package/dist/domain/service/ViewParamCoercer.js.map +1 -0
  151. package/dist/domain/service/ViewSqlCompiler.d.ts +29 -0
  152. package/dist/domain/service/ViewSqlCompiler.d.ts.map +1 -0
  153. package/dist/domain/service/ViewSqlCompiler.js +147 -0
  154. package/dist/domain/service/ViewSqlCompiler.js.map +1 -0
  155. package/dist/domain/service/index.d.ts +28 -0
  156. package/dist/domain/service/index.d.ts.map +1 -0
  157. package/dist/domain/service/index.js +28 -0
  158. package/dist/domain/service/index.js.map +1 -0
  159. package/dist/domain/service/io/EntryWriteGuard.d.ts +19 -0
  160. package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -0
  161. package/dist/domain/service/io/EntryWriteGuard.js +109 -0
  162. package/dist/domain/service/io/EntryWriteGuard.js.map +1 -0
  163. package/dist/domain/service/io/JoinedEntryReader.d.ts +33 -0
  164. package/dist/domain/service/io/JoinedEntryReader.d.ts.map +1 -0
  165. package/dist/domain/service/io/JoinedEntryReader.js +95 -0
  166. package/dist/domain/service/io/JoinedEntryReader.js.map +1 -0
  167. package/dist/domain/service/io/PublishedEntries.d.ts +69 -0
  168. package/dist/domain/service/io/PublishedEntries.d.ts.map +1 -0
  169. package/dist/domain/service/io/PublishedEntries.js +116 -0
  170. package/dist/domain/service/io/PublishedEntries.js.map +1 -0
  171. package/dist/domain/service/io/index.d.ts +9 -0
  172. package/dist/domain/service/io/index.d.ts.map +1 -0
  173. package/dist/domain/service/io/index.js +9 -0
  174. package/dist/domain/service/io/index.js.map +1 -0
  175. package/dist/index.d.ts +41 -0
  176. package/dist/index.d.ts.map +1 -0
  177. package/dist/index.js +45 -0
  178. package/dist/index.js.map +1 -0
  179. package/dist/infrastructure/boot/canonicalMigrations.d.ts +9 -0
  180. package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -0
  181. package/dist/infrastructure/boot/canonicalMigrations.js +162 -0
  182. package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -0
  183. package/dist/infrastructure/boot/index.d.ts +2 -0
  184. package/dist/infrastructure/boot/index.d.ts.map +1 -0
  185. package/dist/infrastructure/boot/index.js +2 -0
  186. package/dist/infrastructure/boot/index.js.map +1 -0
  187. package/dist/infrastructure/http/DiagnosticResponse.d.ts +12 -0
  188. package/dist/infrastructure/http/DiagnosticResponse.d.ts.map +1 -0
  189. package/dist/infrastructure/http/DiagnosticResponse.js +14 -0
  190. package/dist/infrastructure/http/DiagnosticResponse.js.map +1 -0
  191. package/dist/infrastructure/http/index.d.ts +2 -0
  192. package/dist/infrastructure/http/index.d.ts.map +1 -0
  193. package/dist/infrastructure/http/index.js +2 -0
  194. package/dist/infrastructure/http/index.js.map +1 -0
  195. package/dist/infrastructure/index.d.ts +12 -0
  196. package/dist/infrastructure/index.d.ts.map +1 -0
  197. package/dist/infrastructure/index.js +12 -0
  198. package/dist/infrastructure/index.js.map +1 -0
  199. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +60 -0
  200. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -0
  201. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +281 -0
  202. package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -0
  203. package/dist/infrastructure/mcp/McpResponses.d.ts +14 -0
  204. package/dist/infrastructure/mcp/McpResponses.d.ts.map +1 -0
  205. package/dist/infrastructure/mcp/McpResponses.js +49 -0
  206. package/dist/infrastructure/mcp/McpResponses.js.map +1 -0
  207. package/dist/infrastructure/mcp/McpToolCatalog.d.ts +68 -0
  208. package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -0
  209. package/dist/infrastructure/mcp/McpToolCatalog.js +231 -0
  210. package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -0
  211. package/dist/infrastructure/mcp/index.d.ts +4 -0
  212. package/dist/infrastructure/mcp/index.d.ts.map +1 -0
  213. package/dist/infrastructure/mcp/index.js +4 -0
  214. package/dist/infrastructure/mcp/index.js.map +1 -0
  215. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +35 -0
  216. package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -0
  217. package/dist/infrastructure/persistence/DatabaseEntryRepository.js +228 -0
  218. package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -0
  219. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts +12 -0
  220. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -0
  221. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +101 -0
  222. package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -0
  223. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +74 -0
  224. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -0
  225. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +208 -0
  226. package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -0
  227. package/dist/infrastructure/persistence/index.d.ts +4 -0
  228. package/dist/infrastructure/persistence/index.d.ts.map +1 -0
  229. package/dist/infrastructure/persistence/index.js +4 -0
  230. package/dist/infrastructure/persistence/index.js.map +1 -0
  231. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +34 -0
  232. package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -0
  233. package/dist/infrastructure/render/HtmlPublishOrchestrator.js +116 -0
  234. package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -0
  235. package/dist/infrastructure/render/index.d.ts +2 -0
  236. package/dist/infrastructure/render/index.d.ts.map +1 -0
  237. package/dist/infrastructure/render/index.js +2 -0
  238. package/dist/infrastructure/render/index.js.map +1 -0
  239. package/dist/runtime.d.ts +132 -0
  240. package/dist/runtime.d.ts.map +1 -0
  241. package/dist/runtime.js +142 -0
  242. package/dist/runtime.js.map +1 -0
  243. package/dist/usecase/boot/ValidateBootUseCase.d.ts +57 -0
  244. package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -0
  245. package/dist/usecase/boot/ValidateBootUseCase.js +181 -0
  246. package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -0
  247. package/dist/usecase/boot/index.d.ts +2 -0
  248. package/dist/usecase/boot/index.d.ts.map +1 -0
  249. package/dist/usecase/boot/index.js +2 -0
  250. package/dist/usecase/boot/index.js.map +1 -0
  251. package/dist/usecase/content/ArchiveUseCase.d.ts +20 -0
  252. package/dist/usecase/content/ArchiveUseCase.d.ts.map +1 -0
  253. package/dist/usecase/content/ArchiveUseCase.js +47 -0
  254. package/dist/usecase/content/ArchiveUseCase.js.map +1 -0
  255. package/dist/usecase/content/ContentPublishEffects.d.ts +11 -0
  256. package/dist/usecase/content/ContentPublishEffects.d.ts.map +1 -0
  257. package/dist/usecase/content/ContentPublishEffects.js +21 -0
  258. package/dist/usecase/content/ContentPublishEffects.js.map +1 -0
  259. package/dist/usecase/content/CreateDraftUseCase.d.ts +22 -0
  260. package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -0
  261. package/dist/usecase/content/CreateDraftUseCase.js +61 -0
  262. package/dist/usecase/content/CreateDraftUseCase.js.map +1 -0
  263. package/dist/usecase/content/DeleteEntryUseCase.d.ts +20 -0
  264. package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -0
  265. package/dist/usecase/content/DeleteEntryUseCase.js +34 -0
  266. package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -0
  267. package/dist/usecase/content/GetEntryUseCase.d.ts +13 -0
  268. package/dist/usecase/content/GetEntryUseCase.d.ts.map +1 -0
  269. package/dist/usecase/content/GetEntryUseCase.js +24 -0
  270. package/dist/usecase/content/GetEntryUseCase.js.map +1 -0
  271. package/dist/usecase/content/ListEntriesUseCase.d.ts +39 -0
  272. package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -0
  273. package/dist/usecase/content/ListEntriesUseCase.js +58 -0
  274. package/dist/usecase/content/ListEntriesUseCase.js.map +1 -0
  275. package/dist/usecase/content/RequestPublishUseCase.d.ts +30 -0
  276. package/dist/usecase/content/RequestPublishUseCase.d.ts.map +1 -0
  277. package/dist/usecase/content/RequestPublishUseCase.js +111 -0
  278. package/dist/usecase/content/RequestPublishUseCase.js.map +1 -0
  279. package/dist/usecase/content/UnpublishUseCase.d.ts +19 -0
  280. package/dist/usecase/content/UnpublishUseCase.d.ts.map +1 -0
  281. package/dist/usecase/content/UnpublishUseCase.js +46 -0
  282. package/dist/usecase/content/UnpublishUseCase.js.map +1 -0
  283. package/dist/usecase/content/UpdateDraftUseCase.d.ts +20 -0
  284. package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -0
  285. package/dist/usecase/content/UpdateDraftUseCase.js +86 -0
  286. package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -0
  287. package/dist/usecase/content/diagnostics.d.ts +26 -0
  288. package/dist/usecase/content/diagnostics.d.ts.map +1 -0
  289. package/dist/usecase/content/diagnostics.js +100 -0
  290. package/dist/usecase/content/diagnostics.js.map +1 -0
  291. package/dist/usecase/content/index.d.ts +15 -0
  292. package/dist/usecase/content/index.d.ts.map +1 -0
  293. package/dist/usecase/content/index.js +15 -0
  294. package/dist/usecase/content/index.js.map +1 -0
  295. package/dist/usecase/dto/content/index.d.ts +73 -0
  296. package/dist/usecase/dto/content/index.d.ts.map +1 -0
  297. package/dist/usecase/dto/content/index.js +2 -0
  298. package/dist/usecase/dto/content/index.js.map +1 -0
  299. package/dist/usecase/dto/index.d.ts +13 -0
  300. package/dist/usecase/dto/index.d.ts.map +1 -0
  301. package/dist/usecase/dto/index.js +13 -0
  302. package/dist/usecase/dto/index.js.map +1 -0
  303. package/dist/usecase/dto/lifecycle/index.d.ts +15 -0
  304. package/dist/usecase/dto/lifecycle/index.d.ts.map +1 -0
  305. package/dist/usecase/dto/lifecycle/index.js +2 -0
  306. package/dist/usecase/dto/lifecycle/index.js.map +1 -0
  307. package/dist/usecase/dto/media/index.d.ts +32 -0
  308. package/dist/usecase/dto/media/index.d.ts.map +1 -0
  309. package/dist/usecase/dto/media/index.js +8 -0
  310. package/dist/usecase/dto/media/index.js.map +1 -0
  311. package/dist/usecase/dto/procedure/index.d.ts +37 -0
  312. package/dist/usecase/dto/procedure/index.d.ts.map +1 -0
  313. package/dist/usecase/dto/procedure/index.js +2 -0
  314. package/dist/usecase/dto/procedure/index.js.map +1 -0
  315. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +14 -0
  316. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +1 -0
  317. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js +2 -0
  318. package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js.map +1 -0
  319. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +8 -0
  320. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +1 -0
  321. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js +2 -0
  322. package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js.map +1 -0
  323. package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +11 -0
  324. package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +1 -0
  325. package/dist/usecase/dto/render/ComposeSitemapRequest.js +2 -0
  326. package/dist/usecase/dto/render/ComposeSitemapRequest.js.map +1 -0
  327. package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +27 -0
  328. package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -0
  329. package/dist/usecase/dto/render/PreviewEntryRequest.js +2 -0
  330. package/dist/usecase/dto/render/PreviewEntryRequest.js.map +1 -0
  331. package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +17 -0
  332. package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -0
  333. package/dist/usecase/dto/render/RenderEntryLiveRequest.js +2 -0
  334. package/dist/usecase/dto/render/RenderEntryLiveRequest.js.map +1 -0
  335. package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +11 -0
  336. package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +1 -0
  337. package/dist/usecase/dto/render/RenderListLiveRequest.js +2 -0
  338. package/dist/usecase/dto/render/RenderListLiveRequest.js.map +1 -0
  339. package/dist/usecase/dto/render/index.d.ts +7 -0
  340. package/dist/usecase/dto/render/index.d.ts.map +1 -0
  341. package/dist/usecase/dto/render/index.js +7 -0
  342. package/dist/usecase/dto/render/index.js.map +1 -0
  343. package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +16 -0
  344. package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -0
  345. package/dist/usecase/dto/view/ExecuteViewRequest.js +2 -0
  346. package/dist/usecase/dto/view/ExecuteViewRequest.js.map +1 -0
  347. package/dist/usecase/dto/view/index.d.ts +2 -0
  348. package/dist/usecase/dto/view/index.d.ts.map +1 -0
  349. package/dist/usecase/dto/view/index.js +2 -0
  350. package/dist/usecase/dto/view/index.js.map +1 -0
  351. package/dist/usecase/index.d.ts +16 -0
  352. package/dist/usecase/index.d.ts.map +1 -0
  353. package/dist/usecase/index.js +16 -0
  354. package/dist/usecase/index.js.map +1 -0
  355. package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts +26 -0
  356. package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts.map +1 -0
  357. package/dist/usecase/lifecycle/RunDeferredHookUseCase.js +44 -0
  358. package/dist/usecase/lifecycle/RunDeferredHookUseCase.js.map +1 -0
  359. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts +38 -0
  360. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts.map +1 -0
  361. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js +67 -0
  362. package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js.map +1 -0
  363. package/dist/usecase/lifecycle/index.d.ts +3 -0
  364. package/dist/usecase/lifecycle/index.d.ts.map +1 -0
  365. package/dist/usecase/lifecycle/index.js +3 -0
  366. package/dist/usecase/lifecycle/index.js.map +1 -0
  367. package/dist/usecase/media/CommitMediaUploadUseCase.d.ts +15 -0
  368. package/dist/usecase/media/CommitMediaUploadUseCase.d.ts.map +1 -0
  369. package/dist/usecase/media/CommitMediaUploadUseCase.js +43 -0
  370. package/dist/usecase/media/CommitMediaUploadUseCase.js.map +1 -0
  371. package/dist/usecase/media/CreateMediaUploadUseCase.d.ts +18 -0
  372. package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -0
  373. package/dist/usecase/media/CreateMediaUploadUseCase.js +71 -0
  374. package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -0
  375. package/dist/usecase/media/PendingUploadRecord.d.ts +17 -0
  376. package/dist/usecase/media/PendingUploadRecord.d.ts.map +1 -0
  377. package/dist/usecase/media/PendingUploadRecord.js +2 -0
  378. package/dist/usecase/media/PendingUploadRecord.js.map +1 -0
  379. package/dist/usecase/media/diagnostics.d.ts +15 -0
  380. package/dist/usecase/media/diagnostics.d.ts.map +1 -0
  381. package/dist/usecase/media/diagnostics.js +88 -0
  382. package/dist/usecase/media/diagnostics.js.map +1 -0
  383. package/dist/usecase/media/index.d.ts +4 -0
  384. package/dist/usecase/media/index.d.ts.map +1 -0
  385. package/dist/usecase/media/index.js +4 -0
  386. package/dist/usecase/media/index.js.map +1 -0
  387. package/dist/usecase/media/mediaAllowlist.d.ts +30 -0
  388. package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -0
  389. package/dist/usecase/media/mediaAllowlist.js +53 -0
  390. package/dist/usecase/media/mediaAllowlist.js.map +1 -0
  391. package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +43 -0
  392. package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -0
  393. package/dist/usecase/procedure/InvokeBuiltinUseCase.js +202 -0
  394. package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -0
  395. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +50 -0
  396. package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -0
  397. package/dist/usecase/procedure/InvokeProcedureUseCase.js +191 -0
  398. package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -0
  399. package/dist/usecase/procedure/index.d.ts +3 -0
  400. package/dist/usecase/procedure/index.d.ts.map +1 -0
  401. package/dist/usecase/procedure/index.js +3 -0
  402. package/dist/usecase/procedure/index.js.map +1 -0
  403. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +25 -0
  404. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -0
  405. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +55 -0
  406. package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -0
  407. package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +19 -0
  408. package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -0
  409. package/dist/usecase/render/ComposeLlmsTxtUseCase.js +40 -0
  410. package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -0
  411. package/dist/usecase/render/ComposeSitemapUseCase.d.ts +15 -0
  412. package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -0
  413. package/dist/usecase/render/ComposeSitemapUseCase.js +29 -0
  414. package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -0
  415. package/dist/usecase/render/PreviewEntryUseCase.d.ts +26 -0
  416. package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -0
  417. package/dist/usecase/render/PreviewEntryUseCase.js +69 -0
  418. package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -0
  419. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +35 -0
  420. package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -0
  421. package/dist/usecase/render/RenderEntryLiveUseCase.js +59 -0
  422. package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -0
  423. package/dist/usecase/render/RenderListLiveUseCase.d.ts +23 -0
  424. package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -0
  425. package/dist/usecase/render/RenderListLiveUseCase.js +41 -0
  426. package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -0
  427. package/dist/usecase/render/index.d.ts +7 -0
  428. package/dist/usecase/render/index.d.ts.map +1 -0
  429. package/dist/usecase/render/index.js +10 -0
  430. package/dist/usecase/render/index.js.map +1 -0
  431. package/dist/usecase/view/ExecuteViewUseCase.d.ts +31 -0
  432. package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -0
  433. package/dist/usecase/view/ExecuteViewUseCase.js +78 -0
  434. package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -0
  435. package/dist/usecase/view/index.d.ts +2 -0
  436. package/dist/usecase/view/index.d.ts.map +1 -0
  437. package/dist/usecase/view/index.js +2 -0
  438. package/dist/usecase/view/index.js.map +1 -0
  439. package/package.json +49 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Optional first-party media storage — **public bucket only**. Not
3
+ * part of the required v0.1.0 provisioning path: starters must keep
4
+ * working without an implementation.
5
+ *
6
+ * The port is intentionally object-storage-shaped. Cloudflare R2, S3,
7
+ * filesystem, or a future hosted service can implement it without
8
+ * leaking adapter types into runtime use cases.
9
+ *
10
+ * # Scope: public bucket only
11
+ *
12
+ * `getPublicUrl()` returns an unconditional public URL; reads bypass
13
+ * the Worker (`MEDIA_PUBLIC_URL_BASE` → CDN → R2). `MediaAsset.publicUrl`
14
+ * is frozen at commit time and embedded directly into entry data
15
+ * (e.g. `posts.coverUrl`). For public assets the URL is permanent and
16
+ * the read path stays cheap.
17
+ *
18
+ * **Private content (subscription-gated, fan-club, signed-GET, etc.)
19
+ * is a separate port + separate R2 bucket in v0.2** — see ADR-0011
20
+ * § "Public vs private media — two buckets, two ports". The private
21
+ * port will live alongside this one (`PrivateMediaStorage`); current
22
+ * callers stay untouched. Don't bolt a `visibility` flag onto this
23
+ * port to retrofit private semantics — that's not the seam.
24
+ *
25
+ * Method-arg shapes use the `*Args` suffix (matching `EntryRepository`)
26
+ * to leave the `*Request` / `*Response` namespace for use-case DTOs in
27
+ * `usecase/dto/media/`.
28
+ */
29
+ export interface MediaStorage {
30
+ /** Create a short-lived direct-upload capability for a single object. */
31
+ createUpload(args: CreateUploadArgs): Promise<CreateUploadResult>;
32
+ /** Commit a previously-uploaded object after adapter metadata checks. */
33
+ commitUpload(args: CommitUploadArgs): Promise<MediaAsset>;
34
+ /** Resolve the stable public URL for an already committed asset. */
35
+ getPublicUrl(args: GetPublicUrlArgs): Promise<string>;
36
+ deleteAsset(args: DeleteAssetArgs): Promise<void>;
37
+ }
38
+ export interface CreateUploadArgs {
39
+ readonly filename: string;
40
+ readonly mimeType: string;
41
+ /** Already checked against `maxBytes` by the use case. Adapters may
42
+ * forward it as a `Content-Length` constraint when the backend
43
+ * supports it. */
44
+ readonly byteSize: number;
45
+ readonly maxBytes: number;
46
+ readonly purpose?: string;
47
+ readonly now: number;
48
+ readonly expiresAt: number;
49
+ readonly metadata?: Readonly<Record<string, string>>;
50
+ }
51
+ export interface CreateUploadResult {
52
+ readonly uploadId: string;
53
+ readonly method: "PUT";
54
+ readonly uploadUrl: string;
55
+ readonly storageKey: string;
56
+ readonly expiresAt: number;
57
+ readonly requiredHeaders?: Readonly<Record<string, string>>;
58
+ /** Optional preview of the eventual public URL. Commit remains authoritative. */
59
+ readonly publicUrl?: string;
60
+ }
61
+ /**
62
+ * Adapter contract: before returning `MediaAsset`, verify the stored
63
+ * object's actual content-type against `expectedMimeType` and actual
64
+ * byte size against `maxBytes`. The use case only validates caller-
65
+ * declared MIME, not the bytes that landed in storage — without
66
+ * adapter-side verification, a caller can declare `image/png` and PUT
67
+ * a PDF. Mismatch → throw `DiagnosticError(MEDIA_MIME_REJECTED)` or
68
+ * `MEDIA_SIZE_EXCEEDED`. (Use whichever metadata primitive the
69
+ * backend exposes: R2 / S3 `head()`, filesystem `stat()`.)
70
+ */
71
+ export interface CommitUploadArgs {
72
+ readonly uploadId: string;
73
+ readonly storageKey: string;
74
+ /** Adapter must verify stored object's actual content-type matches. */
75
+ readonly expectedMimeType: string;
76
+ /** Adapter must verify stored object's actual byte size ≤ this. */
77
+ readonly maxBytes: number;
78
+ readonly alt?: string;
79
+ readonly caption?: string;
80
+ readonly checksum?: string;
81
+ readonly now: number;
82
+ }
83
+ export interface GetPublicUrlArgs {
84
+ readonly assetId: string;
85
+ readonly storageKey: string;
86
+ }
87
+ export interface DeleteAssetArgs {
88
+ readonly assetId: string;
89
+ readonly storageKey: string;
90
+ }
91
+ export interface MediaAsset {
92
+ readonly id: string;
93
+ readonly storageKey: string;
94
+ readonly publicUrl: string;
95
+ readonly mimeType: string;
96
+ readonly byteSize: number;
97
+ readonly alt?: string;
98
+ readonly caption?: string;
99
+ readonly createdAt: number;
100
+ readonly metadata?: Readonly<Record<string, string>>;
101
+ }
102
+ //# sourceMappingURL=MediaStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaStorage.d.ts","sourceRoot":"","sources":["../../../src/domain/port/MediaStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAElE,yEAAyE;IACzE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1D,oEAAoE;IACpE,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;uBAEmB;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,iFAAiF;IACjF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=MediaStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaStorage.js","sourceRoot":"","sources":["../../../src/domain/port/MediaStorage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import type { SiteConfig } from "@aotter/mantle-spec";
2
+ import type { TemplateRegistry } from "../model/TemplateRegistry.js";
3
+ /**
4
+ * `PublishOrchestrator` — the publish-pipeline surface adapters call
5
+ * after a successful `requestPublish` to materialize HTML / `.md` /
6
+ * list pages / `llms.txt` into the `KvCache`.
7
+ *
8
+ * `TemplateRegistry` is consumer-supplied (`createCmsRuntime` accepts
9
+ * it); rendering is idempotent — two invocations with the same entry
10
+ * id are safe.
11
+ *
12
+ * The HTML implementation is in
13
+ * `infrastructure/render/HtmlPublishOrchestrator`.
14
+ */
15
+ export interface PublishOrchestrator {
16
+ publish(request: PublishEntryRequest): Promise<void>;
17
+ unpublish(request: PublishEntryRequest): Promise<void>;
18
+ }
19
+ export interface PublishEntryRequest {
20
+ readonly entryId: string;
21
+ readonly site: SiteConfig;
22
+ readonly templates: TemplateRegistry;
23
+ readonly htmlDoctype?: string;
24
+ }
25
+ //# sourceMappingURL=PublishOrchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishOrchestrator.d.ts","sourceRoot":"","sources":["../../../src/domain/port/PublishOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PublishOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishOrchestrator.js","sourceRoot":"","sources":["../../../src/domain/port/PublishOrchestrator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { SiteConfig, SiteDefaults } from "@aotter/mantle-spec";
2
+ /**
3
+ * `SiteConfigRepository` — the `site_config` row read/write surface
4
+ * the runtime exposes to render paths and `bootInit`.
5
+ *
6
+ * `seed` is called once during `bootInit` with the config-supplied
7
+ * `siteDefaults`; subsequent operator edits to the row are preserved
8
+ * (INSERT … ON CONFLICT DO NOTHING).
9
+ *
10
+ * `load` returns the merged view template authors and adapters see.
11
+ * `readLocales` exists separately because boot-time validation needs
12
+ * the locales list before the rest of the row is meaningful.
13
+ *
14
+ * The DB-backed implementation is in
15
+ * `infrastructure/persistence/DatabaseSiteConfigRepository`.
16
+ */
17
+ export interface SiteConfigRepository {
18
+ seed(defaults: SiteDefaults | undefined): Promise<void>;
19
+ load(): Promise<SiteConfig>;
20
+ readLocales(): Promise<readonly string[]>;
21
+ /** Declared media purpose taxonomy (`SiteConfig.media.purposes`).
22
+ * Empty array when the deployment didn't declare any — symmetric
23
+ * with "no `MediaStorage` configured" and used by the MCP tool
24
+ * catalog to gate `create_media_upload` / `commit_media_upload`. */
25
+ readMediaPurposes(): Promise<readonly string[]>;
26
+ }
27
+ //# sourceMappingURL=SiteConfigRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteConfigRepository.d.ts","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IAC1C;;;yEAGqE;IACrE,iBAAiB,IAAI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SiteConfigRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SiteConfigRepository.js","sourceRoot":"","sources":["../../../src/domain/port/SiteConfigRepository.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `domain/port/` — interface contracts the use cases depend on.
3
+ * Concrete implementations live in `infrastructure/` (or in adapter
4
+ * packages like `@aotter/mantle-cloudflare`).
5
+ *
6
+ * Required adapter ports — `DatabaseDriver`, `KvCache`, `AssetServer`.
7
+ * Optional feature ports — `MediaStorage` (public-bucket media
8
+ * uploads), `EmailSender` (transactional email — passwordless auth,
9
+ * receipts). Dispatcher-internal seams — `Clock`, `IdGenerator`,
10
+ * `HandlerRegistry`, `EntryRepository`. Identity / session / OAuth
11
+ * live outside the runtime via Better Auth (ADR-0014).
12
+ *
13
+ * Per the Aotter clean-architecture convention, no `*Port` suffix;
14
+ * ports are discoverable by the package alone.
15
+ */
16
+ export type { DatabaseDriver, PreparedStatement, RunResult, BatchResult, MigrationRunner, Migration, } from "./DatabaseDriver.js";
17
+ export type { KvCache, KvPutOptions, KvListResult } from "./KvCache.js";
18
+ export type { AssetServer } from "./AssetServer.js";
19
+ export type { EntryRepository, CreateEntryArgs, UpdateEntryArgs, DeleteEntryArgs, ArchiveEntryArgs, TransitionStatusArgs, ListEntriesArgs, ListEntriesResult, FindEntryByDataFieldArgs, FindEntryByDataFieldsArgs, MutationHookFields, } from "./EntryRepository.js";
20
+ export type { SiteConfigRepository } from "./SiteConfigRepository.js";
21
+ export type { PublishOrchestrator, PublishEntryRequest, } from "./PublishOrchestrator.js";
22
+ export type { MediaStorage, CreateUploadArgs, CreateUploadResult, CommitUploadArgs, GetPublicUrlArgs, DeleteAssetArgs, MediaAsset, } from "./MediaStorage.js";
23
+ export type { EmailSender, EmailSendArgs, } from "./EmailSender.js";
24
+ export type { LifecycleHookRunner, RunLifecycleHookRequest, } from "./LifecycleHookRunner.js";
25
+ export type { DeferredHookDispatcher, DeferredHookEnvelope, CtxSnapshot, } from "./DeferredHookDispatcher.js";
26
+ export { ctxSnapshotFrom } from "./DeferredHookDispatcher.js";
27
+ export { type Clock, SystemClock } from "./Clock.js";
28
+ export { type IdGenerator, RandomUuidGenerator } from "./IdGenerator.js";
29
+ export { type HandlerRegistry, InMemoryHandlerRegistry, buildHandlerRegistry, } from "./HandlerRegistry.js";
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/port/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,KAAK,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,KAAK,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EACL,KAAK,eAAe,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { ctxSnapshotFrom } from "./DeferredHookDispatcher.js";
2
+ export { SystemClock } from "./Clock.js";
3
+ export { RandomUuidGenerator } from "./IdGenerator.js";
4
+ export { InMemoryHandlerRegistry, buildHandlerRegistry, } from "./HandlerRegistry.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain/port/index.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAc,WAAW,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAoB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAEL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function absoluteUrl(origin: string, path: string): string;
2
+ /** Append `.md` before any query string / hash. Used by the SEO
3
+ * composer + sitemap to derive markdown-mirror URLs without
4
+ * mangling query params. */
5
+ export declare function appendMarkdownExt(absoluteOrPath: string): string;
6
+ //# sourceMappingURL=AbsoluteUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbsoluteUrl.d.ts","sourceRoot":"","sources":["../../../src/domain/service/AbsoluteUrl.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhE;AAED;;6BAE6B;AAC7B,wBAAgB,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAIhE"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Absolutize a path against a `SiteConfig.origin`. Single chokepoint
3
+ * so trailing-slash handling is consistent across every URL the SDK
4
+ * emits — sitemap, llms.txt mirrors, SEO canonical, hreflang siblings.
5
+ *
6
+ * Two divergent strip behaviors used to live across the codebase
7
+ * (`/\/$/` vs `/\/+$/`); both flow through here now.
8
+ *
9
+ * Empty `origin` returns the path unchanged — useful for tests and
10
+ * for templates that intentionally emit relative URLs. Already-
11
+ * absolute `path` (http(s)://...) returns unchanged.
12
+ */
13
+ const TRAILING_SLASHES = /\/+$/;
14
+ export function absoluteUrl(origin, path) {
15
+ if (!origin)
16
+ return path;
17
+ if (path.startsWith("http://") || path.startsWith("https://"))
18
+ return path;
19
+ const cleanOrigin = origin.replace(TRAILING_SLASHES, "");
20
+ if (!path)
21
+ return cleanOrigin;
22
+ return `${cleanOrigin}${path.startsWith("/") ? "" : "/"}${path}`;
23
+ }
24
+ /** Append `.md` before any query string / hash. Used by the SEO
25
+ * composer + sitemap to derive markdown-mirror URLs without
26
+ * mangling query params. */
27
+ export function appendMarkdownExt(absoluteOrPath) {
28
+ const match = /^([^?#]*)(.*)$/.exec(absoluteOrPath);
29
+ if (!match)
30
+ return `${absoluteOrPath}.md`;
31
+ return `${match[1]}.md${match[2]}`;
32
+ }
33
+ //# sourceMappingURL=AbsoluteUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbsoluteUrl.js","sourceRoot":"","sources":["../../../src/domain/service/AbsoluteUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,WAAW,CAAC;IAC9B,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC;AACnE,CAAC;AAED;;6BAE6B;AAC7B,MAAM,UAAU,iBAAiB,CAAC,cAAsB;IACtD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,cAAc,KAAK,CAAC;IAC1C,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type AuthPredicate, type Diagnostic, type Phase } from "@aotter/mantle-spec";
2
+ import type { HandlerContext } from "../model/HandlerContext.js";
3
+ /**
4
+ * Pure auth-predicate evaluator. Shared by `InvokeProcedureUseCase`
5
+ * and `ExecuteViewUseCase` so the `requires.auth.all` semantics in the
6
+ * manifest grammar produce identical runtime behavior across atoms.
7
+ *
8
+ * The closed predicate vocabulary (`ctx.user`, `{ ctx.staff: [<role>] }`)
9
+ * is enforced at parse time; this evaluator trusts the shape and only
10
+ * checks against the live `HandlerContext`.
11
+ *
12
+ * Domain-pure: no IO, no port deps. Lives in `domain/service/` because
13
+ * both the procedure and view use cases need it; placing it in either
14
+ * use case would create a usecase→usecase coupling.
15
+ */
16
+ export interface AuthRequires {
17
+ readonly auth?: {
18
+ readonly all: readonly AuthPredicate[];
19
+ };
20
+ }
21
+ /**
22
+ * Evaluate `requires.auth.all` against `ctx`. Returns `null` when
23
+ * authorization passes (or no `requires.auth.all` is declared), or an
24
+ * `AUTH_DENIED` Diagnostic naming the first failing predicate.
25
+ */
26
+ export declare function evaluateAuthAll(requires: AuthRequires | undefined, ctx: HandlerContext, path: string, phase: Phase): Diagnostic | null;
27
+ export declare function evaluatePredicate(pred: AuthPredicate, ctx: HandlerContext): boolean;
28
+ export declare function describePredicate(pred: AuthPredicate): string;
29
+ //# sourceMappingURL=AuthPredicateEvaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthPredicateEvaluator.d.ts","sourceRoot":"","sources":["../../../src/domain/service/AuthPredicateEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,KAAK,EACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,aAAa,EAAE,CAAA;KAAE,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,GACX,UAAU,GAAG,IAAI,CAiBnB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAOnF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAU7D"}
@@ -0,0 +1,48 @@
1
+ import { makeDiagnostic, } from "@aotter/mantle-spec";
2
+ /**
3
+ * Evaluate `requires.auth.all` against `ctx`. Returns `null` when
4
+ * authorization passes (or no `requires.auth.all` is declared), or an
5
+ * `AUTH_DENIED` Diagnostic naming the first failing predicate.
6
+ */
7
+ export function evaluateAuthAll(requires, ctx, path, phase) {
8
+ const all = requires?.auth?.all;
9
+ if (!all || all.length === 0)
10
+ return null;
11
+ for (let i = 0; i < all.length; i++) {
12
+ const pred = all[i];
13
+ if (!evaluatePredicate(pred, ctx)) {
14
+ return makeDiagnostic({
15
+ code: "AUTH_DENIED",
16
+ phase,
17
+ severity: "error",
18
+ path: `${path}#/requires/auth/all/${i}`,
19
+ expected: describePredicate(pred),
20
+ message: `Authorization predicate not satisfied: ${describePredicate(pred)}.`,
21
+ });
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ export function evaluatePredicate(pred, ctx) {
27
+ if (pred === "ctx.user")
28
+ return ctx.user !== null;
29
+ if (typeof pred === "object" && pred !== null && "ctx.staff" in pred) {
30
+ if (!ctx.staff)
31
+ return false;
32
+ return pred["ctx.staff"].includes(ctx.staff.role);
33
+ }
34
+ return false;
35
+ }
36
+ export function describePredicate(pred) {
37
+ if (pred === "ctx.user")
38
+ return "caller is signed in (ctx.user)";
39
+ if (typeof pred === "object" && pred !== null && "ctx.staff" in pred) {
40
+ return `caller is staff with role in [${pred["ctx.staff"].join(", ")}]`;
41
+ }
42
+ // Exhaustive: if AuthPredicate gains a variant the parser admits but
43
+ // this function doesn't yet recognise, fail loud rather than throw
44
+ // on a downstream key access.
45
+ const _exhaustive = pred;
46
+ throw new Error(`describePredicate: unrecognised AuthPredicate ${JSON.stringify(_exhaustive)}`);
47
+ }
48
+ //# sourceMappingURL=AuthPredicateEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthPredicateEvaluator.js","sourceRoot":"","sources":["../../../src/domain/service/AuthPredicateEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,qBAAqB,CAAC;AAqB7B;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAkC,EAClC,GAAmB,EACnB,IAAY,EACZ,KAAY;IAEZ,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,cAAc,CAAC;gBACpB,IAAI,EAAE,aAAa;gBACnB,KAAK;gBACL,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,GAAG,IAAI,uBAAuB,CAAC,EAAE;gBACvC,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC;gBACjC,OAAO,EAAE,0CAA0C,iBAAiB,CAAC,IAAI,CAAC,GAAG;aAC9E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,GAAmB;IACxE,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAmB;IACnD,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,gCAAgC,CAAC;IACjE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACrE,OAAO,iCAAiC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E,CAAC;IACD,qEAAqE;IACrE,mEAAmE;IACnE,8BAA8B;IAC9B,MAAM,WAAW,GAAU,IAAI,CAAC;IAChC,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAClG,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { type SchemaManifest } from "@aotter/mantle-spec";
2
+ import type { HandlerContext } from "../model/HandlerContext.js";
3
+ /**
4
+ * Builtin op input projection + `x-clam-bind` stamping (POC ADR-0014).
5
+ *
6
+ * Two transforms applied to `Procedure.input` before it lands in
7
+ * `EntryRepository`:
8
+ *
9
+ * 1. **Projection**: copy only the keys declared on the target
10
+ * Schema's `spec.schema.properties`. Side-channel fields (CAPTCHA
11
+ * tokens, hCaptcha challenges, etc.) declared in the Procedure's
12
+ * input but not in the Schema's properties are silently dropped
13
+ * from the row. They remain available to lifecycle hooks via
14
+ * `ctx.event.originalInput`.
15
+ *
16
+ * 2. **Stamping**: any Schema property carrying `x-clam-bind: <value>`
17
+ * gets its value computed at write time:
18
+ * - `ctx.user` → `ctx.user?.id ?? null`
19
+ * - `ctx.staff` → `ctx.staff?.id ?? null`
20
+ * - `now` → `clockNow` (caller-supplied; lets the use case
21
+ * share its `Clock` so created/updated stamps line up)
22
+ *
23
+ * Stamping overrides whatever the caller passed for that key —
24
+ * declarative server-stamping is the contract.
25
+ *
26
+ * Pure stateless service — no I/O. Lives in `domain/service/`.
27
+ */
28
+ export interface ProjectAndStampArgs {
29
+ readonly schema: SchemaManifest;
30
+ readonly input: Record<string, unknown>;
31
+ readonly ctx: HandlerContext;
32
+ readonly clockNow: number;
33
+ }
34
+ export declare function projectAndStamp(args: ProjectAndStampArgs): Record<string, unknown>;
35
+ export interface ProjectUpdateAndStampArgs {
36
+ readonly schema: SchemaManifest;
37
+ readonly existing: Record<string, unknown>;
38
+ readonly patch: Record<string, unknown>;
39
+ readonly ctx: HandlerContext;
40
+ readonly clockNow: number;
41
+ }
42
+ /**
43
+ * Project update data through the same Schema-declared field allowlist
44
+ * while preserving existing server-stamped values. This keeps direct
45
+ * authoring paths (MCP/admin) from accepting arbitrary blob keys, but
46
+ * avoids turning `x-clam-bind: now` fields into "update timestamp"
47
+ * fields on every draft edit.
48
+ */
49
+ export declare function projectUpdateAndStamp(args: ProjectUpdateAndStampArgs): Record<string, unknown>;
50
+ //# sourceMappingURL=BuiltinProjector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuiltinProjector.d.ts","sourceRoot":"","sources":["../../../src/domain/service/BuiltinProjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAelF;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkB9F"}
@@ -0,0 +1,61 @@
1
+ import { CLAM_BIND_KEYWORD, CLAM_BIND_VALUES, } from "@aotter/mantle-spec";
2
+ export function projectAndStamp(args) {
3
+ const properties = args.schema.spec.schema.properties ?? {};
4
+ const out = {};
5
+ for (const [key, propDef] of Object.entries(properties)) {
6
+ const bind = bindValueOf(propDef);
7
+ if (bind) {
8
+ out[key] = computeBind(bind, args.ctx, args.clockNow);
9
+ continue;
10
+ }
11
+ if (key in args.input) {
12
+ out[key] = args.input[key];
13
+ }
14
+ }
15
+ return out;
16
+ }
17
+ /**
18
+ * Project update data through the same Schema-declared field allowlist
19
+ * while preserving existing server-stamped values. This keeps direct
20
+ * authoring paths (MCP/admin) from accepting arbitrary blob keys, but
21
+ * avoids turning `x-clam-bind: now` fields into "update timestamp"
22
+ * fields on every draft edit.
23
+ */
24
+ export function projectUpdateAndStamp(args) {
25
+ const properties = args.schema.spec.schema.properties ?? {};
26
+ const merged = { ...args.existing, ...args.patch };
27
+ const out = {};
28
+ for (const [key, propDef] of Object.entries(properties)) {
29
+ const bind = bindValueOf(propDef);
30
+ if (bind) {
31
+ out[key] = key in args.existing
32
+ ? args.existing[key]
33
+ : computeBind(bind, args.ctx, args.clockNow);
34
+ continue;
35
+ }
36
+ if (key in merged) {
37
+ out[key] = merged[key];
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ function bindValueOf(propDef) {
43
+ if (typeof propDef !== "object" || propDef === null)
44
+ return undefined;
45
+ const v = propDef[CLAM_BIND_KEYWORD];
46
+ if (typeof v === "string" && CLAM_BIND_VALUES.includes(v)) {
47
+ return v;
48
+ }
49
+ return undefined;
50
+ }
51
+ function computeBind(bind, ctx, clockNow) {
52
+ switch (bind) {
53
+ case "ctx.user":
54
+ return ctx.user?.id ?? null;
55
+ case "ctx.staff":
56
+ return ctx.staff?.id ?? null;
57
+ case "now":
58
+ return clockNow;
59
+ }
60
+ }
61
+ //# sourceMappingURL=BuiltinProjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuiltinProjector.js","sourceRoot":"","sources":["../../../src/domain/service/BuiltinProjector.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,GAGjB,MAAM,qBAAqB,CAAC;AAmC7B,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,UAAU,GACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAmD,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,SAAS;QACX,CAAC;QACD,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA+B;IACnE,MAAM,UAAU,GACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAmD,CAAC,UAAU,IAAI,EAAE,CAAC;IACzF,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IACnD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ;gBAC7B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,CAAC,GAAI,OAAmC,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAK,gBAAsC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,CAAkB,CAAC;IAC5B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,GAAmB,EAAE,QAAgB;IAC7E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;QAC9B,KAAK,WAAW;YACd,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,CAAC;QAC/B,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Entry, SiteConfig } from "@aotter/mantle-spec";
2
+ import type { SeoMeta } from "../model/SeoMeta.js";
3
+ import type { PublicPathResolver } from "./PublicPathResolver.js";
4
+ /**
5
+ * Structural shape of the SEO-meta composer the render pipeline
6
+ * accepts. Lives in `domain/service/` (not `usecase/render/`) so
7
+ * infrastructure code — notably `HtmlPublishOrchestrator` — can
8
+ * import this helper without crossing the `infrastructure→usecase`
9
+ * boundary that CLAUDE.md forbids.
10
+ *
11
+ * The runtime assembly root wires in `ComposeEntrySeoMetaUseCase`
12
+ * which satisfies this shape; tests may pass a hand-rolled stub.
13
+ */
14
+ export interface SeoComposer {
15
+ execute(args: {
16
+ readonly entry: Entry;
17
+ readonly site: SiteConfig;
18
+ readonly paths: PublicPathResolver;
19
+ }): Promise<SeoMeta>;
20
+ }
21
+ /**
22
+ * Shared "compose if the entry has a public URL" predicate. Keeps the
23
+ * three callers (`RenderEntryLiveUseCase`, `PreviewEntryUseCase`,
24
+ * `HtmlPublishOrchestrator`) from re-inlining the same null-check.
25
+ */
26
+ export declare function composeSeoIfPathed(composer: SeoComposer, paths: PublicPathResolver | null, entry: Entry, site: SiteConfig): Promise<SeoMeta | undefined>;
27
+ //# sourceMappingURL=EntrySeoSupport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntrySeoSupport.d.ts","sourceRoot":"","sources":["../../../src/domain/service/EntrySeoSupport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,IAAI,EAAE;QACZ,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;KACpC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAI9B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Shared "compose if the entry has a public URL" predicate. Keeps the
3
+ * three callers (`RenderEntryLiveUseCase`, `PreviewEntryUseCase`,
4
+ * `HtmlPublishOrchestrator`) from re-inlining the same null-check.
5
+ */
6
+ export async function composeSeoIfPathed(composer, paths, entry, site) {
7
+ if (!paths)
8
+ return undefined;
9
+ if (!paths.forEntry(entry))
10
+ return undefined;
11
+ return composer.execute({ entry, site, paths });
12
+ }
13
+ //# sourceMappingURL=EntrySeoSupport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntrySeoSupport.js","sourceRoot":"","sources":["../../../src/domain/service/EntrySeoSupport.ts"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqB,EACrB,KAAgC,EAChC,KAAY,EACZ,IAAgB;IAEhB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Entry, SiteConfig } from "@aotter/mantle-spec";
2
+ import type { TemplateRegistry } from "../model/TemplateRegistry.js";
3
+ import type { SeoMeta } from "../model/SeoMeta.js";
4
+ export interface RenderEntryArgs {
5
+ readonly entry: Entry;
6
+ readonly site: SiteConfig;
7
+ readonly templates: TemplateRegistry;
8
+ /** Defaults to `<!doctype html>`. Pipelines that want the
9
+ * upper-case `<!DOCTYPE html>\n` shape pass it explicitly. */
10
+ readonly doctype?: string;
11
+ /** Optional pre-composed SEO/AEO block. Threaded into the
12
+ * `EntryContext.seo` field so templates can emit `<SeoTags
13
+ * seo={seo}/>` inside `<head>`. Renderers that skip composition
14
+ * leave it undefined — opt-out templates keep working. */
15
+ readonly seo?: SeoMeta;
16
+ }
17
+ /** Returns the full HTML doc (doctype + body) or `null` if no entry
18
+ * template is registered for `entry.collection`. */
19
+ export declare function renderEntryHtml(args: RenderEntryArgs): string | null;
20
+ export interface RenderListArgs {
21
+ readonly collection: string;
22
+ readonly locale: string;
23
+ readonly entries: ReadonlyArray<Entry>;
24
+ readonly site: SiteConfig;
25
+ readonly templates: TemplateRegistry;
26
+ readonly doctype?: string;
27
+ readonly seo?: SeoMeta;
28
+ }
29
+ /** Returns the full HTML doc or `null` if no list template is
30
+ * registered for `collection`. */
31
+ export declare function renderListHtml(args: RenderListArgs): string | null;
32
+ //# sourceMappingURL=HtmlRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlRenderer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/HtmlRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAgBnD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC;mEAC+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;+DAG2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;qDACqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CASpE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;mCACmC;AACnC,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAalE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pure render functions over the consumer-supplied template registry.
3
+ * Used by:
4
+ * - `HtmlPublishOrchestrator` (publish-time → write KV)
5
+ * - request-time route handlers in adapters (live-render bypass,
6
+ * preview surface)
7
+ *
8
+ * Both call sites previously inlined the template-lookup + doctype
9
+ * concatenation. Extracting here keeps the contract single-sourced
10
+ * — adding a doctype mode, an OG-meta wrapper, or a per-collection
11
+ * pre/post hook is one edit. No I/O; no DB; no env access.
12
+ */
13
+ const DEFAULT_DOCTYPE = "<!doctype html>";
14
+ /** Returns the full HTML doc (doctype + body) or `null` if no entry
15
+ * template is registered for `entry.collection`. */
16
+ export function renderEntryHtml(args) {
17
+ const tpl = args.templates.getEntryTemplate(args.entry.collection);
18
+ if (!tpl)
19
+ return null;
20
+ return ((args.doctype ?? DEFAULT_DOCTYPE) +
21
+ tpl({ entry: args.entry, site: args.site, seo: args.seo }));
22
+ }
23
+ /** Returns the full HTML doc or `null` if no list template is
24
+ * registered for `collection`. */
25
+ export function renderListHtml(args) {
26
+ const tpl = args.templates.getListTemplate(args.collection);
27
+ if (!tpl)
28
+ return null;
29
+ return ((args.doctype ?? DEFAULT_DOCTYPE) +
30
+ tpl({
31
+ collection: args.collection,
32
+ locale: args.locale,
33
+ entries: args.entries,
34
+ site: args.site,
35
+ seo: args.seo,
36
+ }));
37
+ }
38
+ //# sourceMappingURL=HtmlRenderer.js.map