@wix/agent-skills 1.33.0 → 1.34.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 (635) hide show
  1. package/README.md +23 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-export/SKILL.md +83 -0
  5. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  6. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  7. package/skills/wix-harmony-editor/SKILL.md +317 -0
  8. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  10. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  11. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  12. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  13. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  14. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  15. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  16. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  17. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  18. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  19. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  20. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  21. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  22. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  24. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  25. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  26. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  27. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  28. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  29. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  30. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  31. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  32. package/skills/wix-headless/SKILL.md +7 -2
  33. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  34. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  35. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  36. package/skills/wix-headless/references/SEED.md +3 -2
  37. package/skills/wix-headless/references/SETUP.md +1 -0
  38. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  39. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  41. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  42. package/skills/wix-headless-kit/SKILL.md +110 -21
  43. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  44. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  45. package/skills/wix-headless-kit/guides/migration.md +49 -17
  46. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  47. package/skills/wix-headless-kit/install/context.mjs +61 -6
  48. package/skills/wix-headless-kit/install/pins.json +1 -1
  49. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  50. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  51. package/skills/wix-headless-replatform/SKILL.md +116 -0
  52. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  53. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  54. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  55. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  56. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  57. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  58. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  59. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  60. package/skills/wix-headless-replatform/references/safety.md +19 -0
  61. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  62. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  63. package/skills/wix-headless-replatform/registry/README.md +20 -0
  64. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  67. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  68. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  69. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  70. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  71. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  72. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  73. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  74. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  75. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  76. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  77. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  78. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  81. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  82. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  83. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  85. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  86. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  87. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  88. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  89. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  90. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  91. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  92. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  93. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  94. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  95. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  96. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  97. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  98. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  99. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  100. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  101. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  102. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  106. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  107. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  108. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  109. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  110. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  111. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  112. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  113. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  114. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  115. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  116. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  117. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  118. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  120. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  121. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  124. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  125. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  126. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  127. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  128. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  131. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  134. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  135. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  136. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  137. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  138. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  139. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  140. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  141. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  142. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  143. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  144. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  145. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  146. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  148. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  149. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  150. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  153. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  156. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  160. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  161. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  162. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  163. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  164. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  165. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  166. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  167. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  168. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  172. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  173. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  174. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  178. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  179. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  180. package/skills/wix-import/SKILL.md +90 -0
  181. package/skills/wix-manage/SKILL.md +38 -10
  182. package/skills/wix-manage/references/automations/actions.md +11 -11
  183. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  184. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  185. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  186. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  187. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  188. package/skills/wix-manage/references/automations/conditions.md +187 -0
  189. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  190. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  191. package/skills/wix-manage/references/automations/triggers.md +47 -10
  192. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  193. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  194. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  195. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  196. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  197. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  198. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  199. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  200. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  201. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  202. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  203. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  204. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  205. package/skills/wix-replatform/.publish-manifest.json +5 -5
  206. package/skills/wix-replatform/CLI.md +162 -0
  207. package/skills/wix-replatform/README.md +52 -0
  208. package/skills/wix-replatform/SKILL.md +229 -684
  209. package/skills/wix-replatform/console/account.css +1 -0
  210. package/skills/wix-replatform/console/app.css +1 -0
  211. package/skills/wix-replatform/console/app.js +117 -0
  212. package/skills/wix-replatform/console/index.html +4 -0
  213. package/skills/wix-replatform/console/json.css +11 -0
  214. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  215. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  216. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  217. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  218. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  219. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  220. package/skills/wix-replatform/lib/config-env.js +85 -11
  221. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  222. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  223. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  224. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  225. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  226. package/skills/wix-replatform/lib/destination-http.js +81 -0
  227. package/skills/wix-replatform/lib/destination-route.js +98 -0
  228. package/skills/wix-replatform/lib/destination.js +919 -0
  229. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  230. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  231. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  232. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  233. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  234. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  235. package/skills/wix-replatform/lib/execution-log.js +170 -0
  236. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  237. package/skills/wix-replatform/lib/execution-state.js +22 -0
  238. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  239. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  240. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  241. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  242. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  243. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  244. package/skills/wix-replatform/lib/link-audit.js +173 -0
  245. package/skills/wix-replatform/lib/link-census.js +194 -0
  246. package/skills/wix-replatform/lib/link-plan.js +148 -0
  247. package/skills/wix-replatform/lib/link-verification.js +274 -0
  248. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  249. package/skills/wix-replatform/lib/local-state.js +869 -30
  250. package/skills/wix-replatform/lib/member-completion.js +658 -0
  251. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  252. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  253. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  254. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  255. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  256. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  257. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  258. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  259. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  260. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  261. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  262. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  263. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  264. package/skills/wix-replatform/lib/progress-log.js +19 -3
  265. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  266. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  267. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  268. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  269. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  270. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  271. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  272. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  273. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  274. package/skills/wix-replatform/lib/run-controller.js +401 -0
  275. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  276. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  277. package/skills/wix-replatform/lib/source-access.js +231 -0
  278. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  279. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  280. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  281. package/skills/wix-replatform/lib/task-state.js +110 -0
  282. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  283. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  284. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  285. package/skills/wix-replatform/lib/url-verification.js +315 -0
  286. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  287. package/skills/wix-replatform/lib/user-actions.js +264 -0
  288. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  289. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  290. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  291. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  292. package/skills/wix-replatform/lib/write-verification.js +274 -0
  293. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  294. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  295. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  296. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  297. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  298. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  299. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  300. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  301. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  302. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  303. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  304. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  305. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  306. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  307. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  308. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  309. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  310. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  311. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  312. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  313. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  314. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  315. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  316. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  317. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  318. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  319. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  320. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  321. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  322. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  323. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  324. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  325. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  351. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  352. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  353. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  354. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  355. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  356. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  357. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  358. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  359. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  360. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  361. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  362. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  363. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  364. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  365. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  390. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  394. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  420. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  423. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  424. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  425. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  426. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  427. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  428. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  429. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  430. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  431. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  432. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  433. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  434. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  435. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  436. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  437. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  439. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  530. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  531. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  532. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  534. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  535. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  574. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  575. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  576. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  577. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  578. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  579. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  580. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  581. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  582. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  583. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  584. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  585. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  586. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  587. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  588. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  589. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  590. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  591. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  592. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  593. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  594. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  595. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  596. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  597. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  598. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  599. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  600. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  601. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  602. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  603. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  604. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  605. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  606. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  607. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  608. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  609. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  610. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  611. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  612. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  613. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  614. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  615. package/skills/wix-replatform/scripts/replatform.js +436 -0
  616. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  617. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  618. package/skills/wix-replatform/scripts/user-action.js +58 -0
  619. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  620. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  621. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  622. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  623. package/skills/wix-vibe-headless/SKILL.md +7 -3
  624. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  625. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  626. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  627. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  628. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  629. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  630. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  631. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  632. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  633. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  634. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
  635. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -1,15 +1,16 @@
