@mohasinac/appkit 4.52.4 → 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.
- package/dist/.build-stamp.json +4 -4
- package/dist/_internal/client/features/sticker-trace/canvas-codec.d.ts +2 -0
- package/dist/_internal/client/features/sticker-trace/canvas-codec.js +148 -0
- package/dist/_internal/server/features/auctions/actions.js +1 -1
- package/dist/_internal/server/features/categories/data.js +23 -7
- package/dist/_internal/server/features/checkout/actions.js +10 -3
- package/dist/_internal/server/features/checkout/data.d.ts +15 -0
- package/dist/_internal/server/features/checkout/data.js +20 -3
- package/dist/_internal/server/features/lottery/actions.js +9 -1
- package/dist/_internal/server/features/lottery/og.d.ts +40 -0
- package/dist/_internal/server/features/lottery/og.js +79 -0
- package/dist/_internal/server/features/messages/actions.js +4 -0
- package/dist/_internal/server/features/offers/adapters.js +17 -3
- package/dist/_internal/server/features/orders/actions.js +7 -2
- package/dist/_internal/server/features/raffle/actions.d.ts +19 -0
- package/dist/_internal/server/features/raffle/actions.js +25 -0
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/_internal/server/features/reviews/data.d.ts +1 -1
- package/dist/_internal/server/features/search/index-build/artifact-store.d.ts +89 -0
- package/dist/_internal/server/features/search/index-build/artifact-store.js +208 -0
- package/dist/_internal/server/features/search/index-build/build.d.ts +57 -0
- package/dist/_internal/server/features/search/index-build/build.js +285 -0
- package/dist/_internal/server/features/search/index-build/sources.d.ts +53 -0
- package/dist/_internal/server/features/search/index-build/sources.js +385 -0
- package/dist/_internal/server/features/search/search-sources.d.ts +0 -15
- package/dist/_internal/server/features/search/search-sources.js +142 -7
- package/dist/_internal/server/features/seo/robots.js +21 -1
- package/dist/_internal/server/features/seo/sitemap.js +1 -1
- package/dist/_internal/server/features/shared/listing-data-factory.js +16 -4
- package/dist/_internal/server/features/site-settings/adapters.d.ts +1 -1
- package/dist/_internal/server/features/site-settings/adapters.js +26 -0
- package/dist/_internal/server/features/sticker-trace/actions.d.ts +109 -0
- package/dist/_internal/server/features/sticker-trace/actions.js +172 -0
- package/dist/_internal/server/features/sticker-trace/adapters.d.ts +80 -0
- package/dist/_internal/server/features/sticker-trace/adapters.js +174 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.d.ts +26 -0
- package/dist/_internal/server/features/sticker-trace/build-cut-file.js +127 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.d.ts +27 -0
- package/dist/_internal/server/features/sticker-trace/coordinator.js +169 -0
- package/dist/_internal/server/features/sticker-trace/fanout.d.ts +43 -0
- package/dist/_internal/server/features/sticker-trace/fanout.js +180 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.d.ts +25 -0
- package/dist/_internal/server/features/sticker-trace/finalizer.js +123 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.d.ts +30 -0
- package/dist/_internal/server/features/sticker-trace/mosaic-inputs.js +112 -0
- package/dist/_internal/server/features/sticker-trace/progress.d.ts +81 -0
- package/dist/_internal/server/features/sticker-trace/progress.js +198 -0
- package/dist/_internal/server/features/sticker-trace/promote.d.ts +23 -0
- package/dist/_internal/server/features/sticker-trace/promote.js +193 -0
- package/dist/_internal/server/features/sticker-trace/shard.d.ts +50 -0
- package/dist/_internal/server/features/sticker-trace/shard.js +174 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.d.ts +141 -0
- package/dist/_internal/server/features/sticker-trace/sheet-actions.js +279 -0
- package/dist/_internal/server/features/sticker-trace/storage.d.ts +135 -0
- package/dist/_internal/server/features/sticker-trace/storage.js +282 -0
- package/dist/_internal/server/functions/scheduled.d.ts +2 -1
- package/dist/_internal/server/functions/scheduled.js +25 -1
- package/dist/_internal/server/jobs/core/_event-ref.d.ts +51 -0
- package/dist/_internal/server/jobs/core/_event-ref.js +63 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.d.ts +18 -0
- package/dist/_internal/server/jobs/core/assignSpinPrize.js +77 -16
- package/dist/_internal/server/jobs/core/auctionSettlement.js +13 -4
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +44 -15
- package/dist/_internal/server/jobs/core/bundleStockSync.js +3 -4
- package/dist/_internal/server/jobs/core/cleanupRtdbEvents.js +44 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.d.ts +78 -0
- package/dist/_internal/server/jobs/core/event-draw-reasons.js +133 -0
- package/dist/_internal/server/jobs/core/listingProcessor.js +28 -8
- package/dist/_internal/server/jobs/core/onOrderCreate.js +12 -1
- package/dist/_internal/server/jobs/core/onScamReportCreate.js +13 -2
- package/dist/_internal/server/jobs/core/onScamReportRejected.js +8 -2
- package/dist/_internal/server/jobs/core/onScamReportVerified.js +8 -2
- package/dist/_internal/server/jobs/core/onStoreWrite.js +11 -4
- package/dist/_internal/server/jobs/core/prizeDrawAssignWinner.js +5 -4
- package/dist/_internal/server/jobs/core/prizeDrawExpiryReveal.js +1 -4
- package/dist/_internal/server/jobs/core/prizeDrawSoldOutReveal.js +1 -2
- package/dist/_internal/server/jobs/core/promotions.js +7 -4
- package/dist/_internal/server/jobs/core/searchIndexBuild.d.ts +7 -0
- package/dist/_internal/server/jobs/core/searchIndexBuild.js +211 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.d.ts +35 -0
- package/dist/_internal/server/jobs/core/triggerEventRaffle.js +213 -31
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +20 -14
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/assignSpinPrize.js +15 -15
- package/dist/_internal/server/jobs/handlers/index.d.ts +1 -0
- package/dist/_internal/server/jobs/handlers/index.js +1 -0
- package/dist/_internal/server/jobs/handlers/onCategoryWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onProductWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onReviewWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/onScamReportUpdate.js +18 -0
- package/dist/_internal/server/jobs/handlers/onStoreWrite.js +18 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/searchIndexBuild.js +2 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.d.ts +8 -0
- package/dist/_internal/server/jobs/handlers/triggerEventRaffle.js +15 -6
- package/dist/_internal/shared/actions/action-registry.js +29 -0
- package/dist/_internal/shared/cache/revalidate-targets.d.ts +0 -1
- package/dist/_internal/shared/cache/revalidate-targets.js +10 -8
- package/dist/_internal/shared/features/events/config.d.ts +14 -0
- package/dist/_internal/shared/features/events/config.js +14 -0
- package/dist/_internal/shared/features/notifications/action-url.js +8 -0
- package/dist/_internal/shared/features/site-settings/types.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/codec.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/codec.js +30 -0
- package/dist/_internal/shared/features/sticker-trace/config.d.ts +81 -0
- package/dist/_internal/shared/features/sticker-trace/config.js +177 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/cut-contour.js +60 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.d.ts +65 -0
- package/dist/_internal/shared/features/sticker-trace/export/build-export-set.js +176 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.d.ts +56 -0
- package/dist/_internal/shared/features/sticker-trace/export/cut-svg.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.d.ts +92 -0
- package/dist/_internal/shared/features/sticker-trace/export/machine-profiles.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/nesting.js +110 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.d.ts +68 -0
- package/dist/_internal/shared/features/sticker-trace/export/page-sizes.js +223 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.d.ts +51 -0
- package/dist/_internal/shared/features/sticker-trace/export/part-tiling.js +178 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.d.ts +26 -0
- package/dist/_internal/shared/features/sticker-trace/export/simplify-budget.js +134 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.d.ts +40 -0
- package/dist/_internal/shared/features/sticker-trace/export/vectorise-art.js +195 -0
- package/dist/_internal/shared/features/sticker-trace/index.d.ts +2 -0
- package/dist/_internal/shared/features/sticker-trace/index.js +59 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.d.ts +11 -0
- package/dist/_internal/shared/features/sticker-trace/math/catmull-rom.js +66 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/math/edt.js +165 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/math/label.js +156 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.d.ts +16 -0
- package/dist/_internal/shared/features/sticker-trace/math/marching-squares.js +242 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.d.ts +46 -0
- package/dist/_internal/shared/features/sticker-trace/math/morphology.js +168 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/math/rasterize-path.js +286 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/math/rdp.js +74 -0
- package/dist/_internal/shared/features/sticker-trace/resume.d.ts +50 -0
- package/dist/_internal/shared/features/sticker-trace/resume.js +160 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.d.ts +20 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cluster.js +132 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.d.ts +28 -0
- package/dist/_internal/shared/features/sticker-trace/trace/cross-profile.js +120 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.d.ts +21 -0
- package/dist/_internal/shared/features/sticker-trace/trace/flood.js +104 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.d.ts +3 -0
- package/dist/_internal/shared/features/sticker-trace/trace/geometry.js +140 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.d.ts +15 -0
- package/dist/_internal/shared/features/sticker-trace/trace/line-filter.js +138 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.d.ts +27 -0
- package/dist/_internal/shared/features/sticker-trace/trace/merge.js +187 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.d.ts +32 -0
- package/dist/_internal/shared/features/sticker-trace/trace/paper.js +147 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.d.ts +30 -0
- package/dist/_internal/shared/features/sticker-trace/trace/prefilter.js +125 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/quantise.js +153 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.d.ts +88 -0
- package/dist/_internal/shared/features/sticker-trace/trace/ridge.js +344 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.d.ts +10 -0
- package/dist/_internal/shared/features/sticker-trace/trace/segment.js +251 -0
- package/dist/_internal/shared/features/sticker-trace/types.d.ts +197 -0
- package/dist/_internal/shared/features/sticker-trace/types.js +49 -0
- package/dist/_internal/shared/listing-types/_registry.d.ts +11 -0
- package/dist/_internal/shared/listing-types/art/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/art/config.js +1 -0
- package/dist/_internal/shared/listing-types/auction/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/auction/config.js +1 -0
- package/dist/_internal/shared/listing-types/classified/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/classified/config.js +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/digital-code/config.js +1 -0
- package/dist/_internal/shared/listing-types/feature-flags.d.ts +7 -0
- package/dist/_internal/shared/listing-types/feature-flags.js +9 -0
- package/dist/_internal/shared/listing-types/live/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/live/config.js +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/pre-order/config.js +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/prize-draw/config.js +1 -0
- package/dist/_internal/shared/listing-types/standard/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/standard/config.js +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.d.ts +1 -0
- package/dist/_internal/shared/listing-types/stickers/config.js +1 -0
- package/dist/_internal/shared/media/limits.d.ts +12 -2
- package/dist/_internal/shared/media/limits.js +12 -2
- package/dist/_internal/shared/search/artifact-url.d.ts +35 -0
- package/dist/_internal/shared/search/artifact-url.js +119 -0
- package/dist/_internal/shared/search/index-record.d.ts +68 -0
- package/dist/_internal/shared/search/index-record.js +96 -0
- package/dist/_internal/shared/search/match.d.ts +65 -0
- package/dist/_internal/shared/search/match.js +263 -0
- package/dist/client.d.ts +8 -7
- package/dist/client.js +12 -5
- package/dist/configs/eslint.js +22 -2
- package/dist/constants/api-endpoints.d.ts +68 -0
- package/dist/constants/api-endpoints.js +32 -0
- package/dist/constants/field-names.d.ts +7 -1
- package/dist/constants/field-names.js +36 -1
- package/dist/contracts/repository.d.ts +8 -7
- package/dist/contracts/search.d.ts +2 -2
- package/dist/contracts/table.d.ts +3 -3
- package/dist/contracts/table.js +3 -3
- package/dist/core/contact-submissions.repository.js +2 -2
- package/dist/core/integration-keys.js +7 -1
- package/dist/core/newsletter.repository.js +2 -2
- package/dist/core/site-config.js +1 -1
- package/dist/errors/error-codes.d.ts +30 -0
- package/dist/errors/error-codes.js +30 -0
- package/dist/errors/error-display-map.js +40 -1
- package/dist/features/account/api/[userId]/addresses/route.js +1 -1
- package/dist/features/account/components/UserBidsView.js +1 -1
- package/dist/features/account/components/index.d.ts +0 -8
- package/dist/features/account/components/index.js +0 -4
- package/dist/features/addresses/repository/addresses.repository.d.ts +17 -6
- package/dist/features/addresses/repository/addresses.repository.js +65 -9
- package/dist/features/addresses/schemas/firestore.d.ts +17 -6
- package/dist/features/admin/actions/notification-actions.js +15 -6
- package/dist/features/admin/api/bids/route.js +1 -1
- package/dist/features/admin/api/coupons/route.js +1 -1
- package/dist/features/admin/api/products/route.js +1 -1
- package/dist/features/admin/api/reviews/route.js +1 -1
- package/dist/features/admin/components/AdminAdEditorView.js +19 -5
- package/dist/features/admin/components/AdminAuditLogView.js +1 -1
- package/dist/features/admin/components/AdminBlogEditorView.js +0 -1
- package/dist/features/admin/components/AdminBlogView.js +1 -1
- package/dist/features/admin/components/AdminBrandsView.js +17 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +0 -1
- package/dist/features/admin/components/AdminContactView.js +1 -1
- package/dist/features/admin/components/AdminEmployeeEditorView.js +1 -3
- package/dist/features/admin/components/AdminNewsletterView.js +1 -1
- package/dist/features/admin/components/AdminOrdersView.js +9 -2
- package/dist/features/admin/components/AdminPayoutsView.js +1 -1
- package/dist/features/admin/components/AdminPrizeDrawsView.js +11 -0
- package/dist/features/admin/components/AdminProductEditorView.d.ts +10 -1
- package/dist/features/admin/components/AdminProductEditorView.js +24 -37
- package/dist/features/admin/components/AdminProductsView.js +10 -3
- package/dist/features/admin/components/AdminScammersView.js +1 -1
- package/dist/features/admin/components/AdminSectionsView.js +21 -5
- package/dist/features/admin/components/AdminSessionsView.js +1 -1
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +22 -1
- package/dist/features/admin/components/AdminTeamView.js +1 -1
- package/dist/features/admin/components/AdminTesterChecklistItemEditorView.js +0 -1
- package/dist/features/admin/components/AdminUsersView.js +1 -1
- package/dist/features/admin/components/DataListingView.d.ts +2 -1
- package/dist/features/admin/components/DataListingView.js +9 -4
- package/dist/features/admin/components/analytics/AdminPageViewsReportView.js +0 -2
- package/dist/features/admin/hooks/useAdminListing.d.ts +1 -1
- package/dist/features/admin/repository/site-settings.repository.js +8 -3
- package/dist/features/admin/schemas/firestore.d.ts +62 -1
- package/dist/features/admin/schemas/firestore.js +32 -0
- package/dist/features/admin/types/index.d.ts +1 -1
- package/dist/features/auctions/actions/bid-actions.d.ts +2 -2
- package/dist/features/auctions/actions/bid-actions.js +16 -4
- package/dist/features/auctions/api/route.js +1 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +4 -0
- package/dist/features/auctions/repository/bid.repository.d.ts +46 -4
- package/dist/features/auctions/repository/bid.repository.js +114 -13
- package/dist/features/auctions/schemas/firestore.d.ts +24 -4
- package/dist/features/auctions/schemas/firestore.js +1 -0
- package/dist/features/auth/actions/profile-actions.js +30 -4
- package/dist/features/auth/components/index.d.ts +0 -1
- package/dist/features/auth/components/index.js +0 -1
- package/dist/features/auth/repository/session.repository.d.ts +17 -3
- package/dist/features/auth/repository/session.repository.js +46 -5
- package/dist/features/auth/repository/token.repository.d.ts +27 -4
- package/dist/features/auth/repository/token.repository.js +65 -11
- package/dist/features/auth/repository/user.repository.d.ts +33 -7
- package/dist/features/auth/repository/user.repository.js +100 -15
- package/dist/features/auth/schemas/firestore.d.ts +63 -12
- package/dist/features/auth/schemas/firestore.js +11 -0
- package/dist/features/before-after/api/route.js +1 -1
- package/dist/features/blog/components/BlogListView.js +16 -3
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/blog/schemas/index.d.ts +2 -2
- package/dist/features/cart/api/route.js +1 -1
- package/dist/features/catalogue/repository/catalogue.repository.d.ts +7 -7
- package/dist/features/catalogue/repository/catalogue.repository.js +28 -10
- package/dist/features/catalogue/schemas/firestore.d.ts +11 -0
- package/dist/features/categories/api/route.js +10 -10
- package/dist/features/categories/components/CategoryDetailPageView.js +35 -5
- package/dist/features/categories/components/CategorySelectorCreate.js +0 -1
- package/dist/features/categories/components/index.d.ts +0 -2
- package/dist/features/categories/components/index.js +0 -1
- package/dist/features/categories/repository/categories.repository.d.ts +1 -0
- package/dist/features/categories/repository/categories.repository.js +31 -1
- package/dist/features/categories/schemas/index.d.ts +2 -2
- package/dist/features/categories/utils/taxonomy-visual.d.ts +21 -0
- package/dist/features/categories/utils/taxonomy-visual.js +58 -0
- package/dist/features/checkout/actions/checkout-value-otp-actions.js +8 -1
- package/dist/features/collections/api/[slug]/route.js +3 -3
- package/dist/features/collections/api/route.js +1 -1
- package/dist/features/consultation/api/route.js +1 -1
- package/dist/features/consultation/repository/consultations.repository.js +1 -1
- package/dist/features/consultation/types/index.d.ts +1 -1
- package/dist/features/contact/components/ContactForm.js +1 -3
- package/dist/features/corporate/api/route.js +1 -1
- package/dist/features/corporate/repository/corporate.repository.js +1 -1
- package/dist/features/corporate/types/index.d.ts +1 -1
- package/dist/features/cron/jobs/auction-expiry.job.js +1 -1
- package/dist/features/cron/jobs/preorder-reminder.job.js +1 -1
- package/dist/features/events/actions/event-actions.d.ts +14 -0
- package/dist/features/events/actions/event-actions.js +82 -3
- package/dist/features/events/api/[id]/route.js +2 -2
- package/dist/features/events/components/AdminEventEditorView.js +22 -3
- package/dist/features/events/components/AdminEventsView.js +32 -8
- package/dist/features/events/components/EventRafflesSection.d.ts +34 -1
- package/dist/features/events/components/EventRafflesSection.js +52 -3
- package/dist/features/events/components/SpinWheelView.d.ts +2 -2
- package/dist/features/events/components/SpinWheelView.js +41 -4
- package/dist/features/events/repository/event-entry.repository.d.ts +14 -2
- package/dist/features/events/repository/event-entry.repository.js +41 -7
- package/dist/features/events/schemas/firestore.d.ts +17 -4
- package/dist/features/events/types/index.d.ts +37 -0
- package/dist/features/faq/repository/faqs.repository.js +1 -1
- package/dist/features/faq/schemas/index.d.ts +5 -2
- package/dist/features/faq/schemas/index.js +6 -0
- package/dist/features/faq/types/index.d.ts +0 -1
- package/dist/features/grouped/components/GroupedListingEditorView.js +17 -2
- package/dist/features/homepage/api/carousel/[id]/route.js +1 -1
- package/dist/features/homepage/api/carousel/route.js +4 -4
- package/dist/features/homepage/api/route.js +2 -2
- package/dist/features/homepage/api/sections/route.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.d.ts +1 -9
- package/dist/features/homepage/components/AnnouncementBar.js +13 -19
- package/dist/features/homepage/components/MarketplaceHomepageView.js +6 -1
- package/dist/features/homepage/components/index.d.ts +0 -2
- package/dist/features/homepage/components/index.js +0 -1
- package/dist/features/homepage/repository/homepage.repository.js +1 -1
- package/dist/features/homepage/schemas/firestore.d.ts +6 -0
- package/dist/features/homepage/schemas/index.d.ts +10 -10
- package/dist/features/layout/AppLayoutShell.d.ts +12 -3
- package/dist/features/layout/AppLayoutShell.js +65 -13
- package/dist/features/layout/BottomActionsContext.d.ts +16 -0
- package/dist/features/layout/BottomActionsContext.js +5 -0
- package/dist/features/layout/BottomChrome.js +48 -9
- package/dist/features/layout/BottomNavbar.d.ts +14 -0
- package/dist/features/layout/BottomNavbar.js +43 -3
- package/dist/features/layout/MainNavbar.d.ts +11 -0
- package/dist/features/layout/NavbarLayout.d.ts +3 -0
- package/dist/features/layout/NavbarLayout.js +88 -11
- package/dist/features/layout/SideActionDock.d.ts +1 -0
- package/dist/features/layout/SideActionDock.js +219 -0
- package/dist/features/layout/TitleBarLayout.d.ts +1 -3
- package/dist/features/layout/TitleBarLayout.js +3 -4
- package/dist/features/layout/cta-anchor.d.ts +31 -0
- package/dist/features/layout/cta-anchor.js +31 -0
- package/dist/features/layout/hooks/useBottomActions.d.ts +7 -0
- package/dist/features/layout/hooks/useBottomActions.js +6 -1
- package/dist/features/layout/index.d.ts +9 -1
- package/dist/features/layout/index.js +9 -1
- package/dist/features/layout/useCtaReveal.d.ts +24 -0
- package/dist/features/layout/useCtaReveal.js +82 -0
- package/dist/features/layout/useHoldToOpen.d.ts +41 -0
- package/dist/features/layout/useHoldToOpen.js +84 -0
- package/dist/features/lottery/repository/lottery-entry.repository.d.ts +18 -3
- package/dist/features/lottery/repository/lottery-entry.repository.js +48 -6
- package/dist/features/lottery/schemas/firestore.d.ts +33 -5
- package/dist/features/loyalty/api/balance/route.js +1 -1
- package/dist/features/loyalty/api/history/route.js +1 -1
- package/dist/features/media/MediaImage.js +0 -1
- package/dist/features/media/MediaPickerModal.js +7 -1
- package/dist/features/media/modals/ImageEditor.js +5 -1
- package/dist/features/media/modals/VideoThumbnailSelector.js +17 -1
- package/dist/features/media/repository/media-assets.repository.d.ts +19 -0
- package/dist/features/media/upload/CameraCapture.js +16 -1
- package/dist/features/media/upload/ImageUpload.js +42 -4
- package/dist/features/media/upload/MediaUploadField.js +69 -13
- package/dist/features/media/upload/downscale-image.d.ts +56 -0
- package/dist/features/media/upload/downscale-image.js +150 -0
- package/dist/features/messages/components/ConversationThreadView.js +45 -2
- package/dist/features/messages/components/MessageSellerButton.d.ts +15 -1
- package/dist/features/messages/components/MessageSellerButton.js +10 -2
- package/dist/features/messages/schemas/firestore.d.ts +15 -0
- package/dist/features/orders/hooks/useOrders.js +4 -2
- package/dist/features/orders/repository/orders.repository.d.ts +15 -4
- package/dist/features/orders/repository/orders.repository.js +52 -20
- package/dist/features/orders/schemas/firestore.d.ts +15 -4
- package/dist/features/orders/schemas/index.d.ts +8 -8
- package/dist/features/orders/types/index.d.ts +2 -2
- package/dist/features/payments/repository/payments.repository.js +2 -2
- package/dist/features/payments/repository/payout.repository.d.ts +23 -6
- package/dist/features/payments/repository/payout.repository.js +63 -23
- package/dist/features/payments/repository/saved-payment-methods.repository.d.ts +17 -6
- package/dist/features/payments/repository/saved-payment-methods.repository.js +59 -11
- package/dist/features/payments/schemas/firestore.d.ts +14 -3
- package/dist/features/payments/schemas/saved-methods-firestore.d.ts +12 -1
- package/dist/features/pre-orders/api/[slug]/route.js +1 -1
- package/dist/features/pre-orders/api/admin/route.js +1 -1
- package/dist/features/pre-orders/api/route.js +1 -1
- package/dist/features/pre-orders/repository/pre-orders.repository.d.ts +3 -3
- package/dist/features/pre-orders/repository/pre-orders.repository.js +6 -6
- package/dist/features/products/api/[id]/route.js +1 -1
- package/dist/features/products/components/ListingBottomActions.js +4 -0
- package/dist/features/products/components/ProductDetailPageView.js +2 -1
- package/dist/features/products/components/ProductGalleryClient.js +2 -2
- package/dist/features/products/components/ProductGrid.js +12 -1
- package/dist/features/products/components/index.d.ts +0 -2
- package/dist/features/products/components/index.js +0 -1
- package/dist/features/products/config/listing-type-listing-config.d.ts +0 -3
- package/dist/features/products/config/listing-type-listing-config.js +27 -2
- package/dist/features/products/constants/listing-tabs.d.ts +9 -0
- package/dist/features/products/constants/listing-tabs.js +3 -2
- package/dist/features/products/hooks/useProducts.js +2 -2
- package/dist/features/products/repository/products.repository.js +13 -1
- package/dist/features/products/schemas/index.d.ts +2 -2
- package/dist/features/products/types/index.d.ts +1 -1
- package/dist/features/promotions/api/route.js +1 -1
- package/dist/features/reviews/actions/review-actions.d.ts +6 -6
- package/dist/features/reviews/actions/review-actions.js +22 -8
- package/dist/features/reviews/components/ReviewDetailPageView.js +13 -1
- package/dist/features/reviews/components/ReviewsIndexPageView.js +21 -4
- package/dist/features/reviews/repository/reviews.repository.d.ts +19 -7
- package/dist/features/reviews/repository/reviews.repository.js +63 -12
- package/dist/features/reviews/schemas/firestore.d.ts +13 -2
- package/dist/features/reviews/schemas/index.d.ts +2 -2
- package/dist/features/scams/actions/scam-actions.js +16 -4
- package/dist/features/search/components/SearchResultsPageView.js +2 -1
- package/dist/features/search/hooks/useSearchIndex.d.ts +34 -0
- package/dist/features/search/hooks/useSearchIndex.js +172 -0
- package/dist/features/search/repository/search.repository.js +2 -2
- package/dist/features/seller/actions/offer-actions.d.ts +5 -5
- package/dist/features/seller/actions/offer-actions.js +38 -8
- package/dist/features/seller/actions/seller-actions.js +34 -7
- package/dist/features/seller/api/coupons/route.js +1 -1
- package/dist/features/seller/api/products/route.js +1 -1
- package/dist/features/seller/api/store/route.js +1 -1
- package/dist/features/seller/components/SellerBidsView.js +1 -1
- package/dist/features/seller/components/SellerCouponsView.js +1 -1
- package/dist/features/seller/components/SellerListingTypeView.js +9 -1
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutSettingsView.js +0 -1
- package/dist/features/seller/components/SellerPayoutsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.js +0 -1
- package/dist/features/seller/components/SellerProductsView.js +1 -1
- package/dist/features/seller/components/SellerShippingView.js +0 -1
- package/dist/features/seller/components/SellerStorefrontView.js +0 -1
- package/dist/features/seller/components/index.d.ts +0 -4
- package/dist/features/seller/components/index.js +0 -2
- package/dist/features/seller/repository/offer.repository.d.ts +15 -3
- package/dist/features/seller/repository/offer.repository.js +43 -7
- package/dist/features/seller/schemas/firestore.d.ts +14 -3
- package/dist/features/seller/schemas/index.d.ts +4 -4
- package/dist/features/seller/schemas/order-forms.d.ts +39 -0
- package/dist/features/seller/schemas/order-forms.js +37 -0
- package/dist/features/shell/FormShell.js +6 -2
- package/dist/features/shell/QuickFormDrawer.js +15 -1
- package/dist/features/shipments/components/AdminShipmentEditorView.js +0 -1
- package/dist/features/shipments/components/AdminShipmentsView.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.d.ts +30 -0
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +93 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.d.ts +33 -0
- package/dist/features/sticker-trace/components/StickerPrintPanel.js +104 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.d.ts +20 -0
- package/dist/features/sticker-trace/components/StickerRetryPanel.js +128 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.d.ts +45 -0
- package/dist/features/sticker-trace/components/StickerRunHistoryPanel.js +84 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.d.ts +27 -0
- package/dist/features/sticker-trace/components/StickerTraceStudio.js +171 -0
- package/dist/features/sticker-trace/constants/help-content.d.ts +23 -0
- package/dist/features/sticker-trace/constants/help-content.js +172 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.d.ts +27 -0
- package/dist/features/sticker-trace/hooks/useLiveTrace.js +160 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.d.ts +22 -0
- package/dist/features/sticker-trace/hooks/useStickerTraceProgress.js +106 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.d.ts +113 -0
- package/dist/features/sticker-trace/repository/sticker-sheets.repository.js +146 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.d.ts +132 -0
- package/dist/features/sticker-trace/repository/sticker-trace-runs.repository.js +174 -0
- package/dist/features/sticker-trace/schemas/firestore.d.ts +248 -0
- package/dist/features/sticker-trace/schemas/firestore.js +79 -0
- package/dist/features/sticker-trace/server.d.ts +8 -0
- package/dist/features/sticker-trace/server.js +51 -0
- package/dist/features/stores/actions/store-query-actions.d.ts +2 -2
- package/dist/features/stores/actions/store-query-actions.js +7 -2
- package/dist/features/stores/api/[storeSlug]/auctions/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/products/route.js +3 -3
- package/dist/features/stores/api/[storeSlug]/reviews/route.js +1 -1
- package/dist/features/stores/api/[storeSlug]/route.js +1 -1
- package/dist/features/stores/components/StoreNavTabs.js +17 -2
- package/dist/features/stores/manifest.js +8 -4
- package/dist/features/support/repository/support.repository.d.ts +14 -3
- package/dist/features/support/repository/support.repository.js +93 -13
- package/dist/features/support/schemas/firestore.d.ts +16 -5
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +61 -19
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +19 -3
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +243 -0
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +36 -10
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +209 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +90 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +85 -0
- package/dist/features/tester/seed-data/authored/index.js +10 -0
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +19 -17
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +10 -5
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +2 -0
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +283 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +235 -22
- package/dist/index.d.ts +10 -23
- package/dist/index.js +27 -19
- package/dist/next/api/routeHandler.js +9 -0
- package/dist/next/routing/require-record.d.ts +13 -0
- package/dist/next/routing/require-record.js +62 -0
- package/dist/next/routing/route-map.d.ts +4 -4
- package/dist/next/routing/route-map.js +25 -3
- package/dist/providers/db-firebase/base.d.ts +4 -2
- package/dist/providers/db-firebase/base.js +21 -5
- package/dist/providers/db-firebase/base.repository.d.ts +11 -9
- package/dist/providers/db-firebase/base.repository.js +19 -0
- package/dist/providers/db-firebase/rtdb-paths.d.ts +12 -0
- package/dist/providers/db-firebase/rtdb-paths.js +12 -0
- package/dist/react/ErrorBoundary.js +6 -1
- package/dist/react/hooks/realtime-event-constants.d.ts +1 -0
- package/dist/react/hooks/realtime-event-constants.js +8 -0
- package/dist/react/hooks/useEntityDelete.js +5 -1
- package/dist/react/hooks/useMessage.js +5 -1
- package/dist/repositories/index.d.ts +2 -2
- package/dist/repositories/index.js +6 -1
- package/dist/schemas/registry.d.ts +13 -20
- package/dist/schemas/registry.js +31 -14
- package/dist/schemas/webhooks/google-oauth.d.ts +2 -2
- package/dist/security/encrypted.d.ts +117 -0
- package/dist/security/encrypted.js +100 -0
- package/dist/security/index.d.ts +5 -2
- package/dist/security/index.js +16 -2
- package/dist/security/pii-accessors.d.ts +71 -0
- package/dist/security/pii-accessors.js +150 -0
- package/dist/security/pii-encrypt.d.ts +0 -8
- package/dist/security/pii-encrypt.js +22 -15
- package/dist/security/pii-mask.d.ts +18 -0
- package/dist/security/pii-mask.js +27 -0
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +6 -6
- package/dist/seed/_helpers/search-txt-wrappers.js +22 -0
- package/dist/seed/addresses-seed-data.d.ts +2 -2
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +34 -0
- package/dist/seed/authenticity-knowledge-seed-data.js +1277 -0
- package/dist/seed/bids-seed-data.d.ts +2 -2
- package/dist/seed/bids-seed-data.js +23 -2
- package/dist/seed/events-seed-data.d.ts +2 -2
- package/dist/seed/events-seed-data.js +5 -0
- package/dist/seed/faq-seed-data.js +175 -5
- package/dist/seed/homepage-sections-seed-data.js +39 -23
- package/dist/seed/index.d.ts +1 -0
- package/dist/seed/index.js +1 -0
- package/dist/seed/lottery-entries-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.d.ts +2 -2
- package/dist/seed/offers-seed-data.js +1 -1
- package/dist/seed/orders-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.d.ts +2 -2
- package/dist/seed/payouts-seed-data.js +1 -1
- package/dist/seed/reviews-seed-data.d.ts +1 -2
- package/dist/seed/seed-purpose.js +7 -0
- package/dist/seed/sessions-seed-data.d.ts +2 -2
- package/dist/seed/sessions-seed-data.js +5 -0
- package/dist/seed/site-settings-seed-data.js +1 -1
- package/dist/seed/support-tickets-seed-data.d.ts +2 -2
- package/dist/seed/support-tickets-seed-data.js +1 -1
- package/dist/seed/users-seed-data.d.ts +2 -2
- package/dist/seed/users-seed-data.js +1 -1
- package/dist/seo/json-ld.js +5 -1
- package/dist/server.d.ts +18 -3
- package/dist/server.js +59 -3
- package/dist/styles.css +237 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/ui/components/Button.js +7 -1
- package/dist/ui/components/FilterChipGroup.d.ts +11 -0
- package/dist/ui/components/FilterChipGroup.js +1 -1
- package/dist/ui/components/ImageGallery.js +6 -1
- package/dist/ui/components/ListingLayout.js +14 -8
- package/dist/ui/components/OverflowRow.d.ts +92 -0
- package/dist/ui/components/OverflowRow.js +203 -0
- package/dist/ui/components/OverflowRow.style.css +235 -0
- package/dist/ui/components/RecordDetailModal.js +14 -1
- package/dist/ui/components/RowActionMenu.js +5 -1
- package/dist/ui/components/SideDrawer.js +5 -1
- package/dist/ui/components/SideModal.js +9 -1
- package/dist/ui/components/TabBarShell.d.ts +12 -1
- package/dist/ui/components/TabBarShell.js +3 -2
- package/dist/ui/components/Tabs.js +36 -24
- package/dist/ui/components/Toast.d.ts +3 -24
- package/dist/ui/components/Toast.js +2 -19
- package/dist/ui/components/TopBannerPortal.d.ts +15 -0
- package/dist/ui/components/TopBannerPortal.js +19 -0
- package/dist/ui/components/UnsavedChangesModal.js +5 -1
- package/dist/ui/components/index.style.css +1 -0
- package/dist/ui/components/row-collapse.d.ts +15 -0
- package/dist/ui/components/row-collapse.js +127 -0
- package/dist/ui/components/toast-context.d.ts +63 -0
- package/dist/ui/components/toast-context.js +48 -0
- package/dist/ui/components/top-banner-slot.d.ts +37 -0
- package/dist/ui/components/top-banner-slot.js +45 -0
- package/dist/ui/icons/icon-registry.d.ts +6 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.js +1 -0
- package/dist/utils/array.helper.d.ts +2 -2
- package/dist/utils/array.helper.js +5 -5
- package/dist/utils/id-generators.d.ts +6 -0
- package/dist/utils/id-generators.js +10 -0
- package/dist/utils/media-url.js +0 -2
- package/dist/utils/search-txt-builders.d.ts +28 -4
- package/dist/utils/search-txt-builders.js +41 -1
- package/dist/validation/schemas.d.ts +8 -8
- package/package.json +6 -2
- package/scripts/seed-cli.mjs +3 -0
- package/dist/features/account/components/UserAddressesView.d.ts +0 -13
- package/dist/features/account/components/UserAddressesView.js +0 -5
- package/dist/features/account/components/UserNotificationsView.d.ts +0 -15
- package/dist/features/account/components/UserNotificationsView.js +0 -12
- package/dist/features/account/components/UserSettingsView.d.ts +0 -16
- package/dist/features/account/components/UserSettingsView.js +0 -13
- package/dist/features/account/components/UserSupportView.d.ts +0 -3
- package/dist/features/account/components/UserSupportView.js +0 -166
- package/dist/features/admin/components/DemoSeedView.d.ts +0 -11
- package/dist/features/admin/components/DemoSeedView.js +0 -5
- package/dist/features/auth/components/AuthStatusPanel.d.ts +0 -10
- package/dist/features/auth/components/AuthStatusPanel.js +0 -22
- package/dist/features/categories/components/CategoryProductsView.d.ts +0 -45
- package/dist/features/categories/components/CategoryProductsView.js +0 -21
- package/dist/features/homepage/components/HowItWorksInfoView.d.ts +0 -36
- package/dist/features/homepage/components/HowItWorksInfoView.js +0 -10
- package/dist/features/layout/BottomActions.d.ts +0 -1
- package/dist/features/layout/BottomActions.js +0 -311
- package/dist/features/products/components/ProductsView.d.ts +0 -6
- package/dist/features/products/components/ProductsView.js +0 -5
- package/dist/features/seller/components/SellerStoreView.d.ts +0 -8
- 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>;
|