@wix/agent-skills 1.31.2 → 1.33.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 (43) hide show
  1. package/README.md +4 -12
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +39 -15
  4. package/skills/wix-app/references/BACKEND_API.md +1 -1
  5. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +47 -45
  6. package/skills/wix-app/references/SDK_MODULE_MAP.md +1 -1
  7. package/skills/wix-app/references/STORES_VERSIONING.md +24 -2
  8. package/skills/wix-app/references/dashboard-page/DATA_SOURCES.md +9 -13
  9. package/skills/wix-app/references/dashboard-page/IMAGE_RENDERING.md +61 -0
  10. package/skills/wix-app/references/editor-react-component/ACCESSIBILITY.md +54 -64
  11. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +25 -27
  12. package/skills/wix-app/references/editor-react-component/COMPONENT-CONTRACT.md +37 -30
  13. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +43 -29
  14. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +42 -42
  15. package/skills/wix-app/references/editor-react-component/DISABLED-INVALID.md +31 -0
  16. package/skills/wix-app/references/editor-react-component/MANIFEST-ERRORS.md +14 -1
  17. package/skills/wix-app/references/editor-react-component/PARTS.md +40 -9
  18. package/skills/wix-app/references/editor-react-component/PROPS-VS-CSS.md +22 -2
  19. package/skills/wix-app/references/editor-react-component/SSR.md +6 -3
  20. package/skills/wix-app/scripts/scan-a11y-eslint.cjs +39 -16
  21. package/skills/wix-app/scripts/sdk-curated.json +45 -0
  22. package/skills/wix-app/scripts/sdk-lookup.cjs +1180 -0
  23. package/skills/wix-base44-connector/SKILL.md +4 -2
  24. package/skills/wix-base44-connector/scripts/utils.cjs +5 -2
  25. package/skills/wix-headless-kit/SKILL.md +4 -1
  26. package/skills/wix-headless-kit/guides/api-run.md +14 -20
  27. package/skills/wix-headless-kit/install/pins.json +1 -1
  28. package/skills/wix-manage/SKILL.md +30 -8
  29. package/skills/wix-manage/references/automations/actions.md +134 -0
  30. package/skills/wix-manage/references/automations/activation-status.md +64 -48
  31. package/skills/wix-manage/references/automations/api-catalog.md +213 -77
  32. package/skills/wix-manage/references/automations/automation-model.md +199 -0
  33. package/skills/wix-manage/references/automations/bracket-expressions.md +132 -0
  34. package/skills/wix-manage/references/automations/build-and-manage-automations.md +305 -26
  35. package/skills/wix-manage/references/automations/triggers.md +190 -0
  36. package/skills/wix-manage/references/collaborators/manage-site-collaborators.md +128 -0
  37. package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +3 -1
  38. package/skills/wix-manage/references/forms/read-forms-and-submissions.md +277 -0
  39. package/skills/wix-manage/references/forms/update-form.md +5 -0
  40. package/skills/wix-manage/references/seo/manage-url-redirects.md +33 -4
  41. package/skills/wix-manage/references/sites/create-headless-site.md +14 -5
  42. package/skills/wix-manage/references/sites/upload-static-site.md +373 -302
  43. package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +3 -3
@@ -111,7 +111,7 @@ const wx = require(require("path").resolve(P));
111
111
  - `wx.bash(cmd)` — shell over saved files (GNU grep/sed; awk is mawk; no rg)
112
112
  - `wx.spec(docsUrl | code)` — a method's exact schema, plus the titles of the docs' own request examples saved at `examplesPath`; pass a hit's docsUrl (direct load), or raw code to query the index yourself
113
113
  - `wx.mgmtRecipes(q?)` — management-recipe index; no arg → categories, a word → matching recipes
114
- - `wx.ensureOAuthApp(token, { name, redirectUris, redirectDomains })` — the headless OAuth app, found by name or created, with the redirect lists merged into whatever it already allows; returns `{ clientId, created }`. `clientId` is what the browser mints visitor tokens from. Run it whenever `context` reports no OAuth app, or before any Wix-hosted flow that returns to this app — see Visitor authentication and Wix-hosted flows
114
+ - `wx.ensureOAuthApp(token, { name, redirectUris, redirectDomains })` — the headless OAuth app, found by name or created with `origin: "base44-app"`, with the redirect lists merged into whatever it already allows; returns `{ clientId, created }`. `clientId` is what the browser mints visitor tokens from. Run it whenever `context` reports no OAuth app, or before any Wix-hosted flow that returns to this app — see Visitor authentication and Wix-hosted flows
115
115
  - `wx.installApp(appDefId, siteId, token)` — install a Wix app on the site (Apps Installer). If discovery finds an API whose app isn't installed on the site, install it first — that's a one-call prerequisite, **not** a reason to fall back to a hand-built alternative. `appDefId` from `search` or the Apps-Created-by-Wix table; `siteId` from `context` (the site report)
116
116
 
117
117
  Search makes one combined request across REST, management recipes, and Headless by default.
@@ -363,7 +363,9 @@ creating the OAuth app when the site has none and adding your URLs to its lists
363
363
  has one. Returns only complete for URLs in those lists, and a missing one breaks silently —
364
364
  create-checkout and the anonymous token still succeed — until a real buyer is redirected and
365
365
  stranded on Wix. It is idempotent by name: never create a second OAuth app for the same Base44
366
- app, or the first `clientId`'s returns stop working.
366
+ app, or the first `clientId`'s returns stop working. The app is created with `origin: "base44-app"`,
367
+ the name of this flow on the OAuth app; `origin` is set at creation only, so an OAuth app created
368
+ by hand carries the same value in its create call.
367
369
 
