@growth-labs/cms 0.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 (1093) hide show
  1. package/README.md +165 -0
  2. package/dist/engine/activity-log.d.ts +17 -0
  3. package/dist/engine/activity-log.d.ts.map +1 -0
  4. package/dist/engine/activity-log.js +17 -0
  5. package/dist/engine/activity-log.js.map +1 -0
  6. package/dist/engine/ai-prompts.d.ts +57 -0
  7. package/dist/engine/ai-prompts.d.ts.map +1 -0
  8. package/dist/engine/ai-prompts.js +90 -0
  9. package/dist/engine/ai-prompts.js.map +1 -0
  10. package/dist/engine/ai-writeback.d.ts +36 -0
  11. package/dist/engine/ai-writeback.d.ts.map +1 -0
  12. package/dist/engine/ai-writeback.js +45 -0
  13. package/dist/engine/ai-writeback.js.map +1 -0
  14. package/dist/engine/api-keys.d.ts +76 -0
  15. package/dist/engine/api-keys.d.ts.map +1 -0
  16. package/dist/engine/api-keys.js +165 -0
  17. package/dist/engine/api-keys.js.map +1 -0
  18. package/dist/engine/content-insights.d.ts +36 -0
  19. package/dist/engine/content-insights.d.ts.map +1 -0
  20. package/dist/engine/content-insights.js +114 -0
  21. package/dist/engine/content-insights.js.map +1 -0
  22. package/dist/engine/contributors.d.ts +25 -0
  23. package/dist/engine/contributors.d.ts.map +1 -0
  24. package/dist/engine/contributors.js +59 -0
  25. package/dist/engine/contributors.js.map +1 -0
  26. package/dist/engine/cron.d.ts +15 -0
  27. package/dist/engine/cron.d.ts.map +1 -0
  28. package/dist/engine/cron.js +33 -0
  29. package/dist/engine/cron.js.map +1 -0
  30. package/dist/engine/d1.d.ts +16 -0
  31. package/dist/engine/d1.d.ts.map +1 -0
  32. package/dist/engine/d1.js +13 -0
  33. package/dist/engine/d1.js.map +1 -0
  34. package/dist/engine/foundry-dispatch.d.ts +52 -0
  35. package/dist/engine/foundry-dispatch.d.ts.map +1 -0
  36. package/dist/engine/foundry-dispatch.js +290 -0
  37. package/dist/engine/foundry-dispatch.js.map +1 -0
  38. package/dist/engine/import-parsers.d.ts +11 -0
  39. package/dist/engine/import-parsers.d.ts.map +1 -0
  40. package/dist/engine/import-parsers.js +373 -0
  41. package/dist/engine/import-parsers.js.map +1 -0
  42. package/dist/engine/index.d.ts +28 -0
  43. package/dist/engine/index.d.ts.map +1 -0
  44. package/dist/engine/index.js +57 -0
  45. package/dist/engine/index.js.map +1 -0
  46. package/dist/engine/invites.d.ts +78 -0
  47. package/dist/engine/invites.d.ts.map +1 -0
  48. package/dist/engine/invites.js +158 -0
  49. package/dist/engine/invites.js.map +1 -0
  50. package/dist/engine/members.d.ts +59 -0
  51. package/dist/engine/members.d.ts.map +1 -0
  52. package/dist/engine/members.js +124 -0
  53. package/dist/engine/members.js.map +1 -0
  54. package/dist/engine/membership-rules.d.ts +25 -0
  55. package/dist/engine/membership-rules.d.ts.map +1 -0
  56. package/dist/engine/membership-rules.js +44 -0
  57. package/dist/engine/membership-rules.js.map +1 -0
  58. package/dist/engine/og-render.d.ts +40 -0
  59. package/dist/engine/og-render.d.ts.map +1 -0
  60. package/dist/engine/og-render.js +26 -0
  61. package/dist/engine/og-render.js.map +1 -0
  62. package/dist/engine/publish-guard.d.ts +58 -0
  63. package/dist/engine/publish-guard.d.ts.map +1 -0
  64. package/dist/engine/publish-guard.js +80 -0
  65. package/dist/engine/publish-guard.js.map +1 -0
  66. package/dist/engine/publisher.d.ts +171 -0
  67. package/dist/engine/publisher.d.ts.map +1 -0
  68. package/dist/engine/publisher.js +597 -0
  69. package/dist/engine/publisher.js.map +1 -0
  70. package/dist/engine/revisions.d.ts +39 -0
  71. package/dist/engine/revisions.d.ts.map +1 -0
  72. package/dist/engine/revisions.js +203 -0
  73. package/dist/engine/revisions.js.map +1 -0
  74. package/dist/engine/sanitize.d.ts +52 -0
  75. package/dist/engine/sanitize.d.ts.map +1 -0
  76. package/dist/engine/sanitize.js +155 -0
  77. package/dist/engine/sanitize.js.map +1 -0
  78. package/dist/engine/seed-membership.d.ts +29 -0
  79. package/dist/engine/seed-membership.d.ts.map +1 -0
  80. package/dist/engine/seed-membership.js +65 -0
  81. package/dist/engine/seed-membership.js.map +1 -0
  82. package/dist/engine/seo.d.ts +20 -0
  83. package/dist/engine/seo.d.ts.map +1 -0
  84. package/dist/engine/seo.js +50 -0
  85. package/dist/engine/seo.js.map +1 -0
  86. package/dist/engine/slug-redirects.d.ts +8 -0
  87. package/dist/engine/slug-redirects.d.ts.map +1 -0
  88. package/dist/engine/slug-redirects.js +26 -0
  89. package/dist/engine/slug-redirects.js.map +1 -0
  90. package/dist/engine/slug.d.ts +6 -0
  91. package/dist/engine/slug.d.ts.map +1 -0
  92. package/dist/engine/slug.js +28 -0
  93. package/dist/engine/slug.js.map +1 -0
  94. package/dist/engine/soft-delete.d.ts +8 -0
  95. package/dist/engine/soft-delete.d.ts.map +1 -0
  96. package/dist/engine/soft-delete.js +28 -0
  97. package/dist/engine/soft-delete.js.map +1 -0
  98. package/dist/engine/tags.d.ts +14 -0
  99. package/dist/engine/tags.d.ts.map +1 -0
  100. package/dist/engine/tags.js +79 -0
  101. package/dist/engine/tags.js.map +1 -0
  102. package/dist/engine/topics.d.ts +10 -0
  103. package/dist/engine/topics.d.ts.map +1 -0
  104. package/dist/engine/topics.js +140 -0
  105. package/dist/engine/topics.js.map +1 -0
  106. package/dist/engine/url-guard.d.ts +12 -0
  107. package/dist/engine/url-guard.d.ts.map +1 -0
  108. package/dist/engine/url-guard.js +129 -0
  109. package/dist/engine/url-guard.js.map +1 -0
  110. package/dist/engine/validator/checks/bare-url-not-autolinked.d.ts +20 -0
  111. package/dist/engine/validator/checks/bare-url-not-autolinked.d.ts.map +1 -0
  112. package/dist/engine/validator/checks/bare-url-not-autolinked.js +54 -0
  113. package/dist/engine/validator/checks/bare-url-not-autolinked.js.map +1 -0
  114. package/dist/engine/validator/checks/broken-footnote-label.d.ts +16 -0
  115. package/dist/engine/validator/checks/broken-footnote-label.d.ts.map +1 -0
  116. package/dist/engine/validator/checks/broken-footnote-label.js +17 -0
  117. package/dist/engine/validator/checks/broken-footnote-label.js.map +1 -0
  118. package/dist/engine/validator/checks/double-encoded-entities.d.ts +18 -0
  119. package/dist/engine/validator/checks/double-encoded-entities.d.ts.map +1 -0
  120. package/dist/engine/validator/checks/double-encoded-entities.js +23 -0
  121. package/dist/engine/validator/checks/double-encoded-entities.js.map +1 -0
  122. package/dist/engine/validator/checks/empty-alt-text.d.ts +14 -0
  123. package/dist/engine/validator/checks/empty-alt-text.d.ts.map +1 -0
  124. package/dist/engine/validator/checks/empty-alt-text.js +23 -0
  125. package/dist/engine/validator/checks/empty-alt-text.js.map +1 -0
  126. package/dist/engine/validator/checks/heading-hierarchy-skip.d.ts +11 -0
  127. package/dist/engine/validator/checks/heading-hierarchy-skip.d.ts.map +1 -0
  128. package/dist/engine/validator/checks/heading-hierarchy-skip.js +20 -0
  129. package/dist/engine/validator/checks/heading-hierarchy-skip.js.map +1 -0
  130. package/dist/engine/validator/checks/html-comment-leak.d.ts +20 -0
  131. package/dist/engine/validator/checks/html-comment-leak.d.ts.map +1 -0
  132. package/dist/engine/validator/checks/html-comment-leak.js +30 -0
  133. package/dist/engine/validator/checks/html-comment-leak.js.map +1 -0
  134. package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.d.ts +12 -0
  135. package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.d.ts.map +1 -0
  136. package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.js +17 -0
  137. package/dist/engine/validator/checks/iframe-missing-dims-and-wrapper.js.map +1 -0
  138. package/dist/engine/validator/checks/invisible-control-chars.d.ts +24 -0
  139. package/dist/engine/validator/checks/invisible-control-chars.d.ts.map +1 -0
  140. package/dist/engine/validator/checks/invisible-control-chars.js +30 -0
  141. package/dist/engine/validator/checks/invisible-control-chars.js.map +1 -0
  142. package/dist/engine/validator/checks/paywall-marker-leak.d.ts +17 -0
  143. package/dist/engine/validator/checks/paywall-marker-leak.d.ts.map +1 -0
  144. package/dist/engine/validator/checks/paywall-marker-leak.js +22 -0
  145. package/dist/engine/validator/checks/paywall-marker-leak.js.map +1 -0
  146. package/dist/engine/validator/checks/raw-block-html.d.ts +28 -0
  147. package/dist/engine/validator/checks/raw-block-html.d.ts.map +1 -0
  148. package/dist/engine/validator/checks/raw-block-html.js +38 -0
  149. package/dist/engine/validator/checks/raw-block-html.js.map +1 -0
  150. package/dist/engine/validator/checks/stale-body-html.d.ts +28 -0
  151. package/dist/engine/validator/checks/stale-body-html.d.ts.map +1 -0
  152. package/dist/engine/validator/checks/stale-body-html.js +15 -0
  153. package/dist/engine/validator/checks/stale-body-html.js.map +1 -0
  154. package/dist/engine/validator/checks/unresolved-footnote-anchor.d.ts +11 -0
  155. package/dist/engine/validator/checks/unresolved-footnote-anchor.d.ts.map +1 -0
  156. package/dist/engine/validator/checks/unresolved-footnote-anchor.js +48 -0
  157. package/dist/engine/validator/checks/unresolved-footnote-anchor.js.map +1 -0
  158. package/dist/engine/validator/checks/word-gdocs-paste-artifacts.d.ts +23 -0
  159. package/dist/engine/validator/checks/word-gdocs-paste-artifacts.d.ts.map +1 -0
  160. package/dist/engine/validator/checks/word-gdocs-paste-artifacts.js +47 -0
  161. package/dist/engine/validator/checks/word-gdocs-paste-artifacts.js.map +1 -0
  162. package/dist/engine/validator/index.d.ts +75 -0
  163. package/dist/engine/validator/index.d.ts.map +1 -0
  164. package/dist/engine/validator/index.js +313 -0
  165. package/dist/engine/validator/index.js.map +1 -0
  166. package/dist/engine/validator/scan.d.ts +28 -0
  167. package/dist/engine/validator/scan.d.ts.map +1 -0
  168. package/dist/engine/validator/scan.js +97 -0
  169. package/dist/engine/validator/scan.js.map +1 -0
  170. package/dist/engine/validator/types.d.ts +50 -0
  171. package/dist/engine/validator/types.d.ts.map +1 -0
  172. package/dist/engine/validator/types.js +51 -0
  173. package/dist/engine/validator/types.js.map +1 -0
  174. package/dist/engine/webhook-signer.d.ts +39 -0
  175. package/dist/engine/webhook-signer.d.ts.map +1 -0
  176. package/dist/engine/webhook-signer.js +117 -0
  177. package/dist/engine/webhook-signer.js.map +1 -0
  178. package/dist/engine/webhooks.d.ts +75 -0
  179. package/dist/engine/webhooks.d.ts.map +1 -0
  180. package/dist/engine/webhooks.js +139 -0
  181. package/dist/engine/webhooks.js.map +1 -0
  182. package/dist/index.d.ts +5 -0
  183. package/dist/index.d.ts.map +1 -0
  184. package/dist/index.js +40 -0
  185. package/dist/index.js.map +1 -0
  186. package/dist/integration/index.d.ts +6 -0
  187. package/dist/integration/index.d.ts.map +1 -0
  188. package/dist/integration/index.js +294 -0
  189. package/dist/integration/index.js.map +1 -0
  190. package/dist/integration/options.d.ts +105 -0
  191. package/dist/integration/options.d.ts.map +1 -0
  192. package/dist/integration/options.js +25 -0
  193. package/dist/integration/options.js.map +1 -0
  194. package/dist/integration/vite-plugin.d.ts +4 -0
  195. package/dist/integration/vite-plugin.d.ts.map +1 -0
  196. package/dist/integration/vite-plugin.js +37 -0
  197. package/dist/integration/vite-plugin.js.map +1 -0
  198. package/dist/providers/index.d.ts +3 -0
  199. package/dist/providers/index.d.ts.map +1 -0
  200. package/dist/providers/index.js +3 -0
  201. package/dist/providers/index.js.map +1 -0
  202. package/dist/providers/null.d.ts +9 -0
  203. package/dist/providers/null.d.ts.map +1 -0
  204. package/dist/providers/null.js +144 -0
  205. package/dist/providers/null.js.map +1 -0
  206. package/dist/providers/types.d.ts +277 -0
  207. package/dist/providers/types.d.ts.map +1 -0
  208. package/dist/providers/types.js +2 -0
  209. package/dist/providers/types.js.map +1 -0
  210. package/dist/routes/ai.d.ts +25 -0
  211. package/dist/routes/ai.d.ts.map +1 -0
  212. package/dist/routes/ai.js +381 -0
  213. package/dist/routes/ai.js.map +1 -0
  214. package/dist/routes/analytics.d.ts +15 -0
  215. package/dist/routes/analytics.d.ts.map +1 -0
  216. package/dist/routes/analytics.js +61 -0
  217. package/dist/routes/analytics.js.map +1 -0
  218. package/dist/routes/api-keys.d.ts +13 -0
  219. package/dist/routes/api-keys.d.ts.map +1 -0
  220. package/dist/routes/api-keys.js +109 -0
  221. package/dist/routes/api-keys.js.map +1 -0
  222. package/dist/routes/authors.d.ts +19 -0
  223. package/dist/routes/authors.d.ts.map +1 -0
  224. package/dist/routes/authors.js +202 -0
  225. package/dist/routes/authors.js.map +1 -0
  226. package/dist/routes/authz-matrix.d.ts +78 -0
  227. package/dist/routes/authz-matrix.d.ts.map +1 -0
  228. package/dist/routes/authz-matrix.js +170 -0
  229. package/dist/routes/authz-matrix.js.map +1 -0
  230. package/dist/routes/calendar.d.ts +19 -0
  231. package/dist/routes/calendar.d.ts.map +1 -0
  232. package/dist/routes/calendar.js +89 -0
  233. package/dist/routes/calendar.js.map +1 -0
  234. package/dist/routes/config.d.ts +70 -0
  235. package/dist/routes/config.d.ts.map +1 -0
  236. package/dist/routes/config.js +23 -0
  237. package/dist/routes/config.js.map +1 -0
  238. package/dist/routes/content-insights.d.ts +18 -0
  239. package/dist/routes/content-insights.d.ts.map +1 -0
  240. package/dist/routes/content-insights.js +137 -0
  241. package/dist/routes/content-insights.js.map +1 -0
  242. package/dist/routes/content.d.ts +145 -0
  243. package/dist/routes/content.d.ts.map +1 -0
  244. package/dist/routes/content.js +1374 -0
  245. package/dist/routes/content.js.map +1 -0
  246. package/dist/routes/context.d.ts +104 -0
  247. package/dist/routes/context.d.ts.map +1 -0
  248. package/dist/routes/context.js +26 -0
  249. package/dist/routes/context.js.map +1 -0
  250. package/dist/routes/cron.d.ts +8 -0
  251. package/dist/routes/cron.d.ts.map +1 -0
  252. package/dist/routes/cron.js +20 -0
  253. package/dist/routes/cron.js.map +1 -0
  254. package/dist/routes/dashboard.d.ts +12 -0
  255. package/dist/routes/dashboard.d.ts.map +1 -0
  256. package/dist/routes/dashboard.js +113 -0
  257. package/dist/routes/dashboard.js.map +1 -0
  258. package/dist/routes/imports.d.ts +10 -0
  259. package/dist/routes/imports.d.ts.map +1 -0
  260. package/dist/routes/imports.js +149 -0
  261. package/dist/routes/imports.js.map +1 -0
  262. package/dist/routes/index.d.ts +75 -0
  263. package/dist/routes/index.d.ts.map +1 -0
  264. package/dist/routes/index.js +141 -0
  265. package/dist/routes/index.js.map +1 -0
  266. package/dist/routes/media-lib.d.ts +75 -0
  267. package/dist/routes/media-lib.d.ts.map +1 -0
  268. package/dist/routes/media-lib.js +305 -0
  269. package/dist/routes/media-lib.js.map +1 -0
  270. package/dist/routes/media.d.ts +32 -0
  271. package/dist/routes/media.d.ts.map +1 -0
  272. package/dist/routes/media.js +756 -0
  273. package/dist/routes/media.js.map +1 -0
  274. package/dist/routes/preview.d.ts +19 -0
  275. package/dist/routes/preview.d.ts.map +1 -0
  276. package/dist/routes/preview.js +150 -0
  277. package/dist/routes/preview.js.map +1 -0
  278. package/dist/routes/rbac-invites.d.ts +31 -0
  279. package/dist/routes/rbac-invites.d.ts.map +1 -0
  280. package/dist/routes/rbac-invites.js +174 -0
  281. package/dist/routes/rbac-invites.js.map +1 -0
  282. package/dist/routes/rbac.d.ts +12 -0
  283. package/dist/routes/rbac.d.ts.map +1 -0
  284. package/dist/routes/rbac.js +126 -0
  285. package/dist/routes/rbac.js.map +1 -0
  286. package/dist/routes/shell.d.ts +22 -0
  287. package/dist/routes/shell.d.ts.map +1 -0
  288. package/dist/routes/shell.js +123 -0
  289. package/dist/routes/shell.js.map +1 -0
  290. package/dist/routes/subscriptions.d.ts +21 -0
  291. package/dist/routes/subscriptions.d.ts.map +1 -0
  292. package/dist/routes/subscriptions.js +127 -0
  293. package/dist/routes/subscriptions.js.map +1 -0
  294. package/dist/routes/tags.d.ts +23 -0
  295. package/dist/routes/tags.d.ts.map +1 -0
  296. package/dist/routes/tags.js +68 -0
  297. package/dist/routes/tags.js.map +1 -0
  298. package/dist/routes/topics.d.ts +12 -0
  299. package/dist/routes/topics.d.ts.map +1 -0
  300. package/dist/routes/topics.js +49 -0
  301. package/dist/routes/topics.js.map +1 -0
  302. package/dist/routes/webhooks.d.ts +31 -0
  303. package/dist/routes/webhooks.d.ts.map +1 -0
  304. package/dist/routes/webhooks.js +173 -0
  305. package/dist/routes/webhooks.js.map +1 -0
  306. package/dist/schema/index.d.ts +4 -0
  307. package/dist/schema/index.d.ts.map +1 -0
  308. package/dist/schema/index.js +6 -0
  309. package/dist/schema/index.js.map +1 -0
  310. package/dist/schema/insights-ingest.d.ts +959 -0
  311. package/dist/schema/insights-ingest.d.ts.map +1 -0
  312. package/dist/schema/insights-ingest.js +112 -0
  313. package/dist/schema/insights-ingest.js.map +1 -0
  314. package/dist/schema/migrations.d.ts +63 -0
  315. package/dist/schema/migrations.d.ts.map +1 -0
  316. package/dist/schema/migrations.js +589 -0
  317. package/dist/schema/migrations.js.map +1 -0
  318. package/dist/schema/tables.d.ts +11 -0
  319. package/dist/schema/tables.d.ts.map +1 -0
  320. package/dist/schema/tables.js +56 -0
  321. package/dist/schema/tables.js.map +1 -0
  322. package/dist/schema/types.d.ts +476 -0
  323. package/dist/schema/types.d.ts.map +1 -0
  324. package/dist/schema/types.js +37 -0
  325. package/dist/schema/types.js.map +1 -0
  326. package/dist/ui/api/_authz.d.ts +6 -0
  327. package/dist/ui/api/_authz.d.ts.map +1 -0
  328. package/dist/ui/api/_authz.js +74 -0
  329. package/dist/ui/api/_authz.js.map +1 -0
  330. package/dist/ui/api/_content-config.d.ts +22 -0
  331. package/dist/ui/api/_content-config.d.ts.map +1 -0
  332. package/dist/ui/api/_content-config.js +50 -0
  333. package/dist/ui/api/_content-config.js.map +1 -0
  334. package/dist/ui/api/activity.d.ts +3 -0
  335. package/dist/ui/api/activity.d.ts.map +1 -0
  336. package/dist/ui/api/activity.js +28 -0
  337. package/dist/ui/api/activity.js.map +1 -0
  338. package/dist/ui/api/analytics.d.ts +3 -0
  339. package/dist/ui/api/analytics.d.ts.map +1 -0
  340. package/dist/ui/api/analytics.js +36 -0
  341. package/dist/ui/api/analytics.js.map +1 -0
  342. package/dist/ui/api/authors/[id].d.ts +4 -0
  343. package/dist/ui/api/authors/[id].d.ts.map +1 -0
  344. package/dist/ui/api/authors/[id].js +17 -0
  345. package/dist/ui/api/authors/[id].js.map +1 -0
  346. package/dist/ui/api/authors.d.ts +4 -0
  347. package/dist/ui/api/authors.d.ts.map +1 -0
  348. package/dist/ui/api/authors.js +12 -0
  349. package/dist/ui/api/authors.js.map +1 -0
  350. package/dist/ui/api/calendar.d.ts +3 -0
  351. package/dist/ui/api/calendar.d.ts.map +1 -0
  352. package/dist/ui/api/calendar.js +16 -0
  353. package/dist/ui/api/calendar.js.map +1 -0
  354. package/dist/ui/api/content/[id]/ai/headlines.d.ts +3 -0
  355. package/dist/ui/api/content/[id]/ai/headlines.d.ts.map +1 -0
  356. package/dist/ui/api/content/[id]/ai/headlines.js +7 -0
  357. package/dist/ui/api/content/[id]/ai/headlines.js.map +1 -0
  358. package/dist/ui/api/content/[id]/ai/meta-description.d.ts +3 -0
  359. package/dist/ui/api/content/[id]/ai/meta-description.d.ts.map +1 -0
  360. package/dist/ui/api/content/[id]/ai/meta-description.js +6 -0
  361. package/dist/ui/api/content/[id]/ai/meta-description.js.map +1 -0
  362. package/dist/ui/api/content/[id]/ai/og-image.d.ts +3 -0
  363. package/dist/ui/api/content/[id]/ai/og-image.d.ts.map +1 -0
  364. package/dist/ui/api/content/[id]/ai/og-image.js +7 -0
  365. package/dist/ui/api/content/[id]/ai/og-image.js.map +1 -0
  366. package/dist/ui/api/content/[id]/ai/proofread.d.ts +3 -0
  367. package/dist/ui/api/content/[id]/ai/proofread.d.ts.map +1 -0
  368. package/dist/ui/api/content/[id]/ai/proofread.js +7 -0
  369. package/dist/ui/api/content/[id]/ai/proofread.js.map +1 -0
  370. package/dist/ui/api/content/[id]/ai/takeaways.d.ts +3 -0
  371. package/dist/ui/api/content/[id]/ai/takeaways.d.ts.map +1 -0
  372. package/dist/ui/api/content/[id]/ai/takeaways.js +6 -0
  373. package/dist/ui/api/content/[id]/ai/takeaways.js.map +1 -0
  374. package/dist/ui/api/content/[id]/contributors.d.ts +4 -0
  375. package/dist/ui/api/content/[id]/contributors.d.ts.map +1 -0
  376. package/dist/ui/api/content/[id]/contributors.js +8 -0
  377. package/dist/ui/api/content/[id]/contributors.js.map +1 -0
  378. package/dist/ui/api/content/[id]/preview-token.d.ts +3 -0
  379. package/dist/ui/api/content/[id]/preview-token.d.ts.map +1 -0
  380. package/dist/ui/api/content/[id]/preview-token.js +16 -0
  381. package/dist/ui/api/content/[id]/preview-token.js.map +1 -0
  382. package/dist/ui/api/content/[id]/revisions/[rev]/restore.d.ts +3 -0
  383. package/dist/ui/api/content/[id]/revisions/[rev]/restore.d.ts.map +1 -0
  384. package/dist/ui/api/content/[id]/revisions/[rev]/restore.js +7 -0
  385. package/dist/ui/api/content/[id]/revisions/[rev]/restore.js.map +1 -0
  386. package/dist/ui/api/content/[id]/revisions/[rev].d.ts +3 -0
  387. package/dist/ui/api/content/[id]/revisions/[rev].d.ts.map +1 -0
  388. package/dist/ui/api/content/[id]/revisions/[rev].js +6 -0
  389. package/dist/ui/api/content/[id]/revisions/[rev].js.map +1 -0
  390. package/dist/ui/api/content/[id]/revisions.d.ts +3 -0
  391. package/dist/ui/api/content/[id]/revisions.d.ts.map +1 -0
  392. package/dist/ui/api/content/[id]/revisions.js +6 -0
  393. package/dist/ui/api/content/[id]/revisions.js.map +1 -0
  394. package/dist/ui/api/content/[id]/seo-score.d.ts +3 -0
  395. package/dist/ui/api/content/[id]/seo-score.d.ts.map +1 -0
  396. package/dist/ui/api/content/[id]/seo-score.js +7 -0
  397. package/dist/ui/api/content/[id]/seo-score.js.map +1 -0
  398. package/dist/ui/api/content/[id].d.ts +5 -0
  399. package/dist/ui/api/content/[id].d.ts.map +1 -0
  400. package/dist/ui/api/content/[id].js +17 -0
  401. package/dist/ui/api/content/[id].js.map +1 -0
  402. package/dist/ui/api/content/bulk.d.ts +3 -0
  403. package/dist/ui/api/content/bulk.d.ts.map +1 -0
  404. package/dist/ui/api/content/bulk.js +7 -0
  405. package/dist/ui/api/content/bulk.js.map +1 -0
  406. package/dist/ui/api/content/counts.d.ts +3 -0
  407. package/dist/ui/api/content/counts.d.ts.map +1 -0
  408. package/dist/ui/api/content/counts.js +8 -0
  409. package/dist/ui/api/content/counts.js.map +1 -0
  410. package/dist/ui/api/content/foundry-callback.d.ts +3 -0
  411. package/dist/ui/api/content/foundry-callback.d.ts.map +1 -0
  412. package/dist/ui/api/content/foundry-callback.js +8 -0
  413. package/dist/ui/api/content/foundry-callback.js.map +1 -0
  414. package/dist/ui/api/content/import/confirm.d.ts +3 -0
  415. package/dist/ui/api/content/import/confirm.d.ts.map +1 -0
  416. package/dist/ui/api/content/import/confirm.js +11 -0
  417. package/dist/ui/api/content/import/confirm.js.map +1 -0
  418. package/dist/ui/api/content/import/parse.d.ts +3 -0
  419. package/dist/ui/api/content/import/parse.d.ts.map +1 -0
  420. package/dist/ui/api/content/import/parse.js +11 -0
  421. package/dist/ui/api/content/import/parse.js.map +1 -0
  422. package/dist/ui/api/content/insights-ingest.d.ts +3 -0
  423. package/dist/ui/api/content/insights-ingest.d.ts.map +1 -0
  424. package/dist/ui/api/content/insights-ingest.js +15 -0
  425. package/dist/ui/api/content/insights-ingest.js.map +1 -0
  426. package/dist/ui/api/content-insights/dismiss.d.ts +3 -0
  427. package/dist/ui/api/content-insights/dismiss.d.ts.map +1 -0
  428. package/dist/ui/api/content-insights/dismiss.js +16 -0
  429. package/dist/ui/api/content-insights/dismiss.js.map +1 -0
  430. package/dist/ui/api/content-insights/index.d.ts +3 -0
  431. package/dist/ui/api/content-insights/index.d.ts.map +1 -0
  432. package/dist/ui/api/content-insights/index.js +12 -0
  433. package/dist/ui/api/content-insights/index.js.map +1 -0
  434. package/dist/ui/api/content-insights/undismiss.d.ts +3 -0
  435. package/dist/ui/api/content-insights/undismiss.d.ts.map +1 -0
  436. package/dist/ui/api/content-insights/undismiss.js +16 -0
  437. package/dist/ui/api/content-insights/undismiss.js.map +1 -0
  438. package/dist/ui/api/content.d.ts +4 -0
  439. package/dist/ui/api/content.d.ts.map +1 -0
  440. package/dist/ui/api/content.js +16 -0
  441. package/dist/ui/api/content.js.map +1 -0
  442. package/dist/ui/api/dashboard.d.ts +3 -0
  443. package/dist/ui/api/dashboard.d.ts.map +1 -0
  444. package/dist/ui/api/dashboard.js +22 -0
  445. package/dist/ui/api/dashboard.js.map +1 -0
  446. package/dist/ui/api/me.d.ts +3 -0
  447. package/dist/ui/api/me.d.ts.map +1 -0
  448. package/dist/ui/api/me.js +18 -0
  449. package/dist/ui/api/me.js.map +1 -0
  450. package/dist/ui/api/media/[id].d.ts +3 -0
  451. package/dist/ui/api/media/[id].d.ts.map +1 -0
  452. package/dist/ui/api/media/[id].js +17 -0
  453. package/dist/ui/api/media/[id].js.map +1 -0
  454. package/dist/ui/api/media/images.d.ts +3 -0
  455. package/dist/ui/api/media/images.d.ts.map +1 -0
  456. package/dist/ui/api/media/images.js +6 -0
  457. package/dist/ui/api/media/images.js.map +1 -0
  458. package/dist/ui/api/media/library/[id].d.ts +3 -0
  459. package/dist/ui/api/media/library/[id].d.ts.map +1 -0
  460. package/dist/ui/api/media/library/[id].js +6 -0
  461. package/dist/ui/api/media/library/[id].js.map +1 -0
  462. package/dist/ui/api/media/library.d.ts +3 -0
  463. package/dist/ui/api/media/library.d.ts.map +1 -0
  464. package/dist/ui/api/media/library.js +17 -0
  465. package/dist/ui/api/media/library.js.map +1 -0
  466. package/dist/ui/api/media/podcast/abort.d.ts +3 -0
  467. package/dist/ui/api/media/podcast/abort.d.ts.map +1 -0
  468. package/dist/ui/api/media/podcast/abort.js +4 -0
  469. package/dist/ui/api/media/podcast/abort.js.map +1 -0
  470. package/dist/ui/api/media/podcast/complete.d.ts +3 -0
  471. package/dist/ui/api/media/podcast/complete.d.ts.map +1 -0
  472. package/dist/ui/api/media/podcast/complete.js +4 -0
  473. package/dist/ui/api/media/podcast/complete.js.map +1 -0
  474. package/dist/ui/api/media/podcast/init.d.ts +3 -0
  475. package/dist/ui/api/media/podcast/init.d.ts.map +1 -0
  476. package/dist/ui/api/media/podcast/init.js +4 -0
  477. package/dist/ui/api/media/podcast/init.js.map +1 -0
  478. package/dist/ui/api/media/podcast/part.d.ts +3 -0
  479. package/dist/ui/api/media/podcast/part.d.ts.map +1 -0
  480. package/dist/ui/api/media/podcast/part.js +4 -0
  481. package/dist/ui/api/media/podcast/part.js.map +1 -0
  482. package/dist/ui/api/media/podcast.d.ts +3 -0
  483. package/dist/ui/api/media/podcast.d.ts.map +1 -0
  484. package/dist/ui/api/media/podcast.js +6 -0
  485. package/dist/ui/api/media/podcast.js.map +1 -0
  486. package/dist/ui/api/media/videos/abort.d.ts +3 -0
  487. package/dist/ui/api/media/videos/abort.d.ts.map +1 -0
  488. package/dist/ui/api/media/videos/abort.js +6 -0
  489. package/dist/ui/api/media/videos/abort.js.map +1 -0
  490. package/dist/ui/api/media/videos/complete.d.ts +3 -0
  491. package/dist/ui/api/media/videos/complete.d.ts.map +1 -0
  492. package/dist/ui/api/media/videos/complete.js +6 -0
  493. package/dist/ui/api/media/videos/complete.js.map +1 -0
  494. package/dist/ui/api/media/videos/init.d.ts +3 -0
  495. package/dist/ui/api/media/videos/init.d.ts.map +1 -0
  496. package/dist/ui/api/media/videos/init.js +6 -0
  497. package/dist/ui/api/media/videos/init.js.map +1 -0
  498. package/dist/ui/api/media/videos/part.d.ts +3 -0
  499. package/dist/ui/api/media/videos/part.d.ts.map +1 -0
  500. package/dist/ui/api/media/videos/part.js +6 -0
  501. package/dist/ui/api/media/videos/part.js.map +1 -0
  502. package/dist/ui/api/notifications.d.ts +4 -0
  503. package/dist/ui/api/notifications.d.ts.map +1 -0
  504. package/dist/ui/api/notifications.js +20 -0
  505. package/dist/ui/api/notifications.js.map +1 -0
  506. package/dist/ui/api/search.d.ts +3 -0
  507. package/dist/ui/api/search.d.ts.map +1 -0
  508. package/dist/ui/api/search.js +18 -0
  509. package/dist/ui/api/search.js.map +1 -0
  510. package/dist/ui/api/settings/api-keys/[id].d.ts +3 -0
  511. package/dist/ui/api/settings/api-keys/[id].d.ts.map +1 -0
  512. package/dist/ui/api/settings/api-keys/[id].js +22 -0
  513. package/dist/ui/api/settings/api-keys/[id].js.map +1 -0
  514. package/dist/ui/api/settings/api-keys.d.ts +4 -0
  515. package/dist/ui/api/settings/api-keys.d.ts.map +1 -0
  516. package/dist/ui/api/settings/api-keys.js +19 -0
  517. package/dist/ui/api/settings/api-keys.js.map +1 -0
  518. package/dist/ui/api/settings/domains.d.ts +3 -0
  519. package/dist/ui/api/settings/domains.d.ts.map +1 -0
  520. package/dist/ui/api/settings/domains.js +32 -0
  521. package/dist/ui/api/settings/domains.js.map +1 -0
  522. package/dist/ui/api/settings/integrations.d.ts +3 -0
  523. package/dist/ui/api/settings/integrations.d.ts.map +1 -0
  524. package/dist/ui/api/settings/integrations.js +32 -0
  525. package/dist/ui/api/settings/integrations.js.map +1 -0
  526. package/dist/ui/api/settings/members/[userId].d.ts +4 -0
  527. package/dist/ui/api/settings/members/[userId].d.ts.map +1 -0
  528. package/dist/ui/api/settings/members/[userId].js +26 -0
  529. package/dist/ui/api/settings/members/[userId].js.map +1 -0
  530. package/dist/ui/api/settings/members/invite.d.ts +3 -0
  531. package/dist/ui/api/settings/members/invite.d.ts.map +1 -0
  532. package/dist/ui/api/settings/members/invite.js +21 -0
  533. package/dist/ui/api/settings/members/invite.js.map +1 -0
  534. package/dist/ui/api/settings/members.d.ts +3 -0
  535. package/dist/ui/api/settings/members.d.ts.map +1 -0
  536. package/dist/ui/api/settings/members.js +17 -0
  537. package/dist/ui/api/settings/members.js.map +1 -0
  538. package/dist/ui/api/settings/webhooks/[id]/test.d.ts +3 -0
  539. package/dist/ui/api/settings/webhooks/[id]/test.d.ts.map +1 -0
  540. package/dist/ui/api/settings/webhooks/[id]/test.js +24 -0
  541. package/dist/ui/api/settings/webhooks/[id]/test.js.map +1 -0
  542. package/dist/ui/api/settings/webhooks/[id].d.ts +3 -0
  543. package/dist/ui/api/settings/webhooks/[id].d.ts.map +1 -0
  544. package/dist/ui/api/settings/webhooks/[id].js +23 -0
  545. package/dist/ui/api/settings/webhooks/[id].js.map +1 -0
  546. package/dist/ui/api/settings/webhooks.d.ts +4 -0
  547. package/dist/ui/api/settings/webhooks.d.ts.map +1 -0
  548. package/dist/ui/api/settings/webhooks.js +21 -0
  549. package/dist/ui/api/settings/webhooks.js.map +1 -0
  550. package/dist/ui/api/subscriptions.d.ts +4 -0
  551. package/dist/ui/api/subscriptions.d.ts.map +1 -0
  552. package/dist/ui/api/subscriptions.js +47 -0
  553. package/dist/ui/api/subscriptions.js.map +1 -0
  554. package/dist/ui/api/tags/[id].d.ts +4 -0
  555. package/dist/ui/api/tags/[id].d.ts.map +1 -0
  556. package/dist/ui/api/tags/[id].js +18 -0
  557. package/dist/ui/api/tags/[id].js.map +1 -0
  558. package/dist/ui/api/tags/index.d.ts +4 -0
  559. package/dist/ui/api/tags/index.d.ts.map +1 -0
  560. package/dist/ui/api/tags/index.js +13 -0
  561. package/dist/ui/api/tags/index.js.map +1 -0
  562. package/dist/ui/api/topics/[id].d.ts +3 -0
  563. package/dist/ui/api/topics/[id].d.ts.map +1 -0
  564. package/dist/ui/api/topics/[id].js +15 -0
  565. package/dist/ui/api/topics/[id].js.map +1 -0
  566. package/dist/ui/api/topics/index.d.ts +4 -0
  567. package/dist/ui/api/topics/index.d.ts.map +1 -0
  568. package/dist/ui/api/topics/index.js +12 -0
  569. package/dist/ui/api/topics/index.js.map +1 -0
  570. package/dist/ui/api/workspace-settings.d.ts +4 -0
  571. package/dist/ui/api/workspace-settings.d.ts.map +1 -0
  572. package/dist/ui/api/workspace-settings.js +20 -0
  573. package/dist/ui/api/workspace-settings.js.map +1 -0
  574. package/dist/ui/client/boot-state.d.ts +15 -0
  575. package/dist/ui/client/boot-state.d.ts.map +1 -0
  576. package/dist/ui/client/boot-state.js +36 -0
  577. package/dist/ui/client/boot-state.js.map +1 -0
  578. package/dist/ui/client/mount.d.ts +3 -0
  579. package/dist/ui/client/mount.d.ts.map +1 -0
  580. package/dist/ui/client/mount.js +37 -0
  581. package/dist/ui/client/mount.js.map +1 -0
  582. package/dist/ui/commands.d.ts +23 -0
  583. package/dist/ui/commands.d.ts.map +1 -0
  584. package/dist/ui/commands.js +48 -0
  585. package/dist/ui/commands.js.map +1 -0
  586. package/dist/ui/components/CmsApp.d.ts +16 -0
  587. package/dist/ui/components/CmsApp.d.ts.map +1 -0
  588. package/dist/ui/components/CmsApp.js +74 -0
  589. package/dist/ui/components/CmsApp.js.map +1 -0
  590. package/dist/ui/components/CommandPalette.d.ts +7 -0
  591. package/dist/ui/components/CommandPalette.d.ts.map +1 -0
  592. package/dist/ui/components/CommandPalette.js +61 -0
  593. package/dist/ui/components/CommandPalette.js.map +1 -0
  594. package/dist/ui/components/NoAccessScreen.d.ts +2 -0
  595. package/dist/ui/components/NoAccessScreen.d.ts.map +1 -0
  596. package/dist/ui/components/NoAccessScreen.js +42 -0
  597. package/dist/ui/components/NoAccessScreen.js.map +1 -0
  598. package/dist/ui/components/ShareModal.d.ts +27 -0
  599. package/dist/ui/components/ShareModal.d.ts.map +1 -0
  600. package/dist/ui/components/ShareModal.js +208 -0
  601. package/dist/ui/components/ShareModal.js.map +1 -0
  602. package/dist/ui/components/SharePickers.d.ts +39 -0
  603. package/dist/ui/components/SharePickers.d.ts.map +1 -0
  604. package/dist/ui/components/SharePickers.js +352 -0
  605. package/dist/ui/components/SharePickers.js.map +1 -0
  606. package/dist/ui/components/ShareStatsPanel.d.ts +22 -0
  607. package/dist/ui/components/ShareStatsPanel.d.ts.map +1 -0
  608. package/dist/ui/components/ShareStatsPanel.js +317 -0
  609. package/dist/ui/components/ShareStatsPanel.js.map +1 -0
  610. package/dist/ui/components/Sidebar.d.ts +7 -0
  611. package/dist/ui/components/Sidebar.d.ts.map +1 -0
  612. package/dist/ui/components/Sidebar.js +20 -0
  613. package/dist/ui/components/Sidebar.js.map +1 -0
  614. package/dist/ui/components/SiteSwitcher.d.ts +4 -0
  615. package/dist/ui/components/SiteSwitcher.d.ts.map +1 -0
  616. package/dist/ui/components/SiteSwitcher.js +35 -0
  617. package/dist/ui/components/SiteSwitcher.js.map +1 -0
  618. package/dist/ui/components/Topbar.d.ts +9 -0
  619. package/dist/ui/components/Topbar.d.ts.map +1 -0
  620. package/dist/ui/components/Topbar.js +20 -0
  621. package/dist/ui/components/Topbar.js.map +1 -0
  622. package/dist/ui/editor/AiAssistPanel.d.ts +8 -0
  623. package/dist/ui/editor/AiAssistPanel.d.ts.map +1 -0
  624. package/dist/ui/editor/AiAssistPanel.js +221 -0
  625. package/dist/ui/editor/AiAssistPanel.js.map +1 -0
  626. package/dist/ui/editor/ContentForm.d.ts +46 -0
  627. package/dist/ui/editor/ContentForm.d.ts.map +1 -0
  628. package/dist/ui/editor/ContentForm.js +821 -0
  629. package/dist/ui/editor/ContentForm.js.map +1 -0
  630. package/dist/ui/editor/Rte.d.ts +16 -0
  631. package/dist/ui/editor/Rte.d.ts.map +1 -0
  632. package/dist/ui/editor/Rte.js +272 -0
  633. package/dist/ui/editor/Rte.js.map +1 -0
  634. package/dist/ui/editor/ai-assist.d.ts +43 -0
  635. package/dist/ui/editor/ai-assist.d.ts.map +1 -0
  636. package/dist/ui/editor/ai-assist.js +114 -0
  637. package/dist/ui/editor/ai-assist.js.map +1 -0
  638. package/dist/ui/editor/autosave.d.ts +18 -0
  639. package/dist/ui/editor/autosave.d.ts.map +1 -0
  640. package/dist/ui/editor/autosave.js +23 -0
  641. package/dist/ui/editor/autosave.js.map +1 -0
  642. package/dist/ui/editor/content-payload.d.ts +19 -0
  643. package/dist/ui/editor/content-payload.d.ts.map +1 -0
  644. package/dist/ui/editor/content-payload.js +97 -0
  645. package/dist/ui/editor/content-payload.js.map +1 -0
  646. package/dist/ui/editor/editor-media-upload.d.ts +6 -0
  647. package/dist/ui/editor/editor-media-upload.d.ts.map +1 -0
  648. package/dist/ui/editor/editor-media-upload.js +20 -0
  649. package/dist/ui/editor/editor-media-upload.js.map +1 -0
  650. package/dist/ui/editor/serialize.d.ts +6 -0
  651. package/dist/ui/editor/serialize.d.ts.map +1 -0
  652. package/dist/ui/editor/serialize.js +479 -0
  653. package/dist/ui/editor/serialize.js.map +1 -0
  654. package/dist/ui/editor/tweet-embed.d.ts +4 -0
  655. package/dist/ui/editor/tweet-embed.d.ts.map +1 -0
  656. package/dist/ui/editor/tweet-embed.js +49 -0
  657. package/dist/ui/editor/tweet-embed.js.map +1 -0
  658. package/dist/ui/hash-router.d.ts +5 -0
  659. package/dist/ui/hash-router.d.ts.map +1 -0
  660. package/dist/ui/hash-router.js +25 -0
  661. package/dist/ui/hash-router.js.map +1 -0
  662. package/dist/ui/icons.d.ts +32 -0
  663. package/dist/ui/icons.d.ts.map +1 -0
  664. package/dist/ui/icons.js +86 -0
  665. package/dist/ui/icons.js.map +1 -0
  666. package/dist/ui/inspector/Field.d.ts +12 -0
  667. package/dist/ui/inspector/Field.d.ts.map +1 -0
  668. package/dist/ui/inspector/Field.js +8 -0
  669. package/dist/ui/inspector/Field.js.map +1 -0
  670. package/dist/ui/inspector/FoundryTab.d.ts +9 -0
  671. package/dist/ui/inspector/FoundryTab.d.ts.map +1 -0
  672. package/dist/ui/inspector/FoundryTab.js +362 -0
  673. package/dist/ui/inspector/FoundryTab.js.map +1 -0
  674. package/dist/ui/inspector/HistoryTab.d.ts +7 -0
  675. package/dist/ui/inspector/HistoryTab.d.ts.map +1 -0
  676. package/dist/ui/inspector/HistoryTab.js +289 -0
  677. package/dist/ui/inspector/HistoryTab.js.map +1 -0
  678. package/dist/ui/inspector/Inspector.d.ts +13 -0
  679. package/dist/ui/inspector/Inspector.d.ts.map +1 -0
  680. package/dist/ui/inspector/Inspector.js +163 -0
  681. package/dist/ui/inspector/Inspector.js.map +1 -0
  682. package/dist/ui/inspector/OrganizeTab.d.ts +15 -0
  683. package/dist/ui/inspector/OrganizeTab.d.ts.map +1 -0
  684. package/dist/ui/inspector/OrganizeTab.js +319 -0
  685. package/dist/ui/inspector/OrganizeTab.js.map +1 -0
  686. package/dist/ui/inspector/PublishTab.d.ts +18 -0
  687. package/dist/ui/inspector/PublishTab.d.ts.map +1 -0
  688. package/dist/ui/inspector/PublishTab.js +339 -0
  689. package/dist/ui/inspector/PublishTab.js.map +1 -0
  690. package/dist/ui/inspector/Section.d.ts +10 -0
  691. package/dist/ui/inspector/Section.d.ts.map +1 -0
  692. package/dist/ui/inspector/Section.js +40 -0
  693. package/dist/ui/inspector/Section.js.map +1 -0
  694. package/dist/ui/inspector/SeoTab.d.ts +19 -0
  695. package/dist/ui/inspector/SeoTab.d.ts.map +1 -0
  696. package/dist/ui/inspector/SeoTab.js +328 -0
  697. package/dist/ui/inspector/SeoTab.js.map +1 -0
  698. package/dist/ui/inspector/foundry-stages.d.ts +36 -0
  699. package/dist/ui/inspector/foundry-stages.d.ts.map +1 -0
  700. package/dist/ui/inspector/foundry-stages.js +101 -0
  701. package/dist/ui/inspector/foundry-stages.js.map +1 -0
  702. package/dist/ui/inspector/inspector-data.d.ts +80 -0
  703. package/dist/ui/inspector/inspector-data.d.ts.map +1 -0
  704. package/dist/ui/inspector/inspector-data.js +172 -0
  705. package/dist/ui/inspector/inspector-data.js.map +1 -0
  706. package/dist/ui/inspector/organize-data.d.ts +23 -0
  707. package/dist/ui/inspector/organize-data.d.ts.map +1 -0
  708. package/dist/ui/inspector/organize-data.js +28 -0
  709. package/dist/ui/inspector/organize-data.js.map +1 -0
  710. package/dist/ui/inspector/revision-diff.d.ts +49 -0
  711. package/dist/ui/inspector/revision-diff.d.ts.map +1 -0
  712. package/dist/ui/inspector/revision-diff.js +166 -0
  713. package/dist/ui/inspector/revision-diff.js.map +1 -0
  714. package/dist/ui/inspector/seo-helpers.d.ts +37 -0
  715. package/dist/ui/inspector/seo-helpers.d.ts.map +1 -0
  716. package/dist/ui/inspector/seo-helpers.js +37 -0
  717. package/dist/ui/inspector/seo-helpers.js.map +1 -0
  718. package/dist/ui/inspector/tab-visibility.d.ts +14 -0
  719. package/dist/ui/inspector/tab-visibility.d.ts.map +1 -0
  720. package/dist/ui/inspector/tab-visibility.js +28 -0
  721. package/dist/ui/inspector/tab-visibility.js.map +1 -0
  722. package/dist/ui/nav.d.ts +16 -0
  723. package/dist/ui/nav.d.ts.map +1 -0
  724. package/dist/ui/nav.js +33 -0
  725. package/dist/ui/nav.js.map +1 -0
  726. package/dist/ui/pages/admin.astro +32 -0
  727. package/dist/ui/preview/draft-page.d.ts +37 -0
  728. package/dist/ui/preview/draft-page.d.ts.map +1 -0
  729. package/dist/ui/preview/draft-page.js +212 -0
  730. package/dist/ui/preview/draft-page.js.map +1 -0
  731. package/dist/ui/preview/preview-layout.d.ts +23 -0
  732. package/dist/ui/preview/preview-layout.d.ts.map +1 -0
  733. package/dist/ui/preview/preview-layout.js +30 -0
  734. package/dist/ui/preview/preview-layout.js.map +1 -0
  735. package/dist/ui/screens/AnalyticsScreen.d.ts +2 -0
  736. package/dist/ui/screens/AnalyticsScreen.d.ts.map +1 -0
  737. package/dist/ui/screens/AnalyticsScreen.js +408 -0
  738. package/dist/ui/screens/AnalyticsScreen.js.map +1 -0
  739. package/dist/ui/screens/AuthorsScreen.d.ts +2 -0
  740. package/dist/ui/screens/AuthorsScreen.d.ts.map +1 -0
  741. package/dist/ui/screens/AuthorsScreen.js +225 -0
  742. package/dist/ui/screens/AuthorsScreen.js.map +1 -0
  743. package/dist/ui/screens/CalendarScreen.d.ts +6 -0
  744. package/dist/ui/screens/CalendarScreen.d.ts.map +1 -0
  745. package/dist/ui/screens/CalendarScreen.js +327 -0
  746. package/dist/ui/screens/CalendarScreen.js.map +1 -0
  747. package/dist/ui/screens/ContentInsightsScreen.d.ts +2 -0
  748. package/dist/ui/screens/ContentInsightsScreen.d.ts.map +1 -0
  749. package/dist/ui/screens/ContentInsightsScreen.js +129 -0
  750. package/dist/ui/screens/ContentInsightsScreen.js.map +1 -0
  751. package/dist/ui/screens/ContentRoute.d.ts +2 -0
  752. package/dist/ui/screens/ContentRoute.d.ts.map +1 -0
  753. package/dist/ui/screens/ContentRoute.js +32 -0
  754. package/dist/ui/screens/ContentRoute.js.map +1 -0
  755. package/dist/ui/screens/DashboardScreen.d.ts +6 -0
  756. package/dist/ui/screens/DashboardScreen.d.ts.map +1 -0
  757. package/dist/ui/screens/DashboardScreen.js +273 -0
  758. package/dist/ui/screens/DashboardScreen.js.map +1 -0
  759. package/dist/ui/screens/EditorScreen.d.ts +7 -0
  760. package/dist/ui/screens/EditorScreen.d.ts.map +1 -0
  761. package/dist/ui/screens/EditorScreen.js +426 -0
  762. package/dist/ui/screens/EditorScreen.js.map +1 -0
  763. package/dist/ui/screens/LibraryScreen.d.ts +6 -0
  764. package/dist/ui/screens/LibraryScreen.d.ts.map +1 -0
  765. package/dist/ui/screens/LibraryScreen.js +580 -0
  766. package/dist/ui/screens/LibraryScreen.js.map +1 -0
  767. package/dist/ui/screens/MediaScreen.d.ts +2 -0
  768. package/dist/ui/screens/MediaScreen.d.ts.map +1 -0
  769. package/dist/ui/screens/MediaScreen.js +173 -0
  770. package/dist/ui/screens/MediaScreen.js.map +1 -0
  771. package/dist/ui/screens/SettingsScreen.d.ts +4 -0
  772. package/dist/ui/screens/SettingsScreen.d.ts.map +1 -0
  773. package/dist/ui/screens/SettingsScreen.js +751 -0
  774. package/dist/ui/screens/SettingsScreen.js.map +1 -0
  775. package/dist/ui/screens/SocialShareScreen.d.ts +2 -0
  776. package/dist/ui/screens/SocialShareScreen.d.ts.map +1 -0
  777. package/dist/ui/screens/SocialShareScreen.js +224 -0
  778. package/dist/ui/screens/SocialShareScreen.js.map +1 -0
  779. package/dist/ui/screens/SubscriptionsScreen.d.ts +2 -0
  780. package/dist/ui/screens/SubscriptionsScreen.d.ts.map +1 -0
  781. package/dist/ui/screens/SubscriptionsScreen.js +441 -0
  782. package/dist/ui/screens/SubscriptionsScreen.js.map +1 -0
  783. package/dist/ui/screens/TopicsScreen.d.ts +2 -0
  784. package/dist/ui/screens/TopicsScreen.d.ts.map +1 -0
  785. package/dist/ui/screens/TopicsScreen.js +360 -0
  786. package/dist/ui/screens/TopicsScreen.js.map +1 -0
  787. package/dist/ui/screens/analytics-data.d.ts +19 -0
  788. package/dist/ui/screens/analytics-data.d.ts.map +1 -0
  789. package/dist/ui/screens/analytics-data.js +42 -0
  790. package/dist/ui/screens/analytics-data.js.map +1 -0
  791. package/dist/ui/screens/calendar-data.d.ts +45 -0
  792. package/dist/ui/screens/calendar-data.d.ts.map +1 -0
  793. package/dist/ui/screens/calendar-data.js +70 -0
  794. package/dist/ui/screens/calendar-data.js.map +1 -0
  795. package/dist/ui/screens/content-insights-data.d.ts +54 -0
  796. package/dist/ui/screens/content-insights-data.d.ts.map +1 -0
  797. package/dist/ui/screens/content-insights-data.js +82 -0
  798. package/dist/ui/screens/content-insights-data.js.map +1 -0
  799. package/dist/ui/screens/content-view.d.ts +21 -0
  800. package/dist/ui/screens/content-view.d.ts.map +1 -0
  801. package/dist/ui/screens/content-view.js +17 -0
  802. package/dist/ui/screens/content-view.js.map +1 -0
  803. package/dist/ui/screens/library-data.d.ts +76 -0
  804. package/dist/ui/screens/library-data.d.ts.map +1 -0
  805. package/dist/ui/screens/library-data.js +116 -0
  806. package/dist/ui/screens/library-data.js.map +1 -0
  807. package/dist/ui/screens/media-upload.d.ts +19 -0
  808. package/dist/ui/screens/media-upload.d.ts.map +1 -0
  809. package/dist/ui/screens/media-upload.js +187 -0
  810. package/dist/ui/screens/media-upload.js.map +1 -0
  811. package/dist/ui/screens/public-url.d.ts +24 -0
  812. package/dist/ui/screens/public-url.d.ts.map +1 -0
  813. package/dist/ui/screens/public-url.js +74 -0
  814. package/dist/ui/screens/public-url.js.map +1 -0
  815. package/dist/ui/screens/registry.d.ts +3 -0
  816. package/dist/ui/screens/registry.d.ts.map +1 -0
  817. package/dist/ui/screens/registry.js +38 -0
  818. package/dist/ui/screens/registry.js.map +1 -0
  819. package/dist/ui/screens/render-state.d.ts +105 -0
  820. package/dist/ui/screens/render-state.d.ts.map +1 -0
  821. package/dist/ui/screens/render-state.js +127 -0
  822. package/dist/ui/screens/render-state.js.map +1 -0
  823. package/dist/ui/screens/settings-data.d.ts +55 -0
  824. package/dist/ui/screens/settings-data.d.ts.map +1 -0
  825. package/dist/ui/screens/settings-data.js +89 -0
  826. package/dist/ui/screens/settings-data.js.map +1 -0
  827. package/dist/ui/screens/settings-panels-data.d.ts +58 -0
  828. package/dist/ui/screens/settings-panels-data.d.ts.map +1 -0
  829. package/dist/ui/screens/settings-panels-data.js +88 -0
  830. package/dist/ui/screens/settings-panels-data.js.map +1 -0
  831. package/dist/ui/screens/social-share-data.d.ts +307 -0
  832. package/dist/ui/screens/social-share-data.d.ts.map +1 -0
  833. package/dist/ui/screens/social-share-data.js +447 -0
  834. package/dist/ui/screens/social-share-data.js.map +1 -0
  835. package/dist/ui/screens/topics-data.d.ts +38 -0
  836. package/dist/ui/screens/topics-data.d.ts.map +1 -0
  837. package/dist/ui/screens/topics-data.js +50 -0
  838. package/dist/ui/screens/topics-data.js.map +1 -0
  839. package/dist/ui/styles/broadsheet.css +394 -0
  840. package/dist/ui/theme.d.ts +23 -0
  841. package/dist/ui/theme.d.ts.map +1 -0
  842. package/dist/ui/theme.js +87 -0
  843. package/dist/ui/theme.js.map +1 -0
  844. package/dist/ui/tweaks.d.ts +7 -0
  845. package/dist/ui/tweaks.d.ts.map +1 -0
  846. package/dist/ui/tweaks.js +31 -0
  847. package/dist/ui/tweaks.js.map +1 -0
  848. package/dist/ui/use-hash-router.d.ts +6 -0
  849. package/dist/ui/use-hash-router.d.ts.map +1 -0
  850. package/dist/ui/use-hash-router.js +15 -0
  851. package/dist/ui/use-hash-router.js.map +1 -0
  852. package/dist/ui/use-tweaks.d.ts +6 -0
  853. package/dist/ui/use-tweaks.d.ts.map +1 -0
  854. package/dist/ui/use-tweaks.js +24 -0
  855. package/dist/ui/use-tweaks.js.map +1 -0
  856. package/dist/ui/workspace-context.d.ts +34 -0
  857. package/dist/ui/workspace-context.d.ts.map +1 -0
  858. package/dist/ui/workspace-context.js +32 -0
  859. package/dist/ui/workspace-context.js.map +1 -0
  860. package/migrations/0001_create_cms_tables.sql +200 -0
  861. package/migrations/0002_review_softdelete_board.sql +112 -0
  862. package/migrations/0003_content_contributors.sql +16 -0
  863. package/migrations/0004_seo_faq_columns.sql +6 -0
  864. package/migrations/0005_revision_delta_columns.sql +5 -0
  865. package/migrations/0006_processing_trigger_token.sql +4 -0
  866. package/migrations/0007_content_slug_redirects.sql +9 -0
  867. package/migrations/0008_workspace_settings.sql +17 -0
  868. package/migrations/0009_workspace_memberships.sql +36 -0
  869. package/migrations/0010_api_keys_webhooks.sql +21 -0
  870. package/migrations/0011_notifications_activity.sql +22 -0
  871. package/migrations/0012_content_imports.sql +10 -0
  872. package/migrations/0013_media_normalization.sql +4 -0
  873. package/migrations/0014_api_key_prefix.sql +3 -0
  874. package/migrations/0015_cms_topics.sql +7 -0
  875. package/migrations/0016_content_insights.sql +53 -0
  876. package/package.json +82 -0
  877. package/src/engine/activity-log.ts +39 -0
  878. package/src/engine/ai-prompts.ts +124 -0
  879. package/src/engine/ai-writeback.ts +62 -0
  880. package/src/engine/api-keys.ts +239 -0
  881. package/src/engine/content-insights.ts +198 -0
  882. package/src/engine/contributors.ts +95 -0
  883. package/src/engine/cron.ts +62 -0
  884. package/src/engine/d1.ts +29 -0
  885. package/src/engine/foundry-dispatch.ts +417 -0
  886. package/src/engine/import-parsers.ts +478 -0
  887. package/src/engine/index.ts +230 -0
  888. package/src/engine/invites.ts +271 -0
  889. package/src/engine/members.ts +216 -0
  890. package/src/engine/membership-rules.ts +63 -0
  891. package/src/engine/og-render.ts +59 -0
  892. package/src/engine/publish-guard.ts +123 -0
  893. package/src/engine/publisher.ts +1032 -0
  894. package/src/engine/revisions.ts +292 -0
  895. package/src/engine/sanitize.ts +183 -0
  896. package/src/engine/seed-membership.ts +92 -0
  897. package/src/engine/seo.ts +72 -0
  898. package/src/engine/slug-redirects.ts +34 -0
  899. package/src/engine/slug.ts +33 -0
  900. package/src/engine/soft-delete.ts +42 -0
  901. package/src/engine/tags.ts +95 -0
  902. package/src/engine/topics.ts +158 -0
  903. package/src/engine/url-guard.ts +136 -0
  904. package/src/engine/validator/checks/bare-url-not-autolinked.ts +78 -0
  905. package/src/engine/validator/checks/broken-footnote-label.ts +33 -0
  906. package/src/engine/validator/checks/double-encoded-entities.ts +46 -0
  907. package/src/engine/validator/checks/empty-alt-text.ts +35 -0
  908. package/src/engine/validator/checks/heading-hierarchy-skip.ts +33 -0
  909. package/src/engine/validator/checks/html-comment-leak.ts +58 -0
  910. package/src/engine/validator/checks/iframe-missing-dims-and-wrapper.ts +34 -0
  911. package/src/engine/validator/checks/invisible-control-chars.ts +58 -0
  912. package/src/engine/validator/checks/paywall-marker-leak.ts +43 -0
  913. package/src/engine/validator/checks/raw-block-html.ts +65 -0
  914. package/src/engine/validator/checks/stale-body-html.ts +39 -0
  915. package/src/engine/validator/checks/unresolved-footnote-anchor.ts +61 -0
  916. package/src/engine/validator/checks/word-gdocs-paste-artifacts.ts +72 -0
  917. package/src/engine/validator/index.ts +385 -0
  918. package/src/engine/validator/scan.ts +103 -0
  919. package/src/engine/validator/types.ts +114 -0
  920. package/src/engine/webhook-signer.ts +139 -0
  921. package/src/engine/webhooks.ts +224 -0
  922. package/src/index.ts +79 -0
  923. package/src/integration/index.ts +298 -0
  924. package/src/integration/options.ts +30 -0
  925. package/src/integration/vite-plugin.ts +37 -0
  926. package/src/providers/index.ts +2 -0
  927. package/src/providers/null.ts +160 -0
  928. package/src/providers/types.ts +284 -0
  929. package/src/routes/ai.ts +461 -0
  930. package/src/routes/analytics.ts +78 -0
  931. package/src/routes/api-keys.ts +133 -0
  932. package/src/routes/authors.ts +282 -0
  933. package/src/routes/authz-matrix.ts +239 -0
  934. package/src/routes/calendar.ts +127 -0
  935. package/src/routes/config.ts +99 -0
  936. package/src/routes/content-insights.ts +159 -0
  937. package/src/routes/content.ts +1753 -0
  938. package/src/routes/context.ts +146 -0
  939. package/src/routes/cron.ts +27 -0
  940. package/src/routes/dashboard.ts +174 -0
  941. package/src/routes/imports.ts +190 -0
  942. package/src/routes/index.ts +295 -0
  943. package/src/routes/media-lib.ts +405 -0
  944. package/src/routes/media.ts +944 -0
  945. package/src/routes/preview.ts +182 -0
  946. package/src/routes/rbac-invites.ts +220 -0
  947. package/src/routes/rbac.ts +155 -0
  948. package/src/routes/shell.ts +163 -0
  949. package/src/routes/subscriptions.ts +167 -0
  950. package/src/routes/tags.ts +93 -0
  951. package/src/routes/topics.ts +58 -0
  952. package/src/routes/webhooks.ts +233 -0
  953. package/src/schema/index.ts +45 -0
  954. package/src/schema/insights-ingest.ts +126 -0
  955. package/src/schema/migrations.ts +599 -0
  956. package/src/schema/tables.ts +59 -0
  957. package/src/schema/types.ts +576 -0
  958. package/src/ui/api/_authz.ts +100 -0
  959. package/src/ui/api/_content-config.ts +75 -0
  960. package/src/ui/api/activity.ts +33 -0
  961. package/src/ui/api/analytics.ts +42 -0
  962. package/src/ui/api/authors/[id].ts +23 -0
  963. package/src/ui/api/authors.ts +19 -0
  964. package/src/ui/api/calendar.ts +21 -0
  965. package/src/ui/api/content/[id]/ai/headlines.ts +10 -0
  966. package/src/ui/api/content/[id]/ai/meta-description.ts +11 -0
  967. package/src/ui/api/content/[id]/ai/og-image.ts +10 -0
  968. package/src/ui/api/content/[id]/ai/proofread.ts +10 -0
  969. package/src/ui/api/content/[id]/ai/takeaways.ts +11 -0
  970. package/src/ui/api/content/[id]/contributors.ts +13 -0
  971. package/src/ui/api/content/[id]/preview-token.ts +21 -0
  972. package/src/ui/api/content/[id]/revisions/[rev]/restore.ts +12 -0
  973. package/src/ui/api/content/[id]/revisions/[rev].ts +11 -0
  974. package/src/ui/api/content/[id]/revisions.ts +9 -0
  975. package/src/ui/api/content/[id]/seo-score.ts +10 -0
  976. package/src/ui/api/content/[id].ts +23 -0
  977. package/src/ui/api/content/bulk.ts +10 -0
  978. package/src/ui/api/content/counts.ts +11 -0
  979. package/src/ui/api/content/foundry-callback.ts +11 -0
  980. package/src/ui/api/content/import/confirm.ts +16 -0
  981. package/src/ui/api/content/import/parse.ts +16 -0
  982. package/src/ui/api/content/insights-ingest.ts +24 -0
  983. package/src/ui/api/content-insights/dismiss.ts +23 -0
  984. package/src/ui/api/content-insights/index.ts +21 -0
  985. package/src/ui/api/content-insights/undismiss.ts +23 -0
  986. package/src/ui/api/content.ts +21 -0
  987. package/src/ui/api/dashboard.ts +28 -0
  988. package/src/ui/api/me.ts +23 -0
  989. package/src/ui/api/media/[id].ts +22 -0
  990. package/src/ui/api/media/images.ts +9 -0
  991. package/src/ui/api/media/library/[id].ts +9 -0
  992. package/src/ui/api/media/library.ts +22 -0
  993. package/src/ui/api/media/podcast/abort.ts +6 -0
  994. package/src/ui/api/media/podcast/complete.ts +6 -0
  995. package/src/ui/api/media/podcast/init.ts +6 -0
  996. package/src/ui/api/media/podcast/part.ts +6 -0
  997. package/src/ui/api/media/podcast.ts +9 -0
  998. package/src/ui/api/media/videos/abort.ts +9 -0
  999. package/src/ui/api/media/videos/complete.ts +9 -0
  1000. package/src/ui/api/media/videos/init.ts +9 -0
  1001. package/src/ui/api/media/videos/part.ts +9 -0
  1002. package/src/ui/api/notifications.ts +26 -0
  1003. package/src/ui/api/search.ts +23 -0
  1004. package/src/ui/api/settings/api-keys/[id].ts +28 -0
  1005. package/src/ui/api/settings/api-keys.ts +25 -0
  1006. package/src/ui/api/settings/domains.ts +37 -0
  1007. package/src/ui/api/settings/integrations.ts +40 -0
  1008. package/src/ui/api/settings/members/[userId].ts +33 -0
  1009. package/src/ui/api/settings/members/invite.ts +27 -0
  1010. package/src/ui/api/settings/members.ts +23 -0
  1011. package/src/ui/api/settings/webhooks/[id]/test.ts +30 -0
  1012. package/src/ui/api/settings/webhooks/[id].ts +29 -0
  1013. package/src/ui/api/settings/webhooks.ts +27 -0
  1014. package/src/ui/api/subscriptions.ts +56 -0
  1015. package/src/ui/api/tags/[id].ts +24 -0
  1016. package/src/ui/api/tags/index.ts +18 -0
  1017. package/src/ui/api/topics/[id].ts +20 -0
  1018. package/src/ui/api/topics/index.ts +17 -0
  1019. package/src/ui/api/workspace-settings.ts +26 -0
  1020. package/src/ui/client/boot-state.ts +42 -0
  1021. package/src/ui/client/mount.tsx +41 -0
  1022. package/src/ui/commands.ts +62 -0
  1023. package/src/ui/components/CmsApp.tsx +149 -0
  1024. package/src/ui/components/CommandPalette.tsx +118 -0
  1025. package/src/ui/components/NoAccessScreen.tsx +79 -0
  1026. package/src/ui/components/ShareModal.tsx +650 -0
  1027. package/src/ui/components/SharePickers.tsx +790 -0
  1028. package/src/ui/components/ShareStatsPanel.tsx +721 -0
  1029. package/src/ui/components/Sidebar.tsx +86 -0
  1030. package/src/ui/components/SiteSwitcher.tsx +100 -0
  1031. package/src/ui/components/Topbar.tsx +93 -0
  1032. package/src/ui/editor/AiAssistPanel.tsx +407 -0
  1033. package/src/ui/editor/ContentForm.tsx +1462 -0
  1034. package/src/ui/editor/Rte.tsx +382 -0
  1035. package/src/ui/editor/ai-assist.ts +139 -0
  1036. package/src/ui/editor/autosave.ts +36 -0
  1037. package/src/ui/editor/content-payload.ts +125 -0
  1038. package/src/ui/editor/editor-media-upload.ts +26 -0
  1039. package/src/ui/editor/serialize.ts +522 -0
  1040. package/src/ui/editor/tweet-embed.ts +60 -0
  1041. package/src/ui/hash-router.ts +30 -0
  1042. package/src/ui/icons.tsx +208 -0
  1043. package/src/ui/inspector/Field.tsx +30 -0
  1044. package/src/ui/inspector/FoundryTab.tsx +613 -0
  1045. package/src/ui/inspector/HistoryTab.tsx +482 -0
  1046. package/src/ui/inspector/Inspector.tsx +328 -0
  1047. package/src/ui/inspector/OrganizeTab.tsx +534 -0
  1048. package/src/ui/inspector/PublishTab.tsx +626 -0
  1049. package/src/ui/inspector/Section.tsx +81 -0
  1050. package/src/ui/inspector/SeoTab.tsx +573 -0
  1051. package/src/ui/inspector/foundry-stages.ts +140 -0
  1052. package/src/ui/inspector/inspector-data.ts +232 -0
  1053. package/src/ui/inspector/organize-data.ts +51 -0
  1054. package/src/ui/inspector/revision-diff.ts +213 -0
  1055. package/src/ui/inspector/seo-helpers.ts +71 -0
  1056. package/src/ui/inspector/tab-visibility.ts +37 -0
  1057. package/src/ui/nav.ts +48 -0
  1058. package/src/ui/pages/admin.astro +32 -0
  1059. package/src/ui/preview/draft-page.tsx +395 -0
  1060. package/src/ui/preview/preview-layout.ts +49 -0
  1061. package/src/ui/screens/AnalyticsScreen.tsx +938 -0
  1062. package/src/ui/screens/AuthorsScreen.tsx +524 -0
  1063. package/src/ui/screens/CalendarScreen.tsx +694 -0
  1064. package/src/ui/screens/ContentInsightsScreen.tsx +417 -0
  1065. package/src/ui/screens/ContentRoute.tsx +35 -0
  1066. package/src/ui/screens/DashboardScreen.tsx +654 -0
  1067. package/src/ui/screens/EditorScreen.tsx +673 -0
  1068. package/src/ui/screens/LibraryScreen.tsx +1350 -0
  1069. package/src/ui/screens/MediaScreen.tsx +357 -0
  1070. package/src/ui/screens/SettingsScreen.tsx +1841 -0
  1071. package/src/ui/screens/SocialShareScreen.tsx +670 -0
  1072. package/src/ui/screens/SubscriptionsScreen.tsx +1240 -0
  1073. package/src/ui/screens/TopicsScreen.tsx +912 -0
  1074. package/src/ui/screens/analytics-data.ts +68 -0
  1075. package/src/ui/screens/calendar-data.ts +126 -0
  1076. package/src/ui/screens/content-insights-data.ts +127 -0
  1077. package/src/ui/screens/content-view.ts +30 -0
  1078. package/src/ui/screens/library-data.ts +177 -0
  1079. package/src/ui/screens/media-upload.ts +283 -0
  1080. package/src/ui/screens/public-url.ts +81 -0
  1081. package/src/ui/screens/registry.tsx +53 -0
  1082. package/src/ui/screens/render-state.ts +228 -0
  1083. package/src/ui/screens/settings-data.ts +140 -0
  1084. package/src/ui/screens/settings-panels-data.ts +142 -0
  1085. package/src/ui/screens/social-share-data.ts +753 -0
  1086. package/src/ui/screens/topics-data.ts +75 -0
  1087. package/src/ui/styles/broadsheet.css +394 -0
  1088. package/src/ui/theme.ts +104 -0
  1089. package/src/ui/tweaks.ts +37 -0
  1090. package/src/ui/use-hash-router.ts +17 -0
  1091. package/src/ui/use-tweaks.ts +31 -0
  1092. package/src/ui/workspace-context.tsx +62 -0
  1093. package/src/virtual.d.ts +4 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `word-gdocs-paste-artifacts`
