@prenta/core 6.0.0 → 7.1.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 (441) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/ai/brand-voice-analyze.d.ts +1 -4
  3. package/dist/ai/brand-voice-analyze.d.ts.map +1 -1
  4. package/dist/ai/brand-voice-analyze.js +1 -2
  5. package/dist/ai/brand-voice-analyze.js.map +1 -1
  6. package/dist/ai/brand-voice-sources.d.ts +0 -2
  7. package/dist/ai/brand-voice-sources.d.ts.map +1 -1
  8. package/dist/ai/brand-voice-sources.js +2 -2
  9. package/dist/ai/brand-voice-sources.js.map +1 -1
  10. package/dist/ai/brand-voice-structured.d.ts +6 -6
  11. package/dist/ai/brand-voice-structured.d.ts.map +1 -1
  12. package/dist/ai/catalog.d.ts +8 -0
  13. package/dist/ai/catalog.d.ts.map +1 -1
  14. package/dist/ai/catalog.js +22 -0
  15. package/dist/ai/catalog.js.map +1 -1
  16. package/dist/ai/config-store.d.ts +18 -4
  17. package/dist/ai/config-store.d.ts.map +1 -1
  18. package/dist/ai/config-store.js +115 -20
  19. package/dist/ai/config-store.js.map +1 -1
  20. package/dist/ai/content-writing-generate.d.ts +10 -8
  21. package/dist/ai/content-writing-generate.d.ts.map +1 -1
  22. package/dist/ai/content-writing-generate.js +24 -56
  23. package/dist/ai/content-writing-generate.js.map +1 -1
  24. package/dist/ai/embeddings.d.ts +28 -0
  25. package/dist/ai/embeddings.d.ts.map +1 -0
  26. package/dist/ai/embeddings.js +36 -0
  27. package/dist/ai/embeddings.js.map +1 -0
  28. package/dist/ai/feature-defaults.d.ts +3 -3
  29. package/dist/ai/feature-defaults.d.ts.map +1 -1
  30. package/dist/ai/feature-defaults.js +24 -14
  31. package/dist/ai/feature-defaults.js.map +1 -1
  32. package/dist/ai/index.d.ts +15 -16
  33. package/dist/ai/index.d.ts.map +1 -1
  34. package/dist/ai/index.js +14 -15
  35. package/dist/ai/index.js.map +1 -1
  36. package/dist/ai/models.d.ts +7 -3
  37. package/dist/ai/models.d.ts.map +1 -1
  38. package/dist/ai/models.js +10 -5
  39. package/dist/ai/models.js.map +1 -1
  40. package/dist/ai/plugin-errors.d.ts +9 -3
  41. package/dist/ai/plugin-errors.d.ts.map +1 -1
  42. package/dist/ai/plugin-errors.js +9 -3
  43. package/dist/ai/plugin-errors.js.map +1 -1
  44. package/dist/ai/plugin-import.d.ts +9 -1
  45. package/dist/ai/plugin-import.d.ts.map +1 -1
  46. package/dist/ai/plugin-import.js +9 -1
  47. package/dist/ai/plugin-import.js.map +1 -1
  48. package/dist/ai/prompt-safety.d.ts +23 -0
  49. package/dist/ai/prompt-safety.d.ts.map +1 -0
  50. package/dist/ai/prompt-safety.js +34 -0
  51. package/dist/ai/prompt-safety.js.map +1 -0
  52. package/dist/ai/providers/anthropic.d.ts.map +1 -1
  53. package/dist/ai/providers/anthropic.js +16 -1
  54. package/dist/ai/providers/anthropic.js.map +1 -1
  55. package/dist/ai/providers/http.d.ts +7 -2
  56. package/dist/ai/providers/http.d.ts.map +1 -1
  57. package/dist/ai/providers/http.js +13 -2
  58. package/dist/ai/providers/http.js.map +1 -1
  59. package/dist/ai/providers/index.d.ts +0 -7
  60. package/dist/ai/providers/index.d.ts.map +1 -1
  61. package/dist/ai/providers/index.js +1 -1
  62. package/dist/ai/providers/index.js.map +1 -1
  63. package/dist/ai/resolve.d.ts +7 -1
  64. package/dist/ai/resolve.d.ts.map +1 -1
  65. package/dist/ai/resolve.js +36 -3
  66. package/dist/ai/resolve.js.map +1 -1
  67. package/dist/ai/runtime-response.d.ts +27 -0
  68. package/dist/ai/runtime-response.d.ts.map +1 -0
  69. package/dist/ai/runtime-response.js +75 -0
  70. package/dist/ai/runtime-response.js.map +1 -0
  71. package/dist/ai/runtime.d.ts +9 -7
  72. package/dist/ai/runtime.d.ts.map +1 -1
  73. package/dist/ai/runtime.js +14 -19
  74. package/dist/ai/runtime.js.map +1 -1
  75. package/dist/ai/tasks/alt-text.d.ts +82 -0
  76. package/dist/ai/tasks/alt-text.d.ts.map +1 -0
  77. package/dist/ai/tasks/alt-text.js +171 -0
  78. package/dist/ai/tasks/alt-text.js.map +1 -0
  79. package/dist/ai/tasks/document-generation.d.ts +102 -0
  80. package/dist/ai/tasks/document-generation.d.ts.map +1 -0
  81. package/dist/ai/tasks/document-generation.js +321 -0
  82. package/dist/ai/tasks/document-generation.js.map +1 -0
  83. package/dist/ai/tasks/link-embeddings.d.ts +55 -0
  84. package/dist/ai/tasks/link-embeddings.d.ts.map +1 -0
  85. package/dist/ai/tasks/link-embeddings.js +160 -0
  86. package/dist/ai/tasks/link-embeddings.js.map +1 -0
  87. package/dist/ai/types.d.ts +15 -19
  88. package/dist/ai/types.d.ts.map +1 -1
  89. package/dist/ai/types.js +6 -7
  90. package/dist/ai/types.js.map +1 -1
  91. package/dist/ai/usage.d.ts +6 -4
  92. package/dist/ai/usage.d.ts.map +1 -1
  93. package/dist/ai/usage.js +6 -4
  94. package/dist/ai/usage.js.map +1 -1
  95. package/dist/ai/vector.d.ts +8 -0
  96. package/dist/ai/vector.d.ts.map +1 -0
  97. package/dist/ai/vector.js +24 -0
  98. package/dist/ai/vector.js.map +1 -0
  99. package/dist/api/responses.d.ts +1 -1
  100. package/dist/api/responses.d.ts.map +1 -1
  101. package/dist/api/responses.js +1 -1
  102. package/dist/api/responses.js.map +1 -1
  103. package/dist/api/route-helpers.d.ts +2 -19
  104. package/dist/api/route-helpers.d.ts.map +1 -1
  105. package/dist/api/route-helpers.js +11 -22
  106. package/dist/api/route-helpers.js.map +1 -1
  107. package/dist/api/routes/ai-authoring.d.ts.map +1 -1
  108. package/dist/api/routes/ai-authoring.js +132 -144
  109. package/dist/api/routes/ai-authoring.js.map +1 -1
  110. package/dist/api/routes/ai-seo.d.ts.map +1 -1
  111. package/dist/api/routes/ai-seo.js +44 -120
  112. package/dist/api/routes/ai-seo.js.map +1 -1
  113. package/dist/api/routes/ai-settings.d.ts.map +1 -1
  114. package/dist/api/routes/ai-settings.js +76 -28
  115. package/dist/api/routes/ai-settings.js.map +1 -1
  116. package/dist/api/routes/security-center.d.ts.map +1 -1
  117. package/dist/api/routes/security-center.js +5 -39
  118. package/dist/api/routes/security-center.js.map +1 -1
  119. package/dist/api/routes/seo-public.d.ts +7 -5
  120. package/dist/api/routes/seo-public.d.ts.map +1 -1
  121. package/dist/api/routes/seo-public.js +16 -1
  122. package/dist/api/routes/seo-public.js.map +1 -1
  123. package/dist/api/routes/seo.d.ts.map +1 -1
  124. package/dist/api/routes/seo.js +11 -10
  125. package/dist/api/routes/seo.js.map +1 -1
  126. package/dist/api/routes/url-resolution.d.ts.map +1 -1
  127. package/dist/api/routes/url-resolution.js +2 -1
  128. package/dist/api/routes/url-resolution.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/collections/presets.d.ts +21 -3
  158. package/dist/collections/presets.d.ts.map +1 -1
  159. package/dist/collections/presets.js +64 -12
  160. package/dist/collections/presets.js.map +1 -1
  161. package/dist/config/types.d.ts +26 -19
  162. package/dist/config/types.d.ts.map +1 -1
  163. package/dist/content/index.d.ts +2 -3
  164. package/dist/content/index.d.ts.map +1 -1
  165. package/dist/content/index.js +1 -2
  166. package/dist/content/index.js.map +1 -1
  167. package/dist/content/structured-data.d.ts +0 -14
  168. package/dist/content/structured-data.d.ts.map +1 -1
  169. package/dist/content/structured-data.js +3 -14
  170. package/dist/content/structured-data.js.map +1 -1
  171. package/dist/cron/index.d.ts +2 -3
  172. package/dist/cron/index.d.ts.map +1 -1
  173. package/dist/cron/index.js +0 -2
  174. package/dist/cron/index.js.map +1 -1
  175. package/dist/db/client-types.d.ts +2 -1
  176. package/dist/db/client-types.d.ts.map +1 -1
  177. package/dist/db.d.ts +0 -2
  178. package/dist/db.d.ts.map +1 -1
  179. package/dist/db.js +0 -1
  180. package/dist/db.js.map +1 -1
  181. package/dist/diagnostics/env.d.ts +1 -1
  182. package/dist/diagnostics/env.d.ts.map +1 -1
  183. package/dist/diagnostics/logger.d.ts +0 -24
  184. package/dist/diagnostics/logger.d.ts.map +1 -1
  185. package/dist/fields/presets.d.ts +7 -0
  186. package/dist/fields/presets.d.ts.map +1 -1
  187. package/dist/fields/presets.js +17 -0
  188. package/dist/fields/presets.js.map +1 -1
  189. package/dist/forms/entries.d.ts +0 -7
  190. package/dist/forms/entries.d.ts.map +1 -1
  191. package/dist/forms/entries.js +1 -19
  192. package/dist/forms/entries.js.map +1 -1
  193. package/dist/forms/files.d.ts +1 -1
  194. package/dist/forms/files.d.ts.map +1 -1
  195. package/dist/forms/index.d.ts +4 -6
  196. package/dist/forms/index.d.ts.map +1 -1
  197. package/dist/forms/index.js +3 -5
  198. package/dist/forms/index.js.map +1 -1
  199. package/dist/forms/prefetch.d.ts +0 -6
  200. package/dist/forms/prefetch.d.ts.map +1 -1
  201. package/dist/forms/service.d.ts +0 -4
  202. package/dist/forms/service.d.ts.map +1 -1
  203. package/dist/forms/service.js +2 -8
  204. package/dist/forms/service.js.map +1 -1
  205. package/dist/forms/webmcp.d.ts +0 -2
  206. package/dist/forms/webmcp.d.ts.map +1 -1
  207. package/dist/forms/webmcp.js +1 -1
  208. package/dist/forms/webmcp.js.map +1 -1
  209. package/dist/media/denormalize.d.ts +0 -7
  210. package/dist/media/denormalize.d.ts.map +1 -1
  211. package/dist/media/index.d.ts +0 -8
  212. package/dist/media/index.d.ts.map +1 -1
  213. package/dist/media/index.js +0 -5
  214. package/dist/media/index.js.map +1 -1
  215. package/dist/media/optimize.d.ts +0 -4
  216. package/dist/media/optimize.d.ts.map +1 -1
  217. package/dist/media/optimize.js +4 -4
  218. package/dist/media/optimize.js.map +1 -1
  219. package/dist/media/reoptimize.d.ts +2 -3
  220. package/dist/media/reoptimize.d.ts.map +1 -1
  221. package/dist/media/reoptimize.js +2 -2
  222. package/dist/media/reoptimize.js.map +1 -1
  223. package/dist/media/seo.d.ts +3 -8
  224. package/dist/media/seo.d.ts.map +1 -1
  225. package/dist/media/seo.js +1 -1
  226. package/dist/media/seo.js.map +1 -1
  227. package/dist/plan/features.d.ts +0 -1
  228. package/dist/plan/features.d.ts.map +1 -1
  229. package/dist/plan/features.js +0 -16
  230. package/dist/plan/features.js.map +1 -1
  231. package/dist/preview/event-bus.d.ts +2 -1
  232. package/dist/preview/event-bus.d.ts.map +1 -1
  233. package/dist/preview/index.d.ts +2 -1
  234. package/dist/preview/index.d.ts.map +1 -1
  235. package/dist/preview/sse-stream.d.ts +0 -13
  236. package/dist/preview/sse-stream.d.ts.map +1 -1
  237. package/dist/preview/sse-stream.js +2 -2
  238. package/dist/preview/sse-stream.js.map +1 -1
  239. package/dist/realtime/notifications.d.ts +4 -3
  240. package/dist/realtime/notifications.d.ts.map +1 -1
  241. package/dist/redirects/index.d.ts +4 -16
  242. package/dist/redirects/index.d.ts.map +1 -1
  243. package/dist/redirects/index.js +2 -9
  244. package/dist/redirects/index.js.map +1 -1
  245. package/dist/redirects/match.d.ts +0 -2
  246. package/dist/redirects/match.d.ts.map +1 -1
  247. package/dist/redirects/match.js +1 -1
  248. package/dist/redirects/match.js.map +1 -1
  249. package/dist/redirects/recovery.d.ts +0 -2
  250. package/dist/redirects/recovery.d.ts.map +1 -1
  251. package/dist/redirects/recovery.js +1 -1
  252. package/dist/redirects/recovery.js.map +1 -1
  253. package/dist/redirects/rerank.d.ts +4 -3
  254. package/dist/redirects/rerank.d.ts.map +1 -1
  255. package/dist/redirects/rerank.js +3 -18
  256. package/dist/redirects/rerank.js.map +1 -1
  257. package/dist/sections/validate.d.ts +0 -2
  258. package/dist/sections/validate.d.ts.map +1 -1
  259. package/dist/sections/validate.js +1 -1
  260. package/dist/sections/validate.js.map +1 -1
  261. package/dist/security/access.d.ts +0 -9
  262. package/dist/security/access.d.ts.map +1 -1
  263. package/dist/security/access.js +1 -1
  264. package/dist/security/access.js.map +1 -1
  265. package/dist/security/audit.d.ts +0 -20
  266. package/dist/security/audit.d.ts.map +1 -1
  267. package/dist/security/audit.js.map +1 -1
  268. package/dist/security/index.d.ts +2 -20
  269. package/dist/security/index.d.ts.map +1 -1
  270. package/dist/security/index.js +2 -7
  271. package/dist/security/index.js.map +1 -1
  272. package/dist/security/internal-keys.d.ts +0 -10
  273. package/dist/security/internal-keys.d.ts.map +1 -1
  274. package/dist/security/internal-keys.js +2 -2
  275. package/dist/security/internal-keys.js.map +1 -1
  276. package/dist/security/rate-limit-policy.d.ts +0 -2
  277. package/dist/security/rate-limit-policy.d.ts.map +1 -1
  278. package/dist/security/rate-limit-policy.js +1 -1
  279. package/dist/security/rate-limit-policy.js.map +1 -1
  280. package/dist/security/rate-limit.d.ts +2 -5
  281. package/dist/security/rate-limit.d.ts.map +1 -1
  282. package/dist/security/rate-limit.js +2 -2
  283. package/dist/security/rate-limit.js.map +1 -1
  284. package/dist/security/sanitize.d.ts +0 -3
  285. package/dist/security/sanitize.d.ts.map +1 -1
  286. package/dist/security/sanitize.js +0 -1
  287. package/dist/security/sanitize.js.map +1 -1
  288. package/dist/security/upload.d.ts +0 -3
  289. package/dist/security/upload.d.ts.map +1 -1
  290. package/dist/security/upload.js +0 -1
  291. package/dist/security/upload.js.map +1 -1
  292. package/dist/seo/ai-crawler-log.d.ts +0 -2
  293. package/dist/seo/ai-crawler-log.d.ts.map +1 -1
  294. package/dist/seo/ai-crawler-log.js +1 -1
  295. package/dist/seo/ai-crawler-log.js.map +1 -1
  296. package/dist/seo/audit-engine.d.ts +5 -5
  297. package/dist/seo/audit-engine.d.ts.map +1 -1
  298. package/dist/seo/audit-engine.js +1 -2
  299. package/dist/seo/audit-engine.js.map +1 -1
  300. package/dist/seo/audit-runner.d.ts +0 -7
  301. package/dist/seo/audit-runner.d.ts.map +1 -1
  302. package/dist/seo/audit-runner.js +1 -1
  303. package/dist/seo/audit-runner.js.map +1 -1
  304. package/dist/seo/audit-signals.d.ts +0 -2
  305. package/dist/seo/audit-signals.d.ts.map +1 -1
  306. package/dist/seo/audit-signals.js +1 -1
  307. package/dist/seo/audit-signals.js.map +1 -1
  308. package/dist/seo/autopilot-gate.d.ts +0 -1
  309. package/dist/seo/autopilot-gate.d.ts.map +1 -1
  310. package/dist/seo/autopilot-gate.js +1 -1
  311. package/dist/seo/autopilot-gate.js.map +1 -1
  312. package/dist/seo/autopilot-ledger.d.ts +2 -1
  313. package/dist/seo/autopilot-ledger.d.ts.map +1 -1
  314. package/dist/seo/autopilot-outcome.d.ts +0 -2
  315. package/dist/seo/autopilot-outcome.d.ts.map +1 -1
  316. package/dist/seo/autopilot-outcome.js +1 -1
  317. package/dist/seo/autopilot-outcome.js.map +1 -1
  318. package/dist/seo/autopilot-policy.d.ts +3 -38
  319. package/dist/seo/autopilot-policy.d.ts.map +1 -1
  320. package/dist/seo/autopilot-policy.js +3 -3
  321. package/dist/seo/autopilot-policy.js.map +1 -1
  322. package/dist/seo/autopilot.d.ts +4 -12
  323. package/dist/seo/autopilot.d.ts.map +1 -1
  324. package/dist/seo/autopilot.js +3 -3
  325. package/dist/seo/autopilot.js.map +1 -1
  326. package/dist/seo/config-store.d.ts +0 -2
  327. package/dist/seo/config-store.d.ts.map +1 -1
  328. package/dist/seo/config-store.js +1 -1
  329. package/dist/seo/config-store.js.map +1 -1
  330. package/dist/seo/digest.d.ts +8 -7
  331. package/dist/seo/digest.d.ts.map +1 -1
  332. package/dist/seo/faq-signals.d.ts +0 -4
  333. package/dist/seo/faq-signals.d.ts.map +1 -1
  334. package/dist/seo/faq-signals.js +4 -4
  335. package/dist/seo/faq-signals.js.map +1 -1
  336. package/dist/seo/fix-brief-export.d.ts +0 -2
  337. package/dist/seo/fix-brief-export.d.ts.map +1 -1
  338. package/dist/seo/fix-brief-export.js +1 -1
  339. package/dist/seo/fix-brief-export.js.map +1 -1
  340. package/dist/seo/geo-record.d.ts +0 -4
  341. package/dist/seo/geo-record.d.ts.map +1 -1
  342. package/dist/seo/geo-record.js +2 -2
  343. package/dist/seo/geo-record.js.map +1 -1
  344. package/dist/seo/geo-report.d.ts +4 -3
  345. package/dist/seo/geo-report.d.ts.map +1 -1
  346. package/dist/seo/geo-report.js +1 -1
  347. package/dist/seo/geo-report.js.map +1 -1
  348. package/dist/seo/index-status.d.ts +6 -5
  349. package/dist/seo/index-status.d.ts.map +1 -1
  350. package/dist/seo/index-status.js.map +1 -1
  351. package/dist/seo/index.d.ts +15 -90
  352. package/dist/seo/index.d.ts.map +1 -1
  353. package/dist/seo/index.js +10 -49
  354. package/dist/seo/index.js.map +1 -1
  355. package/dist/seo/issue-batch-briefs.d.ts +2 -3
  356. package/dist/seo/issue-batch-briefs.d.ts.map +1 -1
  357. package/dist/seo/issue-batch-briefs.js +2 -2
  358. package/dist/seo/issue-batch-briefs.js.map +1 -1
  359. package/dist/seo/issue-content-brief.d.ts +2 -1
  360. package/dist/seo/issue-content-brief.d.ts.map +1 -1
  361. package/dist/seo/issue-content-research.d.ts +2 -2
  362. package/dist/seo/issue-content-research.d.ts.map +1 -1
  363. package/dist/seo/issue-content-research.js +1 -1
  364. package/dist/seo/issue-content-research.js.map +1 -1
  365. package/dist/seo/issue-fix-ai.d.ts +5 -4
  366. package/dist/seo/issue-fix-ai.d.ts.map +1 -1
  367. package/dist/seo/issue-fix-ai.js +4 -19
  368. package/dist/seo/issue-fix-ai.js.map +1 -1
  369. package/dist/seo/issue-fix-apply.d.ts +2 -11
  370. package/dist/seo/issue-fix-apply.d.ts.map +1 -1
  371. package/dist/seo/issue-fix-apply.js +4 -4
  372. package/dist/seo/issue-fix-apply.js.map +1 -1
  373. package/dist/seo/issue-fix-faq.d.ts +4 -7
  374. package/dist/seo/issue-fix-faq.d.ts.map +1 -1
  375. package/dist/seo/issue-fix-faq.js +4 -4
  376. package/dist/seo/issue-fix-faq.js.map +1 -1
  377. package/dist/seo/issue-fix-link-insert.d.ts +4 -14
  378. package/dist/seo/issue-fix-link-insert.d.ts.map +1 -1
  379. package/dist/seo/issue-fix-link-insert.js +5 -4
  380. package/dist/seo/issue-fix-link-insert.js.map +1 -1
  381. package/dist/seo/issue-fix-redirect.d.ts +0 -1
  382. package/dist/seo/issue-fix-redirect.d.ts.map +1 -1
  383. package/dist/seo/issue-fix.d.ts.map +1 -1
  384. package/dist/seo/issue-fix.js +1 -0
  385. package/dist/seo/issue-fix.js.map +1 -1
  386. package/dist/seo/link-graph.d.ts +2 -3
  387. package/dist/seo/link-graph.d.ts.map +1 -1
  388. package/dist/seo/link-graph.js +0 -0
  389. package/dist/seo/link-graph.js.map +1 -1
  390. package/dist/seo/link-suggest.d.ts +8 -2
  391. package/dist/seo/link-suggest.d.ts.map +1 -1
  392. package/dist/seo/link-suggest.js +38 -50
  393. package/dist/seo/link-suggest.js.map +1 -1
  394. package/dist/seo/page-meta.d.ts +15 -10
  395. package/dist/seo/page-meta.d.ts.map +1 -1
  396. package/dist/seo/page-meta.js +31 -9
  397. package/dist/seo/page-meta.js.map +1 -1
  398. package/dist/seo/proposals-bulk-apply.d.ts +3 -2
  399. package/dist/seo/proposals-bulk-apply.d.ts.map +1 -1
  400. package/dist/seo/proposals.d.ts +2 -2
  401. package/dist/seo/proposals.d.ts.map +1 -1
  402. package/dist/seo/rendered-fetch.d.ts +2 -1
  403. package/dist/seo/rendered-fetch.d.ts.map +1 -1
  404. package/dist/seo/score.d.ts +3 -7
  405. package/dist/seo/score.d.ts.map +1 -1
  406. package/dist/seo/score.js.map +1 -1
  407. package/dist/seo/search-console/client.d.ts +0 -4
  408. package/dist/seo/search-console/client.d.ts.map +1 -1
  409. package/dist/seo/search-console/client.js +2 -2
  410. package/dist/seo/search-console/client.js.map +1 -1
  411. package/dist/seo/search-console/sync.d.ts +0 -4
  412. package/dist/seo/search-console/sync.d.ts.map +1 -1
  413. package/dist/seo/search-console/sync.js +2 -2
  414. package/dist/seo/search-console/sync.js.map +1 -1
  415. package/dist/seo/search-console/types.d.ts +2 -1
  416. package/dist/seo/search-console/types.d.ts.map +1 -1
  417. package/dist/seo/sitemap-notify.d.ts +0 -8
  418. package/dist/seo/sitemap-notify.d.ts.map +1 -1
  419. package/dist/seo/sitemap-notify.js +1 -1
  420. package/dist/seo/sitemap-notify.js.map +1 -1
  421. package/dist/seo/title-templates.d.ts +2 -5
  422. package/dist/seo/title-templates.d.ts.map +1 -1
  423. package/dist/seo/title-templates.js +2 -2
  424. package/dist/seo/title-templates.js.map +1 -1
  425. package/dist/server-site.d.ts +0 -1
  426. package/dist/server-site.d.ts.map +1 -1
  427. package/dist/server-site.js +0 -1
  428. package/dist/server-site.js.map +1 -1
  429. package/dist/storage/index.d.ts +0 -2
  430. package/dist/storage/index.d.ts.map +1 -1
  431. package/dist/storage/index.js +0 -4
  432. package/dist/storage/index.js.map +1 -1
  433. package/dist/upgrade/version-check.d.ts +0 -2
  434. package/dist/upgrade/version-check.d.ts.map +1 -1
  435. package/dist/upgrade/version-check.js +1 -1
  436. package/dist/upgrade/version-check.js.map +1 -1
  437. package/dist/webhooks/index.d.ts +0 -8
  438. package/dist/webhooks/index.d.ts.map +1 -1
  439. package/dist/webhooks/index.js +1 -16
  440. package/dist/webhooks/index.js.map +1 -1
  441. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # @actuate-media/cms-core
