@reddoorla/maintenance 0.95.0 → 0.96.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 (272) hide show
  1. package/README.md +37 -2
  2. package/dist/airtable-SJV4ZSMS.js +9 -0
  3. package/dist/{announce-PGT4SZZB.js → announce-45HVP4J4.js} +7 -7
  4. package/dist/{blux-4KNXUP2K.js → blux-RUFMNOUJ.js} +5 -5
  5. package/dist/{bump-deps-C5G2EFBB.js → bump-deps-EL3TKMIL.js} +6 -6
  6. package/dist/{chunk-XN37VTDB.js → chunk-37B4LVB3.js} +2 -2
  7. package/dist/{chunk-BVEDKMNG.js → chunk-3EA43S3R.js} +28 -10
  8. package/dist/chunk-3EA43S3R.js.map +1 -0
  9. package/dist/{chunk-XHHMM5HX.js → chunk-43SW3FGW.js} +63 -1
  10. package/dist/chunk-43SW3FGW.js.map +1 -0
  11. package/dist/{chunk-WMBLR5VA.js → chunk-44SDGPGQ.js} +3 -3
  12. package/dist/chunk-4UTJ4G6P.js +52 -0
  13. package/dist/chunk-4UTJ4G6P.js.map +1 -0
  14. package/dist/{chunk-R53VL3RI.js → chunk-5CJVUPJU.js} +1 -1
  15. package/dist/{chunk-R53VL3RI.js.map → chunk-5CJVUPJU.js.map} +1 -1
  16. package/dist/{chunk-4AIYWWKV.js → chunk-62YWOFVN.js} +36 -5
  17. package/dist/chunk-62YWOFVN.js.map +1 -0
  18. package/dist/{chunk-22GKJO5F.js → chunk-6INOBNRO.js} +2 -2
  19. package/dist/{chunk-BYGPUUCT.js → chunk-72FJZ6LO.js} +43 -11
  20. package/dist/chunk-72FJZ6LO.js.map +1 -0
  21. package/dist/{chunk-5GUJ36TL.js → chunk-74QRWE6G.js} +2 -2
  22. package/dist/chunk-A5QKNOXW.js +72 -0
  23. package/dist/chunk-A5QKNOXW.js.map +1 -0
  24. package/dist/{chunk-2NQUCS7O.js → chunk-BIYQN7FH.js} +3 -1
  25. package/dist/{chunk-2NQUCS7O.js.map → chunk-BIYQN7FH.js.map} +1 -1
  26. package/dist/{chunk-S7RYFUIK.js → chunk-CA6ADGOC.js} +2 -2
  27. package/dist/chunk-CGQZFQAY.js +38 -0
  28. package/dist/chunk-CGQZFQAY.js.map +1 -0
  29. package/dist/{chunk-YLYXW5PH.js → chunk-CXICCLNM.js} +34 -4
  30. package/dist/chunk-CXICCLNM.js.map +1 -0
  31. package/dist/{chunk-KZRR4NFG.js → chunk-D3CTOCUR.js} +3 -3
  32. package/dist/{chunk-CWXTNPNZ.js → chunk-DVJNYPFR.js} +3 -3
  33. package/dist/chunk-DVJNYPFR.js.map +1 -0
  34. package/dist/{chunk-AVEQUR44.js → chunk-EASYCD6F.js} +60 -17
  35. package/dist/chunk-EASYCD6F.js.map +1 -0
  36. package/dist/{chunk-BCKEP5S6.js → chunk-ECDJDHKT.js} +2 -2
  37. package/dist/{chunk-DMPHP7UP.js → chunk-EQQ4H6L3.js} +2 -2
  38. package/dist/{chunk-WVNDEYXL.js → chunk-GEUC5VGM.js} +11 -5
  39. package/dist/chunk-GEUC5VGM.js.map +1 -0
  40. package/dist/{chunk-Z2K4JPQ3.js → chunk-H445EH33.js} +2 -2
  41. package/dist/chunk-IHHAYXKY.js +351 -0
  42. package/dist/chunk-IHHAYXKY.js.map +1 -0
  43. package/dist/{chunk-FUWFLAWQ.js → chunk-IMYL67JV.js} +3 -3
  44. package/dist/{chunk-3Z6X3BHU.js → chunk-KN52PM63.js} +7 -2
  45. package/dist/{chunk-3Z6X3BHU.js.map → chunk-KN52PM63.js.map} +1 -1
  46. package/dist/{chunk-WJMPCVOR.js → chunk-LAJ3FF54.js} +12 -4
  47. package/dist/chunk-LAJ3FF54.js.map +1 -0
  48. package/dist/{chunk-5UINJNAJ.js → chunk-MZZDMBDT.js} +16 -3
  49. package/dist/chunk-MZZDMBDT.js.map +1 -0
  50. package/dist/{chunk-DFKBTBO3.js → chunk-NVLREB5R.js} +35 -6
  51. package/dist/chunk-NVLREB5R.js.map +1 -0
  52. package/dist/{chunk-AEUABPAJ.js → chunk-OTEVKRAH.js} +3 -3
  53. package/dist/{chunk-KQB2BX4V.js → chunk-P4A6D6HO.js} +4 -4
  54. package/dist/chunk-P7323YVW.js +134 -0
  55. package/dist/chunk-P7323YVW.js.map +1 -0
  56. package/dist/{chunk-4763KQ6O.js → chunk-PXRN2MER.js} +2 -2
  57. package/dist/{chunk-TR3HFH6J.js → chunk-QFSL2L2B.js} +67 -10
  58. package/dist/chunk-QFSL2L2B.js.map +1 -0
  59. package/dist/{chunk-2LYOAB2E.js → chunk-RRE74VWI.js} +2 -2
  60. package/dist/{chunk-LM2NHRCJ.js → chunk-SHGIDTYF.js} +4 -4
  61. package/dist/chunk-SHGIDTYF.js.map +1 -0
  62. package/dist/{chunk-ZQV7UQNE.js → chunk-SQ4FSNYL.js} +2 -2
  63. package/dist/{chunk-OCNSIBMP.js → chunk-T76MA2FH.js} +135 -1
  64. package/dist/{chunk-OCNSIBMP.js.map → chunk-T76MA2FH.js.map} +1 -1
  65. package/dist/{chunk-6R56OKJZ.js → chunk-UIITN37J.js} +2 -2
  66. package/dist/{chunk-CJ2RMTT7.js → chunk-VEIIUCYL.js} +2 -2
  67. package/dist/{chunk-SVAAONYB.js → chunk-WQLNUEZL.js} +12 -2
  68. package/dist/{chunk-SVAAONYB.js.map → chunk-WQLNUEZL.js.map} +1 -1
  69. package/dist/{chunk-WSJ7RO54.js → chunk-XED2DNAI.js} +23 -5
  70. package/dist/chunk-XED2DNAI.js.map +1 -0
  71. package/dist/{chunk-FSGICFXB.js → chunk-XG2A6GIG.js} +17 -5
  72. package/dist/chunk-XG2A6GIG.js.map +1 -0
  73. package/dist/{chunk-TO7DJYLZ.js → chunk-XY7YV2YQ.js} +178 -39
  74. package/dist/chunk-XY7YV2YQ.js.map +1 -0
  75. package/dist/{chunk-HTABUCF4.js → chunk-Y5BVR4HW.js} +3 -3
  76. package/dist/chunk-Y6FCXRIC.js +3972 -0
  77. package/dist/chunk-Y6FCXRIC.js.map +1 -0
  78. package/dist/{chunk-2SLED3NB.js → chunk-YDZ7XGPZ.js} +1 -1
  79. package/dist/{chunk-2SLED3NB.js.map → chunk-YDZ7XGPZ.js.map} +1 -1
  80. package/dist/{chunk-QF6IQQFP.js → chunk-Z7FDJ35L.js} +18 -12
  81. package/dist/chunk-Z7FDJ35L.js.map +1 -0
  82. package/dist/{chunk-5EEMTJMT.js → chunk-ZH5LOQET.js} +4 -4
  83. package/dist/cli/bin.js +49 -31
  84. package/dist/cli/bin.js.map +1 -1
  85. package/dist/cli/commands/audit.js +18 -18
  86. package/dist/client-L7NAUG6J.js +11 -0
  87. package/dist/configs/eslint.js +27 -1
  88. package/dist/configs/eslint.js.map +1 -1
  89. package/dist/configs/playwright-a11y.d.ts +11 -1
  90. package/dist/configs/playwright-a11y.js +3 -1
  91. package/dist/{convert-to-pnpm-YTFREUJK.js → convert-to-pnpm-4DON7IFS.js} +6 -6
  92. package/dist/{db-BBEM7CBX.js → db-5K4CDEGJ.js} +45 -20
  93. package/dist/db-5K4CDEGJ.js.map +1 -0
  94. package/dist/deadletter-G4M3HSVM.js +17 -0
  95. package/dist/{digest-65BOZ7AT.js → digest-5AJGWS33.js} +45 -22
  96. package/dist/digest-5AJGWS33.js.map +1 -0
  97. package/dist/{digest-collectors-EHFY2OQC.js → digest-collectors-MC5NWEUA.js} +12 -10
  98. package/dist/{digest-state-3KHZF7GD.js → digest-state-ZDPKR7MW.js} +18 -2
  99. package/dist/digest-state-ZDPKR7MW.js.map +1 -0
  100. package/dist/{ensure-site-WIDO6LGU.js → ensure-site-XESZHZEB.js} +39 -11
  101. package/dist/ensure-site-XESZHZEB.js.map +1 -0
  102. package/dist/{fleet-state-UEVZ3X3J.js → fleet-state-GJWGKTLD.js} +6 -4
  103. package/dist/{forms-notify-target-2LWF5C5B.js → forms-notify-target-4NPLX2UG.js} +5 -5
  104. package/dist/{freeze-A6MUCZU4.js → freeze-GUQ43EAU.js} +2 -2
  105. package/dist/{github-signals-GAHNOAHS.js → github-signals-DMU74SAX.js} +10 -10
  106. package/dist/{header-image-YN3AQRY3.js → header-image-BRTOLHJF.js} +6 -5
  107. package/dist/header-image-BRTOLHJF.js.map +1 -0
  108. package/dist/{health-endpoint-KVCJYWET.js → health-endpoint-UCLMSSCN.js} +8 -7
  109. package/dist/{health-endpoint-KVCJYWET.js.map → health-endpoint-UCLMSSCN.js.map} +1 -1
  110. package/dist/{health-mirror-EB76EERV.js → health-mirror-ONRT4DQ5.js} +7 -7
  111. package/dist/{import-airtable-TAKSN4NV.js → import-airtable-IIK2QUUF.js} +3 -3
  112. package/dist/index.d.ts +135 -4
  113. package/dist/index.js +68 -34
  114. package/dist/index.js.map +1 -1
  115. package/dist/{init-FFE4FCO2.js → init-3LMZTCVD.js} +19 -18
  116. package/dist/{init-FFE4FCO2.js.map → init-3LMZTCVD.js.map} +1 -1
  117. package/dist/{launch-4RVWPZGI.js → launch-XTDMC6LD.js} +209 -61
  118. package/dist/launch-XTDMC6LD.js.map +1 -0
  119. package/dist/{lighthouse-VHI77PFB.js → lighthouse-52WSPZ5D.js} +2 -2
  120. package/dist/{lighthouse-airtable-YMH4UA7R.js → lighthouse-airtable-3NOFB42B.js} +3 -3
  121. package/dist/{match-harness-2Q6ISEES.js → match-harness-OW45CB5H.js} +14 -7
  122. package/dist/match-harness-OW45CB5H.js.map +1 -0
  123. package/dist/migrate-NE3DUMTM.js +7 -0
  124. package/dist/{notify-IISTHNBR.js → notify-K3WVH3DM.js} +3 -3
  125. package/dist/{onboard-TM2KESGF.js → onboard-CZYBWVWH.js} +6 -6
  126. package/dist/{orchestrate-MWXENQOS.js → orchestrate-TGDFGY52.js} +8 -8
  127. package/dist/{parity-CAJ477PS.js → parity-AEKYSLN6.js} +5 -5
  128. package/dist/{pipeline-YROAY6DT.js → pipeline-UUPXOS2J.js} +3 -3
  129. package/dist/{preflight-4VQP7JJL.js → preflight-POZZI3GN.js} +9 -9
  130. package/dist/{prismic-ci-6GKKZGB5.js → prismic-ci-AHY5ULJR.js} +38 -8
  131. package/dist/prismic-ci-AHY5ULJR.js.map +1 -0
  132. package/dist/{prismic-models-W6CNLTWH.js → prismic-models-URYGODNY.js} +9 -9
  133. package/dist/prospect/types.d.ts +72 -0
  134. package/dist/prospect/types.js +1 -1
  135. package/dist/{prospect-audit-X4Z67LWW.js → prospect-audit-AJEE3Z4L.js} +16 -7
  136. package/dist/prospect-audit-AJEE3Z4L.js.map +1 -0
  137. package/dist/{prospect-audits-RVYEA4KH.js → prospect-audits-IZVQY3OQ.js} +12 -4
  138. package/dist/protection-audit-3J3UEOVT.js +413 -0
  139. package/dist/protection-audit-3J3UEOVT.js.map +1 -0
  140. package/dist/recipes/sync-configs.js +3 -3
  141. package/dist/{render-YGNGTX3W.js → render-MHUUHPLN.js} +36 -9
  142. package/dist/render-MHUUHPLN.js.map +1 -0
  143. package/dist/{render-from-row-IFSBHWDH.js → render-from-row-65DC6ZP3.js} +4 -4
  144. package/dist/{renovate-dispatch-U5Q52SKT.js → renovate-dispatch-ONJMBUHJ.js} +3 -3
  145. package/dist/{replay-PCSQOGCZ.js → replay-4FVFOMHH.js} +10 -23
  146. package/dist/replay-4FVFOMHH.js.map +1 -0
  147. package/dist/{report-4GFD4MW2.js → report-RC5LGPU3.js} +22 -20
  148. package/dist/report-RC5LGPU3.js.map +1 -0
  149. package/dist/{report-mirror-IP64R7B3.js → report-mirror-KKZZ6RMZ.js} +13 -9
  150. package/dist/{report-mirror-IP64R7B3.js.map → report-mirror-KKZZ6RMZ.js.map} +1 -1
  151. package/dist/{schema-2V7BGYVT.js → schema-KWUQEZ5O.js} +1 -1
  152. package/dist/schema-KWUQEZ5O.js.map +1 -0
  153. package/dist/{self-updating-MWXIZLL7.js → self-updating-RKKIYNV4.js} +8 -7
  154. package/dist/{self-updating-MWXIZLL7.js.map → self-updating-RKKIYNV4.js.map} +1 -1
  155. package/dist/{selftest-MAB2PBXQ.js → selftest-AFLR7YV7.js} +10 -10
  156. package/dist/site-lookup-DTOLJ4EA.js +27 -0
  157. package/dist/site-lookup-DTOLJ4EA.js.map +1 -0
  158. package/dist/{site-mirror-UKHREAD6.js → site-mirror-H2FYMN55.js} +23 -9
  159. package/dist/site-mirror-H2FYMN55.js.map +1 -0
  160. package/dist/{smoke-suite-7DGITCTZ.js → smoke-suite-BWHR3XX5.js} +8 -7
  161. package/dist/{smoke-suite-7DGITCTZ.js.map → smoke-suite-BWHR3XX5.js.map} +1 -1
  162. package/dist/{submissions-5GKJPCIH.js → submissions-II5J35QM.js} +4 -4
  163. package/dist/{submissions-3I3GAQAX.js → submissions-JDZP35JM.js} +49 -9
  164. package/dist/submissions-JDZP35JM.js.map +1 -0
  165. package/dist/{svelte-codemods-WSV2FGNG.js → svelte-codemods-QWGIRNN6.js} +6 -6
  166. package/dist/{sync-K3PKHVLH.js → sync-NKPDCMYW.js} +5 -5
  167. package/dist/{sync-configs-RRIHNLIJ.js → sync-configs-HGLQV55H.js} +6 -6
  168. package/dist/{upgrade-VTD6V4HS.js → upgrade-WZ44IARG.js} +6 -6
  169. package/dist/util/git.d.ts +48 -9
  170. package/dist/util/git.js +1 -1
  171. package/dist/{webflow-IRKOIT7S.js → webflow-624FEBFD.js} +4 -4
  172. package/dist/{websites-TB4TCAWM.js → websites-6DHIHJ2D.js} +4 -2
  173. package/dist/{write-audits-to-airtable-53EVXKMU.js → write-audits-to-airtable-BIK6LNVC.js} +5 -5
  174. package/dist/write-audits-to-airtable-BIK6LNVC.js.map +1 -0
  175. package/package.json +3 -2
  176. package/dist/airtable-JGCPS7JH.js +0 -9
  177. package/dist/chunk-4AIYWWKV.js.map +0 -1
  178. package/dist/chunk-5UINJNAJ.js.map +0 -1
  179. package/dist/chunk-6VKYQATC.js +0 -1708
  180. package/dist/chunk-6VKYQATC.js.map +0 -1
  181. package/dist/chunk-7MKT4I5T.js +0 -62
  182. package/dist/chunk-7MKT4I5T.js.map +0 -1
  183. package/dist/chunk-AVEQUR44.js.map +0 -1
  184. package/dist/chunk-BVEDKMNG.js.map +0 -1
  185. package/dist/chunk-BYGPUUCT.js.map +0 -1
  186. package/dist/chunk-CWXTNPNZ.js.map +0 -1
  187. package/dist/chunk-DFKBTBO3.js.map +0 -1
  188. package/dist/chunk-FSGICFXB.js.map +0 -1
  189. package/dist/chunk-GASBX52O.js +0 -12
  190. package/dist/chunk-GASBX52O.js.map +0 -1
  191. package/dist/chunk-LM2NHRCJ.js.map +0 -1
  192. package/dist/chunk-QF6IQQFP.js.map +0 -1
  193. package/dist/chunk-TO7DJYLZ.js.map +0 -1
  194. package/dist/chunk-TR3HFH6J.js.map +0 -1
  195. package/dist/chunk-WJMPCVOR.js.map +0 -1
  196. package/dist/chunk-WSJ7RO54.js.map +0 -1
  197. package/dist/chunk-WVNDEYXL.js.map +0 -1
  198. package/dist/chunk-XHHMM5HX.js.map +0 -1
  199. package/dist/chunk-YLYXW5PH.js.map +0 -1
  200. package/dist/client-M2V6FHH5.js +0 -11
  201. package/dist/db-BBEM7CBX.js.map +0 -1
  202. package/dist/digest-65BOZ7AT.js.map +0 -1
  203. package/dist/digest-state-3KHZF7GD.js.map +0 -1
  204. package/dist/ensure-site-WIDO6LGU.js.map +0 -1
  205. package/dist/header-image-YN3AQRY3.js.map +0 -1
  206. package/dist/launch-4RVWPZGI.js.map +0 -1
  207. package/dist/match-harness-2Q6ISEES.js.map +0 -1
  208. package/dist/migrate-K4JETR36.js +0 -7
  209. package/dist/prismic-ci-6GKKZGB5.js.map +0 -1
  210. package/dist/prospect-audit-X4Z67LWW.js.map +0 -1
  211. package/dist/protection-audit-SJO53MEQ.js +0 -168
  212. package/dist/protection-audit-SJO53MEQ.js.map +0 -1
  213. package/dist/render-YGNGTX3W.js.map +0 -1
  214. package/dist/replay-PCSQOGCZ.js.map +0 -1
  215. package/dist/report-4GFD4MW2.js.map +0 -1
  216. package/dist/schema-2V7BGYVT.js.map +0 -1
  217. package/dist/site-mirror-UKHREAD6.js.map +0 -1
  218. package/dist/submissions-3I3GAQAX.js.map +0 -1
  219. /package/dist/{airtable-JGCPS7JH.js.map → airtable-SJV4ZSMS.js.map} +0 -0
  220. /package/dist/{announce-PGT4SZZB.js.map → announce-45HVP4J4.js.map} +0 -0
  221. /package/dist/{blux-4KNXUP2K.js.map → blux-RUFMNOUJ.js.map} +0 -0
  222. /package/dist/{bump-deps-C5G2EFBB.js.map → bump-deps-EL3TKMIL.js.map} +0 -0
  223. /package/dist/{chunk-XN37VTDB.js.map → chunk-37B4LVB3.js.map} +0 -0
  224. /package/dist/{chunk-WMBLR5VA.js.map → chunk-44SDGPGQ.js.map} +0 -0
  225. /package/dist/{chunk-22GKJO5F.js.map → chunk-6INOBNRO.js.map} +0 -0
  226. /package/dist/{chunk-5GUJ36TL.js.map → chunk-74QRWE6G.js.map} +0 -0
  227. /package/dist/{chunk-S7RYFUIK.js.map → chunk-CA6ADGOC.js.map} +0 -0
  228. /package/dist/{chunk-KZRR4NFG.js.map → chunk-D3CTOCUR.js.map} +0 -0
  229. /package/dist/{chunk-BCKEP5S6.js.map → chunk-ECDJDHKT.js.map} +0 -0
  230. /package/dist/{chunk-DMPHP7UP.js.map → chunk-EQQ4H6L3.js.map} +0 -0
  231. /package/dist/{chunk-Z2K4JPQ3.js.map → chunk-H445EH33.js.map} +0 -0
  232. /package/dist/{chunk-FUWFLAWQ.js.map → chunk-IMYL67JV.js.map} +0 -0
  233. /package/dist/{chunk-AEUABPAJ.js.map → chunk-OTEVKRAH.js.map} +0 -0
  234. /package/dist/{chunk-KQB2BX4V.js.map → chunk-P4A6D6HO.js.map} +0 -0
  235. /package/dist/{chunk-4763KQ6O.js.map → chunk-PXRN2MER.js.map} +0 -0
  236. /package/dist/{chunk-2LYOAB2E.js.map → chunk-RRE74VWI.js.map} +0 -0
  237. /package/dist/{chunk-ZQV7UQNE.js.map → chunk-SQ4FSNYL.js.map} +0 -0
  238. /package/dist/{chunk-6R56OKJZ.js.map → chunk-UIITN37J.js.map} +0 -0
  239. /package/dist/{chunk-CJ2RMTT7.js.map → chunk-VEIIUCYL.js.map} +0 -0
  240. /package/dist/{chunk-HTABUCF4.js.map → chunk-Y5BVR4HW.js.map} +0 -0
  241. /package/dist/{chunk-5EEMTJMT.js.map → chunk-ZH5LOQET.js.map} +0 -0
  242. /package/dist/{client-M2V6FHH5.js.map → client-L7NAUG6J.js.map} +0 -0
  243. /package/dist/{convert-to-pnpm-YTFREUJK.js.map → convert-to-pnpm-4DON7IFS.js.map} +0 -0
  244. /package/dist/{digest-collectors-EHFY2OQC.js.map → deadletter-G4M3HSVM.js.map} +0 -0
  245. /package/dist/{fleet-state-UEVZ3X3J.js.map → digest-collectors-MC5NWEUA.js.map} +0 -0
  246. /package/dist/{freeze-A6MUCZU4.js.map → fleet-state-GJWGKTLD.js.map} +0 -0
  247. /package/dist/{forms-notify-target-2LWF5C5B.js.map → forms-notify-target-4NPLX2UG.js.map} +0 -0
  248. /package/dist/{import-airtable-TAKSN4NV.js.map → freeze-GUQ43EAU.js.map} +0 -0
  249. /package/dist/{github-signals-GAHNOAHS.js.map → github-signals-DMU74SAX.js.map} +0 -0
  250. /package/dist/{health-mirror-EB76EERV.js.map → health-mirror-ONRT4DQ5.js.map} +0 -0
  251. /package/dist/{lighthouse-VHI77PFB.js.map → import-airtable-IIK2QUUF.js.map} +0 -0
  252. /package/dist/{lighthouse-airtable-YMH4UA7R.js.map → lighthouse-52WSPZ5D.js.map} +0 -0
  253. /package/dist/{migrate-K4JETR36.js.map → lighthouse-airtable-3NOFB42B.js.map} +0 -0
  254. /package/dist/{notify-IISTHNBR.js.map → migrate-NE3DUMTM.js.map} +0 -0
  255. /package/dist/{orchestrate-MWXENQOS.js.map → notify-K3WVH3DM.js.map} +0 -0
  256. /package/dist/{onboard-TM2KESGF.js.map → onboard-CZYBWVWH.js.map} +0 -0
  257. /package/dist/{parity-CAJ477PS.js.map → orchestrate-TGDFGY52.js.map} +0 -0
  258. /package/dist/{pipeline-YROAY6DT.js.map → parity-AEKYSLN6.js.map} +0 -0
  259. /package/dist/{prospect-audits-RVYEA4KH.js.map → pipeline-UUPXOS2J.js.map} +0 -0
  260. /package/dist/{preflight-4VQP7JJL.js.map → preflight-POZZI3GN.js.map} +0 -0
  261. /package/dist/{prismic-models-W6CNLTWH.js.map → prismic-models-URYGODNY.js.map} +0 -0
  262. /package/dist/{render-from-row-IFSBHWDH.js.map → prospect-audits-IZVQY3OQ.js.map} +0 -0
  263. /package/dist/{websites-TB4TCAWM.js.map → render-from-row-65DC6ZP3.js.map} +0 -0
  264. /package/dist/{renovate-dispatch-U5Q52SKT.js.map → renovate-dispatch-ONJMBUHJ.js.map} +0 -0
  265. /package/dist/{selftest-MAB2PBXQ.js.map → selftest-AFLR7YV7.js.map} +0 -0
  266. /package/dist/{submissions-5GKJPCIH.js.map → submissions-II5J35QM.js.map} +0 -0
  267. /package/dist/{svelte-codemods-WSV2FGNG.js.map → svelte-codemods-QWGIRNN6.js.map} +0 -0
  268. /package/dist/{sync-K3PKHVLH.js.map → sync-NKPDCMYW.js.map} +0 -0
  269. /package/dist/{sync-configs-RRIHNLIJ.js.map → sync-configs-HGLQV55H.js.map} +0 -0
  270. /package/dist/{upgrade-VTD6V4HS.js.map → upgrade-WZ44IARG.js.map} +0 -0
  271. /package/dist/{webflow-IRKOIT7S.js.map → webflow-624FEBFD.js.map} +0 -0
  272. /package/dist/{write-audits-to-airtable-53EVXKMU.js.map → websites-6DHIHJ2D.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -315,14 +315,27 @@ type DependabotAlert = {
315
315
  scope: "runtime" | "development" | null;
316
316
  /** Dependency graph relationship (`dependency.relationship`), or null when GitHub reports
317
317
  * "unknown"/nothing. "transitive" means no direct-dep bump can fix it — Renovate's vuln
318
- * alerts have no fix vehicle until the weekly lockfile-maintenance window. */
319
- relationship: "direct" | "transitive" | null;
318
+ * alerts have no fix vehicle until the weekly lockfile-maintenance window. "inconclusive"
319
+ * is what GitHub stamps on an alert filed against a manifest its dependency graph still
320
+ * tracks but the tree no longer holds (#702) — kept, never folded to null, because it is
321
+ * the secondary tell for a ghost alert. */
322
+ relationship: "direct" | "transitive" | "inconclusive" | null;
323
+ /** The manifest the alert was filed against (`dependency.manifest_path`, e.g.
324
+ * `package-lock.json`), or null when absent. GitHub retains a manifest after the file is
325
+ * deleted from the default branch and keeps filing alerts against that frozen snapshot;
326
+ * the audit resolves this path with {@link GitHubRest.manifestExists} to tell a ghost from
327
+ * a live vulnerability (#702). */
328
+ manifestPath: string | null;
320
329
  };
321
330
 
322
331
  /** The Dependabot fetch the security audit needs, injectable for tests. The real default is
323
332
  * built from GITHUB_TOKEN; absent token (or a site with no gitRepo) → pnpm/npm audit fallback. */
324
333
  type DependabotDeps = {
325
334
  listAlerts: (repo: string) => Promise<DependabotAlert[]>;
335
+ /** Whether an alert's `manifestPath` is still on the default branch. Optional: without it
336
+ * every alert counts, which is the loud direction. A lookup that THROWS also counts the
337
+ * alert — an API hiccup must never quietly suppress a real vulnerability (#702). */
338
+ manifestExists?: (repo: string, path: string) => Promise<boolean>;
326
339
  };
327
340
  declare function securityAudit(ctx: AuditContext): Promise<AuditResult>;
328
341
 
@@ -418,6 +431,84 @@ declare function onboard(site: Site, opts?: OnboardOptions): Promise<RecipeResul
418
431
  */
419
432
  declare function a11yFixturesPage(site: Site): Promise<RecipeResult>;
420
433
 
434
+ type HealthEndpointDeps = {
435
+ spawn: SpawnFn;
436
+ /** Resolve the TARGET repo's own prettier. Injected so a test can assert the
437
+ * absolute-path spawn without a populated `node_modules`. */
438
+ resolvePrettier?: (repoRoot: string) => Promise<string | null>;
439
+ };
440
+ /**
441
+ * Writes a resilient `src/routes/health/+server.ts` if the route doesn't already
442
+ * exist. The function-health audit fetches this endpoint; existing sites need it
443
+ * or the Report Health Gate blocks their Maintenance reports on "unknown". Operator
444
+ * edits to an existing endpoint are never clobbered (noop on existing file).
445
+ *
446
+ * Two heterogeneity fixes the fleet rollout exposed: (1) it detects whether the
447
+ * site has a `$lib/prismicio` module and writes the Prismic-free variant when it
448
+ * doesn't (a static import of a missing module fails the build); (2) it runs the
449
+ * SITE's own prettier on the written file before committing, so the file matches
450
+ * that site's formatting config (tabs/spaces, quote style vary fleet-wide) and
451
+ * doesn't red the CI format check. Prettier is best-effort — a site without it
452
+ * installed commits unformatted with a flag note rather than failing the recipe.
453
+ */
454
+ declare function healthEndpoint(site: Site, deps?: HealthEndpointDeps): Promise<RecipeResult>;
455
+
456
+ type SmokeSuiteDeps = {
457
+ spawn: SpawnFn;
458
+ /** Resolve the TARGET repo's own prettier. Injected so a test can assert the
459
+ * absolute-path spawn without a populated `node_modules`. */
460
+ resolvePrettier?: (repoRoot: string) => Promise<string | null>;
461
+ };
462
+ /**
463
+ * Adds the smoke suite to a site: the `tests/smoke/*` specs, a `test:smoke` /
464
+ * `test:unit` script split, `@playwright/test`, and a `playwright.config.ts`
465
+ * that honors `REDDOOR_SMOKE_PORT` (R1.1). Conservative + partial-apply — every
466
+ * file is noop-if-exists, every `package.json` script/dep is add-if-absent, and
467
+ * an existing config that isn't a recognizable shared-base shape is left
468
+ * untouched and flagged for a manual R1.1 patch (never a destructive write).
469
+ * A site with no `package.json` noops (not a node project). Branch+commit per site.
470
+ */
471
+ declare function smokeSuite(site: Site, deps?: SmokeSuiteDeps): Promise<RecipeResult>;
472
+
473
+ type MatchHarnessOptions = {
474
+ /** The live reference URL the harness gates against. Required — a harness
475
+ * with no reference cannot produce evidence, only an absence of errors. */
476
+ ref: string;
477
+ /** Candidate origin. Defaults to the SvelteKit dev server. */
478
+ cand?: string;
479
+ /** Breakpoint matrix. Defaults to the fleet's 1440 / 834 / 390. */
480
+ matrix?: number[];
481
+ };
482
+ type MatchHarnessDeps = {
483
+ spawn: SpawnFn;
484
+ /** Previously shipped renders per relative path; injectable so the
485
+ * safe-replace path is testable before a second version exists. */
486
+ previous?: Readonly<Record<string, readonly string[]>>;
487
+ /** Previously shipped BLOCK bodies per target file; injectable for the same
488
+ * reason, and empty in the shipped table until a body is superseded. */
489
+ blockPrevious?: Readonly<Record<string, readonly string[]>>;
490
+ /** Resolve the TARGET repo's own prettier. Injected so a test can assert the
491
+ * absolute-path spawn without a populated `node_modules`. */
492
+ resolvePrettier?: (repoRoot: string) => Promise<string | null>;
493
+ };
494
+ /**
495
+ * Installs the matching harness into a site: the dev-guarded `/dev/match/[uid]`
496
+ * route, a `site-pages.js` scaffold and its fixture-vs-model test,
497
+ * `matching/harness.json` + the read layer, the round scripts, the site records,
498
+ * and the `.gitignore` / `.prettierignore` / `CLAUDE.md` blocks.
499
+ *
500
+ * Install-if-absent throughout. Files a site edits are never rewritten. A
501
+ * recipe-owned script that matches a previously shipped render is safe-replaced;
502
+ * one that has been hand-edited is FLAGGED in the notes and left alone.
503
+ *
504
+ * ONE EXCEPTION TO PER-FILE INDEPENDENCE: the scripts in MATCH_HARNESS_COUPLED
505
+ * upgrade as a SET. If any one of them is hand-edited, none of them is written,
506
+ * because gate.sh calls `harness.mjs --check-run` and next.mjs imports from
507
+ * harness.mjs — upgrading the others around a pinned one leaves a harness that
508
+ * cannot run at all. See the measurement on MATCH_HARNESS_COUPLED.
509
+ */
510
+ declare function matchHarness(site: Site, opts: MatchHarnessOptions, deps?: MatchHarnessDeps): Promise<RecipeResult>;
511
+
421
512
  type InitStepResult = {
422
513
  kind: "recipe";
423
514
  result: RecipeResult;
@@ -1166,6 +1257,13 @@ type SiteMirror = {
1166
1257
  health: (siteId: string, fields: Record<string, unknown>) => Promise<void>;
1167
1258
  /** Columns that live in `sites`. */
1168
1259
  site: (siteId: string, fields: Record<string, unknown>) => Promise<void>;
1260
+ /** #645. Does Turso hold a row for this site id? A pure READ, so it is the one
1261
+ * op here that neither logs a SITE_MIRROR line nor throws under the freeze —
1262
+ * `ensure-site` uses it to decide whether to heal, and a probe that threw
1263
+ * would sink the very command that repairs the gap. Creds-absent answers
1264
+ * `true` ("assume present"), so a mirror that cannot read can never provoke
1265
+ * a blind insert. */
1266
+ hasRow: (siteId: string) => Promise<boolean>;
1169
1267
  };
1170
1268
 
1171
1269
  type ShootOptions = {
@@ -1174,6 +1272,9 @@ type ShootOptions = {
1174
1272
  height: number;
1175
1273
  deviceScaleFactor: number;
1176
1274
  settleMs: number;
1275
+ /** Extra CSS selector(s) hidden before the shutter, for a site whose consent
1276
+ * or interstitial UI the class/id heuristic misses. */
1277
+ consentSelector?: string;
1177
1278
  };
1178
1279
  /** Injected browser IO. The real impl drives Playwright; tests pass a fake. */
1179
1280
  type Shooter = {
@@ -1187,8 +1288,11 @@ type GenerateInput = {
1187
1288
  slug?: string;
1188
1289
  /** Injected browser IO (tests). */
1189
1290
  shooter?: Shooter;
1190
- /** Per-site settle override for animation-heavy or consent-gated homepages. */
1291
+ /** Per-site settle override for animation-heavy homepages. */
1191
1292
  settleMs?: number;
1293
+ /** Extra CSS selector(s) hidden before the shutter, for consent or
1294
+ * interstitial UI the capture's class/id heuristic misses (#654). */
1295
+ consentSelector?: string;
1192
1296
  };
1193
1297
  type GeneratedHeaderImage = {
1194
1298
  bytes: Uint8Array;
@@ -1452,6 +1556,15 @@ type SubmissionRow = {
1452
1556
  * was attempted: a non-newsletter form, a spam row, a site with no destination
1453
1557
  * configured, or a row written before 0005. See ingest.ts for the token grammar. */
1454
1558
  fanoutStatus?: string | null;
1559
+ /** Resend's bounce classification, kept so a content rejection by the CLIENT's
1560
+ * mail filter can be told apart from a dead mailbox (#783). Null for a
1561
+ * complaint, and for every row written before migration 0018. */
1562
+ bounceType?: string | null;
1563
+ bounceSubType?: string | null;
1564
+ bounceMessage?: string | null;
1565
+ /** ISO-8601 of the operator saying "this address is not dead" (#783). The row
1566
+ * keeps its bounce record and stops counting toward the alarm. */
1567
+ bounceAckAt?: string | null;
1455
1568
  };
1456
1569
 
1457
1570
  type ScreenOutTotals = {
@@ -1474,6 +1587,13 @@ type AttentionItem = {
1474
1587
  /** Stable identity for diffing: `vuln:<siteId>`, `delivery:<reportId>`. */
1475
1588
  key: string;
1476
1589
  kind: "vuln" | "delivery" | "renovate" | "lighthouse" | "ci" | "analytics" | "preflight" | "turnstile" | "notify-bounce"
1590
+ /** #645. Leads captured by the dead-letter because their site could not be
1591
+ * placed — a store outage during the lookup, or (since #645) a slug with no
1592
+ * Turso row at all. Until this kind existed a dropped lead had NO alarm
1593
+ * anywhere: the queue could fill and nothing said so. Keyed by SLUG, not by
1594
+ * site id, because the whole point of the worst case is that the slug
1595
+ * resolves to no site. */
1596
+ | "deadletter"
1477
1597
  /** The nightly Prismic model sweep. THREE item flavors share this kind —
1478
1598
  * `prismic-drift:` (repo and Prismic diverge), `prismic-unknown:` (the check
1479
1599
  * ran and could not answer), `prismic-stale:` (nobody has re-established the
@@ -1612,6 +1732,17 @@ type CockpitModel = {
1612
1732
  * invisible to every fleet op, so the Needs-you feed surfaces them as amber watch
1613
1733
  * rows (optional for back-compat). */
1614
1734
  unrecognizedStatus?: OffFleetSiteEntry[];
1735
+ /** #786. Attention items that belong to NO site card. The grid is built from
1736
+ * the visible sites and items are grouped onto it by `siteName`, so an item
1737
+ * naming a site the fleet does not have matched nothing and was dropped —
1738
+ * silently, on the one surface the operator actually watches.
1739
+ *
1740
+ * The collector that produces them is the one whose entire point is that the
1741
+ * site is missing: a dead letter for a slug resolving to no fleet row means
1742
+ * leads are being dropped RIGHT NOW. Kept general rather than
1743
+ * dead-letter-specific, so a future card-less item lands here instead of
1744
+ * vanishing the same way. Optional for back-compat with hand-built models. */
1745
+ cardless?: AttentionItem[];
1615
1746
  };
1616
1747
  /** The cockpit's alarm verdict for ONE site, for the /s/<slug> page header. */
1617
1748
  type SiteAlarmContext = {
@@ -1702,4 +1833,4 @@ declare function loadPlate(): Promise<Uint8Array>;
1702
1833
  /** Read a headline overlay (transparent PNG, ink-box cropped). */
1703
1834
  declare function loadHeadline(kind: HeadlineKind): Promise<Uint8Array>;
1704
1835
 
1705
- export { ALL_AUDIT_NAMES, ALL_RECIPE_NAMES, type AirtableInventoryOptions, AuditName, AuditResult, BLURRED_CID, type BumpDepsOptions, type BundledImage, CHECK_CID, type ConvertToPnpmOptions, DEFAULT_INIT_STEPS, type DraftOptions, type DraftResult, type DueItem, type GenerateInput, type GeneratedHeaderImage, type HeaderImage, type InitOptions, type InitResult, type InitStep, type InitStepResult, InventoryProvider, type LighthouseScores, type LocalPathOptions, type OnboardAudit, type OnboardOptions, type OrchestrateOptions, RecipeName, RecipeResult, type RefreshHeaderDeps, type RenderResult, type ReportData, type ReportType, Site, type UpgradeSvelte4to5Options, a11yAudit, a11yFixturesPage, bumpDeps, convertToPnpm, depsAudit, domainFromUrl, draftReportForSite, findDueReports, fromAirtableBase, fromJsonFile, generateHeaderImage, init, isRecipeName, lighthouseAudit, lintAudit, loadBundledImages, loadHeadline, loadPlate, localPath, onboard, renderCockpitHtml, renderReportHtml, renderSiteDashboardHtml, runAudits, runAuditsAcross, securityAudit, selfCaretRange, selfPackageVersion, sendApprovedReports, svelteCodemods, upgradeSvelte4to5, verifyBasicAuth };
1836
+ export { ALL_AUDIT_NAMES, ALL_RECIPE_NAMES, type AirtableInventoryOptions, AuditName, AuditResult, BLURRED_CID, type BumpDepsOptions, type BundledImage, CHECK_CID, type ConvertToPnpmOptions, DEFAULT_INIT_STEPS, type DraftOptions, type DraftResult, type DueItem, type GenerateInput, type GeneratedHeaderImage, type HeaderImage, type InitOptions, type InitResult, type InitStep, type InitStepResult, InventoryProvider, type LighthouseScores, type LocalPathOptions, type OnboardAudit, type OnboardOptions, type OrchestrateOptions, RecipeName, RecipeResult, type RefreshHeaderDeps, type RenderResult, type ReportData, type ReportType, Site, type UpgradeSvelte4to5Options, a11yAudit, a11yFixturesPage, bumpDeps, convertToPnpm, depsAudit, domainFromUrl, draftReportForSite, findDueReports, fromAirtableBase, fromJsonFile, generateHeaderImage, healthEndpoint, init, isRecipeName, lighthouseAudit, lintAudit, loadBundledImages, loadHeadline, loadPlate, localPath, matchHarness, onboard, renderCockpitHtml, renderReportHtml, renderSiteDashboardHtml, runAudits, runAuditsAcross, securityAudit, selfCaretRange, selfPackageVersion, sendApprovedReports, smokeSuite, svelteCodemods, upgradeSvelte4to5, verifyBasicAuth };
package/dist/index.js CHANGED
@@ -1,39 +1,47 @@
1
- import "./chunk-2SLED3NB.js";
1
+ import "./chunk-YDZ7XGPZ.js";
2
2
  import {
3
3
  DEFAULT_INIT_STEPS,
4
4
  a11yFixturesPage,
5
5
  init
6
- } from "./chunk-BVEDKMNG.js";
6
+ } from "./chunk-3EA43S3R.js";
7
7
  import {
8
8
  onboard,
9
9
  selfCaretRange,
10
10
  selfPackageVersion
11
- } from "./chunk-S7RYFUIK.js";
11
+ } from "./chunk-CA6ADGOC.js";
12
12
  import {
13
13
  draftReportForSite
14
- } from "./chunk-BYGPUUCT.js";
14
+ } from "./chunk-72FJZ6LO.js";
15
15
  import "./chunk-YFAXOD7Z.js";
16
16
  import {
17
17
  upgradeSvelte4to5
18
- } from "./chunk-BCKEP5S6.js";
18
+ } from "./chunk-ECDJDHKT.js";
19
19
  import {
20
20
  convertToPnpm
21
- } from "./chunk-CWXTNPNZ.js";
21
+ } from "./chunk-DVJNYPFR.js";
22
22
  import {
23
23
  svelteCodemods
24
- } from "./chunk-2LYOAB2E.js";
24
+ } from "./chunk-RRE74VWI.js";
25
25
  import "./chunk-J7SZQUCW.js";
26
- import "./chunk-WSJ7RO54.js";
27
- import "./chunk-6VKYQATC.js";
28
- import "./chunk-DFKBTBO3.js";
29
- import "./chunk-R53VL3RI.js";
26
+ import {
27
+ healthEndpoint
28
+ } from "./chunk-XED2DNAI.js";
29
+ import {
30
+ matchHarness
31
+ } from "./chunk-IHHAYXKY.js";
32
+ import "./chunk-Y6FCXRIC.js";
33
+ import {
34
+ smokeSuite
35
+ } from "./chunk-NVLREB5R.js";
36
+ import "./chunk-5CJVUPJU.js";
30
37
  import {
31
38
  bumpDeps
32
- } from "./chunk-CJ2RMTT7.js";
33
- import "./chunk-4AIYWWKV.js";
39
+ } from "./chunk-VEIIUCYL.js";
40
+ import "./chunk-4UTJ4G6P.js";
41
+ import "./chunk-62YWOFVN.js";
34
42
  import {
35
43
  approveBlockers
36
- } from "./chunk-AEUABPAJ.js";
44
+ } from "./chunk-OTEVKRAH.js";
37
45
  import {
38
46
  findDueReports
39
47
  } from "./chunk-PZR4EBPY.js";
