@mohasinac/appkit 4.52.5 → 4.53.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 (630) hide show
  1. package/dist/.build-stamp.json +4 -4
  2. package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
  3. package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
  4. package/dist/_internal/server/features/auctions/actions.js +1 -1
  5. package/dist/_internal/server/features/categories/data.js +23 -7
  6. package/dist/_internal/server/features/checkout/actions.js +10 -3
  7. package/dist/_internal/server/features/checkout/data.d.ts +15 -0
  8. package/dist/_internal/server/features/checkout/data.js +20 -3
  9. package/dist/_internal/server/features/lottery/actions.js +9 -1
  10. package/dist/_internal/server/features/lottery/og.d.ts +40 -0
  11. package/dist/_internal/server/features/lottery/og.js +79 -0
  12. package/dist/_internal/server/features/messages/actions.js +4 -0
  13. package/dist/_internal/server/features/offers/adapters.js +17 -3
  14. package/dist/_internal/server/features/orders/actions.js +7 -2
  15. package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
  16. package/dist/_internal/server/features/raffle/actions.js +25 -0
  17. package/dist/_internal/server/features/reviews/actions.js +1 -1
  18. package/dist/_internal/server/features/reviews/data.d.ts +1 -1
  19. package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
  20. package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
  21. package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
  22. package/dist/_internal/server/features/search/index-build/build.js +285 -0
  23. package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
  24. package/dist/_internal/server/features/search/index-build/sources.js +385 -0
  25. package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
  26. package/dist/_internal/server/features/search/search-sources.js +142 -7
  27. package/dist/_internal/server/features/seo/robots.js +21 -1
  28. package/dist/_internal/server/features/seo/sitemap.js +1 -1
  29. package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
  30. package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
  31. package/dist/_internal/server/features/site-settings/adapters.js +26 -0
  32. package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
  33. package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
  34. package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
  35. package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
  36. package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
  37. package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
  38. package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
  39. package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
  40. package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
  41. package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
  42. package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
  43. package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
  44. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
  45. package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
  46. package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
  47. package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
  48. package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
  49. package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
  50. package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
  51. package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
  52. package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
  53. package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
  54. package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
  55. package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
  56. package/dist/_internal/server/functions/scheduled.d.ts +2 -1
  57. package/dist/_internal/server/functions/scheduled.js +25 -1
  58. package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
  59. package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
  60. package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
  61. package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
  62. package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
  63. package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
  64. package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
  65. package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
  66. package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
  67. package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
  68. package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
  69. package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
  70. package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
  71. package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
  72. package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
  73. package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
  74. package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
  75. package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
  76. package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
  77. package/dist/_internal/server/jobs/core/promotions.js +7 -4
  78. package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
  79. package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
  80. package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
  81. package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
  82. package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
  83. package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
  84. package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
  85. package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
  86. package/dist/_internal/server/jobs/handlers/index.js +1 -0
  87. package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
  88. package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
  89. package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
  90. package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
  91. package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
  92. package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
  93. package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
  94. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
  95. package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
  96. package/dist/_internal/shared/actions/action-registry.js +29 -0
  97. package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
  98. package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
  99. package/dist/_internal/shared/features/events/config.d.ts +14 -0
  100. package/dist/_internal/shared/features/events/config.js +14 -0
  101. package/dist/_internal/shared/features/notifications/action-url.js +8 -0
  102. package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
  103. package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
  104. package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
  105. package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
  106. package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
  107. package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
  108. package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
  109. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
  110. package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
  111. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
  112. package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
  113. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
  114. package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
  115. package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
  116. package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
  117. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
  118. package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
  119. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
  120. package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
  121. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
  122. package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
  123. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
  124. package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
  125. package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
  126. package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
  127. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
  128. package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
  129. package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
  130. package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
  131. package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
  132. package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
  133. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
  134. package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
  135. package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
  136. package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
  137. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
  138. package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
  139. package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
  140. package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
  141. package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
  142. package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
  143. package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
  144. package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
  145. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
  146. package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
  147. package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
  148. package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
  149. package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
  150. package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
  151. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
  152. package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
  153. package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
  154. package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
  155. package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
  156. package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
  157. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
  158. package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
  159. package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
  160. package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
  161. package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
  162. package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
  163. package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
  164. package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
  165. package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
  166. package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
  167. package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
  168. package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
  169. package/dist/_internal/shared/listing-types/art/config.js +1 -0
  170. package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
  171. package/dist/_internal/shared/listing-types/auction/config.js +1 -0
  172. package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
  173. package/dist/_internal/shared/listing-types/classified/config.js +1 -0
  174. package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
  175. package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
  176. package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
  177. package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
  178. package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
  179. package/dist/_internal/shared/listing-types/live/config.js +1 -0
  180. package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
  181. package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
  182. package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
  183. package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
  184. package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
  185. package/dist/_internal/shared/listing-types/standard/config.js +1 -0
  186. package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
  187. package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
  188. package/dist/_internal/shared/media/limits.d.ts +12 -2
  189. package/dist/_internal/shared/media/limits.js +12 -2
  190. package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
  191. package/dist/_internal/shared/search/artifact-url.js +119 -0
  192. package/dist/_internal/shared/search/index-record.d.ts +68 -0
  193. package/dist/_internal/shared/search/index-record.js +96 -0
  194. package/dist/_internal/shared/search/match.d.ts +65 -0
  195. package/dist/_internal/shared/search/match.js +263 -0
  196. package/dist/client.d.ts +8 -7
  197. package/dist/client.js +12 -5
  198. package/dist/configs/eslint.js +22 -2
  199. package/dist/constants/api-endpoints.d.ts +68 -0
  200. package/dist/constants/api-endpoints.js +32 -0
  201. package/dist/constants/field-names.d.ts +7 -1
  202. package/dist/constants/field-names.js +36 -1
  203. package/dist/contracts/repository.d.ts +8 -7
  204. package/dist/contracts/search.d.ts +2 -2
  205. package/dist/contracts/table.d.ts +3 -3
  206. package/dist/contracts/table.js +3 -3
  207. package/dist/core/contact-submissions.repository.js +2 -2
  208. package/dist/core/integration-keys.js +7 -1
  209. package/dist/core/newsletter.repository.js +2 -2
  210. package/dist/core/site-config.js +1 -1
  211. package/dist/errors/error-codes.d.ts +30 -0
  212. package/dist/errors/error-codes.js +30 -0
  213. package/dist/errors/error-display-map.js +40 -1
  214. package/dist/features/account/api/[userId]/addresses/route.js +1 -1
  215. package/dist/features/account/components/UserBidsView.js +1 -1
  216. package/dist/features/account/components/index.d.ts +0 -8
  217. package/dist/features/account/components/index.js +0 -4
  218. package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
  219. package/dist/features/addresses/repository/addresses.repository.js +65 -9
  220. package/dist/features/addresses/schemas/firestore.d.ts +17 -6
  221. package/dist/features/admin/actions/notification-actions.js +15 -6
  222. package/dist/features/admin/api/bids/route.js +1 -1
  223. package/dist/features/admin/api/coupons/route.js +1 -1
  224. package/dist/features/admin/api/products/route.js +1 -1
  225. package/dist/features/admin/api/reviews/route.js +1 -1
  226. package/dist/features/admin/components/AdminAdEditorView.js +19 -5
  227. package/dist/features/admin/components/AdminAuditLogView.js +1 -1
  228. package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
  229. package/dist/features/admin/components/AdminBlogView.js +1 -1
  230. package/dist/features/admin/components/AdminBrandsView.js +17 -1
  231. package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
  232. package/dist/features/admin/components/AdminContactView.js +1 -1
  233. package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
  234. package/dist/features/admin/components/AdminNewsletterView.js +1 -1
  235. package/dist/features/admin/components/AdminOrdersView.js +9 -2
  236. package/dist/features/admin/components/AdminPayoutsView.js +1 -1
  237. package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
  238. package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
  239. package/dist/features/admin/components/AdminProductEditorView.js +24 -37
  240. package/dist/features/admin/components/AdminProductsView.js +10 -3
  241. package/dist/features/admin/components/AdminScammersView.js +1 -1
  242. package/dist/features/admin/components/AdminSectionsView.js +21 -5
  243. package/dist/features/admin/components/AdminSessionsView.js +1 -1
  244. package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
  245. package/dist/features/admin/components/AdminTeamView.js +1 -1
  246. package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
  247. package/dist/features/admin/components/AdminUsersView.js +1 -1
  248. package/dist/features/admin/components/DataListingView.d.ts +2 -1
  249. package/dist/features/admin/components/DataListingView.js +9 -4
  250. package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
  251. package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
  252. package/dist/features/admin/repository/site-settings.repository.js +8 -3
  253. package/dist/features/admin/schemas/firestore.d.ts +62 -1
  254. package/dist/features/admin/schemas/firestore.js +32 -0
  255. package/dist/features/admin/types/index.d.ts +1 -1
  256. package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
  257. package/dist/features/auctions/actions/bid-actions.js +16 -4
  258. package/dist/features/auctions/api/route.js +1 -1
  259. package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
  260. package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
  261. package/dist/features/auctions/repository/bid.repository.js +114 -13
  262. package/dist/features/auctions/schemas/firestore.d.ts +24 -4
  263. package/dist/features/auctions/schemas/firestore.js +1 -0
  264. package/dist/features/auth/actions/profile-actions.js +30 -4
  265. package/dist/features/auth/components/index.d.ts +0 -1
  266. package/dist/features/auth/components/index.js +0 -1
  267. package/dist/features/auth/repository/session.repository.d.ts +17 -3
  268. package/dist/features/auth/repository/session.repository.js +46 -5
  269. package/dist/features/auth/repository/token.repository.d.ts +27 -4
  270. package/dist/features/auth/repository/token.repository.js +65 -11
  271. package/dist/features/auth/repository/user.repository.d.ts +33 -7
  272. package/dist/features/auth/repository/user.repository.js +100 -15
  273. package/dist/features/auth/schemas/firestore.d.ts +63 -12
  274. package/dist/features/auth/schemas/firestore.js +11 -0
  275. package/dist/features/before-after/api/route.js +1 -1
  276. package/dist/features/blog/components/BlogListView.js +16 -3
  277. package/dist/features/blog/components/BlogPostView.js +1 -1
  278. package/dist/features/blog/schemas/index.d.ts +2 -2
  279. package/dist/features/cart/api/route.js +1 -1
  280. package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
  281. package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
  282. package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
  283. package/dist/features/categories/api/route.js +10 -10
  284. package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
  285. package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
  286. package/dist/features/categories/components/index.d.ts +0 -2
  287. package/dist/features/categories/components/index.js +0 -1
  288. package/dist/features/categories/repository/categories.repository.d.ts +1 -0
  289. package/dist/features/categories/repository/categories.repository.js +31 -1
  290. package/dist/features/categories/schemas/index.d.ts +2 -2
  291. package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
  292. package/dist/features/categories/utils/taxonomy-visual.js +58 -0
  293. package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
  294. package/dist/features/collections/api/[slug]/route.js +3 -3
  295. package/dist/features/collections/api/route.js +1 -1
  296. package/dist/features/consultation/api/route.js +1 -1
  297. package/dist/features/consultation/repository/consultations.repository.js +1 -1
  298. package/dist/features/consultation/types/index.d.ts +1 -1
  299. package/dist/features/contact/components/ContactForm.js +1 -3
  300. package/dist/features/corporate/api/route.js +1 -1
  301. package/dist/features/corporate/repository/corporate.repository.js +1 -1
  302. package/dist/features/corporate/types/index.d.ts +1 -1
  303. package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
  304. package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
  305. package/dist/features/events/actions/event-actions.d.ts +14 -0
  306. package/dist/features/events/actions/event-actions.js +82 -3
  307. package/dist/features/events/api/[id]/route.js +2 -2
  308. package/dist/features/events/components/AdminEventEditorView.js +22 -3
  309. package/dist/features/events/components/AdminEventsView.js +32 -8
  310. package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
  311. package/dist/features/events/components/EventRafflesSection.js +52 -3
  312. package/dist/features/events/components/SpinWheelView.d.ts +2 -2
  313. package/dist/features/events/components/SpinWheelView.js +41 -4
  314. package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
  315. package/dist/features/events/repository/event-entry.repository.js +41 -7
  316. package/dist/features/events/schemas/firestore.d.ts +17 -4
  317. package/dist/features/events/types/index.d.ts +37 -0
  318. package/dist/features/faq/repository/faqs.repository.js +1 -1
  319. package/dist/features/faq/schemas/index.d.ts +5 -2
  320. package/dist/features/faq/schemas/index.js +6 -0
  321. package/dist/features/faq/types/index.d.ts +0 -1
  322. package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
  323. package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
  324. package/dist/features/homepage/api/carousel/route.js +4 -4
  325. package/dist/features/homepage/api/route.js +2 -2
  326. package/dist/features/homepage/api/sections/route.js +1 -1
  327. package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
  328. package/dist/features/homepage/components/AnnouncementBar.js +13 -19
  329. package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
  330. package/dist/features/homepage/components/index.d.ts +0 -2
  331. package/dist/features/homepage/components/index.js +0 -1
  332. package/dist/features/homepage/repository/homepage.repository.js +1 -1
  333. package/dist/features/homepage/schemas/firestore.d.ts +6 -0
  334. package/dist/features/homepage/schemas/index.d.ts +10 -10
  335. package/dist/features/layout/AppLayoutShell.d.ts +11 -0
  336. package/dist/features/layout/AppLayoutShell.js +64 -12
  337. package/dist/features/layout/BottomActionsContext.d.ts +16 -0
  338. package/dist/features/layout/BottomActionsContext.js +5 -0
  339. package/dist/features/layout/BottomChrome.js +48 -9
  340. package/dist/features/layout/BottomNavbar.d.ts +14 -0
  341. package/dist/features/layout/BottomNavbar.js +43 -3
  342. package/dist/features/layout/MainNavbar.d.ts +11 -0
  343. package/dist/features/layout/NavbarLayout.d.ts +3 -0
  344. package/dist/features/layout/NavbarLayout.js +88 -11
  345. package/dist/features/layout/SideActionDock.d.ts +1 -0
  346. package/dist/features/layout/SideActionDock.js +219 -0
  347. package/dist/features/layout/TitleBarLayout.js +1 -1
  348. package/dist/features/layout/cta-anchor.d.ts +31 -0
  349. package/dist/features/layout/cta-anchor.js +31 -0
  350. package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
  351. package/dist/features/layout/hooks/useBottomActions.js +6 -1
  352. package/dist/features/layout/index.d.ts +9 -1
  353. package/dist/features/layout/index.js +9 -1
  354. package/dist/features/layout/useCtaReveal.d.ts +24 -0
  355. package/dist/features/layout/useCtaReveal.js +82 -0
  356. package/dist/features/layout/useHoldToOpen.d.ts +41 -0
  357. package/dist/features/layout/useHoldToOpen.js +84 -0
  358. package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
  359. package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
  360. package/dist/features/lottery/schemas/firestore.d.ts +33 -5
  361. package/dist/features/loyalty/api/balance/route.js +1 -1
  362. package/dist/features/loyalty/api/history/route.js +1 -1
  363. package/dist/features/media/MediaImage.js +0 -1
  364. package/dist/features/media/MediaPickerModal.js +7 -1
  365. package/dist/features/media/modals/ImageEditor.js +5 -1
  366. package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
  367. package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
  368. package/dist/features/media/upload/CameraCapture.js +16 -1
  369. package/dist/features/media/upload/ImageUpload.js +42 -4
  370. package/dist/features/media/upload/MediaUploadField.js +69 -13
  371. package/dist/features/media/upload/downscale-image.d.ts +56 -0
  372. package/dist/features/media/upload/downscale-image.js +150 -0
  373. package/dist/features/messages/components/ConversationThreadView.js +45 -2
  374. package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
  375. package/dist/features/messages/components/MessageSellerButton.js +10 -2
  376. package/dist/features/messages/schemas/firestore.d.ts +15 -0
  377. package/dist/features/orders/hooks/useOrders.js +4 -2
  378. package/dist/features/orders/repository/orders.repository.d.ts +15 -4
  379. package/dist/features/orders/repository/orders.repository.js +52 -20
  380. package/dist/features/orders/schemas/firestore.d.ts +15 -4
  381. package/dist/features/orders/schemas/index.d.ts +8 -8
  382. package/dist/features/orders/types/index.d.ts +2 -2
  383. package/dist/features/payments/repository/payments.repository.js +2 -2
  384. package/dist/features/payments/repository/payout.repository.d.ts +23 -6
  385. package/dist/features/payments/repository/payout.repository.js +63 -23
  386. package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
  387. package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
  388. package/dist/features/payments/schemas/firestore.d.ts +14 -3
  389. package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
  390. package/dist/features/pre-orders/api/[slug]/route.js +1 -1
  391. package/dist/features/pre-orders/api/admin/route.js +1 -1
  392. package/dist/features/pre-orders/api/route.js +1 -1
  393. package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
  394. package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
  395. package/dist/features/products/api/[id]/route.js +1 -1
  396. package/dist/features/products/components/ListingBottomActions.js +4 -0
  397. package/dist/features/products/components/ProductDetailPageView.js +2 -1
  398. package/dist/features/products/components/ProductGalleryClient.js +2 -2
  399. package/dist/features/products/components/ProductGrid.js +12 -1
  400. package/dist/features/products/components/index.d.ts +0 -2
  401. package/dist/features/products/components/index.js +0 -1
  402. package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
  403. package/dist/features/products/config/listing-type-listing-config.js +27 -2
  404. package/dist/features/products/constants/listing-tabs.d.ts +9 -0
  405. package/dist/features/products/constants/listing-tabs.js +3 -2
  406. package/dist/features/products/hooks/useProducts.js +2 -2
  407. package/dist/features/products/repository/products.repository.js +13 -1
  408. package/dist/features/products/schemas/index.d.ts +2 -2
  409. package/dist/features/products/types/index.d.ts +1 -1
  410. package/dist/features/promotions/api/route.js +1 -1
  411. package/dist/features/reviews/actions/review-actions.d.ts +6 -6
  412. package/dist/features/reviews/actions/review-actions.js +22 -8
  413. package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
  414. package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
  415. package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
  416. package/dist/features/reviews/repository/reviews.repository.js +63 -12
  417. package/dist/features/reviews/schemas/firestore.d.ts +13 -2
  418. package/dist/features/reviews/schemas/index.d.ts +2 -2
  419. package/dist/features/scams/actions/scam-actions.js +16 -4
  420. package/dist/features/search/components/SearchResultsPageView.js +2 -1
  421. package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
  422. package/dist/features/search/hooks/useSearchIndex.js +172 -0
  423. package/dist/features/search/repository/search.repository.js +2 -2
  424. package/dist/features/seller/actions/offer-actions.d.ts +5 -5
  425. package/dist/features/seller/actions/offer-actions.js +38 -8
  426. package/dist/features/seller/actions/seller-actions.js +34 -7
  427. package/dist/features/seller/api/coupons/route.js +1 -1
  428. package/dist/features/seller/api/products/route.js +1 -1
  429. package/dist/features/seller/api/store/route.js +1 -1
  430. package/dist/features/seller/components/SellerBidsView.js +1 -1
  431. package/dist/features/seller/components/SellerCouponsView.js +1 -1
  432. package/dist/features/seller/components/SellerListingTypeView.js +9 -1
  433. package/dist/features/seller/components/SellerOrdersView.js +1 -1
  434. package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
  435. package/dist/features/seller/components/SellerPayoutsView.js +1 -1
  436. package/dist/features/seller/components/SellerProductShell.js +0 -1
  437. package/dist/features/seller/components/SellerProductsView.js +1 -1
  438. package/dist/features/seller/components/SellerShippingView.js +0 -1
  439. package/dist/features/seller/components/SellerStorefrontView.js +0 -1
  440. package/dist/features/seller/components/index.d.ts +0 -4
  441. package/dist/features/seller/components/index.js +0 -2
  442. package/dist/features/seller/repository/offer.repository.d.ts +15 -3
  443. package/dist/features/seller/repository/offer.repository.js +43 -7
  444. package/dist/features/seller/schemas/firestore.d.ts +14 -3
  445. package/dist/features/seller/schemas/index.d.ts +4 -4
  446. package/dist/features/seller/schemas/order-forms.d.ts +39 -0
  447. package/dist/features/seller/schemas/order-forms.js +37 -0
  448. package/dist/features/shell/FormShell.js +6 -2
  449. package/dist/features/shell/QuickFormDrawer.js +15 -1
  450. package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
  451. package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
  452. package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
  453. package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
  454. package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
  455. package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
  456. package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
  457. package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
  458. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
  459. package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
  460. package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
  461. package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
  462. package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
  463. package/dist/features/sticker-trace/constants/help-content.js +172 -0
  464. package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
  465. package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
  466. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
  467. package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
  468. package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
  469. package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
  470. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
  471. package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
  472. package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
  473. package/dist/features/sticker-trace/schemas/firestore.js +79 -0
  474. package/dist/features/sticker-trace/server.d.ts +8 -0
  475. package/dist/features/sticker-trace/server.js +51 -0
  476. package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
  477. package/dist/features/stores/actions/store-query-actions.js +7 -2
  478. package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
  479. package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
  480. package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
  481. package/dist/features/stores/api/[storeSlug]/route.js +1 -1
  482. package/dist/features/stores/components/StoreNavTabs.js +17 -2
  483. package/dist/features/stores/manifest.js +8 -4
  484. package/dist/features/support/repository/support.repository.d.ts +14 -3
  485. package/dist/features/support/repository/support.repository.js +93 -13
  486. package/dist/features/support/schemas/firestore.d.ts +16 -5
  487. package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
  488. package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
  489. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
  490. package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
  491. package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
  492. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
  493. package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
  494. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
  495. package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
  496. package/dist/features/tester/seed-data/authored/index.js +8 -0
  497. package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
  498. package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
  499. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
  500. package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
  501. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +192 -22
  502. package/dist/index.d.ts +10 -23
  503. package/dist/index.js +27 -19
  504. package/dist/next/api/routeHandler.js +9 -0
  505. package/dist/next/routing/require-record.d.ts +13 -0
  506. package/dist/next/routing/require-record.js +62 -0
  507. package/dist/next/routing/route-map.d.ts +4 -4
  508. package/dist/next/routing/route-map.js +25 -3
  509. package/dist/providers/db-firebase/base.d.ts +4 -2
  510. package/dist/providers/db-firebase/base.js +21 -5
  511. package/dist/providers/db-firebase/base.repository.d.ts +11 -9
  512. package/dist/providers/db-firebase/base.repository.js +19 -0
  513. package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
  514. package/dist/providers/db-firebase/rtdb-paths.js +12 -0
  515. package/dist/react/ErrorBoundary.js +6 -1
  516. package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
  517. package/dist/react/hooks/realtime-event-constants.js +8 -0
  518. package/dist/react/hooks/useEntityDelete.js +5 -1
  519. package/dist/react/hooks/useMessage.js +5 -1
  520. package/dist/repositories/index.d.ts +2 -2
  521. package/dist/repositories/index.js +6 -1
  522. package/dist/schemas/registry.d.ts +13 -20
  523. package/dist/schemas/registry.js +31 -14
  524. package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
  525. package/dist/security/encrypted.d.ts +117 -0
  526. package/dist/security/encrypted.js +100 -0
  527. package/dist/security/index.d.ts +5 -2
  528. package/dist/security/index.js +16 -2
  529. package/dist/security/pii-accessors.d.ts +71 -0
  530. package/dist/security/pii-accessors.js +150 -0
  531. package/dist/security/pii-encrypt.d.ts +0 -8
  532. package/dist/security/pii-encrypt.js +22 -15
  533. package/dist/security/pii-mask.d.ts +18 -0
  534. package/dist/security/pii-mask.js +27 -0
  535. package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
  536. package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
  537. package/dist/seed/addresses-seed-data.d.ts +2 -2
  538. package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
  539. package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
  540. package/dist/seed/bids-seed-data.d.ts +2 -2
  541. package/dist/seed/bids-seed-data.js +23 -2
  542. package/dist/seed/events-seed-data.d.ts +2 -2
  543. package/dist/seed/events-seed-data.js +5 -0
  544. package/dist/seed/faq-seed-data.js +175 -5
  545. package/dist/seed/homepage-sections-seed-data.js +39 -23
  546. package/dist/seed/index.d.ts +1 -0
  547. package/dist/seed/index.js +1 -0
  548. package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
  549. package/dist/seed/offers-seed-data.d.ts +2 -2
  550. package/dist/seed/offers-seed-data.js +1 -1
  551. package/dist/seed/orders-seed-data.d.ts +2 -2
  552. package/dist/seed/payouts-seed-data.d.ts +2 -2
  553. package/dist/seed/payouts-seed-data.js +1 -1
  554. package/dist/seed/reviews-seed-data.d.ts +1 -2
  555. package/dist/seed/seed-purpose.js +7 -0
  556. package/dist/seed/sessions-seed-data.d.ts +2 -2
  557. package/dist/seed/sessions-seed-data.js +5 -0
  558. package/dist/seed/site-settings-seed-data.js +1 -1
  559. package/dist/seed/support-tickets-seed-data.d.ts +2 -2
  560. package/dist/seed/support-tickets-seed-data.js +1 -1
  561. package/dist/seed/users-seed-data.d.ts +2 -2
  562. package/dist/seed/users-seed-data.js +1 -1
  563. package/dist/seo/json-ld.js +5 -1
  564. package/dist/server.d.ts +18 -3
  565. package/dist/server.js +59 -3
  566. package/dist/styles.css +237 -1
  567. package/dist/tailwind-utilities.css +1 -1
  568. package/dist/ui/components/Button.js +7 -1
  569. package/dist/ui/components/FilterChipGroup.d.ts +11 -0
  570. package/dist/ui/components/FilterChipGroup.js +1 -1
  571. package/dist/ui/components/ImageGallery.js +6 -1
  572. package/dist/ui/components/ListingLayout.js +14 -8
  573. package/dist/ui/components/OverflowRow.d.ts +92 -0
  574. package/dist/ui/components/OverflowRow.js +203 -0
  575. package/dist/ui/components/OverflowRow.style.css +235 -0
  576. package/dist/ui/components/RecordDetailModal.js +14 -1
  577. package/dist/ui/components/RowActionMenu.js +5 -1
  578. package/dist/ui/components/SideDrawer.js +5 -1
  579. package/dist/ui/components/SideModal.js +9 -1
  580. package/dist/ui/components/TabBarShell.d.ts +12 -1
  581. package/dist/ui/components/TabBarShell.js +3 -2
  582. package/dist/ui/components/Tabs.js +36 -24
  583. package/dist/ui/components/Toast.d.ts +3 -24
  584. package/dist/ui/components/Toast.js +2 -19
  585. package/dist/ui/components/TopBannerPortal.d.ts +15 -0
  586. package/dist/ui/components/TopBannerPortal.js +19 -0
  587. package/dist/ui/components/UnsavedChangesModal.js +5 -1
  588. package/dist/ui/components/index.style.css +1 -0
  589. package/dist/ui/components/row-collapse.d.ts +15 -0
  590. package/dist/ui/components/row-collapse.js +127 -0
  591. package/dist/ui/components/toast-context.d.ts +63 -0
  592. package/dist/ui/components/toast-context.js +48 -0
  593. package/dist/ui/components/top-banner-slot.d.ts +37 -0
  594. package/dist/ui/components/top-banner-slot.js +45 -0
  595. package/dist/ui/icons/icon-registry.d.ts +6 -0
  596. package/dist/ui/icons/icon-registry.js +17 -1
  597. package/dist/ui/index.d.ts +2 -0
  598. package/dist/ui/index.js +1 -0
  599. package/dist/utils/array.helper.d.ts +2 -2
  600. package/dist/utils/array.helper.js +5 -5
  601. package/dist/utils/id-generators.d.ts +6 -0
  602. package/dist/utils/id-generators.js +10 -0
  603. package/dist/utils/media-url.js +0 -2
  604. package/dist/utils/search-txt-builders.d.ts +28 -4
  605. package/dist/utils/search-txt-builders.js +41 -1
  606. package/dist/validation/schemas.d.ts +8 -8
  607. package/package.json +6 -2
  608. package/scripts/seed-cli.mjs +3 -0
  609. package/dist/features/account/components/UserAddressesView.d.ts +0 -13
  610. package/dist/features/account/components/UserAddressesView.js +0 -5
  611. package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
  612. package/dist/features/account/components/UserNotificationsView.js +0 -12
  613. package/dist/features/account/components/UserSettingsView.d.ts +0 -16
  614. package/dist/features/account/components/UserSettingsView.js +0 -13
  615. package/dist/features/account/components/UserSupportView.d.ts +0 -3
  616. package/dist/features/account/components/UserSupportView.js +0 -166
  617. package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
  618. package/dist/features/admin/components/DemoSeedView.js +0 -5
  619. package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
  620. package/dist/features/auth/components/AuthStatusPanel.js +0 -22
  621. package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
  622. package/dist/features/categories/components/CategoryProductsView.js +0 -21
  623. package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
  624. package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
  625. package/dist/features/layout/BottomActions.d.ts +0 -1
  626. package/dist/features/layout/BottomActions.js +0 -311
  627. package/dist/features/products/components/ProductsView.d.ts +0 -6
  628. package/dist/features/products/components/ProductsView.js +0 -5
  629. package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
  630. package/dist/features/seller/components/SellerStoreView.js +0 -8