2
2
 
3
+ ## 7.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2a46f45: The dynamic Open Graph card fallback was composed as `${siteUrl}/api/cms/og.png?title=…`, but `siteUrl` is the public site origin and the route is served by the CMS — on a decoupled frontend (site on `www`, CMS on `cms.`) every page without an uploaded `ogImage` published an `og:image` that 404d. `composePageMeta` and `resolveEffectiveMeta` now accept a `cmsOrigin` input and compose the card against the CMS origin with precedence `seo.cmsUrl` → request origin → `siteUrl`; `/resolve` and `/seo/meta/:id` pass the request origin. New optional `seo.cmsUrl` in `SiteSEOConfig` pins the CMS origin explicitly. Canonical, `og:url` and `metadataBase` stay on `siteUrl`, and the generated card keeps its `width`/`height`. Coupled deploys (one origin) are unchanged. Fixes #904
8
+ - 2a46f45: `mergeCollection` composed preset fields with a spread, so a `blogPostCollection` override could add or replace a field but never remove one — jobs and help types built from the blog preset kept `relatedPosts`, `authorName`, `tags`, etc. and had to retarget them. `CollectionPresetOverrides.fields` now accepts `FieldDefinition | null`: an own-property `null` drops the key from the merged collection (`blogPostCollection({ fields: { relatedPosts: null } })`), a definition still replaces it, and `undefined` is not an omit token (the default is kept and no `undefined`-valued key is emitted). `type: 'post'` presets refuse to drop the fields the admin Post Editor requires (`sections`, `excerpt`, `body`, …) and throw an error naming the key. Fixes #922
9
+
10
+ ## 7.0.0
11
+
12
+ ### Major Changes
13
+
14
+ - 075cce2: Governed-runtime convergence (SEO AI audit roadmap item 8, Spec B). Every AI model call now runs through the Settings > AI runtime — feature toggles, daily caps, monthly budget, brand voice, and usage metering apply uniformly.
15
+
16
+ **Breaking**
17
+ - The legacy `@prenta/plugin-ai` provider fallback is gone. Hosts need either a provider connection in Settings > AI **or** a provider API key env var (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `XAI_API_KEY`). With an env var set, an env-managed connection and the provider's curated default model are used automatically (zero-config). Hosts that passed a literal key to `aiPlugin({ apiKey })` without an env var must set the env var or add a connection; otherwise AI routes return 503 with a setup hint.
18
+ - `GET /ai/status` removed (no callers; Settings > AI has its own status).
19
+ - `POST /collections/:slug/ai-create` (MCP create tools) is governed by the new **Document generation (MCP)** feature: toggle, daily cap (default 50), budget, brand voice, and an `ai_usage` metering row per call. Invalid model output now returns 502 `invalid_output` after one retry instead of 500. The response's `generation.usage` now has the runtime shape `{ promptTokens, completionTokens, totalTokens }` (a superset of the old `{ promptTokens, completionTokens }`), and the `settings_changed` audit row no longer carries `tokensUsed`. The route no longer forces `temperature: 0.7` — the provider default applies unless the request supplies one — and `maxTokens` (integer, 64–6000) / `temperature` (0–2) are validated: out-of-range or non-numeric values return 400 before any model call. `tone` / `targetAudience` are clamped to 200 chars and flattened to one line before entering the system prompt.
20
+ - `POST /ai/providers/:id/sync-models` stamps the acting admin (not the env row's `system` placeholder) on the config row, so syncing an `env:*` connection works on Postgres (the `createdById` / `updatedById` FKs). `syncModels(db, connectionId, userId?)` gains the optional third argument.
21
+ - `PUT /ai/settings` no longer rejects a `defaultProviderId` that is no longer connected (e.g. a stale `env:*` row after the env var was removed): the default provider — and the default model, when it is no longer resolvable — are cleared and reported in a new `warnings: string[]` on the response (empty on a clean save). `putAIConfig` prunes `catalog` entries whose connection id is neither stored nor env-visible.
22
+ - Internal-link embeddings are chunked (≤ 256 inputs per request, the query on the first), each item clamped to 2000 chars, and corpora above 1000 items are pre-trimmed by query-token overlap then recency. `/seo/links/suggest` threads the session user into the `ai_usage` row.
23
+ - `generateContentWriting` failures now carry `code` (and `hint` for 503) alongside `httpStatus` / `message`; `POST /ai/brand-voice/analyze` emits `{ error, code, hint }` like every other AI route (previously the hint was concatenated into `error`).
24
+ - `getAIConfig` fails closed: when the config read throws (or the client has no `document` model) it returns no providers - env-key bootstrap applies only after a successful read - so a transient DB failure yields `no_model` instead of running governed features on default settings. `POST /ai/brand-voice/fix` keeps its deterministic 200 but adds `data.aiUnavailable: { code, message, hint? }` (and `aiRefusalCode` in the audit row) when `useAi` was requested and the runtime refused.
25
+ - Alt-text prompts fence `surroundingText` as untrusted content and clamp `pageTitle` to 200 chars.
26
+ - `isAiFeatureEnabled` (internal, never root-exported) removed; the runtime enforces toggles itself.
27
+ - `POST /ai/media-metadata` uses the feature's Settings > AI model; a non-vision model yields the text heuristic (confidence ≤ 0.4). 501 responses are now 503 with `code` + `hint`. The request body is validated: `purpose` must be one of `decorative` / `informative` / `functional` (other values are dropped rather than forwarded to the prompt) and `pageTitle` / `surroundingText` must be strings.
28
+ - `POST /ai/coauthor`: the plugin fallback and 501 branch are gone; refusals map through `runtimeErrorToResponse` (403 / 429 / 503 + hint / 502). The `proofread` action now always returns `changes: []` — the structured diff came from the removed plugin path; the governed path returns corrected text only.
29
+ - Removed never-read settings fields: `AIFeatureConfig.maxMonthlyTokens/rolesAllowed/permissionsRequired/dataPolicyKey`, `AIBudgetSettings.monthlyCostLimit/alertAtPercentages/perFeatureLimits/perUserLimits`, `AISettings.logsRetentionDays/defaultEmbeddingModelId`. Stored config JSON is untouched; the keys are ignored.
30
+ - `generateContentWritingWithFallback` → `generateContentWriting` (no fallback).
31
+ - `AI_PLUGIN_NOT_INSTALLED_MEDIA_ALT` removed; `AI_PLUGIN_NOT_INSTALLED` copy no longer mentions API keys (only the deterministic `/ai/audit-document` and `/ai/suggest-internal-links` routes still require the plugin).
32
+
33
+ **Added**
34
+ - Vision input: `GenerateTextOptions.images`, `GenerateForFeatureInput.images`, `RuntimeErrorCode 'unsupported_input'`, `ResolvedFeatureRuntime.capabilities`.
35
+ - `runtimeErrorToResponse` / `setupHint` — one HTTP mapping for every runtime refusal (`ai/runtime-response.ts`); `SECURITY_HEADERS` moved to the leaf module `api/security-headers.ts` (still re-exported from `route-helpers`).
36
+ - Env-key bootstrap: `getAIConfig` synthesizes an enabled `env:<provider>` connection (`ENV_CONNECTION_PREFIX`, `isEnvConnectionId`) when the provider env var is set and no stored connection exists. These rows show `status: unknown` and epoch timestamps, are never persisted, and reject PUT / DELETE with 400. `POST /ai/providers/:id/test` on an env connection returns the tested row without writing.
37
+ - `resolveFeatureModel` gains the `'provider-default'` source (`curatedDefaultModelId`): a connection with no default model resolves to the provider's curated default (`openai:gpt-4o-mini`, `anthropic:claude-sonnet-4-6`, `xai:grok-4-fast`; vision features pick the vision-flagged entry).
38
+ - Features `ai.features.documentGeneration` and `ai.features.seoInternalLinks` (appear automatically on existing sites via `mergeFeatures`).
39
+ - Internal-link suggestions embed the query + corpus in one governed `embedForFeature` call and fall back to deterministic phrase matching (`matchKind: 'phrase'`) instead of returning nothing. `POST /seo/links/ai-index` reports `aiAvailable` from a real runtime probe that also requires an embeddings-capable provider (`embeddingsAvailableForProvider`); Anthropic/xAI-only sites report `false` and stay on phrase matching.
40
+ - `ai/tasks/*` provider-free prompt builders and parsers (document generation, alt text, link embeddings), moved from `@prenta/plugin-ai`.
41
+
3
42
  ## 6.0.0
4
43
 
5
44
  ### Major Changes
@@ -2,7 +2,6 @@
2
2
  * Brand voice analysis — gathers published content samples and turns them into
3
3
  * a draft profile for the Settings > AI form fields.
4
4
  */
5
- import { BRAND_VOICE_LIMITS } from './brand-voice.js';
6
5
  import type { BrandVoiceProfile } from './types.js';
7
6
  /** A single content sample fed to the analyzer. */
8
7
  export interface BrandVoiceSample {
@@ -22,8 +21,6 @@ export interface BrandVoiceAnalyzeResult {
22
21
  }>;
23
22
  sampleCount: number;
24
23
  }
25
- declare const DEFAULT_MAX_SAMPLES = 10;
26
- declare const MAX_SAMPLES_CAP = 15;
27
24
  /** Fence untrusted CMS content before it is interpolated into an analysis prompt. */
28
25
  export declare function fenceBrandVoiceSample(text: string, maxLen?: number): string;
29
26
  /**
@@ -67,5 +64,5 @@ export declare function gatherBrandVoiceSamples(db: {
67
64
  };
68
65
  }, options: GatherBrandVoiceSamplesOptions): Promise<BrandVoiceSample[]>;
69
66
  export declare function toBrandVoiceAnalyzeResult(draft: BrandVoiceAnalysisDraft, samples: BrandVoiceSample[]): BrandVoiceAnalyzeResult;
70
- export { DEFAULT_MAX_SAMPLES as BRAND_VOICE_ANALYZE_DEFAULT_SAMPLES, MAX_SAMPLES_CAP as BRAND_VOICE_ANALYZE_MAX_SAMPLES, BRAND_VOICE_LIMITS, };
67
+ export {};
71
68
  //# sourceMappingURL=brand-voice-analyze.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"brand-voice-analyze.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-analyze.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAuB,MAAM,kBAAkB,CAAA;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,yEAAyE;AACzE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,iBAAiB,EACjB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAC3D,CAAA;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,uBAAuB,CAAA;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,QAAA,MAAM,mBAAmB,KAAK,CAAA;AAC9B,QAAA,MAAM,eAAe,KAAK,CAAA;AAQ1B,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAmB,GAAG,MAAM,CAGrF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG;IAC1E,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,CAsBA;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAyB5F;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAgBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,CAAC,IAAI,EAAE;YACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC/B,IAAI,EAAE,MAAM,CAAA;SACb,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;KAC7B,CAAA;CACF,EACD,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0C7B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,gBAAgB,EAAE,GAC1B,uBAAuB,CAUzB;AAED,OAAO,EACL,mBAAmB,IAAI,mCAAmC,EAC1D,eAAe,IAAI,+BAA+B,EAClD,kBAAkB,GACnB,CAAA"}
1
+ {"version":3,"file":"brand-voice-analyze.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-analyze.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,yEAAyE;AACzE,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,iBAAiB,EACjB,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAC3D,CAAA;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,uBAAuB,CAAA;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzE,WAAW,EAAE,MAAM,CAAA;CACpB;AAWD,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAmB,GAAG,MAAM,CAGrF;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG;IAC1E,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,CAsBA;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,IAAI,CAyB5F;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,KAAK,WAAW,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAgBD;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE,CAAC,IAAI,EAAE;YACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC/B,IAAI,EAAE,MAAM,CAAA;SACb,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;KAC7B,CAAA;CACF,EACD,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0C7B;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,uBAAuB,EAC9B,OAAO,EAAE,gBAAgB,EAAE,GAC1B,uBAAuB,CAUzB"}
@@ -2,7 +2,7 @@
2
2
  * Brand voice analysis — gathers published content samples and turns them into
3
3
  * a draft profile for the Settings > AI form fields.
4
4
  */
5
- import { BRAND_VOICE_LIMITS, normalizeBrandVoice } from './brand-voice.js';
5
+ import { normalizeBrandVoice } from './brand-voice.js';
6
6
  const DEFAULT_MAX_SAMPLES = 10;
7
7
  const MAX_SAMPLES_CAP = 15;
8
8
  const PER_SAMPLE_CHARS = 1500;
@@ -148,5 +148,4 @@ export function toBrandVoiceAnalyzeResult(draft, samples) {
148
148
  sampleCount: samples.length,
149
149
  };
150
150
  }