368
370
  ```js
369
371
  // Register BOTH of this app's own URLs — its preview URL and its published URL — so returns work
@@ -432,7 +432,10 @@ async function installApp(appDefId, siteId, token) {
432
432
  // return needs. Idempotent by name — a site reached by the "connect an existing site" flow
433
433
  // has none, and creating a second one for the same app strands the first app's returns.
434
434
  // Redirect lists are merged, never replaced: an app that already serves a custom domain
435
- // keeps it when a preview URL is added.
435
+ // keeps it when a preview URL is added. `origin` names the flow that created the app; it is
436
+ // written once, at creation, and an update leaves it as it is.
437
+ const OAUTH_APP_ORIGIN = "base44-app";
438
+
436
439
  async function ensureOAuthApp(token, { name, redirectUris = [], redirectDomains = [] }) {
437
440
  const { oAuthApps = [] } = await post(
438
441
  "https://www.wixapis.com/oauth-app/v1/oauth-apps/query", { query: {} }, token);
@@ -440,7 +443,7 @@ async function ensureOAuthApp(token, { name, redirectUris = [], redirectDomains
440
443
  const merge = (a = [], b = []) => [...new Set([...a, ...b])];
441
444
  if (!existing) {
442
445
  const { oAuthApp } = await post("https://www.wixapis.com/oauth-app/v1/oauth-apps", {
443
- oAuthApp: { name, allowedRedirectUris: redirectUris, allowedRedirectDomains: redirectDomains },
446
+ oAuthApp: { name, allowedRedirectUris: redirectUris, allowedRedirectDomains: redirectDomains, origin: OAUTH_APP_ORIGIN },
444
447
  }, token);
445
448
  return { clientId: oAuthApp.id, created: true, oAuthApp };
446
449
  }
@@ -294,7 +294,10 @@ only after an explicit yes, never automatically. Step 5 ends with the same self-
294
294
  `https://manage.wix.com/dashboard/<siteId>` (the `siteId` of the `ready_for_brand_layer`
295
295
  event: on a migration preview that is the migrated site's dashboard, the release URL is the
296
296
  preview's, the original site is unchanged, and completing the migration is the user's next
297
- step in the Wix CLI once they approve — say all three). When the site takes money through
297
+ step in the Wix CLI once they approve — say all three). Tell the user how to put their own
298
+ domain on the site, per the `wix-manage` recipe `references/domains/domain-search-purchase-and-connect.md`
299
+ (installed beside this skill, else `https://www.wix.com/skills/wix-manage/references/domains/domain-search-purchase-and-connect.md`):
300
+ bought through Wix, or one they already own. When the site takes money through
298
301
  hosted checkout (a cart, a paid booking or rental, tickets, plans, donations) and nothing says
299
302
  payments are already set up, say what a visitor meets at checkout until they are — "We
300
303
  can't accept online payments. Contact us for help with your order." — and hand the two links
@@ -76,7 +76,7 @@ A brief that needs no solution (a game, a landing page, a tool) is a run of two
76
76
  ## 2. The site
77
77
 
78
78
  The CLI's `npm create @wix/new` is one call: `POST /headless-business-setup/v1/headless-business/provision`,
79
- with `origin: agent-<your-id>`, a name, and the solutions to install as `seedOptions`. The recipe
79
+ with `origin: "drop"`, a name, and the solutions to install as `seedOptions`. The recipe
80
80
  is `{MANAGE}/references/sites/create-headless-site.md`; it returns the `metaSiteId` and the
81
81
  site's OAuth client `appId`. Do not create a site any other way: a project from Create Project or
82
82
  a template is neither headless nor publishable, and a later run with a machine cannot attach to it.
@@ -95,9 +95,10 @@ Restaurants, Donations, FAQ), goes on with the Apps Installer:
95
95
 
96
96
  `seed-{solution}.mjs` is a sequence of REST calls, and `SEED.md` is its contract: the plan shape
97
97
  (what to create, how many, which images), the order the entities need, the request bodies and the
98
- traps the script encodes. Read `SEED.md` before the first create: it maps the brief's words to the
99
- fields, and the script's builder functions turn those fields into each request, so the bodies you
100
- send are the ones they build. A call `SEED.md` only names is made through `{MANAGE}`'s recipe for
98
+ traps the script encodes. Write the seed as your own `ExecuteWixAPI` script, its calls made on the
99
+ new site: `wix.request({ scope: "site", siteId: <the metaSiteId>, … })`. Read `SEED.md` before
100
+ the first create: it maps the brief's words to the fields. Build each request body in your script the
101
+ way the script's builder functions do. A call `SEED.md` only names is made through `{MANAGE}`'s recipe for
101
102
  it. Keep the script's rules: create, never delete, and report what the site already held. The closing
102
103
  names entities you drafted as placeholders.
103
104
 
@@ -142,25 +143,20 @@ takes the complete file set in one call and a response has a hard size limit; th
142
143
  later" section downloads what the site serves, so a later drop adds files to a live set without
143
144
  resending what is already there.
144
145
 
145
- **When it cannot**, or when its output would all have to be written out by hand, a page that loads
146
- the Wix SDK from a package CDN and talks to the site as a visitor. One file per call, a few hundred lines, written in full inside that call: a response has a
146
+ **When it cannot**, or when its output would all have to be written out by hand, a page that talks
147
+ to the site as a visitor over plain `fetch`. One file per call, a few hundred lines, written in full inside that call: a response has a
147
148
  hard size limit, and a call that carries the whole frontend at once exceeds it. A second file joins
148
149
  the first the recipe's way, "Change it later": the same call downloads the live set and drops the
149
150
  union. The
150
- SDK comes from a pinned package URL, `https://esm.sh/@wix/sdk@{version}` and the solution's package
151
- (`@wix/bookings`, `@wix/stores`, `@wix/blog`, …); the client is
152
- `createClient({ modules: { … }, auth: OAuthStrategy({ clientId }) })` with the `appId` the provision
153
- call returned, and the SDK mints and refreshes the visitor token itself. Markup, a render function
151
+ page calls the Wix REST API with `fetch` and mints the visitor token itself with the `appId` the
152
+ provision call returned, as `{TEMPLATES}/shared/rest/client.ts` does. Markup, a render function
154
153
  per state, the event handlers: that is what you write. Keep what the page shows to what the site