3
+ *
4
+ * Detect Microsoft Word / Google Docs paste residue that the import
5
+ * pipeline failed to strip. These markers either render as visible junk
6
+ * (the comment markers) or burn unused class attributes into the DOM
7
+ * (Mso* class names, mso-* style properties).
8
+ *
9
+ * Block-severity: when these appear, the body is not safe to publish
10
+ * raw — they have triggered measurable layout regressions in the past
11
+ * (the `Mso*` classes inherit Word's default font stack, which leaks
12
+ * Times New Roman into the prose font).
13
+ */
14
+ import type { ArticleBodyInput, ValidationError } from '../types.js';
15
+ export declare function check(input: ArticleBodyInput): ValidationError[];
16
+ /**
17
+ * Pure repair: drop Mso* class attributes, Start* fragment comments,
18
+ * and mso-* CSS rules. The repair is conservative — we keep the
19
+ * surrounding element and strip the offending attribute / declaration
20
+ * rather than removing the whole node.
21
+ */
22
+ export declare function repair(value: string): string;
23
+ //# sourceMappingURL=word-gdocs-paste-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-gdocs-paste-artifacts.d.ts","sourceRoot":"","sources":["../../../../src/engine/validator/checks/word-gdocs-paste-artifacts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAMpE,wBAAgB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,eAAe,EAAE,CAmBhE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAyB5C"}
@@ -0,0 +1,47 @@
1
+ import { makeError } from '../types.js';
2
+ const PATTERN = /\sclass\s*=\s*"?Mso\w+|<!--\s*Start(?:Fragment|HTML|Selection)\s*-->|mso-(?:margin|para|list|ascii|fareast|hansi|bidi)-/i;
3
+ export function check(input) {
4
+ const errors = [];
5
+ const checkField = (value, fieldName) => {
6
+ if (!value)
7
+ return;
8
+ const match = PATTERN.exec(value);
9
+ if (!match)
10
+ return;
11
+ errors.push(makeError('word-gdocs-paste-artifacts', `${fieldName} contains Word/Google Docs paste residue (matched '${match[0]}'). Strip Mso* classes and mso-* styles before publishing.`, { start: match.index, end: match.index + match[0].length }));
12
+ };
13
+ checkField(input.body_markdown, 'body_markdown');
14
+ checkField(input.body_html, 'body_html');
15
+ return errors;
16
+ }
17
+ /**
18
+ * Pure repair: drop Mso* class attributes, Start* fragment comments,
19
+ * and mso-* CSS rules. The repair is conservative — we keep the
20
+ * surrounding element and strip the offending attribute / declaration
21
+ * rather than removing the whole node.
22
+ */
23
+ export function repair(value) {
24
+ return (value
25
+ // Drop class attributes that contain Mso* tokens.
26
+ .replace(/\sclass\s*=\s*"([^"]*)"/gi, (_match, classes) => {
27
+ const filtered = classes
28
+ .split(/\s+/)
29
+ .filter((token) => !/^Mso\w+/i.test(token))
30
+ .join(' ')
31
+ .trim();
32
+ return filtered ? ` class="${filtered}"` : '';
33
+ })
34
+ .replace(/\sclass\s*=\s*'([^']*)'/gi, (_match, classes) => {
35
+ const filtered = classes
36
+ .split(/\s+/)
37
+ .filter((token) => !/^Mso\w+/i.test(token))
38
+ .join(' ')
39
+ .trim();
40
+ return filtered ? ` class='${filtered}'` : '';
41
+ })
42
+ // Drop Start*/End* fragment markers entirely.
43
+ .replace(/<!--\s*(?:Start|End)(?:Fragment|HTML|Selection)\s*-->/gi, '')
44
+ // Drop mso-* CSS declarations.
45
+ .replace(/mso-(?:margin|para|list|ascii|fareast|hansi|bidi)-[^;"'>]*;?/gi, ''));
46
+ }
47
+ //# sourceMappingURL=word-gdocs-paste-artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-gdocs-paste-artifacts.js","sourceRoot":"","sources":["../../../../src/engine/validator/checks/word-gdocs-paste-artifacts.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,MAAM,OAAO,GACZ,0HAA0H,CAAA;AAE3H,MAAM,UAAU,KAAK,CAAC,KAAuB;IAC5C,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,MAAM,UAAU,GAAG,CAAC,KAAoB,EAAE,SAAiB,EAAE,EAAE;QAC9D,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,CAAC,KAAK;YAAE,OAAM;QAClB,MAAM,CAAC,IAAI,CACV,SAAS,CACR,4BAA4B,EAC5B,GAAG,SAAS,sDAAsD,KAAK,CAAC,CAAC,CAAC,4DAA4D,EACtI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAC1D,CACD,CAAA;IACF,CAAC,CAAA;IAED,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IAChD,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACxC,OAAO,MAAM,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IACnC,OAAO,CACN,KAAK;QACJ,kDAAkD;SACjD,OAAO,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,OAAO;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAA;QACR,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9C,CAAC,CAAC;SACD,OAAO,CAAC,2BAA2B,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QACjE,MAAM,QAAQ,GAAG,OAAO;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC1C,IAAI,CAAC,GAAG,CAAC;aACT,IAAI,EAAE,CAAA;QACR,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9C,CAAC,CAAC;QACF,8CAA8C;SAC7C,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;QACvE,+BAA+B;SAC9B,OAAO,CAAC,gEAAgE,EAAE,EAAE,CAAC,CAC/E,CAAA;AACF,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * article-body-validator (modular layout)
3
+ *
4
+ * The validator is the single source of truth for ingest-time formatting
5
+ * QA. Each `checks/<code>.ts` file implements one independent detector;
6
+ * this index module composes them into the public API used by the
7
+ * publish guard and the publishing engine.
8
+ *
9
+ * Ported verbatim from fulcrum-labs/fronts
10
+ * src/lib/article-body-validator/index.ts (inventory §1: extract). The
11
+ * validator runs on PRE-strip source; renderer-side cleanup happens AFTER
12
+ * the validator has emitted its report so ingest bugs stay visible.
13
+ */
14
+ import * as bareUrl from './checks/bare-url-not-autolinked.js';
15
+ import * as brokenFootnoteLabel from './checks/broken-footnote-label.js';
16
+ import * as doubleEncoded from './checks/double-encoded-entities.js';
17
+ import * as emptyAlt from './checks/empty-alt-text.js';
18
+ import * as headingHierarchy from './checks/heading-hierarchy-skip.js';
19
+ import * as htmlCommentLeak from './checks/html-comment-leak.js';
20
+ import * as iframeMissingDims from './checks/iframe-missing-dims-and-wrapper.js';
21
+ import * as invisibleControl from './checks/invisible-control-chars.js';
22
+ import * as paywallMarker from './checks/paywall-marker-leak.js';
23
+ import * as rawBlockHtml from './checks/raw-block-html.js';
24
+ import * as unresolvedAnchor from './checks/unresolved-footnote-anchor.js';
25
+ import * as wordGdocs from './checks/word-gdocs-paste-artifacts.js';
26
+ import type { ArticleBodyInput, Severity, ValidationError, ValidationErrorCode, ValidationResult, ValidatorOptions } from './types.js';
27
+ import { DEFAULT_OPTIONS, SEVERITY } from './types.js';
28
+ /**
29
+ * Astro 500 error template fingerprints. The build-time guard looks for
30
+ * the same set, so the static-output check and the pre-publish check
31
+ * agree on what a baked server-error page looks like.
32
+ */
33
+ export declare const ASTRO_SERVER_ERROR_PATTERNS: readonly RegExp[];
34
+ export declare function checkDataUriArtifact(input: ArticleBodyInput): ValidationError[];
35
+ export declare function checkBakedAstroErrorTemplate(input: ArticleBodyInput): ValidationError[];
36
+ export declare function checkEscapedRawHtml(input: ArticleBodyInput): ValidationError[];
37
+ export declare function checkMalformedDataImageMarkdown(input: ArticleBodyInput): ValidationError[];
38
+ export declare function checkUnbalancedMarkdownEmphasis(input: ArticleBodyInput): ValidationError[];
39
+ export declare function checkSingleSentenceParagraphsPattern(input: ArticleBodyInput, options?: ValidatorOptions): ValidationError[];
40
+ export declare function checkBackslashOverEscape(input: ArticleBodyInput): ValidationError[];
41
+ export declare function checkHtmlEntityInHeading(input: ArticleBodyInput): ValidationError[];
42
+ export declare function checkEmptyBody(input: ArticleBodyInput): ValidationError[];
43
+ export declare const checkBrokenFootnoteLabel: typeof brokenFootnoteLabel.check;
44
+ export declare const checkUnresolvedFootnoteAnchor: typeof unresolvedAnchor.check;
45
+ export declare const checkWordGdocsPasteArtifacts: typeof wordGdocs.check;
46
+ export declare const checkHtmlCommentLeak: typeof htmlCommentLeak.check;
47
+ export declare const checkRawBlockHtml: typeof rawBlockHtml.check;
48
+ export declare const checkDoubleEncodedEntities: typeof doubleEncoded.check;
49
+ export declare const checkInvisibleControlChars: typeof invisibleControl.check;
50
+ export declare const checkBareUrlNotAutolinked: typeof bareUrl.check;
51
+ export declare const checkEmptyAltText: typeof emptyAlt.check;
52
+ export declare const checkIframeMissingDimsAndWrapper: typeof iframeMissingDims.check;
53
+ export declare const checkHeadingHierarchySkip: typeof headingHierarchy.check;
54
+ export declare const checkPaywallMarkerLeak: typeof paywallMarker.check;
55
+ export interface RunOptions extends ValidatorOptions {
56
+ requireBody: boolean;
57
+ }
58
+ export declare const DEFAULT_RUN_OPTIONS: RunOptions;
59
+ /**
60
+ * Run every check in a deterministic order and aggregate the errors.
61
+ * Structural problems (empty body, baked-error template) come first;
62
+ * the body-string checks follow; the noisiest heuristic checks
63
+ * (paragraph-split pattern) come last.
64
+ */
65
+ export declare function validateArticleBody(input: ArticleBodyInput, options?: Partial<RunOptions>): ValidationResult;
66
+ /**
67
+ * Filter a list of errors down to those with `block` severity. Callers
68
+ * use this to decide between 422 (block) and 200 + warnings (warn-only).
69
+ */
70
+ export declare function blockErrors(errors: ValidationError[]): ValidationError[];
71
+ export declare function warnErrors(errors: ValidationError[]): ValidationError[];
72
+ export declare function formatValidationErrors(errors: ValidationError[]): string;
73
+ export type { ArticleBodyInput, Severity, ValidationError, ValidationErrorCode, ValidationResult, ValidatorOptions, };
74
+ export { DEFAULT_OPTIONS, SEVERITY };
75
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,313 @@
1
+ /**
2
+ * article-body-validator (modular layout)
3
+ *
4
+ * The validator is the single source of truth for ingest-time formatting
5
+ * QA. Each `checks/<code>.ts` file implements one independent detector;
6
+ * this index module composes them into the public API used by the
7
+ * publish guard and the publishing engine.
8
+ *
9
+ * Ported verbatim from fulcrum-labs/fronts
10
+ * src/lib/article-body-validator/index.ts (inventory §1: extract). The
11
+ * validator runs on PRE-strip source; renderer-side cleanup happens AFTER
12
+ * the validator has emitted its report so ingest bugs stay visible.
13
+ */
14
+ import * as bareUrl from './checks/bare-url-not-autolinked.js';
15
+ import * as brokenFootnoteLabel from './checks/broken-footnote-label.js';
16
+ import * as doubleEncoded from './checks/double-encoded-entities.js';
17
+ import * as emptyAlt from './checks/empty-alt-text.js';
18
+ import * as headingHierarchy from './checks/heading-hierarchy-skip.js';
19
+ import * as htmlCommentLeak from './checks/html-comment-leak.js';
20
+ import * as iframeMissingDims from './checks/iframe-missing-dims-and-wrapper.js';
21
+ import * as invisibleControl from './checks/invisible-control-chars.js';
22
+ import * as paywallMarker from './checks/paywall-marker-leak.js';
23
+ import * as rawBlockHtml from './checks/raw-block-html.js';
24
+ import * as unresolvedAnchor from './checks/unresolved-footnote-anchor.js';
25
+ import * as wordGdocs from './checks/word-gdocs-paste-artifacts.js';
26
+ import { DEFAULT_OPTIONS, makeError, SEVERITY } from './types.js';
27
+ /* -------------------------------------------------------------------------- */
28
+ /* Phase 0 / Phase 1 — preserved checks */
29
+ /* -------------------------------------------------------------------------- */
30
+ /**
31
+ * Astro 500 error template fingerprints. The build-time guard looks for
32
+ * the same set, so the static-output check and the pre-publish check
33
+ * agree on what a baked server-error page looks like.
34
+ */
35
+ export const ASTRO_SERVER_ERROR_PATTERNS = [
36
+ /<title>\s*Server Error(?:\s*\|\s*Fronts)?\s*<\/title>/i,
37
+ /Fronts encountered an unexpected error\./i,
38
+ /The request reached Fronts but the response failed before rendering completed\./i,
39
+ /Something broke upstream\./i,
40
+ ];
41
+ const LEGIT_ESCAPE_CHARS = '*_[]{}|`#+!>\\-';
42
+ function isBlank(value) {
43
+ return !value || value.trim().length === 0;
44
+ }
45
+ export function checkDataUriArtifact(input) {
46
+ const errors = [];
47
+ const pattern = /data:image\/[a-z0-9+.-]+;base64,/i;
48
+ const checkField = (value, fieldName) => {
49
+ if (!value)
50
+ return;
51
+ const match = pattern.exec(value);
52
+ if (!match)
53
+ return;
54
+ errors.push(makeError('data-uri-artifact', `Article body contains an inline data:image base64 payload in ${fieldName}; bodies must reference R2 URLs only.`, { start: match.index, end: match.index + match[0].length }));
55
+ };
56
+ checkField(input.body_markdown, 'body_markdown');
57
+ checkField(input.body_html, 'body_html');
58
+ return errors;
59
+ }
60
+ export function checkBakedAstroErrorTemplate(input) {
61
+ const errors = [];
62
+ const checkField = (value, fieldName) => {
63
+ if (!value)
64
+ return;
65
+ for (const pattern of ASTRO_SERVER_ERROR_PATTERNS) {
66
+ const match = pattern.exec(value);
67
+ if (!match)
68
+ continue;
69
+ errors.push(makeError('baked-astro-error-template', `Article body in ${fieldName} matches a baked Astro server-error template fingerprint.`, { start: match.index, end: match.index + match[0].length }));
70
+ return;
71
+ }
72
+ };
73
+ checkField(input.body_markdown, 'body_markdown');
74
+ checkField(input.body_html, 'body_html');
75
+ return errors;
76
+ }
77
+ export function checkEscapedRawHtml(input) {
78
+ const errors = [];
79
+ if (!input.body_markdown)
80
+ return errors;
81
+ const patterns = [
82
+ { tag: 'iframe', re: /&lt;iframe[\s>]/i },
83
+ { tag: 'img', re: /&lt;img[\s>]/i },
84
+ ];
85
+ for (const { tag, re } of patterns) {
86
+ const match = re.exec(input.body_markdown);
87
+ if (!match)
88
+ continue;
89
+ errors.push(makeError('escaped-raw-html', `body_markdown contains escaped raw <${tag}> markup — this will render as literal text. Decode the entities before saving.`, { start: match.index, end: match.index + match[0].length }));
90
+ }
91
+ return errors;
92
+ }
93
+ export function checkMalformedDataImageMarkdown(input) {
94
+ if (!input.body_markdown)
95
+ return [];
96
+ const pattern = /\[!\[[^\]]*\]\(data:image\/[a-z0-9+.-]+;base64,/i;
97
+ const match = pattern.exec(input.body_markdown);
98
+ if (!match)
99
+ return [];
100
+ return [
101
+ makeError('malformed-data-image-markdown', 'body_markdown contains the [![](data:image/...)] artifact from a broken import. Replace the inline payload with an R2 URL.', { start: match.index, end: match.index + match[0].length }),
102
+ ];
103
+ }
104
+ export function checkUnbalancedMarkdownEmphasis(input) {
105
+ if (!input.body_markdown)
106
+ return [];
107
+ const errors = [];
108
+ const lines = input.body_markdown.split('\n');
109
+ let lineStart = 0;
110
+ for (const rawLine of lines) {
111
+ const len = rawLine.length + 1;
112
+ const lineStartHere = lineStart;
113
+ lineStart += len;
114
+ const stripped = rawLine.replace(/`[^`]*`/g, '');
115
+ const noStrong = stripped.replace(/\*\*/g, '').replace(/__/g, '');
116
+ const noEscaped = noStrong.replace(/\\[*_]/g, '');
117
+ const stars = (noEscaped.match(/\*/g) || []).length;
118
+ const unders = (noEscaped.match(/(?<=\w)_(?=\w)|(?<!\w)_|_(?!\w)/g) || []).length;
119
+ if (stars % 2 === 1) {
120
+ const idx = noEscaped.indexOf('*');
121
+ errors.push(makeError('unbalanced-markdown-emphasis', "Line has an unbalanced '*' emphasis marker.", {
122
+ start: lineStartHere + (idx >= 0 ? idx : 0),
123
+ end: lineStartHere + rawLine.length,
124
+ }));
125
+ break;
126
+ }
127
+ if (unders % 2 === 1) {
128
+ const idx = noEscaped.indexOf('_');
129
+ errors.push(makeError('unbalanced-markdown-emphasis', "Line has an unbalanced '_' emphasis marker.", {
130
+ start: lineStartHere + (idx >= 0 ? idx : 0),
131
+ end: lineStartHere + rawLine.length,
132
+ }));
133
+ break;
134
+ }
135
+ }
136
+ return errors;
137
+ }
138
+ export function checkSingleSentenceParagraphsPattern(input, options = DEFAULT_OPTIONS) {
139
+ if (!input.body_markdown)
140
+ return [];
141
+ const paragraphs = input.body_markdown
142
+ .split(/\n{2,}/)
143
+ .map((p) => p.trim())
144
+ .filter((p) => p.length > 0);
145
+ if (paragraphs.length < options.singleSentenceParagraphRun)
146
+ return [];
147
+ let run = 0;
148
+ let runStartIndex = -1;
149
+ for (let i = 0; i < paragraphs.length; i += 1) {
150
+ const para = paragraphs[i];
151
+ if (isLikelyProseParagraph(para) && countSentences(para) <= 1) {
152
+ if (run === 0)
153
+ runStartIndex = i;
154
+ run += 1;
155
+ if (run >= options.singleSentenceParagraphRun) {
156
+ return [
157
+ makeError('single-sentence-paragraphs-pattern', `Found ${run}+ consecutive single-sentence paragraphs starting at paragraph ${runStartIndex + 1}; this usually indicates an over-split import.`),
158
+ ];
159
+ }
160
+ }
161
+ else {
162
+ run = 0;
163
+ runStartIndex = -1;
164
+ }
165
+ }
166
+ return [];
167
+ }
168
+ function isLikelyProseParagraph(paragraph) {
169
+ const trimmed = paragraph.trim();
170
+ if (trimmed.startsWith('#'))
171
+ return false;
172
+ if (trimmed.startsWith('>'))
173
+ return false;
174
+ if (trimmed.startsWith('- ') || /^\d+\.\s/.test(trimmed))
175
+ return false;
176
+ if (trimmed.startsWith('```'))
177
+ return false;
178
+ if (trimmed.startsWith('<') && trimmed.endsWith('>'))
179
+ return false;
180
+ if (trimmed.startsWith('![') || trimmed.startsWith('['))
181
+ return false;
182
+ if (trimmed.length < 20)
183
+ return false;
184
+ return true;
185
+ }
186
+ function countSentences(paragraph) {
187
+ const stripped = paragraph
188
+ .replace(/`[^`]*`/g, '')
189
+ .replace(/\*\*([^*]+)\*\*/g, '$1')
190
+ .replace(/\*([^*]+)\*/g, '$1');
191
+ const matches = stripped.match(/[.!?](?:\s+|$)/g);
192
+ return matches ? matches.length : 0;
193
+ }
194
+ export function checkBackslashOverEscape(input) {
195
+ if (!input.body_markdown)
196
+ return [];
197
+ const pattern = /\\([^\s\\])/g;
198
+ for (const match of input.body_markdown.matchAll(pattern)) {
199
+ const ch = match[1] ?? '';
200
+ if (LEGIT_ESCAPE_CHARS.includes(ch))
201
+ continue;
202
+ const start = match.index ?? 0;
203
+ return [
204
+ makeError('backslash-over-escape', `body_markdown contains backslash-over-escape (e.g. '\\${ch}') from a broken import. Strip the legacy escapes before publishing.`, { start, end: start + match[0].length }),
205
+ ];
206
+ }
207
+ return [];
208
+ }
209
+ const HEADING_ENTITY_PATTERN = /&(?:quot|apos|amp|lt|gt|#\d+);/i;
210
+ export function checkHtmlEntityInHeading(input) {
211
+ if (!input.body_markdown)
212
+ return [];
213
+ const lines = input.body_markdown.split('\n');
214
+ let cursor = 0;
215
+ for (const rawLine of lines) {
216
+ const lineLen = rawLine.length + 1;
217
+ const trimmed = rawLine.trimStart();
218
+ if (/^#{1,6}\s+/.test(trimmed)) {
219
+ const headingText = trimmed.replace(/^#{1,6}\s+/, '');
220
+ const match = HEADING_ENTITY_PATTERN.exec(headingText);
221
+ if (match) {
222
+ const entityStart = cursor +
223
+ (rawLine.length - trimmed.length) +
224
+ (trimmed.length - headingText.length) +
225
+ (match.index ?? 0);
226
+ return [
227
+ makeError('html-entity-in-heading', `Heading contains an HTML entity ('${match[0]}'); headings must be raw characters or the TOC will display the entity code.`, { start: entityStart, end: entityStart + match[0].length }),
228
+ ];
229
+ }
230
+ }
231
+ cursor += lineLen;
232
+ }
233
+ return [];
234
+ }
235
+ export function checkEmptyBody(input) {
236
+ if (isBlank(input.body_markdown) && isBlank(input.body_html)) {
237
+ return [
238
+ makeError('empty-body', 'Both body_markdown and body_html are empty — refusing to publish an article with no content.'),
239
+ ];
240
+ }
241
+ return [];
242
+ }
243
+ /* -------------------------------------------------------------------------- */
244
+ /* Phase 2 — re-exported check fns */
245
+ /* -------------------------------------------------------------------------- */
246
+ export const checkBrokenFootnoteLabel = brokenFootnoteLabel.check;
247
+ export const checkUnresolvedFootnoteAnchor = unresolvedAnchor.check;
248
+ export const checkWordGdocsPasteArtifacts = wordGdocs.check;
249
+ export const checkHtmlCommentLeak = htmlCommentLeak.check;
250
+ export const checkRawBlockHtml = rawBlockHtml.check;
251
+ export const checkDoubleEncodedEntities = doubleEncoded.check;
252
+ export const checkInvisibleControlChars = invisibleControl.check;
253
+ export const checkBareUrlNotAutolinked = bareUrl.check;
254
+ export const checkEmptyAltText = emptyAlt.check;
255
+ export const checkIframeMissingDimsAndWrapper = iframeMissingDims.check;
256
+ export const checkHeadingHierarchySkip = headingHierarchy.check;
257
+ export const checkPaywallMarkerLeak = paywallMarker.check;
258
+ export const DEFAULT_RUN_OPTIONS = {
259
+ ...DEFAULT_OPTIONS,
260
+ requireBody: true,
261
+ };
262
+ /**
263
+ * Run every check in a deterministic order and aggregate the errors.
264
+ * Structural problems (empty body, baked-error template) come first;
265
+ * the body-string checks follow; the noisiest heuristic checks
266
+ * (paragraph-split pattern) come last.
267
+ */
268
+ export function validateArticleBody(input, options = {}) {
269
+ const opts = { ...DEFAULT_RUN_OPTIONS, ...options };
270
+ const errors = [];
271
+ if (opts.requireBody)
272
+ errors.push(...checkEmptyBody(input));
273
+ errors.push(...checkBakedAstroErrorTemplate(input));
274
+ errors.push(...checkMalformedDataImageMarkdown(input));
275
+ errors.push(...checkDataUriArtifact(input));
276
+ errors.push(...checkEscapedRawHtml(input));
277
+ errors.push(...checkHtmlEntityInHeading(input));
278
+ errors.push(...checkBackslashOverEscape(input));
279
+ // Phase 2.
280
+ errors.push(...checkBrokenFootnoteLabel(input));
281
+ errors.push(...checkUnresolvedFootnoteAnchor(input));
282
+ errors.push(...checkWordGdocsPasteArtifacts(input));
283
+ errors.push(...checkHtmlCommentLeak(input));
284
+ errors.push(...checkRawBlockHtml(input));
285
+ errors.push(...checkDoubleEncodedEntities(input));
286
+ errors.push(...checkInvisibleControlChars(input));
287
+ errors.push(...checkBareUrlNotAutolinked(input));
288
+ errors.push(...checkEmptyAltText(input));
289
+ errors.push(...checkIframeMissingDimsAndWrapper(input));
290
+ errors.push(...checkHeadingHierarchySkip(input));
291
+ errors.push(...checkPaywallMarkerLeak(input));
292
+ // Heuristic.
293
+ errors.push(...checkUnbalancedMarkdownEmphasis(input));
294
+ errors.push(...checkSingleSentenceParagraphsPattern(input, opts));
295
+ return errors.length === 0 ? { ok: true } : { ok: false, errors };
296
+ }
297
+ /**
298
+ * Filter a list of errors down to those with `block` severity. Callers
299
+ * use this to decide between 422 (block) and 200 + warnings (warn-only).
300
+ */
301
+ export function blockErrors(errors) {
302
+ return errors.filter((e) => SEVERITY[e.code] === 'block');
303
+ }
304
+ export function warnErrors(errors) {
305
+ return errors.filter((e) => SEVERITY[e.code] === 'warn');
306
+ }
307
+ export function formatValidationErrors(errors) {
308
+ if (errors.length === 0)
309
+ return 'ok';
310
+ return errors.map((e) => `[${e.code}] ${e.message}`).join('\n');
311
+ }
312
+ export { DEFAULT_OPTIONS, SEVERITY };
313
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/validator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared markdown-aware scanning helpers used by checks that need to
3
+ * skip fenced code, inline code, HTML attributes, and existing links.
4
+ *
5
+ * Ported verbatim from fulcrum-labs/fronts
6
+ * src/lib/article-body-validator/scan.ts (inventory §1: extract).
7
+ *
8
+ * The validator runs on PRE-strip source, so these helpers must match
9
+ * the textual reality of stored markdown — not the cleaned form that
10
+ * ships to the renderer. Each helper is pure and operates over the raw
11
+ * `body_markdown`. We intentionally avoid pulling in a full CommonMark
12
+ * AST library: the checks are conservative regex-based scans that
13
+ * classify each character span as "inside a protected region"
14
+ * (code/link/attr) vs "scannable prose".
15
+ */
16
+ /**
17
+ * Mark which character offsets in the source are inside fenced code
18
+ * blocks (` ```...``` `), inline code spans (`` `…` ``), markdown link
19
+ * targets `[…](url)`, autolinks `<…>` , and HTML attribute values
20
+ * (`src="…"`). Each offset is `true` if the character is protected.
21
+ */
22
+ export declare function buildProtectedMask(source: string): boolean[];
23
+ /**
24
+ * Returns true if any character in the [start, end) range is inside a
25
+ * protected region.
26
+ */
27
+ export declare function isProtectedSpan(mask: boolean[], start: number, end: number): boolean;
28
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CA+D5D;AAQD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAKpF"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Shared markdown-aware scanning helpers used by checks that need to
3
+ * skip fenced code, inline code, HTML attributes, and existing links.
4
+ *
5
+ * Ported verbatim from fulcrum-labs/fronts
6
+ * src/lib/article-body-validator/scan.ts (inventory §1: extract).
7
+ *
8
+ * The validator runs on PRE-strip source, so these helpers must match
9
+ * the textual reality of stored markdown — not the cleaned form that
10
+ * ships to the renderer. Each helper is pure and operates over the raw
11
+ * `body_markdown`. We intentionally avoid pulling in a full CommonMark
12
+ * AST library: the checks are conservative regex-based scans that
13
+ * classify each character span as "inside a protected region"
14
+ * (code/link/attr) vs "scannable prose".
15
+ */
16
+ /**
17
+ * Mark which character offsets in the source are inside fenced code
18
+ * blocks (` ```...``` `), inline code spans (`` `…` ``), markdown link
19
+ * targets `[…](url)`, autolinks `<…>` , and HTML attribute values
20
+ * (`src="…"`). Each offset is `true` if the character is protected.
21
+ */
22
+ export function buildProtectedMask(source) {
23
+ const len = source.length;
24
+ const mask = new Array(len).fill(false);
25
+ // 1) Fenced code blocks. Match either ``` or ~~~ fences; cover both
26
+ // the fence lines and the body between them.
27
+ const fenceRe = /(^|\n)([ \t]*)(`{3,}|~{3,})[^\n]*\n([\s\S]*?)\n\2\3/g;
28
+ for (const match of source.matchAll(fenceRe)) {
29
+ const start = match.index ?? 0;
30
+ const end = start + match[0].length;
31
+ fill(mask, start, end);
32
+ }
33
+ // 2) Inline code spans. We deliberately accept single-backtick spans
34
+ // only — multi-backtick spans are rare and the cost of missing
35
+ // them is one extra warning on an unusual page, not a render bug.
36
+ const inlineCodeRe = /`[^`\n]+`/g;
37
+ for (const match of source.matchAll(inlineCodeRe)) {
38
+ const start = match.index ?? 0;
39
+ const end = start + match[0].length;
40
+ // Skip if we're already inside a protected (fenced) region.
41
+ if (mask[start])
42
+ continue;
43
+ fill(mask, start, end);
44
+ }
45
+ // 3) Markdown links — the URL portion of `[label](url)` and the
46
+ // label of reference links `[label][id]` plus the ref target
47
+ // `[id]: url`. We protect the URL only so e.g. label text still
48
+ // scans for normal lint codes.
49
+ const linkUrlRe = /\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g;
50
+ for (const match of source.matchAll(linkUrlRe)) {
51
+ const start = (match.index ?? 0) + 2; // skip past `](`
52
+ const end = start + (match[1]?.length ?? 0);
53
+ fill(mask, start, end);
54
+ }
55
+ const refDefRe = /^\s*\[[^\]]+\]:\s*\S+/gm;
56
+ for (const match of source.matchAll(refDefRe)) {
57
+ const start = match.index ?? 0;
58
+ const end = start + match[0].length;
59
+ fill(mask, start, end);
60
+ }
61
+ // 4) Autolinks <https://…>.
62
+ const autolinkRe = /<https?:\/\/[^>\s]+>/g;
63
+ for (const match of source.matchAll(autolinkRe)) {
64
+ const start = match.index ?? 0;
65
+ const end = start + match[0].length;
66
+ fill(mask, start, end);
67
+ }
68
+ // 5) HTML attribute values (single or double quoted). This catches
69
+ // src="https://…", href="…", style attributes, etc. We do this
70
+ // after fenced/inline code so we don't reprotect those regions.
71
+ const attrRe = /\s[a-zA-Z][\w-]*\s*=\s*("[^"]*"|'[^']*')/g;
72
+ for (const match of source.matchAll(attrRe)) {
73
+ const valueStart = (match.index ?? 0) + match[0].indexOf(match[1] ?? '');
74
+ if (valueStart < 0)
75
+ continue;
76
+ const end = valueStart + (match[1]?.length ?? 0);
77
+ fill(mask, valueStart, end);
78
+ }
79
+ return mask;
80
+ }
81
+ function fill(mask, start, end) {
82
+ for (let i = start; i < end && i < mask.length; i += 1) {
83
+ mask[i] = true;
84
+ }
85
+ }
86
+ /**
87
+ * Returns true if any character in the [start, end) range is inside a
88
+ * protected region.
89
+ */
90
+ export function isProtectedSpan(mask, start, end) {
91
+ for (let i = start; i < end && i < mask.length; i += 1) {
92
+ if (mask[i])
93
+ return true;
94
+ }
95
+ return false;
96
+ }
97
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/engine/validator/scan.ts"],"names":[],"mappings":"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"}