151
- export { DEFAULT_MAX_SAMPLES as BRAND_VOICE_ANALYZE_DEFAULT_SAMPLES, MAX_SAMPLES_CAP as BRAND_VOICE_ANALYZE_MAX_SAMPLES, BRAND_VOICE_LIMITS, };
152
151
  //# sourceMappingURL=brand-voice-analyze.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brand-voice-analyze.js","sourceRoot":"","sources":["../../src/ai/brand-voice-analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand-voice-analyze.js","sourceRoot":"","sources":["../../src/ai/brand-voice-analyze.ts"],"names":[],"mappings":"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"}
@@ -5,8 +5,6 @@ import type { BrandVoiceSample } from './brand-voice-analyze.js';
5
5
  export declare const MAX_ANALYZE_URLS = 5;
6
6
  export declare const MAX_ANALYZE_UPLOADS = 5;
7
7
  export declare const MAX_UPLOAD_TEXT_CHARS = 15000;
8
- export declare const MAX_URL_FETCH_CHARS = 8000;
9
- export declare const MAX_URL_FETCH_BYTES: number;
10
8
  export declare class BrandVoiceSourceError extends Error {
11
9
  constructor(message: string);
12
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brand-voice-sources.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-sources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAC3C,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AACxC,eAAO,MAAM,mBAAmB,QAAa,CAAA;AAqB7C,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4DrF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgBrF"}
1
+ {"version":3,"file":"brand-voice-sources.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-sources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAEhE,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,mBAAmB,IAAI,CAAA;AACpC,eAAO,MAAM,qBAAqB,QAAS,CAAA;AAuB3C,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,mFAAmF;AACnF,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4DrF;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgBrF"}
@@ -6,8 +6,8 @@ import { stripHtmlTags } from '../seo/analysis.js';
6
6
  export const MAX_ANALYZE_URLS = 5;
7
7
  export const MAX_ANALYZE_UPLOADS = 5;
8
8
  export const MAX_UPLOAD_TEXT_CHARS = 15_000;
9
- export const MAX_URL_FETCH_CHARS = 8_000;
10
- export const MAX_URL_FETCH_BYTES = 512 * 1024;
9
+ const MAX_URL_FETCH_CHARS = 8_000;
10
+ const MAX_URL_FETCH_BYTES = 512 * 1024;
11
11
  function clampText(text, max) {
12
12
  return text.replace(/\s+/g, ' ').trim().slice(0, max);
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"brand-voice-sources.js","sourceRoot":"","sources":["../../src/ai/brand-voice-sources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand-voice-sources.js","sourceRoot":"","sources":["../../src/ai/brand-voice-sources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAA;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAA;AACpC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAA;AAC3C,MAAM,mBAAmB,GAAG,KAAK,CAAA;AACjC,MAAM,mBAAmB,GAAG,GAAG,GAAG,IAAI,CAAA;AAEtC,SAAS,SAAS,CAAC,IAAY,EAAE,GAAW;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAG,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAA;IAClC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,UAAU,CAAA;AAC5D,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,cAAc,GAAG,IAAI;SACxB,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC;SAC3C,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC;SACzC,OAAO,CAAC,uBAAuB,EAAE,GAAG,CAAC;SACrC,OAAO,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;IAC9C,OAAO,SAAS,CAAC,aAAa,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC,CAAA;AACtE,CAAC;AAED,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW;IACxD,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,qBAAqB,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,qBAAqB,CAAC,yCAAyC,CAAC,CAAA;IAC5E,CAAC;IAED,IAAI,QAAkB,CAAA;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IAC7F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACpC,MAAM,IAAI,qBAAqB,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;QACrE,CAAC;QACD,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAA;IACjF,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,qBAAqB,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,GAAG,mBAAmB,EAAE,CAAC;QAC5C,MAAM,IAAI,qBAAqB,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACpC,IAAI,IAAY,CAAA;IAChB,IAAI,KAAa,CAAA;IAEjB,IAAI,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;SAAM,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/E,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAA;QACvB,IAAI,GAAG,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAA;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,qBAAqB,CAC7B,6BAA6B,WAAW,IAAI,SAAS,UAAU,GAAG,EAAE,CACrE,CAAA;IACH,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,qBAAqB,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,GAAG;QACf,KAAK;QACL,IAAI;KACL,CAAA;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,IAAY;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,qBAAqB,CAAC,WAAW,IAAI,aAAa,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;QAC3C,MAAM,IAAI,qBAAqB,CAC7B,WAAW,IAAI,aAAa,qBAAqB,CAAC,cAAc,EAAE,cAAc,CACjF,CAAA;IACH,CAAC;IACD,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,mBAAmB;QAChD,IAAI,EAAE,OAAO;KACd,CAAA;AACH,CAAC"}
@@ -2,12 +2,12 @@
2
2
  * Structured brand voice rules — parsed from profile frontmatter and used for
3
3
  * deterministic alignment scoring and the Phase 3 admin editors.
4
4
  */
5
- export type ContractionsRule = 'allow' | 'avoid' | 'require';
6
- export type ExclamationRule = 'allow' | 'avoid' | 'forbid';
7
- export type EmojiRule = 'allow' | 'sparingly' | 'forbid';
8
- export type CaseRule = 'sentence' | 'title';
9
- export type NumbersRule = 'spell_all' | 'numerals_all' | 'numerals_for_10_plus';
10
- export type SpellingRule = 'us' | 'uk';
5
+ type ContractionsRule = 'allow' | 'avoid' | 'require';
6
+ type ExclamationRule = 'allow' | 'avoid' | 'forbid';
7
+ type EmojiRule = 'allow' | 'sparingly' | 'forbid';
8
+ type CaseRule = 'sentence' | 'title';
9
+ type NumbersRule = 'spell_all' | 'numerals_all' | 'numerals_for_10_plus';
10
+ type SpellingRule = 'us' | 'uk';
11
11
  export interface BrandVoiceToneScales {
12
12
  formalCasual: number;
13
13
  seriousPlayful: number;
@@ -1 +1 @@
1
- {"version":3,"file":"brand-voice-structured.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-structured.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"brand-voice-structured.d.ts","sourceRoot":"","sources":["../../src/ai/brand-voice-structured.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,14 @@
12
12
  * resolves to its own entry.
13
13
  */
14
14
  import type { AIModel, AIProviderKey } from './types.js';
15
+ /**
16
+ * The model a provider should use when the operator has configured nothing
17
+ * (env-key bootstrap). Prefers the entry flagged `defaultFor` the requested
18
+ * modality; otherwise `text` picks the first curated chat model and `vision`
19
+ * the first curated entry with `vision: true`. Deprecated and non-fallback
20
+ * entries are never chosen.
21
+ */
22
+ export declare function curatedDefaultModelId(provider: AIProviderKey, want: 'text' | 'vision'): string | undefined;
15
23
  export interface NormalizeInput {
16
24
  provider: AIProviderKey;
17
25
  providerModelId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/ai/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAuC,aAAa,EAAE,MAAM,YAAY,CAAA;AAmT7F,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CA4B7D;AAkBD,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGlF;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE,CAc/F"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/ai/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAuC,aAAa,EAAE,MAAM,YAAY,CAAA;AA6Q7F;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,MAAM,GAAG,QAAQ,GACtB,MAAM,GAAG,SAAS,CAUpB;AAmDD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,aAAa,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACzB,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CA4B7D;AAkBD,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGlF;AAED,sEAAsE;AACtE,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,EAAE,CAc/F"}
@@ -29,6 +29,7 @@ const CURATED = {
29
29
  canonicalId: 'gpt-4o-mini',
30
30
  displayName: 'GPT-4o mini (fast)',
31
31
  description: 'Low-cost multimodal model for high-volume tasks.',
32
+ defaultFor: ['text', 'vision'],
32
33
  capabilities: {
33
34
  text: true,
34
35
  vision: true,
@@ -172,6 +173,7 @@ const CURATED = {
172
173
  canonicalId: 'claude-sonnet-4-6',
173
174
  displayName: 'Claude Sonnet (balanced)',
174
175
  description: 'Balanced Claude model for everyday content and reasoning.',
176
+ defaultFor: ['text', 'vision'],
175
177
  capabilities: {
176
178
  text: true,
177
179
  vision: true,
@@ -193,6 +195,7 @@ const CURATED = {
193
195
  canonicalId: 'grok-4-fast',
194
196
  displayName: 'Grok (fast)',
195
197
  description: 'Low-latency Grok model for high-volume tasks.',
198
+ defaultFor: ['text'],
196
199
  capabilities: {
197
200
  text: true,
198
201
  toolCalling: true,
@@ -211,6 +214,7 @@ const CURATED = {
211
214
  canonicalId: 'grok-vision',
212
215
  displayName: 'Grok Vision',
213
216
  description: 'Multimodal Grok model with image understanding.',
217
+ defaultFor: ['vision'],
214
218
  capabilities: {
215
219
  text: true,
216
220
  vision: true,
@@ -246,6 +250,24 @@ const CURATED = {
246
250
  },
247
251
  ],
248
252
  };
253
+ /**
254
+ * The model a provider should use when the operator has configured nothing
255
+ * (env-key bootstrap). Prefers the entry flagged `defaultFor` the requested
256
+ * modality; otherwise `text` picks the first curated chat model and `vision`
257
+ * the first curated entry with `vision: true`. Deprecated and non-fallback
258
+ * entries are never chosen.
259
+ */
260
+ export function curatedDefaultModelId(provider, want) {
261
+ if (provider === 'custom')
262
+ return undefined;
263
+ const entries = CURATED[provider].filter((e) => !e.deprecated && e.fallback !== false);
264
+ const capable = (e) => want === 'vision'
265
+ ? e.capabilities.vision === true
266
+ : e.capabilities.text === true && !e.capabilities.embeddings;
267
+ const flagged = entries.find((e) => e.defaultFor?.includes(want) && capable(e));
268
+ const pick = flagged ?? entries.find(capable);
269
+ return pick ? `${provider}:${pick.canonicalId}` : undefined;
270
+ }
249
271
  /** Find the curated entry whose longest `match` prefix applies to the id. */
250
272
  function findCurated(provider, providerModelId) {
251
273
  if (provider === 'custom')
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/ai/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/ai/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,eAAe,GAAwB;IAC3C,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,KAAK;IACb,eAAe,EAAE,KAAK;IACtB,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,KAAK;IACvB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,KAAK;CACnB,CAAA;AA4BD,MAAM,OAAO,GAA4D;IACvE,MAAM,EAAE;QACN;YACE,KAAK,EAAE,CAAC,aAAa,CAAC;YACtB,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,oBAAoB;YACjC,WAAW,EAAE,kDAAkD;YAC/D,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC9B,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE;SAC1D;QACD;YACE,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;YAC/B,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE,+DAA+D;YAC5E,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACxD;QACD;YACE,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC7B,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE,sDAAsD;YACnE,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;SACzD;QACD;YACE,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;YACnB,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,gBAAgB;YAC7B,WAAW,EAAE,kCAAkC;YAC/C,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACvD;QACD;YACE,KAAK,EAAE,CAAC,wBAAwB,CAAC;YACjC,WAAW,EAAE,wBAAwB;YACrC,WAAW,EAAE,qBAAqB;YAClC,YAAY,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAClC,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,WAAW,CAAC;YAC/B,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SACnC;QACD;YACE,KAAK,EAAE,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;YACnD,WAAW,EAAE,wBAAwB;YACrC,WAAW,EAAE,qBAAqB;YAClC,YAAY,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;YAClC,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,WAAW,CAAC;YAC/B,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;SACnC;QACD;YACE,KAAK,EAAE,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;YAC5C,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;YACvC,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,OAAO,CAAC;YAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACzB;KACF;IACD,SAAS,EAAE;QACT;YACE,KAAK,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,CAAC;YACjF,WAAW,EAAE,kBAAkB;YAC/B,WAAW,EAAE,qBAAqB;YAClC,WAAW,EAAE,iDAAiD;YAC9D,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,EAAE;SACvD;QACD;YACE,KAAK,EAAE,CAAC,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,CAAC;YAC3E,WAAW,EAAE,iBAAiB;YAC9B,WAAW,EAAE,4BAA4B;YACzC,WAAW,EAAE,wDAAwD;YACrE,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACvD;QACD;YACE,KAAK,EAAE,CAAC,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,iBAAiB,CAAC;YACrF,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE,0BAA0B;YACvC,WAAW,EAAE,2DAA2D;YACxE,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC9B,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACtD;KACF;IACD,GAAG,EAAE;QACH;YACE,KAAK,EAAE,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,CAAC;YAClD,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,+CAA+C;YAC5D,UAAU,EAAE,CAAC,MAAM,CAAC;YACpB,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;SACzD;QACD;YACE,KAAK,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;YACvC,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,aAAa;YAC1B,WAAW,EAAE,iDAAiD;YAC9D,UAAU,EAAE,CAAC,QAAQ,CAAC;YACtB,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YAClC,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACtD;QACD;YACE,KAAK,EAAE,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,iBAAiB;YAC9B,WAAW,EAAE,sBAAsB;YACnC,YAAY,EAAE;gBACZ,IAAI,EAAE,IAAI;gBACV,WAAW,EAAE,IAAI;gBACjB,gBAAgB,EAAE,IAAI;gBACtB,SAAS,EAAE,IAAI;gBACf,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;aAClB;YACD,aAAa,EAAE,MAAM;YACrB,eAAe,EAAE,KAAK;YACtB,eAAe,EAAE,CAAC,MAAM,CAAC;YACzB,gBAAgB,EAAE,CAAC,MAAM,CAAC;YAC1B,OAAO,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE;SACtD;KACF;CACF,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAAuB,EACvB,IAAuB;IAEvB,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAA;IACtF,MAAM,OAAO,GAAG,CAAC,CAAc,EAAE,EAAE,CACjC,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,IAAI;QAChC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAA;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/E,MAAM,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7D,CAAC;AAED,6EAA6E;AAC7E,SAAS,WAAW,CAAC,QAAuB,EAAE,eAAuB;IACnE,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAA;IACxC,IAAI,IAAI,GAA8C,IAAI,CAAA;IAC1D,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvD,IAAI,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,EAAE,IAAI,IAAI,IAAI,CAAA;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,eAAuB;IAChD,MAAM,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAA;IACxC,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,CAAA;IACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAChB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACrB,IACE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACrB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjB,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EACzB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IACpB,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAaD,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;IAClE,MAAM,YAAY,GAAG,OAAO;QAC1B,CAAC,CAAC,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE;QACjD,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;IAC5C,OAAO;QACL,EAAE,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,eAAe,EAAE;QAChD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,eAAe;QAC/E,WAAW,EAAE,OAAO,EAAE,WAAW;QACjC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC;QAC1E,YAAY;QACZ,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,eAAe,EAAE,OAAO,EAAE,eAAe;QACzC,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5F,gBAAgB,EACd,OAAO,EAAE,gBAAgB;YACzB,CAAC,YAAY,CAAC,UAAU;gBACtB,CAAC,CAAC,CAAC,WAAW,CAAC;gBACf,CAAC,CAAC,YAAY,CAAC,eAAe;oBAC5B,CAAC,CAAC,CAAC,OAAO,CAAC;oBACX,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;KAC3C,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,wBAAwB,GAA2B;IACvD,mCAAmC,EAAE,4BAA4B;IACjE,gCAAgC,EAAE,2BAA2B;IAC7D,kCAAkC,EAAE,6BAA6B;CAClE,CAAA;AAED,MAAM,qBAAqB,GAA2B;IACpD,yBAAyB,EAAE,kBAAkB;IAC7C,sBAAsB,EAAE,iBAAiB;IACzC,wBAAwB,EAAE,mBAAmB;CAC9C,CAAA;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,OAA2B;IAC5D,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IAC5B,OAAO,wBAAwB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAA;AACrD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,kBAAkB,CAAC,eAAuB;IACxD,OAAO,qBAAqB,CAAC,eAAe,CAAC,IAAI,eAAe,CAAA;AAClE,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,CAAS;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxB,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AACtE,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CAAC,QAAuB,EAAE,YAAoB;IAClF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;IACpC,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;SACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACT,cAAc,CAAC;QACb,QAAQ;QACR,eAAe,EAAE,CAAC,CAAC,WAAW;QAC9B,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW;QACjD,YAAY;KACb,CAAC,CACH,CAAA;AACL,CAAC"}
@@ -12,13 +12,17 @@
12
12
  * providers through {@link toPublicProvider}.
13
13
  * - When a provider's env var is set, that key wins and the UI shows it as
14
14
  * env-managed/read-only.
15
+ * - A provider env var with no stored connection yields a read-time
16
+ * `env:<provider>` connection (zero-config bootstrap); it is never
17
+ * persisted and cannot be edited or deleted through the API.
15
18
  */
16
- import type { AIBudgetSettings, AIConfigDocument, AIKeySource, AIProviderConnection, AIProviderConnectionPublic, AIProviderKey, AISettings } from './types.js';
19
+ import type { AIBudgetSettings, AIConfigDocument, AIProviderConnection, AIProviderConnectionPublic, AIProviderKey, AISettings } from './types.js';
17
20
  export declare const AI_CONFIG_COLLECTION = "__ai_config__";
18
21
  export declare const DEFAULT_AI_BUDGET: AIBudgetSettings;
19
22
  export declare function defaultAISettings(): AISettings;
20
23
  /** Read the env-managed key for a provider, if present and non-empty. */
21
24
  export declare function getEnvApiKey(provider: AIProviderKey): string | null;
25
+ export declare function isEnvConnectionId(id: string): boolean;
22
26
  /** Last 4 chars of a key for masked display (never the full value). */
23
27
  export declare function last4(key: string | undefined | null): string | undefined;
24
28
  /**
@@ -27,8 +31,6 @@ export declare function last4(key: string | undefined | null): string | undefine
27
31
  * Returns null when neither exists.
28
32
  */
29
33
  export declare function resolveProviderKey(conn: Pick<AIProviderConnection, 'provider' | 'apiKeyEncrypted'>): Promise<string | null>;
30
- /** Determine where a connection's key comes from for UI display. */
31
- export declare function resolveKeySource(conn: AIProviderConnection): AIKeySource;
32
34
  /** Strip key material and add UI-facing source metadata. */
33
35
  export declare function toPublicProvider(conn: AIProviderConnection): AIProviderConnectionPublic;
34
36
  /** Encrypt a plaintext key for storage and compute its masked suffix. */
@@ -40,11 +42,23 @@ export declare function encryptProviderKey(plaintext: string): Promise<{
40
42
  * Read the AI config document. Returns a fully-populated object (defaults +
41
43
  * merged feature flags) even when no row exists yet, so callers never special-
42
44
  * case the empty state.
45
+ *
46
+ * Fail closed: env connections are bootstrapped only when the read succeeded
47
+ * (a row was found, or the store genuinely has none). When the read throws —
48
+ * or the client has no `document` model at all — the stored governance
49
+ * (feature toggles, caps, budget, brand voice) is unknown, so returning
50
+ * default settings *plus* an env-bootstrapped provider would let a transient
51
+ * DB failure run governed features ungoverned. Instead the result carries no
52
+ * providers, and the runtime refuses with `no_model`.
43
53
  */
44
54
  export declare function getAIConfig(db: unknown): Promise<AIConfigDocument>;
45
55
  /**
46
56
  * Upsert the AI config document. Caller is responsible for auth/role checks.
47
- * Stamps `updatedAt`/`updatedBy`.
57
+ * Stamps `updatedAt`/`updatedBy`. Env-synthesized connections (`env:*`) are
58
+ * stripped before the write so the zero-config bootstrap never leaks into
59
+ * storage; the returned document re-applies them so it matches what
60
+ * {@link getAIConfig} would read back. Catalog entries keyed by a connection
61
+ * id that is neither stored nor env-visible are pruned in the same write.
48
62
  */
49
63
  export declare function putAIConfig(db: unknown, next: AIConfigDocument, userId: string): Promise<AIConfigDocument>;
50
64
  /** Serialize a full config doc for the client (providers masked). */
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/ai/config-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,oBAAoB,kBAAkB,CAAA;AAUnD,eAAO,MAAM,iBAAiB,EAAE,gBAG/B,CAAA;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAM9C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAIxE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,iBAAiB,CAAC,GAC/D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,WAAW,CAIxE;AAED,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,0BAA0B,CAcvF;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA2B3B;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG;IACrD,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,QAAQ,EAAE,UAAU,CAAA;CACrB,CAKA"}
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/ai/config-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAEhB,oBAAoB,EACpB,0BAA0B,EAC1B,aAAa,EACb,UAAU,EACX,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,oBAAoB,kBAAkB,CAAA;AAUnD,eAAO,MAAM,iBAAiB,EAAE,gBAE/B,CAAA;AAED,wBAAgB,iBAAiB,IAAI,UAAU,CAK9C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAKnE;AAKD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAErD;AAmCD,uEAAuE;AACvE,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAIxE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,GAAG,iBAAiB,CAAC,GAC/D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWxB;AASD,4DAA4D;AAC5D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,0BAA0B,CAcvF;AAED,yEAAyE;AACzE,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3D;AAkCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0BxE;AAiBD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,OAAO,EACX,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,CAAC,CA+B3B;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG;IACrD,SAAS,EAAE,0BAA0B,EAAE,CAAA;IACvC,QAAQ,EAAE,UAAU,CAAA;CACrB,CAKA"}
@@ -12,6 +12,9 @@
12
12
  * providers through {@link toPublicProvider}.
13
13
  * - When a provider's env var is set, that key wins and the UI shows it as
14
14
  * env-managed/read-only.
15
+ * - A provider env var with no stored connection yields a read-time
16
+ * `env:<provider>` connection (zero-config bootstrap); it is never
17
+ * persisted and cannot be edited or deleted through the API.
15
18
  */
16
19
  import { decryptSecret, encryptSecret } from '../security/secret-storage.js';
17
20
  import { cloneFeatureDefaults, mergeFeatures } from './feature-defaults.js';
@@ -24,14 +27,12 @@ const ENV_KEY_BY_PROVIDER = {
24
27
  custom: null,
25
28
  };
26
29
  export const DEFAULT_AI_BUDGET = {
27
- alertAtPercentages: [50, 80, 100],
28
30
  disableWhenExceeded: false,
29
31
  };
30
32
  export function defaultAISettings() {
31
33
  return {
32
34
  features: cloneFeatureDefaults(),
33
- budget: { ...DEFAULT_AI_BUDGET, alertAtPercentages: [...DEFAULT_AI_BUDGET.alertAtPercentages] },
34
- logsRetentionDays: 30,
35
+ budget: { ...DEFAULT_AI_BUDGET },
35
36
  };
36
37
  }
37
38
  /** Read the env-managed key for a provider, if present and non-empty. */
@@ -42,6 +43,43 @@ export function getEnvApiKey(provider) {
42
43
  const val = process.env[envVar];
43
44
  return val && val.trim() ? val.trim() : null;
44
45
  }
46
+ /** Id prefix for connections synthesized from a provider env var at read time. */
47
+ const ENV_CONNECTION_PREFIX = 'env:';
48
+ export function isEnvConnectionId(id) {
49
+ return id.startsWith(ENV_CONNECTION_PREFIX);
50
+ }
51
+ const ENV_DISPLAY_NAME = {
52
+ openai: 'OpenAI (environment)',
53
+ anthropic: 'Anthropic (environment)',
54
+ xai: 'xAI (environment)',
55
+ };
56
+ /**
57
+ * Zero-config path: a host that only set `OPENAI_API_KEY` (or Anthropic / xAI)
58
+ * gets an enabled, env-managed connection without visiting Settings > AI.
59
+ * Synthesized at read time only — {@link putAIConfig} strips these so they are
60
+ * never persisted, and a stored connection for the same provider suppresses
61
+ * the synthetic one.
62
+ */
63
+ function withEnvConnections(stored) {
64
+ const present = new Set(stored.map((p) => p.provider));
65
+ const out = [...stored];
66
+ for (const provider of ['openai', 'anthropic', 'xai']) {
67
+ if (present.has(provider) || !getEnvApiKey(provider))
68
+ continue;
69
+ const now = '1970-01-01T00:00:00.000Z';
70
+ out.push({
71
+ id: `${ENV_CONNECTION_PREFIX}${provider}`,
72
+ provider,
73
+ displayName: ENV_DISPLAY_NAME[provider],
74
+ enabled: true,
75
+ status: 'unknown',
76
+ createdAt: now,
77
+ updatedAt: now,
78
+ updatedBy: 'system',
79
+ });
80
+ }
81
+ return out;
82
+ }
45
83
  /** Last 4 chars of a key for masked display (never the full value). */
46
84
  export function last4(key) {
47
85
  if (!key)
@@ -69,7 +107,7 @@ export async function resolveProviderKey(conn) {
69
107
  return null;
70
108
  }
71
109
  /** Determine where a connection's key comes from for UI display. */
72
- export function resolveKeySource(conn) {
110
+ function resolveKeySource(conn) {
73
111
  if (getEnvApiKey(conn.provider))
74
112
  return 'environment';
75
113
  if (conn.apiKeyEncrypted)
@@ -97,51 +135,108 @@ export async function encryptProviderKey(plaintext) {
97
135
  const apiKeyEncrypted = await encryptSecret(plaintext);
98
136
  return { apiKeyEncrypted, apiKeyLast4: last4(plaintext) ?? '' };
99
137
  }
138
+ /**
139
+ * Hydrate `settings` field by field from the stored partial. Explicit on
140
+ * purpose: a stored document that predates Spec B may still carry removed keys
141
+ * (`logsRetentionDays`, `defaultEmbeddingModelId`, `budget.alertAtPercentages`,
142
+ * …); spreading it would leak them back into the runtime object.
143
+ */
144
+ function hydrateSettings(stored) {
145
+ const budget = (stored.budget ?? {});
146
+ const settings = {
147
+ features: mergeFeatures(stored.features),
148
+ budget: {
149
+ ...DEFAULT_AI_BUDGET,
150
+ ...(typeof budget.monthlyTokenLimit === 'number'
151
+ ? { monthlyTokenLimit: budget.monthlyTokenLimit }
152
+ : {}),
153
+ disableWhenExceeded: budget.disableWhenExceeded ?? DEFAULT_AI_BUDGET.disableWhenExceeded,
154
+ },
155
+ };
156
+ if (stored.defaultProviderId !== undefined)
157
+ settings.defaultProviderId = stored.defaultProviderId;
158
+ if (stored.defaultModelId !== undefined)
159
+ settings.defaultModelId = stored.defaultModelId;
160
+ if (stored.defaultTextModelId !== undefined)
161
+ settings.defaultTextModelId = stored.defaultTextModelId;
162
+ if (stored.defaultReasoningModelId !== undefined)
163
+ settings.defaultReasoningModelId = stored.defaultReasoningModelId;
164
+ if (stored.defaultVisionModelId !== undefined)
165
+ settings.defaultVisionModelId = stored.defaultVisionModelId;
166
+ if (stored.defaultImageGenerationModelId !== undefined)
167
+ settings.defaultImageGenerationModelId = stored.defaultImageGenerationModelId;
168
+ if (stored.brandVoice !== undefined)
169
+ settings.brandVoice = stored.brandVoice;
170
+ return settings;
171
+ }
100
172
  /**
101
173
  * Read the AI config document. Returns a fully-populated object (defaults +
102
174
  * merged feature flags) even when no row exists yet, so callers never special-
103
175
  * case the empty state.
176
+ *
177
+ * Fail closed: env connections are bootstrapped only when the read succeeded
178
+ * (a row was found, or the store genuinely has none). When the read throws —
179
+ * or the client has no `document` model at all — the stored governance
180
+ * (feature toggles, caps, budget, brand voice) is unknown, so returning
181
+ * default settings *plus* an env-bootstrapped provider would let a transient
182
+ * DB failure run governed features ungoverned. Instead the result carries no
183
+ * providers, and the runtime refuses with `no_model`.
104
184
  */
105
185
  export async function getAIConfig(db) {
106
186
  const d = db;
107
- const empty = { providers: [], settings: defaultAISettings() };
187
+ const closed = () => ({ providers: [], settings: defaultAISettings() });
108
188
  if (!d?.document?.findFirst)
109
- return empty;
189
+ return closed();
110
190
  try {
111
191
  const doc = await d.document.findFirst({
112
192
  where: { collection: AI_CONFIG_COLLECTION, deletedAt: null },
113
193
  select: { data: true },
114
194
  });
115
- if (!doc?.data || typeof doc.data !== 'object')
116
- return empty;
195
+ if (!doc?.data || typeof doc.data !== 'object') {
196
+ // Read succeeded and no config row exists yet: zero-config bootstrap.
197
+ return { providers: withEnvConnections([]), settings: defaultAISettings() };
198
+ }
117
199
  const data = doc.data;
118
- const settings = (data.settings ?? {});
119
200
  return {
120
- providers: Array.isArray(data.providers) ? data.providers : [],
121
- settings: {
122
- ...defaultAISettings(),
123
- ...settings,
124
- features: mergeFeatures(settings.features),
125
- budget: { ...DEFAULT_AI_BUDGET, ...(settings.budget ?? {}) },
126
- logsRetentionDays: settings.logsRetentionDays ?? 30,
127
- },
201
+ providers: withEnvConnections(Array.isArray(data.providers) ? data.providers : []),
202
+ settings: hydrateSettings((data.settings ?? {})),
128
203
  catalog: data.catalog,
129
204
  updatedAt: data.updatedAt,
130
205
  updatedBy: data.updatedBy,
131
206
  };
132
207
  }
133
208
  catch {
134
- return empty;
209
+ return closed();
135
210
  }
136
211
  }
212
+ /**
213
+ * Drop catalog entries for connections that are no longer visible. `visible`
214
+ * is what {@link getAIConfig} would return for the persisted providers — so
215
+ * `catalog['env:openai']` survives while the env row is the only OpenAI
216
+ * connection and is pruned once a stored OpenAI connection suppresses it.
217
+ */
218
+ function pruneCatalog(catalog, visible) {
219
+ if (!catalog)
220
+ return catalog;
221
+ const ids = new Set(visible.map((p) => p.id));
222
+ return Object.fromEntries(Object.entries(catalog).filter(([id]) => ids.has(id)));
223
+ }
137
224
  /**
138
225
  * Upsert the AI config document. Caller is responsible for auth/role checks.
139
- * Stamps `updatedAt`/`updatedBy`.
226
+ * Stamps `updatedAt`/`updatedBy`. Env-synthesized connections (`env:*`) are
227
+ * stripped before the write so the zero-config bootstrap never leaks into
228
+ * storage; the returned document re-applies them so it matches what
229
+ * {@link getAIConfig} would read back. Catalog entries keyed by a connection
230
+ * id that is neither stored nor env-visible are pruned in the same write.
140
231
  */
141
232
  export async function putAIConfig(db, next, userId) {
142
233
  const d = db;
234
+ const providers = next.providers.filter((p) => !isEnvConnectionId(p.id));
235
+ const visible = withEnvConnections(providers);
143
236
  const data = {
144
237
  ...next,
238
+ providers,
239
+ catalog: pruneCatalog(next.catalog, visible),
145
240
  updatedAt: new Date().toISOString(),
146
241
  updatedBy: userId,
147
242
  };
@@ -165,7 +260,7 @@ export async function putAIConfig(db, next, userId) {
165
260
  },
166
261
  });
167
262
  }
168
- return data;
263
+ return { ...data, providers: visible };
169
264
  }
170
265
  /** Serialize a full config doc for the client (providers masked). */
171
266
  export function toPublicConfig(doc) {