@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
@@ -0,0 +1,3 @@
1
+ 'use strict';
2
+ // Compatibility entry point; receipt comparison is shared runtime code.
3
+ module.exports = require('../../../lib/write-verification');
@@ -0,0 +1,150 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Fetch a domain's dev.wix.com docs menu(s) and sync
5
+ // domains/<domain>/docs-survey.json. The script owns the surface list (id,
6
+ // title, url, group); verdict fields are authored by hand and preserved
7
+ // across syncs. New surfaces arrive as "unreviewed", which fails validation
8
+ // until triaged; surfaces gone from the docs are marked "removed", which
9
+ // also fails validation until the entry is deleted or its facts revisited.
10
+ //
11
+ // Usage: node docs-survey-sync.js <domain> [<domain>...]
12
+ // Requires domains/<domain>/domain.json to declare docsRoots[] (paths under
13
+ // https://dev.wix.com/docs/, e.g. "api-reference/business-solutions/events").
14
+
15
+ const path = require('node:path');
16
+ const fs = require('node:fs');
17
+ const { knowledgeRoot, writeJson } = require('../lib/domain-knowledge.js');
18
+
19
+ const DOCS_BASE = 'https://dev.wix.com/docs/';
20
+ const HEADING_RE = /^(#{1,6}) \[([^\]]+)\]\((https:\/\/dev\.wix\.com\/docs\/[^)]+?)(?:\.md)?\)\s*$/;
21
+
22
+ async function fetchMenuMarkdown(root) {
23
+ const url = `${DOCS_BASE}${root}.md`;
24
+ const response = await fetch(url, { redirect: 'follow' });
25
+ if (!response.ok) throw new Error(`GET ${url} -> HTTP ${response.status}`);
26
+ return response.text();
27
+ }
28
+
29
+ // A menu page lists its whole ancestry too (# Api Reference, ## Business
30
+ // Solutions, ...). Only headings strictly below the fetched root are the
31
+ // domain's own; among those, the surfaces are the deepest headings — the
32
+ // ones with no child headings.
33
+ function extractSurfaces(markdown, root) {
34
+ const headings = [];
35
+ let rootTitle = null;
36
+ for (const line of markdown.split('\n')) {
37
+ const match = line.match(HEADING_RE);
38
+ if (!match) continue;
39
+ const docsPath = match[3].slice(DOCS_BASE.length);
40
+ if (docsPath === root) rootTitle = match[2];
41
+ if (!docsPath.startsWith(`${root}/`)) continue;
42
+ headings.push({ level: match[1].length, title: match[2], docsPath });
43
+ }
44
+
45
+ // A flat tree (all methods as bullets, no sub-headings) is still one
46
+ // surface — the root itself. Never let a root vanish silently.
47
+ if (headings.length === 0) {
48
+ return [
49
+ {
50
+ id: root,
51
+ title: rootTitle || root.split('/').pop(),
52
+ url: `${DOCS_BASE}${root}`,
53
+ group: null,
54
+ },
55
+ ];
56
+ }
57
+
58
+ const surfaces = [];
59
+ for (let i = 0; i < headings.length; i += 1) {
60
+ const heading = headings[i];
61
+ const next = headings[i + 1];
62
+ const hasChildren = next && next.level > heading.level;
63
+ if (hasChildren) continue;
64
+ const group = [];
65
+ for (let j = i - 1, level = heading.level; j >= 0; j -= 1) {
66
+ if (headings[j].level < level) {
67
+ group.unshift(headings[j].title);
68
+ level = headings[j].level;
69
+ }
70
+ }
71
+ surfaces.push({
72
+ id: heading.docsPath,
73
+ title: heading.title,
74
+ url: `${DOCS_BASE}${heading.docsPath}`,
75
+ group: group.join(' › ') || null,
76
+ });
77
+ }
78
+ return surfaces;
79
+ }
80
+
81
+ function mergeSurvey(existing, domain, roots, fetched) {
82
+ const previous = new Map(((existing && existing.surfaces) || []).map((entry) => [entry.id, entry]));
83
+ const surfaces = fetched.map((surface) => {
84
+ const kept = previous.get(surface.id);
85
+ previous.delete(surface.id);
86
+ const verdictFields = kept
87
+ ? {
88
+ verdict: kept.verdict,
89
+ refs: kept.refs,
90
+ reason: kept.reason,
91
+ tracking: kept.tracking,
92
+ reviewedOn: kept.reviewedOn,
93
+ }
94
+ : { verdict: 'unreviewed' };
95
+ for (const key of Object.keys(verdictFields)) {
96
+ if (verdictFields[key] === undefined) delete verdictFields[key];
97
+ }
98
+ return { ...surface, ...verdictFields };
99
+ });
100
+ for (const gone of previous.values()) {
101
+ surfaces.push({ ...gone, removed: true });
102
+ }
103
+ surfaces.sort((a, b) => a.id.localeCompare(b.id));
104
+ return {
105
+ schemaVersion: 1,
106
+ domain,
107
+ fetchedAt: new Date().toISOString().slice(0, 10),
108
+ roots,
109
+ surfaces,
110
+ };
111
+ }
112
+
113
+ async function syncDomain(domainsDir, domain) {
114
+ const domainJsonPath = path.join(domainsDir, domain, 'domain.json');
115
+ const domainJson = JSON.parse(fs.readFileSync(domainJsonPath, 'utf8'));
116
+ const roots = domainJson.docsRoots;
117
+ if (!Array.isArray(roots) || roots.length === 0) {
118
+ throw new Error(`${domain}/domain.json has no docsRoots[]; declare the domain's docs menu roots first`);
119
+ }
120
+ const fetchedByRoot = await Promise.all(
121
+ roots.map((root) => fetchMenuMarkdown(root).then((md) => extractSurfaces(md, root))),
122
+ );
123
+ const fetched = fetchedByRoot.flat();
124
+
125
+ const surveyPath = path.join(domainsDir, domain, 'docs-survey.json');
126
+ const existing = fs.existsSync(surveyPath) ? JSON.parse(fs.readFileSync(surveyPath, 'utf8')) : null;
127
+ const survey = mergeSurvey(existing, domain, roots, fetched);
128
+ writeJson(surveyPath, survey);
129
+
130
+ const unreviewed = survey.surfaces.filter((s) => s.verdict === 'unreviewed').length;
131
+ const removed = survey.surfaces.filter((s) => s.removed).length;
132
+ process.stdout.write(
133
+ `${domain}: ${survey.surfaces.length} surfaces (${unreviewed} unreviewed, ${removed} removed) -> ${path.relative(process.cwd(), surveyPath)}\n`
134
+ );
135
+ }
136
+
137
+ async function main() {
138
+ const domains = process.argv.slice(2).filter((arg) => !arg.startsWith('--'));
139
+ if (domains.length === 0) {
140
+ process.stderr.write('Usage: docs-survey-sync.js <domain> [<domain>...]\n');
141
+ process.exit(2);
142
+ }
143
+ const domainsDir = knowledgeRoot(path.resolve(__dirname, '..'));
144
+ for (const domain of domains) await syncDomain(domainsDir, domain);
145
+ }
146
+
147
+ main().catch((error) => {
148
+ process.stderr.write(`ERROR: ${error.message}\n`);
149
+ process.exit(1);
150
+ });
@@ -2,11 +2,49 @@
2
2
  'use strict';
3
3
 
4
4
  const path = require('node:path');
5
- const { knowledgeRoot, validateKnowledge, writeJson } = require('../lib/domain-knowledge.js');
5
+ const { knowledgeRoot, validateKnowledge, writeJson, listMissingDependsOn, checkScope } = require('../lib/domain-knowledge.js');
6
6
 
7
7
  function main() {
8
- const args = new Set(process.argv.slice(2));
8
+ const argv = process.argv.slice(2);
9
+ const args = new Set(argv);
9
10
  const domainsDir = knowledgeRoot(path.resolve(__dirname, '..'));
11
+
12
+ if (args.has('--list-missing-deps')) {
13
+ // The live backlog — entities that have never had dependsOn authored at all.
14
+ // Non-blocking report, not a validation error; this is the thing to run instead of
15
+ // trusting a hand-maintained list to stay accurate.
16
+ const missing = listMissingDependsOn(domainsDir);
17
+ process.stdout.write(`${missing.length} entit${missing.length === 1 ? 'y has' : 'ies have'} no dependsOn yet:\n`);
18
+ for (const ref of missing) process.stdout.write(` ${ref}\n`);
19
+ return;
20
+ }
21
+
22
+ const checkScopeIndex = argv.indexOf('--check-scope');
23
+ if (checkScopeIndex !== -1) {
24
+ // The rp-mapper review-gate check: pass only the plan's own selected scope — checkScope
25
+ // walks the transitive closure itself. --check-scope stores/product,gift-cards/gift-card,ecom/order
26
+ const inScopeRefs = (argv[checkScopeIndex + 1] || '').split(',').map((s) => s.trim()).filter(Boolean);
27
+ if (inScopeRefs.length === 0) {
28
+ process.stderr.write('ERROR: --check-scope requires a comma-separated list of domain/entity refs\n');
29
+ process.exit(1);
30
+ }
31
+ const result = checkScope(domainsDir, inScopeRefs);
32
+ if (result.ok) {
33
+ process.stdout.write('OK: every selected ref resolves, every reachable dependency is in scope, and every reachable entity has been reviewed\n');
34
+ return;
35
+ }
36
+ for (const ref of result.unknownRefs) {
37
+ process.stdout.write(`UNKNOWN: ${ref} does not resolve to a real domain/entity file\n`);
38
+ }
39
+ for (const { ref, missing } of result.missingDependencies) {
40
+ process.stdout.write(`MISSING: ${ref} depends on ${missing.join(', ')}, not in scope for this plan\n`);
41
+ }
42
+ for (const ref of result.unreviewedRefs) {
43
+ process.stdout.write(`UNREVIEWED: ${ref} is reachable from this scope but has never had dependsOn authored\n`);
44
+ }
45
+ process.exit(1);
46
+ }
47
+
10
48
  const result = validateKnowledge(domainsDir);
11
49
 
12
50
  if (args.has('--write-index')) {
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
+ const { startDevProbe } = require('../../../lib/execution-capability');
3
4
 
4
5
  const fs = require('fs');
5
6
  const path = require('path');
@@ -13,6 +14,7 @@ const {
13
14
  function usage() {
14
15
  console.error(`Usage:
15
16
  node scripts/verify-stores.js stores subscription-create --artifact <file> [--proposal-artifact <file>] [--marker <id>] [--no-cleanup]
17
+ node scripts/verify-stores.js stores inventory-import --env <test-target-config> --artifact <file>
16
18
  node scripts/verify-stores.js stores product-count --artifact <file>
17
19
  node scripts/verify-stores.js stores product-by-source-marker --marker-path <path> --marker-value <value> --artifact <file>
18
20
  node scripts/verify-stores.js stores delete-probe --product-id <id> --artifact <file>
@@ -60,7 +62,7 @@ function loadEnvFile(file) {
60
62
  const authToken = process.env.WIX_AUTH_TOKEN;
61
63
  const siteId = process.env.WIX_SITE_ID;
62
64
  if (!authToken || !siteId) throw new Error('WIX_AUTH_TOKEN and WIX_SITE_ID are required');
63
- const wix = w.createWixClient({ authToken, siteId });
65
+ const wix = w.createWixClient({ authToken, capability: startDevProbe({ siteId, confirmation: process.env.RP_SENTINEL_CONFIRM }) });
64
66
  const common = { wix, siteId, artifactPath: options.artifact };
65
67
 
66
68
  let result;
@@ -84,6 +86,9 @@ function loadEnvFile(file) {
84
86
  fs.writeFileSync(options.artifact, `${JSON.stringify(result, null, 2)}\n`);
85
87
  }
86
88
  }
89
+ } else if (command === 'inventory-import') {
90
+ if (!options.artifact) throw new Error('inventory-import requires --artifact for recovery and verification evidence');
91
+ result = await verify.verifyStoresInventoryImport(common);
87
92
  } else if (command === 'product-count') {
88
93
  result = await verify.verifyStoresProductCount(common);
89
94
  } else if (command === 'product-by-source-marker') {
@@ -60,10 +60,20 @@ what to fix.
60
60
  | `meter [--api-ms N --model-ms N --script-ms N --input-tokens N …]` | Measured latency/token counts for a stage. Call it whenever you have real numbers; see "Metering" below. |
61
61
  | `wait start [--halt <subtype> --skill <s> [--what '<text>']]` / `wait end` | The moment the run halts for the user, and the moment it resumes. This is how user latency stays out of `active_ms` — never estimate elapsed time yourself. Pass `--halt` for a needs-user halt and the recorder emits the paired `halt_needs_user` event for you. |
62
62
  | `record '<event-json>'` | The moment something observable happens (taxonomy below). |
63
+ | `digest --transcript <path> [--offline]` | Just before `finalize` — a deterministic parse of this run's Claude Code session transcript (cost, turn counts, tool failures, retry loops, hook errors). Never authored by you; `--offline` re-runs it later against a checkpointed or local transcript for a run that died before calling it. |
63
64
  | `finalize '<rollup-json>'` | When the run reaches a terminal state. |
64
65
  | `rebuild [--attempt <n>] [--push]` | Only on request, to re-assemble a past run's signal document from its archived journal after a recorder fix — never during a run. `--push` re-emits the rebuilt run to the BI sink (backfill after an outage; idempotent — the reviewer dedupes at query time). |
65
66
  | `status` | To orient after a resume. |
66
67
 
68
+ Preflight reads that same `status` and reports whether a journal exists — `active`,
69
+ `absent`, `finalized_only` or `unreadable` — as a non-blocking line in its result. When
70
+ nothing is recording, the preflight script then calls `start` itself (moving an
71
+ unreplayable journal aside first) and adds a `recovery` field to that line. This is a
72
+ safety net, not the main path: `start` at run begin below stays required. A
73
+ `recovery: failed` reading falls under the "never mention" rule below — it is recorded for
74
+ the RePlatform team in the preflight result and progress log, never told to the person
75
+ running the migration, and never blocks the run.
76
+
67
77
  ### Run lifecycle
68
78
 
69
79
  1. **`start`** as the first telemetry act of the run, with whatever dimensions are already
@@ -80,6 +90,23 @@ what to fix.
80
90
  one more session) and closes any open wait interval. `start` after a finalized run
81
91
  opens the next attempt. Never try to manage run identity yourself.
82
92
 
93
+ **Always `start` on resume, even mid-stage.** Besides the session accounting, the
94
+ resume is a BI heal point: the recorder re-pushes everything the previous session's
95
+ transport may have lost (push failures are journaled, then healed at the next
96
+ opportunity — a halted run may never reach finalize, so skipping the resume `start`
97
+ can strand the run's tail in the local journal). `status` shows `bi_backlog: true`
98
+ when unpushed rows are pending.
99
+
100
+ A safety net backs this up, and it does not replace your `start`: the start of a
101
+ `replatform run`/`resume` supervisor process, and the orchestration route script after
102
+ at least 15 minutes of journal silence, record the resumed session themselves on an
103
+ open recording (tagged with a `trigger`). A `start` within a minute of such an automatic
104
+ session, or at any point during the live supervisor run that opened it, joins that
105
+ session instead of opening another — it still records the dimensions you pass. The
106
+ 15-minute gap is a heuristic about sittings, not a detected session. A failed or
107
+ skipped automatic resume falls under the "never mention" rule below: it goes only to
108
+ the progress log or the supervisor's run record.
109
+
83
110
  `source_acquisition` is an open set of class tokens, but reuse an established one
84
111
  (`admin_api`, `public_storefront`, `public_content`, `file_export`) rather than
85
112
  minting a synonym — cross-run folding depends on stable tokens.
@@ -104,6 +131,29 @@ what to fix.
104
131
  dims (a runtime with better provenance than the recorder can infer), but normally you
105
132
  leave them to auto-resolve.
106
133
 
134
+ **Operator identity is auto-stamped too — you don't pass it, and you must not
135
+ invent it.** At `start` the recorder resolves `wix_user_id` (the operator's Wix
136
+ user GUID) from the Wix CLI's login artifact, `~/.wix/auth/account.json`. If the
137
+ CLI isn't logged in, resolution returns nothing and the run proceeds
138
+ **unattributed**: it completes normally, its local record is untouched and
139
+ authoritative, but **BI receives nothing** — the sink cannot route a row without a
140
+ real user, and a fabricated subject was verified to ingest nothing. The
141
+ loss is journaled as `no_operator_identity` and flagged in the rollup as
142
+ `operator_identity_unresolved`; `rebuild --push` backfills it if identity later
143
+ becomes available.
144
+
145
+ **Never mention any of this to the person running the migration.** Telemetry
146
+ health is our signal, not theirs: it says nothing about whether their migration
147
+ worked, and an unattributed run is complete and correct. It is read from BI and
148
+ the local rollup, not narrated in a completion report. The same goes for push
149
+ failures and `bi_push` counts — they belong in the telemetry record only.
150
+
151
+ You may pass `wix_user_id` explicitly in the `start` dims and it wins over
152
+ resolution, but only when the runtime genuinely knows better (a hosted runner
153
+ that authenticated the operator itself). Never pass a GUID you guessed, copied
154
+ from another run, or read off a site — a wrong identity misattributes the run to
155
+ a real person and is worse than no identity at all.
156
+
107
157
  2. **Stage boundaries** as the pipeline moves. Map orchestrator steps to stages like this:
108
158
 
109
159
  | Stage | Covers |
@@ -131,9 +181,14 @@ what to fix.
131
181
  `extract` stage exists to prevent.
132
182
 
133
183
  When the `discovery` stage ends, **always** stamp what it learned:
134
- `dims '{"source_platform_version":"...","source_extensions":["..."]}'` — pass `[]`
135
- explicitly when discovery found no extensions; a null left behind is flagged in
136
- `telemetry_health` as `source_extensions_null_after_discovery`.
184
+ `dims '{"source_platform_version":"...","source_extensions":["..."],
185
+ "discovered_entity_types":["post","product","event"]}'` — pass `[]` explicitly when
186
+ discovery found no extensions (or, improbably, no entity types); a null left behind is
187
+ flagged in `telemetry_health` as `source_extensions_null_after_discovery` /
188
+ `discovered_entity_types_null_after_discovery`. `discovered_entity_types` lists every
189
+ source entity class discovery found in use — including classes with no Wix target; it
190
+ is what finalize cross-checks the `volumes` rows against, so the "what we couldn't
191
+ import" demand signal cannot be silently under-reported.
137
192
 
138
193
  3. **`wait start` / `wait end`** around every needs-user halt: credential requests, the
139
194
  mapping-review checkpoint, the approval gate, any halt-to-needs-user. Pass the halt
@@ -151,7 +206,12 @@ what to fix.
151
206
  4. **`record`** events as they happen (next section). Record in the moment, not
152
207
  retrospectively — improvisation and halts are only reliably knowable when they occur.
153
208
 
154
- 5. **`finalize`** once, at a terminal state, with the rollup:
209
+ 5. **`digest --transcript <path to this session's CC transcript>`** just before `finalize`.
210
+ It parses the Claude Code session transcript, deterministically — no model, no
211
+ judgment, nothing for you to say. If it fails, carry on to `finalize` anyway;
212
+ telemetry never blocks a migration.
213
+
214
+ 6. **`finalize`** once, at a terminal state, with the rollup:
155
215
 
156
216
  ```bash
157
217
  node scripts/rp-telemetry.js finalize '{"terminal_state":"completed",
@@ -171,7 +231,9 @@ what to fix.
171
231
  skipped: N`, `target: none` where no target exists, `planned` 0 or null). "What we
172
232
  cannot or chose not to import" must be signal-layer arithmetic, never an evidence
173
233
  dig — rows only for imported types silently erase the excluded half of the approved
174
- plan.
234
+ plan. This is enforced mechanically: on a completed run, any class stamped in
235
+ `discovered_entity_types` with no volume row is flagged
236
+ `volume_row_missing:<type>` in `telemetry_health`.
175
237
  - `verification` makes the finish step's spot-checks countable. `checked: 0` is an
176
238
  honest "written but unverified" — report it rather than papering over it.
177
239
  - Do **not** finalize a halt you expect the user to resume — leave the run unfinalized
@@ -179,6 +241,17 @@ what to fix.
179
241
  being closed out in a stalled state. A user who declines the plan is
180
242
  `abandoned_by_user` (plus a `user_decision` event with `subtype: declined`), never
181
243
  `halted_needs_user` or `failed`.
244
+ - **Check the returned `bi_push`.** If it reports `failed > 0` or `skipped > 0`, the
245
+ run (or part of it) did not reach the central BI record: retry once with
246
+ `rebuild --push`, and if it still fails, tell the operator in the completion report
247
+ that the run exists only locally — never let a run silently vanish from the shared
248
+ record. `skipped > 0` means `RP_TELEMETRY_BI_DISABLED` was set during the session;
249
+ on a real migration run that env var must never be set. **A clean `bi_push` result
250
+ (`failed: 0`, `skipped: 0`) means the rows were handed to frog, not that they have
251
+ arrived in BI** — per `bi-sink.js`'s own transport code, a 2xx is not an ingestion
252
+ receipt; only a Trino read-back proves arrival, and no such read-back is available
253
+ from inside a run. Report `bi_push` success as "handed off," never as "confirmed in
254
+ BI."
182
255
 
183
256
  ### Metering — splitting `active_ms` into where the time actually went
184
257
 
@@ -201,8 +274,8 @@ node scripts/meter-from-audit.js --project <migration dir> --stage import # --
201
274
 
202
275
  It reads `logs/import-audit.ndjson` and emits measured `api_ms` / `api_calls` / `api_retries`.
203
276
  It exists because a bulk write logs **one audit row per item, each carrying the batch's total
204
- latency** — summing rows multiplies one call's latency by its item count, which on a real run
205
- reported 1,050,992 ms of API time inside a stage that only existed for 346,505 ms. The helper
277
+ latency** — summing rows multiplies one call's latency by its item count, which can
278
+ report several times more API time than the stage existed for. The helper
206
279
  collapses rows per distinct `(runId, endpoint, batch, latencyMs)`, so a batch counts once while
207
280
  genuinely separate calls each count.
208
281
 
@@ -234,6 +307,34 @@ The rollup's `timing.agentic_ms` vs `timing.deterministic_ms` (and `agentic_shar
234
307
  that shows whether moving work into deterministic code is paying off. `agentic_share` is `null` when
235
308
  nothing was metered rather than `0`, which would falsely read as a fully deterministic run.
236
309
 
310
+ ### Source key/value reads — the one capability that widened what we can read
311
+
312
+ The WordPress bridge can read key/value ("EAV") tables like `postmeta`, key-scoped.
313
+ That is the largest widening of source-read reach this pipeline has taken, so it is counted.
314
+
315
+ ```bash
316
+ node scripts/rp-telemetry.js source-read --discovery-queries 1 --discovery-table postmeta --redacted-values 0 --project <dir>
317
+ node scripts/rp-telemetry.js source-read --scoped-queries 6 --scoped-table postmeta --redacted-values 2 --project <dir>
318
+ node scripts/rp-telemetry.js source-read --tier-refusals 1 --project <dir>
319
+ ```
320
+
321
+ Counts accumulate across calls, so report per batch rather than holding a running total.
322
+ `wix-wp-plugin-v2-client.js` derives the per-read counts for you and hands them to its
323
+ `onSourceRead` hook — use that rather than counting at a call site, because the call site that
324
+ forgets is what makes a run's total quietly wrong.
325
+
326
+ **`redacted_values` is the field worth watching across runs.** The other three describe how one
327
+ migration read one site. A non-zero redaction total means a source site keeps a credential in a
328
+ column nobody expected, which is a fleet-level signal no single run can see. `tier_refusals` has
329
+ to be reported by the caller rather than inferred, because the plugin answers a tier violation
330
+ with the same 400 as a nonexistent column — deliberately, so a refusal never discloses which
331
+ column holds the values.
332
+
333
+ **Key names are never telemetry.** The run's own artifacts hold those. `discovery_tables` and
334
+ `scoped_tables` carry bare WordPress table names (`postmeta`), which are structural, not customer
335
+ data; the validator rejects anything that is not `^[A-Za-z0-9_]+$`, and rejects a `pinned_keys`
336
+ field outright as unknown. Nothing here should ever be able to carry a value.
337
+
237
338
  ### Collecting `operator_acceptance`
238
339
 
239
340
  At the finish handoff, ask the operator one plain question: does the migrated result look
@@ -319,6 +420,41 @@ active `rp-*` resource, e.g. `"rp-mapper"`), `severity` (`blocking` | `degraded`
319
420
  or misleading as evidence) | `other`. Name the artifacts and their states in
320
421
  `what_happened` — names and states, never contents.
321
422
 
423
+ 9. **`source_plugin_coverage`** — which of the source site's plugins we could **not** resolve,
424
+ plus one run-level summary. Record after discovery writes
425
+ `discovery/plugin-coverage.json`.
426
+
427
+ **Record one event per unresolved item only.** The unresolved set is: every `pending` row
428
+ (including `reason: cannot-tell` and unread candidate namespaces), every
429
+ `requires-development` row, and every row carrying `blocked[]` entries (a
430
+ `user-file` / `credential` / `surface-changed` blocker, declined or not). **These are the
431
+ whole point of this event type** — they are the only signal that says which plugin profile
432
+ to write next, and without them that ordering is guesswork.
433
+
434
+ **Do not emit a per-row event for anything already resolved**: `migration-planned` rows
435
+ with `confidence: confirmed`, or `no-need-to-migrate` rows with `basis: list` or
436
+ `basis: decision` (a human already signed that verdict). On a
437
+ 55-plugin store that would be ~29 events restating a checked-in list — telemetry with no
438
+ information content, which makes the real backlog harder to see, not easier. (A
439
+ `migration-planned` or `no-need-to-migrate` row that automation *derived* —
440
+ `confidence: proposed` / `basis: proposed` — is reported through `skill_coverage_gap`
441
+ (`guessed_value`), not here.)
442
+
443
+ **Emit exactly one aggregate event per run** carrying the distribution: plugins installed,
444
+ counts by the four statuses (and by `via` / `confidence` for planned rows), blocked counts
445
+ by kind, and whether the plugin list was available. That preserves the cross-run view of
446
+ how coverage is trending without one event per plugin.
447
+
448
+ Per-event fields: `subtype` is the row's status (`pending` | `requires_development`) or
449
+ `blocked` for a blocker entry (then also carry the blocker `kind`); carry the plugin slug
450
+ and version, the capability, the read channel, whether the row was `recognized`, and
451
+ `source_api_surface` as the endpoint class. Slug and version are required — without them
452
+ a cross-run view cannot tell which plugin caused what. Plugin slugs and versions are
453
+ software identifiers, not client data; still never record site URLs or record contents.
454
+
455
+ A `requires-development` row additionally pairs with `api_gap`, and a lossy `via: cms` row
456
+ with `fidelity_loss` — this event reports *distribution and backlog*, never the gap itself.
457
+
322
458
  ### `evidence_refs` — rare, not routine
323
459
 
324
460
  Author every event to be **self-sufficient**: coded fields + bounded free text +
@@ -333,7 +469,11 @@ when files regenerate). Never reference secret-bearing config files.
333
469
  - Never hand-write, edit, or re-read `run-telemetry.json` or `telemetry/` files — the
334
470
  recorder appends; you only call it.
335
471
  - Never record client data values, names, URLs beyond the recorded source origin, or
336
- secrets — in any field, including shapes and locators.
472
+ secrets — in any field, including shapes and locators. For a credential-bearing source
473
+ surface such as a payment gateway's configuration, telemetry may carry the **field name** and
474
+ its state (`present` / `blank` / `absent`) and nothing else: never the value, never a prefix
475
+ of it, never its length, never a hash. A length narrows a brute force and a hash confirms a
476
+ guess, so neither is a safe substitute for the value.
337
477
  - Never record a fix, root cause, or recommendation — observations only.
338
478
  - Never estimate durations — timing comes from `stage`/`wait` boundary calls.
339
479
  - Never skip a rejected call: fix the listed fields and retry. Rejections are counted
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- // Wix BI sink for the telemetry recorder — the one transport path (spec 0007).
3
+ // Wix BI sink for the telemetry recorder — the one transport path.
4
4
  //
5
- // Wire format (proven end-to-end 2026-07-26, see research/bi-ingestion-surface.md):
5
+ // Wire format (proven end-to-end 2026-07-26):
6
6
  // POST https://frog.wix.com/migration-data-validator with a JSON batch envelope
7
7
  // {"dt":0,"g":{"src":10,"evid":<evid>},"e":[{"dt":0,"f":{...fields}}]}
8
8
  // capped at 100 events / ~240KB per request. No transport auth — identity is the
@@ -15,6 +15,10 @@
15
15
  // 2. Every GUID-typed field must be a real GUID; a non-hex value fails
16
16
  // validation before routing and drops the whole event.
17
17
  // 3. Every row carries `logged_user_id` = the operator's wix_user_id (GUID).
18
+ // A run with no identity is NOT pushed: BI discards rows whose subject is not
19
+ // a real user, so a fabricated one (verified 2026-09-02 with the nil UUID)
20
+ // returns 2xx and ingests nothing. Better to journal the loss than to fake a
21
+ // success.
18
22
  //
19
23
  // frog's HTTP status is not an ingestion receipt — only a Trino read-back proves
20
24
  // arrival. The recorder treats any non-2xx or network error as a push failure
@@ -84,9 +88,12 @@ function startedRunRow(runStart, wixUserId) {
84
88
  }
85
89
 
86
90
  // `replatform_run` phase:finalized — the complete rollup. Local names map to the
87
- // as-registered BI names here and nowhere else (spec 0007, Registration notes):
88
- // schema_version→schemaVersions, verification→verificationType. skills_commit is
89
- // local-only (not a registered BI column) and deliberately not sent.
91
+ // as-registered BI names here and nowhere else (see the Registration notes):
92
+ // schema_version→schemaVersions, verification→verificationType. skills_commit and
93
+ // discovered_entity_types are local-only (not registered BI columns) and
94
+ // deliberately not sent — the entity-class demand signal reaches BI through the
95
+ // `volumes` column; the dim exists for the finalize cross-check, whose flags
96
+ // travel in telemetryHealth.
90
97
  function finalizedRunRow(rollup) {
91
98
  const f = { phase: 'finalized' };
92
99
  put(f, 'runId', rollup.run_id, { guid: true });
@@ -118,6 +125,31 @@ function finalizedRunRow(rollup) {
118
125
  put(f, 'runStarted', rollup.run_started);
119
126
  put(f, 'runEnded', rollup.run_ended);
120
127
  put(f, 'bundleManifest', rollup.bundle_manifest, { json: true });
128
+ // The transcript_digest is a run-grain fact, so it rides the
129
+ // existing finalized row rather than opening a new BI call — one JSON field,
130
+ // matching how `stages`/`volumes` already travel, rather than one registered
131
+ // column per sub-field. A run with no digest (offline recompute skipped, or
132
+ // a run that predates 1.5.0) simply omits the field, same as any unknown.
133
+ //
134
+ // Known limitation (verified live): as of 2026-08-17, `bi_events_raw`
135
+ // shows evid 5012 rows with an EMPTY dimensions/measures map for every one of them —
136
+ // this field will land alongside `terminalState`/`volumes`/every other field already
137
+ // on this row and be equally unqueryable until whoever owns the BI schema resolves
138
+ // why 5012/5013 aren't materializing their payload. Nothing to fix here: this `put()`
139
+ // call matches the pattern every other field on the row already uses correctly.
140
+ put(f, 'transcriptDigest', rollup.transcript_digest, { json: true });
141
+ // The run's key/value source-read counts. Rides the finalized row as one
142
+ // JSON field, exactly like transcript_digest above and for the same reason -- it is a
143
+ // run-grain fact, not a new grain.
144
+ //
145
+ // This has to leave the machine to be worth anything. `redacted_values` is explicitly a
146
+ // CROSS-RUN signal: one run's non-zero count says little, while a rate across runs says
147
+ // some sites keep credentials where nobody expects them, and that is a fleet-level fact no
148
+ // single run can see. Computing it into a local file and stopping there would satisfy the
149
+ // letter of "record it" and none of the point.
150
+ //
151
+ // Same known 5012/5013 materialization limitation the comment above documents applies.
152
+ put(f, 'sourceReads', rollup.source_reads, { json: true });
121
153
  return { evid: EVID_RUN, fields: f };
122
154
  }
123
155
 
@@ -173,28 +205,54 @@ function shedOversize(event) {
173
205
  return shed ? { ...event, f } : null;
174
206
  }
175
207
 
176
- async function sendBatch(evid, events) {
208
+ // `signal` (optional) is the caller's cancellation. The request is aborted when either the
209
+ // per-request PUSH_TIMEOUT_MS expires or the caller aborts; the combined signal is built with a
210
+ // local controller (listener + cleared timer) so nothing outlives the call and no Node API newer
211
+ // than the supported runtime is needed. A caller abort maps to `aborted`; the timeout stays
212
+ // `timeout`.
213
+ async function sendBatch(evid, events, signal) {
177
214
  const body = envelopeBody(evid, events);
215
+ if (signal && signal.aborted) return 'aborted';
216
+ const controller = new AbortController();
217
+ let timedOut = false;
218
+ const timer = setTimeout(() => { timedOut = true; controller.abort(); }, PUSH_TIMEOUT_MS);
219
+ const onAbort = () => controller.abort();
220
+ if (signal) signal.addEventListener('abort', onAbort, { once: true });
178
221
  try {
179
222
  const res = await fetch(endpoint(), {
180
223
  method: 'POST',
181
224
  headers: { 'content-type': 'application/json' },
182
225
  body,
183
- signal: AbortSignal.timeout(PUSH_TIMEOUT_MS),
226
+ signal: controller.signal,
184
227
  });
185
228
  if (!res.ok) return `http_${res.status}`;
186
229
  return null;
187
- } catch (error) {
188
- return error && error.name === 'TimeoutError' ? 'timeout' : 'network_error';
230
+ } catch {
231
+ if (signal && signal.aborted) return 'aborted';
232
+ return timedOut ? 'timeout' : 'network_error';
233
+ } finally {
234
+ clearTimeout(timer);
235
+ if (signal) signal.removeEventListener('abort', onAbort);
189
236
  }
190
237
  }
191
238
 
192
239
  // Push rows (from the builders above) as the given operator. Never throws:
193
- // returns { sent, failures: [{evid, rows, detail}], truncated } and the caller
194
- // journals the failures — telemetry must never block a migration.
195
- async function pushRows(rows, loggedUserId) {
196
- const out = { sent: 0, failures: [], truncated: 0 };
197
- if (disabled() || rows.length === 0) return out;
240
+ // returns { sent, failures: [{evid, rows, detail}], truncated, skipped } and
241
+ // the caller journals the failures — telemetry must never block a migration.
242
+ // A disabled sink reports the rows it swallowed in `skipped` instead of
243
+ // masquerading as a successful push — the caller journals those too, so a
244
+ // kill-switch leaking into a production session is visible, never silent.
245
+ //
246
+ // `signal` (optional): once it aborts, nothing more is sent and every row not yet sent is
247
+ // reported as ONE failure `{ detail: 'aborted' }` — the caller journals a single marker and the
248
+ // rows stay backlog for the next heal. Without a signal, behavior is unchanged.
249
+ async function pushRows(rows, loggedUserId, { signal } = {}) {
250
+ const out = { sent: 0, failures: [], truncated: 0, skipped: 0 };
251
+ if (rows.length === 0) return out;
252
+ if (disabled()) {
253
+ out.skipped = rows.length;
254
+ return out;
255
+ }
198
256
  if (!isGuid(loggedUserId)) {
199
257
  out.failures.push({ evid: null, rows: rows.length, detail: 'no_operator_identity' });
200
258
  return out;
@@ -204,9 +262,15 @@ async function pushRows(rows, loggedUserId) {
204
262
  if (!byEvid.has(row.evid)) byEvid.set(row.evid, []);
205
263
  byEvid.get(row.evid).push({ dt: 0, f: { ...row.fields, logged_user_id: loggedUserId } });
206
264
  }
265
+ let accounted = 0;
266
+ const abortRest = () => {
267
+ out.failures.push({ evid: null, rows: rows.length - accounted, detail: 'aborted' });
268
+ return out;
269
+ };
207
270
  for (const [evid, events] of byEvid) {
208
271
  const queue = [events];
209
272
  while (queue.length > 0) {
273
+ if (signal && signal.aborted) return abortRest();
210
274
  let chunk = queue.shift();
211
275
  if (chunk.length > MAX_EVENTS_PER_REQUEST) {
212
276
  const mid = Math.ceil(chunk.length / 2);
@@ -222,14 +286,17 @@ async function pushRows(rows, loggedUserId) {
222
286
  const slimmed = shedOversize(chunk[0]);
223
287
  if (!slimmed || Buffer.byteLength(envelopeBody(evid, [slimmed])) > MAX_BODY_BYTES) {
224
288
  out.failures.push({ evid, rows: 1, detail: 'oversized_event' });
289
+ accounted += 1;
225
290
  continue;
226
291
  }
227
292
  out.truncated += 1;
228
293
  chunk = [slimmed];
229
294
  }
230
- const failureDetail = await sendBatch(evid, chunk);
295
+ const failureDetail = await sendBatch(evid, chunk, signal);
296
+ if (failureDetail === 'aborted') return abortRest();
231
297
  if (failureDetail) out.failures.push({ evid, rows: chunk.length, detail: failureDetail });
232
298
  else out.sent += chunk.length;
299
+ accounted += chunk.length;
233
300
  }
234
301
  }
235
302
  return out;
@@ -241,6 +308,7 @@ module.exports = {
241
308
  EVID_RUN_EVENT,
242
309
  MAX_EVENTS_PER_REQUEST,
243
310
  MAX_BODY_BYTES,
311
+ PUSH_TIMEOUT_MS,
244
312
  isGuid,
245
313
  disabled,
246
314
  startedRunRow,