@@ -41,7 +49,7 @@ import {
41
49
  parseAddresses,
42
50
  sendApprovedReports,
43
51
  withGlobalCc
44
- } from "./chunk-KQB2BX4V.js";
52
+ } from "./chunk-P4A6D6HO.js";
45
53
  import {
46
54
  isPendingApproval
47
55
  } from "./chunk-F3JWOPTG.js";
@@ -51,13 +59,13 @@ import {
51
59
  isHealthGateClear
52
60
  } from "./chunk-VAD43MOR.js";
53
61
  import "./chunk-BRYXFH77.js";
54
- import "./chunk-7MKT4I5T.js";
62
+ import "./chunk-P7323YVW.js";
55
63
  import {
56
64
  fromAirtableBase
57
- } from "./chunk-5GUJ36TL.js";
65
+ } from "./chunk-74QRWE6G.js";
58
66
  import "./chunk-IY6256GK.js";
59
67
  import "./chunk-HN6I2XWI.js";
60
- import "./chunk-HTABUCF4.js";
68
+ import "./chunk-Y5BVR4HW.js";
61
69
  import "./chunk-GECESMVS.js";
62
70
  import {
63
71
  BLURRED_CID,
@@ -75,19 +83,19 @@ import {
75
83
  generateHeaderImage,
76
84
  loadHeadline,
77
85
  loadPlate
78
- } from "./chunk-5UINJNAJ.js";
86
+ } from "./chunk-MZZDMBDT.js";
79
87
  import {
80
88
  CANONICAL_STATUSES,
81
89
  SEVERITY_RANK,
82
90
  siteSlug,
83
91
  toAirtableStatus
84
- } from "./chunk-3Z6X3BHU.js";
92
+ } from "./chunk-KN52PM63.js";
85
93
  import "./chunk-WEKL2HYJ.js";