155
154
  holds; nothing invented, as in SKILL.md step 4.
156
155
 
157
- **The calls**, on that second path, take their shape from the kit's own transport for the solution,
158
- `{TEMPLATES}/{solution}/app/wix/{solution}/*.ts` (`services.ts`, `booking.ts`, `catalog.ts`, …,
159
- with `{TEMPLATES}/shared/app/wix/sdk.ts` for the client wiring): those files call the same SDK
160
- modules the page imports, and they are verified. Copy the form of the call, not the file. A page
161
- that talks to Wix over plain `fetch`, with no SDK, takes them from the REST twins instead:
156
+ **The calls**, on that second path, take their shape from the kit's REST twins for the solution:
162
157
  `{TEMPLATES}/shared/rest/client.ts` (the visitor token and the request) and
163
158
  `{TEMPLATES}/{solution}/rest/*.ts` (the calls), each importing its helpers by their real paths.
159
+ They are verified. Copy the form of the call, not the file.
164
160
  The cores,
165
161
  `{TEMPLATES}/{solution}/app/wix/{solution}/*-core.ts`, hold the rules the page needs and nothing else
166
162
  does: which fields to read, how a price or a duration is formatted, which slot is bookable, how an
@@ -170,11 +166,9 @@ a translatable object, a quantity a nested one). What you write is the markup, t
170
166
  the cores return, and the event handlers.
171
167
 
172
168
  **A call those files don't cover** is confirmed before it is written, the way `{DOCS}` describes:
173
- the method's SDK page, and when the page and the package disagree, the package's own type
174
- declarations (the `@wix/auto_sdk_{solution}_<module>` package the solution package depends on,
175
- its `index.d.ts`) are the truth. Two shapes that recur, as examples of what the types settle and
176
- the kit's files already encode: SDK query methods return a query builder finished with `.find()`;
177
- and an entity's id arrives as `_id` on some objects and `id` on others (the kit reads both,
169
+ the method's REST page, and its schema (SearchWixAPISpec on the method's docs URL) for the exact
170
+ request and response. A shape that recurs, as an example of what the kit's files already encode:
171
+ an entity's id arrives as `_id` on some objects and `id` on others (the kit reads both,
178
172
  `rawId`). Dates travel as local wall-clock strings in the business time zone.
179
173
 
180
174
  **The check**, before every upload: a page cannot be opened here, so a wrong shape fails silently in
@@ -3,6 +3,6 @@
3
3
  "@wix/create-new": "0.0.124",
4
4
  "typescript": "5.8.3",
5
5
  "templates": {
6
- "ref": "v1.31.2"
6
+ "ref": "v1.33.0"
7
7
  }
8
8
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wix-manage
3
- description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: automations, stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
3
+ description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: automations, stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, collaborators, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
4
4
  compatibility: Requires Wix REST API access (API key or OAuth).
5
5
  ---
6
6
 
@@ -47,7 +47,7 @@ Lists all apps installed on a site using Apps Installer API. Useful for verifyin
47
47
  Read and update SEO titles and tags at the right level. For "change my site's SEO title", clarify homepage, specific page, or page-type pattern before discovery or writes; site-level tags accept meta tags only, never titles. Discover item IDs and pattern variables, read before every full-replace write, and report resolved tags with their sources.
48
48
 
49
49
  ### [Manage URL Redirects on a Wix Site](references/seo/manage-url-redirects.md)
50
- "Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites, batches of up to 500, and the change flow for a redirect that already exists. This API has no query, search, or update method: List Redirects is the only read-many. Redirects do not chain, so creating one that points at a path another redirect starts from permanently deletes that other redirect; list and check before every write."
50
+ "Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites, bulk creates of up to 100 and bulk deletes of up to 500, and the change flow for a redirect that already exists. This API has no query, search, or update method: List Redirects is the only read-many. Redirects do not chain, so creating one that points at a path another redirect starts from permanently deletes that other redirect; list and check before every write."
51
51
 
52
52
  ### [Generate and Read a Wix Site's Content Plan](references/seo/manage-content-plan.md)
53
53
  Generate an SEO content plan and read its blog post topics, or troubleshoot an existing content plan flow stuck at KEYWORD_RESEARCH while polling GetContentPlanFlow. Use this recipe for both generation and stalled-flow questions: it explains the intentional pause, the Create Content Plan release request, missing flow IDs, and the exact public API paths and response fields.
@@ -252,8 +252,11 @@ Routes discounts, coupons, sales and bundles to promotion recipes, and visual pr
252
252
  ### [Update Form](references/forms/update-form.md)
253
253
  "Changes a Wix form that already exists, with Form Schemas v4 `PATCH` — add a field to my form, add a dropdown, make a field required or optional, rename a label, reorder or retire a question. Covers reading the form back for its `revision` (and the required `namespace` query parameter), the whole-form body that a `PATCH` needs, the wholesale `formFields` replace that silently soft-deletes anything you omit, changing a field's component type in place, retiring a field that already has submissions, and the read-back that proves what was stored. Use whenever the form exists and the request changes what it collects; use Create Form when there is no form yet."
254
254
 
255
+ ### [Read Forms and Submissions](references/forms/read-forms-and-submissions.md)
256
+ "Reads a site's Wix forms and the submissions visitors sent to them — what forms do I have, find a form by name, show the latest submissions, who filled in my contact form, how many submissions did I get last week, submissions from one contact, unread submissions. Covers finding the form's namespace instead of guessing it, where that namespace goes on each read, the Form Schemas and Form Submissions endpoints (and the look-alike URLs that 404), forms hidden from a default listing, the closed list of submission fields you can filter and sort by, date ranges, cursor paging, totals per form, and reading answers by field. Read-only; changing a form is Update Form, building one is Create Form."
257
+
255
258
  ### [Forms Dashboard Navigation](references/forms/forms-dashboard-navigation.md)
