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,204 @@
1
+ /**
2
+ * `MemoryCache` — process-internal `AdminCache` provider. v1 default.
3
+ *
4
+ * Per-instance scope; multi-instance-correct via independence (each
5
+ * instance receives SSE invalidation for its own writes via Cut 4's
6
+ * bridge). LRU eviction at configured caps; stats track operational
7
+ * counters.
8
+ *
9
+ * # SOLID lenses
10
+ *
11
+ * - SRP: this module owns the in-memory provider. Stats, LRU,
12
+ * subscribe handling all live here because they're one cohesive
13
+ * "memory cache" concern; splitting would fragment.
14
+ * - LSP: substitutable for any future `AdminCache` provider via
15
+ * the contract test helper (Cut 10).
16
+ * - DIP: consumers depend on `AdminCache`, not `createMemoryCache`.
17
+ *
18
+ * # subscribe() — local emission per Cut 4
19
+ *
20
+ * The contract evolved during Cut 4. The original framing was "events
21
+ * from other instances," with single-instance providers as honest
22
+ * no-ops. Real consumers (the L4→L6 server-to-browser cascade per
23
+ * `design-cache.md` "Offline composition") need server-side L4
24
+ * invalidations to reach browser-side L6 caches. From the browser's
25
+ * POV the server IS another instance, so the right contract is
26
+ * "events from any source" — including local ones.
27
+ *
28
+ * `invalidate()` and `invalidatePrefix()` fire to subscribers with
29
+ * the **input** key/prefix (the consumer-facing form passed to the
30
+ * method). The `applyKeyPolicy` version prefix and overflow-hash are
31
+ * provider-internal storage details — they don't leak to event
32
+ * payloads.
33
+ *
34
+ * `forSite()` filters events whose prefix doesn't belong to the
35
+ * wrapping site (cross-site events from a future shared backing
36
+ * service); the SSE bridge subscribes to the forSite wrapper and
37
+ * sees consumer-facing prefixes.
38
+ */
39
+ import { randomBytes } from 'node:crypto';
40
+ import { hostname } from 'node:os';
41
+ import { applyKeyPolicy, applyPrefixPolicy } from './keys.js';
42
+ /**
43
+ * Resolve the instance ID from the environment when the operator
44
+ * doesn't supply one. Exported for tests; callers should pass through
45
+ * `MemoryCacheOptions.instance`.
46
+ */
47
+ export function resolveInstanceId(override) {
48
+ if (override)
49
+ return override;
50
+ const k = process.env.K_REVISION;
51
+ if (k)
52
+ return k;
53
+ const h = hostname();
54
+ if (h)
55
+ return h;
56
+ return randomBytes(4).toString('hex');
57
+ }
58
+ /** Default cap when operator config doesn't override. */
59
+ const DEFAULT_MAX_ENTRIES = 10_000;
60
+ /** Default cap when operator config doesn't override. */
61
+ const DEFAULT_MAX_BYTES = 50 * 1024 * 1024; // 50 MB
62
+ /**
63
+ * Build a `MemoryCache` instance. Internal factory — kept public for
64
+ * tests and advanced wiring. Operators use the operator-facing
65
+ * `memoryCache()` factory exported from `gazetta` (Path X), which
66
+ * delegates here.
67
+ */
68
+ export function createMemoryCache(config = {}) {
69
+ const maxEntries = config.maxEntries ?? DEFAULT_MAX_ENTRIES;
70
+ const maxBytes = config.maxBytes ?? DEFAULT_MAX_BYTES;
71
+ const instance = resolveInstanceId(config.instance);
72
+ // Map insertion order is the LRU order; access touches it via
73
+ // delete+set on hit (Map.set on existing key preserves order, so
74
+ // the explicit delete-then-set is required to bump recency).
75
+ const entries = new Map();
76
+ let totalBytes = 0;
77
+ // Cross-instance event subscribers. Cut 2 never invokes these
78
+ // (no SSE bridge yet); Cut 4 wires emit on incoming SSE messages.
79
+ const subscribers = new Set();
80
+ // Operational counters surfaced via stats() per design-cache.md Q5.
81
+ let hits = 0;
82
+ let misses = 0;
83
+ let evictions = 0;
84
+ let lastInvalidation;
85
+ function evictOldestIfOverCap() {
86
+ while (entries.size > maxEntries || totalBytes > maxBytes) {
87
+ const oldestKey = entries.keys().next().value;
88
+ if (oldestKey === undefined)
89
+ return;
90
+ const entry = entries.get(oldestKey);
91
+ entries.delete(oldestKey);
92
+ if (entry)
93
+ totalBytes -= entry.bytes;
94
+ evictions++;
95
+ }
96
+ }
97
+ /**
98
+ * Notify subscribers of an invalidation. `prefix` is the **input**
99
+ * form (what the consumer passed to invalidate / invalidatePrefix);
100
+ * the version-prefix + overflow-hash applied by `applyKeyPolicy` is
101
+ * a storage encoding detail and never reaches event payloads.
102
+ *
103
+ * Subscribers that throw shouldn't poison sibling subscribers —
104
+ * each notification is wrapped in a try/catch. The error is
105
+ * swallowed (subscribe is observational; failing-open keeps the
106
+ * invalidation honest from the caller's POV).
107
+ */
108
+ function emit(prefix) {
109
+ if (subscribers.size === 0)
110
+ return;
111
+ const event = {
112
+ prefix,
113
+ source: { instance, timestamp: new Date().toISOString() },
114
+ };
115
+ for (const handler of subscribers) {
116
+ try {
117
+ handler(event);
118
+ }
119
+ catch {
120
+ // Subscriber faults must not interfere with the
121
+ // invalidation that triggered them. Silently swallow.
122
+ }
123
+ }
124
+ }
125
+ return {
126
+ async get(key) {
127
+ const wrapped = applyKeyPolicy(key);
128
+ const entry = entries.get(wrapped);
129
+ if (!entry) {
130
+ misses++;
131
+ return null;
132
+ }
133
+ // LRU touch — delete + re-insert moves to end (most recent).
134
+ entries.delete(wrapped);
135
+ entries.set(wrapped, entry);
136
+ hits++;
137
+ return entry.value;
138
+ },
139
+ async set(key, value, _opts) {
140
+ // TTL is part of the AdminCache contract but MemoryCache v1
141
+ // doesn't honor it — eviction is LRU-only. A future TTL pass
142
+ // (or a TTL-aware provider) handles expiry.
143
+ const wrapped = applyKeyPolicy(key);
144
+ const bytes = JSON.stringify(value).length;
145
+ const existing = entries.get(wrapped);
146
+ if (existing) {
147
+ totalBytes -= existing.bytes;
148
+ entries.delete(wrapped);
149
+ }
150
+ entries.set(wrapped, { value, bytes });
151
+ totalBytes += bytes;
152
+ evictOldestIfOverCap();
153
+ },
154
+ async invalidate(key) {
155
+ const wrapped = applyKeyPolicy(key);
156
+ const entry = entries.get(wrapped);
157
+ if (!entry)
158
+ return;
159
+ entries.delete(wrapped);
160
+ totalBytes -= entry.bytes;
161
+ emit(key);
162
+ },
163
+ async invalidatePrefix(prefix) {
164
+ const wrapped = applyPrefixPolicy(prefix);
165
+ let cleared = 0;
166
+ for (const [key, entry] of entries) {
167
+ if (key.startsWith(wrapped)) {
168
+ entries.delete(key);
169
+ totalBytes -= entry.bytes;
170
+ cleared++;
171
+ }
172
+ }
173
+ lastInvalidation = {
174
+ prefix,
175
+ at: new Date().toISOString(),
176
+ source: 'local',
177
+ };
178
+ // Emit even when cleared === 0 — subscribers (notably the
179
+ // L4→L6 SSE bridge) want every invalidation intent, not just
180
+ // those that hit something locally. A consumer's L6 cache may
181
+ // hold an entry the server's L4 already evicted via LRU.
182
+ emit(prefix);
183
+ return cleared;
184
+ },
185
+ subscribe(handler) {
186
+ subscribers.add(handler);
187
+ return () => {
188
+ subscribers.delete(handler);
189
+ };
190
+ },
191
+ async stats() {
192
+ return {
193
+ hits,
194
+ misses,
195
+ size: entries.size,
196
+ instance,
197
+ evictions,
198
+ bytesApproximate: totalBytes,
199
+ lastInvalidation,
200
+ };
201
+ },
202
+ };
203
+ }
204
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/cache/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { AdminCache } from './types.js';
2
+ /**
3
+ * Wrap an `AdminCache` with per-site key scoping. Every key written,
4
+ * read, or invalidated through the returned cache is transparently
5
+ * prefixed with `site:{encoded-name}:`.
6
+ *
7
+ * Examples (with siteName = 'main'):
8
+ * inner.set('site:main:pages:home', value) ← stored
9
+ * wrapped.set('pages:home', value) ← what consumers see
10
+ *
11
+ * Prefix invalidation works through the wrapping uniformly:
12
+ * wrapped.invalidatePrefix('pages:') ← consumer call
13
+ * inner.invalidatePrefix('site:main:pages:') ← actual mechanism
14
+ *
15
+ * The `subscribe()` handler receives events with the unwrapped
16
+ * (consumer-facing) prefix. Events for OTHER sites' invalidations
17
+ * reaching the same backing service are filtered out (they have a
18
+ * different `site:{other}:` prefix); cross-site events would be a
19
+ * leak otherwise.
20
+ */
21
+ export declare function forSite(inner: AdminCache, siteName: string): AdminCache;
22
+ //# sourceMappingURL=per-site.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"per-site.d.ts","sourceRoot":"","sources":["../../src/cache/per-site.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,UAAU,EAAiC,MAAM,YAAY,CAAA;AAS3E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA6DvE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Per-site cache scoping per `design-cache.md` Gap 3.
3
+ *
4
+ * Wraps an `AdminCache` instance with a site-name prefix on every
5
+ * key. Two motivations:
6
+ *
7
+ * 1. **Future shared backing services** (Redis, Azure cache when
8
+ * they ship) — a single Redis cluster shared across N Site
9
+ * processes needs key isolation so site A's cache writes don't
10
+ * collide with site B's. Per-site key prefix solves this at the
11
+ * wrapper layer; the backing provider is unaware.
12
+ *
13
+ * 2. **Multi-site deployments evolving over time** — pre-1.0
14
+ * Gazetta locks single-Site-per-process, so today there's no
15
+ * collision risk in-process. But a future configuration could
16
+ * legitimately host two Sites in one process; `forSite` makes
17
+ * that change additive.
18
+ *
19
+ * # SOLID lenses
20
+ *
21
+ * - SRP: this module owns "scope an AdminCache to a site name."
22
+ * Provider mechanics live in `memory.ts`; key encoding lives in
23
+ * `keys.ts`. Three concerns, three files.
24
+ * - OCP: a future `forPlugin(cache, pluginName)` wrapper composes
25
+ * identically; no change to consumers.
26
+ * - LSP: `forSite(cache, name)` returns an `AdminCache`. Any
27
+ * caller depending on the interface keeps working.
28
+ * - ISP: consumers see `AdminCache`, never the wrapping mechanism.
29
+ * - DIP: `loadSite()` wraps once at construction; consumers depend
30
+ * on `site.cache: AdminCache`.
31
+ */
32
+ import { encodeRefName } from '../hash.js';
33
+ /**
34
+ * Reserved prefix for the per-site key namespace. Documented as
35
+ * a built-in per `design-cache.md` Q1's "Reserved prefixes" rule —
36
+ * plugins must not write keys under `site:`.
37
+ */
38
+ const SITE_NAMESPACE = 'site';
39
+ /**
40
+ * Wrap an `AdminCache` with per-site key scoping. Every key written,
41
+ * read, or invalidated through the returned cache is transparently
42
+ * prefixed with `site:{encoded-name}:`.
43
+ *
44
+ * Examples (with siteName = 'main'):
45
+ * inner.set('site:main:pages:home', value) ← stored
46
+ * wrapped.set('pages:home', value) ← what consumers see
47
+ *
48
+ * Prefix invalidation works through the wrapping uniformly:
49
+ * wrapped.invalidatePrefix('pages:') ← consumer call
50
+ * inner.invalidatePrefix('site:main:pages:') ← actual mechanism
51
+ *
52
+ * The `subscribe()` handler receives events with the unwrapped
53
+ * (consumer-facing) prefix. Events for OTHER sites' invalidations
54
+ * reaching the same backing service are filtered out (they have a
55
+ * different `site:{other}:` prefix); cross-site events would be a
56
+ * leak otherwise.
57
+ */
58
+ export function forSite(inner, siteName) {
59
+ if (!siteName) {
60
+ throw new Error('forSite: siteName must be a non-empty string');
61
+ }
62
+ const encodedName = encodeRefName(siteName);
63
+ const sitePrefix = `${SITE_NAMESPACE}:${encodedName}:`;
64
+ function wrap(key) {
65
+ return `${sitePrefix}${key}`;
66
+ }
67
+ /**
68
+ * Strip the `site:{name}:` prefix from a stored key for handoff to
69
+ * a consumer subscriber. Returns null when the key isn't owned by
70
+ * this site (shared backing service receiving another site's event).
71
+ */
72
+ function unwrap(key) {
73
+ if (!key.startsWith(sitePrefix))
74
+ return null;
75
+ return key.slice(sitePrefix.length);
76
+ }
77
+ return {
78
+ async get(key) {
79
+ return inner.get(wrap(key));
80
+ },
81
+ async set(key, value, opts) {
82
+ return inner.set(wrap(key), value, opts);
83
+ },
84
+ async invalidate(key) {
85
+ return inner.invalidate(wrap(key));
86
+ },
87
+ async invalidatePrefix(prefix) {
88
+ return inner.invalidatePrefix(wrap(prefix));
89
+ },
90
+ subscribe(handler) {
91
+ // Forward only events that belong to this site; rewrite the
92
+ // prefix to the consumer-facing form before firing the handler.
93
+ return inner.subscribe(event => {
94
+ const unwrapped = unwrap(event.prefix);
95
+ if (unwrapped === null)
96
+ return;
97
+ handler({ ...event, prefix: unwrapped });
98
+ });
99
+ },
100
+ async stats() {
101
+ // Stats are global to the underlying provider — there's no
102
+ // honest way to slice them per-site without scanning every
103
+ // entry, which defeats the cache. Surface the inner stats
104
+ // verbatim; operators interpret them with the knowledge that
105
+ // shared backing services pool stats across all sites.
106
+ const innerStats = inner.stats;
107
+ if (!innerStats) {
108
+ return { hits: 0, misses: 0, size: 0 };
109
+ }
110
+ return innerStats.call(inner);
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=per-site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"per-site.js","sourceRoot":"","sources":["../../src/cache/per-site.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAG1C;;;;GAIG;AACH,MAAM,cAAc,GAAG,MAAM,CAAA;AAE7B;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,OAAO,CAAC,KAAiB,EAAE,QAAgB;IACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IACD,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,GAAG,cAAc,IAAI,WAAW,GAAG,CAAA;IAEtD,SAAS,IAAI,CAAC,GAAW;QACvB,OAAO,GAAG,UAAU,GAAG,GAAG,EAAE,CAAA;IAC9B,CAAC;IAED;;;;OAIG;IACH,SAAS,MAAM,CAAC,GAAW;QACzB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAI,GAAW;YACtB,OAAO,KAAK,CAAC,GAAG,CAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAChC,CAAC;QAED,KAAK,CAAC,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,IAAuB;YACzD,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;QAC1C,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAW;YAC1B,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,MAAc;YACnC,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7C,CAAC;QAED,SAAS,CAAC,OAA2C;YACnD,4DAA4D;YAC5D,gEAAgE;YAChE,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;gBAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACtC,IAAI,SAAS,KAAK,IAAI;oBAAE,OAAM;gBAC9B,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;YAC1C,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,KAAK;YACT,2DAA2D;YAC3D,2DAA2D;YAC3D,0DAA0D;YAC1D,6DAA6D;YAC7D,uDAAuD;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAA;YAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;YACxC,CAAC;YACD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * `AdminCache` — provider-substitutable interface for the L4 cache
3
+ * tier (admin / origin server). One concrete implementation ships in
4
+ * v1: `MemoryCache` (Cut 2). Reserved for v2: `RedisCache`,
5
+ * `AzureCache`, `FileCache`.
6
+ *
7
+ * # SOLID lenses
8
+ *
9
+ * - SRP: this module owns the cache contract (interface, stats,
10
+ * invalidation event). Nothing else lives here.
11
+ * - OCP: new providers implement `AdminCache` and slot into the
12
+ * factory (Cut 9). No existing module changes.
13
+ * - LSP: every provider honors the same contract. Substitutable
14
+ * in tests via the `adminCacheContractTests` helper (Cut 10).
15
+ * - ISP: callers depend on this interface, not on a specific
16
+ * provider's mechanism (Map, Redis pub/sub, Service Bus).
17
+ * - DIP: feature code calls `cache.get(key)` etc.; the seam to
18
+ * concrete providers is the factory.
19
+ *
20
+ * Locked invariants per `design-cache.md`:
21
+ * - Cached values MUST be JSON-serializable (no functions, no
22
+ * Symbols, no top-level Maps/Sets) — required for L4 → L6
23
+ * handoff via IndexedDB / localStorage.
24
+ * - `subscribe()` delivers invalidation events from any source
25
+ * (local OR cross-instance — Cut 4 contract evolution). The
26
+ * `event.source.instance` field discriminates origin so
27
+ * subscribers can filter as needed.
28
+ * - `invalidatePrefix()` is best-effort with a time cap (~100ms
29
+ * default per design-cache.md PWA-responsiveness principle);
30
+ * un-cleared entries clear at TTL or on next invalidation.
31
+ */
32
+ /**
33
+ * The cache contract. All providers implement this; consumers depend
34
+ * only on the interface.
35
+ */
36
+ export interface AdminCache {
37
+ /** Get cached value or null on miss. */
38
+ get<T>(key: string): Promise<T | null>;
39
+ /**
40
+ * Set value with optional TTL (seconds). Provider may ignore TTL
41
+ * if it doesn't support expiry; `MemoryCache` ignores TTL in v1
42
+ * (LRU-only eviction).
43
+ */
44
+ set<T>(key: string, value: T, opts?: {
45
+ ttl?: number;
46
+ }): Promise<void>;
47
+ /** Invalidate one key. */
48
+ invalidate(key: string): Promise<void>;
49
+ /** Invalidate all keys matching a prefix. Returns count cleared. */
50
+ invalidatePrefix(prefix: string): Promise<number>;
51
+ /**
52
+ * Subscribe to invalidation events from any source. Returns disposer.
53
+ *
54
+ * Local invalidations (this instance's `invalidate` /
55
+ * `invalidatePrefix` calls) AND cross-instance invalidations
56
+ * (delivered via SSE bridge or shared backing service) both fire
57
+ * the handler. Discriminate via `event.source.instance` —
58
+ * subscribers that only care about cross-instance events can filter
59
+ * out their own.
60
+ *
61
+ * The L4→L6 server-to-browser cascade is the load-bearing consumer:
62
+ * server-side `invalidatePrefix('pages:')` fires to a subscribed
63
+ * SSE route, which forwards the event to connected browser admin
64
+ * clients, which invalidate their L6 caches. From the browser's
65
+ * POV the server IS another instance, so "events from any source"
66
+ * is the right contract.
67
+ *
68
+ * Event payloads carry the **consumer-facing** prefix (the form
69
+ * passed to the invalidate call). Provider-internal storage
70
+ * details (version prefix, overflow hash, per-site scope) don't
71
+ * leak into the event.
72
+ *
73
+ * **No replay on reconnect.** Subscribers (notably the SSE bridge
74
+ * forwarding to browsers) that lose their connection get no
75
+ * server-side replay of events they missed during the gap. The
76
+ * contract: on reconnect, treat your own cached state as
77
+ * potentially stale and reset (re-fetch from source). The L6 admin
78
+ * cache (`design-offline.md`) follows this rule via full reset on
79
+ * reconnect.
80
+ *
81
+ * **Handlers should be synchronous.** Providers fire subscribers
82
+ * with `handler(event)` — without `await`. TypeScript's `void`
83
+ * return type accepts async handlers for ergonomic reasons, but
84
+ * the cache won't await them; rejections from a returned Promise
85
+ * become unhandled. Subscribers needing async work should enqueue
86
+ * synchronously and process asynchronously elsewhere (e.g., the
87
+ * SSE bridge pushes to a buffer + drains from a stream loop).
88
+ */
89
+ subscribe(handler: (event: InvalidationEvent) => void): () => void;
90
+ /** Stats for diagnostics. Optional — not every provider exposes. */
91
+ stats?(): Promise<CacheStats>;
92
+ }
93
+ /**
94
+ * Event delivered to `subscribe()` handlers when another instance
95
+ * invalidates a cache prefix. Source identifies the originating
96
+ * instance for cross-instance correlation.
97
+ */
98
+ export interface InvalidationEvent {
99
+ /** Key or prefix that was invalidated. */
100
+ prefix: string;
101
+ /** Originating instance + wall-clock timestamp (ISO 8601). */
102
+ source: {
103
+ instance: string;
104
+ timestamp: string;
105
+ };
106
+ }
107
+ /**
108
+ * Cache stats — minimum required + provider-specific extras allowed.
109
+ *
110
+ * The required floor (hits, misses, size) lets the
111
+ * `/api/system/cache/stats` route (Cut 7) report a useful baseline
112
+ * across all providers. Optional fields (errors, evictions,
113
+ * bytesApproximate, oldestEntryAt, lastInvalidation,
114
+ * subscribeReconnects) ship as the relevant provider tracks them.
115
+ */
116
+ export interface CacheStats {
117
+ hits: number;
118
+ misses: number;
119
+ /** Entry count. */
120
+ size: number;
121
+ /**
122
+ * Identity of the reporting cache instance — same value as
123
+ * `InvalidationEvent.source.instance` for events emitted by this
124
+ * provider. Operators querying `/api/system/cache/stats` in
125
+ * multi-instance deployments use this to know which pod / revision
126
+ * answered (the load balancer's choice can vary between requests).
127
+ * Optional because some providers may not have a meaningful
128
+ * identity (e.g., a no-op stub).
129
+ */
130
+ instance?: string;
131
+ errors?: number;
132
+ evictions?: number;
133
+ bytesApproximate?: number;
134
+ oldestEntryAt?: string;
135
+ lastInvalidation?: {
136
+ prefix: string;
137
+ at: string;
138
+ source: string;
139
+ };
140
+ subscribeReconnects?: number;
141
+ }
142
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACtC;;;;OAIG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE,0BAA0B;IAC1B,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC,oEAAoE;IACpE,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IACjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAClE,oEAAoE;IACpE,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAA;IACd,8DAA8D;IAC9D,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAChD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `AdminCache` — provider-substitutable interface for the L4 cache
3
+ * tier (admin / origin server). One concrete implementation ships in
4
+ * v1: `MemoryCache` (Cut 2). Reserved for v2: `RedisCache`,
5
+ * `AzureCache`, `FileCache`.
6
+ *
7
+ * # SOLID lenses
8
+ *
9
+ * - SRP: this module owns the cache contract (interface, stats,
10
+ * invalidation event). Nothing else lives here.
11
+ * - OCP: new providers implement `AdminCache` and slot into the
12
+ * factory (Cut 9). No existing module changes.
13
+ * - LSP: every provider honors the same contract. Substitutable
14
+ * in tests via the `adminCacheContractTests` helper (Cut 10).
15
+ * - ISP: callers depend on this interface, not on a specific
16
+ * provider's mechanism (Map, Redis pub/sub, Service Bus).
17
+ * - DIP: feature code calls `cache.get(key)` etc.; the seam to
18
+ * concrete providers is the factory.
19
+ *
20
+ * Locked invariants per `design-cache.md`:
21
+ * - Cached values MUST be JSON-serializable (no functions, no
22
+ * Symbols, no top-level Maps/Sets) — required for L4 → L6
23
+ * handoff via IndexedDB / localStorage.
24
+ * - `subscribe()` delivers invalidation events from any source
25
+ * (local OR cross-instance — Cut 4 contract evolution). The
26
+ * `event.source.instance` field discriminates origin so
27
+ * subscribers can filter as needed.
28
+ * - `invalidatePrefix()` is best-effort with a time cap (~100ms
29
+ * default per design-cache.md PWA-responsiveness principle);
30
+ * un-cleared entries clear at TTL or on next invalidation.
31
+ */
32
+ export {};
33
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `gazetta archive <subcommand>` runner — Cut 13 of the soft-delete
3
+ * implementation plan.
4
+ *
5
+ * Subcommands (per design-soft-delete.md Q13 L4 lock):
6
+ * archive list [--kind=page|fragment]
7
+ * archive purge <name> [--kind=page|fragment] [--force]
8
+ * archive restore <name> [--kind=page|fragment]
9
+ * archive rename <oldname> <newname> [--kind=page|fragment] [--no-keep-alias]
10
+ *
11
+ * Implementation strategy: the CLI invokes the same admin-api routes
12
+ * the admin UI uses, via `app.request()` against an in-process
13
+ * `createAdminApp`. This reuses every primitive (audit, capability,
14
+ * cache invalidation, sidecar writes) and avoids parallel CLI-only
15
+ * code paths that could drift from the route handlers.
16
+ *
17
+ * Cron-friendly output: structured per-line stdout, one line per
18
+ * archive in `list`, single result line per item in
19
+ * purge/restore/rename. Non-zero exit on any failure. NO_COLOR / non-
20
+ * TTY suppresses ANSI codes via the shared sink.
21
+ *
22
+ * SOLID lenses:
23
+ * - SRP: one module per concern. Subcommand dispatch lives here;
24
+ * archive primitives stay in `admin-api/routes/archive.ts` +
25
+ * `rename.ts`. CLI only orchestrates I/O + dispatch.
26
+ * - OCP: adding a subcommand = new handler + entry in dispatch map.
27
+ * - DIP: depends on admin-api `app.request` interface, not on
28
+ * individual route implementations.
29
+ */
30
+ import type { OutputSink } from './assets-cli.js';
31
+ export interface ArchiveSubcommandInput {
32
+ /** All argv after the `archive` keyword. e.g. `['list']`, `['purge', 'old-page']`. */
33
+ args: readonly string[];
34
+ /** Project site directory. */
35
+ siteDir: string;
36
+ /** Optional target name override. */
37
+ targetName?: string;
38
+ /** Sink for output. Defaults to `consoleSink`. */
39
+ sink?: OutputSink;
40
+ /** Test hook: skip `process.exit` on bad input. */
41
+ exitOnError?: (code: number) => void;
42
+ }
43
+ export declare function runArchiveSubcommand(input: ArchiveSubcommandInput): Promise<void>;
44
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/cli/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGjD,MAAM,WAAW,sBAAsB;IACrC,sFAAsF;IACtF,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,mDAAmD;IACnD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC;AAMD,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEvF"}