86
94
  import "./chunk-T7ZUUOZ2.js";
87
95
  import {
88
96
  syncConfigs
89
- } from "./chunk-FUWFLAWQ.js";
90
- import "./chunk-ZQV7UQNE.js";
97
+ } from "./chunk-IMYL67JV.js";
98
+ import "./chunk-SQ4FSNYL.js";
91
99
  import "./chunk-SLFG7Y76.js";
92
100
  import "./chunk-OTGB6YQO.js";
93
101
  import {
@@ -98,20 +106,20 @@ import {
98
106
  runAudits,
99
107
  runAuditsAcross,
100
108
  securityAudit
101
- } from "./chunk-TO7DJYLZ.js";
109
+ } from "./chunk-XY7YV2YQ.js";
102
110
  import "./chunk-LKGVSM2O.js";
103
- import "./chunk-GASBX52O.js";
104
- import "./chunk-XHHMM5HX.js";
111
+ import "./chunk-CGQZFQAY.js";
112
+ import "./chunk-43SW3FGW.js";
105
113
  import {
106
114
  fromJsonFile,
107
115
  localPath
108
116
  } from "./chunk-Z3JXLULD.js";
109
- import "./chunk-DMPHP7UP.js";
110
- import "./chunk-22GKJO5F.js";
111
- import "./chunk-OCNSIBMP.js";
117
+ import "./chunk-EQQ4H6L3.js";
118
+ import "./chunk-6INOBNRO.js";
119
+ import "./chunk-T76MA2FH.js";
112
120
  import {
113
121
  lighthouseAudit
114
- } from "./chunk-2NQUCS7O.js";
122
+ } from "./chunk-BIYQN7FH.js";
115
123
  import "./chunk-UDRHAQT7.js";
