@lacneu/wix-openclaw 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +95 -2
- package/README.md +25 -10
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +238 -0
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/seo.d.ts +239 -0
- package/dist/tools/seo.js +1039 -0
- package/dist/tools/seo.js.map +1 -1
- package/openclaw.plugin.json +22 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,99 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.4.0] - 2026-08-29
|
|
11
|
+
|
|
12
|
+
Ten more `wix_seo_*` tools, still **off by default**, close the other half of
|
|
13
|
+
the SEO gap: 0.3.x could audit a site's tags and never correct them. Writing
|
|
14
|
+
them is a different destructiveness from deleting a redirect — a tag write
|
|
15
|
+
replaces **the previous value of what it writes** — so the guard is different
|
|
16
|
+
too, and most of this entry is about that.
|
|
17
|
+
|
|
18
|
+
### Added — SEO: writing tags, and the patterns behind them
|
|
19
|
+
|
|
20
|
+
> Same warning as the audit tools: these endpoints are in Developer Preview,
|
|
21
|
+
> Wix states they should not be used on live sites, and **every tool here
|
|
22
|
+
> replaces what it writes**. They register only with `enableSeoTools: true`.
|
|
23
|
+
|
|
24
|
+
Ten tools complete the SEO surface: you could audit tags but not correct them.
|
|
25
|
+
|
|
26
|
+
**Per-item and site-wide tags.** `wix_seo_set_item_tags`,
|
|
27
|
+
`wix_seo_bulk_set_item_tags`, `wix_seo_reset_item_tags` and
|
|
28
|
+
`wix_seo_set_site_tags`.
|
|
29
|
+
|
|
30
|
+
**Patterns.** `wix_seo_list_patterns`, `wix_seo_get_pattern`,
|
|
31
|
+
`wix_seo_list_pattern_variables` (read-only) plus `wix_seo_set_pattern`,
|
|
32
|
+
`wix_seo_create_pattern` and `wix_seo_reset_pattern`.
|
|
33
|
+
|
|
34
|
+
### The destructiveness is a different shape, so the guard is too
|
|
35
|
+
|
|
36
|
+
A redirect delete destroys another row — it can be listed and named. A tag write
|
|
37
|
+
destroys **the previous value of what it writes**: `tags` replaces the item's set
|
|
38
|
+
in full, so a caller that sets a title wipes the description it never mentioned,
|
|
39
|
+
gets exactly what it asked for, and loses something it never saw. That is this
|
|
40
|
+
half's "redirects do not chain".
|
|
41
|
+
|
|
42
|
+
The pre-flight therefore reports what **disappears** — the tags held today whose
|
|
43
|
+
slot the incoming set does not fill — never an echo of the input. A caller
|
|
44
|
+
reading its own request back learns nothing. Nothing is lost, nothing is
|
|
45
|
+
refused: the ceremony exists for the unannounced loss, not for its own sake.
|
|
46
|
+
|
|
47
|
+
A pattern write earns the heaviest pre-flight in the plugin. It re-renders
|
|
48
|
+
**every page of its type**, it has no revision, and the Wix dashboard writes to
|
|
49
|
+
the same object — last write wins. So the refusal reports the page count
|
|
50
|
+
downstream alongside the templates, and the token is bound to the pattern read
|
|
51
|
+
immediately before — **and to that page count**, because the radius is part of
|
|
52
|
+
what was accepted: a token minted while a type held twelve pages does not
|
|
53
|
+
authorise the same write once it holds four hundred.
|
|
54
|
+
|
|
55
|
+
Every refusal in this family carries the **value** of what it names, not only
|
|
56
|
+
its slot.
|
|
57
|
+
Editing `{{title}}` into `{{title}} — Ataraxis` loses no tag, so a report by
|
|
58
|
+
slot alone read identically before and after — an operator signing a rewrite of
|
|
59
|
+
every page of a type without seeing either version.
|
|
60
|
+
|
|
61
|
+
### Three contract facts that live in code, not in prose
|
|
62
|
+
|
|
63
|
+
- **`fieldMask` is a comma-separated STRING over REST.** The SDK takes an array,
|
|
64
|
+
which is what a model reaches for. It is built here, never accepted.
|
|
65
|
+
- **`language` is actively dropped.** Tags can only be written for the item's
|
|
66
|
+
primary language, and sending one fails `LANGUAGE_NOT_SUPPORTED` *even when
|
|
67
|
+
the field mask omits it* — so not declaring the field is not enough, TypeBox
|
|
68
|
+
passes undeclared properties through.
|
|
69
|
+
- **Site SEO Tags accepts only `meta`.** Wix rejects `title`, `script` and
|
|
70
|
+
`link` there despite the shared tag shape listing them, and there is no way to
|
|
71
|
+
set site-wide structured data through any Wix API — a per-page `script` tag is
|
|
72
|
+
the route.
|
|
73
|
+
|
|
74
|
+
`BLOG_POST` bulk writes are capped at 20 entries, not 100, and Wix rejects the
|
|
75
|
+
**whole call** past an item type's limit — a 40-post batch would write nothing —
|
|
76
|
+
so the cap is enforced before the request leaves.
|
|
77
|
+
|
|
78
|
+
### The `publish` split, stated where a model will read it
|
|
79
|
+
|
|
80
|
+
For a static page, `publish: true` updates **only** the published revision. The
|
|
81
|
+
read tools always return the **saved** one, so after such a write they keep
|
|
82
|
+
showing the old values — that is not a failed write, and re-sending will not
|
|
83
|
+
change it. The method's own response is not a read of the published page either.
|
|
84
|
+
A caller following the description literally converges instead of retrying.
|
|
85
|
+
|
|
86
|
+
## [0.3.1] - 2026-08-28
|
|
87
|
+
|
|
88
|
+
**The version that actually reached npm for the 0.3 line.** `v0.3.0` was
|
|
89
|
+
tagged, failed to compile in the release workflow and was never published, so
|
|
90
|
+
`0.3.1` carries the whole 0.3.0 entry below plus the fix that unblocked it.
|
|
91
|
+
|
|
92
|
+
### Fixed
|
|
93
|
+
|
|
94
|
+
- **The build imported a type from a subpath that does not exist across the
|
|
95
|
+
supported range.** `openclaw/plugin-sdk/agent-core` only appeared in
|
|
96
|
+
2026.5.28, while this plugin declares `>=2026.5.0`, so CI failed on the lower
|
|
97
|
+
bound. The shared tool-result type is declared locally instead — verified at
|
|
98
|
+
both ends of the supported range rather than at the version that happened to
|
|
99
|
+
be installed.
|
|
100
|
+
|
|
8
101
|
## [0.3.0] - 2026-08-28
|
|
9
102
|
|
|
10
103
|
Nine `wix_seo_*` tools, **off by default**, close the gap that made this plugin
|
|
@@ -402,7 +495,7 @@ For instance owners on `@lacneu/wix-openclaw@0.2.2`:
|
|
|
402
495
|
3. Verify in the boot log:
|
|
403
496
|
`wix-openclaw: ready — 50 tool(s) registered`.
|
|
404
497
|
|
|
405
|
-
Fifty, not
|
|
498
|
+
Fifty, not sixty-nine: the SEO tools are not registered until you opt in. Nothing
|
|
406
499
|
else changes, and the approval fix applies as soon as the plugin loads — a gated
|
|
407
500
|
tool that used to fail without asking will now put its prompt to the operator.
|
|
408
501
|
|
|
@@ -418,7 +511,7 @@ To add the SEO tools:
|
|
|
418
511
|
`openclaw config set plugins.entries.wix-openclaw.config.enableSeoTools true`.
|
|
419
512
|
`update` carries your existing config forward and the new field simply
|
|
420
513
|
defaults to `false`, so nothing turns on by surprise.
|
|
421
|
-
3. Restart, and expect `
|
|
514
|
+
3. Restart, and expect `69 tool(s) registered`.
|
|
422
515
|
4. Read the Developer Preview warning at the top of this section before pointing
|
|
423
516
|
any of the four writing tools at a live site.
|
|
424
517
|
|
package/README.md
CHANGED
|
@@ -176,8 +176,10 @@ Tick these only if the corresponding Wix product is actually in use on
|
|
|
176
176
|
the target site:
|
|
177
177
|
|
|
178
178
|
- [ ] **Manage SEO** (`SCOPE.PROMOTE.MANAGE-SEO`) — **only if you set
|
|
179
|
-
`enableSeoTools: true
|
|
180
|
-
|
|
179
|
+
`enableSeoTools: true`**, which registers **nineteen** tools of which
|
|
180
|
+
**eleven write irreversibly** (four on redirects, seven on tags and
|
|
181
|
+
patterns; a pattern write re-renders every page of its type). In the default
|
|
182
|
+
configuration the SEO tools are not registered at all, so granting this scope would hand the key the power to
|
|
181
183
|
delete redirects for tools that cannot run. Wix exposes a **single** SEO
|
|
182
184
|
scope, not a read/write pair: ticking it grants redirect creation and deletion
|
|
183
185
|
along with the read-only audit, so there is no such thing as an audit-only SEO
|
|
@@ -185,8 +187,8 @@ the target site:
|
|
|
185
187
|
*Social Posts* and *Import orders*; its label is currently untranslated and
|
|
186
188
|
renders literally as `site.scope.SCOPE.PROMOTE.MANAGE-SEO.name`. Since Wix
|
|
187
189
|
cannot narrow it, the read/write boundary is enforced by this plugin instead —
|
|
188
|
-
the
|
|
189
|
-
|
|
190
|
+
each of the eleven writing tools refuses until what it would destroy, be it a
|
|
191
|
+
redirect, a tag or a template, has been named and acknowledged.
|
|
190
192
|
|
|
191
193
|
- [ ] **Pricing Plans** — if you sell subscription packages
|
|
192
194
|
- [ ] **Wix Stores** + **Wix eCommerce** — if you sell physical/digital
|
|
@@ -238,7 +240,7 @@ columns and remove the matching tools from your agent's allow-list.
|
|
|
238
240
|
| `wix_reviews_*` | Wix Reviews | Reviews moderation |
|
|
239
241
|
| `wix_faq_*` | Manage FAQ | FAQ tooling |
|
|
240
242
|
| `wix_multilingual_*` | Multilingual Translation Schema Read | Translation reads |
|
|
241
|
-
| `wix_seo_*` (all
|
|
243
|
+
| `wix_seo_*` (all nineteen) | Manage SEO (`SCOPE.PROMOTE.MANAGE-SEO`) | SEO audit **and** redirect changes — Wix has no read-only SEO scope, so this one permission covers both |
|
|
242
244
|
| `wix_design_brief` | _(none — no API call)_ | Always |
|
|
243
245
|
|
|
244
246
|
### Wix app installation requirements
|
|
@@ -487,19 +489,22 @@ neither answer has been tested.
|
|
|
487
489
|
### SEO
|
|
488
490
|
|
|
489
491
|
> **Developer Preview, and OFF by default.** Every Wix endpoint behind these
|
|
490
|
-
>
|
|
492
|
+
> nineteen tools is listed in Wix's
|
|
491
493
|
> [Developer Preview](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-developer-preview)
|
|
492
|
-
> — Item SEO Tags, Site SEO Tags and all six Redirects methods.
|
|
494
|
+
> — Item SEO Tags, Site SEO Tags, SEO Patterns and all six Redirects methods.
|
|
495
|
+
> Wix may change
|
|
493
496
|
> them at any time, and states plainly that you **shouldn't use them on live
|
|
494
497
|
> sites**: they are for testing and feedback. An API stays in preview for at
|
|
495
498
|
> most six months.
|
|
496
499
|
>
|
|
497
500
|
> Nothing here registers unless you set `enableSeoTools: true` in the plugin
|
|
498
|
-
> config.
|
|
499
|
-
> succeed
|
|
501
|
+
> config. Eleven of the tools write irreversibly to the live site the moment
|
|
502
|
+
> they succeed — and a pattern write re-renders every page of its type — so
|
|
503
|
+
> opting in is the operator saying they accept both risks.
|
|
500
504
|
> _Preview status verified against the Wix reference on 2026-08-28._
|
|
501
505
|
|
|
502
|
-
Auditing a site's SEO, and managing its URL redirects
|
|
506
|
+
Auditing a site's SEO, correcting its tags, and managing its URL redirects and
|
|
507
|
+
tag patterns.
|
|
503
508
|
|
|
504
509
|
| Tool | What it does | Approval | Validated |
|
|
505
510
|
|---|---|---|---|
|
|
@@ -512,6 +517,16 @@ Auditing a site's SEO, and managing its URL redirects.
|
|
|
512
517
|
| `wix_seo_delete_redirect` | Delete one redirect (re-reads it and refuses until its token is acknowledged) | **required** | schema |
|
|
513
518
|
| `wix_seo_bulk_create_redirects` | Create 1–100 redirects | **required** | schema |
|
|
514
519
|
| `wix_seo_bulk_delete_redirects` | Delete 1–500 redirects | **required** | schema |
|
|
520
|
+
| `wix_seo_set_item_tags` | Set one item's tags — REPLACES its own set in full; refuses until the tags it would drop are acknowledged | **required** | schema |
|
|
521
|
+
| `wix_seo_bulk_set_item_tags` | Set tags for many items of one type (100 max, 20 for `BLOG_POST`); per-entry results | **required** | schema |
|
|
522
|
+
| `wix_seo_reset_item_tags` | Give an item back the tags it inherits, discarding its own (all or nothing) | **required** | schema |
|
|
523
|
+
| `wix_seo_set_site_tags` | Set the site-wide tags — `meta` only; Wix rejects `title`/`script`/`link` here | **required** | schema |
|
|
524
|
+
| `wix_seo_list_patterns` | The site's tag templates, per page type | — | schema |
|
|
525
|
+
| `wix_seo_get_pattern` | One page type's pattern; read `source` to know whose it is — an owned pattern may hold zero templates, so empty ≠ absent | — | schema |
|
|
526
|
+
| `wix_seo_list_pattern_variables` | The variables a page type's pattern may reference | — | schema |
|
|
527
|
+
| `wix_seo_set_pattern` | Change an existing pattern — re-renders EVERY page of the type | **required** | schema |
|
|
528
|
+
| `wix_seo_create_pattern` | Give a page type its first pattern (same path as the set, `POST` not `PATCH`) | **required** | schema |
|
|
529
|
+
| `wix_seo_reset_pattern` | Return a page type to the Wix default pattern | **required** | schema |
|
|
515
530
|
|
|
516
531
|
**Three things to know before using these.**
|
|
517
532
|
|
package/dist/config.js
CHANGED
|
@@ -34,6 +34,15 @@ export const DEFAULT_APPROVAL_REQUIRED = [
|
|
|
34
34
|
"wix_seo_delete_redirect",
|
|
35
35
|
"wix_seo_bulk_create_redirects",
|
|
36
36
|
"wix_seo_bulk_delete_redirects",
|
|
37
|
+
// Tranche 2 — writing tags. Each REPLACES what it writes: the previous
|
|
38
|
+
// value is gone, and a pattern write re-renders every page of its type.
|
|
39
|
+
"wix_seo_set_item_tags",
|
|
40
|
+
"wix_seo_bulk_set_item_tags",
|
|
41
|
+
"wix_seo_reset_item_tags",
|
|
42
|
+
"wix_seo_set_site_tags",
|
|
43
|
+
"wix_seo_set_pattern",
|
|
44
|
+
"wix_seo_create_pattern",
|
|
45
|
+
"wix_seo_reset_pattern",
|
|
37
46
|
];
|
|
38
47
|
const VALID_LOG_LEVELS = ["debug", "info", "warn", "error"];
|
|
39
48
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAQ7D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAQ;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,wBAAwB;IACxB,oBAAoB;IACpB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,qBAAqB;IACrB,sBAAsB;IACtB,yBAAyB;IACzB,sEAAsE;IACtE,6EAA6E;IAC7E,2EAA2E;IAC3E,6EAA6E;IAC7E,6DAA6D;IAC7D,yBAAyB;IACzB,yBAAyB;IACzB,+BAA+B;IAC/B,+BAA+B;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAQ7D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAQ;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,wBAAwB;IACxB,oBAAoB;IACpB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,qBAAqB;IACrB,sBAAsB;IACtB,yBAAyB;IACzB,sEAAsE;IACtE,6EAA6E;IAC7E,2EAA2E;IAC3E,6EAA6E;IAC7E,6DAA6D;IAC7D,yBAAyB;IACzB,yBAAyB;IACzB,+BAA+B;IAC/B,+BAA+B;IAC/B,uEAAuE;IACvE,wEAAwE;IACxE,uBAAuB;IACvB,4BAA4B;IAC5B,yBAAyB;IACzB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;IACxB,uBAAuB;CACxB,CAAC;AAEF,MAAM,gBAAgB,GAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,aAAa,GACjB,eAAe,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,yBAAyB,CAAC;IAE3E,MAAM,QAAQ,GAAgB,gBAAgB,CAAC,QAAQ,CACrD,GAAG,CAAC,QAAuB,CAC5B;QACC,CAAC,CAAE,GAAG,CAAC,QAAwB;QAC/B,CAAC,CAAC,MAAM,CAAC;IAEX,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK;QAC9B,sEAAsE;QACtE,mEAAmE;QACnE,oEAAoE;QACpE,0EAA0E;QAC1E,0EAA0E;QAC1E,cAAc,EAAE,GAAG,CAAC,cAAc,KAAK,IAAI;QAC3C,MAAM;QACN,SAAS;QACT,cAAc;QACd,aAAa;QACb,gBAAgB,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC;QAC3C,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1308,6 +1308,244 @@ export declare function buildAllTools(client: WixClient, options?: {
|
|
|
1308
1308
|
data?: unknown;
|
|
1309
1309
|
error?: string;
|
|
1310
1310
|
}>>;
|
|
1311
|
+
} | {
|
|
1312
|
+
name: string;
|
|
1313
|
+
description: string;
|
|
1314
|
+
label: string;
|
|
1315
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1316
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1317
|
+
itemType: import("@sinclair/typebox").TString;
|
|
1318
|
+
itemId: import("@sinclair/typebox").TString;
|
|
1319
|
+
tags: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
1320
|
+
type: import("@sinclair/typebox").TString;
|
|
1321
|
+
props: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1322
|
+
children: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1323
|
+
meta: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1324
|
+
custom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1325
|
+
disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1326
|
+
}>>;
|
|
1327
|
+
publish: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1328
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1329
|
+
}>;
|
|
1330
|
+
execute: (toolCallId: string, params: {
|
|
1331
|
+
siteId?: string | undefined;
|
|
1332
|
+
publish?: boolean | undefined;
|
|
1333
|
+
acknowledgeReplacement?: string | undefined;
|
|
1334
|
+
tags: {
|
|
1335
|
+
custom?: boolean | undefined;
|
|
1336
|
+
props?: {
|
|
1337
|
+
[x: string]: unknown;
|
|
1338
|
+
} | undefined;
|
|
1339
|
+
children?: string | undefined;
|
|
1340
|
+
meta?: {
|
|
1341
|
+
[x: string]: unknown;
|
|
1342
|
+
} | undefined;
|
|
1343
|
+
disabled?: boolean | undefined;
|
|
1344
|
+
type: string;
|
|
1345
|
+
}[];
|
|
1346
|
+
itemType: string;
|
|
1347
|
+
itemId: string;
|
|
1348
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1349
|
+
status: "ok" | "failed";
|
|
1350
|
+
data?: unknown;
|
|
1351
|
+
error?: string;
|
|
1352
|
+
}>>;
|
|
1353
|
+
} | {
|
|
1354
|
+
name: string;
|
|
1355
|
+
description: string;
|
|
1356
|
+
label: string;
|
|
1357
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1358
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1359
|
+
itemType: import("@sinclair/typebox").TString;
|
|
1360
|
+
itemId: import("@sinclair/typebox").TString;
|
|
1361
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1362
|
+
}>;
|
|
1363
|
+
execute: (toolCallId: string, params: {
|
|
1364
|
+
siteId?: string | undefined;
|
|
1365
|
+
acknowledgeReplacement?: string | undefined;
|
|
1366
|
+
itemType: string;
|
|
1367
|
+
itemId: string;
|
|
1368
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1369
|
+
status: "ok" | "failed";
|
|
1370
|
+
data?: unknown;
|
|
1371
|
+
error?: string;
|
|
1372
|
+
}>>;
|
|
1373
|
+
} | {
|
|
1374
|
+
name: string;
|
|
1375
|
+
description: string;
|
|
1376
|
+
label: string;
|
|
1377
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1378
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1379
|
+
tags: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
1380
|
+
type: import("@sinclair/typebox").TString;
|
|
1381
|
+
props: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1382
|
+
children: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1383
|
+
meta: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1384
|
+
custom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1385
|
+
disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1386
|
+
}>>;
|
|
1387
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1388
|
+
}>;
|
|
1389
|
+
execute: (toolCallId: string, params: {
|
|
1390
|
+
siteId?: string | undefined;
|
|
1391
|
+
acknowledgeReplacement?: string | undefined;
|
|
1392
|
+
tags: {
|
|
1393
|
+
custom?: boolean | undefined;
|
|
1394
|
+
props?: {
|
|
1395
|
+
[x: string]: unknown;
|
|
1396
|
+
} | undefined;
|
|
1397
|
+
children?: string | undefined;
|
|
1398
|
+
meta?: {
|
|
1399
|
+
[x: string]: unknown;
|
|
1400
|
+
} | undefined;
|
|
1401
|
+
disabled?: boolean | undefined;
|
|
1402
|
+
type: string;
|
|
1403
|
+
}[];
|
|
1404
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1405
|
+
status: "ok" | "failed";
|
|
1406
|
+
data?: unknown;
|
|
1407
|
+
error?: string;
|
|
1408
|
+
}>>;
|
|
1409
|
+
} | {
|
|
1410
|
+
name: string;
|
|
1411
|
+
description: string;
|
|
1412
|
+
label: string;
|
|
1413
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1414
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1415
|
+
itemType: import("@sinclair/typebox").TString;
|
|
1416
|
+
entries: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
1417
|
+
itemId: import("@sinclair/typebox").TString;
|
|
1418
|
+
tags: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
1419
|
+
type: import("@sinclair/typebox").TString;
|
|
1420
|
+
props: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1421
|
+
children: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1422
|
+
meta: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1423
|
+
custom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1424
|
+
disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1425
|
+
}>>;
|
|
1426
|
+
}>>;
|
|
1427
|
+
publish: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1428
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1429
|
+
}>;
|
|
1430
|
+
execute: (toolCallId: string, params: {
|
|
1431
|
+
siteId?: string | undefined;
|
|
1432
|
+
publish?: boolean | undefined;
|
|
1433
|
+
acknowledgeReplacement?: string | undefined;
|
|
1434
|
+
entries: {
|
|
1435
|
+
tags: {
|
|
1436
|
+
custom?: boolean | undefined;
|
|
1437
|
+
props?: {
|
|
1438
|
+
[x: string]: unknown;
|
|
1439
|
+
} | undefined;
|
|
1440
|
+
children?: string | undefined;
|
|
1441
|
+
meta?: {
|
|
1442
|
+
[x: string]: unknown;
|
|
1443
|
+
} | undefined;
|
|
1444
|
+
disabled?: boolean | undefined;
|
|
1445
|
+
type: string;
|
|
1446
|
+
}[];
|
|
1447
|
+
itemId: string;
|
|
1448
|
+
}[];
|
|
1449
|
+
itemType: string;
|
|
1450
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1451
|
+
status: "ok" | "failed";
|
|
1452
|
+
data?: unknown;
|
|
1453
|
+
error?: string;
|
|
1454
|
+
}>>;
|
|
1455
|
+
} | {
|
|
1456
|
+
name: string;
|
|
1457
|
+
description: string;
|
|
1458
|
+
label: string;
|
|
1459
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1460
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1461
|
+
pageType: import("@sinclair/typebox").TString;
|
|
1462
|
+
pageId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1463
|
+
}>;
|
|
1464
|
+
execute: (toolCallId: string, params: {
|
|
1465
|
+
siteId?: string | undefined;
|
|
1466
|
+
pageId?: string | undefined;
|
|
1467
|
+
pageType: string;
|
|
1468
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1469
|
+
status: "ok" | "failed";
|
|
1470
|
+
data?: unknown;
|
|
1471
|
+
error?: string;
|
|
1472
|
+
}>>;
|
|
1473
|
+
} | {
|
|
1474
|
+
name: string;
|
|
1475
|
+
description: string;
|
|
1476
|
+
label: string;
|
|
1477
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1478
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1479
|
+
pageType: import("@sinclair/typebox").TString;
|
|
1480
|
+
}>;
|
|
1481
|
+
execute: (toolCallId: string, params: {
|
|
1482
|
+
siteId?: string | undefined;
|
|
1483
|
+
pageType: string;
|
|
1484
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1485
|
+
status: "ok" | "failed";
|
|
1486
|
+
data?: unknown;
|
|
1487
|
+
error?: string;
|
|
1488
|
+
}>>;
|
|
1489
|
+
} | {
|
|
1490
|
+
name: string;
|
|
1491
|
+
description: string;
|
|
1492
|
+
label: string;
|
|
1493
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1494
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1495
|
+
pageType: import("@sinclair/typebox").TString;
|
|
1496
|
+
tags: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
|
|
1497
|
+
type: import("@sinclair/typebox").TString;
|
|
1498
|
+
props: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1499
|
+
children: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1500
|
+
meta: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
|
|
1501
|
+
custom: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1502
|
+
disabled: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
|
|
1503
|
+
}>>;
|
|
1504
|
+
pageId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1505
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1506
|
+
}>;
|
|
1507
|
+
execute: (toolCallId: string, params: {
|
|
1508
|
+
siteId?: string | undefined;
|
|
1509
|
+
pageId?: string | undefined;
|
|
1510
|
+
acknowledgeReplacement?: string | undefined;
|
|
1511
|
+
tags: {
|
|
1512
|
+
custom?: boolean | undefined;
|
|
1513
|
+
props?: {
|
|
1514
|
+
[x: string]: unknown;
|
|
1515
|
+
} | undefined;
|
|
1516
|
+
children?: string | undefined;
|
|
1517
|
+
meta?: {
|
|
1518
|
+
[x: string]: unknown;
|
|
1519
|
+
} | undefined;
|
|
1520
|
+
disabled?: boolean | undefined;
|
|
1521
|
+
type: string;
|
|
1522
|
+
}[];
|
|
1523
|
+
pageType: string;
|
|
1524
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1525
|
+
status: "ok" | "failed";
|
|
1526
|
+
data?: unknown;
|
|
1527
|
+
error?: string;
|
|
1528
|
+
}>>;
|
|
1529
|
+
} | {
|
|
1530
|
+
name: string;
|
|
1531
|
+
description: string;
|
|
1532
|
+
label: string;
|
|
1533
|
+
parameters: import("@sinclair/typebox").TObject<{
|
|
1534
|
+
siteId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1535
|
+
pageType: import("@sinclair/typebox").TString;
|
|
1536
|
+
pageId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1537
|
+
acknowledgeReplacement: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
|
|
1538
|
+
}>;
|
|
1539
|
+
execute: (toolCallId: string, params: {
|
|
1540
|
+
siteId?: string | undefined;
|
|
1541
|
+
pageId?: string | undefined;
|
|
1542
|
+
acknowledgeReplacement?: string | undefined;
|
|
1543
|
+
pageType: string;
|
|
1544
|
+
}, signal?: AbortSignal) => Promise<import("./tools/_factory.js").WixToolResult<{
|
|
1545
|
+
status: "ok" | "failed";
|
|
1546
|
+
data?: unknown;
|
|
1547
|
+
error?: string;
|
|
1548
|
+
}>>;
|
|
1311
1549
|
} | {
|
|
1312
1550
|
name: string;
|
|
1313
1551
|
description: string;
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
// plugin config (with `${ENV_VAR}` substitution), never from the
|
|
17
17
|
// LLM's parameter space.
|
|
18
18
|
import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
|
|
19
|
-
import { resolveConfig } from "./config.js";
|
|
19
|
+
import { DEFAULT_APPROVAL_REQUIRED, resolveConfig } from "./config.js";
|
|
20
20
|
import { createApprovalHook } from "./hooks/approval.js";
|
|
21
21
|
import { buildBlogTools } from "./tools/blog.js";
|
|
22
22
|
import { buildBookingsTools } from "./tools/bookings.js";
|
|
@@ -108,6 +108,21 @@ export function registerWixPlugin(api) {
|
|
|
108
108
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
109
109
|
api.on("before_tool_call", approvalHandler);
|
|
110
110
|
api.logger.info(`wix-openclaw: ready — ${allTools.length} tools registered, ${config.approvalRequired.size} approval-gated, ${config.allowedSiteIds.length} allowed site(s)`);
|
|
111
|
+
// SAID, NOT SILENTLY FIXED. An install that carries an explicit
|
|
112
|
+
// `approvalRequired` keeps it — that list may be a deliberate choice (a
|
|
113
|
+
// client that cannot render approval prompts has to empty it). But an
|
|
114
|
+
// upgrade also inherits a list written before these tools existed, and the
|
|
115
|
+
// difference between the two is invisible from here. So the gap is named at
|
|
116
|
+
// boot rather than closed behind the operator's back or left unmentioned.
|
|
117
|
+
const ungated = allTools
|
|
118
|
+
.map((t) => t.name)
|
|
119
|
+
.filter((name) => DEFAULT_APPROVAL_REQUIRED.includes(name) &&
|
|
120
|
+
!config.approvalRequired.has(name));
|
|
121
|
+
if (ungated.length > 0) {
|
|
122
|
+
api.logger.warn(`wix-openclaw: ${ungated.length} destructive tool(s) registered WITHOUT approval — ` +
|
|
123
|
+
`${ungated.join(", ")}. They are gated by default; this instance's ` +
|
|
124
|
+
"`approvalRequired` does not list them.");
|
|
125
|
+
}
|
|
111
126
|
}
|
|
112
127
|
// ANNOTATED, NOT INFERRED. The inferred type of this default export reaches
|
|
113
128
|
// into an openclaw build-internal chunk (`plugin-entry-*.js`), which TypeScript
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,6BAA6B;AAC7B,EAAE;AACF,kBAAkB;AAClB,kEAAkE;AAClE,mEAAmE;AACnE,uEAAuE;AACvE,+CAA+C;AAC/C,kEAAkE;AAClE,sEAAsE;AACtE,+CAA+C;AAC/C,kEAAkE;AAClE,sEAAsE;AACtE,8BAA8B;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|