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,113 @@
1
+ /**
2
+ * Image preprocessing for vision-using AI tasks.
3
+ *
4
+ * # Single responsibility
5
+ *
6
+ * Take raw asset bytes; return bytes suitable for sending to a vision
7
+ * provider. Concretely:
8
+ *
9
+ * - Resize to `MAX_EDGE` long-edge (default 768) preserving aspect ratio
10
+ * - Re-encode to JPEG (or PNG if alpha) post-resize
11
+ * - Rasterize SVG to PNG at MAX_EDGE
12
+ * - Pass through if already small (no needless re-encode)
13
+ * - Use the analyzer-extracted poster bytes for animated images
14
+ *
15
+ * No knowledge of providers, prompts, refusal, or task-specific config.
16
+ *
17
+ * # Why 768
18
+ *
19
+ * Smallest size that fits all v1.5 providers natively without quality
20
+ * loss:
21
+ *
22
+ * - Ollama llama3.2-vision native input is 1120×1120
23
+ * - Anthropic Claude (non-Opus) recommended max long edge is 1568
24
+ * - OpenAI gpt-4o "high detail" mode targets 768 as the short-edge
25
+ * value when tiling 512×512 — chosen by OpenAI as the size where
26
+ * in-image text remains legible
27
+ *
28
+ * 768 sits below all three ceilings, makes OpenAI tile to exactly
29
+ * 4 tiles + base = 765 tokens, and produces predictable cost on
30
+ * Anthropic (~786 tokens for a 768×768 image, well under the 1568
31
+ * token ceiling).
32
+ *
33
+ * Going lower (e.g., 512) hits OpenAI's "low detail" tier which the
34
+ * provider's own docs mark as worse for in-image text. Going higher
35
+ * exceeds Ollama's native input so the model downsamples internally
36
+ * — we'd be paying upload bandwidth for bytes that get discarded.
37
+ *
38
+ * # Per-task override
39
+ *
40
+ * Vision tasks that need different sizing (e.g., a future tag-suggestion
41
+ * task on detailed product shots wanting 1024) pass `maxEdge` per call.
42
+ * `MAX_EDGE` is the default; `prepareForVision` accepts an override.
43
+ *
44
+ * # Animated images
45
+ *
46
+ * The animated-image analyzer (shipped in media v1) extracts a
47
+ * first-frame PNG poster as a supplementary file. Suggester callers
48
+ * pass those bytes via `posterBytes` — `prepareForVision` skips its
49
+ * own rasterization and uses the poster directly. Cross-feature reuse
50
+ * over duplication.
51
+ *
52
+ * # SOLID lenses
53
+ *
54
+ * - SRP: this module owns "raw asset bytes → vision-call bytes"
55
+ * - OCP: a future `pdf-prep.ts` peer handles document tasks the same way
56
+ * - DIP: callers depend on `prepareForVision`, not on sharp directly
57
+ */
58
+ import sharp from 'sharp';
59
+ /** Default long-edge cap. Per-call override available via `maxEdge`. */
60
+ export const MAX_EDGE = 768;
61
+ /**
62
+ * SVG rasterization density. 144 dpi is a sensible doubled-72-dpi
63
+ * default that produces ~2x the nominal SVG dimensions. Combined with
64
+ * the resize step, the final output is bounded by `maxEdge` regardless
65
+ * of the SVG's intrinsic size — density only affects rendering quality
66
+ * before the cap kicks in.
67
+ */
68
+ const SVG_DENSITY = 144;
69
+ /**
70
+ * Prepare image bytes for a vision-call. Single async call that picks
71
+ * the right code path based on input.
72
+ *
73
+ * Throws on hard failures (corrupt source bytes that sharp can't
74
+ * decode, even past metadata). Callers wrap in their adapter's error
75
+ * taxonomy.
76
+ */
77
+ export async function prepareForVision(input) {
78
+ const maxEdge = input.maxEdge ?? MAX_EDGE;
79
+ // Animated source: use the pre-extracted poster bytes (always PNG).
80
+ // Posters are extracted at upload time and already represent the
81
+ // first frame; for vision-call purposes that's what we want.
82
+ if (input.posterBytes) {
83
+ return { bytes: input.posterBytes, mime: 'image/png' };
84
+ }
85
+ // SVG: rasterize to PNG at the cap. Vector input has no intrinsic
86
+ // pixel size; we pick density × resize to bound the output.
87
+ if (input.mime === 'image/svg+xml') {
88
+ const buf = await sharp(input.bytes, { density: SVG_DENSITY })
89
+ .resize({ width: maxEdge, height: maxEdge, fit: 'inside' })
90
+ .png()
91
+ .toBuffer();
92
+ return { bytes: new Uint8Array(buf), mime: 'image/png' };
93
+ }
94
+ // Raster: resize if larger than maxEdge on long edge; otherwise pass
95
+ // through. Avoids a no-op JPEG-of-JPEG re-encode that would lose
96
+ // quality without saving bandwidth.
97
+ const meta = await sharp(input.bytes).metadata();
98
+ const longEdge = Math.max(meta.width ?? 0, meta.height ?? 0);
99
+ if (longEdge > 0 && longEdge <= maxEdge) {
100
+ return { bytes: input.bytes, mime: input.mime };
101
+ }
102
+ // Preserve PNG when source has alpha (logos with transparency lose
103
+ // semantically when flattened to JPEG). Otherwise JPEG quality 85 —
104
+ // sharp's default for `.jpeg()`, well-balanced for AI input.
105
+ const hasAlpha = meta.hasAlpha === true;
106
+ const pipeline = sharp(input.bytes).resize({ width: maxEdge, height: maxEdge, fit: 'inside' });
107
+ const buf = hasAlpha ? await pipeline.png().toBuffer() : await pipeline.jpeg({ quality: 85 }).toBuffer();
108
+ return {
109
+ bytes: new Uint8Array(buf),
110
+ mime: hasAlpha ? 'image/png' : 'image/jpeg',
111
+ };
112
+ }
113
+ //# sourceMappingURL=vision-prep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-prep.js","sourceRoot":"","sources":["../../src/ai/vision-prep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,wEAAwE;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAwB3B;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAmB;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAA;IAEzC,oEAAoE;IACpE,iEAAiE;IACjE,6DAA6D;IAC7D,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IACxD,CAAC;IAED,kEAAkE;IAClE,4DAA4D;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;aAC3D,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;aAC1D,GAAG,EAAE;aACL,QAAQ,EAAE,CAAA;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAC1D,CAAC;IAED,qEAAqE;IACrE,iEAAiE;IACjE,oCAAoC;IACpC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAC5D,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAA;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9F,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxG,OAAO;QACL,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;QAC1B,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;KAC5C,CAAA;AACH,CAAC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * `AltTextAdapter` — provider-substitutable interface for generating
3
+ * alt text from image bytes.
4
+ *
5
+ * Three concrete implementations ship in v1.5: `anthropicAltAdapter`,
6
+ * `openAIAltAdapter`, `ollamaAltAdapter` (commits 3-5). One safe
7
+ * default also ships: `nullAltAdapter` (this commit), used when no
8
+ * adapter is configured for the target.
9
+ *
10
+ * # SOLID lenses
11
+ *
12
+ * - SRP: this module owns the alt-text task contracts (request,
13
+ * suggestion, adapter interface). Nothing else lives here.
14
+ * - OCP: new providers implement the interface and slot into the
15
+ * factory (commit 6). No existing module changes.
16
+ * - LSP: every adapter — including `nullAltAdapter` — honors the
17
+ * same contract. Substitutable in tests.
18
+ * - ISP: adapter exposes only `name`, `supports`, `generate` — no
19
+ * UI concerns, no config concerns.
20
+ * - DIP: callers depend on this interface, not on Anthropic SDK,
21
+ * OpenAI SDK, or Ollama HTTP details.
22
+ *
23
+ * # Why `AltSuggestion` carries refused state
24
+ *
25
+ * Vision providers can return a 200 OK with refusal text in the
26
+ * content field (e.g., "I can't describe this image"). The structural
27
+ * cut: refusal is a *successful API call with a domain-level no*.
28
+ * Treating refusal as a structured field — not as inspecting `text`
29
+ * for substrings in every consumer — keeps DIP. UI consumers branch
30
+ * on `refused`, not on text patterns.
31
+ *
32
+ * Considered and rejected: a `confidence: number | null` field.
33
+ * Vision providers don't expose calibrated confidence for free-form
34
+ * description tasks; a hardcoded null would be a stub-on-the-interface
35
+ * (LSP violation, per [team-preferences rule 18]). If a future
36
+ * provider exposes real calibrated confidence, it lands as a separate
37
+ * field — not as a retrofit of a placeholder.
38
+ */
39
+ import type { PromptPolicy } from '../ai/compose-prompt.js';
40
+ /**
41
+ * What the caller wants. Provider-agnostic. Each field has a documented
42
+ * default applied by the factory when callers don't specify.
43
+ */
44
+ export interface AltRequest {
45
+ /**
46
+ * Target language for the description (BCP 47 locale code; 'en',
47
+ * 'fr', 'pt-BR'). The model writes alt directly in this language —
48
+ * no separate translation pass. Default 'en'.
49
+ */
50
+ locale: string;
51
+ /**
52
+ * Soft length suggestion in characters. Used in prompt guidance
53
+ * ("Maximum N characters") and as native `max_tokens` derivation
54
+ * for adapters that have it. Default 125 (WAI-ARIA convention).
55
+ *
56
+ * NOT enforced by the suggester or adapter — if the model returns
57
+ * longer text, the consumer sees the full string and can edit. Hard
58
+ * truncation would lose meaning.
59
+ */
60
+ maxChars: number;
61
+ /**
62
+ * Output style. Closed enum; extended additively (future:
63
+ * `'marketing' | 'technical'`).
64
+ */
65
+ style: AltStyle;
66
+ }
67
+ /** Closed enum; extends additively. */
68
+ export type AltStyle = 'descriptive';
69
+ /** Default `AltRequest` values, applied by the suggester when callers omit fields. */
70
+ export declare const DEFAULT_ALT_REQUEST: AltRequest;
71
+ /**
72
+ * What the suggester delivers. `text` is the model's output (which may
73
+ * be a refusal). `refused` is the structured signal: when true, don't
74
+ * auto-fill, surface `refusalReason` to the author instead.
75
+ */
76
+ export interface AltSuggestion {
77
+ text: string;
78
+ /** True when the model declined or couldn't describe the image. */
79
+ refused: boolean;
80
+ /** Truncated reason text when refused; null otherwise. */
81
+ refusalReason: string | null;
82
+ }
83
+ /**
84
+ * Input to an adapter's `generate` call. The suggester does prep:
85
+ *
86
+ * - Resolves `AltRequest` from caller-provided fields + defaults
87
+ * - Composes the prompt via `composePrompt(request, policies)`
88
+ * - Calls `prepareForVision` on the bytes
89
+ *
90
+ * The adapter receives both the structured request (for native params
91
+ * like Anthropic's `max_tokens`) and the composed prompt string (for
92
+ * adapters that just inject text). Pre-computed once per call.
93
+ */
94
+ export interface AltGenerateInput {
95
+ /** Bytes ready to send to the provider (post-prep, ≤ maxImageEdge). */
96
+ bytes: Uint8Array;
97
+ /** MIME of the prepared bytes — `image/jpeg` or `image/png`. */
98
+ mime: string;
99
+ /** Structured request — adapters with native parameters use this. */
100
+ request: AltRequest;
101
+ /** Composed prompt string — adapters that just need a prompt use this. */
102
+ prompt: string;
103
+ }
104
+ /**
105
+ * Per-task adapter contract. Every implementation honors this exactly;
106
+ * substitutable across tests and production via the factory.
107
+ *
108
+ * Throws on transport / provider errors (`AIAdapterFailedError` from
109
+ * `ai/errors.ts`). Refusals are NOT thrown — they're returned in the
110
+ * structured `AltSuggestion`. The distinction: throws are runtime
111
+ * failures (retryable; gateway-level concern); refusals are domain
112
+ * outcomes (not retryable; user-level concern).
113
+ */
114
+ export interface AltTextAdapter {
115
+ /** Stable identifier for diagnostics ('anthropic', 'openai', 'ollama', 'null'). */
116
+ readonly name: string;
117
+ /**
118
+ * True when this adapter can describe the given MIME. v1.5 adapters
119
+ * support image MIMEs only. The null adapter returns false for
120
+ * everything.
121
+ */
122
+ supports(mime: string): boolean;
123
+ /**
124
+ * Generate alt text. Forwards `signal` to the underlying provider
125
+ * call so consumers can cancel in-flight requests (e.g., when the
126
+ * author starts typing into the alt field).
127
+ *
128
+ * Throws `AIAdapterFailedError` / `AIInvalidResponseError` on
129
+ * transport or response-shape failures. Returns refusals as
130
+ * `AltSuggestion` with `refused: true`.
131
+ */
132
+ generate(input: AltGenerateInput, signal?: AbortSignal): Promise<AltSuggestion>;
133
+ }
134
+ /**
135
+ * Type alias for prompt policies operating on alt-text requests.
136
+ * Per-task policy modules implement these and pass arrays to the
137
+ * generic `composePrompt<AltRequest>(req, policies)`.
138
+ */
139
+ export type AltPromptPolicy = PromptPolicy<AltRequest>;
140
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/alt/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAA;CAChB;AAED,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAA;AAEpC,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,KAAK,EAAE,UAAU,CAAA;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,OAAO,EAAE,UAAU,CAAA;IACnB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAE/B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAChF;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ /** Default `AltRequest` values, applied by the suggester when callers omit fields. */
2
+ export const DEFAULT_ALT_REQUEST = {
3
+ locale: 'en',
4
+ maxChars: 125,
5
+ style: 'descriptive',
6
+ };
7
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/alt/adapter.ts"],"names":[],"mappings":"AAuEA,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,aAAa;CACrB,CAAA"}
@@ -0,0 +1,63 @@
1
+ import type { AIProvider } from '../ai/provider.js';
2
+ import type { AltTextAdapter } from './adapter.js';
3
+ /**
4
+ * Default model for the Anthropic adapter. Haiku is the cost-optimized
5
+ * choice for the alt-text task (~$0.003/image at 768x768 input). Sites
6
+ * needing higher quality set `altText.model` in `site.config.ts` to a
7
+ * Sonnet or Opus model.
8
+ */
9
+ export declare const ANTHROPIC_DEFAULT_MODEL = "claude-haiku-4-5";
10
+ /**
11
+ * Anthropic transport-only options. Per Path X (single-axis with
12
+ * transport-vs-task split for AI), these fields bind to "which Anthropic
13
+ * account at which endpoint" — not to per-task tuning. Per-task config
14
+ * (model, systemPrompt, maxTokens) lives on the resolver-supplied
15
+ * `AltTextTaskConfig`, not here.
16
+ */
17
+ export interface AnthropicTransportOptions {
18
+ apiKey: string;
19
+ /**
20
+ * Optional override of the SDK base URL — handy for tests pointing
21
+ * at msw, or future operators routing through a private proxy.
22
+ */
23
+ baseURL?: string;
24
+ /**
25
+ * Override the SDK's retry count (default 2). Tests pass 0 to keep
26
+ * runs deterministic and fast; production sticks with the default
27
+ * so transient 429/5xx are auto-retried with backoff.
28
+ */
29
+ maxRetries?: number;
30
+ }
31
+ /**
32
+ * Internal type for `createAnthropicAltAdapter` callers (tests).
33
+ * Combines transport with per-task config so existing tests don't have
34
+ * to thread two arguments. New code goes through the operator-facing
35
+ * `anthropicProvider(transport).altText(taskConfig)` chain.
36
+ */
37
+ export interface AnthropicAltAdapterOptions extends AnthropicTransportOptions {
38
+ /** Model ID; defaults to {@link ANTHROPIC_DEFAULT_MODEL} when absent. */
39
+ model?: string;
40
+ /** Operator-supplied system prompt; prepended to system-composed prompt. */
41
+ systemPrompt?: string;
42
+ /** Generation token cap; provider derives from maxChars when absent. */
43
+ maxTokens?: number;
44
+ }
45
+ /**
46
+ * Construct the Anthropic alt-text adapter. Internal factory — kept
47
+ * public for tests + advanced wiring. Operator-facing config goes
48
+ * through `anthropicProvider(transport).altText(taskConfig)` (Path X).
49
+ */
50
+ export declare function createAnthropicAltAdapter(opts: AnthropicAltAdapterOptions): AltTextAdapter;
51
+ /**
52
+ * Operator-facing Anthropic provider. Constructs the transport-only
53
+ * `AIProvider` used in `site.config.ts`:
54
+ *
55
+ * const anthropic = anthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })
56
+ * ai: { provider: anthropic, model: 'claude-haiku-4-5' }
57
+ *
58
+ * The provider exposes per-task builders (`.altText({...})`); the
59
+ * resolver supplies the merged `AltTextTaskConfig` from the three-rung
60
+ * inheritance chain at boot.
61
+ */
62
+ export declare function anthropicProvider(transport: AnthropicTransportOptions): AIProvider;
63
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/alt/anthropic.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AASlD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,qBAAqB,CAAA;AAUzD;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA2B,SAAQ,yBAAyB;IAC3E,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,0BAA0B,GAAG,cAAc,CAoD1F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,yBAAyB,GAAG,UAAU,CAelF"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Anthropic Claude adapter — alt-text via the `messages.create` vision API.
3
+ *
4
+ * # Defaults
5
+ *
6
+ * - Model: `claude-haiku-4-5` (cost-effective vision; ~$0.003/image).
7
+ * Sites needing higher quality override via `altText.model` in `site.config.ts`.
8
+ *
9
+ * # API contract details (verified against @anthropic-ai/sdk v0.92.0)
10
+ *
11
+ * - Image content: `{ type: 'image', source: { type: 'base64',
12
+ * media_type, data: <base64-string> } }`. SDK requires base64-encoded
13
+ * string, not raw bytes/Uint8Array.
14
+ * - Accepted MIME types: `image/jpeg`, `image/png`, `image/gif`,
15
+ * `image/webp`. After `prepareForVision`, our bytes are always JPEG
16
+ * or PNG, both supported.
17
+ * - `max_tokens` is required by the API. Scaffold derives it from
18
+ * `request.maxChars` unless operator overrides via `maxTokens`.
19
+ * - `system` parameter at the top level (not a message role). The
20
+ * scaffold-prepared `systemPrompt` (operator override + composed)
21
+ * becomes the system prompt; the user message holds the image.
22
+ *
23
+ * # AbortSignal
24
+ *
25
+ * - Passed via `messages.create(body, { signal })`. SDK throws
26
+ * `APIUserAbortError` on abort; scaffold's `isAbortError` recognizes
27
+ * it so the suggester can return null on cancellation.
28
+ *
29
+ * # SOLID
30
+ *
31
+ * - SRP: this module owns the Anthropic-specific request shape and
32
+ * response parsing only. Orchestration (prompt-prepend, max-tokens
33
+ * derivation, error translation, refusal detection) lives in
34
+ * `ai/adapter-scaffold.ts`.
35
+ * - LSP: implements `AltTextAdapter` exactly via the scaffold —
36
+ * substitutable.
37
+ * - DIP: callers depend on `AltTextAdapter`; never on `Anthropic` SDK
38
+ * type directly.
39
+ */
40
+ import Anthropic from '@anthropic-ai/sdk';
41
+ import { AIInvalidResponseError } from '../ai/errors.js';
42
+ import { buildAltAdapterFromScaffold } from '../ai/adapter-scaffold.js';
43
+ /**
44
+ * Anthropic-specific refusal phrases observed in production responses
45
+ * but not yet in `ai/refusal.ts`'s shared list. Maintained here so
46
+ * provider-specific markers evolve independently of the shared list.
47
+ */
48
+ const ANTHROPIC_REFUSAL_MARKERS = ['i cannot create captions', 'i cannot generate descriptions'];
49
+ /**
50
+ * Default model for the Anthropic adapter. Haiku is the cost-optimized
51
+ * choice for the alt-text task (~$0.003/image at 768x768 input). Sites
52
+ * needing higher quality set `altText.model` in `site.config.ts` to a
53
+ * Sonnet or Opus model.
54
+ */
55
+ export const ANTHROPIC_DEFAULT_MODEL = 'claude-haiku-4-5';
56
+ /**
57
+ * Anthropic only accepts a subset of image MIME types. After
58
+ * `prepareForVision` our bytes are JPEG or PNG, but defending here
59
+ * means a future caller invoking the adapter directly with WebP or
60
+ * GIF still gets the right answer.
61
+ */
62
+ const ANTHROPIC_SUPPORTED_MIMES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp']);
63
+ /** Encode a Uint8Array as a base64 string for the API call. */
64
+ function toBase64(bytes) {
65
+ return Buffer.from(bytes).toString('base64');
66
+ }
67
+ /**
68
+ * Construct the Anthropic alt-text adapter. Internal factory — kept
69
+ * public for tests + advanced wiring. Operator-facing config goes
70
+ * through `anthropicProvider(transport).altText(taskConfig)` (Path X).
71
+ */
72
+ export function createAnthropicAltAdapter(opts) {
73
+ const client = new Anthropic({
74
+ apiKey: opts.apiKey,
75
+ baseURL: opts.baseURL,
76
+ maxRetries: opts.maxRetries,
77
+ });
78
+ const model = opts.model ?? ANTHROPIC_DEFAULT_MODEL;
79
+ return buildAltAdapterFromScaffold({
80
+ name: 'anthropic',
81
+ supportedMimes: ANTHROPIC_SUPPORTED_MIMES,
82
+ operatorSystemPrompt: opts.systemPrompt,
83
+ operatorMaxTokens: opts.maxTokens,
84
+ refusalMarkers: ANTHROPIC_REFUSAL_MARKERS,
85
+ isAbortError: err => err instanceof Anthropic.APIUserAbortError,
86
+ async callProvider({ bytes, mime, systemPrompt, maxTokens, signal }) {
87
+ const response = await client.messages.create({
88
+ model,
89
+ max_tokens: maxTokens,
90
+ system: systemPrompt,
91
+ messages: [
92
+ {
93
+ role: 'user',
94
+ content: [
95
+ {
96
+ type: 'image',
97
+ source: {
98
+ type: 'base64',
99
+ // SDK accepts the four MIMEs above; cast is safe
100
+ // because supports() guards entry.
101
+ media_type: mime,
102
+ data: toBase64(bytes),
103
+ },
104
+ },
105
+ ],
106
+ },
107
+ ],
108
+ }, { signal });
109
+ // Response shape: `content` is an array of blocks; alt-text comes
110
+ // back as a single text block. Defensive against tool-use blocks
111
+ // or unexpected shapes by finding the first text block.
112
+ const textBlock = response.content.find(block => block.type === 'text');
113
+ if (!textBlock || textBlock.type !== 'text') {
114
+ throw new AIInvalidResponseError('Anthropic response contained no text content block');
115
+ }
116
+ return textBlock.text;
117
+ },
118
+ });
119
+ }
120
+ /**
121
+ * Operator-facing Anthropic provider. Constructs the transport-only
122
+ * `AIProvider` used in `site.config.ts`:
123
+ *
124
+ * const anthropic = anthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })
125
+ * ai: { provider: anthropic, model: 'claude-haiku-4-5' }
126
+ *
127
+ * The provider exposes per-task builders (`.altText({...})`); the
128
+ * resolver supplies the merged `AltTextTaskConfig` from the three-rung
129
+ * inheritance chain at boot.
130
+ */
131
+ export function anthropicProvider(transport) {
132
+ if (!transport.apiKey) {
133
+ throw new Error('anthropicProvider: "apiKey" is required (typically `process.env.ANTHROPIC_API_KEY!`)');
134
+ }
135
+ return {
136
+ name: 'anthropic',
137
+ altText(taskConfig) {
138
+ return createAnthropicAltAdapter({
139
+ ...transport,
140
+ model: taskConfig.model,
141
+ systemPrompt: taskConfig.systemPrompt,
142
+ maxTokens: taskConfig.maxTokens,
143
+ });
144
+ },
145
+ };
146
+ }
147
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/alt/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAGvE;;;;GAIG;AACH,MAAM,yBAAyB,GAAsB,CAAC,0BAA0B,EAAE,gCAAgC,CAAC,CAAA;AAEnH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;AAuCjG,+DAA+D;AAC/D,SAAS,QAAQ,CAAC,KAAiB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,uBAAuB,CAAA;IAEnD,OAAO,2BAA2B,CAAC;QACjC,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,yBAAyB;QACzC,oBAAoB,EAAE,IAAI,CAAC,YAAY;QACvC,iBAAiB,EAAE,IAAI,CAAC,SAAS;QACjC,cAAc,EAAE,yBAAyB;QACzC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,SAAS,CAAC,iBAAiB;QAC/D,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;gBACE,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,OAAO;gCACb,MAAM,EAAE;oCACN,IAAI,EAAE,QAAQ;oCACd,iDAAiD;oCACjD,mCAAmC;oCACnC,UAAU,EAAE,IAA+D;oCAC3E,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;iCACtB;6BACF;yBACF;qBACF;iBACF;aACF,EACD,EAAE,MAAM,EAAE,CACX,CAAA;YAED,kEAAkE;YAClE,iEAAiE;YACjE,wDAAwD;YACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;YACvE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5C,MAAM,IAAI,sBAAsB,CAAC,oDAAoD,CAAC,CAAA;YACxF,CAAC;YACD,OAAO,SAAS,CAAC,IAAI,CAAA;QACvB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoC;IACpE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;IACzG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,CAAC,UAA6B;YACnC,OAAO,yBAAyB,CAAC;gBAC/B,GAAG,SAAS;gBACZ,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,SAAS,EAAE,UAAU,CAAC,SAAS;aAChC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Alt-text config resolver — composes gazetta-level + site-level + per-target
3
+ * config into a single `ResolvedAltConfig` per [`design-ai.md`](../../../.claude/rules/design-ai.md)
4
+ * "Three-rung inheritance" + Path X Exception A.
5
+ *
6
+ * Three-rung chain (target → site → gazetta), per field:
7
+ *
8
+ * - `provider` (transport): target.altText.ai.provider ?? site.ai.provider ?? gazetta.ai.provider
9
+ * - `model`: target.altText.ai.model ?? site.ai.model ?? gazetta.ai.model
10
+ * ?? PROVIDER_DEFAULT_MODELS[provider.name]
11
+ * - `systemPrompt`: target.altText.ai.systemPrompt ?? site.altText.systemPrompt
12
+ * ?? gazetta.altText.systemPrompt ?? null
13
+ * - `maxTokens`: target.altText.ai.maxTokens ?? site.altText.maxTokens
14
+ * ?? gazetta.altText.maxTokens ?? undefined
15
+ * - `auto` (behavior): target.altText.auto ?? site.altText.auto ?? gazetta.altText.auto
16
+ * ?? DEFAULT_AUTO
17
+ * - `maxImageEdge` (behavior): target.altText.maxImageEdge ?? site.altText.maxImageEdge
18
+ * ?? gazetta.altText.maxImageEdge ?? MAX_EDGE
19
+ *
20
+ * Behavior fields (`auto`, `maxImageEdge`) live at the root of `altText:`
21
+ * (Exception B); AI fields (provider, model, systemPrompt, maxTokens)
22
+ * live under `altText.ai` at target level (Exception A's third rung).
23
+ *
24
+ * Pure function — no I/O, no env reads, no SDK construction. The factory
25
+ * in `alt/factory.ts` consumes the resolved config + calls
26
+ * `provider.altText({...})` to build the adapter.
27
+ *
28
+ * # SOLID
29
+ *
30
+ * - SRP: this module owns "merge config layers into one resolved value."
31
+ * Doesn't read env, doesn't construct adapters.
32
+ * - DIP: factory depends on this resolved shape, never on raw
33
+ * `SiteManifest`/`TargetConfig`.
34
+ * - LSP: resolver is total — every input shape produces either a
35
+ * `ResolvedAltConfig` or `null`.
36
+ */
37
+ import type { AIProvider } from '../ai/provider.js';
38
+ import type { GazettaManifest, SiteManifest, TargetConfig } from '../types.js';
39
+ /**
40
+ * Fully-resolved alt-text config — what the factory needs to construct
41
+ * an adapter and what the suggester needs to invoke it. No optional
42
+ * fields after this point; defaults applied (except `systemPrompt` and
43
+ * `maxTokens` which are legitimately absent when no operator override
44
+ * is configured anywhere in the chain).
45
+ */
46
+ export interface ResolvedAltConfig {
47
+ provider: AIProvider;
48
+ /** Concrete model ID. Either explicitly configured or per-provider default. */
49
+ model: string;
50
+ /** Operator-supplied system prompt; null = use system default only. */
51
+ systemPrompt: string | null;
52
+ /** Generation token cap; undefined = provider default. */
53
+ maxTokens: number | undefined;
54
+ /** Whether upload flows auto-fire suggest after upload. */
55
+ auto: boolean;
56
+ /** Long-edge cap for vision-call image bytes. */
57
+ maxImageEdge: number;
58
+ }
59
+ /**
60
+ * Resolve alt-text config from gazetta + site + target. Returns null
61
+ * when no provider is configured at any layer.
62
+ *
63
+ * `gazetta` is optional — sites without a project-level `gazetta.config.ts`
64
+ * pass `undefined` (or omit the argument).
65
+ */
66
+ export declare function resolveAltConfig(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): ResolvedAltConfig | null;
67
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/alt/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,KAAK,EAA0C,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKtH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,UAAU,CAAA;IACpB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,OAAO,CAAA;IACb,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,iBAAiB,GAAG,IAAI,CAkC1B"}
@@ -0,0 +1,41 @@
1
+ import { PROVIDER_DEFAULT_MODELS } from '../ai/provider.js';
2
+ import { MAX_EDGE } from '../ai/vision-prep.js';
3
+ /** Hardcoded default for the `auto` flag. */
4
+ const DEFAULT_AUTO = true;
5
+ /**
6
+ * Resolve alt-text config from gazetta + site + target. Returns null
7
+ * when no provider is configured at any layer.
8
+ *
9
+ * `gazetta` is optional — sites without a project-level `gazetta.config.ts`
10
+ * pass `undefined` (or omit the argument).
11
+ */
12
+ export function resolveAltConfig(site, target, gazetta) {
13
+ const siteAi = site.ai;
14
+ const siteAlt = site.altText;
15
+ const targetAlt = target?.altText;
16
+ const gazettaAi = gazetta?.ai;
17
+ const gazettaAlt = gazetta?.altText;
18
+ // Provider: target → site → gazetta. If nothing configured anywhere,
19
+ // the feature is off.
20
+ const provider = targetAlt?.ai?.provider ?? siteAi?.provider ?? gazettaAi?.provider;
21
+ if (!provider)
22
+ return null;
23
+ // Model: target → site → gazetta → per-provider default.
24
+ const model = targetAlt?.ai?.model ?? siteAi?.model ?? gazettaAi?.model ?? PROVIDER_DEFAULT_MODELS[provider.name] ?? null;
25
+ if (model === null) {
26
+ // Plugin-supplied provider with no default-model registration AND
27
+ // no operator-supplied model anywhere in the chain. Surface as
28
+ // "feature off" rather than constructing an adapter that will fail
29
+ // at first SDK call.
30
+ return null;
31
+ }
32
+ // systemPrompt: target → site → gazetta → null (use system default).
33
+ const systemPrompt = targetAlt?.ai?.systemPrompt ?? siteAlt?.systemPrompt ?? gazettaAlt?.systemPrompt ?? null;
34
+ // maxTokens: target → site → gazetta → undefined (provider derives from maxChars).
35
+ const maxTokens = targetAlt?.ai?.maxTokens ?? siteAlt?.maxTokens ?? gazettaAlt?.maxTokens;
36
+ // Behavior fields (auto, maxImageEdge): target → site → gazetta → hardcoded defaults.
37
+ const auto = targetAlt?.auto ?? siteAlt?.auto ?? gazettaAlt?.auto ?? DEFAULT_AUTO;
38
+ const maxImageEdge = targetAlt?.maxImageEdge ?? siteAlt?.maxImageEdge ?? gazettaAlt?.maxImageEdge ?? MAX_EDGE;
39
+ return { provider, model, systemPrompt, maxTokens, auto, maxImageEdge };
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/alt/config.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAG/C,6CAA6C;AAC7C,MAAM,YAAY,GAAG,IAAI,CAAA;AAuBzB;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAA0C,EAC1C,MAAiD,EACjD,OAAiD;IAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IACtB,MAAM,OAAO,GAAkC,IAAI,CAAC,OAAO,CAAA;IAC3D,MAAM,SAAS,GAAoC,MAAM,EAAE,OAAO,CAAA;IAClE,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,CAAA;IAEnC,qEAAqE;IACrE,sBAAsB;IACtB,MAAM,QAAQ,GAAG,SAAS,EAAE,EAAE,EAAE,QAAQ,IAAI,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAA;IACnF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,yDAAyD;IACzD,MAAM,KAAK,GACT,SAAS,EAAE,EAAE,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;IAC7G,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,kEAAkE;QAClE,+DAA+D;QAC/D,mEAAmE;QACnE,qBAAqB;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,qEAAqE;IACrE,MAAM,YAAY,GAAG,SAAS,EAAE,EAAE,EAAE,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,YAAY,IAAI,IAAI,CAAA;IAE7G,mFAAmF;IACnF,MAAM,SAAS,GAAG,SAAS,EAAE,EAAE,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,SAAS,CAAA;IAEzF,sFAAsF;IACtF,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,IAAI,IAAI,YAAY,CAAA;IACjF,MAAM,YAAY,GAAG,SAAS,EAAE,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,YAAY,IAAI,QAAQ,CAAA;IAE7G,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACzE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AltTextAdapter } from './adapter.js';
2
+ import type { GazettaManifest, SiteManifest, TargetConfig } from '../types.js';
3
+ /**
4
+ * True when the resolved alt-text config has all required pieces.
5
+ * Pure: returns the structural state — does NOT verify the credential
6
+ * works (no network call). Verification surfaces at first use of the route.
7
+ */
8
+ export declare function isAltAdapterConfigured(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): boolean;
9
+ /**
10
+ * Construct the alt-text adapter for the resolved config. Returns the
11
+ * null adapter when no provider is configured at any layer.
12
+ *
13
+ * Always returns an `AltTextAdapter` — consumers never null-check the
14
+ * factory's return value. The null adapter throws if `generate()` is
15
+ * called, but that only happens if a consumer skips the
16
+ * `supports()` / `available()` capability check.
17
+ */
18
+ export declare function buildAltAdapter(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): AltTextAdapter;
19
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/alt/factory.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,cAAc,CAahB"}