116
124
  import "./chunk-PTDMVGKL.js";
117
125
  import "./chunk-LBYOLBW7.js";
@@ -121,10 +129,10 @@ import {
121
129
  } from "./chunk-2OP4JKIQ.js";
122
130
  import "./chunk-RARREDQE.js";
123
131
  import "./chunk-XXTZBPUY.js";
124
- import "./chunk-AVEQUR44.js";
132
+ import "./chunk-EASYCD6F.js";
125
133
  import "./chunk-6VAL7XJT.js";
126
134
  import "./chunk-NMAWXBJA.js";
127
- import "./chunk-YLYXW5PH.js";
135
+ import "./chunk-CXICCLNM.js";
128
136
 
129
137
  // src/recipes/index.ts
130
138
  var ALL_RECIPE_NAMES = [
@@ -245,7 +253,13 @@ function renderSubmissionRowInner(s) {
245
253
  const reasonChip = reasonTokens.length > 0 ? ` <span class="subm-reasons">${escapeHtml(reasonChipText(reasonTokens))}</span>` : "";
246
254
  const provenance = s.status === "spam_auto" && s.spamScore !== null && s.spamScore !== void 0 ? ` <span class="subm-provenance" title="${escapeHtml(s.spamReason ?? "")}">auto-spam \xB7 ${escapeHtml(String(s.spamScore))}</span>${reasonChip}` : "";
247
255
  const recover = s.status === "spam_auto" ? btn("Not spam \u2192 new", "new") : "";
248
- const bounceChip = s.notifyStatus === "bounced" ? ` <span class="subm-bounce" title="The lead notification email bounced \u2014 the point-of-contact address may be dead">notify bounced</span>` : "";
256
+ const bouncePermanent = (s.bounceType ?? "").toLowerCase() === "permanent";
257
+ const bounceAcked = typeof s.bounceAckAt === "string" && s.bounceAckAt !== "";
258
+ const bounceLabel = s.bounceSubType ?? s.bounceType ?? null;
259
+ const bounceTitle = bouncePermanent ? "The lead notification email bounced \u2014 the point-of-contact address may be dead" : bounceLabel !== null ? "The receiving server refused this message \u2014 the client's mail filter is rejecting lead notifications, which is not the same as a dead address" : "The lead notification email bounced \u2014 Resend recorded no classification for it";
260
+ const bounceChipText = `notify bounced${bounceLabel !== null ? ` \xB7 ${bounceLabel}` : ""}${bounceAcked ? " \xB7 acknowledged" : ""}`;
261
+ const bounceChip = s.notifyStatus === "bounced" ? ` <span class="subm-bounce${bounceAcked ? " acked" : ""}" title="${escapeHtml(bounceTitle)}">${escapeHtml(bounceChipText)}</span>` : "";
262
+ const ackBounce = s.notifyStatus === "bounced" && !bounceAcked ? `<button class="subm-status" data-id="${id}" data-ack="notify-bounce" data-url="${url}">Not dead \u2014 acknowledge</button>` : "";
249
263
  const fanoutBad = fanoutFailures(s.fanoutStatus);
250
264
  const fanoutChip = fanoutBad.length > 0 ? ` <span class="subm-fanout-fail" title="This signup did not reach every configured destination">fan-out: ${escapeHtml(fanoutBad.join(" \xB7 "))}</span>` : "";
251
265
  const kv = (label, value) => value === null || value === "" ? "" : `<div class="subm-kv"><span class="k">${label}</span> ${escapeHtml(String(value))}</div>`;
@@ -261,6 +275,11 @@ function renderSubmissionRowInner(s) {
261
275
  extraFieldsList(s.extraFields),
262
276
  kv("Spam", spamDetail),
263
277
  kv("Notify", s.notifyStatus),
278
+ kv("Bounce", [s.bounceType, s.bounceSubType].filter((x) => !!x).join(" / ")),
279
+ // The receiving server's own words — the single most useful line when
280
+ // deciding whether an address is dead or a filter is being strict.
281
+ kv("Bounce message", s.bounceMessage ?? null),
282
+ kv("Bounce acknowledged", s.bounceAckAt ?? null),
264
283
  kv("Fan-out", s.fanoutStatus ?? null),
265
284
  kv("Resend ID", s.resendMessageId),
266
285
  kv("Submission #", s.submissionId)
@@ -269,7 +288,7 @@ function renderSubmissionRowInner(s) {
269
288
  <summary class="subm-head"><strong>${type}</strong> \xB7 ${who} <span class="muted">${email}</span> <span class="pill subm-${status}">${status}</span>${provenance}${bounceChip}${fanoutChip} <span class="muted">${when}</span></summary>
270
289
  <div class="subm-detail">${details}</div>
271
290
  </details>
272
- <div class="subm-actions">${recover}${btn("Read", "read")}${btn("Archive", "archived")}${btn("Spam", "spam")}</div>`;
291
+ <div class="subm-actions">${recover}${ackBounce}${btn("Read", "read")}${btn("Archive", "archived")}${btn("Spam", "spam")}</div>`;
273
292
  }
274
293
  function renderSubmissionRow(s) {
275
294
  return `<li class="subm-item">${renderSubmissionRowInner(s)}</li>`;
@@ -296,6 +315,7 @@ button.subm-status:disabled { opacity: 0.6; cursor: default; }
296
315
  .pill.subm-spam_auto { background: #fff4e5; color: #a65a00; }
297
316
  .subm-provenance { font-size: 0.72rem; border-radius: 0.25rem; padding: 0 0.35rem; white-space: nowrap; background: #fff4e5; color: #a65a00; }
298
317
  .subm-bounce { font-size: 0.72rem; border-radius: 0.25rem; padding: 0 0.35rem; white-space: nowrap; background: #fdecea; color: #b00; font-weight: 700; }
318
+ .subm-bounce.acked { background: #f0f0f0; color: #666; font-weight: 400; }
299
319
  .subm-fanout-fail { font-size: 0.72rem; border-radius: 0.25rem; padding: 0 0.35rem; white-space: nowrap; background: #fdecea; color: #b00; font-weight: 700; }
300
320
  .subm-reasons { font-size: 0.72rem; color: #999; }
301
321
  .subm-viewall { font-size: 0.8rem; font-weight: normal; margin-left: 0.4rem; white-space: nowrap; }`;
@@ -306,7 +326,9 @@ var SUBMISSION_STATUS_SCRIPT = `document.querySelectorAll("button.subm-status").
306
326
  const res = await fetch(b.dataset.url, {
307
327
  method: "POST",
308
328
  headers: { "content-type": "application/json" },
309
- body: JSON.stringify({ status: b.dataset.status }),
329
+ body: JSON.stringify(
330
+ b.dataset.ack ? { ack: b.dataset.ack } : { status: b.dataset.status },
331
+ ),
310
332
  });
311
333
  b.textContent = res.ok ? "\u2713" : "Failed";
312
334
  if (!res.ok) b.disabled = false;
@@ -1638,6 +1660,14 @@ function renderArchivedLane(model) {
1638
1660
  ).join("");
1639
1661
  return `<details class="archived"><summary>\u{1F5C4} Archived (${rows.length})</summary>${lis}</details>`;
1640
1662
  }
1663
+ function renderCardlessLane(model) {
1664
+ const items = model.cardless ?? [];
1665
+ if (items.length === 0) return "";
1666
+ const rows = items.map(
1667
+ (i) => `<div class="approve-row"><strong>${escapeHtml(i.siteName)}</strong> <span class="muted">${escapeHtml(i.title)}</span></div>`
1668
+ ).join("");
1669
+ return `<details class="cardless"><summary>\u26A0 Not on any site card (${items.length})</summary>${rows}</details>`;
1670
+ }
1641
1671
  function renderInboxLane(model) {
1642
1672
  const subs = model.submissions ?? [];
1643
1673
  const spam = model.spam;
@@ -1812,6 +1842,7 @@ function renderCockpitHtml(model, operatorEmail = null) {
1812
1842
  ${renderFleetBrowsePanel(model)}
1813
1843
  ${renderRecentlyLane(model)}
1814
1844
  ${renderArchivedLane(model)}
1845
+ ${renderCardlessLane(model)}
1815
1846
  ${renderInboxLane(model)}
1816
1847
  ${AUDIT_SCRIPT}
1817
1848
  ${FLEET_BROWSE_SCRIPT}
@@ -1867,6 +1898,7 @@ export {
1867
1898
  fromAirtableBase,
1868
1899
  fromJsonFile,
1869
1900
  generateHeaderImage,
1901
+ healthEndpoint,
1870
1902
  init,
1871
1903
  isRecipeName,
1872
1904
  lighthouseAudit,
@@ -1875,6 +1907,7 @@ export {
1875
1907
  loadHeadline,
1876
1908
  loadPlate,
1877
1909
  localPath,
1910
+ matchHarness,
1878
1911
  onboard,
1879
1912
  renderCockpitHtml,
1880
1913
  renderReportHtml,
@@ -1885,6 +1918,7 @@ export {
1885
1918
  selfCaretRange,
1886
1919
  selfPackageVersion,
1887
1920
  sendApprovedReports,
1921
+ smokeSuite,
1888
1922
  svelteCodemods,
1889
1923
  syncConfigs,
1890
1924
  upgradeSvelte4to5,