256
- "Builds direct links to Wix Forms dashboard pages on manage.wix.com. The paths are not guessable and appear in no API reference, so take them from here: under `https://manage.wix.com/dashboard/{metaSiteId}/`, the forms list is `wix-forms`, a form's builder is `wix-forms/form/{formId}`, and that form's submissions are `wix-forms/form/{formId}/submissions` — there is no site-wide submissions page, and nothing lives under `contacts/forms`, `forms`, `form-builder` or `wix-forms-and-payments` (the legacy app). Also standalone forms, and each Forms entity paired with its read API so you can fetch one and hand back a 'view it in your dashboard' link."
259
+ "Builds direct links to Wix Forms dashboard pages on manage.wix.com. The paths are not guessable and appear in no API reference, so take them from here: under `https://manage.wix.com/dashboard/{metaSiteId}/`, the forms list is `wix-forms`, a form's builder is `wix-forms/form/{formId}`, and that form's submissions are `wix-forms/form/{formId}/submissions` — there is no site-wide submissions page, and nothing lives under `contacts/forms`, `forms`, `form-builder` or `wix-forms-and-payments` (the legacy app). Also standalone forms, and the dashboard link for each Forms entity; reading forms and submissions is Read Forms and Submissions."
257
260
 
258
261
  ---
259
262
 
