@reddoorla/maintenance 0.86.0 → 0.88.2

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 (233) hide show
  1. package/dist/airtable-QG5ICI3Y.js +9 -0
  2. package/dist/{announce-MXTUQ6C7.js → announce-GKD5YJNB.js} +49 -28
  3. package/dist/announce-GKD5YJNB.js.map +1 -0
  4. package/dist/attachments-NLZIJ5NU.js +9 -0
  5. package/dist/{blux-ZGDSHI3U.js → blux-DN4MI532.js} +5 -5
  6. package/dist/{bump-deps-EC74CPLS.js → bump-deps-KGH5UYSF.js} +4 -4
  7. package/dist/{chunk-N45M3FDK.js → chunk-6I6L3CMX.js} +4 -4
  8. package/dist/{chunk-KTH5ZODA.js → chunk-7BZUOZPU.js} +2 -2
  9. package/dist/{chunk-2EVEFOZY.js → chunk-7FFUBF4I.js} +6 -3
  10. package/dist/chunk-7FFUBF4I.js.map +1 -0
  11. package/dist/{chunk-LDWZSLSU.js → chunk-7NYN2P6I.js} +7 -4
  12. package/dist/{chunk-LDWZSLSU.js.map → chunk-7NYN2P6I.js.map} +1 -1
  13. package/dist/{chunk-X3B723J4.js → chunk-7TMWBXX7.js} +184 -25
  14. package/dist/chunk-7TMWBXX7.js.map +1 -0
  15. package/dist/{chunk-3VQWSE3F.js → chunk-7UAYMAKR.js} +4 -4
  16. package/dist/{chunk-W7Z3BGCI.js → chunk-A2UNJIKH.js} +15 -7
  17. package/dist/chunk-A2UNJIKH.js.map +1 -0
  18. package/dist/{chunk-F5KM4LEQ.js → chunk-ANJNTAMM.js} +4 -70
  19. package/dist/chunk-ANJNTAMM.js.map +1 -0
  20. package/dist/{chunk-2ZPT7GLV.js → chunk-B23FFWU4.js} +4 -4
  21. package/dist/chunk-B23FFWU4.js.map +1 -0
  22. package/dist/{chunk-DJZWYIPP.js → chunk-BGTYPVLT.js} +1 -1
  23. package/dist/chunk-BGTYPVLT.js.map +1 -0
  24. package/dist/chunk-BRYXFH77.js +70 -0
  25. package/dist/chunk-BRYXFH77.js.map +1 -0
  26. package/dist/{chunk-2NDRHXMR.js → chunk-DGZWFI2G.js} +18 -141
  27. package/dist/chunk-DGZWFI2G.js.map +1 -0
  28. package/dist/{chunk-ACBRLLFT.js → chunk-F3JWOPTG.js} +7 -3
  29. package/dist/chunk-F3JWOPTG.js.map +1 -0
  30. package/dist/chunk-GQDDWYU2.js +372 -0
  31. package/dist/chunk-GQDDWYU2.js.map +1 -0
  32. package/dist/{chunk-Z7AXYKQB.js → chunk-IY6256GK.js} +1 -1
  33. package/dist/{chunk-BYK66EWO.js → chunk-J3WEZGIN.js} +52 -46
  34. package/dist/chunk-J3WEZGIN.js.map +1 -0
  35. package/dist/{chunk-BNM5POSJ.js → chunk-JRHIFA5R.js} +2 -2
  36. package/dist/{chunk-ZKXSX4LO.js → chunk-K6SLF6GI.js} +6 -6
  37. package/dist/{chunk-CQR4LIM7.js → chunk-KJGKZLCT.js} +7 -3
  38. package/dist/{chunk-CQR4LIM7.js.map → chunk-KJGKZLCT.js.map} +1 -1
  39. package/dist/{chunk-PPE5KZJK.js → chunk-KMCZA7CH.js} +13 -3
  40. package/dist/chunk-KMCZA7CH.js.map +1 -0
  41. package/dist/{chunk-3SF7D4DY.js → chunk-MFHS7IQ2.js} +36 -1
  42. package/dist/{chunk-3SF7D4DY.js.map → chunk-MFHS7IQ2.js.map} +1 -1
  43. package/dist/{chunk-SNSTJLQW.js → chunk-NO74DXDP.js} +48 -2
  44. package/dist/chunk-NO74DXDP.js.map +1 -0
  45. package/dist/{chunk-C6B4RHXR.js → chunk-O3GT46R2.js} +8 -2
  46. package/dist/chunk-O3GT46R2.js.map +1 -0
  47. package/dist/{chunk-ITIOFN7A.js → chunk-P6AORG32.js} +29 -10
  48. package/dist/chunk-P6AORG32.js.map +1 -0
  49. package/dist/{chunk-SLUQ7R6I.js → chunk-PR343K7F.js} +5 -5
  50. package/dist/{chunk-P2FE5AI6.js → chunk-Q47DU255.js} +4 -4
  51. package/dist/{chunk-EVBCK2KC.js → chunk-RARREDQE.js} +2 -1
  52. package/dist/{chunk-EVBCK2KC.js.map → chunk-RARREDQE.js.map} +1 -1
  53. package/dist/chunk-RUPPWAD6.js +7 -0
  54. package/dist/chunk-RUPPWAD6.js.map +1 -0
  55. package/dist/{chunk-VSBFM7DS.js → chunk-SJOXWJ5Y.js} +3 -3
  56. package/dist/{chunk-TERE5SDF.js → chunk-ULHPALI5.js} +4 -4
  57. package/dist/{chunk-XUGSZP7Z.js → chunk-W45FZEGE.js} +2 -2
  58. package/dist/{chunk-JHGHLKFS.js → chunk-WS6NU475.js} +2 -2
  59. package/dist/chunk-XP5WM2LV.js +146 -0
  60. package/dist/chunk-XP5WM2LV.js.map +1 -0
  61. package/dist/{chunk-ILUNZHYV.js → chunk-YFAXOD7Z.js} +10 -6
  62. package/dist/chunk-YFAXOD7Z.js.map +1 -0
  63. package/dist/{chunk-6TWWY7ZU.js → chunk-Z3JXLULD.js} +2 -2
  64. package/dist/cli/bin.js +34 -29
  65. package/dist/cli/bin.js.map +1 -1
  66. package/dist/cli/commands/audit.d.ts +4 -0
  67. package/dist/cli/commands/audit.js +25 -18
  68. package/dist/cli/commands/audit.js.map +1 -1
  69. package/dist/client-JYKPVCJX.js +11 -0
  70. package/dist/configs/playwright-a11y.js +1 -1
  71. package/dist/{convert-to-pnpm-6L6P74WR.js → convert-to-pnpm-NWB5FCQ2.js} +4 -4
  72. package/dist/{db-B35OGV3G.js → db-V6UIS433.js} +124 -29
  73. package/dist/db-V6UIS433.js.map +1 -0
  74. package/dist/{digest-BL6UJYKH.js → digest-2JEAEJK6.js} +60 -35
  75. package/dist/digest-2JEAEJK6.js.map +1 -0
  76. package/dist/digest-state-CRZRNGDI.js +25 -0
  77. package/dist/digest-state-CRZRNGDI.js.map +1 -0
  78. package/dist/digest-state-F37XUCS5.js +13 -0
  79. package/dist/{dump-P6EBSIOH.js → dump-EPL7AZFR.js} +38 -13
  80. package/dist/dump-EPL7AZFR.js.map +1 -0
  81. package/dist/{email-VTTTKKL5.js → email-SL7464YI.js} +16 -6
  82. package/dist/{email-VTTTKKL5.js.map → email-SL7464YI.js.map} +1 -1
  83. package/dist/{ensure-site-DFTB7MN3.js → ensure-site-FU6527OU.js} +19 -11
  84. package/dist/ensure-site-FU6527OU.js.map +1 -0
  85. package/dist/fleet-state-R5LU7IC3.js +41 -0
  86. package/dist/{forms-notify-target-75U6OU7L.js → forms-notify-target-SGDGXXK5.js} +10 -7
  87. package/dist/forms-notify-target-SGDGXXK5.js.map +1 -0
  88. package/dist/{github-signals-IJUPGCUX.js → github-signals-GWGCKEE2.js} +13 -12
  89. package/dist/{github-signals-IJUPGCUX.js.map → github-signals-GWGCKEE2.js.map} +1 -1
  90. package/dist/{header-image-AWLLQA4L.js → header-image-7A7XLVEU.js} +8 -8
  91. package/dist/{header-images-335L2AKB.js → header-images-SQBCE5OD.js} +21 -1
  92. package/dist/header-images-SQBCE5OD.js.map +1 -0
  93. package/dist/{health-endpoint-WJC2UMYS.js → health-endpoint-UVX6R5N5.js} +4 -4
  94. package/dist/health-mirror-GCDN7BJL.js +46 -0
  95. package/dist/health-mirror-GCDN7BJL.js.map +1 -0
  96. package/dist/{import-airtable-HE43FB4H.js → import-airtable-OHVY344G.js} +7 -5
  97. package/dist/index.d.ts +149 -0
  98. package/dist/index.js +245 -108
  99. package/dist/index.js.map +1 -1
  100. package/dist/{init-NJEOEO7I.js → init-FGTYNGUI.js} +11 -11
  101. package/dist/{launch-XNAX427U.js → launch-5H7LPEGP.js} +59 -29
  102. package/dist/launch-5H7LPEGP.js.map +1 -0
  103. package/dist/{lighthouse-airtable-LBVIYYP5.js → lighthouse-airtable-3GUWHETW.js} +3 -3
  104. package/dist/migrate-YITCXBLS.js +7 -0
  105. package/dist/{notify-C645PGD5.js → notify-4HP4GZ2H.js} +5 -5
  106. package/dist/{onboard-GK4PHPNI.js → onboard-BKCYBAVW.js} +4 -4
  107. package/dist/{orchestrate-77UO4BYJ.js → orchestrate-JNKCWU5K.js} +14 -13
  108. package/dist/parity-NBYZUBFU.js +14 -0
  109. package/dist/pdf-N5QLQ5ZQ.js +38 -0
  110. package/dist/pdf-N5QLQ5ZQ.js.map +1 -0
  111. package/dist/{pipeline-S6CVHDGB.js → pipeline-WYTXSLHX.js} +3 -3
  112. package/dist/{preflight-6WBNU2GZ.js → preflight-IMTYDDD4.js} +15 -14
  113. package/dist/{preflight-6WBNU2GZ.js.map → preflight-IMTYDDD4.js.map} +1 -1
  114. package/dist/{prismic-ci-3RHOZUUT.js → prismic-ci-MY2U6NN7.js} +7 -7
  115. package/dist/{prismic-models-QBGUT2Q3.js → prismic-models-NJN5JORF.js} +15 -10
  116. package/dist/prismic-models-NJN5JORF.js.map +1 -0
  117. package/dist/prospect/types.d.ts +281 -0
  118. package/dist/prospect/types.js +1 -0
  119. package/dist/{prospect-audit-IUNCJ2LV.js → prospect-audit-JMBRVXSG.js} +32 -13
  120. package/dist/prospect-audit-JMBRVXSG.js.map +1 -0
  121. package/dist/recipes/sync-configs.js +2 -2
  122. package/dist/render-VX72AESY.js +10 -0
  123. package/dist/render-VX72AESY.js.map +1 -0
  124. package/dist/render-from-row-DOYJDO2L.js +17 -0
  125. package/dist/render-from-row-DOYJDO2L.js.map +1 -0
  126. package/dist/{renovate-dispatch-QJY75ODR.js → renovate-dispatch-6GQWTRKX.js} +10 -10
  127. package/dist/{renovate-dispatch-QJY75ODR.js.map → renovate-dispatch-6GQWTRKX.js.map} +1 -1
  128. package/dist/{replay-C2LXMJZP.js → replay-4S6ENYCH.js} +3 -3
  129. package/dist/{report-4EVNDHOZ.js → report-TALY5P3L.js} +63 -21
  130. package/dist/report-TALY5P3L.js.map +1 -0
  131. package/dist/report-mirror-AAK3MXHY.js +55 -0
  132. package/dist/report-mirror-AAK3MXHY.js.map +1 -0
  133. package/dist/rerender-3FM6DNRH.js +32 -0
  134. package/dist/rerender-3FM6DNRH.js.map +1 -0
  135. package/dist/schema-75PJECAE.js +18 -0
  136. package/dist/schema-75PJECAE.js.map +1 -0
  137. package/dist/{self-updating-6DWI2Z56.js → self-updating-NTCCWJYZ.js} +4 -4
  138. package/dist/{selftest-RC36MTKP.js → selftest-NZTR4SM2.js} +26 -24
  139. package/dist/{selftest-RC36MTKP.js.map → selftest-NZTR4SM2.js.map} +1 -1
  140. package/dist/site-mirror-Q763PLGG.js +62 -0
  141. package/dist/site-mirror-Q763PLGG.js.map +1 -0
  142. package/dist/{smoke-suite-VYY2LXM2.js → smoke-suite-4JFZZYVW.js} +4 -4
  143. package/dist/{spam-classifier-XLBFCO7G.js → spam-classifier-T5H4VTP6.js} +4 -2
  144. package/dist/spam-classifier-T5H4VTP6.js.map +1 -0
  145. package/dist/{submissions-Q7DRFOCD.js → submissions-TEHPBSZJ.js} +5 -5
  146. package/dist/{svelte-codemods-25J2FO22.js → svelte-codemods-QAPDZC6F.js} +4 -4
  147. package/dist/{sync-34HNZZ56.js → sync-GBFV45WX.js} +6 -4
  148. package/dist/{sync-34HNZZ56.js.map → sync-GBFV45WX.js.map} +1 -1
  149. package/dist/{sync-configs-3SE6PSCO.js → sync-configs-34JIA6KZ.js} +6 -6
  150. package/dist/{upgrade-WBRQ62FX.js → upgrade-IR2OO3KP.js} +4 -4
  151. package/dist/{webflow-IRKOIT7S.js → webflow-624FEBFD.js} +4 -4
  152. package/dist/{webhook-VOGOW3W6.js → webhook-XM6EV4XT.js} +2 -2
  153. package/dist/{websites-SXWTP72S.js → websites-D6WYFAES.js} +2 -2
  154. package/dist/websites-D6WYFAES.js.map +1 -0
  155. package/dist/write-audits-to-airtable-OBHGR7DQ.js +17 -0
  156. package/dist/write-audits-to-airtable-OBHGR7DQ.js.map +1 -0
  157. package/package.json +5 -1
  158. package/dist/airtable-G7WBQQMI.js +0 -9
  159. package/dist/announce-MXTUQ6C7.js.map +0 -1
  160. package/dist/chunk-2EVEFOZY.js.map +0 -1
  161. package/dist/chunk-2NDRHXMR.js.map +0 -1
  162. package/dist/chunk-2ZPT7GLV.js.map +0 -1
  163. package/dist/chunk-ACBRLLFT.js.map +0 -1
  164. package/dist/chunk-BYK66EWO.js.map +0 -1
  165. package/dist/chunk-C6B4RHXR.js.map +0 -1
  166. package/dist/chunk-DJZWYIPP.js.map +0 -1
  167. package/dist/chunk-F5KM4LEQ.js.map +0 -1
  168. package/dist/chunk-ILUNZHYV.js.map +0 -1
  169. package/dist/chunk-ITIOFN7A.js.map +0 -1
  170. package/dist/chunk-PPE5KZJK.js.map +0 -1
  171. package/dist/chunk-SNSTJLQW.js.map +0 -1
  172. package/dist/chunk-W7Z3BGCI.js.map +0 -1
  173. package/dist/chunk-X3B723J4.js.map +0 -1
  174. package/dist/client-AUE3XUPO.js +0 -11
  175. package/dist/db-B35OGV3G.js.map +0 -1
  176. package/dist/digest-BL6UJYKH.js.map +0 -1
  177. package/dist/dump-P6EBSIOH.js.map +0 -1
  178. package/dist/ensure-site-DFTB7MN3.js.map +0 -1
  179. package/dist/forms-notify-target-75U6OU7L.js.map +0 -1
  180. package/dist/header-images-335L2AKB.js.map +0 -1
  181. package/dist/health-mirror-4B2L7T2Y.js +0 -75
  182. package/dist/health-mirror-4B2L7T2Y.js.map +0 -1
  183. package/dist/launch-XNAX427U.js.map +0 -1
  184. package/dist/migrate-GQH237A6.js +0 -7
  185. package/dist/parity-MWS24A3H.js +0 -12
  186. package/dist/prismic-models-QBGUT2Q3.js.map +0 -1
  187. package/dist/prospect-audit-IUNCJ2LV.js.map +0 -1
  188. package/dist/render-AQAVQDPZ.js +0 -10
  189. package/dist/report-4EVNDHOZ.js.map +0 -1
  190. package/dist/write-audits-to-airtable-MBEILLPU.js +0 -14
  191. /package/dist/{airtable-G7WBQQMI.js.map → airtable-QG5ICI3Y.js.map} +0 -0
  192. /package/dist/{client-AUE3XUPO.js.map → attachments-NLZIJ5NU.js.map} +0 -0
  193. /package/dist/{blux-ZGDSHI3U.js.map → blux-DN4MI532.js.map} +0 -0
  194. /package/dist/{bump-deps-EC74CPLS.js.map → bump-deps-KGH5UYSF.js.map} +0 -0
  195. /package/dist/{chunk-N45M3FDK.js.map → chunk-6I6L3CMX.js.map} +0 -0
  196. /package/dist/{chunk-KTH5ZODA.js.map → chunk-7BZUOZPU.js.map} +0 -0
  197. /package/dist/{chunk-3VQWSE3F.js.map → chunk-7UAYMAKR.js.map} +0 -0
  198. /package/dist/{chunk-Z7AXYKQB.js.map → chunk-IY6256GK.js.map} +0 -0
  199. /package/dist/{chunk-BNM5POSJ.js.map → chunk-JRHIFA5R.js.map} +0 -0
  200. /package/dist/{chunk-ZKXSX4LO.js.map → chunk-K6SLF6GI.js.map} +0 -0
  201. /package/dist/{chunk-SLUQ7R6I.js.map → chunk-PR343K7F.js.map} +0 -0
  202. /package/dist/{chunk-P2FE5AI6.js.map → chunk-Q47DU255.js.map} +0 -0
  203. /package/dist/{chunk-VSBFM7DS.js.map → chunk-SJOXWJ5Y.js.map} +0 -0
  204. /package/dist/{chunk-TERE5SDF.js.map → chunk-ULHPALI5.js.map} +0 -0
  205. /package/dist/{chunk-XUGSZP7Z.js.map → chunk-W45FZEGE.js.map} +0 -0
  206. /package/dist/{chunk-JHGHLKFS.js.map → chunk-WS6NU475.js.map} +0 -0
  207. /package/dist/{chunk-6TWWY7ZU.js.map → chunk-Z3JXLULD.js.map} +0 -0
  208. /package/dist/{import-airtable-HE43FB4H.js.map → client-JYKPVCJX.js.map} +0 -0
  209. /package/dist/{convert-to-pnpm-6L6P74WR.js.map → convert-to-pnpm-NWB5FCQ2.js.map} +0 -0
  210. /package/dist/{lighthouse-airtable-LBVIYYP5.js.map → digest-state-F37XUCS5.js.map} +0 -0
  211. /package/dist/{migrate-GQH237A6.js.map → fleet-state-R5LU7IC3.js.map} +0 -0
  212. /package/dist/{header-image-AWLLQA4L.js.map → header-image-7A7XLVEU.js.map} +0 -0
  213. /package/dist/{health-endpoint-WJC2UMYS.js.map → health-endpoint-UVX6R5N5.js.map} +0 -0
  214. /package/dist/{notify-C645PGD5.js.map → import-airtable-OHVY344G.js.map} +0 -0
  215. /package/dist/{init-NJEOEO7I.js.map → init-FGTYNGUI.js.map} +0 -0
  216. /package/dist/{orchestrate-77UO4BYJ.js.map → lighthouse-airtable-3GUWHETW.js.map} +0 -0
  217. /package/dist/{parity-MWS24A3H.js.map → migrate-YITCXBLS.js.map} +0 -0
  218. /package/dist/{pipeline-S6CVHDGB.js.map → notify-4HP4GZ2H.js.map} +0 -0
  219. /package/dist/{onboard-GK4PHPNI.js.map → onboard-BKCYBAVW.js.map} +0 -0
  220. /package/dist/{render-AQAVQDPZ.js.map → orchestrate-JNKCWU5K.js.map} +0 -0
  221. /package/dist/{spam-classifier-XLBFCO7G.js.map → parity-NBYZUBFU.js.map} +0 -0
  222. /package/dist/{websites-SXWTP72S.js.map → pipeline-WYTXSLHX.js.map} +0 -0
  223. /package/dist/{prismic-ci-3RHOZUUT.js.map → prismic-ci-MY2U6NN7.js.map} +0 -0
  224. /package/dist/{write-audits-to-airtable-MBEILLPU.js.map → prospect/types.js.map} +0 -0
  225. /package/dist/{replay-C2LXMJZP.js.map → replay-4S6ENYCH.js.map} +0 -0
  226. /package/dist/{self-updating-6DWI2Z56.js.map → self-updating-NTCCWJYZ.js.map} +0 -0
  227. /package/dist/{smoke-suite-VYY2LXM2.js.map → smoke-suite-4JFZZYVW.js.map} +0 -0
  228. /package/dist/{submissions-Q7DRFOCD.js.map → submissions-TEHPBSZJ.js.map} +0 -0
  229. /package/dist/{svelte-codemods-25J2FO22.js.map → svelte-codemods-QAPDZC6F.js.map} +0 -0
  230. /package/dist/{sync-configs-3SE6PSCO.js.map → sync-configs-34JIA6KZ.js.map} +0 -0
  231. /package/dist/{upgrade-WBRQ62FX.js.map → upgrade-IR2OO3KP.js.map} +0 -0
  232. /package/dist/{webflow-IRKOIT7S.js.map → webflow-624FEBFD.js.map} +0 -0
  233. /package/dist/{webhook-VOGOW3W6.js.map → webhook-XM6EV4XT.js.map} +0 -0
