gazetta 0.7.0 → 0.8.0

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 (738) hide show
  1. package/admin-dist/assets/index-CBeq0rRb.js +693 -0
  2. package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
  3. package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
  4. package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
  5. package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
  6. package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
  7. package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
  8. package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
  9. package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
  10. package/admin-dist/index.html +8 -8
  11. package/admin-dist/sw.js +1 -0
  12. package/dist/admin-api/archived-name-conflict.d.ts +31 -0
  13. package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
  14. package/dist/admin-api/archived-name-conflict.js +226 -0
  15. package/dist/admin-api/archived-name-conflict.js.map +1 -0
  16. package/dist/admin-api/cache-stats-logger.d.ts +83 -0
  17. package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
  18. package/dist/admin-api/cache-stats-logger.js +59 -0
  19. package/dist/admin-api/cache-stats-logger.js.map +1 -0
  20. package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
  21. package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
  22. package/dist/admin-api/hook-audit-emitter.js +21 -0
  23. package/dist/admin-api/hook-audit-emitter.js.map +1 -0
  24. package/dist/admin-api/index.d.ts +84 -0
  25. package/dist/admin-api/index.d.ts.map +1 -1
  26. package/dist/admin-api/index.js +254 -9
  27. package/dist/admin-api/index.js.map +1 -1
  28. package/dist/admin-api/middleware/audit.d.ts +25 -0
  29. package/dist/admin-api/middleware/audit.d.ts.map +1 -0
  30. package/dist/admin-api/middleware/audit.js +65 -0
  31. package/dist/admin-api/middleware/audit.js.map +1 -0
  32. package/dist/admin-api/middleware/capability.d.ts +8 -0
  33. package/dist/admin-api/middleware/capability.d.ts.map +1 -0
  34. package/dist/admin-api/middleware/capability.js +65 -0
  35. package/dist/admin-api/middleware/capability.js.map +1 -0
  36. package/dist/admin-api/middleware/principal.d.ts +18 -0
  37. package/dist/admin-api/middleware/principal.d.ts.map +1 -0
  38. package/dist/admin-api/middleware/principal.js +128 -0
  39. package/dist/admin-api/middleware/principal.js.map +1 -0
  40. package/dist/admin-api/routes/archive-review.d.ts +80 -0
  41. package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
  42. package/dist/admin-api/routes/archive-review.js +70 -0
  43. package/dist/admin-api/routes/archive-review.js.map +1 -0
  44. package/dist/admin-api/routes/archive.d.ts +145 -0
  45. package/dist/admin-api/routes/archive.d.ts.map +1 -0
  46. package/dist/admin-api/routes/archive.js +540 -0
  47. package/dist/admin-api/routes/archive.js.map +1 -0
  48. package/dist/admin-api/routes/assets.d.ts +6 -1
  49. package/dist/admin-api/routes/assets.d.ts.map +1 -1
  50. package/dist/admin-api/routes/assets.js +167 -14
  51. package/dist/admin-api/routes/assets.js.map +1 -1
  52. package/dist/admin-api/routes/audit.d.ts +71 -0
  53. package/dist/admin-api/routes/audit.d.ts.map +1 -0
  54. package/dist/admin-api/routes/audit.js +178 -0
  55. package/dist/admin-api/routes/audit.js.map +1 -0
  56. package/dist/admin-api/routes/compare.d.ts.map +1 -1
  57. package/dist/admin-api/routes/compare.js +3 -2
  58. package/dist/admin-api/routes/compare.js.map +1 -1
  59. package/dist/admin-api/routes/fields.d.ts.map +1 -1
  60. package/dist/admin-api/routes/fields.js +2 -1
  61. package/dist/admin-api/routes/fields.js.map +1 -1
  62. package/dist/admin-api/routes/fragments.d.ts +13 -1
  63. package/dist/admin-api/routes/fragments.d.ts.map +1 -1
  64. package/dist/admin-api/routes/fragments.js +127 -92
  65. package/dist/admin-api/routes/fragments.js.map +1 -1
  66. package/dist/admin-api/routes/health.d.ts +60 -0
  67. package/dist/admin-api/routes/health.d.ts.map +1 -0
  68. package/dist/admin-api/routes/health.js +65 -0
  69. package/dist/admin-api/routes/health.js.map +1 -0
  70. package/dist/admin-api/routes/history.d.ts +2 -1
  71. package/dist/admin-api/routes/history.d.ts.map +1 -1
  72. package/dist/admin-api/routes/history.js +26 -4
  73. package/dist/admin-api/routes/history.js.map +1 -1
  74. package/dist/admin-api/routes/pages.d.ts +20 -1
  75. package/dist/admin-api/routes/pages.d.ts.map +1 -1
  76. package/dist/admin-api/routes/pages.js +157 -117
  77. package/dist/admin-api/routes/pages.js.map +1 -1
  78. package/dist/admin-api/routes/preview.d.ts.map +1 -1
  79. package/dist/admin-api/routes/preview.js +56 -17
  80. package/dist/admin-api/routes/preview.js.map +1 -1
  81. package/dist/admin-api/routes/publish.d.ts +19 -1
  82. package/dist/admin-api/routes/publish.d.ts.map +1 -1
  83. package/dist/admin-api/routes/publish.js +508 -92
  84. package/dist/admin-api/routes/publish.js.map +1 -1
  85. package/dist/admin-api/routes/rename.d.ts +62 -0
  86. package/dist/admin-api/routes/rename.d.ts.map +1 -0
  87. package/dist/admin-api/routes/rename.js +366 -0
  88. package/dist/admin-api/routes/rename.js.map +1 -0
  89. package/dist/admin-api/routes/site.d.ts.map +1 -1
  90. package/dist/admin-api/routes/site.js +6 -18
  91. package/dist/admin-api/routes/site.js.map +1 -1
  92. package/dist/admin-api/routes/system.d.ts +23 -0
  93. package/dist/admin-api/routes/system.d.ts.map +1 -0
  94. package/dist/admin-api/routes/system.js +115 -0
  95. package/dist/admin-api/routes/system.js.map +1 -0
  96. package/dist/admin-api/routes/templates.d.ts +11 -1
  97. package/dist/admin-api/routes/templates.d.ts.map +1 -1
  98. package/dist/admin-api/routes/templates.js +36 -3
  99. package/dist/admin-api/routes/templates.js.map +1 -1
  100. package/dist/admin-api/routes/validation.d.ts +47 -0
  101. package/dist/admin-api/routes/validation.d.ts.map +1 -0
  102. package/dist/admin-api/routes/validation.js +120 -0
  103. package/dist/admin-api/routes/validation.js.map +1 -0
  104. package/dist/admin-api/schemas/archive.d.ts +124 -0
  105. package/dist/admin-api/schemas/archive.d.ts.map +1 -0
  106. package/dist/admin-api/schemas/archive.js +93 -0
  107. package/dist/admin-api/schemas/archive.js.map +1 -0
  108. package/dist/admin-api/schemas/assets.d.ts +16 -0
  109. package/dist/admin-api/schemas/assets.d.ts.map +1 -1
  110. package/dist/admin-api/schemas/assets.js +15 -0
  111. package/dist/admin-api/schemas/assets.js.map +1 -1
  112. package/dist/admin-api/schemas/audit.d.ts +175 -0
  113. package/dist/admin-api/schemas/audit.d.ts.map +1 -0
  114. package/dist/admin-api/schemas/audit.js +91 -0
  115. package/dist/admin-api/schemas/audit.js.map +1 -0
  116. package/dist/admin-api/schemas/error.d.ts +94 -0
  117. package/dist/admin-api/schemas/error.d.ts.map +1 -0
  118. package/dist/admin-api/schemas/error.js +79 -0
  119. package/dist/admin-api/schemas/error.js.map +1 -0
  120. package/dist/admin-api/schemas/fragments.d.ts +2 -0
  121. package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
  122. package/dist/admin-api/schemas/fragments.js +4 -0
  123. package/dist/admin-api/schemas/fragments.js.map +1 -1
  124. package/dist/admin-api/schemas/index.d.ts +8 -0
  125. package/dist/admin-api/schemas/index.d.ts.map +1 -1
  126. package/dist/admin-api/schemas/index.js +8 -0
  127. package/dist/admin-api/schemas/index.js.map +1 -1
  128. package/dist/admin-api/schemas/pages.d.ts +2 -0
  129. package/dist/admin-api/schemas/pages.d.ts.map +1 -1
  130. package/dist/admin-api/schemas/pages.js +11 -0
  131. package/dist/admin-api/schemas/pages.js.map +1 -1
  132. package/dist/admin-api/schemas/rename.d.ts +77 -0
  133. package/dist/admin-api/schemas/rename.d.ts.map +1 -0
  134. package/dist/admin-api/schemas/rename.js +75 -0
  135. package/dist/admin-api/schemas/rename.js.map +1 -0
  136. package/dist/admin-api/schemas/site.d.ts +3 -2
  137. package/dist/admin-api/schemas/site.d.ts.map +1 -1
  138. package/dist/admin-api/schemas/site.js +3 -2
  139. package/dist/admin-api/schemas/site.js.map +1 -1
  140. package/dist/admin-api/schemas/system.d.ts +28 -0
  141. package/dist/admin-api/schemas/system.d.ts.map +1 -0
  142. package/dist/admin-api/schemas/system.js +35 -0
  143. package/dist/admin-api/schemas/system.js.map +1 -0
  144. package/dist/admin-api/schemas/targets.d.ts +55 -0
  145. package/dist/admin-api/schemas/targets.d.ts.map +1 -1
  146. package/dist/admin-api/schemas/targets.js +46 -0
  147. package/dist/admin-api/schemas/targets.js.map +1 -1
  148. package/dist/admin-api/schemas/templates.d.ts +54 -0
  149. package/dist/admin-api/schemas/templates.d.ts.map +1 -1
  150. package/dist/admin-api/schemas/templates.js +21 -0
  151. package/dist/admin-api/schemas/templates.js.map +1 -1
  152. package/dist/admin-api/schemas/validation.d.ts +101 -0
  153. package/dist/admin-api/schemas/validation.d.ts.map +1 -0
  154. package/dist/admin-api/schemas/validation.js +57 -0
  155. package/dist/admin-api/schemas/validation.js.map +1 -0
  156. package/dist/admin-api/source-context.d.ts +66 -10
  157. package/dist/admin-api/source-context.d.ts.map +1 -1
  158. package/dist/admin-api/source-context.js +43 -5
  159. package/dist/admin-api/source-context.js.map +1 -1
  160. package/dist/ai/adapter-scaffold.d.ts +63 -0
  161. package/dist/ai/adapter-scaffold.d.ts.map +1 -0
  162. package/dist/ai/adapter-scaffold.js +89 -0
  163. package/dist/ai/adapter-scaffold.js.map +1 -0
  164. package/dist/ai/compose-prompt.d.ts +50 -0
  165. package/dist/ai/compose-prompt.d.ts.map +1 -0
  166. package/dist/ai/compose-prompt.js +49 -0
  167. package/dist/ai/compose-prompt.js.map +1 -0
  168. package/dist/ai/errors.d.ts +65 -0
  169. package/dist/ai/errors.d.ts.map +1 -0
  170. package/dist/ai/errors.js +59 -0
  171. package/dist/ai/errors.js.map +1 -0
  172. package/dist/ai/index.d.ts +17 -0
  173. package/dist/ai/index.d.ts.map +1 -0
  174. package/dist/ai/index.js +16 -0
  175. package/dist/ai/index.js.map +1 -0
  176. package/dist/ai/provider.d.ts +76 -0
  177. package/dist/ai/provider.d.ts.map +1 -0
  178. package/dist/ai/provider.js +13 -0
  179. package/dist/ai/provider.js.map +1 -0
  180. package/dist/ai/refusal.d.ts +50 -0
  181. package/dist/ai/refusal.d.ts.map +1 -0
  182. package/dist/ai/refusal.js +100 -0
  183. package/dist/ai/refusal.js.map +1 -0
  184. package/dist/ai/vision-prep.d.ts +32 -0
  185. package/dist/ai/vision-prep.d.ts.map +1 -0
  186. package/dist/ai/vision-prep.js +113 -0
  187. package/dist/ai/vision-prep.js.map +1 -0
  188. package/dist/alt/adapter.d.ts +140 -0
  189. package/dist/alt/adapter.d.ts.map +1 -0
  190. package/dist/alt/adapter.js +7 -0
  191. package/dist/alt/adapter.js.map +1 -0
  192. package/dist/alt/anthropic.d.ts +63 -0
  193. package/dist/alt/anthropic.d.ts.map +1 -0
  194. package/dist/alt/anthropic.js +147 -0
  195. package/dist/alt/anthropic.js.map +1 -0
  196. package/dist/alt/config.d.ts +67 -0
  197. package/dist/alt/config.d.ts.map +1 -0
  198. package/dist/alt/config.js +41 -0
  199. package/dist/alt/config.js.map +1 -0
  200. package/dist/alt/factory.d.ts +19 -0
  201. package/dist/alt/factory.d.ts.map +1 -0
  202. package/dist/alt/factory.js +69 -0
  203. package/dist/alt/factory.js.map +1 -0
  204. package/dist/alt/null-adapter.d.ts +3 -0
  205. package/dist/alt/null-adapter.d.ts.map +1 -0
  206. package/dist/alt/null-adapter.js +43 -0
  207. package/dist/alt/null-adapter.js.map +1 -0
  208. package/dist/alt/ollama.d.ts +40 -0
  209. package/dist/alt/ollama.d.ts.map +1 -0
  210. package/dist/alt/ollama.js +139 -0
  211. package/dist/alt/ollama.js.map +1 -0
  212. package/dist/alt/openai.d.ts +46 -0
  213. package/dist/alt/openai.d.ts.map +1 -0
  214. package/dist/alt/openai.js +118 -0
  215. package/dist/alt/openai.js.map +1 -0
  216. package/dist/alt/prompt-policies.d.ts +79 -0
  217. package/dist/alt/prompt-policies.d.ts.map +1 -0
  218. package/dist/alt/prompt-policies.js +67 -0
  219. package/dist/alt/prompt-policies.js.map +1 -0
  220. package/dist/alt/route-handler.d.ts +56 -0
  221. package/dist/alt/route-handler.d.ts.map +1 -0
  222. package/dist/alt/route-handler.js +122 -0
  223. package/dist/alt/route-handler.js.map +1 -0
  224. package/dist/alt/suggester.d.ts +57 -0
  225. package/dist/alt/suggester.d.ts.map +1 -0
  226. package/dist/alt/suggester.js +133 -0
  227. package/dist/alt/suggester.js.map +1 -0
  228. package/dist/app.js +1 -1
  229. package/dist/app.js.map +1 -1
  230. package/dist/archive-aliases.d.ts +79 -0
  231. package/dist/archive-aliases.d.ts.map +1 -0
  232. package/dist/archive-aliases.js +60 -0
  233. package/dist/archive-aliases.js.map +1 -0
  234. package/dist/archive-helpers.d.ts +73 -0
  235. package/dist/archive-helpers.d.ts.map +1 -0
  236. package/dist/archive-helpers.js +94 -0
  237. package/dist/archive-helpers.js.map +1 -0
  238. package/dist/assets/find-refs.d.ts +1 -1
  239. package/dist/assets/find-refs.js +1 -1
  240. package/dist/assets/find-refs.js.map +1 -1
  241. package/dist/assets/rename.js +1 -1
  242. package/dist/assets/rename.js.map +1 -1
  243. package/dist/assets/replace.js +1 -1
  244. package/dist/assets/replace.js.map +1 -1
  245. package/dist/assets/resolve.js +4 -4
  246. package/dist/assets/resolve.js.map +1 -1
  247. package/dist/assets/serve-route.js +2 -2
  248. package/dist/assets/serve-route.js.map +1 -1
  249. package/dist/assets/validate.d.ts +1 -1
  250. package/dist/assets/validate.js +1 -1
  251. package/dist/audit/config.d.ts +75 -0
  252. package/dist/audit/config.d.ts.map +1 -0
  253. package/dist/audit/config.js +91 -0
  254. package/dist/audit/config.js.map +1 -0
  255. package/dist/audit/context.d.ts +98 -0
  256. package/dist/audit/context.d.ts.map +1 -0
  257. package/dist/audit/context.js +51 -0
  258. package/dist/audit/context.js.map +1 -0
  259. package/dist/audit/errors.d.ts +73 -0
  260. package/dist/audit/errors.d.ts.map +1 -0
  261. package/dist/audit/errors.js +78 -0
  262. package/dist/audit/errors.js.map +1 -0
  263. package/dist/audit/index.d.ts +16 -0
  264. package/dist/audit/index.d.ts.map +1 -0
  265. package/dist/audit/index.js +10 -0
  266. package/dist/audit/index.js.map +1 -0
  267. package/dist/audit/provider.d.ts +73 -0
  268. package/dist/audit/provider.d.ts.map +1 -0
  269. package/dist/audit/provider.js +2 -0
  270. package/dist/audit/provider.js.map +1 -0
  271. package/dist/audit/providers/history.d.ts +66 -0
  272. package/dist/audit/providers/history.d.ts.map +1 -0
  273. package/dist/audit/providers/history.js +102 -0
  274. package/dist/audit/providers/history.js.map +1 -0
  275. package/dist/audit/pseudonymize.d.ts +26 -0
  276. package/dist/audit/pseudonymize.d.ts.map +1 -0
  277. package/dist/audit/pseudonymize.js +86 -0
  278. package/dist/audit/pseudonymize.js.map +1 -0
  279. package/dist/audit/recorder.d.ts +102 -0
  280. package/dist/audit/recorder.d.ts.map +1 -0
  281. package/dist/audit/recorder.js +55 -0
  282. package/dist/audit/recorder.js.map +1 -0
  283. package/dist/audit/retention.d.ts +83 -0
  284. package/dist/audit/retention.d.ts.map +1 -0
  285. package/dist/audit/retention.js +142 -0
  286. package/dist/audit/retention.js.map +1 -0
  287. package/dist/audit/source-ip.d.ts +32 -0
  288. package/dist/audit/source-ip.d.ts.map +1 -0
  289. package/dist/audit/source-ip.js +164 -0
  290. package/dist/audit/source-ip.js.map +1 -0
  291. package/dist/audit/types.d.ts +143 -0
  292. package/dist/audit/types.d.ts.map +1 -0
  293. package/dist/audit/types.js +33 -0
  294. package/dist/audit/types.js.map +1 -0
  295. package/dist/audit/user-agent.d.ts +28 -0
  296. package/dist/audit/user-agent.d.ts.map +1 -0
  297. package/dist/audit/user-agent.js +63 -0
  298. package/dist/audit/user-agent.js.map +1 -0
  299. package/dist/auth/capabilities.d.ts +28 -0
  300. package/dist/auth/capabilities.d.ts.map +1 -0
  301. package/dist/auth/capabilities.js +101 -0
  302. package/dist/auth/capabilities.js.map +1 -0
  303. package/dist/auth/config.d.ts +109 -0
  304. package/dist/auth/config.d.ts.map +1 -0
  305. package/dist/auth/config.js +221 -0
  306. package/dist/auth/config.js.map +1 -0
  307. package/dist/auth/errors.d.ts +72 -0
  308. package/dist/auth/errors.d.ts.map +1 -0
  309. package/dist/auth/errors.js +78 -0
  310. package/dist/auth/errors.js.map +1 -0
  311. package/dist/auth/factory.d.ts +43 -0
  312. package/dist/auth/factory.d.ts.map +1 -0
  313. package/dist/auth/factory.js +48 -0
  314. package/dist/auth/factory.js.map +1 -0
  315. package/dist/auth/index.d.ts +21 -0
  316. package/dist/auth/index.d.ts.map +1 -0
  317. package/dist/auth/index.js +14 -0
  318. package/dist/auth/index.js.map +1 -0
  319. package/dist/auth/ip-match.d.ts +29 -0
  320. package/dist/auth/ip-match.d.ts.map +1 -0
  321. package/dist/auth/ip-match.js +162 -0
  322. package/dist/auth/ip-match.js.map +1 -0
  323. package/dist/auth/provider.d.ts +76 -0
  324. package/dist/auth/provider.d.ts.map +1 -0
  325. package/dist/auth/provider.js +2 -0
  326. package/dist/auth/provider.js.map +1 -0
  327. package/dist/auth/providers/aws-cognito.d.ts +55 -0
  328. package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
  329. package/dist/auth/providers/aws-cognito.js +114 -0
  330. package/dist/auth/providers/aws-cognito.js.map +1 -0
  331. package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
  332. package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
  333. package/dist/auth/providers/azure-easy-auth.js +48 -0
  334. package/dist/auth/providers/azure-easy-auth.js.map +1 -0
  335. package/dist/auth/providers/cloudflare-access.d.ts +71 -0
  336. package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
  337. package/dist/auth/providers/cloudflare-access.js +120 -0
  338. package/dist/auth/providers/cloudflare-access.js.map +1 -0
  339. package/dist/auth/providers/forwarded-user.d.ts +31 -0
  340. package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
  341. package/dist/auth/providers/forwarded-user.js +72 -0
  342. package/dist/auth/providers/forwarded-user.js.map +1 -0
  343. package/dist/auth/providers/none.d.ts +6 -0
  344. package/dist/auth/providers/none.d.ts.map +1 -0
  345. package/dist/auth/providers/none.js +19 -0
  346. package/dist/auth/providers/none.js.map +1 -0
  347. package/dist/auth/providers/tailscale.d.ts +7 -0
  348. package/dist/auth/providers/tailscale.d.ts.map +1 -0
  349. package/dist/auth/providers/tailscale.js +30 -0
  350. package/dist/auth/providers/tailscale.js.map +1 -0
  351. package/dist/auth/role-resolver.d.ts +38 -0
  352. package/dist/auth/role-resolver.d.ts.map +1 -0
  353. package/dist/auth/role-resolver.js +92 -0
  354. package/dist/auth/role-resolver.js.map +1 -0
  355. package/dist/auth/types.d.ts +150 -0
  356. package/dist/auth/types.d.ts.map +1 -0
  357. package/dist/auth/types.js +60 -0
  358. package/dist/auth/types.js.map +1 -0
  359. package/dist/cache/errors.d.ts +41 -0
  360. package/dist/cache/errors.d.ts.map +1 -0
  361. package/dist/cache/errors.js +44 -0
  362. package/dist/cache/errors.js.map +1 -0
  363. package/dist/cache/factories.d.ts +17 -0
  364. package/dist/cache/factories.d.ts.map +1 -0
  365. package/dist/cache/factories.js +17 -0
  366. package/dist/cache/factories.js.map +1 -0
  367. package/dist/cache/keys.d.ts +63 -0
  368. package/dist/cache/keys.d.ts.map +1 -0
  369. package/dist/cache/keys.js +145 -0
  370. package/dist/cache/keys.js.map +1 -0
  371. package/dist/cache/memory.d.ts +51 -0
  372. package/dist/cache/memory.d.ts.map +1 -0
  373. package/dist/cache/memory.js +204 -0
  374. package/dist/cache/memory.js.map +1 -0
  375. package/dist/cache/per-site.d.ts +22 -0
  376. package/dist/cache/per-site.d.ts.map +1 -0
  377. package/dist/cache/per-site.js +114 -0
  378. package/dist/cache/per-site.js.map +1 -0
  379. package/dist/cache/types.d.ts +142 -0
  380. package/dist/cache/types.d.ts.map +1 -0
  381. package/dist/cache/types.js +33 -0
  382. package/dist/cache/types.js.map +1 -0
  383. package/dist/cli/archive.d.ts +44 -0
  384. package/dist/cli/archive.d.ts.map +1 -0
  385. package/dist/cli/archive.js +310 -0
  386. package/dist/cli/archive.js.map +1 -0
  387. package/dist/cli/bootstrap.d.ts +15 -8
  388. package/dist/cli/bootstrap.d.ts.map +1 -1
  389. package/dist/cli/bootstrap.js +59 -23
  390. package/dist/cli/bootstrap.js.map +1 -1
  391. package/dist/cli/dev-template-watcher.d.ts +29 -0
  392. package/dist/cli/dev-template-watcher.d.ts.map +1 -0
  393. package/dist/cli/dev-template-watcher.js +38 -0
  394. package/dist/cli/dev-template-watcher.js.map +1 -0
  395. package/dist/cli/history.d.ts.map +1 -1
  396. package/dist/cli/history.js +5 -3
  397. package/dist/cli/history.js.map +1 -1
  398. package/dist/cli/index.js +712 -395
  399. package/dist/cli/index.js.map +1 -1
  400. package/dist/cli/validate-flags.d.ts +29 -0
  401. package/dist/cli/validate-flags.d.ts.map +1 -0
  402. package/dist/cli/validate-flags.js +49 -0
  403. package/dist/cli/validate-flags.js.map +1 -0
  404. package/dist/compare.d.ts +1 -1
  405. package/dist/compare.d.ts.map +1 -1
  406. package/dist/compare.js +25 -23
  407. package/dist/compare.js.map +1 -1
  408. package/dist/component-ids.d.ts +25 -0
  409. package/dist/component-ids.d.ts.map +1 -0
  410. package/dist/component-ids.js +83 -0
  411. package/dist/component-ids.js.map +1 -0
  412. package/dist/config/define.d.ts +61 -0
  413. package/dist/config/define.d.ts.map +1 -0
  414. package/dist/config/define.js +64 -0
  415. package/dist/config/define.js.map +1 -0
  416. package/dist/config/errors.d.ts +32 -0
  417. package/dist/config/errors.d.ts.map +1 -0
  418. package/dist/config/errors.js +40 -0
  419. package/dist/config/errors.js.map +1 -0
  420. package/dist/config/index.d.ts +13 -0
  421. package/dist/config/index.d.ts.map +1 -0
  422. package/dist/config/index.js +20 -0
  423. package/dist/config/index.js.map +1 -0
  424. package/dist/config/loader.d.ts +105 -0
  425. package/dist/config/loader.d.ts.map +1 -0
  426. package/dist/config/loader.js +265 -0
  427. package/dist/config/loader.js.map +1 -0
  428. package/dist/config/schemas.d.ts +89 -0
  429. package/dist/config/schemas.d.ts.map +1 -0
  430. package/dist/config/schemas.js +172 -0
  431. package/dist/config/schemas.js.map +1 -0
  432. package/dist/config/types.d.ts +32 -0
  433. package/dist/config/types.d.ts.map +1 -0
  434. package/dist/config/types.js +15 -0
  435. package/dist/config/types.js.map +1 -0
  436. package/dist/deploy/cloudflare-workers.d.ts +46 -0
  437. package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
  438. package/dist/deploy/cloudflare-workers.js +213 -0
  439. package/dist/deploy/cloudflare-workers.js.map +1 -0
  440. package/dist/deploy/errors.d.ts +66 -0
  441. package/dist/deploy/errors.d.ts.map +1 -0
  442. package/dist/deploy/errors.js +82 -0
  443. package/dist/deploy/errors.js.map +1 -0
  444. package/dist/deploy/index.d.ts +9 -0
  445. package/dist/deploy/index.d.ts.map +1 -0
  446. package/dist/deploy/index.js +3 -0
  447. package/dist/deploy/index.js.map +1 -0
  448. package/dist/deploy/types.d.ts +162 -0
  449. package/dist/deploy/types.d.ts.map +1 -0
  450. package/dist/deploy/types.js +2 -0
  451. package/dist/deploy/types.js.map +1 -0
  452. package/dist/fragments/create.d.ts +70 -0
  453. package/dist/fragments/create.d.ts.map +1 -0
  454. package/dist/fragments/create.js +93 -0
  455. package/dist/fragments/create.js.map +1 -0
  456. package/dist/fragments/publish.d.ts +37 -0
  457. package/dist/fragments/publish.d.ts.map +1 -0
  458. package/dist/fragments/publish.js +52 -0
  459. package/dist/fragments/publish.js.map +1 -0
  460. package/dist/fragments/save.d.ts +81 -0
  461. package/dist/fragments/save.d.ts.map +1 -0
  462. package/dist/fragments/save.js +105 -0
  463. package/dist/fragments/save.js.map +1 -0
  464. package/dist/history-recorder.d.ts +5 -5
  465. package/dist/history-recorder.d.ts.map +1 -1
  466. package/dist/history-recorder.js +4 -4
  467. package/dist/history-recorder.js.map +1 -1
  468. package/dist/history-restorer.js +2 -2
  469. package/dist/history-restorer.js.map +1 -1
  470. package/dist/history.d.ts +1 -1
  471. package/dist/hooks/audit-emitter.d.ts +73 -0
  472. package/dist/hooks/audit-emitter.d.ts.map +1 -0
  473. package/dist/hooks/audit-emitter.js +13 -0
  474. package/dist/hooks/audit-emitter.js.map +1 -0
  475. package/dist/hooks/context.d.ts +78 -0
  476. package/dist/hooks/context.d.ts.map +1 -0
  477. package/dist/hooks/context.js +56 -0
  478. package/dist/hooks/context.js.map +1 -0
  479. package/dist/hooks/contribution.d.ts +90 -0
  480. package/dist/hooks/contribution.d.ts.map +1 -0
  481. package/dist/hooks/contribution.js +2 -0
  482. package/dist/hooks/contribution.js.map +1 -0
  483. package/dist/hooks/dispatch.d.ts +30 -0
  484. package/dist/hooks/dispatch.d.ts.map +1 -0
  485. package/dist/hooks/dispatch.js +252 -0
  486. package/dist/hooks/dispatch.js.map +1 -0
  487. package/dist/hooks/errors.d.ts +100 -0
  488. package/dist/hooks/errors.d.ts.map +1 -0
  489. package/dist/hooks/errors.js +103 -0
  490. package/dist/hooks/errors.js.map +1 -0
  491. package/dist/hooks/index.d.ts +15 -0
  492. package/dist/hooks/index.d.ts.map +1 -0
  493. package/dist/hooks/index.js +6 -0
  494. package/dist/hooks/index.js.map +1 -0
  495. package/dist/hooks/registry.d.ts +53 -0
  496. package/dist/hooks/registry.d.ts.map +1 -0
  497. package/dist/hooks/registry.js +139 -0
  498. package/dist/hooks/registry.js.map +1 -0
  499. package/dist/hooks/storage.d.ts +43 -0
  500. package/dist/hooks/storage.d.ts.map +1 -0
  501. package/dist/hooks/storage.js +2 -0
  502. package/dist/hooks/storage.js.map +1 -0
  503. package/dist/hooks/types.d.ts +324 -0
  504. package/dist/hooks/types.d.ts.map +1 -0
  505. package/dist/hooks/types.js +2 -0
  506. package/dist/hooks/types.js.map +1 -0
  507. package/dist/index.d.ts +26 -6
  508. package/dist/index.d.ts.map +1 -1
  509. package/dist/index.js +49 -5
  510. package/dist/index.js.map +1 -1
  511. package/dist/locale.d.ts +5 -1
  512. package/dist/locale.d.ts.map +1 -1
  513. package/dist/locale.js +6 -2
  514. package/dist/locale.js.map +1 -1
  515. package/dist/manifest-save.d.ts +255 -0
  516. package/dist/manifest-save.d.ts.map +1 -0
  517. package/dist/manifest-save.js +260 -0
  518. package/dist/manifest-save.js.map +1 -0
  519. package/dist/manifest.d.ts +1 -2
  520. package/dist/manifest.d.ts.map +1 -1
  521. package/dist/manifest.js +43 -44
  522. package/dist/manifest.js.map +1 -1
  523. package/dist/node-floor.d.ts +3 -0
  524. package/dist/node-floor.d.ts.map +1 -0
  525. package/dist/node-floor.js +3 -0
  526. package/dist/node-floor.js.map +1 -0
  527. package/dist/pages/create.d.ts +103 -0
  528. package/dist/pages/create.d.ts.map +1 -0
  529. package/dist/pages/create.js +117 -0
  530. package/dist/pages/create.js.map +1 -0
  531. package/dist/pages/publish.d.ts +59 -0
  532. package/dist/pages/publish.d.ts.map +1 -0
  533. package/dist/pages/publish.js +78 -0
  534. package/dist/pages/publish.js.map +1 -0
  535. package/dist/pages/save.d.ts +97 -0
  536. package/dist/pages/save.d.ts.map +1 -0
  537. package/dist/pages/save.js +138 -0
  538. package/dist/pages/save.js.map +1 -0
  539. package/dist/providers/factories.d.ts +65 -0
  540. package/dist/providers/factories.d.ts.map +1 -0
  541. package/dist/providers/factories.js +189 -0
  542. package/dist/providers/factories.js.map +1 -0
  543. package/dist/publish-item.d.ts +225 -0
  544. package/dist/publish-item.d.ts.map +1 -0
  545. package/dist/publish-item.js +210 -0
  546. package/dist/publish-item.js.map +1 -0
  547. package/dist/publish-rendered.d.ts.map +1 -1
  548. package/dist/publish-rendered.js +75 -6
  549. package/dist/publish-rendered.js.map +1 -1
  550. package/dist/publish-renderers.d.ts +132 -0
  551. package/dist/publish-renderers.d.ts.map +1 -0
  552. package/dist/publish-renderers.js +240 -0
  553. package/dist/publish-renderers.js.map +1 -0
  554. package/dist/publish-run.d.ts +223 -0
  555. package/dist/publish-run.d.ts.map +1 -0
  556. package/dist/publish-run.js +307 -0
  557. package/dist/publish-run.js.map +1 -0
  558. package/dist/publish.d.ts.map +1 -1
  559. package/dist/publish.js +1 -10
  560. package/dist/publish.js.map +1 -1
  561. package/dist/render-for-analysis.d.ts +24 -0
  562. package/dist/render-for-analysis.d.ts.map +1 -0
  563. package/dist/render-for-analysis.js +146 -0
  564. package/dist/render-for-analysis.js.map +1 -0
  565. package/dist/resolver.d.ts.map +1 -1
  566. package/dist/resolver.js +47 -23
  567. package/dist/resolver.js.map +1 -1
  568. package/dist/runtime/archive-marker.d.ts +62 -0
  569. package/dist/runtime/archive-marker.d.ts.map +1 -0
  570. package/dist/runtime/archive-marker.js +88 -0
  571. package/dist/runtime/archive-marker.js.map +1 -0
  572. package/dist/runtime/capability-gap-warnings.d.ts +42 -0
  573. package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
  574. package/dist/runtime/capability-gap-warnings.js +28 -0
  575. package/dist/runtime/capability-gap-warnings.js.map +1 -0
  576. package/dist/runtime/redirects-emit.d.ts +93 -0
  577. package/dist/runtime/redirects-emit.d.ts.map +1 -0
  578. package/dist/runtime/redirects-emit.js +89 -0
  579. package/dist/runtime/redirects-emit.js.map +1 -0
  580. package/dist/runtime/runtime-capabilities.d.ts +79 -0
  581. package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
  582. package/dist/runtime/runtime-capabilities.js +60 -0
  583. package/dist/runtime/runtime-capabilities.js.map +1 -0
  584. package/dist/save-etag.d.ts +69 -0
  585. package/dist/save-etag.d.ts.map +1 -0
  586. package/dist/save-etag.js +118 -0
  587. package/dist/save-etag.js.map +1 -0
  588. package/dist/site-loader.d.ts +42 -4
  589. package/dist/site-loader.d.ts.map +1 -1
  590. package/dist/site-loader.js +27 -8
  591. package/dist/site-loader.js.map +1 -1
  592. package/dist/targets.d.ts +21 -12
  593. package/dist/targets.d.ts.map +1 -1
  594. package/dist/targets.js +27 -95
  595. package/dist/targets.js.map +1 -1
  596. package/dist/testing/admin-cache-contract.d.ts +52 -0
  597. package/dist/testing/admin-cache-contract.d.ts.map +1 -0
  598. package/dist/testing/admin-cache-contract.js +203 -0
  599. package/dist/testing/admin-cache-contract.js.map +1 -0
  600. package/dist/testing/index.d.ts +11 -0
  601. package/dist/testing/index.d.ts.map +1 -0
  602. package/dist/testing/index.js +11 -0
  603. package/dist/testing/index.js.map +1 -0
  604. package/dist/transforms/factories.d.ts +16 -0
  605. package/dist/transforms/factories.d.ts.map +1 -0
  606. package/dist/transforms/factories.js +18 -0
  607. package/dist/transforms/factories.js.map +1 -0
  608. package/dist/transforms/index.d.ts +10 -17
  609. package/dist/transforms/index.d.ts.map +1 -1
  610. package/dist/transforms/index.js +4 -28
  611. package/dist/transforms/index.js.map +1 -1
  612. package/dist/transforms/sharp.d.ts +15 -1
  613. package/dist/transforms/sharp.d.ts.map +1 -1
  614. package/dist/transforms/sharp.js +34 -20
  615. package/dist/transforms/sharp.js.map +1 -1
  616. package/dist/types.d.ts +379 -52
  617. package/dist/types.d.ts.map +1 -1
  618. package/dist/types.js +20 -1
  619. package/dist/types.js.map +1 -1
  620. package/dist/validation/alt-required-walker.d.ts +27 -0
  621. package/dist/validation/alt-required-walker.d.ts.map +1 -0
  622. package/dist/validation/alt-required-walker.js +108 -0
  623. package/dist/validation/alt-required-walker.js.map +1 -0
  624. package/dist/validation/default-registry.d.ts +12 -0
  625. package/dist/validation/default-registry.d.ts.map +1 -0
  626. package/dist/validation/default-registry.js +55 -0
  627. package/dist/validation/default-registry.js.map +1 -0
  628. package/dist/validation/publish-audit.d.ts +44 -0
  629. package/dist/validation/publish-audit.d.ts.map +1 -0
  630. package/dist/validation/publish-audit.js +64 -0
  631. package/dist/validation/publish-audit.js.map +1 -0
  632. package/dist/validation/registry.d.ts +23 -0
  633. package/dist/validation/registry.d.ts.map +1 -0
  634. package/dist/validation/registry.js +15 -0
  635. package/dist/validation/registry.js.map +1 -0
  636. package/dist/validation/save-delta.d.ts +46 -0
  637. package/dist/validation/save-delta.d.ts.map +1 -0
  638. package/dist/validation/save-delta.js +57 -0
  639. package/dist/validation/save-delta.js.map +1 -0
  640. package/dist/validation/scanner.d.ts +91 -0
  641. package/dist/validation/scanner.d.ts.map +1 -0
  642. package/dist/validation/scanner.js +327 -0
  643. package/dist/validation/scanner.js.map +1 -0
  644. package/dist/validation/template-impact.d.ts +52 -0
  645. package/dist/validation/template-impact.d.ts.map +1 -0
  646. package/dist/validation/template-impact.js +53 -0
  647. package/dist/validation/template-impact.js.map +1 -0
  648. package/dist/validation/types.d.ts +123 -0
  649. package/dist/validation/types.d.ts.map +1 -0
  650. package/dist/validation/types.js +7 -0
  651. package/dist/validation/types.js.map +1 -0
  652. package/dist/validation/validators/accessibility.d.ts +3 -0
  653. package/dist/validation/validators/accessibility.d.ts.map +1 -0
  654. package/dist/validation/validators/accessibility.js +106 -0
  655. package/dist/validation/validators/accessibility.js.map +1 -0
  656. package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
  657. package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
  658. package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
  659. package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
  660. package/dist/validation/validators/alt-required.d.ts +3 -0
  661. package/dist/validation/validators/alt-required.d.ts.map +1 -0
  662. package/dist/validation/validators/alt-required.js +118 -0
  663. package/dist/validation/validators/alt-required.js.map +1 -0
  664. package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
  665. package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
  666. package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
  667. package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
  668. package/dist/validation/validators/broken-links.d.ts +3 -0
  669. package/dist/validation/validators/broken-links.d.ts.map +1 -0
  670. package/dist/validation/validators/broken-links.js +190 -0
  671. package/dist/validation/validators/broken-links.js.map +1 -0
  672. package/dist/validation/validators/circular-alias.d.ts +36 -0
  673. package/dist/validation/validators/circular-alias.d.ts.map +1 -0
  674. package/dist/validation/validators/circular-alias.js +63 -0
  675. package/dist/validation/validators/circular-alias.js.map +1 -0
  676. package/dist/validation/validators/circular-fragment.d.ts +15 -0
  677. package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
  678. package/dist/validation/validators/circular-fragment.js +97 -0
  679. package/dist/validation/validators/circular-fragment.js.map +1 -0
  680. package/dist/validation/validators/dangling-alias.d.ts +38 -0
  681. package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
  682. package/dist/validation/validators/dangling-alias.js +31 -0
  683. package/dist/validation/validators/dangling-alias.js.map +1 -0
  684. package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
  685. package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
  686. package/dist/validation/validators/deploy-target-type-supported.js +32 -0
  687. package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
  688. package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
  689. package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
  690. package/dist/validation/validators/dynamic-route-conflict.js +80 -0
  691. package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
  692. package/dist/validation/validators/html-validity.d.ts +3 -0
  693. package/dist/validation/validators/html-validity.d.ts.map +1 -0
  694. package/dist/validation/validators/html-validity.js +89 -0
  695. package/dist/validation/validators/html-validity.js.map +1 -0
  696. package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
  697. package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
  698. package/dist/validation/validators/orphaned-locale-file.js +84 -0
  699. package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
  700. package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
  701. package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
  702. package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
  703. package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
  704. package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
  705. package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
  706. package/dist/validation/validators/referenced-asset-exists.js +80 -0
  707. package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
  708. package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
  709. package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
  710. package/dist/validation/validators/referenced-fragment-exists.js +52 -0
  711. package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
  712. package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
  713. package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
  714. package/dist/validation/validators/referenced-template-exists.js +74 -0
  715. package/dist/validation/validators/referenced-template-exists.js.map +1 -0
  716. package/dist/validation/validators/schema-conformance.d.ts +17 -0
  717. package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
  718. package/dist/validation/validators/schema-conformance.js +94 -0
  719. package/dist/validation/validators/schema-conformance.js.map +1 -0
  720. package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
  721. package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
  722. package/dist/validation/validators/target-deploy-coverage.js +37 -0
  723. package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
  724. package/dist/validation/validators/unused-fragment.d.ts +16 -0
  725. package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
  726. package/dist/validation/validators/unused-fragment.js +86 -0
  727. package/dist/validation/validators/unused-fragment.js.map +1 -0
  728. package/package.json +54 -31
  729. package/admin-dist/assets/index-BO9-CXmW.css +0 -1
  730. package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
  731. package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
  732. package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
  733. package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
  734. package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
  735. package/dist/publish-locale.d.ts +0 -44
  736. package/dist/publish-locale.d.ts.map +0 -1
  737. package/dist/publish-locale.js +0 -103
  738. package/dist/publish-locale.js.map +0 -1
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Capability-check middleware — gates a route on the principal's
3
+ * having a specific capability.
4
+ *
5
+ * # Per-route opt-in
6
+ *
7
+ * Routes call `requireCapability('read:pages')` to attach a check
8
+ * to a specific endpoint. The check runs after `principalMiddleware`
9
+ * (so `c.var.principal` is populated). Anonymous principals (id
10
+ * `'unknown'`) fail capability checks because their capability set
11
+ * is empty — translates to 401 (not 403; per design-auth-rbac.md
12
+ * the principal isn't authenticated yet).
13
+ *
14
+ * # Failure modes
15
+ *
16
+ * - Principal is anonymous (no upstream auth) → 401 with
17
+ * WWW-Authenticate (matches the principal middleware's 401)
18
+ * - Principal is authenticated but lacks the capability → 403
19
+ * with structured body listing the missing capability and the
20
+ * principal's role
21
+ *
22
+ * # Composition
23
+ *
24
+ * Routes can wire multiple capability checks (e.g., a route that
25
+ * needs both `read:pages` and `edit:pages` in different code paths
26
+ * — the broader read check at the route level, narrower edit check
27
+ * gating a specific operation). v1 ships single-capability gates;
28
+ * multi-capability composition is left to the consumer.
29
+ *
30
+ * # SOLID lenses
31
+ *
32
+ * - SRP: authorization gate only. Doesn't extract identity (Cut
33
+ * 7's principalMiddleware does that), doesn't audit (Cut 5 of
34
+ * audit foundation does).
35
+ * - DIP: depends on `capabilityGrants` pure function, not on
36
+ * the principal middleware's internals.
37
+ */
38
+ import { createMiddleware } from 'hono/factory';
39
+ import { capabilityGrants, UNKNOWN_ACTOR_ID } from '../../auth/index.js';
40
+ /**
41
+ * Build a middleware that requires the specified capability.
42
+ * Returns 401 for anonymous requests, 403 for authenticated
43
+ * requests lacking the capability.
44
+ */
45
+ export function requireCapability(capability) {
46
+ return createMiddleware(async (c, next) => {
47
+ const principal = c.get('principal');
48
+ // Anonymous principal — no upstream identity. Translate to
49
+ // 401 (not 403); the request hasn't authenticated yet.
50
+ if (principal.id === UNKNOWN_ACTOR_ID && principal.role === 'unknown') {
51
+ return c.json({ code: 'UNAUTHENTICATED', error: `This endpoint requires capability "${capability}"` }, 401, { 'WWW-Authenticate': 'Bearer realm="gazetta-admin"' });
52
+ }
53
+ // Authenticated principal — capability check.
54
+ if (!capabilityGrants(principal.capabilities, capability)) {
55
+ return c.json({
56
+ code: 'FORBIDDEN',
57
+ missing: [capability],
58
+ role: principal.role,
59
+ error: `Role "${principal.role}" does not have capability "${capability}"`,
60
+ }, 403);
61
+ }
62
+ await next();
63
+ });
64
+ }
65
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../../src/admin-api/middleware/capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGxE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,gBAAgB,CAAe,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,2DAA2D;QAC3D,uDAAuD;QACvD,IAAI,SAAS,CAAC,EAAE,KAAK,gBAAgB,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtE,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,IAAI,EAAE,iBAA0B,EAAE,KAAK,EAAE,sCAAsC,UAAU,GAAG,EAAE,EAChG,GAAG,EACH,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,CACvD,CAAA;QACH,CAAC;QACD,8CAA8C;QAC9C,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,CAAC,IAAI,CACX;gBACE,IAAI,EAAE,WAAoB;gBAC1B,OAAO,EAAE,CAAC,UAAU,CAAC;gBACrB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,SAAS,CAAC,IAAI,+BAA+B,UAAU,GAAG;aAC3E,EACD,GAAG,CACJ,CAAA;QACH,CAAC;QACD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type AuthIdentityProvider, type Principal } from '../../auth/index.js';
2
+ /**
3
+ * Hono context augmentation — readers see `c.var.principal` typed
4
+ * as `Principal` (always populated; never undefined after this
5
+ * middleware runs).
6
+ */
7
+ export type PrincipalEnv = {
8
+ Variables: {
9
+ principal: Principal;
10
+ };
11
+ };
12
+ /**
13
+ * Build the principal middleware. Pass the configured provider OR
14
+ * omit to fall back to `none` mode. Production wiring resolves the
15
+ * provider from `site.config.ts admin.auth` at boot.
16
+ */
17
+ export declare function principalMiddleware(provider?: AuthIdentityProvider): import("hono").MiddlewareHandler<PrincipalEnv, string, {}, Response>;
18
+ //# sourceMappingURL=principal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principal.d.ts","sourceRoot":"","sources":["../../../src/admin-api/middleware/principal.ts"],"names":[],"mappings":"AAiDA,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,SAAS,EAGf,MAAM,qBAAqB,CAAA;AAE5B;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,SAAS,CAAA;KACrB,CAAA;CACF,CAAA;AAkDD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,oBAAuC,wEA0BpF"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Principal middleware — wires the auth/RBAC layer (`packages/gazetta/src/auth/`)
3
+ * into the Hono request context.
4
+ *
5
+ * # What this middleware does
6
+ *
7
+ * 1. On boot, constructs the configured `AuthIdentityProvider` from
8
+ * `admin.auth` in the loaded SiteManifest. Falls back to the
9
+ * `none`-mode provider when `admin.auth` is absent.
10
+ * 2. On every request, calls `provider.extractPrincipal(req)` and
11
+ * attaches the result to `c.var.principal`.
12
+ * 3. Anonymous requests (provider returns `null`) get a synthesized
13
+ * Principal with `id: 'unknown'` + `role: 'unknown'` + empty
14
+ * capabilities. The capability-check middleware (Cut 8) decides
15
+ * whether to allow these (none-mode or public routes) or 401.
16
+ * 4. Provider throws (`AuthenticationError`) → 401 with the error
17
+ * message; doesn't leak details about the underlying failure.
18
+ *
19
+ * # Capability population
20
+ *
21
+ * For `forwarded-user` and `cloudflare-access` providers (which can
22
+ * surface upstream group claims), this middleware would call
23
+ * `resolveRole({ groups, mapping, customRoles })` to expand the
24
+ * principal's capabilities. v1 wires the role-resolver in a
25
+ * follow-up cut once one of the providers actually exposes group
26
+ * claims through the AuthRequest shape — for now the providers
27
+ * return `capabilities: []` and the operator's role mapping config
28
+ * doesn't reach the resolver yet.
29
+ *
30
+ * # Why this is its own middleware (not folded into the existing one)
31
+ *
32
+ * The existing `authMiddleware` is a simple bearer-token guard for
33
+ * `GAZETTA_TOKEN` — orthogonal to upstream-identity extraction.
34
+ * They compose: bearer-token gates "is this request allowed to
35
+ * reach the admin API at all"; principal middleware identifies
36
+ * "who is the user behind this request." Most deployments use
37
+ * one or the other (bearer-token for solo / dev; principal for
38
+ * team CMS); some compose both (CI pipeline auth-token + upstream
39
+ * Cloudflare Access for human users).
40
+ *
41
+ * # SOLID lenses
42
+ *
43
+ * - SRP: extracts identity + attaches to context. Authorization
44
+ * (capability checks) is Cut 8's middleware.
45
+ * - DIP: depends on `AuthIdentityProvider` interface, not on
46
+ * specific provider classes.
47
+ */
48
+ import { createMiddleware } from 'hono/factory';
49
+ import { AuthenticationError, noneAuthProvider, UNKNOWN_ACTOR_ID, } from '../../auth/index.js';
50
+ /**
51
+ * The synthetic anonymous principal returned when no upstream
52
+ * identity is present. Surfaced as `id: 'unknown'`, `role:
53
+ * 'unknown'`, no capabilities — Cut 8's capability-check middleware
54
+ * 401s on any required capability.
55
+ */
56
+ const ANONYMOUS_PRINCIPAL = {
57
+ id: UNKNOWN_ACTOR_ID,
58
+ role: 'unknown',
59
+ trustMode: 'none',
60
+ capabilities: [],
61
+ };
62
+ /**
63
+ * Adapt a Hono request into the `AuthRequest` shape the auth/
64
+ * providers expect. Headers come from Hono's case-insensitive
65
+ * lookup; we normalize to lowercase keys for provider consistency.
66
+ */
67
+ function toAuthRequest(c) {
68
+ const headers = new Map();
69
+ // Hono exposes headers via c.req.header() (single value). The
70
+ // raw request headers are accessible via c.req.raw.headers
71
+ // which is a fetch-style Headers object.
72
+ const raw = c.req.raw.headers;
73
+ raw.forEach((value, key) => {
74
+ headers.set(key.toLowerCase(), value);
75
+ });
76
+ // Source IP — Hono doesn't expose this directly; honest extraction
77
+ // is per-platform (per design-audit.md's trust-mode-driven IP
78
+ // section). v1 reads from a CF-Connecting-IP / X-Forwarded-For
79
+ // best-effort; provider-specific extraction lands when the audit
80
+ // foundation's source-IP recording (Cut 4 of audit) ships.
81
+ const sourceIp = raw.get('cf-connecting-ip') ?? raw.get('x-real-ip') ?? extractFirstXffEntry(raw.get('x-forwarded-for'));
82
+ return {
83
+ headers,
84
+ sourceIp: sourceIp ?? undefined,
85
+ method: c.req.method,
86
+ url: c.req.url,
87
+ };
88
+ }
89
+ function extractFirstXffEntry(xff) {
90
+ if (!xff)
91
+ return null;
92
+ const first = xff.split(',')[0]?.trim();
93
+ return first || null;
94
+ }
95
+ /**
96
+ * Build the principal middleware. Pass the configured provider OR
97
+ * omit to fall back to `none` mode. Production wiring resolves the
98
+ * provider from `site.config.ts admin.auth` at boot.
99
+ */
100
+ export function principalMiddleware(provider = noneAuthProvider) {
101
+ return createMiddleware(async (c, next) => {
102
+ let principal;
103
+ try {
104
+ principal = await provider.extractPrincipal(toAuthRequest(c));
105
+ }
106
+ catch (err) {
107
+ if (err instanceof AuthenticationError) {
108
+ // Surface as 401 with the error message. The provider's
109
+ // message is operator-facing diagnostic detail (e.g.,
110
+ // "JWT verification failed: signature invalid"); we surface
111
+ // it in a structured body. For external-facing 401s the
112
+ // middleware could mask the message, but this is admin-API
113
+ // only — operators benefit from the diagnostic context.
114
+ return c.json({ code: 'UNAUTHENTICATED', error: err.message }, 401, {
115
+ 'WWW-Authenticate': 'Bearer realm="gazetta-admin"',
116
+ });
117
+ }
118
+ // Unexpected (non-AuthenticationError) — let Hono's default
119
+ // error handler take over so the operator sees the stack.
120
+ throw err;
121
+ }
122
+ // Anonymous request — synthesize the unknown principal so
123
+ // downstream middleware always has a Principal to read.
124
+ c.set('principal', principal ?? ANONYMOUS_PRINCIPAL);
125
+ await next();
126
+ });
127
+ }
128
+ //# sourceMappingURL=principal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"principal.js","sourceRoot":"","sources":["../../../src/admin-api/middleware/principal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EACL,mBAAmB,EAInB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAa5B;;;;;GAKG;AACH,MAAM,mBAAmB,GAAc;IACrC,EAAE,EAAE,gBAAgB;IACpB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,MAAM;IACjB,YAAY,EAAE,EAAE;CACjB,CAAA;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,CAAU;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IACzC,8DAA8D;IAC9D,2DAA2D;IAC3D,yCAAyC;IACzC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAA;IAC7B,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IACF,mEAAmE;IACnE,8DAA8D;IAC9D,+DAA+D;IAC/D,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,QAAQ,GACZ,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACzG,OAAO;QACL,OAAO;QACP,QAAQ,EAAE,QAAQ,IAAI,SAAS;QAC/B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;QACpB,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG;KACf,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAkB;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;IACvC,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAiC,gBAAgB;IACnF,OAAO,gBAAgB,CAAe,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QACtD,IAAI,SAA2B,CAAA;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;gBACvC,wDAAwD;gBACxD,sDAAsD;gBACtD,4DAA4D;gBAC5D,wDAAwD;gBACxD,2DAA2D;gBAC3D,wDAAwD;gBACxD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAA0B,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE;oBAC3E,kBAAkB,EAAE,8BAA8B;iBACnD,CAAC,CAAA;YACJ,CAAC;YACD,4DAA4D;YAC5D,0DAA0D;YAC1D,MAAM,GAAG,CAAA;QACX,CAAC;QACD,0DAA0D;QAC1D,wDAAwD;QACxD,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,IAAI,mBAAmB,CAAC,CAAA;QACpD,MAAM,IAAI,EAAE,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Cut 14 — review-workflow integration for archive lifecycle.
3
+ *
4
+ * Per `design-soft-delete.md` Q9 (N-A.2 + N-B.1):
5
+ * - Archive on `pending-review` → auto-withdraw fires first; then archive.
6
+ * Two audit events emitted: `review-withdraw` with
7
+ * `metadata.autoWithdrawn: true`, then `archive`.
8
+ * - Archive on `approved` → approved state discarded; no synthetic
9
+ * withdraw event (the prior state is recorded in archive metadata
10
+ * as `priorReviewState: 'approved'`).
11
+ * - Archive on `draft` → no review-related side effects.
12
+ * - Restore (unarchive) → always to `draft`, regardless of prior state.
13
+ * Author re-submits if review needed. Auto-restoring to `approved`
14
+ * would let stale content ship without re-validation.
15
+ *
16
+ * # Forward-compat with review-workflow's Tier-3 timeline
17
+ *
18
+ * The review-workflow foundation hasn't shipped. Today's manifests
19
+ * never carry a `reviewState` field; this module's logic is therefore
20
+ * a no-op on every current production save. When review-workflow Cut 6
21
+ * lands and starts writing `reviewState` to manifests, this module
22
+ * activates without code changes.
23
+ *
24
+ * Gate is data-driven (`manifest.reviewState` presence), not config-
25
+ * driven (`reviewWorkflow.enabled` flag). The plan's wording around a
26
+ * config flag is one valid implementation; data-driven is honest:
27
+ * "if this item has review state, handle it; else no-op." When
28
+ * review-workflow ships its config field, no flag-check refactor is
29
+ * needed.
30
+ *
31
+ * # SOLID lenses
32
+ *
33
+ * - SRP: this module owns the archive ↔ review-state interaction.
34
+ * `archive.ts`'s `handleArchive` calls one function (`prepareForArchive`)
35
+ * and consumes its returned audit events; doesn't replicate state-
36
+ * machine knowledge.
37
+ * - DIP: `handleArchive` depends on the helper's typed return shape,
38
+ * not on review-state field names baked into the route handler.
39
+ * - OCP: when review-workflow ships its full state machine
40
+ * (additional states, transitions like `pending-publish`), this
41
+ * helper extends with new branches; archive route untouched.
42
+ */
43
+ import type { ComponentManifest } from '../../types.js';
44
+ import type { RecordEventInput } from '../../audit/context.js';
45
+ /**
46
+ * Build the synthetic `review-withdraw` audit event emitted when
47
+ * archive auto-withdraws a `pending-review` submission. Per
48
+ * `design-soft-delete.md` Q9 audit shape lock.
49
+ *
50
+ * Returns `null` when the prior state isn't `pending-review` —
51
+ * other states (draft, approved) don't emit a synthetic withdraw.
52
+ * Approved state discards as part of the archive event itself
53
+ * (recorded via `priorReviewState` metadata).
54
+ */
55
+ export declare function buildAutoWithdrawEvent(manifest: ComponentManifest, scope: {
56
+ kind: 'page' | 'fragment';
57
+ name: string;
58
+ }): RecordEventInput | null;
59
+ /**
60
+ * Compute additional metadata for the `archive` audit event capturing
61
+ * the item's prior review state. Returns an empty object for items
62
+ * without review state (current production behavior).
63
+ *
64
+ * `priorReviewState` is a non-prescriptive forensic record: the
65
+ * restore-always-to-draft invariant (Q9 N-B.1) means this metadata
66
+ * is never auto-applied on unarchive. It exists so operators can
67
+ * reconstruct "what state did this item have before it was archived?"
68
+ * via audit-log query alone, without re-reading the historical manifest.
69
+ */
70
+ export declare function archiveReviewMetadata(manifest: ComponentManifest): Record<string, unknown>;
71
+ /**
72
+ * Strip `reviewState` from a restored (unarchived) manifest. Per
73
+ * `design-soft-delete.md` Q9 N-B.1: restore always to draft; the
74
+ * absence of `reviewState` IS the draft state in the
75
+ * review-workflow's data model. Author re-submits if review needed.
76
+ *
77
+ * Returns the manifest unchanged when no review state was set.
78
+ */
79
+ export declare function stripReviewStateForRestore(manifest: ComponentManifest): ComponentManifest;
80
+ //# sourceMappingURL=archive-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-review.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/archive-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAgB9D;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD,gBAAgB,GAAG,IAAI,CAczB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI1F;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,iBAAiB,GAAG,iBAAiB,CAIzF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Read `reviewState` from a manifest without committing the field
3
+ * to `ComponentManifest`'s public type. The review-workflow
4
+ * foundation will lock the field's shape when it ships; until then,
5
+ * callers narrow at the read site.
6
+ *
7
+ * Returns the string state when present; `undefined` for live
8
+ * manifests today (every current production manifest).
9
+ */
10
+ function readReviewState(manifest) {
11
+ const m = manifest;
12
+ return typeof m.reviewState === 'string' ? m.reviewState : undefined;
13
+ }
14
+ /**
15
+ * Build the synthetic `review-withdraw` audit event emitted when
16
+ * archive auto-withdraws a `pending-review` submission. Per
17
+ * `design-soft-delete.md` Q9 audit shape lock.
18
+ *
19
+ * Returns `null` when the prior state isn't `pending-review` —
20
+ * other states (draft, approved) don't emit a synthetic withdraw.
21
+ * Approved state discards as part of the archive event itself
22
+ * (recorded via `priorReviewState` metadata).
23
+ */
24
+ export function buildAutoWithdrawEvent(manifest, scope) {
25
+ const priorState = readReviewState(manifest);
26
+ if (priorState !== 'pending-review')
27
+ return null;
28
+ return {
29
+ action: 'review-withdraw',
30
+ outcome: 'success',
31
+ scope,
32
+ metadata: {
33
+ autoWithdrawn: true,
34
+ reason: 'archive',
35
+ priorState,
36
+ },
37
+ };
38
+ }
39
+ /**
40
+ * Compute additional metadata for the `archive` audit event capturing
41
+ * the item's prior review state. Returns an empty object for items
42
+ * without review state (current production behavior).
43
+ *
44
+ * `priorReviewState` is a non-prescriptive forensic record: the
45
+ * restore-always-to-draft invariant (Q9 N-B.1) means this metadata
46
+ * is never auto-applied on unarchive. It exists so operators can
47
+ * reconstruct "what state did this item have before it was archived?"
48
+ * via audit-log query alone, without re-reading the historical manifest.
49
+ */
50
+ export function archiveReviewMetadata(manifest) {
51
+ const priorState = readReviewState(manifest);
52
+ if (!priorState)
53
+ return {};
54
+ return { priorReviewState: priorState };
55
+ }
56
+ /**
57
+ * Strip `reviewState` from a restored (unarchived) manifest. Per
58
+ * `design-soft-delete.md` Q9 N-B.1: restore always to draft; the
59
+ * absence of `reviewState` IS the draft state in the
60
+ * review-workflow's data model. Author re-submits if review needed.
61
+ *
62
+ * Returns the manifest unchanged when no review state was set.
63
+ */
64
+ export function stripReviewStateForRestore(manifest) {
65
+ if (readReviewState(manifest) === undefined)
66
+ return manifest;
67
+ const { reviewState: _strip, ...rest } = manifest;
68
+ return rest;
69
+ }
70
+ //# sourceMappingURL=archive-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-review.js","sourceRoot":"","sources":["../../../src/admin-api/routes/archive-review.ts"],"names":[],"mappings":"AA6CA;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,QAA2B;IAClD,MAAM,CAAC,GAAG,QAAyD,CAAA;IACnE,OAAO,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAA2B,EAC3B,KAAkD;IAElD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,UAAU,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAA;IAEhD,OAAO;QACL,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,SAAS;QAClB,KAAK;QACL,QAAQ,EAAE;YACR,aAAa,EAAE,IAAI;YACnB,MAAM,EAAE,SAAS;YACjB,UAAU;SACX;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA2B;IAC/D,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,CAAA;IAC1B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAA;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA2B;IACpE,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAC5D,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAyD,CAAA;IAClG,OAAO,IAAyB,CAAA;AAClC,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Archive / unarchive / purge routes for pages + fragments.
3
+ *
4
+ * Per `design-soft-delete.md`'s Cut 5 lock and the implementation
5
+ * grilling Q1 (one `archive.ts` module mounting both kinds): the
6
+ * lifecycle is the same shape for pages and fragments; the only
7
+ * axis that differs is the manifest filename + ItemRef source.
8
+ * Co-locating keeps "what does the archive lifecycle do?" answerable
9
+ * by reading one file.
10
+ *
11
+ * # The six routes
12
+ *
13
+ * POST /api/pages/:name/archive (capability: delete:pages)
14
+ * POST /api/pages/:name/unarchive (capability: edit:pages)
15
+ * DELETE /api/pages/:name/purge (capability: delete:pages)
16
+ * POST /api/fragments/:name/archive (capability: delete:fragments)
17
+ * POST /api/fragments/:name/unarchive (capability: edit:fragments)
18
+ * DELETE /api/fragments/:name/purge (capability: delete:fragments)
19
+ *
20
+ * Capability assignment per implementation Q6 (locked F1): archive +
21
+ * purge are delete-class; unarchive is edit-class. Symmetric authority
22
+ * (delete-class to remove from production; edit-class to bring back).
23
+ *
24
+ * # Direct write, own pipeline (Q2 lock B1)
25
+ *
26
+ * Archive is a lifecycle event, not a content edit. Don't reuse the
27
+ * PUT pipeline — it would fire `beforeSave` / `afterSave` hooks built
28
+ * for content saves and run save-delta validation against the full
29
+ * schema. Archive flips a manifest field; the audit `action` is
30
+ * `archive` / `unarchive` / `purge`, NOT `save`.
31
+ *
32
+ * # Existing dep-sidecars untouched on archive (Q3 lock C1)
33
+ *
34
+ * Archived items keep their `asset-refs` and `fragment-deps` sidecars.
35
+ * An archive still references its assets / fragments — that's why an
36
+ * asset-purge attempt finds it. Tearing down on archive (and rebuilding
37
+ * on unarchive) would silently break refs whenever an asset got purged
38
+ * during the archive window. Tear-down happens on PURGE only.
39
+ *
40
+ * # `archive-aliases` reverse index (Cut 5a)
41
+ *
42
+ * Cut 5a shipped `archive-aliases.ts` — a per-edge sidecar at
43
+ * `.gazetta/alias-targets/{aliasTarget}/{encoded-source-item}`. The
44
+ * archive route writes it on archive-with-aliasOf; the purge route
45
+ * reads it (via `readArchivesAliasing`) for the alias-pointers part of
46
+ * the purge-blocked check. Per `team-preferences.md` rule 24: at the
47
+ * 5K-page envelope, walking every manifest to find aliases is ~30s on
48
+ * cloud; the sidecar is ~5ms `readDir`. Same pattern as `asset-refs`.
49
+ *
50
+ * # Purge-blocked: one 409 with both arrays (Q4 lock D1)
51
+ *
52
+ * { code: 'DELETE_BLOCKED', aliases: [...], liveRefs: [...] }
53
+ *
54
+ * One 409, both arrays present. Surfaces every blocker in one
55
+ * round-trip; lets the author resolve in any order. UI gets one panel
56
+ * to render. Empty array when that class isn't blocking.
57
+ *
58
+ * # `?force=true` bypass (Q5 lock E1)
59
+ *
60
+ * Bypasses BOTH alias-pointers AND live-refs. One mental model — "I am
61
+ * an operator overriding the safety check." Audit records what was
62
+ * bypassed (`metadata.bypassedAliases` + `metadata.bypassedRefs`) so
63
+ * forensics finds what broke. Validators surface dangling aliases on
64
+ * the next save (P3); render emits 404 / errors on broken refs.
65
+ *
66
+ * # SOLID lenses
67
+ *
68
+ * - SRP: this module owns the archive lifecycle. Doesn't touch the
69
+ * PUT pipeline (Q2 B1); doesn't touch dep-sidecars on archive
70
+ * (Q3 C1). Each function answers one question.
71
+ * - DIP: routes consume `SourceContextResolver` like every other
72
+ * route module; archive primitives consume the typed `ItemKind`
73
+ * parameter rather than branching on URL shape inside helpers.
74
+ */
75
+ import { Hono } from 'hono';
76
+ import type { Context } from 'hono';
77
+ import type { SourceContextResolver } from '../source-context.js';
78
+ import type { AuditEnv } from '../middleware/audit.js';
79
+ import type { ItemRef } from '../../dep-sidecars.js';
80
+ type ItemKind = 'page' | 'fragment';
81
+ export interface ItemHandle {
82
+ /** ItemRef source axis (`page` | `fragment`); used for sidecar lookup. */
83
+ refSource: ItemRef['source'];
84
+ /** The audit + scope kind. Same value as `refSource`; named for clarity. */
85
+ scopeKind: ItemKind;
86
+ /** Manifest filename (`page.json` or `fragment.json`). */
87
+ filename: string;
88
+ /** Verbose name used in error messages. */
89
+ label: string;
90
+ }
91
+ export declare const PAGE_HANDLE: ItemHandle;
92
+ export declare const FRAGMENT_HANDLE: ItemHandle;
93
+ /**
94
+ * Background-scanner notification options for the archive lifecycle.
95
+ *
96
+ * Every archive transition (archive / unarchive / purge / setAlias)
97
+ * is a manifest write — it must notify the validation scanner so
98
+ * background-stage validators (P1: `referenced-archived-without-alias`,
99
+ * P2: `dangling-alias`, P5: `aliasof-points-to-archived`) re-run on
100
+ * the affected item and clear stale cache entries.
101
+ *
102
+ * Same shape as `manifest-save.ts`'s `scanner.rescan(cause)` call;
103
+ * fire-and-forget — the route response doesn't block on scanner work.
104
+ * Cross-foundation gap #6 from `testing-plan.md` punch list.
105
+ */
106
+ export interface ArchiveRoutesOptions {
107
+ scanner?: import('../../validation/scanner.js').ValidationScanner | null;
108
+ }
109
+ export declare function archiveRoutes(resolve: SourceContextResolver, opts?: ArchiveRoutesOptions): Hono<AuditEnv, import("hono/types").BlankSchema, "/">;
110
+ export declare function handleArchive(c: Context<AuditEnv>, resolve: SourceContextResolver, handle: ItemHandle, scanner?: import('../../validation/scanner.js').ValidationScanner | null): Promise<(Response & import("hono").TypedResponse<{
111
+ error: string;
112
+ }, 400, "json">) | (Response & import("hono").TypedResponse<{
113
+ error: string;
114
+ }, 404, "json">) | (Response & import("hono").TypedResponse<{
115
+ code: "ARCHIVE_HAS_LIVE_REFS";
116
+ liveRefs: {
117
+ kind: "page" | "fragment";
118
+ name: string;
119
+ }[];
120
+ }, 409, "json">) | (Response & import("hono").TypedResponse<{
121
+ ok: true;
122
+ name: string;
123
+ archivedAt: string;
124
+ aliasOf?: string | undefined;
125
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">)>;
126
+ export declare function handlePurge(c: Context<AuditEnv>, resolve: SourceContextResolver, handle: ItemHandle, scanner?: import('../../validation/scanner.js').ValidationScanner | null): Promise<(Response & import("hono").TypedResponse<{
127
+ error: string;
128
+ }, 400, "json">) | (Response & import("hono").TypedResponse<{
129
+ error: string;
130
+ }, 404, "json">) | (Response & import("hono").TypedResponse<{
131
+ code: "DELETE_BLOCKED";
132
+ aliases: {
133
+ kind: "page" | "fragment";
134
+ name: string;
135
+ }[];
136
+ liveRefs: {
137
+ kind: "page" | "fragment";
138
+ name: string;
139
+ }[];
140
+ }, 409, "json">) | (Response & import("hono").TypedResponse<{
141
+ ok: true;
142
+ name: string;
143
+ }, import("hono/utils/http-status").ContentfulStatusCode, "json">)>;
144
+ export {};
145
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/admin-api/routes/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyEG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAIjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAmBpD,KAAK,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;AAEnC,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC5B,4EAA4E;IAC5E,SAAS,EAAE,QAAQ,CAAA;IACnB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,WAAW,EAAE,UAKzB,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,UAK7B,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,6BAA6B,EAAE,iBAAiB,GAAG,IAAI,CAAA;CACzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,IAAI,GAAE,oBAAyB,yDAoC5F;AAuBD,wBAAsB,aAAa,CACjC,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EACpB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,OAAO,6BAA6B,EAAE,iBAAiB,GAAG,IAAW;;;;;;;;;;;;;;;oEA+H/E;AAmJD,wBAAsB,WAAW,CAC/B,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EACpB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,OAAO,6BAA6B,EAAE,iBAAiB,GAAG,IAAW;;;;;;;;;;;;;;;;;oEA0F/E"}