@@ -0,0 +1,193 @@
1
+ /*
2
+ * WHY: An exploratory run produces vector geometry and ~20 KB review
3
+ * thumbnails — about 1 MB. Full-resolution parts and the print exports
4
+ * cost roughly 500 MB a sheet, which is the difference between ~52 sheets
5
+ * in 5 GB and about 8. So they are rendered ONCE, for the run the operator
6
+ * actually chose, and this is that moment.
7
+ * WHAT: Accept a run as the sheet's current result, and fan out a full-
8
+ * resolution render of its parts.
9
+ *
10
+ * 🛑 `promoteRun` and `markPromoted` have existed since P4 with ZERO callers.
11
+ * This is their first one. Anything that looked like it already worked —
12
+ * `isPromoted` in the run list, `promotedPartCount` in the adapter — was
13
+ * reading fields nothing has ever written.
14
+ *
15
+ * 🛑 TWO DIFFERENT THINGS ARE CALLED "PROMOTE" IN THIS FEATURE AND THEY MUST
16
+ * NOT BE CONFLATED:
17
+ * - THIS one promotes a RUN onto its SHEET: the sheet now shows that run's
18
+ * parts, and full-res renders are produced.
19
+ * - Part Two's `promoteStickerSheetToListings` promotes a SHEET into
20
+ * marketplace PRODUCTS.
21
+ * The second depends on the first, because `SheetPart.assetPath` does not
22
+ * exist until a run has been promoted here.
23
+ *
24
+ * EXPORTS: PromoteRunInput, PromoteRunResult, promoteStickerTraceRun
25
+ *
26
+ * @tag domain:sticker-trace
27
+ * @tag layer:server
28
+ * @tag pattern:none
29
+ * @tag access:server
30
+ * @tag consumers:api/admin/sticker-sheets
31
+ * @tag sideEffects:firestore,rtdb
32
+ */
33
+ import { ValidationError } from "../../../../errors/validation-error.js";
34
+ import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
35
+ import { stickerTraceRunsRepository } from "../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js";
36
+ import { TraceRunStatusValues } from "../../../../features/sticker-trace/schemas/firestore.js";
37
+ import { serverLogger } from "../../../../monitoring/index.js";
38
+ import { createShardTasks, planShards } from "./fanout.js";
39
+ import { emitProgress } from "./progress.js";
40
+ import { readRunGeometry } from "./storage.js";
41
+ /**
42
+ * Promote fans out no wider than the trace did.
43
+ *
44
+ * A full-resolution part is a decode, a rasterise and a PNG encode at native
45
+ * size, so the shard budget is the same 1 GiB / 300 s. More shards than
46
+ * `maxInstances` (8) queue rather than run, and each one is a Firestore write
47
+ * plus an invocation.
48
+ */
49
+ const MAX_PROMOTE_SHARDS = 8;
50
+ /**
51
+ * Accept a run and start the full-resolution render.
52
+ *
53
+ * 🛑 It refuses a run that did not SUCCEED. Promoting a failed or still-running
54
+ * run would copy a partial `parts[]` onto the sheet and set `activeRunId` to
55
+ * it — the sheet would then confidently show an incomplete result, with the
56
+ * run's own status the only contradiction and nothing surfacing it.
57
+ */
58
+ export async function promoteStickerTraceRun(input) {
59
+ const [sheet, run] = await Promise.all([
60
+ stickerSheetsRepository.findByIdOrFail(input.sheetId),
61
+ stickerTraceRunsRepository.findByIdOrFail(input.runId),
62
+ ]);
63
+ /*
64
+ * The run must belong to THIS sheet. Both ids are caller-supplied, so this is
65
+ * the only place the pairing can be checked — without it, promoting run X of
66
+ * sheet A onto sheet B would copy A's parts onto B and point B's
67
+ * `activeRunId` at a run that is not its own.
68
+ */
69
+ if (run.sheetId !== input.sheetId) {
70
+ throw new ValidationError("That run belongs to a different sheet.", {
71
+ runId: "Run and sheet do not match.",
72
+ });
73
+ }
74
+ if (run.status !== TraceRunStatusValues.SUCCEEDED) {
75
+ throw new ValidationError(`Only a successful run can be promoted — this one is ${run.status}.`, { runId: "Re-run it, or promote a different attempt." });
76
+ }
77
+ /*
78
+ * 🛑 The parts come from `geometry.json`, NOT from the run document — the run
79
+ * carries only `partCount`. That is deliberate: sixty Bézier outlines would
80
+ * approach Firestore's 1 MiB document limit, which is why the geometry is an
81
+ * artifact in the first place.
82
+ */
83
+ const geometry = await readRunGeometry(input.runId, input.sheetId);
84
+ /*
85
+ * Millimetres only when the scan's dpi can be trusted.
86
+ *
87
+ * The geometry is in WORKING raster pixels while `dpi` describes the
88
+ * ORIGINAL, so the two are bridged by the downscale factor. Skipping that
89
+ * bridge is the subtle version of the same error the commit panel nearly
90
+ * shipped: every figure would be wrong by exactly the downscale ratio, and
91
+ * every one of them would look plausible.
92
+ */
93
+ const workingToOriginal = sheet.widthPx > 0 && geometry.workingSize.width > 0
94
+ ? sheet.widthPx / geometry.workingSize.width
95
+ : null;
96
+ const pxPerMm = sheet.dpi && sheet.dpi > 0 && workingToOriginal !== null
97
+ ? (sheet.dpi / 25.4) / workingToOriginal
98
+ : null;
99
+ /*
100
+ * 🛑 `groupIndex` is 0 for every part, because geometry.json does not carry a
101
+ * per-part cluster assignment. On a single-sheet scan that is simply correct.
102
+ * On a multi-sheet scan it is NOT, and it is warned about rather than quietly
103
+ * written — a wrong group index renders every part under one tab, which looks
104
+ * like a tidy result instead of a lost distinction.
105
+ */
106
+ if ((run.groupCount ?? 1) > 1) {
107
+ serverLogger.warn("Promoting a multi-sheet run; parts carry groupIndex 0", {
108
+ runId: input.runId,
109
+ sheetId: input.sheetId,
110
+ groupCount: run.groupCount,
111
+ });
112
+ }
113
+ const parts = geometry.parts.map((g) => {
114
+ const bboxMm = pxPerMm
115
+ ? {
116
+ x: g.bbox.x / pxPerMm,
117
+ y: g.bbox.y / pxPerMm,
118
+ width: g.bbox.width / pxPerMm,
119
+ height: g.bbox.height / pxPerMm,
120
+ }
121
+ : null;
122
+ return {
123
+ ordinal: g.ordinal,
124
+ // The schema's own default: the ordinal, renameable by an admin later.
125
+ name: String(g.ordinal),
126
+ groupIndex: 0,
127
+ bboxPx: g.bbox,
128
+ bboxMm,
129
+ // Derived from the same measurement, so it is withheld on the same terms.
130
+ areaMm2: bboxMm ? Math.round(bboxMm.width * bboxMm.height * 100) / 100 : null,
131
+ };
132
+ });
133
+ if (parts.length === 0) {
134
+ throw new ValidationError("That run produced no parts, so there is nothing to promote.", { runId: "Tune the parameters and try another attempt." });
135
+ }
136
+ /*
137
+ * Sheet first, fan-out second.
138
+ *
139
+ * The sheet's `parts[]` and geometry are what every review surface reads, and
140
+ * they are complete the moment the run succeeded — the fan-out only adds
141
+ * full-resolution PNGs. Promoting the document first means an operator sees
142
+ * the accepted result immediately, and a fan-out that fails leaves a sheet
143
+ * that is correct but missing downloads, rather than a run marked accepted on
144
+ * a sheet still showing the previous one.
145
+ */
146
+ await stickerSheetsRepository.promoteRun(input.sheetId, input.runId, {
147
+ parts,
148
+ groupCount: run.groupCount ?? 1,
149
+ artifacts: run.artifacts ?? {},
150
+ });
151
+ const ordinals = parts.map((p) => p.ordinal);
152
+ const shards = planShards(ordinals, MAX_PROMOTE_SHARDS);
153
+ /*
154
+ * 🛑 `mode: "full"` is what makes these DIFFERENT task documents from the
155
+ * trace's. `shardTaskId` keys on the mode precisely so this does not `set()`
156
+ * over `{runId}__part__{i}` — which would be an update, would not fire
157
+ * `documentCreated`, and would leave the promote silently doing nothing.
158
+ */
159
+ const shardCount = await createShardTasks({
160
+ runId: input.runId,
161
+ sheetId: input.sheetId,
162
+ mode: "full",
163
+ shards,
164
+ });
165
+ /*
166
+ * Best-effort, like every other progress write. The channel is the live bar;
167
+ * the durable record is the run document, which `markPromoted` writes when
168
+ * the finalizer completes. A failed ping must never fail a promotion that
169
+ * has already written Firestore.
170
+ */
171
+ await emitProgress({
172
+ runId: input.runId,
173
+ stage: "parts",
174
+ pct: 0,
175
+ partsDone: 0,
176
+ partsTotal: parts.length,
177
+ shardsDone: 0,
178
+ shardsTotal: shardCount,
179
+ message: `Rendering ${parts.length} part(s) at full resolution`,
180
+ level: "info",
181
+ });
182
+ return {
183
+ sheetId: input.sheetId,
184
+ runId: input.runId,
185
+ shardCount,
186
+ partCount: parts.length,
187
+ };
188
+ }
189
+ /** Whether this run is already the sheet's accepted result. */
190
+ export async function isRunPromoted(sheetId, runId) {
191
+ const sheet = await stickerSheetsRepository.findById(sheetId);
192
+ return sheet?.activeRunId === runId;
193
+ }
@@ -0,0 +1,50 @@
1
+ import type { StickerTraceTaskDocument } from "../../../../features/sticker-trace/schemas/firestore";
2
+ import type { ImageCodec } from "../../../shared/features/sticker-trace/codec";
3
+ import type { CutPath, Rect } from "../../../shared/features/sticker-trace/types";
4
+ export interface ShardDeps {
5
+ codec: ImageCodec;
6
+ readScan: (assetPath: string) => Promise<Uint8Array>;
7
+ readGeometry: (runId: string, sheetId: string) => Promise<{
8
+ workingSize: Rect;
9
+ parts: {
10
+ ordinal: number;
11
+ bbox: Rect;
12
+ path: CutPath;
13
+ }[];
14
+ }>;
15
+ /**
16
+ * Rasterise one part's path into an alpha mask covering `bbox`.
17
+ *
18
+ * 🛑 Takes the PATH, not an ordinal. An ordinal carries no geometry, so a
19
+ * signature keyed on it could only be implemented by re-reading
20
+ * geometry.json for every part — sixty extra downloads per shard for data the
21
+ * caller already holds. And no `scale`: `bbox` is already in
22
+ * full-resolution pixels by the time this is called.
23
+ */
24
+ rasterise: (path: CutPath, bbox: Rect) => Promise<Uint8Array>;
25
+ writeArtifact: (input: {
26
+ sheetId: string;
27
+ runId: string;
28
+ name: string;
29
+ contentType: string;
30
+ body: Uint8Array;
31
+ }) => Promise<{
32
+ assetPath: string;
33
+ }>;
34
+ }
35
+ /**
36
+ * Render this shard's parts, then report done.
37
+ *
38
+ * 🛑 `mode` decides resolution, and that is the single decision keeping this
39
+ * feature inside the Storage allowance. `thumb` renders review thumbnails into
40
+ * ONE sprite atlas; `full` renders full-resolution parts and only runs when a
41
+ * human promotes a run. Rendering full-res on every run costs ~600 MB per
42
+ * sheet across a tuning session against ~95 MB — roughly 8 sheets inside 5 GB
43
+ * instead of 52.
44
+ *
45
+ * 🛑 The shard reports done even when a part THROWS. Leaving the counter short
46
+ * means the finalizer is never elected and the run sits RUNNING forever — a
47
+ * stuck run is worse than a run that completes reporting a bad part, because
48
+ * nothing sweeps it and the RTDB channel prunes within the hour.
49
+ */
50
+ export declare function runShard(task: StickerTraceTaskDocument, deps: ShardDeps): Promise<void>;
@@ -0,0 +1,174 @@
1
+ /*
2
+ * WHY: Rendering parts is the only embarrassingly parallel stage, and the only
3
+ * one that cannot fit one invocation at `precise`/`max` on a 34 MP scan
4
+ * with sixty parts.
5
+ * WHAT: One shard's slice of the parts, then its vote in the finalizer
6
+ * election.
7
+ *
8
+ * 🛑 Owns the `parts` TRACE_STAGE for audit-sticker-trace-progress R2.
9
+ *
10
+ * 🛑 Per-part progress is RTDB-ONLY, via emitPartProgress. A Firestore event
11
+ * per part would be ~60 writes per run instead of ~10 — 6x the write budget to
12
+ * say something the live bar already shows and the history does not need.
13
+ *
14
+ * EXPORTS: runShard, ShardDeps
15
+ *
16
+ * @tag domain:sticker-trace
17
+ * @tag layer:server
18
+ * @tag pattern:none
19
+ * @tag access:server
20
+ * @tag consumers:functions/consumer-functions
21
+ * @tag sideEffects:firestore,storage,rtdb
22
+ */
23
+ import { normalizeError } from "../../../../errors/normalize.js";
24
+ import { serverLogger } from "../../../../monitoring/index.js";
25
+ import { stickerSheetsRepository } from "../../../../features/sticker-trace/repository/sticker-sheets.repository.js";
26
+ import { completeShardAndMaybeElectFinalizer } from "./fanout.js";
27
+ import { emitPartProgress, emitProgress } from "./progress.js";
28
+ /**
29
+ * One promoted part at full resolution.
30
+ *
31
+ * Extracted because the inline version sat at brace-depth 6 and tripped
32
+ * audit-code-quality's DEEP_NESTING — which was a fair call: the render is a
33
+ * distinct step, and naming it makes the mode branch in `runShard` read as the
34
+ * decision it is rather than as two blocks of plumbing.
35
+ */
36
+ async function writeFullPart(deps, input) {
37
+ const png = await deps.codec.encodePngRegion(input.source, input.region, input.alpha);
38
+ await deps.writeArtifact({
39
+ sheetId: input.sheetId,
40
+ runId: input.runId,
41
+ name: `part-${String(input.ordinal).padStart(3, "0")}.png`,
42
+ contentType: png.contentType,
43
+ body: png.bytes,
44
+ });
45
+ }
46
+ /**
47
+ * Render this shard's parts, then report done.
48
+ *
49
+ * 🛑 `mode` decides resolution, and that is the single decision keeping this
50
+ * feature inside the Storage allowance. `thumb` renders review thumbnails into
51
+ * ONE sprite atlas; `full` renders full-resolution parts and only runs when a
52
+ * human promotes a run. Rendering full-res on every run costs ~600 MB per
53
+ * sheet across a tuning session against ~95 MB — roughly 8 sheets inside 5 GB
54
+ * instead of 52.
55
+ *
56
+ * 🛑 The shard reports done even when a part THROWS. Leaving the counter short
57
+ * means the finalizer is never elected and the run sits RUNNING forever — a
58
+ * stuck run is worse than a run that completes reporting a bad part, because
59
+ * nothing sweeps it and the RTDB channel prunes within the hour.
60
+ */
61
+ export async function runShard(task, deps) {
62
+ const { runId, sheetId } = task;
63
+ let rendered = 0;
64
+ const failures = [];
65
+ try {
66
+ const sheet = await stickerSheetsRepository.findByIdOrFail(sheetId);
67
+ const geometry = await deps.readGeometry(runId, sheetId);
68
+ const source = await deps.readScan(sheet.sourceScan.assetPath);
69
+ /*
70
+ * 🛑 Scale is derived from the SHEET's full width against the working
71
+ * raster the geometry was traced on. Carrying vectors is what makes this
72
+ * exact — an upscaled mask would soften every cut line by the ratio.
73
+ */
74
+ const scale = sheet.widthPx / Math.max(1, geometry.workingSize.width);
75
+ const mine = geometry.parts.filter((p) => task.partOrdinals.includes(p.ordinal));
76
+ const tiles = [];
77
+ for (const part of mine) {
78
+ try {
79
+ const region = {
80
+ x: Math.round(part.bbox.x * scale),
81
+ y: Math.round(part.bbox.y * scale),
82
+ width: Math.max(1, Math.round(part.bbox.width * scale)),
83
+ height: Math.max(1, Math.round(part.bbox.height * scale)),
84
+ };
85
+ const alpha = await deps.rasterise(part.path, region);
86
+ if (task.mode === "full") {
87
+ await writeFullPart(deps, { sheetId, runId, ordinal: part.ordinal, source, region, alpha });
88
+ }
89
+ else {
90
+ tiles.push({ raster: await deps.codec.decodeTile(source, region), ordinal: part.ordinal });
91
+ }
92
+ rendered++;
93
+ }
94
+ catch (partErr) {
95
+ const n = normalizeError(partErr);
96
+ failures.push(part.ordinal);
97
+ serverLogger.warn("Sticker trace part render failed", {
98
+ runId,
99
+ ordinal: part.ordinal,
100
+ message: n.message,
101
+ });
102
+ }
103
+ /*
104
+ * No shard counters here on purpose. A shard knows its own index but not
105
+ * how many others have finished — that lives in the transactional
106
+ * counter — and the first draft of this call passed
107
+ * `task.shardIndex !== undefined ? undefined : undefined`, which is
108
+ * always undefined: a nonsense expression that typechecked and published
109
+ * nothing.
110
+ */
111
+ await emitPartProgress(runId, rendered, mine.length);
112
+ }
113
+ /*
114
+ * One atlas per SHARD, not per run: a shard cannot see the other shards'
115
+ * tiles, and waiting to combine them would need the finalizer to re-read
116
+ * every thumbnail. Object count stays bounded by shard count (<= 8), which
117
+ * is the property that mattered — sixty individual thumbnails is what this
118
+ * avoids.
119
+ */
120
+ if (task.mode === "thumb" && tiles.length > 0) {
121
+ const atlas = await deps.codec.encodeAtlas(tiles, { maxLongEdge: 1024 });
122
+ await deps.writeArtifact({
123
+ sheetId,
124
+ runId,
125
+ name: `atlas-${task.shardIndex ?? 0}.png`,
126
+ contentType: atlas.image.contentType,
127
+ body: atlas.image.bytes,
128
+ });
129
+ }
130
+ }
131
+ catch (err) {
132
+ const n = normalizeError(err);
133
+ serverLogger.error("Sticker trace shard failed", {
134
+ runId,
135
+ shardIndex: task.shardIndex,
136
+ message: n.message,
137
+ });
138
+ }
139
+ finally {
140
+ // See the header: report done regardless, or the run never finishes.
141
+ const election = await completeShardAndMaybeElectFinalizer({
142
+ runId,
143
+ sheetId,
144
+ shardIndex: task.shardIndex ?? 0,
145
+ shardCount: await resolveShardCount(runId),
146
+ mode: task.mode,
147
+ });
148
+ if (failures.length > 0) {
149
+ await emitProgress({
150
+ runId,
151
+ stage: "parts",
152
+ pct: 90,
153
+ message: `${failures.length} part(s) could not be rendered.`,
154
+ level: "warn",
155
+ durable: true,
156
+ });
157
+ }
158
+ if (election.electedFinalizer) {
159
+ serverLogger.info("Sticker trace finalizer elected", { runId });
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * The run's own `shardCount`, read rather than passed.
165
+ *
166
+ * A shard receives its task, not the run, and trusting a count copied onto the
167
+ * task would be a mirror that drifts the moment the coordinator retries with a
168
+ * different fan-out (Root Cause #42).
169
+ */
170
+ async function resolveShardCount(runId) {
171
+ const { stickerTraceRunsRepository } = await import("../../../../features/sticker-trace/repository/sticker-trace-runs.repository.js");
172
+ const run = await stickerTraceRunsRepository.findById(runId);
173
+ return run?.shardCount ?? 1;
174
+ }
@@ -0,0 +1,141 @@
1
+ import type { DpiSource } from "../../../../features/sticker-trace/schemas/firestore";
2
+ import type { ScanType } from "../../../shared/features/sticker-trace/types";
3
+ import { type SignedUpload } from "./storage";
4
+ /**
5
+ * 100 MB.
6
+ *
7
+ * Measured against the reference corpus rather than picked: `@ShayBlader Scan
8
+ * 18` is 79 MB, the largest of the nine, and it is a legitimate scan rather
9
+ * than an outlier to design against. The cap exists because scans are stored
10
+ * AS UPLOADED — no re-encode, because compression artefacts measured ±7 on the
11
+ * JPEG samples and the halftone scan's cut-line signal is only ~3x noise, so
12
+ * transcoding would attack the exact signal the detector needs.
13
+ */
14
+ export declare const STICKER_SHEET_MAX_BYTES: number;
15
+ export interface CreateStickerSheetInput {
16
+ /** 🛑 Mandatory — see `requireTitle`. */
17
+ title: string;
18
+ scanType?: ScanType;
19
+ contentType: string;
20
+ extension: string;
21
+ }
22
+ export interface CreateStickerSheetResult {
23
+ sheetId: string;
24
+ upload: SignedUpload;
25
+ }
26
+ /**
27
+ * Create the sheet row and mint the write URL for its scan, in one call.
28
+ *
29
+ * 🛑 The ROW comes first and the bytes second, which is the opposite of what
30
+ * feels natural. The object path contains the sheet id, so an upload signed
31
+ * before the row exists has nowhere to go — and a bucket object with no
32
+ * document pointing at it is unreachable AND unmeterable: it costs storage
33
+ * forever with nothing in any UI to delete it from. A document whose upload
34
+ * never completes is the harmless direction: `traceStatus` stays `queued`,
35
+ * `sourceScan.bytes` is 0, and the list can say so.
36
+ *
37
+ * 🛑 `widthPx`/`heightPx` are 0 until `attachStickerSheetScan`. appkit cannot
38
+ * probe an image — the codec is injected, which is what Root Cause #24 is
39
+ * about — so the only party that already knows the dimensions is the browser
40
+ * that just decoded it for live tuning. Guessing them here would put two
41
+ * numbers on the document that nothing measured.
42
+ */
43
+ export declare function createStickerSheet(input: CreateStickerSheetInput): Promise<CreateStickerSheetResult>;
44
+ export interface AttachScanInput {
45
+ sheetId: string;
46
+ assetPath: string;
47
+ widthPx: number;
48
+ heightPx: number;
49
+ dpi?: number;
50
+ dpiSource?: DpiSource;
51
+ scanType?: ScanType;
52
+ /** A dedupe hint the browser computed. Never trusted — see `StoredAsset`. */
53
+ sha256?: string;
54
+ }
55
+ export type AttachScanResult = {
56
+ ok: true;
57
+ bytes: number;
58
+ } | {
59
+ ok: false;
60
+ code: string;
61
+ message: string;
62
+ };
63
+ /**
64
+ * Verify the uploaded bytes and record them on the sheet.
65
+ *
66
+ * 🛑 The caller's `assetPath` is CONTAINED to this sheet's own prefix before
67
+ * anything reads it. Every other field here is merely wrong if wrong; this one
68
+ * is a capability — `readScanBytes` will later fetch whatever it names, and a
69
+ * path naming another sheet would turn this endpoint into a cross-sheet read
70
+ * primitive. `readScanBytes` has its own `SCAN_ROOT` check, which is the second
71
+ * layer, not the first: by the time it runs the path is already on a document.
72
+ *
73
+ * 🛑 `finalizeScanUpload` DELETES the object on a magic-byte mismatch, so a
74
+ * failure leaves nothing behind in the bucket. That is why the mismatch RETURNS
75
+ * rather than throwing: the sheet row survives and the operator re-uploads into
76
+ * it, instead of starting again with a fresh row and orphaning the first.
77
+ */
78
+ export declare function attachStickerSheetScan(input: AttachScanInput): Promise<AttachScanResult>;
79
+ /**
80
+ * The asset kinds a client may ask for.
81
+ *
82
+ * 🛑 A KIND, never a path, and this is the whole security shape of the asset
83
+ * endpoint: the client names WHAT it wants and the server looks the path up on
84
+ * the document. Accepting an `assetPath` instead would make the endpoint a
85
+ * signed-URL mint for any object in the bucket — including another admin's
86
+ * scans and, since the same bucket holds them, `private/digital-content/`.
87
+ * It is also what keeps every `*Path` field off the wire entirely, which is the
88
+ * property `PRIVATE_STICKER_SHEET_FIELDS` declares and
89
+ * audit-public-projection-parity enforces.
90
+ */
91
+ export declare const STICKER_ASSET_KINDS: readonly ["scan", "preview", "overlay", "geometry", "cutSvg", "thumbAtlas"];
92
+ export type StickerAssetKind = (typeof STICKER_ASSET_KINDS)[number];
93
+ /**
94
+ * Mint a short-lived read URL for one asset of one sheet or run.
95
+ *
96
+ * `runId` absent means the sheet's currently-accepted artifacts; present means
97
+ * that specific run's, which is what makes two runs comparable side by side —
98
+ * the reason runs keep their own artifacts rather than overwriting the sheet's.
99
+ *
100
+ * Returns `null` for "there is no such asset", which the route maps to a 404.
101
+ * An absent artifact is the normal state of an unfinished or failed run, so it
102
+ * must not read as an error.
103
+ */
104
+ export declare function resolveStickerAssetUrl(input: {
105
+ sheetId: string;
106
+ kind: StickerAssetKind;
107
+ runId?: string;
108
+ }): Promise<{
109
+ url: string;
110
+ expiresAt: Date;
111
+ } | null>;
112
+ export interface SheetUsageRow {
113
+ sheetId: string;
114
+ title: string;
115
+ bytes: number;
116
+ objects: number;
117
+ }
118
+ export interface StickerStorageUsage {
119
+ rows: SheetUsageRow[];
120
+ totalBytes: number;
121
+ totalObjects: number;
122
+ }
123
+ /**
124
+ * Stored bytes and object count per sheet, biggest first.
125
+ *
126
+ * 🛑 Object COUNT is reported beside bytes because GCS meters them separately
127
+ * (Class A writes, Class B reads). The sprite-atlas decision exists precisely
128
+ * because sixty thumbnails per run would spend that budget sixty times faster
129
+ * than the same pixels in one object — a meter showing only bytes would make
130
+ * undoing that look free.
131
+ *
132
+ * 🛑 Retention is manual by design: nothing auto-prunes, so any past run's
133
+ * overlay can still be opened and compared. That is only a safe default if the
134
+ * cost is VISIBLE rather than discovered, which is what this is for — Root
135
+ * Cause #104's first signal was a billing page.
136
+ *
137
+ * 🛑 One bucket listing per sheet, so this is deliberately NOT folded into the
138
+ * sheet list. Twenty sheets would be twenty `getFiles` calls on every page
139
+ * view; it is its own endpoint an operator opens.
140
+ */
141
+ export declare function measureStickerStorage(sheetIds: readonly string[]): Promise<StickerStorageUsage>;