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,69 @@
1
+ /**
2
+ * Alt-text adapter factory — the single seam between configuration
3
+ * (gazetta + site + target manifests) and adapter construction.
4
+ *
5
+ * Per Phase 4 of the Path X migration: operator constructs the
6
+ * `AIProvider` instance via a factory call (`anthropicProvider({...})`)
7
+ * inside `defineSite({...})` or `defineGazetta({...})`. The resolver
8
+ * walks the three-rung chain (target → site → gazetta) and the factory
9
+ * delegates to `provider.altText(taskConfig)` to build the adapter.
10
+ *
11
+ * No env-var reads in this module — operators pass `process.env.X!` to
12
+ * the provider factory at config-eval. No SDK side effects at boot:
13
+ * provider authors document construction-time semantics; convention is
14
+ * that providers build SDK config objects at construction and defer
15
+ * network/auth to first method call.
16
+ *
17
+ * Two functions:
18
+ *
19
+ * - `buildAltAdapter(site, target, gazetta?)` — returns a fully-
20
+ * constructed `AltTextAdapter`. Returns `nullAltAdapter` when no
21
+ * adapter is configured anywhere in the chain.
22
+ *
23
+ * - `isAltAdapterConfigured(site, target, gazetta?)` — pure
24
+ * introspection for the capability check exposed via `/api/targets`.
25
+ * Doesn't construct an adapter.
26
+ *
27
+ * # Why split into two functions
28
+ *
29
+ * The factory and the capability check answer different questions:
30
+ * - Factory: "give me an adapter to call right now"
31
+ * - Capability: "should the UI render AI affordances on this target?"
32
+ *
33
+ * The capability check shouldn't allocate SDK clients (every call to
34
+ * `/api/targets` would). Splitting at this seam is SRP.
35
+ */
36
+ import { resolveAltConfig } from './config.js';
37
+ import { nullAltAdapter } from './null-adapter.js';
38
+ /**
39
+ * True when the resolved alt-text config has all required pieces.
40
+ * Pure: returns the structural state — does NOT verify the credential
41
+ * works (no network call). Verification surfaces at first use of the route.
42
+ */
43
+ export function isAltAdapterConfigured(site, target, gazetta) {
44
+ return resolveAltConfig(site, target, gazetta) !== null;
45
+ }
46
+ /**
47
+ * Construct the alt-text adapter for the resolved config. Returns the
48
+ * null adapter when no provider is configured at any layer.
49
+ *
50
+ * Always returns an `AltTextAdapter` — consumers never null-check the
51
+ * factory's return value. The null adapter throws if `generate()` is
52
+ * called, but that only happens if a consumer skips the
53
+ * `supports()` / `available()` capability check.
54
+ */
55
+ export function buildAltAdapter(site, target, gazetta) {
56
+ const resolved = resolveAltConfig(site, target, gazetta);
57
+ if (!resolved)
58
+ return nullAltAdapter;
59
+ // Build the per-task adapter via the provider's `.altText()` builder.
60
+ // Provider supplies transport (apiKey, baseUrl, etc.) from its
61
+ // construction; we supply per-task config (model, systemPrompt,
62
+ // maxTokens) from the resolver chain.
63
+ return resolved.provider.altText({
64
+ model: resolved.model,
65
+ systemPrompt: resolved.systemPrompt ?? undefined,
66
+ maxTokens: resolved.maxTokens,
67
+ });
68
+ }
69
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/alt/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIlD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAA0C,EAC1C,MAAiD,EACjD,OAAiD;IAEjD,OAAO,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA0C,EAC1C,MAAiD,EACjD,OAAiD;IAEjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,cAAc,CAAA;IAEpC,sEAAsE;IACtE,+DAA+D;IAC/D,gEAAgE;IAChE,sCAAsC;IACtC,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,SAAS;QAChD,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AltTextAdapter } from './adapter.js';
2
+ export declare const nullAltAdapter: AltTextAdapter;
3
+ //# sourceMappingURL=null-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-adapter.d.ts","sourceRoot":"","sources":["../../src/alt/null-adapter.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,eAAO,MAAM,cAAc,EAAE,cAU5B,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * `nullAltAdapter` — the safe default returned by the factory when no
3
+ * adapter is configured for a target.
4
+ *
5
+ * # Why this exists (vs. the factory returning null)
6
+ *
7
+ * The factory `buildAltAdapter(target)` could return `AltTextAdapter |
8
+ * null`, forcing every consumer to null-check. That would be the
9
+ * stub-on-the-interface anti-pattern in disguise — every caller
10
+ * writes `if (adapter) { ... }`, which is dead code in 99% of cases
11
+ * (the suggester wraps the adapter and handles the unconfigured case
12
+ * via `available()` returning false).
13
+ *
14
+ * Instead, the factory always returns an `AltTextAdapter`. When
15
+ * unconfigured, it returns this null implementation: `supports()`
16
+ * always false, `generate()` throws `AIAdapterUnavailableError` if
17
+ * ever called. The suggester's `available(mime)` checks `supports`
18
+ * first and returns false — so `generate` is never reached on the
19
+ * null adapter in practice. The throw is a defense-in-depth signal
20
+ * that something has gone wrong if it IS reached.
21
+ *
22
+ * This is the LSP validation seam: a real adapter, full contract
23
+ * surface, no nulls in the type system. Tests can substitute it for
24
+ * any consumer and verify the consumer handles "unavailable" correctly
25
+ * via `supports`-returns-false rather than via null-checks.
26
+ *
27
+ * # SOLID
28
+ *
29
+ * - LSP: full contract; `supports`/`generate` return real values
30
+ * - SRP: single concern — represent "no adapter configured"
31
+ * - OCP: not relevant (no extension point here)
32
+ */
33
+ import { AIAdapterUnavailableError } from '../ai/errors.js';
34
+ export const nullAltAdapter = {
35
+ name: 'null',
36
+ supports() {
37
+ return false;
38
+ },
39
+ async generate() {
40
+ throw new AIAdapterUnavailableError('No AI alt-text adapter is configured. Add `altText:` to site.config.ts or set provider credentials in .env.local.');
41
+ },
42
+ };
43
+ //# sourceMappingURL=null-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"null-adapter.js","sourceRoot":"","sources":["../../src/alt/null-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAG3D,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,MAAM;IACZ,QAAQ;QACN,OAAO,KAAK,CAAA;IACd,CAAC;IACD,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,yBAAyB,CACjC,mHAAmH,CACpH,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { AIProvider } from '../ai/provider.js';
2
+ import type { AltTextAdapter } from './adapter.js';
3
+ /** Default base URL when running Ollama locally with default settings. */
4
+ export declare const OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434";
5
+ /** Default model. Ollama Library publishes 11B and 90B variants of llama3.2-vision. */
6
+ export declare const OLLAMA_DEFAULT_MODEL = "llama3.2-vision:11b";
7
+ /**
8
+ * Ollama transport-only options. Per Path X (transport-vs-task split).
9
+ * Ollama needs no API key; baseUrl is the only transport knob.
10
+ */
11
+ export interface OllamaTransportOptions {
12
+ /** Base URL of the Ollama server. Defaults to {@link OLLAMA_DEFAULT_BASE_URL}. */
13
+ baseUrl?: string;
14
+ }
15
+ /**
16
+ * Internal type for `createOllamaAltAdapter` callers (tests). Combines
17
+ * transport with per-task config; new code goes through
18
+ * `ollamaProvider(transport).altText(taskConfig)`.
19
+ */
20
+ export interface OllamaAltAdapterOptions extends OllamaTransportOptions {
21
+ /** Model ID. Defaults to {@link OLLAMA_DEFAULT_MODEL}. */
22
+ model?: string;
23
+ /** Operator-supplied system prompt; prepended to system-composed prompt. */
24
+ systemPrompt?: string;
25
+ /** Generation token cap. Ollama doesn't expose it directly, but the
26
+ * scaffold passes it through to keep the contract uniform. */
27
+ maxTokens?: number;
28
+ }
29
+ /**
30
+ * Construct the Ollama alt-text adapter. Internal factory — kept public
31
+ * for tests + advanced wiring. Operator-facing config goes through
32
+ * `ollamaProvider(transport).altText(taskConfig)` (Path X).
33
+ */
34
+ export declare function createOllamaAltAdapter(opts?: OllamaAltAdapterOptions): AltTextAdapter;
35
+ /**
36
+ * Operator-facing Ollama provider. See `anthropicProvider` for the full
37
+ * Path X rationale. Ollama needs no API key; transport is just baseUrl.
38
+ */
39
+ export declare function ollamaProvider(transport?: OllamaTransportOptions): AIProvider;
40
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/alt/ollama.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAUlD,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,2BAA2B,CAAA;AAE/D,uFAAuF;AACvF,eAAO,MAAM,oBAAoB,wBAAwB,CAAA;AAIzD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;mEAC+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAQD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,uBAA4B,GAAG,cAAc,CAqEzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,GAAE,sBAA2B,GAAG,UAAU,CAYjF"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Ollama adapter — alt-text via the local `/api/chat` endpoint.
3
+ *
4
+ * # Why no SDK
5
+ *
6
+ * Ollama's API is a single endpoint, no auth, no streaming negotiation,
7
+ * no schema beyond simple JSON. The official `ollama` npm SDK exists
8
+ * but adds little value over raw `fetch` for this single-call use case.
9
+ * Skipping the SDK keeps adapter dependencies minimal.
10
+ *
11
+ * # Defaults
12
+ *
13
+ * - Base URL: `http://localhost:11434` (Ollama's documented default).
14
+ * Operators running Ollama on a different host configure via
15
+ * `baseUrl` on the transport.
16
+ * - Model: `llama3.2-vision:11b`. The 11B variant is the entry-level
17
+ * size; `:90b` is also available for operators who want better
18
+ * description quality at higher GPU/RAM cost.
19
+ *
20
+ * # API contract details (verified against Ollama API docs)
21
+ *
22
+ * - Endpoint: `POST /api/chat` (chat-style fits the system+user pattern).
23
+ * - Images are base64 strings in the per-message `images` array.
24
+ * Different from Anthropic and OpenAI shapes — same adapter
25
+ * abstraction holds via the scaffold.
26
+ * - Response: `{ message: { content: "..." }, done: true, ... }`
27
+ * - Auth: none for local install
28
+ * - AbortSignal: standard fetch — `fetch(url, { signal })`. Errors
29
+ * surface as `Error` with `name: 'AbortError'`.
30
+ *
31
+ * # SOLID
32
+ *
33
+ * - Same lenses as Anthropic / OpenAI — orchestration via
34
+ * `ai/adapter-scaffold.ts`, Ollama-specific request/response/error
35
+ * shape here only.
36
+ */
37
+ import { AIAdapterFailedError, AIInvalidResponseError } from '../ai/errors.js';
38
+ import { buildAltAdapterFromScaffold } from '../ai/adapter-scaffold.js';
39
+ const OLLAMA_REFUSAL_MARKERS = [
40
+ // llama3.2-vision tends to refuse with these patterns more than
41
+ // saas providers; markers maintained per [refusal.ts] convention.
42
+ "i'm not able to process this image",
43
+ 'i am not able to process this image',
44
+ 'sorry, i cannot',
45
+ ];
46
+ /** Default base URL when running Ollama locally with default settings. */
47
+ export const OLLAMA_DEFAULT_BASE_URL = 'http://localhost:11434';
48
+ /** Default model. Ollama Library publishes 11B and 90B variants of llama3.2-vision. */
49
+ export const OLLAMA_DEFAULT_MODEL = 'llama3.2-vision:11b';
50
+ const OLLAMA_SUPPORTED_MIMES = new Set(['image/jpeg', 'image/png']);
51
+ /**
52
+ * Construct the Ollama alt-text adapter. Internal factory — kept public
53
+ * for tests + advanced wiring. Operator-facing config goes through
54
+ * `ollamaProvider(transport).altText(taskConfig)` (Path X).
55
+ */
56
+ export function createOllamaAltAdapter(opts = {}) {
57
+ const baseUrl = (opts.baseUrl ?? OLLAMA_DEFAULT_BASE_URL).replace(/\/+$/, '');
58
+ const model = opts.model ?? OLLAMA_DEFAULT_MODEL;
59
+ const endpoint = `${baseUrl}/api/chat`;
60
+ return buildAltAdapterFromScaffold({
61
+ name: 'ollama',
62
+ supportedMimes: OLLAMA_SUPPORTED_MIMES,
63
+ operatorSystemPrompt: opts.systemPrompt,
64
+ operatorMaxTokens: opts.maxTokens,
65
+ refusalMarkers: OLLAMA_REFUSAL_MARKERS,
66
+ isAbortError: err => err instanceof Error && err.name === 'AbortError',
67
+ errorContextSuffix: `Is Ollama running at ${baseUrl}?`,
68
+ async callProvider({ bytes, mime: _mime, systemPrompt, signal }) {
69
+ const imageB64 = Buffer.from(bytes).toString('base64');
70
+ const body = {
71
+ model,
72
+ messages: [
73
+ { role: 'system', content: systemPrompt },
74
+ {
75
+ role: 'user',
76
+ content: 'Describe this image for use as alt text.',
77
+ images: [imageB64],
78
+ },
79
+ ],
80
+ stream: false,
81
+ };
82
+ const res = await fetch(endpoint, {
83
+ method: 'POST',
84
+ headers: { 'Content-Type': 'application/json' },
85
+ body: JSON.stringify(body),
86
+ signal,
87
+ });
88
+ if (!res.ok) {
89
+ // Ollama returns plain-text errors for connection-level issues
90
+ // and JSON `{ error: "..." }` for model-level issues. Surface
91
+ // both as AIAdapterFailedError; the message includes status
92
+ // code so logs can disambiguate (404 → model not pulled, 400
93
+ // → malformed request, etc.).
94
+ let detail = `HTTP ${res.status}`;
95
+ try {
96
+ const errorBody = await res.text();
97
+ if (errorBody)
98
+ detail += `: ${errorBody.slice(0, 200)}`;
99
+ }
100
+ catch {
101
+ // Body unreadable; status code alone is the diagnostic.
102
+ }
103
+ throw new AIAdapterFailedError(`Ollama HTTP error: ${detail}`);
104
+ }
105
+ let parsed;
106
+ try {
107
+ parsed = (await res.json());
108
+ }
109
+ catch (err) {
110
+ throw new AIInvalidResponseError(`Ollama returned non-JSON response: ${err instanceof Error ? err.message : 'unknown'}`);
111
+ }
112
+ if (parsed.error) {
113
+ throw new AIAdapterFailedError(`Ollama: ${parsed.error}`);
114
+ }
115
+ if (typeof parsed.message?.content !== 'string') {
116
+ throw new AIInvalidResponseError('Ollama response had no message.content');
117
+ }
118
+ return parsed.message.content;
119
+ },
120
+ });
121
+ }
122
+ /**
123
+ * Operator-facing Ollama provider. See `anthropicProvider` for the full
124
+ * Path X rationale. Ollama needs no API key; transport is just baseUrl.
125
+ */
126
+ export function ollamaProvider(transport = {}) {
127
+ return {
128
+ name: 'ollama',
129
+ altText(taskConfig) {
130
+ return createOllamaAltAdapter({
131
+ ...transport,
132
+ model: taskConfig.model,
133
+ systemPrompt: taskConfig.systemPrompt,
134
+ maxTokens: taskConfig.maxTokens,
135
+ });
136
+ },
137
+ };
138
+ }
139
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/alt/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { AIProvider } from '../ai/provider.js';
2
+ import type { AltTextAdapter } from './adapter.js';
3
+ /**
4
+ * Default model. Vision-capable across OpenAI's gpt-4o family. Sites
5
+ * with high-volume asset libraries should benchmark cost against
6
+ * actual workload.
7
+ */
8
+ export declare const OPENAI_DEFAULT_MODEL = "gpt-4o-mini";
9
+ /**
10
+ * OpenAI transport-only options. Per Path X (transport-vs-task split).
11
+ */
12
+ export interface OpenAITransportOptions {
13
+ apiKey: string;
14
+ /** Optional override of the SDK base URL — for tests pointing at msw or proxy setups. */
15
+ baseURL?: string;
16
+ /**
17
+ * Override the SDK's retry count (default 2). Tests pass 0 to keep
18
+ * runs deterministic and fast.
19
+ */
20
+ maxRetries?: number;
21
+ }
22
+ /**
23
+ * Internal type for `createOpenAIAltAdapter` callers (tests). Combines
24
+ * transport with per-task config; new code goes through
25
+ * `openaiProvider(transport).altText(taskConfig)`.
26
+ */
27
+ export interface OpenAIAltAdapterOptions extends OpenAITransportOptions {
28
+ /** Model ID; defaults to {@link OPENAI_DEFAULT_MODEL}. */
29
+ model?: string;
30
+ /** Operator-supplied system prompt; prepended to system-composed prompt. */
31
+ systemPrompt?: string;
32
+ /** Generation token cap; provider derives from maxChars when absent. */
33
+ maxTokens?: number;
34
+ }
35
+ /**
36
+ * Construct the OpenAI alt-text adapter. Internal factory — kept public
37
+ * for tests + advanced wiring. Operator-facing config goes through
38
+ * `openaiProvider(transport).altText(taskConfig)` (Path X).
39
+ */
40
+ export declare function createOpenAIAltAdapter(opts: OpenAIAltAdapterOptions): AltTextAdapter;
41
+ /**
42
+ * Operator-facing OpenAI provider. See `anthropicProvider` for the full
43
+ * Path X rationale.
44
+ */
45
+ export declare function openaiProvider(transport: OpenAITransportOptions): AIProvider;
46
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/alt/openai.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAYlD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gBAAgB,CAAA;AAIjD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAMD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,CAwCpF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,sBAAsB,GAAG,UAAU,CAe5E"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * OpenAI adapter — alt-text via the `chat.completions.create` vision API.
3
+ *
4
+ * # Defaults
5
+ *
6
+ * - Model: `gpt-4o-mini` — vision-capable, well-supported. Note that
7
+ * OpenAI's vision pricing is non-trivial: while gpt-4o-mini is
8
+ * cheaper per text token than gpt-4o, vision token cost differs
9
+ * and the math is workload-dependent. Sites comparing costs
10
+ * should benchmark against their actual asset library.
11
+ *
12
+ * # API contract details (verified against `openai` SDK v6+)
13
+ *
14
+ * - Image content uses `{ type: 'image_url', image_url: { url } }`.
15
+ * The URL is a base64 data URL: `data:{mime};base64,{data}`.
16
+ * - Accepted MIMEs: JPEG, PNG, GIF, WebP. After `prepareForVision`
17
+ * our bytes are JPEG or PNG.
18
+ * - System prompt is a `role: 'system'` message (not a top-level
19
+ * parameter like Anthropic). User message contains the image.
20
+ * - `max_tokens` is optional but the scaffold sets it (operator
21
+ * override OR derived from maxChars).
22
+ *
23
+ * # AbortSignal
24
+ *
25
+ * - Passed via `chat.completions.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
+ * - Same lenses as Anthropic adapter — orchestration via
32
+ * `ai/adapter-scaffold.ts`, OpenAI-specific request/response
33
+ * shape here only.
34
+ */
35
+ import OpenAI from 'openai';
36
+ import { AIInvalidResponseError } from '../ai/errors.js';
37
+ import { buildAltAdapterFromScaffold } from '../ai/adapter-scaffold.js';
38
+ /**
39
+ * OpenAI-specific refusal phrases. Layered on top of the shared list
40
+ * in `ai/refusal.ts`.
41
+ */
42
+ const OPENAI_REFUSAL_MARKERS = [
43
+ "i'm sorry, i can't assist",
44
+ "i can't assist with that",
45
+ 'i am unable to assist',
46
+ ];
47
+ /**
48
+ * Default model. Vision-capable across OpenAI's gpt-4o family. Sites
49
+ * with high-volume asset libraries should benchmark cost against
50
+ * actual workload.
51
+ */
52
+ export const OPENAI_DEFAULT_MODEL = 'gpt-4o-mini';
53
+ const OPENAI_SUPPORTED_MIMES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp']);
54
+ function toBase64DataUrl(bytes, mime) {
55
+ return `data:${mime};base64,${Buffer.from(bytes).toString('base64')}`;
56
+ }
57
+ /**
58
+ * Construct the OpenAI alt-text adapter. Internal factory — kept public
59
+ * for tests + advanced wiring. Operator-facing config goes through
60
+ * `openaiProvider(transport).altText(taskConfig)` (Path X).
61
+ */
62
+ export function createOpenAIAltAdapter(opts) {
63
+ const client = new OpenAI({
64
+ apiKey: opts.apiKey,
65
+ baseURL: opts.baseURL,
66
+ maxRetries: opts.maxRetries,
67
+ });
68
+ const model = opts.model ?? OPENAI_DEFAULT_MODEL;
69
+ return buildAltAdapterFromScaffold({
70
+ name: 'openai',
71
+ supportedMimes: OPENAI_SUPPORTED_MIMES,
72
+ operatorSystemPrompt: opts.systemPrompt,
73
+ operatorMaxTokens: opts.maxTokens,
74
+ refusalMarkers: OPENAI_REFUSAL_MARKERS,
75
+ isAbortError: err => err instanceof OpenAI.APIUserAbortError,
76
+ async callProvider({ bytes, mime, systemPrompt, maxTokens, signal }) {
77
+ const response = await client.chat.completions.create({
78
+ model,
79
+ max_tokens: maxTokens,
80
+ messages: [
81
+ { role: 'system', content: systemPrompt },
82
+ {
83
+ role: 'user',
84
+ content: [{ type: 'image_url', image_url: { url: toBase64DataUrl(bytes, mime) } }],
85
+ },
86
+ ],
87
+ }, { signal });
88
+ // Response shape: choices[0].message.content. May be null when
89
+ // the model returns a tool-call instead — defensive against that.
90
+ const content = response.choices[0]?.message.content;
91
+ if (typeof content !== 'string') {
92
+ throw new AIInvalidResponseError('OpenAI response had no text content');
93
+ }
94
+ return content;
95
+ },
96
+ });
97
+ }
98
+ /**
99
+ * Operator-facing OpenAI provider. See `anthropicProvider` for the full
100
+ * Path X rationale.
101
+ */
102
+ export function openaiProvider(transport) {
103
+ if (!transport.apiKey) {
104
+ throw new Error('openaiProvider: "apiKey" is required (typically `process.env.OPENAI_API_KEY!`)');
105
+ }
106
+ return {
107
+ name: 'openai',
108
+ altText(taskConfig) {
109
+ return createOpenAIAltAdapter({
110
+ ...transport,
111
+ model: taskConfig.model,
112
+ systemPrompt: taskConfig.systemPrompt,
113
+ maxTokens: taskConfig.maxTokens,
114
+ });
115
+ },
116
+ };
117
+ }
118
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/alt/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Alt-text prompt policies — five `AltPromptPolicy` modules that each
3
+ * own one dimension of prompt content.
4
+ *
5
+ * # Why split into five
6
+ *
7
+ * Per [team-preferences rule 18], "structurally correct from the
8
+ * start". A single mega-string would be a god-string with five
9
+ * reasons to change (task framing, style, length, locale, output
10
+ * discipline). Splitting at the SOLID seam means:
11
+ *
12
+ * - WCAG guidance update → edit `styleGuidancePolicy` only
13
+ * - Locale strategy change → edit `localePolicy` only
14
+ * - Length convention change → edit `lengthPolicy` only
15
+ *
16
+ * Each policy is independently testable. The composer assembles them
17
+ * via `composePrompt(req, DEFAULT_POLICIES)`.
18
+ *
19
+ * # Adding a new style
20
+ *
21
+ * Future styles like `'marketing'` or `'technical'` extend the
22
+ * `AltStyle` enum + add a switch arm in `styleGuidancePolicy`. Other
23
+ * policies untouched (OCP).
24
+ *
25
+ * # Locale handling
26
+ *
27
+ * Direct generation: when locale ≠ default, ask the model to write in
28
+ * that locale. Modern vision models are competently multilingual at
29
+ * description tasks. Translation as a separate pipeline was rejected
30
+ * — would require a parallel `TranslationAdapter` system before its
31
+ * second consumer exists.
32
+ */
33
+ import type { AltPromptPolicy } from './adapter.js';
34
+ /**
35
+ * Policy 1 — frame the task. Sets the model's frame: this is alt
36
+ * text generation following web-accessibility conventions, not
37
+ * caption generation.
38
+ */
39
+ export declare const taskFramingPolicy: AltPromptPolicy;
40
+ /**
41
+ * Policy 2 — style guidance per `request.style`. Currently only
42
+ * `'descriptive'`; extending the enum adds a switch arm here.
43
+ *
44
+ * The descriptive guidance steers the model away from common
45
+ * caption-style patterns ("Image of...", "A photograph of...") and
46
+ * toward direct description.
47
+ */
48
+ export declare const styleGuidancePolicy: AltPromptPolicy;
49
+ /**
50
+ * Policy 3 — length cap as model guidance. Soft instruction; the
51
+ * suggester doesn't enforce truncation. WAI-ARIA convention is 125
52
+ * chars; per-call override via `request.maxChars`.
53
+ */
54
+ export declare const lengthPolicy: AltPromptPolicy;
55
+ /**
56
+ * Policy 4 — locale instruction. Empty string when locale is the
57
+ * default (composer drops empty-string policies; the prompt has one
58
+ * fewer paragraph), non-empty otherwise.
59
+ *
60
+ * When locale ≠ 'en', the model writes the description in that
61
+ * language directly. No translation step.
62
+ */
63
+ export declare const localePolicy: AltPromptPolicy;
64
+ /**
65
+ * Policy 5 — output discipline. Clamp the model's tendency to add
66
+ * preamble or wrapper quotes around its answer. Last in the order
67
+ * because it's the closing instruction.
68
+ */
69
+ export declare const outputDisciplinePolicy: AltPromptPolicy;
70
+ /**
71
+ * Default policy set, in composition order. Most prompt-tuning lives
72
+ * in editing the policies above; the order here changes only when
73
+ * paragraph priority changes (rare).
74
+ *
75
+ * Callers can pass a custom array for one-off requests, but the
76
+ * default is what every alt-text generation uses in production.
77
+ */
78
+ export declare const DEFAULT_ALT_PROMPT_POLICIES: readonly AltPromptPolicy[];
79
+ //# sourceMappingURL=prompt-policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-policies.d.ts","sourceRoot":"","sources":["../../src/alt/prompt-policies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,cAAc,CAAA;AAQ7D;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,eACgD,CAAA;AAEhF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,eAMjC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,eAA8D,CAAA;AAEzF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,eAG1B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,eAA6E,CAAA;AAElH;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,EAAE,SAAS,eAAe,EAMjE,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The default locale for which `localePolicy` doesn't add anything.
3
+ * Aligned with the WCAG-grounded prompts being written in English.
4
+ */
5
+ const DEFAULT_LOCALE = 'en';
6
+ /**
7
+ * Policy 1 — frame the task. Sets the model's frame: this is alt
8
+ * text generation following web-accessibility conventions, not
9
+ * caption generation.
10
+ */
11
+ export const taskFramingPolicy = () => `You are writing alt text for a webpage image, following WCAG 2.1 guidelines.`;
12
+ /**
13
+ * Policy 2 — style guidance per `request.style`. Currently only
14
+ * `'descriptive'`; extending the enum adds a switch arm here.
15
+ *
16
+ * The descriptive guidance steers the model away from common
17
+ * caption-style patterns ("Image of...", "A photograph of...") and
18
+ * toward direct description.
19
+ */
20
+ export const styleGuidancePolicy = req => {
21
+ const style = req.style;
22
+ switch (style) {
23
+ case 'descriptive':
24
+ return `Describe what's visually present and meaningful. Be specific and concrete. Don't start with "image of" or "picture of" — write the description directly.`;
25
+ }
26
+ };
27
+ /**
28
+ * Policy 3 — length cap as model guidance. Soft instruction; the
29
+ * suggester doesn't enforce truncation. WAI-ARIA convention is 125
30
+ * chars; per-call override via `request.maxChars`.
31
+ */
32
+ export const lengthPolicy = req => `Maximum ${req.maxChars} characters.`;
33
+ /**
34
+ * Policy 4 — locale instruction. Empty string when locale is the
35
+ * default (composer drops empty-string policies; the prompt has one
36
+ * fewer paragraph), non-empty otherwise.
37
+ *
38
+ * When locale ≠ 'en', the model writes the description in that
39
+ * language directly. No translation step.
40
+ */
41
+ export const localePolicy = req => {
42
+ if (req.locale === DEFAULT_LOCALE)
43
+ return '';
44
+ return `Write the description in ${req.locale}.`;
45
+ };
46
+ /**
47
+ * Policy 5 — output discipline. Clamp the model's tendency to add
48
+ * preamble or wrapper quotes around its answer. Last in the order
49
+ * because it's the closing instruction.
50
+ */
51
+ export const outputDisciplinePolicy = () => `Output the description only, no preamble or quotes.`;
52
+ /**
53
+ * Default policy set, in composition order. Most prompt-tuning lives
54
+ * in editing the policies above; the order here changes only when
55
+ * paragraph priority changes (rare).
56
+ *
57
+ * Callers can pass a custom array for one-off requests, but the
58
+ * default is what every alt-text generation uses in production.
59
+ */
60
+ export const DEFAULT_ALT_PROMPT_POLICIES = [
61
+ taskFramingPolicy,
62
+ styleGuidancePolicy,
63
+ lengthPolicy,
64
+ localePolicy,
65
+ outputDisciplinePolicy,
66
+ ];
67
+ //# sourceMappingURL=prompt-policies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-policies.js","sourceRoot":"","sources":["../../src/alt/prompt-policies.ts"],"names":[],"mappings":"AAkCA;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAoB,GAAG,EAAE,CACrD,8EAA8E,CAAA;AAEhF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAoB,GAAG,CAAC,EAAE;IACxD,MAAM,KAAK,GAAa,GAAG,CAAC,KAAK,CAAA;IACjC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,aAAa;YAChB,OAAO,0JAA0J,CAAA;IACrK,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,CAAC,QAAQ,cAAc,CAAA;AAEzF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB,GAAG,CAAC,EAAE;IACjD,IAAI,GAAG,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,EAAE,CAAA;IAC5C,OAAO,4BAA4B,GAAG,CAAC,MAAM,GAAG,CAAA;AAClD,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAoB,GAAG,EAAE,CAAC,qDAAqD,CAAA;AAElH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAA+B;IACrE,iBAAiB;IACjB,mBAAmB;IACnB,YAAY;IACZ,YAAY;IACZ,sBAAsB;CACvB,CAAA"}