1
1
  // Online-ordering rules and DTO mapping — transport-agnostic, imported by both ./ordering.ts (SDK)
2
2
  // and the REST twin in templates/restaurants/rest/ordering.ts (fetch). The restaurant cart rides
3
3
  // on the eCom current cart (Cart V2); what makes a line a RESTAURANT line is the catalogReference
4
- // built here: the Orders app id plus options { operationId, menuId, sectionId } and, exactly as
4
+ // built here: the Orders app id plus options { operationId, menuId, menuSectionId } (sectionId is
5
+ // sent too; Restaurants' checkout check reads menuSectionId) and, exactly as
5
6
  // Wix's own ordering code sends them, the visitor's choices: options.priceVariant { id,
6
7
  // formattedPrice }, options.modifierGroups [{ id, modifiers: [{ id, price, formattedPrice }] }],
7
8
  // options.specialRequests. Raw entities carry `_id` (SDK) or `id` (REST). Has its own formatMoney
8
9
  // (a copy of ../money.ts) so it stands alone when stripped. Imports are type-only except the zone
9
10
  // helpers from ./time-core (deployed beside this file).
10
- import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderLine, OrderSelection, OrderingStatus, SiteMoney, WeeklyWindow } from "./types";
11
+ import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderLine, OrderSelection, OrderingStatus, SiteMoney, WeeklyWindow } from "./types";
11
12
  import type { ImgSrc, Raw } from "./menu-core";
12
- import { zonedMinutes, zonedParts } from "./time-core";
13
+ import { zonedDayKey, zonedMinutes, zonedParts } from "./time-core";
13
14
 
14
15
  /** The Restaurants Orders app id — every restaurant cart line's catalogReference.appId. */
15
16
  export const RESTAURANTS_ORDERS_APP_ID = "9a5d83fd-8570-482e-81ab-cfa88942ee60";
@@ -169,6 +170,98 @@ export function toFulfillmentMethods(raws: Raw[], fulfillmentIds: string[], mone
169
170
  }));
170
171
  }
171
172
 
