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,50 @@
1
+ /**
2
+ * Generic prompt composer — assembles a final prompt string from an
3
+ * ordered list of `PromptPolicy<T>` functions, where `T` is the typed
4
+ * request shape for the calling task.
5
+ *
6
+ * # Why generic over `T`
7
+ *
8
+ * Each AI task has its own typed request (alt-text has `AltRequest`
9
+ * with `locale`, `maxChars`, `style`; future translation will have its
10
+ * own with source/target language pairs, formality, etc.). The
11
+ * composer doesn't need to know task-specific fields — it just calls
12
+ * each policy in order and joins the non-empty results.
13
+ *
14
+ * Putting the composer in `ai/` (not in `alt/`) means the second task
15
+ * doesn't reimplement composition. Each task contributes its own
16
+ * `PromptPolicy<TaskRequest>` modules that import this composer.
17
+ *
18
+ * # SOLID lenses
19
+ *
20
+ * - SRP: this module owns "ordered policies → final prompt string"
21
+ * - OCP: callers pass their own policy array; the default policy set
22
+ * is the task's responsibility, not this module's
23
+ * - LSP: every policy is `(req: T) => string`; trivially substitutable
24
+ * - DIP: tasks depend on this generic composer, not on each other
25
+ *
26
+ * # Empty-string convention
27
+ *
28
+ * Policies that don't apply (e.g., the locale policy when locale is
29
+ * the default 'en') return an empty string. The composer filters these
30
+ * out before joining, so empty paragraphs don't appear in the final
31
+ * prompt. This keeps each policy decision local — no callers need to
32
+ * reason about "should I include this policy?"
33
+ */
34
+ /**
35
+ * One dimension of prompt content. A function from a typed request to
36
+ * a string paragraph. Empty string means "this policy doesn't apply
37
+ * for this request" and is dropped before assembly.
38
+ */
39
+ export type PromptPolicy<TRequest> = (req: TRequest) => string;
40
+ /**
41
+ * Assemble policies into a prompt. Joins non-empty results with two
42
+ * newlines (paragraph break) — model providers parse this as natural
43
+ * structure. Order matters: callers pass the array in the order they
44
+ * want paragraphs to appear.
45
+ *
46
+ * Tests can pass a custom policy array to validate composition without
47
+ * coupling to any task's default set.
48
+ */
49
+ export declare function composePrompt<TRequest>(req: TRequest, policies: readonly PromptPolicy<TRequest>[]): string;
50
+ //# sourceMappingURL=compose-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-prompt.d.ts","sourceRoot":"","sources":["../../src/ai/compose-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,QAAQ,KAAK,MAAM,CAAA;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAK1G"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Generic prompt composer — assembles a final prompt string from an
3
+ * ordered list of `PromptPolicy<T>` functions, where `T` is the typed
4
+ * request shape for the calling task.
5
+ *
6
+ * # Why generic over `T`
7
+ *
8
+ * Each AI task has its own typed request (alt-text has `AltRequest`
9
+ * with `locale`, `maxChars`, `style`; future translation will have its
10
+ * own with source/target language pairs, formality, etc.). The
11
+ * composer doesn't need to know task-specific fields — it just calls
12
+ * each policy in order and joins the non-empty results.
13
+ *
14
+ * Putting the composer in `ai/` (not in `alt/`) means the second task
15
+ * doesn't reimplement composition. Each task contributes its own
16
+ * `PromptPolicy<TaskRequest>` modules that import this composer.
17
+ *
18
+ * # SOLID lenses
19
+ *
20
+ * - SRP: this module owns "ordered policies → final prompt string"
21
+ * - OCP: callers pass their own policy array; the default policy set
22
+ * is the task's responsibility, not this module's
23
+ * - LSP: every policy is `(req: T) => string`; trivially substitutable
24
+ * - DIP: tasks depend on this generic composer, not on each other
25
+ *
26
+ * # Empty-string convention
27
+ *
28
+ * Policies that don't apply (e.g., the locale policy when locale is
29
+ * the default 'en') return an empty string. The composer filters these
30
+ * out before joining, so empty paragraphs don't appear in the final
31
+ * prompt. This keeps each policy decision local — no callers need to
32
+ * reason about "should I include this policy?"
33
+ */
34
+ /**
35
+ * Assemble policies into a prompt. Joins non-empty results with two
36
+ * newlines (paragraph break) — model providers parse this as natural
37
+ * structure. Order matters: callers pass the array in the order they
38
+ * want paragraphs to appear.
39
+ *
40
+ * Tests can pass a custom policy array to validate composition without
41
+ * coupling to any task's default set.
42
+ */
43
+ export function composePrompt(req, policies) {
44
+ return policies
45
+ .map(policy => policy(req))
46
+ .filter(paragraph => paragraph.length > 0)
47
+ .join('\n\n');
48
+ }
49
+ //# sourceMappingURL=compose-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-prompt.js","sourceRoot":"","sources":["../../src/ai/compose-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AASH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAW,GAAa,EAAE,QAA2C;IAChG,OAAO,QAAQ;SACZ,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC1B,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,MAAM,CAAC,CAAA;AACjB,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Typed errors for the AI domain — one class per failure mode, each
3
+ * carrying an HTTP status so route handlers don't pattern-match on
4
+ * messages.
5
+ *
6
+ * Pattern mirrors `assets/errors.ts`: subclass `AIError`, declare the
7
+ * `code` and `httpStatus` on the class, override `toResponseBody()` if
8
+ * extra structured fields are needed.
9
+ *
10
+ * Adding a new AI error is one new subclass + one new code in the
11
+ * union. Routes pick up the new HTTP status via the `httpStatus`
12
+ * property — no route-handler edits required (OCP).
13
+ */
14
+ export type AIErrorCode = 'AI_ADAPTER_UNAVAILABLE' | 'AI_ADAPTER_FAILED' | 'AI_INVALID_RESPONSE';
15
+ export type AIErrorHttpStatus = 502 | 503;
16
+ export interface AIErrorResponseBody {
17
+ readonly code: AIErrorCode;
18
+ readonly message: string;
19
+ }
20
+ /**
21
+ * Base class. Subclasses set `code` and `httpStatus` as readonly
22
+ * properties; the base provides the `toResponseBody()` machinery.
23
+ */
24
+ export declare abstract class AIError extends Error {
25
+ abstract readonly code: AIErrorCode;
26
+ abstract readonly httpStatus: AIErrorHttpStatus;
27
+ toResponseBody(): AIErrorResponseBody;
28
+ }
29
+ /**
30
+ * No adapter is configured for the target, OR the adapter is configured
31
+ * but its credentials are missing, OR the adapter doesn't support the
32
+ * requested MIME. UI hides AI affordances; route returns 503.
33
+ *
34
+ * Distinct from `AIAdapterFailedError` because this is a configuration
35
+ * state, not a runtime failure — retrying won't help.
36
+ */
37
+ export declare class AIAdapterUnavailableError extends AIError {
38
+ readonly code = "AI_ADAPTER_UNAVAILABLE";
39
+ readonly httpStatus = 503;
40
+ }
41
+ /**
42
+ * Adapter was reached but the call failed — network error, auth
43
+ * rejection, rate limit not handled by the SDK's own retry, malformed
44
+ * response. Route returns 502 (we're acting as a gateway to the
45
+ * upstream provider).
46
+ *
47
+ * The provider-specific cause is attached as `cause` (per the standard
48
+ * Error.cause property) so logs can drill into the underlying failure
49
+ * without leaking provider details into the API response.
50
+ */
51
+ export declare class AIAdapterFailedError extends AIError {
52
+ readonly code = "AI_ADAPTER_FAILED";
53
+ readonly httpStatus = 502;
54
+ }
55
+ /**
56
+ * Adapter received a response from the provider, but it didn't parse
57
+ * into the expected shape (missing content field, unexpected null,
58
+ * etc.). 502 — same gateway semantics as `AIAdapterFailedError`, but
59
+ * the cause is parsing rather than transport.
60
+ */
61
+ export declare class AIInvalidResponseError extends AIError {
62
+ readonly code = "AI_INVALID_RESPONSE";
63
+ readonly httpStatus = 502;
64
+ }
65
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,WAAW,GAAG,wBAAwB,GAAG,mBAAmB,GAAG,qBAAqB,CAAA;AAEhG,MAAM,MAAM,iBAAiB,GAAG,GAAG,GAAG,GAAG,CAAA;AAEzC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,8BAAsB,OAAQ,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;IACnC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAA;IAE/C,cAAc,IAAI,mBAAmB;CAGtC;AAED;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,OAAO;IACpD,QAAQ,CAAC,IAAI,4BAA2B;IACxC,QAAQ,CAAC,UAAU,OAAM;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAqB,SAAQ,OAAO;IAC/C,QAAQ,CAAC,IAAI,uBAAsB;IACnC,QAAQ,CAAC,UAAU,OAAM;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,OAAO;IACjD,QAAQ,CAAC,IAAI,yBAAwB;IACrC,QAAQ,CAAC,UAAU,OAAM;CAC1B"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Typed errors for the AI domain — one class per failure mode, each
3
+ * carrying an HTTP status so route handlers don't pattern-match on
4
+ * messages.
5
+ *
6
+ * Pattern mirrors `assets/errors.ts`: subclass `AIError`, declare the
7
+ * `code` and `httpStatus` on the class, override `toResponseBody()` if
8
+ * extra structured fields are needed.
9
+ *
10
+ * Adding a new AI error is one new subclass + one new code in the
11
+ * union. Routes pick up the new HTTP status via the `httpStatus`
12
+ * property — no route-handler edits required (OCP).
13
+ */
14
+ /**
15
+ * Base class. Subclasses set `code` and `httpStatus` as readonly
16
+ * properties; the base provides the `toResponseBody()` machinery.
17
+ */
18
+ export class AIError extends Error {
19
+ toResponseBody() {
20
+ return { code: this.code, message: this.message };
21
+ }
22
+ }
23
+ /**
24
+ * No adapter is configured for the target, OR the adapter is configured
25
+ * but its credentials are missing, OR the adapter doesn't support the
26
+ * requested MIME. UI hides AI affordances; route returns 503.
27
+ *
28
+ * Distinct from `AIAdapterFailedError` because this is a configuration
29
+ * state, not a runtime failure — retrying won't help.
30
+ */
31
+ export class AIAdapterUnavailableError extends AIError {
32
+ code = 'AI_ADAPTER_UNAVAILABLE';
33
+ httpStatus = 503;
34
+ }
35
+ /**
36
+ * Adapter was reached but the call failed — network error, auth
37
+ * rejection, rate limit not handled by the SDK's own retry, malformed
38
+ * response. Route returns 502 (we're acting as a gateway to the
39
+ * upstream provider).
40
+ *
41
+ * The provider-specific cause is attached as `cause` (per the standard
42
+ * Error.cause property) so logs can drill into the underlying failure
43
+ * without leaking provider details into the API response.
44
+ */
45
+ export class AIAdapterFailedError extends AIError {
46
+ code = 'AI_ADAPTER_FAILED';
47
+ httpStatus = 502;
48
+ }
49
+ /**
50
+ * Adapter received a response from the provider, but it didn't parse
51
+ * into the expected shape (missing content field, unexpected null,
52
+ * etc.). 502 — same gateway semantics as `AIAdapterFailedError`, but
53
+ * the cause is parsing rather than transport.
54
+ */
55
+ export class AIInvalidResponseError extends AIError {
56
+ code = 'AI_INVALID_RESPONSE';
57
+ httpStatus = 502;
58
+ }
59
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/ai/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH;;;GAGG;AACH,MAAM,OAAgB,OAAQ,SAAQ,KAAK;IAIzC,cAAc;QACZ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAA;IACnD,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,yBAA0B,SAAQ,OAAO;IAC3C,IAAI,GAAG,wBAAwB,CAAA;IAC/B,UAAU,GAAG,GAAG,CAAA;CAC1B;AAED;;;;;;;;;GASG;AACH,MAAM,OAAO,oBAAqB,SAAQ,OAAO;IACtC,IAAI,GAAG,mBAAmB,CAAA;IAC1B,UAAU,GAAG,GAAG,CAAA;CAC1B;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,OAAO;IACxC,IAAI,GAAG,qBAAqB,CAAA;IAC5B,UAAU,GAAG,GAAG,CAAA;CAC1B"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Public surface of `ai/` — cross-task AI infrastructure shared by
3
+ * per-task implementations (alt-text in v1.5; translation, tag
4
+ * suggestion, summarization in future).
5
+ *
6
+ * `ai/` is a code library, not an inheritance hierarchy. Tasks compose
7
+ * these utilities — they don't extend a base class. Per
8
+ * [team-preferences.md] convention 1: composition over inheritance.
9
+ */
10
+ export type { AIProvider, AltTextTaskConfig } from './provider.js';
11
+ export { PROVIDER_DEFAULT_MODELS } from './provider.js';
12
+ export { AIError, AIAdapterUnavailableError, AIAdapterFailedError, AIInvalidResponseError, type AIErrorCode, type AIErrorHttpStatus, type AIErrorResponseBody, } from './errors.js';
13
+ export { detectRefusal, type RefusalDetection } from './refusal.js';
14
+ export { composePrompt, type PromptPolicy } from './compose-prompt.js';
15
+ export { prepareForVision, MAX_EDGE, type PrepareInput, type PreparedImage } from './vision-prep.js';
16
+ export { buildAltAdapterFromScaffold, type AdapterScaffoldOptions, type ProviderCallInput, } from './adapter-scaffold.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACpG,OAAO,EACL,2BAA2B,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Public surface of `ai/` — cross-task AI infrastructure shared by
3
+ * per-task implementations (alt-text in v1.5; translation, tag
4
+ * suggestion, summarization in future).
5
+ *
6
+ * `ai/` is a code library, not an inheritance hierarchy. Tasks compose
7
+ * these utilities — they don't extend a base class. Per
8
+ * [team-preferences.md] convention 1: composition over inheritance.
9
+ */
10
+ export { PROVIDER_DEFAULT_MODELS } from './provider.js';
11
+ export { AIError, AIAdapterUnavailableError, AIAdapterFailedError, AIInvalidResponseError, } from './errors.js';
12
+ export { detectRefusal } from './refusal.js';
13
+ export { composePrompt } from './compose-prompt.js';
14
+ export { prepareForVision, MAX_EDGE } from './vision-prep.js';
15
+ export { buildAltAdapterFromScaffold, } from './adapter-scaffold.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AACvD,OAAO,EACL,OAAO,EACP,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GAIvB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,aAAa,EAAyB,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAyC,MAAM,kBAAkB,CAAA;AACpG,OAAO,EACL,2BAA2B,GAG5B,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `AIProvider` — transport-only interface for an AI account / endpoint.
3
+ *
4
+ * Per [`design-ai.md`](../../../.claude/rules/design-ai.md) "Two-axis split":
5
+ * the provider holds transport (apiKey, baseUrl, organizationId, timeout)
6
+ * and exposes per-task builder methods that return per-task adapters.
7
+ * Operational config (model, systemPrompt, maxTokens) lives in
8
+ * data-literal blocks the resolver feeds to `provider.altText({...})`
9
+ * at boot — not on the provider constructor.
10
+ *
11
+ * Why split: one Anthropic account legitimately serves multiple tasks
12
+ * (alt-text, future translation, future summarization, future
13
+ * image-gen) with different model + prompt + token-budget per task.
14
+ * Putting model/prompt on the constructor would force operators to
15
+ * build a separate provider per task; transport-only keeps providers
16
+ * reusable across tasks.
17
+ *
18
+ * Future tasks add their own builder method here:
19
+ * - `translation(taskConfig: TranslationTaskConfig): TranslationAdapter`
20
+ * - `summarization(taskConfig: SummarizationTaskConfig): SummarizationAdapter`
21
+ *
22
+ * Plugin-supplied providers may extend this with their own builder
23
+ * methods; consumers depend on the abstraction (`AIProvider`), not
24
+ * the concrete provider classes.
25
+ */
26
+ import type { AltTextAdapter } from '../alt/adapter.js';
27
+ /**
28
+ * Per-task configuration for the alt-text task. Data-literal type fed to
29
+ * `provider.altText(taskConfig)` by the resolver. Field details:
30
+ *
31
+ * - `model` — non-optional at adapter construction; the resolver always
32
+ * supplies one (chain falls through to `PROVIDER_DEFAULT_MODELS`).
33
+ * Operator-facing config blocks make it optional and inherit per the
34
+ * three-rung chain (target → site → gazetta → provider default).
35
+ *
36
+ * - `systemPrompt` — operator-supplied voice/style override. When set,
37
+ * the suggester prepends it to the system-composed neutral prompt
38
+ * (see `design-ai.md` "Prompt composition"). Null/undefined = use
39
+ * system default only. Custom prompt policies (full replacement of
40
+ * the WCAG-grounded base) remain v1.6+ deferred.
41
+ *
42
+ * - `maxTokens` — generation budget cap. Provider-specific default
43
+ * applies when null/undefined (Anthropic derives from `maxChars`;
44
+ * OpenAI/Ollama use SDK defaults).
45
+ */
46
+ export interface AltTextTaskConfig {
47
+ /** Model ID. Non-optional at adapter construction (resolver always supplies). */
48
+ model: string;
49
+ /** Operator-supplied system prompt; prepended to the system-composed prompt. */
50
+ systemPrompt?: string;
51
+ /** Generation token cap; provider-default applies when absent. */
52
+ maxTokens?: number;
53
+ }
54
+ /**
55
+ * Transport-only AI provider. Constructor takes credentials/endpoint
56
+ * config; builder methods construct per-task adapters from data-literal
57
+ * task config.
58
+ */
59
+ export interface AIProvider {
60
+ /** Stable identifier for diagnostics + per-provider default-model lookup. */
61
+ readonly name: string;
62
+ /**
63
+ * Construct an alt-text adapter from per-task config. Resolver supplies
64
+ * the merged `AltTextTaskConfig` from the three-rung inheritance chain.
65
+ */
66
+ altText(taskConfig: AltTextTaskConfig): AltTextAdapter;
67
+ }
68
+ /**
69
+ * Per-provider sensible default model. Used when the model field is
70
+ * unset across the entire chain (gazetta → site → target). Plugin
71
+ * providers contribute their own name; default-model fallback for
72
+ * unknown plugin names returns undefined (operator must specify
73
+ * `model` somewhere in the chain).
74
+ */
75
+ export declare const PROVIDER_DEFAULT_MODELS: Record<string, string>;
76
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAA;IACb,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,OAAO,CAAC,UAAU,EAAE,iBAAiB,GAAG,cAAc,CAAA;CAKvD;AAED;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI1D,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Per-provider sensible default model. Used when the model field is
3
+ * unset across the entire chain (gazetta → site → target). Plugin
4
+ * providers contribute their own name; default-model fallback for
5
+ * unknown plugin names returns undefined (operator must specify
6
+ * `model` somewhere in the chain).
7
+ */
8
+ export const PROVIDER_DEFAULT_MODELS = {
9
+ anthropic: 'claude-haiku-4-5',
10
+ openai: 'gpt-4o-mini',
11
+ ollama: 'llama3.2-vision:11b',
12
+ };
13
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/ai/provider.ts"],"names":[],"mappings":"AA2EA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA2B;IAC7D,SAAS,EAAE,kBAAkB;IAC7B,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,qBAAqB;CAC9B,CAAA"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Refusal detection for AI provider responses.
3
+ *
4
+ * # Why this lives in `ai/` and not `alt/`
5
+ *
6
+ * Provider safety refusals look the same regardless of task. Whether
7
+ * the model is asked to describe an image (alt-text) or translate a
8
+ * paragraph (future), a refusal arrives as a 200 OK with text like
9
+ * "I can't help with that" in the response body — structurally
10
+ * indistinguishable from a successful response without inspection.
11
+ *
12
+ * v1.5's only consumer is `alt/`, but refusal detection is conceptually
13
+ * cross-task. Right structure now beats right structure later, per
14
+ * [team-preferences rule 18]: "extract shared code when you first see
15
+ * the split concern". Translation as the documented next consumer
16
+ * (per [design-ai-implementation.md]) makes this a known split.
17
+ *
18
+ * # Marker maintenance
19
+ *
20
+ * The marker list below MUST stay current as providers tune their
21
+ * safety messaging. Plan: review at every major model version bump
22
+ * (e.g., when an adapter's `defaultModel` jumps a major). Provider-
23
+ * specific phrases live in the adapter (passed via `adapterMarkers`)
24
+ * so generic markers and provider-specific ones can evolve
25
+ * independently.
26
+ *
27
+ * # SOLID lenses
28
+ *
29
+ * - SRP: this module owns "raw text → structured refusal info"
30
+ * - OCP: per-adapter markers extend without touching the shared list
31
+ * - DIP: callers depend on `detectRefusal`, not on substring inspection
32
+ * scattered across the codebase
33
+ */
34
+ export interface RefusalDetection {
35
+ refused: boolean;
36
+ /** Truncated reason text when refused; null when not. */
37
+ reason: string | null;
38
+ }
39
+ /**
40
+ * Detect whether `text` is a refusal. Caller passes adapter-specific
41
+ * markers (e.g., Anthropic's particular phrasing) on top of the shared
42
+ * list.
43
+ *
44
+ * Returns `{ refused: false, reason: null }` for descriptive responses;
45
+ * `{ refused: true, reason: <truncated text> }` otherwise. Reason is
46
+ * truncated to 200 chars so logs and UI toasts don't render arbitrarily
47
+ * long refusal blocks.
48
+ */
49
+ export declare function detectRefusal(text: string, adapterMarkers?: readonly string[]): RefusalDetection;
50
+ //# sourceMappingURL=refusal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../../src/ai/refusal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AA2CH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,yDAAyD;IACzD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,GAAE,SAAS,MAAM,EAAO,GAAG,gBAAgB,CAgBpG"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Refusal detection for AI provider responses.
3
+ *
4
+ * # Why this lives in `ai/` and not `alt/`
5
+ *
6
+ * Provider safety refusals look the same regardless of task. Whether
7
+ * the model is asked to describe an image (alt-text) or translate a
8
+ * paragraph (future), a refusal arrives as a 200 OK with text like
9
+ * "I can't help with that" in the response body — structurally
10
+ * indistinguishable from a successful response without inspection.
11
+ *
12
+ * v1.5's only consumer is `alt/`, but refusal detection is conceptually
13
+ * cross-task. Right structure now beats right structure later, per
14
+ * [team-preferences rule 18]: "extract shared code when you first see
15
+ * the split concern". Translation as the documented next consumer
16
+ * (per [design-ai-implementation.md]) makes this a known split.
17
+ *
18
+ * # Marker maintenance
19
+ *
20
+ * The marker list below MUST stay current as providers tune their
21
+ * safety messaging. Plan: review at every major model version bump
22
+ * (e.g., when an adapter's `defaultModel` jumps a major). Provider-
23
+ * specific phrases live in the adapter (passed via `adapterMarkers`)
24
+ * so generic markers and provider-specific ones can evolve
25
+ * independently.
26
+ *
27
+ * # SOLID lenses
28
+ *
29
+ * - SRP: this module owns "raw text → structured refusal info"
30
+ * - OCP: per-adapter markers extend without touching the shared list
31
+ * - DIP: callers depend on `detectRefusal`, not on substring inspection
32
+ * scattered across the codebase
33
+ */
34
+ /**
35
+ * Cross-provider refusal phrases. Lowercase substrings — the matcher
36
+ * lowercases both sides, so casing in the upstream response doesn't
37
+ * matter. Order is irrelevant; `Array.some` is fine at this size.
38
+ *
39
+ * Each entry corresponds to a phrase observed across at least two
40
+ * providers' refusal outputs. Provider-specific phrasing belongs in
41
+ * the adapter, passed via `adapterMarkers`.
42
+ */
43
+ const SHARED_REFUSAL_MARKERS = [
44
+ "i can't describe",
45
+ 'i cannot describe',
46
+ "i'm not able to describe",
47
+ 'i am not able to describe',
48
+ "i'm unable to describe",
49
+ 'i am unable to describe',
50
+ "i can't provide",
51
+ 'i cannot provide',
52
+ "i'm unable to provide",
53
+ 'i am unable to provide',
54
+ "i can't help",
55
+ 'i cannot help',
56
+ "i'm not able to help",
57
+ "i'm sorry, but",
58
+ ];
59
+ /**
60
+ * Minimum useful response length. Below this, even a non-refusal
61
+ * response is too short to be a real description — treat as a refusal
62
+ * with a generic reason. Calibrated for the alt-text use case where
63
+ * five chars is below "Cat." (4) but above "Hi" (2); empty responses
64
+ * also fall through here.
65
+ *
66
+ * If a future task has different length expectations (e.g., a single-
67
+ * word tag), the consumer should normalize the response before passing
68
+ * it to `detectRefusal`, OR the threshold becomes a parameter. Don't
69
+ * generalize speculatively — wait for the second task to force the
70
+ * shape.
71
+ */
72
+ const MIN_USEFUL_LENGTH = 5;
73
+ /**
74
+ * Detect whether `text` is a refusal. Caller passes adapter-specific
75
+ * markers (e.g., Anthropic's particular phrasing) on top of the shared
76
+ * list.
77
+ *
78
+ * Returns `{ refused: false, reason: null }` for descriptive responses;
79
+ * `{ refused: true, reason: <truncated text> }` otherwise. Reason is
80
+ * truncated to 200 chars so logs and UI toasts don't render arbitrarily
81
+ * long refusal blocks.
82
+ */
83
+ export function detectRefusal(text, adapterMarkers = []) {
84
+ const lower = text.toLowerCase();
85
+ for (const marker of SHARED_REFUSAL_MARKERS) {
86
+ if (lower.includes(marker)) {
87
+ return { refused: true, reason: text.slice(0, 200) };
88
+ }
89
+ }
90
+ for (const marker of adapterMarkers) {
91
+ if (lower.includes(marker.toLowerCase())) {
92
+ return { refused: true, reason: text.slice(0, 200) };
93
+ }
94
+ }
95
+ if (text.trim().length < MIN_USEFUL_LENGTH) {
96
+ return { refused: true, reason: 'Empty or unusably short response' };
97
+ }
98
+ return { refused: false, reason: null };
99
+ }
100
+ //# sourceMappingURL=refusal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.js","sourceRoot":"","sources":["../../src/ai/refusal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;;GAQG;AACH,MAAM,sBAAsB,GAAsB;IAChD,kBAAkB;IAClB,mBAAmB;IACnB,0BAA0B;IAC1B,2BAA2B;IAC3B,wBAAwB;IACxB,yBAAyB;IACzB,iBAAiB;IACjB,kBAAkB;IAClB,uBAAuB;IACvB,wBAAwB;IACxB,cAAc;IACd,eAAe;IACf,sBAAsB;IACtB,gBAAgB;CACjB,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAA;AAQ3B;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,iBAAoC,EAAE;IAChF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAChC,KAAK,MAAM,MAAM,IAAI,sBAAsB,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;QACtD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;QACtD,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAA;IACtE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AACzC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /** Default long-edge cap. Per-call override available via `maxEdge`. */
2
+ export declare const MAX_EDGE = 768;
3
+ export interface PrepareInput {
4
+ /** Source bytes (raw asset bytes, post-preprocess). */
5
+ bytes: Uint8Array;
6
+ /** Source MIME type from the asset manifest. */
7
+ mime: string;
8
+ /**
9
+ * For animated images, the analyzer's extracted first-frame poster
10
+ * bytes (always PNG). When provided, used directly — no further
11
+ * rasterization. Skip for static images.
12
+ */
13
+ posterBytes?: Uint8Array;
14
+ /** Long-edge cap override; defaults to {@link MAX_EDGE}. */
15
+ maxEdge?: number;
16
+ }
17
+ export interface PreparedImage {
18
+ /** Bytes ready to send to a vision provider. */
19
+ bytes: Uint8Array;
20
+ /** MIME of the prepared bytes — `image/jpeg` or `image/png`. */
21
+ mime: string;
22
+ }
23
+ /**
24
+ * Prepare image bytes for a vision-call. Single async call that picks
25
+ * the right code path based on input.
26
+ *
27
+ * Throws on hard failures (corrupt source bytes that sharp can't
28
+ * decode, even past metadata). Callers wrap in their adapter's error
29
+ * taxonomy.
30
+ */
31
+ export declare function prepareForVision(input: PrepareInput): Promise<PreparedImage>;
32
+ //# sourceMappingURL=vision-prep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-prep.d.ts","sourceRoot":"","sources":["../../src/ai/vision-prep.ts"],"names":[],"mappings":"AA2DA,wEAAwE;AACxE,eAAO,MAAM,QAAQ,MAAM,CAAA;AAE3B,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,KAAK,EAAE,UAAU,CAAA;IACjB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,KAAK,EAAE,UAAU,CAAA;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;CACb;AAWD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAuClF"}