@@ -0,0 +1,9 @@
1
+ import {
2
+ fromAirtableBase
3
+ } from "./chunk-PR343K7F.js";
4
+ import "./chunk-7NYN2P6I.js";
5
+ import "./chunk-RARREDQE.js";
6
+ export {
7
+ fromAirtableBase
8
+ };
9
+ //# sourceMappingURL=airtable-QG5ICI3Y.js.map
@@ -1,44 +1,44 @@
1
1
  import {
2
2
  scoresFromRow
3
- } from "./chunk-TERE5SDF.js";
3
+ } from "./chunk-ULHPALI5.js";
4
4
  import {
5
5
  fetchGaUsers,
6
6
  fetchSearch,
7
7
  readGaConfig,
8
8
  refreshHeaderImage
9
- } from "./chunk-BYK66EWO.js";
9
+ } from "./chunk-J3WEZGIN.js";
10
10
  import {
11
11
  queueDraft
12
- } from "./chunk-ILUNZHYV.js";
13
- import {
14
- defaultReportSubject
15
- } from "./chunk-GECESMVS.js";
16
- import "./chunk-5UINJNAJ.js";
17
- import {
18
- announcementSiteExtras,
19
- renderReportHtml,
20
- resolveCopy
21
- } from "./chunk-CQR4LIM7.js";
22
- import {
23
- uploadAttachment
24
- } from "./chunk-Z7AXYKQB.js";
25
- import "./chunk-DJZWYIPP.js";
12
+ } from "./chunk-YFAXOD7Z.js";
26
13
  import {
27
14
  createDraft,
28
15
  findReportByPeriod,
29
16
  updateReportScores
30
- } from "./chunk-ACBRLLFT.js";
17
+ } from "./chunk-F3JWOPTG.js";
31
18
  import "./chunk-VAD43MOR.js";