173
+ // ---- fulfillment choice ----------------------------------------------------------------------------------
174
+ // Restaurants reads the order's fulfillment from the cart's delivery method code, and the hosted
175
+ // checkout offers no pickup/delivery choice until one is set: "<TYPE>|ASAP" or
176
+ // "<TYPE>|<startEpochMs>|<endEpochMs>" for a scheduled slot.
177
+
178
+ /** The cart delivery-method code for a choice (no time → ASAP). */
179
+ export function fulfillmentCode(choice: Pick<FulfillmentChoice, "type" | "time">): string {
180
+ if (choice.time && choice.time.type !== choice.type) throw new Error("The chosen time is for a different fulfillment type.");
181
+ return choice.time?.code ?? `${choice.type}|ASAP`;
182
+ }
183
+
184
+ const epochMs = (iso: unknown): number => new Date(String(iso ?? "")).getTime();
185
+
186
+ /**
187
+ * The operation's time slots → FulfillmentTime[] (ASAP first, then earliest first). `asapSlots` is
188
+ * the first-available response (one ASAP entry per type), `daySlots` a per-date response; both carry
189
+ * `timeslotsPerFulfillmentType` (the API spells the type field `fulfilmentType`). The calls return
190
+ * only orderable slots (blocked ones are left out), so there is nothing to filter.
191
+ */
192
+ export function toFulfillmentTimes(asapSlots: Raw | null | undefined, daySlots: Raw | null | undefined): FulfillmentTime[] {
193
+ const out: FulfillmentTime[] = [];
194
+ const seen = new Set<string>();
195
+ for (const raw of [...((asapSlots?.timeslotsPerFulfillmentType ?? []) as Raw[]), ...((daySlots?.timeslotsPerFulfillmentType ?? []) as Raw[])]) {
196
+ const type = (raw.fulfilmentType ?? raw.fulfillmentType) === "DELIVERY" ? "DELIVERY" : "PICKUP";
197
+ const slot: Raw = raw.timeSlot ?? {};
198
+ const start = epochMs(slot.startTime), end = epochMs(slot.endTime ?? slot.startTime);
199
+ if (!Number.isFinite(start) || !Number.isFinite(end)) continue;
200
+ const asap = slot.orderSchedulingType === "ASAP";
201
+ const code = asap ? `${type}|ASAP` : `${type}|${start}|${end}`;
202
+ if (seen.has(code)) continue;
203
+ seen.add(code);
204
+ out.push({ type, code, asap, startIso: new Date(start).toISOString(), endIso: new Date(end).toISOString() });
205
+ }
206
+ return out.sort((a, b) => Number(b.asap) - Number(a.asap) || a.startIso.localeCompare(b.startIso));
207
+ }
208
+
209
+ /** The per-date slots query for a "YYYY-MM-DD" day at the restaurant (`date.day`, `date.month`, `date.year`). */
210
+ export function slotsDateQuery(dayKey: string): Record<string, string> {
211
+ const [year, month, day] = dayKey.split("-").map(Number);
212
+ return { "date.day": String(day), "date.month": String(month), "date.year": String(year) };
213
+ }
214
+
215
+ /**
216
+ * The time-slot calls' `deliveryAddress.*` query for a delivery address, so the delivery slots are
217
+ * those of the methods that deliver there ({} when there's no street or city yet).
218
+ */
219
+ export function slotsAddressQuery(address: DeliveryAddress | undefined, region: { country: string; subdivision: string }): Record<string, string> {
220
+ if (!address?.addressLine?.trim() || !address.city?.trim()) return {};
221
+ const a = fulfillmentAddress({ type: "DELIVERY", address }, region) as DeliveryAddress;
222
+ const q: Record<string, string> = {};
223
+ for (const [k, v] of Object.entries(a)) if (v) q[`deliveryAddress.${k}`] = String(v);
224
+ return q;
225
+ }
226
+
227
+ /** Today at the restaurant, "YYYY-MM-DD" (the operation's timezone; "" → the visitor's). */
228
+ export const restaurantToday = (timeZone: string, now: Date = new Date()): string => zonedDayKey(now, timeZone);
229
+
230
+ /**
231
+ * The restaurant's country and subdivision ("US-CA"), from its pickup address or its delivery
232
+ * area's center. The cart needs a country before ANY delivery method — pickup included — is
233
+ * accepted (DELIVERY_METHOD_MISSING_ADDRESS), and Wix pre-fills one only from the visitor's location.
234
+ */
235
+ export function toRestaurantRegion(rawMethods: Raw[]): { country: string; subdivision: string } {
236
+ for (const m of rawMethods) {
237
+ const a: Raw = m.pickupOptions?.address ?? m.deliveryOptions?.deliveryArea?.radiusOptions?.centerPointAddress ?? {};
238
+ if (!a.country) continue;
239
+ const sub = String(a.subdivision ?? "");
240
+ return { country: a.country, subdivision: sub && !sub.includes("-") ? `${a.country}-${sub}` : sub };
241
+ }
242
+ return { country: "", subdivision: "" };
243
+ }
244
+
245
+ /**
246
+ * The address a choice puts on the cart: the delivery address with the restaurant's country and
247
+ * subdivision filled in, or for pickup just the restaurant's country. Refuses a delivery choice
248
+ * without the fields Restaurants requires (street, city, country).
249
+ */
250
+ export function fulfillmentAddress(choice: FulfillmentChoice, region: { country: string; subdivision: string }): DeliveryAddress | { country: string; subdivision?: string } {
251
+ if (choice.type !== "DELIVERY") {
252
+ if (!region.country) throw new Error("Pickup isn't set up for online orders. Choose delivery.");
253
+ return { country: region.country, ...(region.subdivision ? { subdivision: region.subdivision } : {}) };
254
+ }
255
+ const a = choice.address;
256
+ const country = a?.country?.trim() || region.country;
257
+ const subdivision = a?.subdivision?.trim() || (country === region.country ? region.subdivision : "");
258
+ if (!a?.addressLine?.trim() || !a.city?.trim() || !country) throw new Error("Enter a delivery address: street and city.");
259
+ return { ...a, country, ...(subdivision ? { subdivision } : {}) };
260
+ }
261
+
262
+ /** The message for a delivery method the cart refused: the address is outside every delivery area. */
263
+ export const NOT_DELIVERABLE = "We don't deliver to this address. Choose pickup or another address.";
264
+
172
265
  // ---- cart --------------------------------------------------------------------------------------------------------
173
266
 
