@prenta/core 5.10.0 → 7.0.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 (467) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/actions.d.ts.map +1 -1
  3. package/dist/actions.js +5 -15
  4. package/dist/actions.js.map +1 -1
  5. package/dist/ai/brand-voice-analyze.d.ts +1 -4
  6. package/dist/ai/brand-voice-analyze.d.ts.map +1 -1
  7. package/dist/ai/brand-voice-analyze.js +1 -2
  8. package/dist/ai/brand-voice-analyze.js.map +1 -1
  9. package/dist/ai/brand-voice-sources.d.ts +0 -2
  10. package/dist/ai/brand-voice-sources.d.ts.map +1 -1
  11. package/dist/ai/brand-voice-sources.js +2 -2
  12. package/dist/ai/brand-voice-sources.js.map +1 -1
  13. package/dist/ai/brand-voice-structured.d.ts +6 -6
  14. package/dist/ai/brand-voice-structured.d.ts.map +1 -1
  15. package/dist/ai/catalog.d.ts +8 -0
  16. package/dist/ai/catalog.d.ts.map +1 -1
  17. package/dist/ai/catalog.js +22 -0
  18. package/dist/ai/catalog.js.map +1 -1
  19. package/dist/ai/config-store.d.ts +18 -4
  20. package/dist/ai/config-store.d.ts.map +1 -1
  21. package/dist/ai/config-store.js +115 -20
  22. package/dist/ai/config-store.js.map +1 -1
  23. package/dist/ai/content-writing-generate.d.ts +10 -8
  24. package/dist/ai/content-writing-generate.d.ts.map +1 -1
  25. package/dist/ai/content-writing-generate.js +24 -59
  26. package/dist/ai/content-writing-generate.js.map +1 -1
  27. package/dist/ai/embeddings.d.ts +28 -0
  28. package/dist/ai/embeddings.d.ts.map +1 -0
  29. package/dist/ai/embeddings.js +36 -0
  30. package/dist/ai/embeddings.js.map +1 -0
  31. package/dist/ai/feature-defaults.d.ts +3 -3
  32. package/dist/ai/feature-defaults.d.ts.map +1 -1
  33. package/dist/ai/feature-defaults.js +24 -14
  34. package/dist/ai/feature-defaults.js.map +1 -1
  35. package/dist/ai/index.d.ts +15 -16
  36. package/dist/ai/index.d.ts.map +1 -1
  37. package/dist/ai/index.js +14 -15
  38. package/dist/ai/index.js.map +1 -1
  39. package/dist/ai/models.d.ts +7 -3
  40. package/dist/ai/models.d.ts.map +1 -1
  41. package/dist/ai/models.js +10 -5
  42. package/dist/ai/models.js.map +1 -1
  43. package/dist/ai/plugin-errors.d.ts +9 -3
  44. package/dist/ai/plugin-errors.d.ts.map +1 -1
  45. package/dist/ai/plugin-errors.js +9 -3
  46. package/dist/ai/plugin-errors.js.map +1 -1
  47. package/dist/ai/plugin-import.d.ts +20 -0
  48. package/dist/ai/plugin-import.d.ts.map +1 -0
  49. package/dist/ai/plugin-import.js +24 -0
  50. package/dist/ai/plugin-import.js.map +1 -0
  51. package/dist/ai/prompt-safety.d.ts +23 -0
  52. package/dist/ai/prompt-safety.d.ts.map +1 -0
  53. package/dist/ai/prompt-safety.js +34 -0
  54. package/dist/ai/prompt-safety.js.map +1 -0
  55. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  56. package/dist/ai/providers/anthropic.js +16 -1
  57. package/dist/ai/providers/anthropic.js.map +1 -1
  58. package/dist/ai/providers/http.d.ts +7 -2
  59. package/dist/ai/providers/http.d.ts.map +1 -1
  60. package/dist/ai/providers/http.js +13 -2
  61. package/dist/ai/providers/http.js.map +1 -1
  62. package/dist/ai/providers/index.d.ts +0 -7
  63. package/dist/ai/providers/index.d.ts.map +1 -1
  64. package/dist/ai/providers/index.js +1 -1
  65. package/dist/ai/providers/index.js.map +1 -1
  66. package/dist/ai/resolve.d.ts +7 -1
  67. package/dist/ai/resolve.d.ts.map +1 -1
  68. package/dist/ai/resolve.js +36 -3
  69. package/dist/ai/resolve.js.map +1 -1
  70. package/dist/ai/runtime-response.d.ts +27 -0
  71. package/dist/ai/runtime-response.d.ts.map +1 -0
  72. package/dist/ai/runtime-response.js +75 -0
  73. package/dist/ai/runtime-response.js.map +1 -0
  74. package/dist/ai/runtime.d.ts +9 -7
  75. package/dist/ai/runtime.d.ts.map +1 -1
  76. package/dist/ai/runtime.js +14 -19
  77. package/dist/ai/runtime.js.map +1 -1
  78. package/dist/ai/tasks/alt-text.d.ts +82 -0
  79. package/dist/ai/tasks/alt-text.d.ts.map +1 -0
  80. package/dist/ai/tasks/alt-text.js +171 -0
  81. package/dist/ai/tasks/alt-text.js.map +1 -0
  82. package/dist/ai/tasks/document-generation.d.ts +102 -0
  83. package/dist/ai/tasks/document-generation.d.ts.map +1 -0
  84. package/dist/ai/tasks/document-generation.js +321 -0
  85. package/dist/ai/tasks/document-generation.js.map +1 -0
  86. package/dist/ai/tasks/link-embeddings.d.ts +55 -0
  87. package/dist/ai/tasks/link-embeddings.d.ts.map +1 -0
  88. package/dist/ai/tasks/link-embeddings.js +160 -0
  89. package/dist/ai/tasks/link-embeddings.js.map +1 -0
  90. package/dist/ai/types.d.ts +15 -19
  91. package/dist/ai/types.d.ts.map +1 -1
  92. package/dist/ai/types.js +6 -7
  93. package/dist/ai/types.js.map +1 -1
  94. package/dist/ai/usage.d.ts +6 -4
  95. package/dist/ai/usage.d.ts.map +1 -1
  96. package/dist/ai/usage.js +6 -4
  97. package/dist/ai/usage.js.map +1 -1
  98. package/dist/ai/vector.d.ts +8 -0
  99. package/dist/ai/vector.d.ts.map +1 -0
  100. package/dist/ai/vector.js +24 -0
  101. package/dist/ai/vector.js.map +1 -0
  102. package/dist/api/responses.d.ts +1 -1
  103. package/dist/api/responses.d.ts.map +1 -1
  104. package/dist/api/responses.js +1 -1
  105. package/dist/api/responses.js.map +1 -1
  106. package/dist/api/route-helpers.d.ts +3 -20
  107. package/dist/api/route-helpers.d.ts.map +1 -1
  108. package/dist/api/route-helpers.js +12 -26
  109. package/dist/api/route-helpers.js.map +1 -1
  110. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  111. package/dist/api/routes/ai-authoring.js +132 -144
  112. package/dist/api/routes/ai-authoring.js.map +1 -1
  113. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  114. package/dist/api/routes/ai-seo.js +44 -120
  115. package/dist/api/routes/ai-seo.js.map +1 -1
  116. package/dist/api/routes/ai-settings.d.ts.map +1 -1
  117. package/dist/api/routes/ai-settings.js +76 -28
  118. package/dist/api/routes/ai-settings.js.map +1 -1
  119. package/dist/api/routes/security-center.d.ts.map +1 -1
  120. package/dist/api/routes/security-center.js +5 -39
  121. package/dist/api/routes/security-center.js.map +1 -1
  122. package/dist/api/routes/seo-public.d.ts +0 -5
  123. package/dist/api/routes/seo-public.d.ts.map +1 -1
  124. package/dist/api/routes/seo-public.js +1 -1
  125. package/dist/api/routes/seo-public.js.map +1 -1
  126. package/dist/api/routes/seo.d.ts.map +1 -1
  127. package/dist/api/routes/seo.js +21 -48
  128. package/dist/api/routes/seo.js.map +1 -1
  129. package/dist/api/security-headers.d.ts +8 -0
  130. package/dist/api/security-headers.d.ts.map +1 -0
  131. package/dist/api/security-headers.js +13 -0
  132. package/dist/api/security-headers.js.map +1 -0
  133. package/dist/appearance/favicon-icon.d.ts +1 -1
  134. package/dist/appearance/favicon-icon.d.ts.map +1 -1
  135. package/dist/appearance/favicon-icon.js +1 -1
  136. package/dist/appearance/favicon-icon.js.map +1 -1
  137. package/dist/auth/index.d.ts +0 -6
  138. package/dist/auth/index.d.ts.map +1 -1
  139. package/dist/auth/index.js +0 -3
  140. package/dist/auth/index.js.map +1 -1
  141. package/dist/auth/invites.d.ts +0 -5
  142. package/dist/auth/invites.d.ts.map +1 -1
  143. package/dist/auth/invites.js +3 -3
  144. package/dist/auth/invites.js.map +1 -1
  145. package/dist/auth/team.d.ts +4 -3
  146. package/dist/auth/team.d.ts.map +1 -1
  147. package/dist/auth/user-admin.d.ts +2 -1
  148. package/dist/auth/user-admin.d.ts.map +1 -1
  149. package/dist/billing/stripe-meter.d.ts +2 -1
  150. package/dist/billing/stripe-meter.d.ts.map +1 -1
  151. package/dist/cache/http.d.ts +0 -11
  152. package/dist/cache/http.d.ts.map +1 -1
  153. package/dist/cache/http.js +1 -1
  154. package/dist/cache/http.js.map +1 -1
  155. package/dist/cache/index.d.ts +0 -5
  156. package/dist/cache/index.d.ts.map +1 -1
  157. package/dist/config/types.d.ts +19 -19
  158. package/dist/config/types.d.ts.map +1 -1
  159. package/dist/content/index.d.ts +2 -5
  160. package/dist/content/index.d.ts.map +1 -1
  161. package/dist/content/index.js +1 -3
  162. package/dist/content/index.js.map +1 -1
  163. package/dist/content/structured-data.d.ts +0 -14
  164. package/dist/content/structured-data.d.ts.map +1 -1
  165. package/dist/content/structured-data.js +3 -14
  166. package/dist/content/structured-data.js.map +1 -1
  167. package/dist/cron/index.d.ts +2 -3
  168. package/dist/cron/index.d.ts.map +1 -1
  169. package/dist/cron/index.js +0 -2
  170. package/dist/cron/index.js.map +1 -1
  171. package/dist/db/client-types.d.ts +2 -1
  172. package/dist/db/client-types.d.ts.map +1 -1
  173. package/dist/db/model-types.d.ts +0 -1
  174. package/dist/db/model-types.d.ts.map +1 -1
  175. package/dist/db.d.ts +0 -2
  176. package/dist/db.d.ts.map +1 -1
  177. package/dist/db.js +0 -1
  178. package/dist/db.js.map +1 -1
  179. package/dist/diagnostics/env.d.ts +1 -1
  180. package/dist/diagnostics/env.d.ts.map +1 -1
  181. package/dist/diagnostics/logger.d.ts +0 -24
  182. package/dist/diagnostics/logger.d.ts.map +1 -1
  183. package/dist/forms/entries.d.ts +0 -7
  184. package/dist/forms/entries.d.ts.map +1 -1
  185. package/dist/forms/entries.js +1 -19
  186. package/dist/forms/entries.js.map +1 -1
  187. package/dist/forms/files.d.ts +1 -1
  188. package/dist/forms/files.d.ts.map +1 -1
  189. package/dist/forms/index.d.ts +4 -6
  190. package/dist/forms/index.d.ts.map +1 -1
  191. package/dist/forms/index.js +3 -5
  192. package/dist/forms/index.js.map +1 -1
  193. package/dist/forms/prefetch.d.ts +0 -6
  194. package/dist/forms/prefetch.d.ts.map +1 -1
  195. package/dist/forms/service.d.ts +0 -4
  196. package/dist/forms/service.d.ts.map +1 -1
  197. package/dist/forms/service.js +2 -8
  198. package/dist/forms/service.js.map +1 -1
  199. package/dist/forms/webmcp.d.ts +0 -2
  200. package/dist/forms/webmcp.d.ts.map +1 -1
  201. package/dist/forms/webmcp.js +1 -1
  202. package/dist/forms/webmcp.js.map +1 -1
  203. package/dist/generated/internal/class.js +4 -4
  204. package/dist/generated/internal/prismaNamespace.d.ts +0 -1
  205. package/dist/generated/internal/prismaNamespace.js +0 -1
  206. package/dist/generated/internal/prismaNamespaceBrowser.d.ts +0 -1
  207. package/dist/generated/internal/prismaNamespaceBrowser.js +0 -1
  208. package/dist/generated/models/Document.d.ts +1 -58
  209. package/dist/index.d.ts +2 -2
  210. package/dist/index.d.ts.map +1 -1
  211. package/dist/index.js +1 -1
  212. package/dist/index.js.map +1 -1
  213. package/dist/media/denormalize.d.ts +0 -7
  214. package/dist/media/denormalize.d.ts.map +1 -1
  215. package/dist/media/index.d.ts +0 -8
  216. package/dist/media/index.d.ts.map +1 -1
  217. package/dist/media/index.js +0 -5
  218. package/dist/media/index.js.map +1 -1
  219. package/dist/media/optimize.d.ts +0 -4
  220. package/dist/media/optimize.d.ts.map +1 -1
  221. package/dist/media/optimize.js +4 -4
  222. package/dist/media/optimize.js.map +1 -1
  223. package/dist/media/reoptimize.d.ts +2 -3
  224. package/dist/media/reoptimize.d.ts.map +1 -1
  225. package/dist/media/reoptimize.js +2 -2
  226. package/dist/media/reoptimize.js.map +1 -1
  227. package/dist/media/seo.d.ts +3 -8
  228. package/dist/media/seo.d.ts.map +1 -1
  229. package/dist/media/seo.js +1 -1
  230. package/dist/media/seo.js.map +1 -1
  231. package/dist/plan/features.d.ts +0 -1
  232. package/dist/plan/features.d.ts.map +1 -1
  233. package/dist/plan/features.js +0 -16
  234. package/dist/plan/features.js.map +1 -1
  235. package/dist/preview/event-bus.d.ts +2 -1
  236. package/dist/preview/event-bus.d.ts.map +1 -1
  237. package/dist/preview/index.d.ts +2 -1
  238. package/dist/preview/index.d.ts.map +1 -1
  239. package/dist/preview/sse-stream.d.ts +0 -13
  240. package/dist/preview/sse-stream.d.ts.map +1 -1
  241. package/dist/preview/sse-stream.js +2 -2
  242. package/dist/preview/sse-stream.js.map +1 -1
  243. package/dist/realtime/notifications.d.ts +4 -3
  244. package/dist/realtime/notifications.d.ts.map +1 -1
  245. package/dist/redirects/index.d.ts +4 -16
  246. package/dist/redirects/index.d.ts.map +1 -1
  247. package/dist/redirects/index.js +2 -9
  248. package/dist/redirects/index.js.map +1 -1
  249. package/dist/redirects/match.d.ts +0 -2
  250. package/dist/redirects/match.d.ts.map +1 -1
  251. package/dist/redirects/match.js +1 -1
  252. package/dist/redirects/match.js.map +1 -1
  253. package/dist/redirects/recovery.d.ts +0 -2
  254. package/dist/redirects/recovery.d.ts.map +1 -1
  255. package/dist/redirects/recovery.js +1 -1
  256. package/dist/redirects/recovery.js.map +1 -1
  257. package/dist/redirects/rerank.d.ts +4 -3
  258. package/dist/redirects/rerank.d.ts.map +1 -1
  259. package/dist/redirects/rerank.js +3 -18
  260. package/dist/redirects/rerank.js.map +1 -1
  261. package/dist/sections/validate.d.ts +0 -2
  262. package/dist/sections/validate.d.ts.map +1 -1
  263. package/dist/sections/validate.js +1 -1
  264. package/dist/sections/validate.js.map +1 -1
  265. package/dist/security/access.d.ts +0 -9
  266. package/dist/security/access.d.ts.map +1 -1
  267. package/dist/security/access.js +1 -3
  268. package/dist/security/access.js.map +1 -1
  269. package/dist/security/audit.d.ts +0 -20
  270. package/dist/security/audit.d.ts.map +1 -1
  271. package/dist/security/audit.js.map +1 -1
  272. package/dist/security/index.d.ts +2 -20
  273. package/dist/security/index.d.ts.map +1 -1
  274. package/dist/security/index.js +2 -7
  275. package/dist/security/index.js.map +1 -1
  276. package/dist/security/internal-keys.d.ts +0 -12
  277. package/dist/security/internal-keys.d.ts.map +1 -1
  278. package/dist/security/internal-keys.js +10 -12
  279. package/dist/security/internal-keys.js.map +1 -1
  280. package/dist/security/rate-limit-policy.d.ts +0 -2
  281. package/dist/security/rate-limit-policy.d.ts.map +1 -1
  282. package/dist/security/rate-limit-policy.js +1 -1
  283. package/dist/security/rate-limit-policy.js.map +1 -1
  284. package/dist/security/rate-limit.d.ts +2 -5
  285. package/dist/security/rate-limit.d.ts.map +1 -1
  286. package/dist/security/rate-limit.js +2 -2
  287. package/dist/security/rate-limit.js.map +1 -1
  288. package/dist/security/sanitize.d.ts +0 -3
  289. package/dist/security/sanitize.d.ts.map +1 -1
  290. package/dist/security/sanitize.js +0 -1
  291. package/dist/security/sanitize.js.map +1 -1
  292. package/dist/security/upload.d.ts +0 -3
  293. package/dist/security/upload.d.ts.map +1 -1
  294. package/dist/security/upload.js +0 -1
  295. package/dist/security/upload.js.map +1 -1
  296. package/dist/seo/ai-crawler-log.d.ts +0 -2
  297. package/dist/seo/ai-crawler-log.d.ts.map +1 -1
  298. package/dist/seo/ai-crawler-log.js +1 -1
  299. package/dist/seo/ai-crawler-log.js.map +1 -1
  300. package/dist/seo/audit-engine.d.ts +5 -5
  301. package/dist/seo/audit-engine.d.ts.map +1 -1
  302. package/dist/seo/audit-engine.js +1 -2
  303. package/dist/seo/audit-engine.js.map +1 -1
  304. package/dist/seo/audit-runner.d.ts +0 -7
  305. package/dist/seo/audit-runner.d.ts.map +1 -1
  306. package/dist/seo/audit-runner.js +1 -1
  307. package/dist/seo/audit-runner.js.map +1 -1
  308. package/dist/seo/audit-signals.d.ts +0 -2
  309. package/dist/seo/audit-signals.d.ts.map +1 -1
  310. package/dist/seo/audit-signals.js +1 -1
  311. package/dist/seo/audit-signals.js.map +1 -1
  312. package/dist/seo/autopilot-gate.d.ts +0 -1
  313. package/dist/seo/autopilot-gate.d.ts.map +1 -1
  314. package/dist/seo/autopilot-gate.js +1 -1
  315. package/dist/seo/autopilot-gate.js.map +1 -1
  316. package/dist/seo/autopilot-ledger.d.ts +2 -1
  317. package/dist/seo/autopilot-ledger.d.ts.map +1 -1
  318. package/dist/seo/autopilot-outcome.d.ts +0 -2
  319. package/dist/seo/autopilot-outcome.d.ts.map +1 -1
  320. package/dist/seo/autopilot-outcome.js +1 -1
  321. package/dist/seo/autopilot-outcome.js.map +1 -1
  322. package/dist/seo/autopilot-policy.d.ts +3 -38
  323. package/dist/seo/autopilot-policy.d.ts.map +1 -1
  324. package/dist/seo/autopilot-policy.js +3 -3
  325. package/dist/seo/autopilot-policy.js.map +1 -1
  326. package/dist/seo/autopilot.d.ts +4 -12
  327. package/dist/seo/autopilot.d.ts.map +1 -1
  328. package/dist/seo/autopilot.js +3 -3
  329. package/dist/seo/autopilot.js.map +1 -1
  330. package/dist/seo/config-store.d.ts +0 -2
  331. package/dist/seo/config-store.d.ts.map +1 -1
  332. package/dist/seo/config-store.js +1 -1
  333. package/dist/seo/config-store.js.map +1 -1
  334. package/dist/seo/digest.d.ts +8 -7
  335. package/dist/seo/digest.d.ts.map +1 -1
  336. package/dist/seo/faq-signals.d.ts +0 -4
  337. package/dist/seo/faq-signals.d.ts.map +1 -1
  338. package/dist/seo/faq-signals.js +4 -4
  339. package/dist/seo/faq-signals.js.map +1 -1
  340. package/dist/seo/fix-brief-export.d.ts +0 -2
  341. package/dist/seo/fix-brief-export.d.ts.map +1 -1
  342. package/dist/seo/fix-brief-export.js +1 -1
  343. package/dist/seo/fix-brief-export.js.map +1 -1
  344. package/dist/seo/geo-record.d.ts +0 -4
  345. package/dist/seo/geo-record.d.ts.map +1 -1
  346. package/dist/seo/geo-record.js +2 -2
  347. package/dist/seo/geo-record.js.map +1 -1
  348. package/dist/seo/geo-report.d.ts +4 -3
  349. package/dist/seo/geo-report.d.ts.map +1 -1
  350. package/dist/seo/geo-report.js +1 -1
  351. package/dist/seo/geo-report.js.map +1 -1
  352. package/dist/seo/index-status.d.ts +6 -5
  353. package/dist/seo/index-status.d.ts.map +1 -1
  354. package/dist/seo/index-status.js.map +1 -1
  355. package/dist/seo/index.d.ts +15 -90
  356. package/dist/seo/index.d.ts.map +1 -1
  357. package/dist/seo/index.js +10 -49
  358. package/dist/seo/index.js.map +1 -1
  359. package/dist/seo/issue-batch-briefs.d.ts +2 -3
  360. package/dist/seo/issue-batch-briefs.d.ts.map +1 -1
  361. package/dist/seo/issue-batch-briefs.js +2 -2
  362. package/dist/seo/issue-batch-briefs.js.map +1 -1
  363. package/dist/seo/issue-content-brief.d.ts +2 -1
  364. package/dist/seo/issue-content-brief.d.ts.map +1 -1
  365. package/dist/seo/issue-content-research.d.ts +2 -2
  366. package/dist/seo/issue-content-research.d.ts.map +1 -1
  367. package/dist/seo/issue-content-research.js +1 -1
  368. package/dist/seo/issue-content-research.js.map +1 -1
  369. package/dist/seo/issue-fix-ai.d.ts +5 -4
  370. package/dist/seo/issue-fix-ai.d.ts.map +1 -1
  371. package/dist/seo/issue-fix-ai.js +4 -19
  372. package/dist/seo/issue-fix-ai.js.map +1 -1
  373. package/dist/seo/issue-fix-apply.d.ts +2 -11
  374. package/dist/seo/issue-fix-apply.d.ts.map +1 -1
  375. package/dist/seo/issue-fix-apply.js +4 -4
  376. package/dist/seo/issue-fix-apply.js.map +1 -1
  377. package/dist/seo/issue-fix-faq.d.ts +4 -7
  378. package/dist/seo/issue-fix-faq.d.ts.map +1 -1
  379. package/dist/seo/issue-fix-faq.js +4 -4
  380. package/dist/seo/issue-fix-faq.js.map +1 -1
  381. package/dist/seo/issue-fix-link-insert.d.ts +4 -14
  382. package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
  383. package/dist/seo/issue-fix-link-insert.js +5 -4
  384. package/dist/seo/issue-fix-link-insert.js.map +1 -1
  385. package/dist/seo/issue-fix-redirect.d.ts +0 -1
  386. package/dist/seo/issue-fix-redirect.d.ts.map +1 -1
  387. package/dist/seo/issue-fix.d.ts.map +1 -1
  388. package/dist/seo/issue-fix.js +1 -0
  389. package/dist/seo/issue-fix.js.map +1 -1
  390. package/dist/seo/link-graph.d.ts +2 -3
  391. package/dist/seo/link-graph.d.ts.map +1 -1
  392. package/dist/seo/link-graph.js +0 -0
  393. package/dist/seo/link-graph.js.map +1 -1
  394. package/dist/seo/link-suggest.d.ts +8 -2
  395. package/dist/seo/link-suggest.d.ts.map +1 -1
  396. package/dist/seo/link-suggest.js +38 -53
  397. package/dist/seo/link-suggest.js.map +1 -1
  398. package/dist/seo/page-meta.d.ts +1 -10
  399. package/dist/seo/page-meta.d.ts.map +1 -1
  400. package/dist/seo/page-meta.js +1 -1
  401. package/dist/seo/page-meta.js.map +1 -1
  402. package/dist/seo/proposals-bulk-apply.d.ts +3 -2
  403. package/dist/seo/proposals-bulk-apply.d.ts.map +1 -1
  404. package/dist/seo/proposals.d.ts +2 -2
  405. package/dist/seo/proposals.d.ts.map +1 -1
  406. package/dist/seo/rendered-fetch.d.ts +2 -1
  407. package/dist/seo/rendered-fetch.d.ts.map +1 -1
  408. package/dist/seo/score.d.ts +3 -7
  409. package/dist/seo/score.d.ts.map +1 -1
  410. package/dist/seo/score.js.map +1 -1
  411. package/dist/seo/search-console/client.d.ts +0 -4
  412. package/dist/seo/search-console/client.d.ts.map +1 -1
  413. package/dist/seo/search-console/client.js +2 -2
  414. package/dist/seo/search-console/client.js.map +1 -1
  415. package/dist/seo/search-console/sync.d.ts +0 -4
  416. package/dist/seo/search-console/sync.d.ts.map +1 -1
  417. package/dist/seo/search-console/sync.js +2 -2
  418. package/dist/seo/search-console/sync.js.map +1 -1
  419. package/dist/seo/search-console/types.d.ts +2 -1
  420. package/dist/seo/search-console/types.d.ts.map +1 -1
  421. package/dist/seo/sitemap-notify.d.ts +0 -8
  422. package/dist/seo/sitemap-notify.d.ts.map +1 -1
  423. package/dist/seo/sitemap-notify.js +1 -1
  424. package/dist/seo/sitemap-notify.js.map +1 -1
  425. package/dist/seo/title-templates.d.ts +2 -5
  426. package/dist/seo/title-templates.d.ts.map +1 -1
  427. package/dist/seo/title-templates.js +2 -2
  428. package/dist/seo/title-templates.js.map +1 -1
  429. package/dist/server-site.d.ts +0 -1
  430. package/dist/server-site.d.ts.map +1 -1
  431. package/dist/server-site.js +0 -1
  432. package/dist/server-site.js.map +1 -1
  433. package/dist/storage/index.d.ts +0 -2
  434. package/dist/storage/index.d.ts.map +1 -1
  435. package/dist/storage/index.js +0 -4
  436. package/dist/storage/index.js.map +1 -1
  437. package/dist/upgrade/version-check.d.ts +0 -2
  438. package/dist/upgrade/version-check.d.ts.map +1 -1
  439. package/dist/upgrade/version-check.js +1 -1
  440. package/dist/upgrade/version-check.js.map +1 -1
  441. package/dist/webhooks/index.d.ts +0 -8
  442. package/dist/webhooks/index.d.ts.map +1 -1
  443. package/dist/webhooks/index.js +1 -16
  444. package/dist/webhooks/index.js.map +1 -1
  445. package/package.json +1 -1
  446. package/prisma/migrations/0019_drop_content_graph/migration.sql +4 -0
  447. package/prisma/schema.prisma +0 -1
  448. package/dist/api/auth-context.d.ts +0 -3
  449. package/dist/api/auth-context.d.ts.map +0 -1
  450. package/dist/api/auth-context.js +0 -3
  451. package/dist/api/auth-context.js.map +0 -1
  452. package/dist/api/limiters.d.ts +0 -3
  453. package/dist/api/limiters.d.ts.map +0 -1
  454. package/dist/api/limiters.js +0 -3
  455. package/dist/api/limiters.js.map +0 -1
  456. package/dist/content/content-graph.d.ts +0 -25
  457. package/dist/content/content-graph.d.ts.map +0 -1
  458. package/dist/content/content-graph.js +0 -40
  459. package/dist/content/content-graph.js.map +0 -1
  460. package/dist/db/index.d.ts +0 -9
  461. package/dist/db/index.d.ts.map +0 -1
  462. package/dist/db/index.js +0 -5
  463. package/dist/db/index.js.map +0 -1
  464. package/dist/next/preview.d.ts +0 -10
  465. package/dist/next/preview.d.ts.map +0 -1
  466. package/dist/next/preview.js +0 -17
  467. package/dist/next/preview.js.map +0 -1
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Provider-free prompt + normalization for accessible alt text. Moved from
3
+ * `@prenta/plugin-ai` (`media/alt-text-generator.ts`, `alt-text-prompt.ts`,
4
+ * `media/json.ts`) in Spec B; the model call runs through
5
+ * `generateJsonForFeature` under the `ai.features.mediaAltText` feature
6
+ * (toggle, daily cap, budget, usage metering), so this module never touches a
7
+ * provider.
8
+ *
9
+ * Vision-then-heuristic: when image bytes are supplied the vision path is
10
+ * tried first. If the resolved model is catalogued without `vision` the
11
+ * runtime refuses with `unsupported_input` *before* any network call, and we
12
+ * rerun text-only with confidence capped at {@link HEURISTIC_MAX_CONFIDENCE}.
13
+ * Every other runtime refusal propagates to the caller.
14
+ *
15
+ * Image bytes (`base64`) only ever travel in the adapter request body — they
16
+ * are never logged, audited, or echoed into an error message.
17
+ */
18
+ import { z } from 'zod';
19
+ import { clampAiContent, fenceUntrusted } from '../prompt-safety.js';
20
+ import { generateJsonForFeature } from '../runtime.js';
21
+ export const ALT_TEXT_FEATURE = 'ai.features.mediaAltText';
22
+ /** Max confidence we'll report for a text-only (no real image) heuristic. */
23
+ export const HEURISTIC_MAX_CONFIDENCE = 0.4;
24
+ /** Nearby page copy is clamped + fenced as untrusted so it cannot dominate or instruct. */
25
+ const SURROUNDING_TEXT_MAX_CHARS = 300;
26
+ /** Page titles are caller-supplied; clamp so a hostile title cannot pad the prompt. */
27
+ const PAGE_TITLE_MAX_CHARS = 200;
28
+ const ALT_TEXT_MAX_TOKENS = 512;
29
+ const ALT_TEXT_TEMPERATURE = 0.3;
30
+ /** Default confidence when the model omits one (vision vs. text-only). */
31
+ const DEFAULT_VISION_CONFIDENCE = 0.7;
32
+ const DEFAULT_TEXT_CONFIDENCE = 0.3;
33
+ const MAX_ALTERNATIVES = 2;
34
+ /** WCAG-aligned alt-text guidance shared by vision and heuristic paths. */
35
+ const ALT_TEXT_SYSTEM_PROMPT = `You are an accessibility specialist writing alt text for web images (WCAG 2.1 / W3C best practices).
36
+
37
+ Rules:
38
+ - Describe what matters for the image's purpose in context — not every visual detail.
39
+ - Be concise: target ≤125 characters; never exceed 125.
40
+ - Do NOT start with "image of", "photo of", "picture of", or "graphic of" — screen readers already announce it as an image.
41
+ - Do NOT include file names, dimensions, or SEO keyword stuffing.
42
+ - Include visible text in the image when it is essential to understanding.
43
+ - For people: describe relevant appearance only when needed for context; avoid speculative identity or sensitive traits.
44
+ - If the image is purely decorative (borders, spacers, visual flourish with no informational value), set isDecorative true and altText to "".
45
+ - For functional images (icons/buttons), describe the action or destination, not the pixel art.
46
+ - When page context is provided, prefer alt text that fits the surrounding content.
47
+
48
+ Return valid JSON only.`;
49
+ const ALT_TEXT_JSON_SHAPE = `Return a JSON object with:
50
+ - "altText": string (empty when decorative)
51
+ - "isDecorative": boolean
52
+ - "alternatives": array of exactly 2 alternative alt text options (empty strings when decorative)
53
+ - "confidence": number 0-1`;
54
+ /** Lenient on purpose: every key is optional so a partial reply still normalizes. */
55
+ export const AltTextSchema = z.object({
56
+ altText: z.string().optional(),
57
+ isDecorative: z.boolean().optional(),
58
+ alternatives: z.array(z.string()).optional(),
59
+ confidence: z.number().optional(),
60
+ });
61
+ /** Normalize model output to publishing-ready alt text. */
62
+ export function normalizeGeneratedAltText(raw, isDecorative) {
63
+ if (isDecorative)
64
+ return '';
65
+ let s = raw.trim();
66
+ s = s.replace(/^(an?\s+)?(image|photo|picture|graphic|screenshot)\s+of\s+/i, '');
67
+ s = s.replace(/\s+/g, ' ').trim();
68
+ if (s.length > 125)
69
+ s = `${s.slice(0, 122).trim()}…`;
70
+ return s;
71
+ }
72
+ /** Coerce a model-reported confidence into a finite number in [0, 1]. */
73
+ function clampConfidence(value, fallback) {
74
+ if (typeof value !== 'number' || !Number.isFinite(value))
75
+ return fallback;
76
+ return Math.max(0, Math.min(1, value));
77
+ }
78
+ export function buildAltTextPrompt(ctx, opts) {
79
+ const contextInfo = [
80
+ ctx.pageTitle && `Page title: ${clampAiContent(ctx.pageTitle, PAGE_TITLE_MAX_CHARS)}`,
81
+ ctx.surroundingText &&
82
+ `Nearby text:\n${fenceUntrusted(ctx.surroundingText, SURROUNDING_TEXT_MAX_CHARS)}`,
83
+ ctx.purpose && `Purpose: ${ctx.purpose}`,
84
+ ]
85
+ .filter(Boolean)
86
+ .join('\n');
87
+ const prompt = opts.vision
88
+ ? `Analyze the attached image and generate accessible alt text.\n\n${contextInfo ? `Context:\n${contextInfo}\n\n` : ''}${ALT_TEXT_JSON_SHAPE}`
89
+ : // No vision: infer ONLY from context. Be explicit so the model doesn't
90
+ // fabricate visual detail it cannot possibly know.
91
+ `You CANNOT see the image. Based only on the context below and the file name, suggest plausible accessible alt text, set isDecorative false unless context clearly indicates ornamentation, and report low confidence since the image was not analyzed.\n\n${contextInfo ? `Context:\n${contextInfo}\n` : ''}File: ${opts.fileName}\n\n${ALT_TEXT_JSON_SHAPE}`;
92
+ return { system: ALT_TEXT_SYSTEM_PROMPT, prompt };
93
+ }
94
+ function toResult(parsed, usedVision) {
95
+ const isDecorative = parsed.isDecorative === true;
96
+ const altText = normalizeGeneratedAltText(parsed.altText ?? '', isDecorative);
97
+ const rawConfidence = clampConfidence(parsed.confidence, usedVision ? DEFAULT_VISION_CONFIDENCE : DEFAULT_TEXT_CONFIDENCE);
98
+ const alternatives = isDecorative
99
+ ? []
100
+ : (parsed.alternatives ?? [])
101
+ .map((a) => normalizeGeneratedAltText(a, false))
102
+ .filter(Boolean)
103
+ .slice(0, MAX_ALTERNATIVES);
104
+ return {
105
+ altText,
106
+ isDecorative,
107
+ confidence: isDecorative
108
+ ? 1
109
+ : usedVision
110
+ ? rawConfidence
111
+ : Math.min(rawConfidence, HEURISTIC_MAX_CONFIDENCE),
112
+ alternatives,
113
+ usedVision,
114
+ };
115
+ }
116
+ const DECORATIVE_RESULT = {
117
+ altText: '',
118
+ isDecorative: true,
119
+ confidence: 1,
120
+ alternatives: [],
121
+ usedVision: false,
122
+ };
123
+ /**
124
+ * Governed alt-text generation. Tries the vision path when image bytes are
125
+ * available; if the resolved model is catalogued without `vision`
126
+ * (`unsupported_input`) it reruns text-only with confidence capped at
127
+ * {@link HEURISTIC_MAX_CONFIDENCE}. Every other runtime refusal propagates.
128
+ * A `decorative` purpose short-circuits with no model call.
129
+ */
130
+ export async function generateAltText(db, args) {
131
+ if (args.context.purpose === 'decorative')
132
+ return { ...DECORATIVE_RESULT };
133
+ const fileName = fileNameFromUrl(args.imageUrl);
134
+ const common = {
135
+ maxTokens: ALT_TEXT_MAX_TOKENS,
136
+ temperature: ALT_TEXT_TEMPERATURE,
137
+ userId: args.userId,
138
+ fetchImpl: args.fetchImpl,
139
+ schema: AltTextSchema,
140
+ };
141
+ if (args.image) {
142
+ const vision = buildAltTextPrompt(args.context, { vision: true, fileName });
143
+ const r = await generateJsonForFeature(db, ALT_TEXT_FEATURE, {
144
+ ...common,
145
+ ...vision,
146
+ images: [args.image],
147
+ });
148
+ if (r.ok)
149
+ return toResult(r.value, true);
150
+ if (r.code !== 'unsupported_input')
151
+ return r;
152
+ // Non-vision model: the runtime refused before any network call, so the
153
+ // text-only rerun below is the only metered call.
154
+ }
155
+ const text = buildAltTextPrompt(args.context, { vision: false, fileName });
156
+ const r = await generateJsonForFeature(db, ALT_TEXT_FEATURE, { ...common, ...text });
157
+ if (!r.ok)
158
+ return r;
159
+ return toResult(r.value, false);
160
+ }
161
+ /** Last path segment (query/hash stripped) so the heuristic sees `hero.webp`, not a signed URL. */
162
+ function fileNameFromUrl(url) {
163
+ try {
164
+ const path = new URL(url).pathname;
165
+ return decodeURIComponent(path.split('/').pop() ?? '') || url;
166
+ }
167
+ catch {
168
+ return url.split(/[?#]/)[0]?.split('/').pop() || url;
169
+ }
170
+ }
171
+ //# sourceMappingURL=alt-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alt-text.js","sourceRoot":"","sources":["../../../src/ai/tasks/alt-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Provider-free prompt + coercion for whole-document generation. Moved from
3
+ * `@prenta/plugin-ai` (`writing/content-generator.ts`) in Spec B; the model
4
+ * call runs through `generateJsonForFeature` under the
5
+ * `ai.features.documentGeneration` feature (toggle, daily cap, budget, brand
6
+ * voice, usage metering), so this module never touches a provider.
7
+ *
8
+ * Given a prompt + a minimal collection schema (slug, labels, fields) it
9
+ * builds the system/user prompts that ask the model for JSON matching the
10
+ * field names and types, and coerces the validated reply into field data
11
+ * ready for `createDocument`.
12
+ *
13
+ * Intentionally pragmatic — it does *not* invent a page `data.sections`
14
+ * list. Author pages with `add_page_section` or `createDocument` using
15
+ * `data.sections`. This is for non-page collections (blog posts, case
16
+ * studies, services, locations, team members, …) with structured field data.
17
+ */
18
+ import { z } from 'zod';
19
+ import type { CollectionDefinition, FieldDefinition } from '../../config/types.js';
20
+ export declare const DOCUMENT_GENERATION_FEATURE = "ai.features.documentGeneration";
21
+ /** Default output cap — enough for ~2000-word posts. */
22
+ export declare const DOCUMENT_GENERATION_MAX_TOKENS = 3000;
23
+ /**
24
+ * Minimal field shape the prompt builder and coercer understand. A structural
25
+ * subset of core's `FieldDefinition` — see {@link toFieldShape}.
26
+ */
27
+ export interface FieldShape {
28
+ type: string;
29
+ label?: string;
30
+ required?: boolean;
31
+ maxLength?: number;
32
+ options?: Array<{
33
+ label: string;
34
+ value: string;
35
+ }>;
36
+ min?: number;
37
+ max?: number;
38
+ step?: number;
39
+ fields?: Record<string, FieldShape>;
40
+ admin?: {
41
+ description?: string;
42
+ };
43
+ features?: string[];
44
+ }
45
+ export interface CollectionShape {
46
+ slug: string;
47
+ labels: {
48
+ singular: string;
49
+ plural: string;
50
+ };
51
+ type?: 'page' | 'post';
52
+ fields: Record<string, FieldShape>;
53
+ seo?: {
54
+ defaultSchemaType?: string;
55
+ };
56
+ }
57
+ export interface DocumentGenerationInput {
58
+ prompt: string;
59
+ collection: CollectionShape;
60
+ /** Existing site content the model can reference for voice / facts (fenced as untrusted). */
61
+ existingContent?: string;
62
+ /** Audience description (`"small business owners"`). */
63
+ targetAudience?: string;
64
+ /** Free-form tone modifier ("conversational", "expert", "playful"). */
65
+ tone?: string;
66
+ }
67
+ export interface CoercedDocument {
68
+ /** Field data ready to merge into a `data` payload. */
69
+ data: Record<string, unknown>;
70
+ /** Suggested document title (also used as the doc record's `title` column). */
71
+ title: string;
72
+ /** URL-safe slug derived from the title unless the model supplied one. */
73
+ slug: string;
74
+ /** SEO bundle extracted from the output (or synthesized). */
75
+ seo: {
76
+ metaTitle?: string;
77
+ metaDescription?: string;
78
+ schemaType?: string;
79
+ };
80
+ }
81
+ /** Any JSON object; field-level coercion happens in {@link coerceDocument}. */
82
+ export declare const DocumentDraftSchema: z.ZodType<Record<string, unknown>>;
83
+ /**
84
+ * Project a core `FieldDefinition` onto {@link FieldShape}. Only the
85
+ * prompt-relevant, serializable subset is carried (no validators, hooks,
86
+ * access functions, or admin conditions), so the shape stays safe to log and
87
+ * cheap to describe to the model.
88
+ */
89
+ export declare function toFieldShape(field: FieldDefinition): FieldShape;
90
+ /** Project a core `CollectionDefinition` onto {@link CollectionShape}. */
91
+ export declare function toCollectionShape(collection: CollectionDefinition): CollectionShape;
92
+ export declare function buildDocumentPrompt(input: DocumentGenerationInput): {
93
+ system: string;
94
+ prompt: string;
95
+ };
96
+ /**
97
+ * Coerce a schema-validated model reply into persisted field data plus the
98
+ * derived title / slug / SEO bundle. Unknown keys (anything the collection
99
+ * doesn't declare) are dropped to keep persisted data clean.
100
+ */
101
+ export declare function coerceDocument(parsed: Record<string, unknown>, collection: CollectionShape): CoercedDocument;
102
+ //# sourceMappingURL=document-generation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-generation.d.ts","sourceRoot":"","sources":["../../../src/ai/tasks/document-generation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGlF,eAAO,MAAM,2BAA2B,mCAAmC,CAAA;AAC3E,wDAAwD;AACxD,eAAO,MAAM,8BAA8B,OAAO,CAAA;AAkBlD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IACnC,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAClC,GAAG,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACrC;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,eAAe,CAAA;IAC3B,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,GAAG,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3E;AAED,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI/D,CAAA;AAIJ;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CA4C/D;AAED,0EAA0E;AAC1E,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,oBAAoB,GAAG,eAAe,CAanF;AAoFD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,CASA;AAkFD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,UAAU,EAAE,eAAe,GAC1B,eAAe,CA+BjB"}
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Provider-free prompt + coercion for whole-document generation. Moved from
3
+ * `@prenta/plugin-ai` (`writing/content-generator.ts`) in Spec B; the model
4
+ * call runs through `generateJsonForFeature` under the
5
+ * `ai.features.documentGeneration` feature (toggle, daily cap, budget, brand
6
+ * voice, usage metering), so this module never touches a provider.
7
+ *
8
+ * Given a prompt + a minimal collection schema (slug, labels, fields) it
9
+ * builds the system/user prompts that ask the model for JSON matching the
10
+ * field names and types, and coerces the validated reply into field data
11
+ * ready for `createDocument`.
12
+ *
13
+ * Intentionally pragmatic — it does *not* invent a page `data.sections`
14
+ * list. Author pages with `add_page_section` or `createDocument` using
15
+ * `data.sections`. This is for non-page collections (blog posts, case
16
+ * studies, services, locations, team members, …) with structured field data.
17
+ */
18
+ import { z } from 'zod';
19
+ import { clampAiContent, fenceUntrusted } from '../prompt-safety.js';
20
+ export const DOCUMENT_GENERATION_FEATURE = 'ai.features.documentGeneration';
21
+ /** Default output cap — enough for ~2000-word posts. */
22
+ export const DOCUMENT_GENERATION_MAX_TOKENS = 3000;
23
+ /** Reference material is clamped before fencing so it cannot dominate the prompt. */
24
+ const EXISTING_CONTENT_MAX_CHARS = 2000;
25
+ /** Caller-supplied modifiers land in the *system* prompt: clamp and keep to one line. */
26
+ const MODIFIER_MAX_CHARS = 200;
27
+ /**
28
+ * Sanitize a free-form modifier (`tone`, `targetAudience`) before it becomes a
29
+ * system-prompt rule: clamp, collapse every line break / whitespace run to one
30
+ * space so the caller cannot inject additional `- Rule` lines, and trim.
31
+ * Returns `undefined` for blank input so the rule line is omitted.
32
+ */
33
+ function systemPromptModifier(value) {
34
+ if (!value)
35
+ return undefined;
36
+ const flat = clampAiContent(value, MODIFIER_MAX_CHARS).replace(/\s+/g, ' ').trim();
37
+ return flat || undefined;
38
+ }
39
+ /** Any JSON object; field-level coercion happens in {@link coerceDocument}. */
40
+ export const DocumentDraftSchema = z
41
+ .record(z.string(), z.unknown())
42
+ .refine((v) => v !== null && typeof v === 'object' && !Array.isArray(v), {
43
+ message: 'expected a JSON object',
44
+ });
45
+ // ─── Core type adapters ───────────────────────────────────────────────────
46
+ /**
47
+ * Project a core `FieldDefinition` onto {@link FieldShape}. Only the
48
+ * prompt-relevant, serializable subset is carried (no validators, hooks,
49
+ * access functions, or admin conditions), so the shape stays safe to log and
50
+ * cheap to describe to the model.
51
+ */
52
+ export function toFieldShape(field) {
53
+ const shape = { type: field.type };
54
+ if (field.label)
55
+ shape.label = field.label;
56
+ if (field.required)
57
+ shape.required = true;
58
+ if (field.admin?.description)
59
+ shape.admin = { description: field.admin.description };
60
+ switch (field.type) {
61
+ case 'text':
62
+ if (typeof field.maxLength === 'number')
63
+ shape.maxLength = field.maxLength;
64
+ break;
65
+ case 'number':
66
+ if (typeof field.min === 'number')
67
+ shape.min = field.min;
68
+ if (typeof field.max === 'number')
69
+ shape.max = field.max;
70
+ if (typeof field.step === 'number')
71
+ shape.step = field.step;
72
+ break;
73
+ case 'select':
74
+ shape.options = field.options.map((o) => ({ label: o.label, value: o.value }));
75
+ break;
76
+ case 'richText':
77
+ if (field.features)
78
+ shape.features = [...field.features];
79
+ break;
80
+ case 'array':
81
+ shape.fields = Object.fromEntries(Object.entries(field.fields).map(([name, sub]) => [name, toFieldShape(sub)]));
82
+ break;
83
+ case 'boolean':
84
+ case 'date':
85
+ case 'slug':
86
+ case 'relationship':
87
+ case 'media':
88
+ case 'json':
89
+ case 'nav':
90
+ case 'color':
91
+ case 'url':
92
+ case 'email':
93
+ case 'blocks':
94
+ case 'componentBlock':
95
+ break;
96
+ default: {
97
+ const _exhaustive = field;
98
+ return _exhaustive;
99
+ }
100
+ }
101
+ return shape;
102
+ }
103
+ /** Project a core `CollectionDefinition` onto {@link CollectionShape}. */
104
+ export function toCollectionShape(collection) {
105
+ const shape = {
106
+ slug: collection.slug,
107
+ labels: collection.labels,
108
+ fields: Object.fromEntries(Object.entries(collection.fields).map(([name, f]) => [name, toFieldShape(f)])),
109
+ };
110
+ if (collection.type)
111
+ shape.type = collection.type;
112
+ if (collection.seo?.defaultSchemaType) {
113
+ shape.seo = { defaultSchemaType: collection.seo.defaultSchemaType };
114
+ }
115
+ return shape;
116
+ }
117
+ // ─── Prompt construction ──────────────────────────────────────────────────
118
+ function describeField(name, field) {
119
+ const parts = [` "${name}"`];
120
+ parts.push(`(${field.type}${field.required ? ', required' : ''})`);
121
+ if (field.label && field.label !== name)
122
+ parts.push(`label: ${field.label}`);
123
+ if (field.maxLength)
124
+ parts.push(`max ${field.maxLength} chars`);
125
+ if (typeof field.min === 'number' || typeof field.max === 'number') {
126
+ parts.push(`range ${field.min ?? '∞'}…${field.max ?? '∞'}`);
127
+ }
128
+ if (field.options && field.options.length) {
129
+ parts.push(`one of: ${field.options.map((o) => o.value).join(', ')}`);
130
+ }
131
+ if (field.type === 'array' && field.fields) {
132
+ const subFields = Object.entries(field.fields)
133
+ .map(([n, f]) => `${n}:${f.type}`)
134
+ .join(', ');
135
+ parts.push(`array of { ${subFields} }`);
136
+ }
137
+ if (field.admin?.description) {
138
+ parts.push(`— ${field.admin.description}`);
139
+ }
140
+ return parts.join(' ');
141
+ }
142
+ function buildSystemPrompt(collection, tone, targetAudience) {
143
+ const lines = [
144
+ `You are an expert content writer creating a "${collection.labels.singular}" document for a CMS.`,
145
+ 'You generate valid JSON matching the requested field schema. NEVER include markdown, code fences, or commentary.',
146
+ '',
147
+ 'Rules:',
148
+ '- Output a single JSON object whose top-level keys exactly match the field names below.',
149
+ '- Match field types: text/richText/email/url are strings; number is a number; boolean is a boolean; date is an ISO-8601 string; array is a JSON array of objects; select must use one of the listed option values; media fields should be left as null (a human will upload the asset).',
150
+ '- Respect maxLength constraints. Quality over quantity — never pad.',
151
+ '- For slug fields, generate a URL-safe lowercase string with words joined by hyphens.',
152
+ '- For richText fields, return well-structured prose with paragraph breaks, but no HTML tags.',
153
+ '- For seo fields (metaTitle, metaDescription) compose SEO-optimised copy distinct from the page title.',
154
+ "- Never invent facts. If you don't know something the prompt didn't supply, leave the field blank or null.",
155
+ ];
156
+ if (collection.seo?.defaultSchemaType) {
157
+ lines.push(`- This collection maps to Schema.org "${collection.seo.defaultSchemaType}".`);
158
+ }
159
+ if (tone)
160
+ lines.push(`- Tone: ${tone}.`);
161
+ if (targetAudience)
162
+ lines.push(`- Audience: ${targetAudience}.`);
163
+ return lines.join('\n');
164
+ }
165
+ function buildUserPrompt(input) {
166
+ const { collection, prompt, existingContent } = input;
167
+ const fieldDescriptions = Object.entries(collection.fields)
168
+ // Media is supplied by the human reviewer.
169
+ // Relations are excluded because the LLM has no view of existing
170
+ // document IDs — guessing would create dangling references that the
171
+ // validator would then reject. Humans / orchestration code wire those
172
+ // in after creation.
173
+ .filter(([, f]) => f.type !== 'media' && f.type !== 'relationship')
174
+ .map(([name, field]) => describeField(name, field))
175
+ .join('\n');
176
+ const lines = [
177
+ `Create a ${collection.labels.singular} matching this brief:`,
178
+ '',
179
+ prompt.trim(),
180
+ '',
181
+ 'Field schema:',
182
+ fieldDescriptions,
183
+ '',
184
+ 'Output ONLY a JSON object with the field values. No prose. No markdown fences.',
185
+ ];
186
+ if (existingContent) {
187
+ lines.push('', 'Existing related content for voice / fact reference:');
188
+ // Untrusted reference content — fence it so an injected instruction inside
189
+ // a referenced document can't redirect the generation.
190
+ lines.push(fenceUntrusted(existingContent, EXISTING_CONTENT_MAX_CHARS));
191
+ }
192
+ return lines.join('\n');
193
+ }
194
+ export function buildDocumentPrompt(input) {
195
+ return {
196
+ system: buildSystemPrompt(input.collection, systemPromptModifier(input.tone), systemPromptModifier(input.targetAudience)),
197
+ prompt: buildUserPrompt(input),
198
+ };
199
+ }
200
+ // ─── Output coercion ──────────────────────────────────────────────────────
201
+ function slugify(title) {
202
+ return (title
203
+ .toLowerCase()
204
+ .replace(/[^a-z0-9]+/g, '-')
205
+ .replace(/^-+|-+$/g, '')
206
+ .slice(0, 80) || 'untitled');
207
+ }
208
+ /**
209
+ * Coerce the LLM output into shapes that match each field's declared type.
210
+ * The LLM occasionally returns numbers as strings, booleans as "true"/"false",
211
+ * etc. We don't try to recover unrecoverable values — we leave bad fields
212
+ * `undefined` so the downstream field validator surfaces the error to the
213
+ * caller instead of silently persisting garbage.
214
+ */
215
+ function coerceFieldValue(value, field) {
216
+ if (value === null || value === undefined)
217
+ return value;
218
+ switch (field.type) {
219
+ case 'text':
220
+ case 'richText':
221
+ case 'email':
222
+ case 'url':
223
+ case 'slug':
224
+ case 'color':
225
+ return typeof value === 'string' ? value : String(value);
226
+ case 'number':
227
+ if (typeof value === 'number')
228
+ return value;
229
+ if (typeof value === 'string') {
230
+ const n = Number(value);
231
+ return Number.isFinite(n) ? n : undefined;
232
+ }
233
+ return undefined;
234
+ case 'boolean':
235
+ if (typeof value === 'boolean')
236
+ return value;
237
+ if (value === 'true')
238
+ return true;
239
+ if (value === 'false')
240
+ return false;
241
+ return undefined;
242
+ case 'date':
243
+ if (value instanceof Date)
244
+ return value.toISOString();
245
+ if (typeof value === 'string') {
246
+ const d = new Date(value);
247
+ return isNaN(d.getTime()) ? undefined : d.toISOString();
248
+ }
249
+ return undefined;
250
+ case 'select':
251
+ if (typeof value === 'string' && field.options?.some((o) => o.value === value))
252
+ return value;
253
+ return undefined;
254
+ case 'array':
255
+ if (!Array.isArray(value))
256
+ return [];
257
+ if (!field.fields)
258
+ return value;
259
+ return value.map((item) => {
260
+ if (item === null || typeof item !== 'object')
261
+ return item;
262
+ const obj = item;
263
+ const coerced = {};
264
+ for (const [name, sub] of Object.entries(field.fields)) {
265
+ if (obj[name] !== undefined)
266
+ coerced[name] = coerceFieldValue(obj[name], sub);
267
+ }
268
+ return coerced;
269
+ });
270
+ case 'json':
271
+ return value;
272
+ case 'media':
273
+ // The LLM doesn't have asset IDs. Leave for a human to fill.
274
+ return null;
275
+ case 'relationship':
276
+ // Same rationale as media — IDs are out-of-band knowledge. If the
277
+ // model did emit something (e.g. echoed an ID from the prompt) we
278
+ // accept strings and string arrays verbatim; otherwise drop.
279
+ if (typeof value === 'string')
280
+ return value;
281
+ if (Array.isArray(value))
282
+ return value.filter((v) => typeof v === 'string');
283
+ return undefined;
284
+ default:
285
+ return value;
286
+ }
287
+ }
288
+ /**
289
+ * Coerce a schema-validated model reply into persisted field data plus the
290
+ * derived title / slug / SEO bundle. Unknown keys (anything the collection
291
+ * doesn't declare) are dropped to keep persisted data clean.
292
+ */
293
+ export function coerceDocument(parsed, collection) {
294
+ const data = {};
295
+ for (const [name, field] of Object.entries(collection.fields)) {
296
+ const raw = parsed[name];
297
+ if (raw === undefined)
298
+ continue;
299
+ const coerced = coerceFieldValue(raw, field);
300
+ if (coerced !== undefined)
301
+ data[name] = coerced;
302
+ }
303
+ // Derive title + slug.
304
+ const title = (typeof data.title === 'string' && data.title) ||
305
+ (typeof data.question === 'string' && data.question) ||
306
+ (typeof data.name === 'string' && data.name) ||
307
+ 'Untitled';
308
+ const slug = (typeof data.slug === 'string' && data.slug.trim()) || slugify(title);
309
+ data.slug = slug;
310
+ const seo = {
311
+ metaTitle: (typeof data.metaTitle === 'string' && data.metaTitle) ||
312
+ (typeof parsed.metaTitle === 'string' && parsed.metaTitle) ||
313
+ title,
314
+ metaDescription: (typeof data.metaDescription === 'string' && data.metaDescription) ||
315
+ (typeof parsed.metaDescription === 'string' && parsed.metaDescription) ||
316
+ undefined,
317
+ schemaType: collection.seo?.defaultSchemaType,
318
+ };
319
+ return { data, title, slug, seo };
320
+ }
321
+ //# sourceMappingURL=document-generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-generation.js","sourceRoot":"","sources":["../../../src/ai/tasks/document-generation.ts"],"names":[],"mappings":"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"}