19
+ import {
20
+ uploadAttachment
21
+ } from "./chunk-IY6256GK.js";
32
22
  import {
33
23
  openBase,
34
24
  readAirtableConfig
35
25
  } from "./chunk-HN6I2XWI.js";
36
- import "./chunk-EVBCK2KC.js";
26
+ import {
27
+ defaultReportSubject
28
+ } from "./chunk-GECESMVS.js";
29
+ import "./chunk-5UINJNAJ.js";
30
+ import {
31
+ announcementSiteExtras,
32
+ renderReportHtml,
33
+ resolveCopy
34
+ } from "./chunk-KJGKZLCT.js";
35
+ import "./chunk-BGTYPVLT.js";
37
36
  import {
38
37
  listWebsites,
39
38
  siteSlug,
40
39
  updateAnalyticsHealth
41
- } from "./chunk-LDWZSLSU.js";
40
+ } from "./chunk-7NYN2P6I.js";
41
+ import "./chunk-RARREDQE.js";
42
42
  import "./chunk-6VAL7XJT.js";
43
43
 
44
44
  // src/recipes/announce.ts
@@ -77,11 +77,12 @@ async function announce(deps) {
77
77
  };
78
78
  if (readGaConfig() !== null && Boolean(w.ga4PropertyId || w.searchQuery)) {
79
79
  try {
80
- await updateAnalyticsHealth(
80
+ const fields = await updateAnalyticsHealth(
81
81
  base,
82
82
  w.id,
83
83
  gaResult.softFailed || searchResult.softFailed ? now.toISOString() : null
84
84
  );
85
+ await deps?.siteMirror?.health(w.id, fields);
85
86
  } catch (e) {
86
87
  console.warn(`\u26A0 analytics-health write skipped for ${w.name}: ${e.message}`);
87
88
  }
@@ -91,10 +92,25 @@ async function announce(deps) {
91
92
  const existing = await findReportByPeriod(base, w.id, "Announcement", period);
92
93
  if (existing) {
93
94
  await updateReportScores(base, existing.id, scores, now, enrichment);
95
+ await deps?.reportMirror?.patch(existing.id, {
96
+ lighthouse_performance: scores.performance,
97
+ lighthouse_accessibility: scores.accessibility,
98
+ lighthouse_best_practices: scores.bestPractices,
99
+ lighthouse_seo: scores.seo,
100
+ completed_on: now.toISOString().slice(0, 10),
101
+ ...enrichment.gaUsersCurrent !== void 0 ? { ga_users_current: enrichment.gaUsersCurrent } : {},
102
+ ...enrichment.gaUsersPrevious !== void 0 ? { ga_users_previous: enrichment.gaUsersPrevious } : {},
103
+ ...enrichment.searchFoundPage1 !== void 0 ? { search_found_page1: enrichment.searchFoundPage1 ? 1 : 0 } : {},
104
+ ...enrichment.searchPosition !== void 0 ? { search_position: enrichment.searchPosition } : {}
105
+ });
94
106
  report = existing;
95
107
  statusKind = "reused";
96
108
  } else {
97
- report = await createDraft(base, draftInputFor(w, scores, now, period, enrichment));
109
+ report = await createDraft(
110
+ base,
111
+ draftInputFor(w, scores, now, period, enrichment),
112
+ deps?.reportMirror?.created
113
+ );
98
114
  statusKind = "drafted";
99
115
  }
100
116
  const slug = siteSlug(w.name);
@@ -125,16 +141,17 @@ async function announce(deps) {
125
141
  `${slug}-${now.toISOString().slice(0, 10)}.html`,
126
142
  "text/html"
127
143
  );
144
+ await deps?.reportMirror?.body(report.id, html);
128
145
  } catch (uploadErr) {
129
146
  console.warn(
130
147
  `\u26A0 Announcement preview upload skipped for ${w.name}: ${uploadErr instanceof Error ? uploadErr.message : String(uploadErr)}`
131
148
  );
132
149
  }
133
- const queue = await queueDraft(base, {
134
- id: report.id,
135
- siteId: w.id,
136
- reportType: "Announcement"
137
- });
150
+ const queue = await queueDraft(
151
+ base,
152
+ { id: report.id, siteId: w.id, reportType: "Announcement" },
153
+ deps?.reportMirror
154
+ );
138
155
  const recipientMissing = !(w.reportRecipientsTo && w.reportRecipientsTo.trim());
139
156
  results.push({
140
157
  site: w.name,
@@ -186,7 +203,11 @@ function formatAnnounceResult(result) {
186
203
  return result.results.map(formatSiteResult).join("\n");
187
204
  }
188
205
  async function runAnnounceCommand(site, _opts) {
189
- const result = await announce(site ? { site } : {});
206
+ const { makeReportMirror } = await import("./report-mirror-AAK3MXHY.js");
207
+ const { makeSiteMirror } = await import("./site-mirror-Q763PLGG.js");
208
+ const reportMirror = await makeReportMirror();
209
+ const siteMirror = await makeSiteMirror();
210
+ const result = await announce({ ...site ? { site } : {}, reportMirror, siteMirror });
190
211
  const hadError = result.results.some((r) => r.status === "error");
191
212
  return { output: formatAnnounceResult(result), code: hadError ? 1 : 0 };
192
213
  }
@@ -194,4 +215,4 @@ export {
194
215
  formatAnnounceResult,
195
216
  runAnnounceCommand
196
217
  };
197
- //# sourceMappingURL=announce-MXTUQ6C7.js.map
218
+ //# sourceMappingURL=announce-GKD5YJNB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/recipes/announce.ts","../src/cli/commands/announce.ts"],"sourcesContent":["import { openBase, readAirtableConfig } from \"../reports/airtable/client.js\";\nimport type { AirtableBase } from \"../reports/airtable/client.js\";\nimport { listWebsites, siteSlug, updateAnalyticsHealth } from \"../reports/airtable/websites.js\";\nimport type { WebsiteRow } from \"../reports/airtable/websites.js\";\nimport { readGaConfig } from \"../reports/ga/config.js\";\nimport {\n createDraft,\n findReportByPeriod,\n updateReportScores,\n type ReportEnrichment,\n} from \"../reports/airtable/reports.js\";\nimport type { ReportMirror } from \"../reports/report-mirror.js\";\nimport type { SiteMirror } from \"../db/site-mirror.js\";\nimport { queueDraft } from \"../reports/queue.js\";\nimport { uploadAttachment } from \"../reports/airtable/attachments.js\";\nimport { renderReportHtml } from \"../reports/render.js\";\nimport { resolveCopy } from \"../reports/copy.js\";\nimport { fetchGaUsers, fetchSearch, refreshHeaderImage } from \"../reports/draft.js\";\nimport type { RefreshHeaderDeps } from \"../reports/draft.js\";\nimport { announcementSiteExtras } from \"../reports/announcement-email/template.js\";\nimport type { LighthouseScores } from \"../reports/types.js\";\nimport { defaultReportSubject } from \"../reports/subject.js\";\nimport { scoresFromRow } from \"../reports/report-data.js\";\n\nexport type AnnounceSiteResult =\n | {\n site: string;\n status: \"drafted\" | \"reused\";\n reportId: string;\n recipientMissing: boolean;\n /** False when a higher-or-equal-tier report was already queued (single-queue rule). */\n queued: boolean;\n }\n | { site: string; status: \"skipped-no-scores\" }\n | { site: string; status: \"error\"; message: string };\n\nexport type AnnounceResult = { results: AnnounceSiteResult[] };\n\n/** The traffic/search lookback window (days) the announcement reports on. The trend compares it\n * against the equal-length prior window, and the email labels it \"vs the previous N days\". */\nconst GA_WINDOW_DAYS = 30;\n\nexport type AnnounceDeps = {\n /** Airtable handle. Defaults to opening the live base from credentials. */\n base?: AirtableBase;\n /** When set, restrict to the single site whose slug matches. Default: all maintenance sites. */\n site?: string;\n /** Single timestamp driving the period key, render, draft, and preview filename. */\n now?: Date;\n /**\n * Header-image refresh, matching `draftReportForSite`'s opt-out shape: UNSET means\n * refresh (the production default), `false` skips it so unit suites don't launch a\n * browser. Announce previously never refreshed at all, so a site whose stored header\n * predated a plate change kept announcing with the old one until its next\n * Maintenance/Testing draft happened to heal it.\n */\n refreshHeader?: RefreshHeaderDeps | false;\n /** #539 Phase 5: Turso write-through for everything this recipe writes — the\n * created row (or a reused row's refreshed scores), the rendered body, and\n * the queue flag. Not defaulted here — every unit test calls `announce` with\n * a fake base, and a default would open a real libSQL handle from inside the\n * suite. The CLI composition root wires it. */\n reportMirror?: ReportMirror;\n /** #539 Phase 5: the Websites-row twin — announce stamps `Analytics soft-fail\n * at` on the SITE row, a different Turso table from the report. */\n siteMirror?: SiteMirror;\n};\n\n/**\n * Draft the monthly-report ANNOUNCEMENT email for every `maintenance` site (or one,\n * via `deps.site`). Airtable-driven and fleet-wide: unlike `launch`, it runs no audits\n * and takes no `Site`/inventory object — it reads the Lighthouse scores already stored\n * on each Websites row. DRAFTS ONLY; the M3 approve loop sends.\n *\n * One bad site must never abort the run: each site is wrapped in its own try/catch that\n * records an `error` result and continues.\n */\nexport async function announce(deps?: AnnounceDeps): Promise<AnnounceResult> {\n const base = deps?.base ?? openBase(readAirtableConfig());\n const now = deps?.now ?? new Date();\n\n const websites = await listWebsites(base);\n let targets = websites.filter((w) => w.status === \"maintained\");\n if (deps?.site) {\n const wanted = siteSlug(deps.site);\n targets = targets.filter((w) => siteSlug(w.name) === wanted);\n }\n\n const period = now.toISOString().slice(0, 7);\n const results: AnnounceSiteResult[] = [];\n\n for (const w of targets) {\n try {\n const scores = scoresFromRow(w);\n if (scores === null) {\n results.push({ site: w.name, status: \"skipped-no-scores\" });\n continue;\n }\n\n // Refresh BEFORE the render so a queued announcement always has a current header\n // stored — the send re-reads the attachment, so a stale one here reaches the\n // client. Best-effort by construction: refreshHeaderImage returns false and never\n // throws, so a capture failure leaves the stored image and the draft continues.\n if (deps?.refreshHeader !== false) {\n await refreshHeaderImage(w, deps?.refreshHeader ?? {});\n }\n\n // Traffic + search snapshot over a ~30-day window ending now (fetchPeriodUsers derives\n // the equal-length previous window for the trend). Reuses the report pipeline's\n // soft-failing enrichment: GA/search unconfigured or an API error leaves the numbers\n // null and the email simply omits the traffic section — it never blocks the draft.\n const periodEnd = now;\n const periodStart = new Date(now.getTime() - GA_WINDOW_DAYS * 24 * 60 * 60 * 1000);\n const gaResult = await fetchGaUsers(w, periodStart, periodEnd);\n const searchResult = await fetchSearch(w, periodStart, periodEnd);\n const gaUsers = gaResult.value;\n const search = searchResult.value;\n const enrichment: ReportEnrichment = {\n ...(gaUsers ? { gaUsersCurrent: gaUsers.current, gaUsersPrevious: gaUsers.previous } : {}),\n ...(search ? { searchFoundPage1: search.foundOnPage1 } : {}),\n ...(search?.foundOnPage1 && search.position !== null\n ? { searchPosition: search.position }\n : {}),\n };\n\n // Record this site's GA/Search enrichment health for the per-site analytics-failure\n // signal (cockpit/digest) — exactly as the `--due` draft path does. Without this, an\n // announcement-time GA outage hides the traffic block with NO operator signal (it reads\n // identically to \"site has no GA configured\"). Set the timestamp on a soft-fail, clear\n // it on a clean enrichment so the signal self-heals. Best-effort: the column is\n // operator-added, so until it exists the write throws — which must not break the draft.\n if (readGaConfig() !== null && Boolean(w.ga4PropertyId || w.searchQuery)) {\n try {\n const fields = await updateAnalyticsHealth(\n base,\n w.id,\n gaResult.softFailed || searchResult.softFailed ? now.toISOString() : null,\n );\n // Mirror the EXACT FieldSet Airtable got — see draft.ts.\n await deps?.siteMirror?.health(w.id, fields);\n } catch (e) {\n console.warn(`⚠ analytics-health write skipped for ${w.name}: ${(e as Error).message}`);\n }\n }\n\n // Dedupe: reuse an existing Announcement row for this (site, period) rather than\n // stacking a second draft. The reuse path refreshes the stored scores + traffic/search\n // (and Completed on) so the eventually-sent email — which reads the row — isn't stale.\n // The create path writes them via createDraft.\n let report;\n let statusKind: \"drafted\" | \"reused\";\n const existing = await findReportByPeriod(base, w.id, \"Announcement\", period);\n if (existing) {\n await updateReportScores(base, existing.id, scores, now, enrichment);\n // Mirror the SAME refresh: the reuse path exists so the eventually-sent\n // email is not stale, and the console reads those numbers too.\n await deps?.reportMirror?.patch(existing.id, {\n lighthouse_performance: scores.performance,\n lighthouse_accessibility: scores.accessibility,\n lighthouse_best_practices: scores.bestPractices,\n lighthouse_seo: scores.seo,\n completed_on: now.toISOString().slice(0, 10),\n ...(enrichment.gaUsersCurrent !== undefined\n ? { ga_users_current: enrichment.gaUsersCurrent }\n : {}),\n ...(enrichment.gaUsersPrevious !== undefined\n ? { ga_users_previous: enrichment.gaUsersPrevious }\n : {}),\n ...(enrichment.searchFoundPage1 !== undefined\n ? { search_found_page1: enrichment.searchFoundPage1 ? 1 : 0 }\n : {}),\n ...(enrichment.searchPosition !== undefined\n ? { search_position: enrichment.searchPosition }\n : {}),\n });\n report = existing;\n statusKind = \"reused\";\n } else {\n report = await createDraft(\n base,\n draftInputFor(w, scores, now, period, enrichment),\n deps?.reportMirror?.created,\n );\n statusKind = \"drafted\";\n }\n\n const slug = siteSlug(w.name);\n const { html } = await renderReportHtml({\n siteName: w.name,\n siteUrl: w.url,\n reportType: \"Announcement\",\n completedOn: now,\n lighthouse: scores,\n gaUsersCurrent: gaUsers?.current,\n gaUsersPrevious: gaUsers?.previous,\n gaPeriodDays: GA_WINDOW_DAYS,\n searchPosition: search?.foundOnPage1 ? (search.position ?? undefined) : undefined,\n lastTestedDate: null,\n commentary: null,\n copy: resolveCopy(w),\n headerImageCid: `${slug}-header`,\n // cadence (the client's go-forward pace, \"None\" omitted) + default-on improvement\n // callouts. Shared with the send re-render via announcementSiteExtras so the sent\n // email matches this reviewed preview.\n ...announcementSiteExtras(w),\n });\n\n // A preview-upload hiccup must NOT fail the site — log and continue.\n try {\n await uploadAttachment(\n report.id,\n \"Rendered HTML\",\n html,\n `${slug}-${now.toISOString().slice(0, 10)}.html`,\n \"text/html\",\n );\n // Store the same body in Turso — the console's preview route reads it\n // there, not from the Airtable attachment (whose URL expires).\n await deps?.reportMirror?.body(report.id, html);\n } catch (uploadErr) {\n console.warn(\n `⚠ Announcement preview upload skipped for ${w.name}: ${\n uploadErr instanceof Error ? uploadErr.message : String(uploadErr)\n }`,\n );\n }\n\n // Critical: NOT wrapped — without queueing, the draft never enters the approve queue,\n // so a failure here must surface as an error result for the site. queueDraft also\n // supersedes any lower-tier (Maintenance/Testing) drafts queued for this site, and\n // stands down if an equal-or-higher report is already queued (single-queue rule).\n const queue = await queueDraft(\n base,\n { id: report.id, siteId: w.id, reportType: \"Announcement\" },\n deps?.reportMirror,\n );\n\n const recipientMissing = !(w.reportRecipientsTo && w.reportRecipientsTo.trim());\n results.push({\n site: w.name,\n status: statusKind,\n reportId: report.id,\n recipientMissing,\n queued: queue.queued,\n });\n } catch (err) {\n results.push({\n site: w.name,\n status: \"error\",\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { results };\n}\n\n/** Build the Announcement `DraftInput`. Announcements have no period window and no prior\n * maintenance test, so periodStart/periodEnd/completedOn all collapse to `now` and\n * `lastTestedDate` is null. The subject override gives the email a purpose-built line. */\nfunction draftInputFor(\n w: WebsiteRow,\n scores: LighthouseScores,\n now: Date,\n period: string,\n enrichment: ReportEnrichment,\n): Parameters<typeof createDraft>[1] {\n return {\n reportId: `${w.name} — Announcement — ${now.toISOString().slice(0, 10)}`,\n siteId: w.id,\n reportType: \"Announcement\",\n period,\n periodStart: now,\n periodEnd: now,\n completedOn: now,\n lighthouse: scores,\n lastTestedDate: null,\n subjectOverride: defaultReportSubject({\n name: w.name,\n url: w.url,\n type: \"Announcement\",\n date: now,\n }),\n ...enrichment,\n };\n}\n","import { announce, type AnnounceResult, type AnnounceSiteResult } from \"../../recipes/announce.js\";\n\nexport type AnnounceCommandOptions = {\n cwd?: string;\n};\n\nfunction formatSiteResult(r: AnnounceSiteResult): string {\n if (r.status === \"skipped-no-scores\") return `[${r.site}] skipped-no-scores`;\n if (r.status === \"error\") return `[${r.site}] error: ${r.message}`;\n const note = r.recipientMissing ? \" ⚠ recipient missing\" : \"\";\n return `[${r.site}] ${r.status}${note}`;\n}\n\nexport function formatAnnounceResult(result: AnnounceResult): string {\n if (result.results.length === 0) return \"No maintenance sites to announce.\";\n return result.results.map(formatSiteResult).join(\"\\n\");\n}\n\n/**\n * `announce [site]` — Airtable-driven and fleet-wide. Draft the monthly-report\n * announcement email for every `maintenance` site (or one, when `site` is given) into\n * the M3 approve queue. Never sends; the operator approves each draft and the next send\n * run delivers it. Reads the Lighthouse scores already stored on each Websites row —\n * no audits are run.\n */\nexport async function runAnnounceCommand(\n site: string | undefined,\n _opts: AnnounceCommandOptions,\n): Promise<{ output: string; code: number }> {\n // #539 Phase 5: the create-side Turso dual-write is wired HERE rather than\n // inside `announce`, so a unit suite calling the recipe with a fake base can\n // never open a real libSQL handle (and, with TURSO_* exported locally, write\n // into production).\n const { makeReportMirror } = await import(\"../../reports/report-mirror.js\");\n const { makeSiteMirror } = await import(\"../../db/site-mirror.js\");\n const reportMirror = await makeReportMirror();\n const siteMirror = await makeSiteMirror();\n const result = await announce({ ...(site ? { site } : {}), reportMirror, siteMirror });\n const hadError = result.results.some((r) => r.status === \"error\");\n return { output: formatAnnounceResult(result), code: hadError ? 1 : 0 };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ fetchAttachmentBytes,
3
+ uploadAttachment
4
+ } from "./chunk-IY6256GK.js";
5
+ export {
6
+ fetchAttachmentBytes,
7
+ uploadAttachment
8
+ };
9
+ //# sourceMappingURL=attachments-NLZIJ5NU.js.map
@@ -1,13 +1,13 @@
1
- import {
2
- assetRef,
3
- richText
4
- } from "./chunk-UWJZXL2D.js";
5
1
  import {
6
2
  FROZEN_PAGE_TYPE,
7
3
  extractMapConfig,
8
4
  frozenPageCustomType,
9
5
  makeIsMapMount
10
6
  } from "./chunk-DRDAEELJ.js";
7
+ import {
8
+ assetRef,
9
+ richText
10
+ } from "./chunk-UWJZXL2D.js";
11
11
  import {
12
12
  CDN_HOSTS,
13
13
  collectAssetUrls
@@ -4767,4 +4767,4 @@ ${lines.join("\n")}`,
4767
4767
  export {
4768
4768
  runBluxCommand
4769
4769
  };
4770
- //# sourceMappingURL=blux-ZGDSHI3U.js.map
4770
+ //# sourceMappingURL=blux-DN4MI532.js.map
@@ -8,13 +8,13 @@ import {
8
8
  } from "./chunk-TVL5MVUF.js";
9
9
  import {
10
10
  resolveSites
11
- } from "./chunk-P2FE5AI6.js";
11
+ } from "./chunk-Q47DU255.js";
12
12
  import {
13
13
  bumpDeps
14
14
  } from "./chunk-2NJQLSEU.js";
15
15
  import "./chunk-3G25KIWW.js";
16
- import "./chunk-6TWWY7ZU.js";
17
- import "./chunk-EVBCK2KC.js";
16
+ import "./chunk-Z3JXLULD.js";
17
+ import "./chunk-RARREDQE.js";
18
18
  import "./chunk-XTK5VIQB.js";
19
19
  import "./chunk-LBYOLBW7.js";
20
20
  import "./chunk-XXTZBPUY.js";
@@ -57,4 +57,4 @@ async function runBumpDepsCommand(site, opts) {
57
57
  export {
58
58
  runBumpDepsCommand
59
59
  };
60
- //# sourceMappingURL=bump-deps-EC74CPLS.js.map
60
+ //# sourceMappingURL=bump-deps-KGH5UYSF.js.map
@@ -5,10 +5,10 @@ import {
5
5
  import {
6
6
  isProbablyEmail,
7
7
  parseAddresses
8
- } from "./chunk-2NDRHXMR.js";
8
+ } from "./chunk-DGZWFI2G.js";
9
9
  import {
10
10
  listAllReports
11
- } from "./chunk-ACBRLLFT.js";
11
+ } from "./chunk-F3JWOPTG.js";
12
12
  import {
13
13
  gatingHealth,
14
14
  isSendOverridden
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  listWebsites,
22
22
  siteSlug
23
- } from "./chunk-LDWZSLSU.js";
23
+ } from "./chunk-7NYN2P6I.js";
24
24
 
25
25
  // src/reports/preflight.ts
26
26
  var OPERATOR_DOMAINS = ["reddoorla.com", "tuckerlemos.com"];
@@ -341,4 +341,4 @@ export {
341
341
  preflight,
342
342
  approveBlockers
343
343
  };
344
- //# sourceMappingURL=chunk-N45M3FDK.js.map
344
+ //# sourceMappingURL=chunk-6I6L3CMX.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  siteSlug
3
- } from "./chunk-LDWZSLSU.js";
3
+ } from "./chunk-7NYN2P6I.js";
4
4
 
5
5
  // src/audits/lighthouse-airtable.ts
6
6
  import { readFile } from "fs/promises";
@@ -48,4 +48,4 @@ export {
48
48
  lighthouseScoresFromResult,
49
49
  resolveSlugFromCwd
50
50
  };
51
- //# sourceMappingURL=chunk-KTH5ZODA.js.map
51
+ //# sourceMappingURL=chunk-7BZUOZPU.js.map
@@ -1,7 +1,10 @@
1
+ import {
2
+ REPORT_LIST_COLUMNS
3
+ } from "./chunk-GQDDWYU2.js";
1
4
  import {
2
5
  mapReportRecord,
3
6
  mapWebsiteRecord
4
- } from "./chunk-ITIOFN7A.js";
7
+ } from "./chunk-P6AORG32.js";
5
8
 
6
9
  // src/db/parity.ts
7
10
  var SKIP_COLUMNS = /* @__PURE__ */ new Set([
@@ -82,7 +85,7 @@ async function checkFleetParity(db, io) {
82
85
  }
83
86
  const reports = await io.listReportRecords();
84
87
  const reportRows = byId(
85
- await db.selectFrom("reports").selectAll().execute(),
88
+ await db.selectFrom("reports").select(REPORT_LIST_COLUMNS).execute(),
86
89
  "id"
87
90
  );
88
91
  for (const rec of reports) {
@@ -126,4 +129,4 @@ export {
126
129
  checkFleetParity,
127
130
  formatParityResult
128
131
  };
129
- //# sourceMappingURL=chunk-2EVEFOZY.js.map
132
+ //# sourceMappingURL=chunk-7FFUBF4I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/parity.ts"],"sourcesContent":["import type { Db } from \"./client.js\";\nimport { mapWebsiteRecord, mapReportRecord, type RawRecord } from \"./import-airtable.js\";\nimport { REPORT_LIST_COLUMNS } from \"./fleet-state.js\";\n\n/**\n * Phase 1.4 of #539: the instrument the cutover depends on. Reads BOTH stores\n * and diffs field-by-field, using the importer's own mapping functions — so\n * \"what parity expects\" is definitionally \"what the importer writes\", and the\n * two cannot drift apart.\n *\n * Per the repo's standing rule, this harness must be shown to PASS GREEN on the\n * pre-cutover state (immediately after an import, when the stores genuinely\n * agree) before any mismatch it reports is treated as a finding. A harness that\n * has only ever failed is not evidence.\n *\n * Deliberately NOT compared:\n * - `site_schedule.computed_at` — an import stamp, different by construction.\n * - `sites.header_image*` — Airtable stopped being the source (design D5).\n * - `reports.rendered_html` — comparing it would re-download every attachment\n * on every run against URLs that expire; presence is checked at import time\n * and the body never changes after a send.\n */\n\nexport type ParityMismatch = {\n table: \"sites\" | \"site_health\" | \"site_schedule\" | \"reports\";\n id: string;\n column: string;\n airtable: string;\n turso: string;\n};\n\nexport type ParityResult = {\n compared: Record<\"sites\" | \"site_health\" | \"site_schedule\" | \"reports\", number>;\n mismatches: ParityMismatch[];\n};\n\nconst SKIP_COLUMNS: ReadonlySet<string> = new Set([\n \"computed_at\",\n \"header_image\",\n \"header_image_filename\",\n \"header_image_type\",\n \"header_image_generated_at\",\n \"rendered_html\",\n]);\n\nconst show = (v: unknown): string => {\n if (v === null || v === undefined) return \"∅\";\n const str = typeof v === \"string\" ? v : JSON.stringify(v);\n return str.length > 80 ? `${str.slice(0, 77)}…` : str;\n};\n\nfunction diffRows(\n table: ParityMismatch[\"table\"],\n id: string,\n expected: Record<string, unknown>,\n actual: Record<string, unknown> | undefined,\n out: ParityMismatch[],\n): void {\n if (!actual) {\n out.push({ table, id, column: \"(row)\", airtable: \"present\", turso: \"ABSENT\" });\n return;\n }\n for (const [col, want] of Object.entries(expected)) {\n if (SKIP_COLUMNS.has(col)) continue;\n const got = actual[col] ?? null;\n const wantNorm = want ?? null;\n if (String(wantNorm ?? \"\") !== String(got ?? \"\") && !(wantNorm === null && got === null)) {\n out.push({ table, id, column: col, airtable: show(wantNorm), turso: show(got) });\n }\n }\n}\n\nexport type ParityIo = {\n listWebsiteRecords: () => Promise<RawRecord[]>;\n listReportRecords: () => Promise<RawRecord[]>;\n now: () => Date;\n};\n\nexport async function checkFleetParity(db: Db, io: ParityIo): Promise<ParityResult> {\n const computedAt = io.now().toISOString();\n const mismatches: ParityMismatch[] = [];\n\n const websites = await io.listWebsiteRecords();\n const mapped = websites.map((r) => mapWebsiteRecord(r, computedAt));\n\n const [sites, health, schedule] = await Promise.all([\n db.selectFrom(\"sites\").selectAll().execute(),\n db.selectFrom(\"site_health\").selectAll().execute(),\n db.selectFrom(\"site_schedule\").selectAll().execute(),\n ]);\n const byId = <T extends { [k: string]: unknown }>(rows: T[], key: string): Map<string, T> =>\n new Map(rows.map((r) => [String(r[key]), r]));\n const sitesById = byId(sites as Array<Record<string, unknown>>, \"id\");\n const healthById = byId(health as Array<Record<string, unknown>>, \"site_id\");\n const scheduleById = byId(schedule as Array<Record<string, unknown>>, \"site_id\");\n\n for (const m of mapped) {\n diffRows(\n \"sites\",\n m.site.id,\n m.site as unknown as Record<string, unknown>,\n sitesById.get(m.site.id),\n mismatches,\n );\n diffRows(\n \"site_health\",\n m.health.site_id,\n m.health as unknown as Record<string, unknown>,\n healthById.get(m.health.site_id),\n mismatches,\n );\n diffRows(\n \"site_schedule\",\n m.schedule.site_id,\n m.schedule as unknown as Record<string, unknown>,\n scheduleById.get(m.schedule.site_id),\n mismatches,\n );\n }\n // A Turso site Airtable no longer has is as much a divergence as a missing one.\n const airtableIds = new Set(mapped.map((m) => m.site.id));\n for (const row of sitesById.keys()) {\n if (!airtableIds.has(row)) {\n mismatches.push({\n table: \"sites\",\n id: row,\n column: \"(row)\",\n airtable: \"ABSENT\",\n turso: \"present\",\n });\n }\n }\n\n const reports = await io.listReportRecords();\n // Every reports column EXCEPT rendered_html, which `SKIP_COLUMNS` discards\n // anyway — a selectAll pulled all 16 stored bodies (1.17 MB live) across the\n // wire on every hourly run, 24×/day, purely to throw them away. Same list the\n // read layer uses, so the lockstep test covers this too.\n const reportRows = byId(\n (await db.selectFrom(\"reports\").select(REPORT_LIST_COLUMNS).execute()) as Array<\n Record<string, unknown>\n >,\n \"id\",\n );\n for (const rec of reports) {\n const expected = mapReportRecord(rec, null) as unknown as Record<string, unknown>;\n diffRows(\"reports\", rec.id, expected, reportRows.get(rec.id), mismatches);\n }\n const reportIds = new Set(reports.map((r) => r.id));\n for (const row of reportRows.keys()) {\n if (!reportIds.has(row)) {\n mismatches.push({\n table: \"reports\",\n id: row,\n column: \"(row)\",\n airtable: \"ABSENT\",\n turso: \"present\",\n });\n }\n }\n\n return {\n compared: {\n sites: mapped.length,\n site_health: mapped.length,\n site_schedule: mapped.length,\n reports: reports.length,\n },\n mismatches,\n };\n}\n\n/** Render for CLI/CI. Emits the machine-parseable `FLEET_PARITY` line on every\n * run, count=0 included — an absent line must mean \"the harness never ran\",\n * never \"it ran clean\" (same contract as FLEET_SMOKE_UNMEASURED, same reason). */\nexport function formatParityResult(r: ParityResult): string {\n const lines: string[] = [];\n for (const m of r.mismatches) {\n lines.push(`✗ ${m.table} ${m.id} ${m.column}: airtable=${m.airtable} turso=${m.turso}`);\n }\n lines.push(\n `FLEET_PARITY sites=${r.compared.sites} health=${r.compared.site_health} ` +\n `schedule=${r.compared.site_schedule} reports=${r.compared.reports} ` +\n `mismatches=${r.mismatches.length}`,\n );\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -340,6 +340,7 @@ async function updateScores(base, recordId, scores) {
340
340
  async function updateAnalyticsHealth(base, recordId, at) {
341
341
  const fields = { "Analytics soft-fail at": at };
342
342
  await base(WEBSITES_TABLE).update([{ id: recordId, fields }]);
343
+ return fields;
343
344
  }
344
345
  async function updateA11yCounts(base, recordId, counts) {
345
346
  await base(WEBSITES_TABLE).update([{ id: recordId, fields: a11yFields(counts) }]);
@@ -351,9 +352,9 @@ async function updateSecurityCounts(base, recordId, counts) {
351
352
  await base(WEBSITES_TABLE).update([{ id: recordId, fields: securityFields(counts) }]);
352
353
  }
353
354
  async function updateAutoFixAttempts(base, recordId, attempts) {
354
- await base(WEBSITES_TABLE).update([
355
- { id: recordId, fields: { "Security Auto-Fix Attempts": attempts } }
356
- ]);
355
+ const fields = { "Security Auto-Fix Attempts": attempts };
356
+ await base(WEBSITES_TABLE).update([{ id: recordId, fields }]);
357
+ return fields;
357
358
  }
358
359
  async function updateNextDueDates(base, recordId, dates) {
359
360
  const fields = {
@@ -412,10 +413,12 @@ async function updatePrismicModels(base, recordId, models) {
412
413
  "Prismic Models Drift": models.detail === null ? null : truncatePrismicDetail(models.detail)
413
414
  };
414
415
  await base(WEBSITES_TABLE).update([{ id: recordId, fields }]);
416
+ return fields;
415
417
  }
416
418
  async function updateLaunched(base, recordId, at) {
417
419
  const fields = { Status: toAirtableStatus("maintained"), "Launched at": at };
418
420
  await base(WEBSITES_TABLE).update([{ id: recordId, fields }]);
421
+ return fields;
419
422
  }
420
423
 
421
424
  export {
@@ -457,4 +460,4 @@ export {
457
460
  updatePrismicModels,
458
461
  updateLaunched
459
462
  };
460
- //# sourceMappingURL=chunk-LDWZSLSU.js.map
463
+ //# sourceMappingURL=chunk-7NYN2P6I.js.map