174
267
  export function toOrderLine(raw: Raw, currency: string, imgSrc: ImgSrc): OrderLine {
@@ -192,10 +285,11 @@ export function toOrderLine(raw: Raw, currency: string, imgSrc: ImgSrc): OrderLi
192
285
  export function toOrderCart(raw: Raw | null, subtotal: string, imgSrc: ImgSrc): OrderCart {
193
286
  const currency = cartCurrency(raw);
194
287
  const lines = ((raw?.lineItems ?? []) as Raw[]).map((l) => toOrderLine(l, currency, imgSrc));
195
- return { lines, itemCount: lines.reduce((n, l) => n + l.quantity, 0), subtotal, currency };
288
+ const delivery: Raw = raw?.deliveryInfo ?? {};
289
+ return { lines, itemCount: lines.reduce((n, l) => n + l.quantity, 0), subtotal, currency, fulfillmentCode: delivery.method?.code ?? "" };
196
290
  }
197
291
 
198
- /** The after-discount subtotal from a cart estimate; "" when unknown. Fees, tax, delivery resolve at checkout. */
292
+ /** The after-discount subtotal from a cart estimate; "" when unknown. Fees and tax resolve at checkout. */
199
293
  export function estimateSubtotal(estimate: Raw | null | undefined, raw: Raw): string {
200
294
  return formatMoney(estimate?.summary?.priceSummary?.subtotal, cartCurrency(raw));
201
295
  }
@@ -243,6 +337,7 @@ export function orderCatalogItem(
243
337
  options: {
244
338
  operationId: ctx.operationId,
245
339
  menuId: ctx.menuId,
340
+ menuSectionId: ctx.sectionId, // what Restaurants' checkout validates the dish against
246
341
  sectionId: ctx.sectionId,
247
342
  ...(variant ? { priceVariant: { id: variant.variantId, formattedPrice: variant.price } } : {}),
248
343
  ...(modifierGroups.length ? { modifierGroups } : {}),
@@ -4,11 +4,13 @@
4
4
  // the transport only. Copy as-is; extend by calling these exports, never by editing them. The
5
5
  // request shapes are exact and rewriting them is how carts break:
6
6
  // - the catalogReference appId is the ORDERS app (9a5d83fd-…), never the Stores id;
7
- // - options MUST carry operationId + menuId + sectionId (all three);
7
+ // - options MUST carry operationId + menuId + menuSectionId (sectionId rides along);
8
8
  // - the visitor's choices ride in options.priceVariant / options.modifierGroups /
9
- // options.specialRequests, the keys Wix's own ordering code sends (built in ordering-core).
9
+ // options.specialRequests, the keys Wix's own ordering code sends (built in ordering-core);
10
+ // - the fulfillment (pickup/delivery + time) is the cart's delivery method code, set BEFORE the
11
+ // checkout redirect: the hosted checkout has no picker for it and refuses the order without it.
10
12
  // Failures are loud: throws on a missing or paused ordering operation, an invalid selection,
11
- // unavailable lines, and an empty order at checkout — surface the message, don't swallow it.
13
+ // unavailable lines, an undeliverable address, and an empty order at checkout — surface the message.
12
14
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/list-operations.md
13
15
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/menu-ordering-settings/query-menu-ordering-settings.md
14
16
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/fulfillment-methods/list-fulfillment-methods.md
@@ -17,6 +19,10 @@
17
19
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/add-line-items-to-current-cart.md
18
20
  // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/update-line-items.md
19
21
  // docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
22
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/set-delivery-method-for-current-cart.md
23
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/update-current-cart.md
24
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/calculate-available-time-slots-for-date.md
25
+ // docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/calculate-first-available-time-slot-per-fulfillment-type.md
20
26
  import {
21
27
  operations as operationsModule,
22
28
  fulfillmentMethods as fulfillmentModule,
@@ -25,25 +31,33 @@ import {
25
31
  } from "@wix/restaurants";
26
32
  import { currentCartV2 } from "@wix/ecom";
27
33
  import { redirects as redirectsModule } from "@wix/redirects";
28
- import { wixModule } from "../sdk";
34
+ import { wixFetch, wixModule } from "../sdk";
29
35
  import { imgSrc } from "../media";
30
36
  import { fetchSiteMoney } from "./menu";
31
37
  import { initialSelection, nextCursor, validateSelection, type Raw } from "./menu-core";
32
38
  import {
39
+ NOT_DELIVERABLE,
33
40
  RESTAURANTS_ORDERS_APP_ID,
34
41
  assertOrderAdded,
35
42
  assertOrderCheckoutable,
36
43
  assertOrderContext,
37
44
  assertOrderable,
38
45
  estimateSubtotal,
46
+ fulfillmentAddress,
47
+ fulfillmentCode,
39
48
  orderCatalogItem,
40
49
  rawId,
41
50
  resolveOperation,
51
+ restaurantToday,
52
+ slotsAddressQuery,
53
+ slotsDateQuery,
42
54
  toFulfillmentMethods,
55
+ toFulfillmentTimes,
43
56
  toMenuOrderingMap,
44
57
  toOrderCart,
58
+ toRestaurantRegion,
45
59
  } from "./ordering-core";
46
- import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
60
+ import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
47
61
 
48
62
  export { RESTAURANTS_ORDERS_APP_ID };
49
63
 
@@ -98,12 +112,24 @@ export async function fetchMenuOrdering(): Promise<Record<string, MenuOrderingIn
98
112
 
99
113
  /**
100
114
  * The operation's enabled pickup/delivery methods (operation.fulfillmentIds only), fees and
101
- * minimums formatted in the site currency — for display; the buyer picks one on the hosted checkout.
115
+ * minimums formatted in the site currency — what the fulfillment picker offers.
102
116
  */
103
117
  export async function fetchFulfillmentMethods(): Promise<FulfillmentMethodInfo[]> {
104
118
  try {
105
- const [status, money] = await Promise.all([resolveOrdering(), fetchSiteMoney()]);
119
+ const [status, money, raws] = await Promise.all([resolveOrdering(), fetchSiteMoney(), listFulfillmentRaws()]);
120
+ return toFulfillmentMethods(raws, status.fulfillmentIds, money);
121
+ } catch {
122
+ return []; // ordering still works without the list (pickup ASAP)
123
+ }
124
+ }
125
+
126
+ // The operation's raw fulfillment methods (operation.fulfillmentIds only), read once per session.
127
+ let fulfillmentRawsPromise: Promise<Raw[]> | null = null;
128
+ function listFulfillmentRaws(): Promise<Raw[]> {
129
+ fulfillmentRawsPromise ??= (async () => {
130
+ const status = await resolveOrdering();
106
131
  if (!status.fulfillmentIds.length) return [];
132
+ const wanted = new Set(status.fulfillmentIds);
107
133
  const raws: Raw[] = [];
108
134
  let cursor: string | null = null;
109
135
  do {
@@ -111,10 +137,12 @@ export async function fetchFulfillmentMethods(): Promise<FulfillmentMethodInfo[]
111
137
  raws.push(...((res.fulfillmentMethods ?? []) as Raw[]));
112
138
  cursor = nextCursor(res);
113
139
  } while (cursor);
114
- return toFulfillmentMethods(raws, status.fulfillmentIds, money);
115
- } catch {
116
- return []; // display nicety — ordering still works without the list
117
- }
140
+ return raws.filter((m) => wanted.has(rawId(m)));
141
+ })().catch((e) => {
142
+ fulfillmentRawsPromise = null; // transient failure — allow a retry on the next call
143
+ throw e;
144
+ });
145
+ return fulfillmentRawsPromise;
118
146
  }
119
147
 
120
148
  // A line's attributes.image may come back absent — join the menu items' images by the line's
@@ -212,17 +240,75 @@ export async function removeOrderLine(lineItemId: string): Promise<OrderCart> {
212
240
  return readCartWithSubtotal(cart as Raw);
213
241
  }
214
242
 
243
+ // A raw Cart V2 / operations call under the SDK's auth, for the few calls this transport makes
244
+ // by path. Throws an Error carrying the API's code (`.code`).
245
+ async function wixJson(path: string, init?: RequestInit): Promise<Raw> {
246
+ const res = await wixFetch(path, { ...init, headers: { "Content-Type": "application/json", ...(init?.headers ?? {}) } });
247
+ const body: Raw = await res.json().catch(() => ({}));
248
+ if (!res.ok) {
249
+ const err = new Error(body?.message || `Request failed (${res.status})`) as Error & { code?: string };
250
+ err.code = body?.details?.applicationError?.code;
251
+ throw err;
252
+ }
253
+ return body;
254
+ }
255
+
256
+ /**
257
+ * The times the order can be fulfilled at: ASAP for each type, then the scheduled slots of `dayKey`
258
+ * ("YYYY-MM-DD" at the restaurant; default today), ASAP first. Pass the delivery `address` once the
259
+ * visitor has entered it: the delivery times are then those of the methods that deliver there (none
260
+ * when no method does). [] when there is no operation. Pass the chosen entry to setOrderFulfillment as `time`.
261
+ */
262
+ export async function fetchFulfillmentTimes(dayKey?: string, address?: DeliveryAddress): Promise<FulfillmentTime[]> {
263
+ const { operationId, timeZone } = await resolveOrdering();
264
+ if (!operationId) return [];
265
+ const base = `/restaurants-operations/v1/operations/${operationId}`;
266
+ const where = slotsAddressQuery(address, address ? toRestaurantRegion(await listFulfillmentRaws()) : { country: "", subdivision: "" });
267
+ const day = new URLSearchParams({ ...slotsDateQuery(dayKey ?? restaurantToday(timeZone)), ...where });
268
+ const first = new URLSearchParams(where).toString();
269
+ const [asap, slots] = await Promise.all([
270
+ wixJson(`${base}/first-available-time-slot-per-fulfillment-type${first ? `?${first}` : ""}`, { method: "GET" }),
271
+ wixJson(`${base}/available-time-slots-per-date?${day}`, { method: "GET" }),
272
+ ]);
273
+ return toFulfillmentTimes(asap, slots);
274
+ }
275
+
276
+ /**
277
+ * Set how and when the order is fulfilled: pickup or delivery, a time from fetchFulfillmentTimes
278
+ * (omitted → ASAP), and for delivery the address (street, city; country and subdivision default to
279
+ * the restaurant's). Pickup puts the restaurant's country on the cart, which Wix requires before
280
+ * any delivery method. Throws NOT_DELIVERABLE when the address is outside every delivery area.
281
+ */
282
+ export async function setOrderFulfillment(choice: FulfillmentChoice): Promise<OrderCart> {
283
+ const address = fulfillmentAddress(choice, toRestaurantRegion(await listFulfillmentRaws()));
284
+ await wixJson("/ecom/v2/carts/current", { method: "PATCH", body: JSON.stringify({ cart: { deliveryInfo: { address } } }) });
285
+ try {
286
+ const res = await wixJson("/ecom/v2/carts/current/set-delivery-method", { method: "POST", body: JSON.stringify({ deliveryMethod: { code: fulfillmentCode(choice) } }) });
287
+ return readCartWithSubtotal(res.cart ?? null);
288
+ } catch (e) {
289
+ if ((e as { code?: string }).code === "DELIVERY_METHOD_NOT_FOUND") {
290
+ throw new Error(choice.type === "DELIVERY" ? NOT_DELIVERABLE : "This pickup time isn't available. Choose another time.");
291
+ }
292
+ throw e;
293
+ }
294
+ }
295
+
215
296
  /**
216
297
  * Start the Wix-hosted checkout for the current order and return the URL to navigate to.
217
- * The cart's id IS the checkout id — no separate checkout-creation call. Fulfillment
218
- * (pickup/delivery + time) and payment are collected on the hosted page. Call from the
219
- * browser: the return origin must be window.location.origin (https), never a server-derived
220
- * request origin (http behind the proxy → the return redirect 403s).
298
+ * The cart's id IS the checkout id — no separate checkout-creation call. The fulfillment must be
299
+ * on the cart first (setOrderFulfillment); a cart with none gets pickup ASAP. Payment is collected
300
+ * on the hosted page. Call from the browser: the return origin must be window.location.origin
301
+ * (https), never a server-derived request origin (http behind the proxy → the return redirect 403s).
221
302
  */
222
303
  export async function orderCheckoutUrl(): Promise<string> {
223
304
  const { cart } = await cartApi.getCurrentCart();
224
305
  const raw = cart as Raw;
225
306
  assertOrderCheckoutable(raw);
307
+ if (!raw.deliveryInfo?.method?.code) {
308
+ await setOrderFulfillment({ type: "PICKUP" }).catch(() => {
309
+ throw new Error("Choose pickup or delivery before checkout.");
310
+ });
311
+ }
226
312
  const origin = typeof window !== "undefined" ? window.location.origin : "";
227
313
  const session = await redirects.createRedirectSession({
228
314
  ecomCheckout: { checkoutId: rawId(raw) },
@@ -190,7 +190,7 @@ export interface MenuOrderingInfo {
190
190
  };
191
191
  }
192
192
 
193
- /** A pickup/delivery method the operation offers (the buyer picks one on the hosted checkout). */
193
+ /** A pickup/delivery method the operation offers (display: name, fee, minimum). */
194
194
  export interface FulfillmentMethodInfo {
195
195
  id: string;
196
196
  type: "PICKUP" | "DELIVERY";
@@ -203,6 +203,38 @@ export interface FulfillmentMethodInfo {
203
203
  minOrderPriceAmount: string;
204
204
  }
205
205
 
206
+ /**
207
+ * A time the order can be fulfilled at, from the operation's time slots. `code` is what the cart's
208
+ * delivery method takes ("PICKUP|ASAP", or "PICKUP|<startMs>|<endMs>" for a scheduled slot).
209
+ */
210
+ export interface FulfillmentTime {
211
+ type: "PICKUP" | "DELIVERY";
212
+ code: string;
213
+ asap: boolean;
214
+ /** ISO start/end (equal for a point in time); render in OrderingStatus.timeZone. */
215
+ startIso: string;
216
+ endIso: string;
217
+ }
218
+
219
+ /**
220
+ * A delivery address. country (ISO-3166 alpha-2) and subdivision ("US-CA") default to the
221
+ * restaurant's when omitted — delivery is local.
222
+ */
223
+ export interface DeliveryAddress {
224
+ addressLine: string;
225
+ city: string;
226
+ postalCode?: string;
227
+ country?: string;
228
+ subdivision?: string;
229
+ }
230
+
231
+ /** The visitor's fulfillment: pickup or delivery, a time (omitted → ASAP), and the address for delivery. */
232
+ export interface FulfillmentChoice {
233
+ type: "PICKUP" | "DELIVERY";
234
+ time?: FulfillmentTime;
235
+ address?: DeliveryAddress;
236
+ }
237
+
206
238
  export interface OrderLine {
207
239
  /** The cart line id — what update/remove take (NOT the menu item id). */
208
240
  lineItemId: string;
@@ -227,6 +259,8 @@ export interface OrderCart {
227
259
  /** Formatted subtotal (after discounts) — from the cart estimate, not hand-summed. */
228
260
  subtotal: string;
229
261
  currency: string;
262
+ /** The fulfillment code set on the cart ("PICKUP|ASAP", …); "" when none is set yet. */
263
+ fulfillmentCode: string;
230
264
  }
231
265
 
232
266
  /** A custom question the owner added to the reservation form. */
@@ -1,13 +1,51 @@
1
- // REFERENCE slide-over order cart with quantity stepper, remove, live subtotal, and the
2
- // Wix-hosted checkout. Mount ONCE per page; opens via useOrderCart().openCart(). Correct and
3
- // complete; per the skill's model you design your own chrome on useOrderCart.
1
+ // REFERENCE slide-over order cart with quantity stepper, remove, live subtotal, pickup/delivery
2
+ // with a time (and the address for delivery), and the Wix-hosted checkout. Mount ONCE per page;
3
+ // opens via useOrderCart().openCart(). Correct and complete; per the skill's model you design your
4
+ // own chrome on useOrderCart.
5
+ import { useState } from "react";
4
6
  import { useOrderCart } from "../../hooks/restaurants/useOrderCart";
5
7
  import { imgAttrs } from "../../wix/media";
8
+ import { zonedDateTimeLabel, zonedDayKey, zonedTimeLabel } from "../../wix/restaurants/time-core";
9
+ import type { FulfillmentChoice } from "../../wix/restaurants/types";
6
10
 
7
11
  export default function OrderCartDrawer() {
8
- const { cart, open, closeCart, busy, error, updateQuantity, removeLine, checkout } = useOrderCart();
12
+ const { cart, open, closeCart, busy, error, updateQuantity, removeLine, checkout, fulfillment, fulfillmentTimes, orderingStatus, chooseFulfillment, loadFulfillmentTimes } = useOrderCart();
13
+ const types = [...new Set((fulfillment ?? []).map((m) => m.type))];
14
+ const [type, setType] = useState<"PICKUP" | "DELIVERY" | null>(null);
15
+ const [timeCode, setTimeCode] = useState("");
16
+ const [street, setStreet] = useState("");
17
+ const [city, setCity] = useState("");
18
+ const [postalCode, setPostalCode] = useState("");
9
19
  if (!open) return null;
10
20
  const lines = cart?.lines ?? [];
21
+ const chosenType = type ?? (types.includes("PICKUP") || !types.length ? "PICKUP" : "DELIVERY");
22
+ const times = (fulfillmentTimes ?? []).filter((t) => t.type === chosenType);
23
+ const tz = orderingStatus?.timeZone ?? "";
24
+ const today = zonedDayKey(new Date(), tz);
25
+ // A slot on a later day than today (at the restaurant) carries its date: "Fri, Oct 24, 9:00 AM".
26
+ const timeLabel = (iso: string, asap: boolean) => {
27
+ const d = new Date(iso);
28
+ if (asap) return `As soon as possible (about ${zonedTimeLabel(d, tz)})`;
29
+ return zonedDayKey(d, tz) === today ? zonedTimeLabel(d, tz) : zonedDateTimeLabel(d, tz);
30
+ };
31
+ const deliveryMethod = (fulfillment ?? []).find((m) => m.type === "DELIVERY");
32
+
33
+ // Once street and city are in, delivery times come only from the methods that deliver there.
34
+ function refreshDeliveryTimes() {
35
+ if (street.trim() && city.trim()) void loadFulfillmentTimes(undefined, { addressLine: street, city, postalCode });
36
+ }
37
+
38
+ async function placeOrder() {
39
+ const choice: FulfillmentChoice = {
40
+ type: chosenType,
41
+ time: times.find((t) => t.code === timeCode),
42
+ ...(chosenType === "DELIVERY"
43
+ ? { address: { addressLine: street, city, postalCode } } // country and subdivision: the restaurant's
44
+ : {}),
45
+ };
46
+ await chooseFulfillment(choice); // the hosted checkout refuses an order with no fulfillment
47
+ await checkout();
48
+ }
11
49
 
12
50
  return (
13
51
  <div
@@ -104,11 +142,55 @@ export default function OrderCartDrawer() {
104
142
  <strong className="font-semibold">{cart.subtotal}</strong>
105
143
  </div>
106
144
  )}
145
+ {types.length > 1 && (
146
+ <div role="radiogroup" aria-label="Pickup or delivery" className="mb-3 grid grid-cols-2 gap-2">
147
+ {(["PICKUP", "DELIVERY"] as const).map((t) => (
148
+ <button
149
+ key={t}
150
+ type="button"
151
+ role="radio"
152
+ aria-checked={chosenType === t}
153
+ onClick={() => { setType(t); setTimeCode(""); }}
154
+ className={`rounded-control border py-2 text-sm ${chosenType === t ? "border-primary font-semibold" : "border-border text-muted-foreground"}`}
155
+ >
156
+ {t === "PICKUP" ? "Pickup" : "Delivery"}
157
+ </button>
158
+ ))}
159
+ </div>
160
+ )}
161
+ {chosenType === "DELIVERY" && (
162
+ <div className="mb-3 grid gap-2">
163
+ <input aria-label="Street address" placeholder="Street address" value={street} onChange={(e) => setStreet(e.target.value)} onBlur={refreshDeliveryTimes} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
164
+ <div className="grid grid-cols-2 gap-2">
165
+ <input aria-label="City" placeholder="City" value={city} onChange={(e) => setCity(e.target.value)} onBlur={refreshDeliveryTimes} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
166
+ <input aria-label="Postal code" placeholder="Postal code" value={postalCode} onChange={(e) => setPostalCode(e.target.value)} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
167
+ </div>
168
+ {deliveryMethod && (deliveryMethod.fee || deliveryMethod.minOrderPrice) && (
169
+ <p className="text-xs text-muted-foreground">
170
+ {[deliveryMethod.fee && `Delivery ${deliveryMethod.fee}`, deliveryMethod.minOrderPrice && `minimum order ${deliveryMethod.minOrderPrice}`].filter(Boolean).join(" · ")}
171
+ </p>
172
+ )}
173
+ </div>
174
+ )}
175
+ {times.length > 0 && (
176
+ <select
177
+ aria-label={chosenType === "PICKUP" ? "Pickup time" : "Delivery time"}
178
+ value={timeCode}
179
+ onChange={(e) => setTimeCode(e.target.value)}
180
+ className="mb-4 w-full rounded-control border border-border bg-background px-3 py-2 text-sm"
181
+ >
182
+ {times.map((t) => (
183
+ <option key={t.code} value={t.asap ? "" : t.code}>
184
+ {timeLabel(t.startIso, t.asap)}
185
+ </option>
186
+ ))}
187
+ </select>
188
+ )}
107
189
  {error && <p className="mb-3 text-xs text-destructive">{error}</p>}
108
190
  <button
109
191
  type="button"
110
192
  disabled={busy}
111
- onClick={() => checkout().catch(() => {})}
193
+ onClick={() => placeOrder().catch(() => {})}
112
194
  className="w-full rounded-control bg-primary py-3.5 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-50"
113
195
  >
114
196
  {busy ? "One moment…" : "Checkout"}
@@ -3,9 +3,11 @@
3
3
  import { useSyncExternalStore } from "react";
4
4
  import {
5
5
  addOrderLine,
6
+ chooseFulfillment,
6
7
  getOrderCartState,
7
8
  goToOrderCheckout,
8
9
  isMenuOrderable,
10
+ loadFulfillmentTimes,
9
11
  refreshOrderCart,
10
12
  removeLineFromOrder,
11
13
  setOrderCartOpen,
@@ -13,7 +15,7 @@ import {
13
15
  updateOrderLineQuantity,
14
16
  type OrderCartState,
15
17
  } from "../../wix/restaurants/order-store";
16
- import type { MenuItem, OrderSelection } from "../../wix/restaurants/types";
18
+ import type { DeliveryAddress, FulfillmentChoice, MenuItem, OrderSelection } from "../../wix/restaurants/types";
17
19
 
18
20
  const SERVER_STATE = getOrderCartState();
19
21
 
@@ -29,6 +31,10 @@ export interface UseOrderCart extends OrderCartState {
29
31
  menuOrderable: (menuId: string) => boolean | null;
30
32
  updateQuantity: (lineItemId: string, quantity: number) => Promise<void>;
31
33
  removeLine: (lineItemId: string) => Promise<void>;
34
+ /** Set pickup or delivery, the time (a fulfillmentTimes entry; omitted → ASAP), and the delivery address. */
35
+ chooseFulfillment: (choice: FulfillmentChoice) => Promise<void>;
36
+ /** Reload fulfillmentTimes for another day ("YYYY-MM-DD" at the restaurant) and/or a delivery address. */
37
+ loadFulfillmentTimes: (dayKey?: string, address?: DeliveryAddress) => Promise<void>;
32
38
  checkout: () => Promise<void>;
33
39
  openCart: () => void;
34
40
  closeCart: () => void;
@@ -44,6 +50,8 @@ export function useOrderCart(): UseOrderCart {
44
50
  menuOrderable: isMenuOrderable,
45
51
  updateQuantity: updateOrderLineQuantity,
46
52
  removeLine: removeLineFromOrder,
53
+ chooseFulfillment,
54
+ loadFulfillmentTimes,
47
55
  checkout: goToOrderCheckout,
48
56
  openCart: () => setOrderCartOpen(true),
49
57
  closeCart: () => setOrderCartOpen(false),
@@ -4,16 +4,18 @@
4
4
  // Consume it through useOrderCart() (hooks/), or subscribe directly. Besides the cart it holds
5
5
  // the site's ordering gates: the operation's state and each menu's ordering settings, so an add
6
6
  // control can read "accepting orders?" and "is THIS menu orderable now?" without a fetch of its own.
7
- import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
7
+ import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
8
8
  import { menuOrderable } from "./ordering-core";
9
9
  import {
10
10
  addToOrder as apiAdd,
11
11
  fetchFulfillmentMethods,
12
+ fetchFulfillmentTimes,
12
13
  fetchMenuOrdering,
13
14
  fetchOrderCart,
14
15
  orderCheckoutUrl,
15
16
  removeOrderLine as apiRemove,
16
17
  resolveOrdering,
18
+ setOrderFulfillment,
17
19
  updateOrderQuantity as apiUpdate,
18
20
  } from "./ordering";
19
21
 
@@ -25,8 +27,12 @@ export interface OrderCartState {
25
27
  orderingStatus: OrderingStatus | null;
26
28
  /** Per-menu ordering settings under the operation, keyed by menuId; null while loading or when unreadable. */
27
29
  menuOrdering: Record<string, MenuOrderingInfo> | null;
28
- /** The operation's enabled pickup/delivery methods, for display; null while loading. */
30
+ /** The operation's enabled pickup/delivery methods (names, fees, minimums); null while loading. */
29
31
  fulfillment: FulfillmentMethodInfo[] | null;
32
+ /** When the order can be fulfilled (ASAP first, then today's slots); null while loading or unreadable. */
33
+ fulfillmentTimes: FulfillmentTime[] | null;
34
+ /** The fulfillment last set on the cart through chooseFulfillment; null → none chosen (checkout uses pickup ASAP). */
35
+ fulfillmentChoice: FulfillmentChoice | null;
30
36
  /**
31
37
  * True while any cart operation is in flight — the DRAWER's flag (its steppers, remove and
32
38
  * checkout controls), not a dish card's: a card disables its own add control on `pendingItemId`,
@@ -41,7 +47,7 @@ export interface OrderCartState {
41
47
  open: boolean;
42
48
  }
43
49
 
44
- const EMPTY: OrderCartState = { cart: null, ordering: null, orderingStatus: null, menuOrdering: null, fulfillment: null, busy: false, pendingItemId: null, error: null, open: false };
50
+ const EMPTY: OrderCartState = { cart: null, ordering: null, orderingStatus: null, menuOrdering: null, fulfillment: null, fulfillmentTimes: null, fulfillmentChoice: null, busy: false, pendingItemId: null, error: null, open: false };
45
51
 
46
52
  let state: OrderCartState = EMPTY;
47
53
  const listeners = new Set<() => void>();
@@ -65,6 +71,7 @@ export function subscribeOrderCart(listener: () => void): () => void {
65
71
  void resolveOrdering().then((s) => setState({ ordering: s.status === "ENABLED", orderingStatus: s }));
66
72
  void fetchMenuOrdering().then((m) => setState({ menuOrdering: m })).catch(() => setState({ menuOrdering: null }));
67
73
  void fetchFulfillmentMethods().then((f) => setState({ fulfillment: f }));
74
+ void loadFulfillmentTimes();
68
75
  }
69
76
  return () => listeners.delete(listener);
70
77
  }
@@ -124,7 +131,29 @@ export async function removeLineFromOrder(lineItemId: string): Promise<void> {
124
131
  await run(() => apiRemove(lineItemId));
125
132
  }
126
133
 
127
- /** Navigate to the Wix-hosted checkout. Never hand-build a checkout URL. */
134
+ /**
135
+ * Load the fulfillment times for `dayKey` ("YYYY-MM-DD" at the restaurant; default today). Pass the
136
+ * delivery address once entered: delivery times then come only from methods that deliver there.
137
+ */
138
+ export async function loadFulfillmentTimes(dayKey?: string, address?: DeliveryAddress): Promise<void> {
139
+ try {
140
+ setState({ fulfillmentTimes: await fetchFulfillmentTimes(dayKey, address) });
141
+ } catch {
142
+ setState({ fulfillmentTimes: null }); // unreadable — checkout still works on ASAP
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Set pickup or delivery, the time (a fulfillmentTimes entry; omitted → ASAP) and, for delivery,
148
+ * the address on the order. Throws (and sets .error) when the address isn't delivered to or the
149
+ * time is gone.
150
+ */
151
+ export async function chooseFulfillment(choice: FulfillmentChoice): Promise<void> {
152
+ await run(() => setOrderFulfillment(choice));
153
+ setState({ fulfillmentChoice: choice });
154
+ }
155
+
156
+ /** Navigate to the Wix-hosted checkout (pickup ASAP when no fulfillment was chosen). Never hand-build a checkout URL. */
128
157
  export async function goToOrderCheckout(): Promise<void> {
129
158
  setState({ busy: true, error: null });
130
159
  try {