@@ -390,13 +393,20 @@ Authoritative recipe for hand-authoring valid Ricos rich-content JSON (the richC
390
393
 
391
394
  ---
392
395
 
396
+ ## Collaborators
397
+
398
+ ### [Manage Site Collaborators](references/collaborators/manage-site-collaborators.md)
399
+ Manages who has access to a Wix site as a collaborator (contributor) — finds the site's current collaborators, invites someone, removes a collaborator, and resends or revokes a pending collaborator invite. Use when the user wants to give someone access to the site, take it away, or follow up on an invitation that has not been accepted.
400
+
401
+ ---
402
+
393
403
  ## Sites
394
404
 
395
405
  ### [Create Site from Template](references/sites/create-site-from-template.md)
396
406
  Creates new Wix sites from templates using account-level APIs. Covers template search, site creation, and publishing. Not for headless sites.
397
407
 
398
408
  ### [Create Headless Site](references/sites/create-headless-site.md)
399
- Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs. Creating, uploading, updating and connecting a backend are one flow, in Upload a Website or HTML Files.
409
+ Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs. The site is created and its pages put live by Upload a Website or HTML Files; a Wix Business Solution (a store, blog, bookings and more) is then integrated into it by the Wix Headless kit, from its cold start.
400
410
 
401
411
  ### [Manage OAuth Apps](references/sites/manage-oauth-apps.md)
402
412
  Create, read, update, and query OAuth apps for a Wix headless site. Each OAuth app's id is the client_id a frontend uses to mint anonymous visitor tokens and call Wix APIs.
@@ -417,7 +427,7 @@ Drive the Wix Site Import agent to migrate an existing store or site from anothe
417
427
  "Builds direct links to the account-level sites pages on manage.wix.com — the My Sites list (all sites in the account) and each site's own dashboard. Pairs the site list with the Query Sites read API. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
418
428
 
419
429
  ### [Upload a Website or HTML Files](references/sites/upload-static-site.md)
420
- Create and update a Wix Headless website by uploading its files — an index.html, a static build, a zip exported from an AI builder or any other tool, or pages you write for the user — as a live site in the user's Wix account. Covers every route: uploading with the user's identity (curl with a Wix CLI token, or the Wix MCP), publishing anonymously with a save link when you don't hold it, and the Wix Headless drop page; then updating the same site and URL, and connecting a Wix backend (stores, bookings, forms) through the headless skill. Use when the user wants to upload, publish, deploy or host HTML/CSS/JS as a new Wix site, their own or written for them, or to change a site published this way. Not for migrating a live store/site from another platform by URL or from CSV exports (use Site Import), not for adding HTML or custom code into an existing Wix site, and not for uploading images or documents to a site's media files.
430
+ Publish HTML, CSS, JavaScript or a static build as a Wix Headless website; inspect its deployed files and edit them on the same site and URL. Covers file and ZIP uploads, selective additions, replacements and deletions while preserving other files, full-site replacement, authenticated and anonymous publishing, verification, and connecting a Wix business backend. Use for files the user supplies or pages you create for them. Not for migrating a live site from another platform by URL or CSV (use Site Import), embedding code in an editor-built Wix site, or uploading assets to Media Manager.
421
431
 
422
432
  ---
423
433
 
@@ -454,16 +464,28 @@ Start here for existing Catalog V3 product updates, including digital products t
454
464
  ## Automations
455
465
 
456
466
  ### [Build and Manage Wix Automations](references/automations/build-and-manage-automations.md)
457
- Discover installed automation triggers and actions and inspect an automation’s current active status without changing site data.
467
+ Inspect Wix automations and their on/off status, create linear automations from the site’s installed triggers and actions, and turn automations on or off on request.
458
468
 
459
469
  <details>
460
470
  <summary>Internal skills (loaded on demand by Build and Manage Wix Automations — do NOT use directly)</summary>
461
471
 
462
472
  - [Automations API Catalog](references/automations/api-catalog.md)
463
- Discover installed automation triggers and actions and inspect their schemas through site-scoped public catalog APIs.
473
+ Discover site-specific triggers and actions, authenticate public Automation API calls, and choose the API for validation, persistence or catalog lookups.
474
+
475
+ - [Automations Graph and Data Model](references/automations/automation-model.md)
476
+ Assemble builder-editable automation graphs with valid node relationships, namespaces and ancestor data access.
477
+
478
+ - [Automations Trigger Configuration](references/automations/triggers.md)
479
+ Select and configure automation triggers, trigger filters and event payload schemas using the site catalog.
480
+
481
+ - [Automations Action Configuration](references/automations/actions.md)
482
+ Configure app-defined automation actions from their input schemas and preserve supported existing action mappings.
483
+
484
+ - [Automations Mapping Expressions](references/automations/bracket-expressions.md)
485
+ Write builder-compatible automation mapping expressions, literals and data references.
464
486
 
465
487
  - [Automations Activation Status](references/automations/activation-status.md)
466
- Read an automation’s current ACTIVE or INACTIVE status and distinguish it from historical run outcomes.
488
+ Read an automation’s current ACTIVE or INACTIVE status, and activate or deactivate it when the user asks.
467
489
 
468
490
  </details>
469
491
 
@@ -0,0 +1,134 @@
1
+ ---
2
+ name: "Automations Action Configuration"
3
+ description: "Configure app-defined automation actions from their input schemas and preserve supported existing action mappings."
4
+ ---
5
+
6
+ > **Stage scope:** this stage covers only what [Build and Manage Wix Automations](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) lists; do not perform anything marked "Later stages only" or any workflow that needs a guide marked "not yet published". "Stage", "Later stages only" and "not yet published" describe how this skill is being rolled out; never mention them to the user. Explain a limit in product terms: what can't be done through the API here and where the user can do it instead (for example, in the automations builder).
7
+
8
+ # App-Defined Actions — Discovery, Schemas, Input Mapping
9
+
10
+ **TL;DR**
11
+
12
+ - An action is `appId` + `actionKey`. Find real ones with **Resolve Actions** (site catalog), then read the version active on the site with **Get Runtime Action**. Never invent keys.
13
+ - The configuration is `appDefinedInfo.inputMapping`: an object keyed ONLY by input-schema property names, with values of the schema's type — literals, or `{{…}}` formulas in fields the UI schema marks as dynamic.
14
+ - Fields marked `updateSchemaOnChange: true` reveal more inputs once set → **Get Action Dynamic Input Schema**. Output that depends on configuration → **Get Action Dynamic Output Schema** after the mapping is final.
15
+ - **Later stages only — email is outside stage 2:** **Send an email** (`triggered-emails`): initialize each NEW step with **Generate Action Input Mapping**, persist the returned mapping unchanged, then configure content with Get / Set Email Content (Automations Email Actions (not yet published)). Existing content-only edits do not initialize another email.
16
+ - Entity-selector fields take **ids**, never display names (Automations Entity and Provider Configuration (not yet published)).
17
+ - Before accepting any action, prove its side effect and its recipient (§6).
18
+
19
+ ---
20
+
21
+ ## 1. APIs used here
22
+
23
+ Site-scoped (`wix-site-id` header), SDK module `actionCatalog`: Resolve Actions · Get Runtime Action (the version this site runs — use it) · Get Action Dynamic Input / Output Schema (+ bulk output). Paths and request shapes: [Automations API Catalog](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) §4.
24
+
25
+ ## 2. Finding the right action
26
+
27
+ 1. Resolve Actions with small pages (`{"query": {"paging": {"limit": 25}}}`); filter by `appId` when known, otherwise search locally over `displayName`, `description`, `actionKey` with a keyword ladder (phrase → domain verb/noun → synonyms).
28
+ 2. Read the `description`. A name like "Add a coupon" or "Get a …" can be a value-producing step that notifies nobody.
29
+ 3. Get Runtime Action for the 1–3 best candidates; build against that version's `inputSchema`, `outputSchema`, `interfaceConfiguration`.
30
+ 4. An action missing from Resolve Actions is not usable on this site. The builder shows such a step as "action not found" and blocks it.
31
+
32
+ **Do not use** unsupported or deprecated actions — `send-mail` (→ `triggered-emails`), `send-coupon-action` (→ `wixcoupons-retrieve_coupon` + a delivery step that uses its code), `wix_automations-velo_action`, `wix_automations-data_manipulation_code` (code variable; public Create refuses it — §4 of Automations Delays Variables and Branches (not yet published)), `whatsapp-send-message` (WhatsApp), `forward-to-zapier` (Zapier), and site actions `wix_automations-wix_api_integration` (non-public). Match these by `actionKey` (+ `appId`), not by app or display name — other actions of the same app are fine. Reasons and replacements: §2 of Automations Feasibility and Planning (not yet published) (site actions: §1).
33
+
34
+ ### Selection rules
35
+
36
+ - Prefer a normal built-in action over any AI action.
37
+ - **Direct action beats communication**: "apply the change" is the change, not an email about it — unless messaging was asked for.
38
+ - **Delivery beats retrieval**: "send the customer a coupon" needs a delivery step. A staging action alone is incomplete; its output must be consumed by a delivery step on the same path.
39
+ - Replacing an unsupported external integration: keep the channel (chat stays chat-like).
40
+ - AI ladder — first that fits: (1) **Delegate to Aria** `ai_assistants-delegate-to-assistant`: autonomous agent, output NOT used downstream (exposes only `summary`); (2) **Custom agent** `ai_custom_agent_bm-delegate_to_agent`: autonomous agent whose output IS used downstream; (3) **Generate or analyze text** `wix_automations-llm_call`: pure LLM over data already in the payload; no tools, no internet. "LLM step" → (3). When later steps need several structured fields, use (3) with an override output schema — not a single-string text action.
41
+ - Ask the user to choose between overlapping actions only when the difference is user-facing and context doesn't decide it.
42
+
43
+ ## 3. Reading the action
44
+
45
+ - `inputSchema` — JSON Schema of the mapping. `required` = must map. `oneOf`/`const` = enum. `format`, `wixCustomType`, `identityType` as in [Automations Trigger Configuration](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-trigger-configuration) §3.
46
+ - `interfaceConfiguration.type` — `GENERIC` → the builder renders a form from `inputSchema` + `genericOptions.uiSchema` (rules in §5.2). `WIDGET_COMPONENT` → the app's own configuration widget, which you can't see (below).
47
+ - `interfaceConfiguration.genericOptions.uiSchema` — per-field UI hints (below). It cannot add fields.
48
+ - `outputSchema` — fields downstream steps read as `var("<namespace>.<field>")`. Empty and no dynamic output → later steps must not reference its namespace.
49
+ - `implementedMethods` — `validateConfiguration` (the app validates your mapping on Validate Automation), `getQuotaInfo`. It does **not** tell you about dynamic schemas — decide by `updateSchemaOnChange` and by calling the dynamic-output API.
50
+
51
+ **`WIDGET_COMPONENT` actions.** The widget owns the mapping; the builder's form rules don't apply to it. In these guides an *opaque widget* is a `WIDGET_COMPONENT` action whose `inputSchema` does not fully describe the requested configuration. If `inputSchema` fully describes what the user asked for (e.g. `addLabelsToContact`: `contactId` + `labelKeys`), hand-author it (§5.2) and tell the user to review the step; otherwise tell the user this step can’t be configured through the API here and that they can set it up in the automations builder. If the widget can't load (its app is uninstalled), the builder shows an "app not installed" state with a Replace button instead of the settings.
52
+
53
+ Conditional fields (`if`/`then`/`dependencies`, e.g. a due date shown only when "add a due date" is true): set the toggle and the dependent field together, or leave both out.
54
+
55
+ UI-schema keys that change what you may write:
56
+
57
+ - `dynamicValuesOptions.enabled: true` → the field accepts `{{…}}` formulas. `strict: true` → the formula must return the field's exact type/format. **A field without it is static: literal only.**
58
+ - `"ui:widget": "EntitySelector"` + `entitySelectorOptions` (`selectorId`/`tag`, `filters`, `dynamicFiltersMapping`) → entity picker; value = id or array of ids (§1 of Automations Entity and Provider Configuration (not yet published)). Same for input properties carrying `itemsSelectionConfiguration`.
59
+ - `"ui:field": "AudienceSelector"` → an audience object owned by the app's picker; don't hand-author it — the user sets it in the builder.
60
+ - `"ui:field": "TextSectionField"` → display-only text; never map it.
61
+ - `"ui:widget": "hidden"`, `ui:readonly` → keep the schema `default`. Other `ui:*` keys are presentation only.
62
+
63
+ ## 4. Dynamic input and output schemas
64
+
65
+ - **Input**: a property with `updateSchemaOnChange: true` (e.g. a template or form id) changes which inputs exist. Set it, then call Get Action Dynamic Input Schema with `{appId, actionKey, inputMapping}` (the mapping so far). The builder shows the static schema **merged** with the returned one (properties and `required` united), so keys from either are kept. Repeat if another controlling field is revealed. Never invent a field you expected but didn't get — it appears only after its controlling selection. The builder re-fetches this schema from your saved mapping every time the step is opened, so a dynamic key whose controlling value isn't in the mapping is dropped on the first edit.
66
+ - **Output**: after the mapping is final, call Get Action Dynamic Output Schema (or the bulk variant) and use the returned `outputSchema` for downstream `var()` paths. A dynamic output is a _real_ schema — never replace it with an override (allowlist: §3 of Automations Schemas and Scheduling (not yet published)).
67
+
68
+ ## 5. Building the input mapping
69
+
70
+ ### 5.1 Provider-owned mappings — email and opaque widgets
71
+
72
+ > **Later stages only:** email and other opaque-widget configuration is not available in stage 2; this section is published in stage 4.
73
+
74
+ **In this stage:** never invent an opaque widget's mapping or its app-owned keys; tell the user which action to add in the builder and how it should be configured.
75
+
76
+ ### 5.2 Hand-authored mapping
77
+
78
+ MUST (builder renderability — the `GENERIC` form drops, rewrites or flags anything else):
79
+
80
+ - Keys: only properties of the current (merged dynamic) input schema. The form drops unknown keys on the first edit.
81
+ - Values: the schema's type — string→string, number/integer→number, boolean→boolean, array→array, object→object field by field (e.g. MONEY `{"value": "…", "currency": "…"}`).
82
+ - Every `required` field present. An action with visible fields and a missing/`null` `inputMapping` is flagged "missing required info" and its panel can't be applied.
83
+ - An action with no input properties (or only hidden ones): send `"inputMapping": {}` — the builder writes `{}` itself on open otherwise.
84
+ - Map fields the form would auto-fill, or opening the step silently changes the automation: fields with a schema `default` (write the default or your value), every `identityType` input (the form auto-maps it when exactly one matching payload path exists), required `date`/`date-time`/`time` strings (else filled with "now").
85
+ - Enum fields (`oneOf` / `enum`): one of the listed constants.
86
+ - Entity-selector fields: real ids of the right kind and shape (§1 of Automations Entity and Provider Configuration (not yet published)).
87
+ - `{{…}}` only in fields with `dynamicValuesOptions.enabled` (or an `identityType` field), per [Automations Mapping Expressions](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-mapping-expressions) §4: number/boolean hold exactly one expression of that type; date-time a single date-time expression or ISO literal; strings may mix text and expressions. An **array-typed** `var()` in a string field is flagged as a format mismatch.
88
+ - Don't copy volatile values: dates → `now()`/payload dates; ids → resolved at build time, never from examples.
89
+ - Keep what the user describes for one field in that field. A subject described as "Order received, then the customer's first name" is one `subject` string mixing text and expressions (`"Order received {{var(…)}}"`); don't split its values into other fields, such as a message's `fields` rows.
90
+
91
+ Value kinds:
92
+
93
+ ```json
94
+ {
95
+ "subject": "Welcome, {{var(\"contact.name.first\")}}!",
96
+ "priority": "HIGH",
97
+ "notifyCustomer": true,
98
+ "amount": {
99
+ "value": "{{var(\"order.total.value\")}}",
100
+ "currency": "{{var(\"order.total.currency\")}}"
101
+ },
102
+ "contactId": "{{var(\"contactId\")}}",
103
+ "labelKeys": ["<label-key-1>"],
104
+ "note": "Order {{var(\"order_number\")}} from {{var(\"createTask-1.taskId\")}}"
105
+ }
106
+ ```
107
+
108
+ Trigger fields have no prefix; action outputs use the step's `namespace` (e.g. `createTask-1.taskId`); set-variables use `setVariable.<key>`.
109
+
110
+ Optional inputs with no `default` (e.g. `isDueDate`, `onlyWhenAvailable`): omit them unless the request needs them. A deprecated defaulted input (e.g. `labelIds: []` on add-label) may be omitted.
111
+
112
+ Process: (1) fetch the effective schema (§4) before you write a mapping or any script that saves one — never guess an action's field names → (2) classify required vs optional; map optional fields only with a real source → (3) source each required field from payload, upstream outputs or the user; ask for user-specific content (text, recipient, which entity) → (4) build → (5) self-check against the list above → (6) Validate Automation.
113
+
114
+ ### 5.3 Validation errors on actions
115
+
116
+ Error shape, error type → fix, and how the builder shows each: [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) §2. Must-know here: fix the field named by `configurationError.fieldKey` — never delete a field to silence it; `CRITICAL` blocks (status `INVALID`), `WARNING` doesn't but must be reported; a `var()` path that doesn't exist may NOT be reported — verify paths yourself.
117
+
118
+ ## 6. Side-effect and recipient review
119
+
120
+ This section owns the semantic review (you, not code) required for every action before acceptance. Confirm from its catalog entry and effective schemas:
121
+
122
+ - **Verb**: it performs what was asked (assign/add/send/create/update/delete). A read-only "get" action can't satisfy a mutation; sending a message about a change is not the change.
123
+ - **Entity**: the affected entity has a matching input (e.g. a label picker for "add label").
124
+ - **Identity input**: the id it acts on, with the right `identityType`.
125
+ - **Recipient lineage** (email, chat, SMS, push): write down `{requestedAudience, resolvedAudienceKind (contact|visitor|owner|contributor|label|phone|device), resolvedIdentityPath}`. The trigger contact and a contact created upstream are different people even if both are `contactId`. Wording never proves the recipient.
126
+ - **Later stages only — email is outside stage 2:** Email: the audience fields decide — read `selectedAudience` / `contactId` exactly as in §3 of Automations Email Actions (not yet published) ("Recipient encoding"). A root `contactId` or `triggerContactExcluded` alone doesn't prove who receives it.
127
+ - Chat (`send-message`): only a schema-supported contact-id or visitor-id route; owner/team chat needs a different, proven component or a clarification.
128
+ - SMS / push: prove the schema-supported contact, audience, phone or device route.
129
+
130
+ Under-required schemas: `send-message` requires only `contactId`/`visitorId` (anyOf), not the text. Always map the message too — a required-fields-only mapping ships an empty action.
131
+
132
+ ## 7. Common failure modes
133
+
134
+ Missing required field or content-free required-only mapping · fabricated user values instead of asking · type/format mismatch, free text in an enum, a name in an id field · `var()` to a path absent from the aggregated schema (or from an unfetched dynamic schema) · formula in a static field or an unknown function · wrong verb or recipient · a single-value field filled from an array · unmapped defaults / identity fields / missing `{}` (the builder rewrites the step on first open).
@@ -1,52 +1,68 @@
1
1
  ---
2
2
  name: "Automations Activation Status"
3
- description: "Read an automation’s current ACTIVE or INACTIVE status and distinguish it from historical run outcomes."
3
+ description: "Read an automation’s current ACTIVE or INACTIVE status, and activate or deactivate it when the user asks."
4
4
  ---
5
5
 
6
- # Inspect activation status
7
-
8
- An automation's current state is `configuration.status`: ACTIVE is eligible for new trigger
9
- events; INACTIVE is not. Neither value proves that a historical run succeeded or that a
10
- pending activation has stopped.
11
-
12
- 1. Resolve the requested name with one Query Automations call filtered by that exact name
13
- (below); don't page through other automations. If the ID is already supplied, go to Get.
14
- If several match, open your answer by listing each match's full returned ID and asking
15
- which one the user means; don't report a single status. If none match, say so and ask the
16
- user to check the name or site; never guess an ID.
17
- 2. Get the matching returned ID and read `configuration.status`.
18
- 3. Answer briefly and completely in one reply. Start with the automation's exact name, its
19
- returned ID and ACTIVE/INACTIVE from that response, then say what it means for new trigger
20
- events. If the user asks whether the status says anything about past runs, answer it
21
- directly in the next sentence: status does not show whether past runs succeeded; they are
22
- visible in the automation's activity view in the site dashboard.
23
- 4. If Get returns not found, do not state a status. Open with: the automation wasn't found on
24
- this site, so its status can't be determined, and ask the user to confirm the site and the
25
- automation ID. This question is required. Then give the possible causes below.
26
-
27
- Use an authorized site-scoped client with Set Up Automations permission. REST calls use
28
- `Authorization: <token>`. An API key also needs `wix-site-id: <metaSiteId>`; do not combine it
29
- with `wix-account-id`. Never print credentials.
30
-
31
- `POST https://www.wixapis.com/automations-service/v2/automations/query`
32
-
33
- ```json
34
- {"query":{"filter":{"name":"<automation name>"},"cursorPaging":{"limit":25}}}
35
- ```
36
-
37
- Read `automations[]` and `pagingMetadata.cursors.next`; continue pages if needed. Retain the
38
- returned `id` and exact name. Then:
39
-
40
- `GET https://www.wixapis.com/automations-service/v2/automations/<automationId>`
41
-
42
- Read `automation.configuration.status` from the Get response. Never infer status from the
43
- name or a previous mutation. Do not validate, change configuration, toggle status or test-run
44
- an automation to answer this read-only request.
45
-
46
- Not-found causes (step 4): unpublished builder drafts do not appear
47
- through this API, but a 404 can also mean deletion or a changed ID after overriding a
48
- preinstalled automation. When the user's history supports an unpublished builder draft as the
49
- cause, ask the owner to publish or discard it rather than reproducing its edits.
50
-
51
- Official contracts: [Query Automations](https://dev.wix.com/docs/api-reference/business-management/automations/automations/automations-v2/query-automations),
52
- [Get Automation](https://dev.wix.com/docs/api-reference/business-management/automations/automations/automations-v2/get-automation).
6
+ > **Stage scope:** this stage covers only what [Build and Manage Wix Automations](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) lists; do not perform any workflow that needs a guide marked "not yet published". "Stage" and "not yet published" describe how this skill is being rolled out; never mention them to the user. Explain a limit in product terms: what can't be done through the API here and where the user can do it instead (for example, in the automations builder).
7
+
8
+ # Activation status and lifecycle
9
+
10
+ **What the public API can see.** An automation's live state is `configuration.status` —
11
+ `ACTIVE` (eligible for new trigger events) or `INACTIVE` (not eligible for new trigger events).
12
+ Status does not show whether past runs succeeded. There is no separate
13
+ "published" flag and no public draft API:
14
+
15
+ - **Status check** = Get Automation → read `configuration.status`. Report exactly that value, in a
16
+ short answer that starts with the automation's name and returned ID;
17
+ never infer it from the name or from your own earlier writes. If several automations match the
18
+ supplied name, list each one's returned ID and end with a direct question such as "Which one
19
+ do you mean?"; don't report a single status. If no automation matches the supplied name, say
20
+ so and ask the user to check the name or site; never guess an ID.
21
+ - **Builder drafts are invisible to you**: if the user says "it doesn't show my latest changes",
22
+ tell them to publish (or discard) in the builder first — don't reproduce their edits.
23
+ - **NOT_FOUND is ambiguous.** Open the answer by saying the status can't be determined and
24
+ asking the user to confirm the site and the automation ID; then give the possible causes. A never-published builder draft is absent
25
+ from Get/Query, but deletion and a replaced preinstalled id can also explain a 404. The first
26
+ update of a preinstalled automation can create an override with a new id; use the mutation's
27
+ returned id, or Query to find the current automation and confirm its identity. When the
28
+ user's history supports an unpublished builder draft as the cause, ask the owner to publish or
29
+ discard it rather than reproducing its edits.
30
+
31
+ **Calls** (auth as in [Automations API Catalog](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) §1). A status question needs only Query and Get — no catalogs, Validate or writes.
32
+
33
+ - Find by name: `POST https://www.wixapis.com/automations-service/v2/automations/query` with
34
+ `{"query":{"filter":{"name":"<automation name>"},"cursorPaging":{"limit":25}}}` → `automations[]`
35
+ with each `id` and exact `name`. If the user supplied the ID, skip this.
36
+ - Read: `GET https://www.wixapis.com/automations-service/v2/automations/<automationId>` → `automation.configuration.status`. Add
37
+ `?fields=OVERRIDE_SCHEMA` before activating or deactivating.
38
+ - Activate / deactivate: `PATCH https://www.wixapis.com/automations-service/v2/automations/<automationId>` with
39
+ `{"automation": <the object exactly as fetched, with only configuration.status changed>}` — it
40
+ carries `id`, the current `revision`, `origin` and any `settings` the Get returned.
41
+
42
+ **Activate** (only when the user asks):
43
+
44
+ 1. Get Automation with `fields: ["OVERRIDE_SCHEMA"]` → current `revision`, `origin`, `settings`.
45
+ If `settings.disableStatusChange`
46
+ or `settings.readonly` is true, stop and report the lock: the owning app doesn't allow it
47
+ (§4 of Automations Feasibility and Planning (not yet published)).
48
+ 2. Already `ACTIVE` → report it and stop (idempotent; no write).
49
+ 3. Set only the candidate's status to `ACTIVE`, then apply the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) and full Validate — never activate
50
+ an automation that doesn't validate. Preserve existing supported configurations as the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) explains.
51
+ 4. Explicit activation instructions authorize this change; do not ask again. If the user only
52
+ asked to build or inspect it, obtain authorization before making it eligible for real runs.
53
+ 5. Update Automation with the object exactly as fetched, `configuration.status: "ACTIVE"`, and
54
+ its `revision`. Nothing else changes.
55
+ 6. Capture the returned id (a preinstalled override can change it), Get that id again with
56
+ override schemas, and confirm `configuration.status` is `ACTIVE` and all other requested
57
+ content is unchanged. Report "active" only then.
58
+
59
+ **Deactivate** (on explicit request): Get the complete object with override schemas; check
60
+ `settings.disableStatusChange` and `settings.readonly`; already INACTIVE means no write.
61
+ Otherwise change only `configuration.status` to `INACTIVE`, preserving origin, settings,
62
+ revision, schemas and all nodes, then Update and read back the returned id. **Do not run the §4 checklist in [Build and Manage Wix Automations — included validation procedure](https://dev.wix.com/docs/api-reference/business-management/automations/skills/build-and-manage-wix-automations) or
63
+ Validate as a prerequisite**, and do not repair or remove unrelated invalid/legacy steps.
64
+ An explicit request to turn it off is sufficient authorization. Deactivating prevents new
65
+ triggered runs; it is not proof that every pending/running activation has stopped or will finish.
66
+
67
+ **Revision conflicts** (someone published from the builder meanwhile): re-Get and retry once;
68
+ if the fresh object differs in ways that matter, tell the user instead of overwriting.