@kywi-software/mcp 0.12.1 → 0.14.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/AGENT-PATTERNS.md CHANGED
@@ -356,7 +356,7 @@ authored elsewhere in the admin).
356
356
 
357
357
  | `name` | Purpose |
358
358
  |---|---|
359
- | `variantContainer` | Module-level arms revealed client-side per audience read §8 first |
359
+ | ~~`variantContainer`~~ | **Retired in 0.13.0** — the raw-HTML module. Use the `moduleVariantContainer` NODE (§8) or `personalize_module`. Existing placements still render |
360
360
  | `personalizationBadge` | Optional inline status pill that opens the global transparency panel — not needed on ordinary pages (§8) |
361
361
  | `socialShare` | Share links for a URL/title across networks |
362
362
  | `map` | Embedded map at a lat/lng or address |
@@ -517,47 +517,62 @@ If no, skip it — the machinery is there when they grow into it.
517
517
 
518
518
  ### Variant containers: pick the right shape
519
519
 
520
- Two different things are called `variantContainer`, and they are not
521
- interchangeable.
522
-
523
- - **Section-level** — a *region* node, sibling of sections (`defaultSections` +
524
- `variants[].sections`). Resolved **on the server** from the visitor's audience
525
- or experiment arm, so the first paint is already correct: no flash, and the
526
- page is complete with JavaScript off. This is the default for anything the
527
- server can know rule-based audiences (UTM, referrer, the `kywi_audience`
528
- pin) and A/B experiments. Since 0.6.3 it also renders in the layout editor as
529
- a badged block with a **variant switcher** (internal editor code
530
- `activeArms`, the `VariantArm` type, `data-arm-id` still says "arm"; the
531
- persisted layout field is `variants`), each variant editable with the
532
- ordinary section/column/module tools, so server-resolution no longer costs
533
- the owner their editing surface. Since kywi-cms#119, the owner doesn't need
534
- an agent to hand-author this shape at all: the section chrome in the
535
- admin layout editor and in the in-place front-of-site overlay alike —
536
- offers **Personalize this section** / **A/B test** actions that wrap an
537
- ordinary section into a section-level variant container on the spot,
538
- seeding the default variant from the section's current content and
539
- opening straight into its config (audience/experiment picker included).
540
- An agent only needs to reach for `update_layout` when scripting bulk
541
- changes or building a container the UI can't reach.
542
- - **Module-level**the `variantContainer` *module*, placed in a column; its
543
- variants are HTML strings (`defaultContent`, `variants: [{audienceId, label,
544
- content}]`). Every variant ships in the HTML (default visible, the rest
545
- `display:none`) and the browser runtime reveals the matching one. Use it
546
- **only for signals the server cannot read at first paint** — in practice, a
547
- self-ID answer held in `localStorage`.
520
+ Three different things have been called `variantContainer`, and they are not
521
+ interchangeable. Two of them are current.
522
+
523
+ - **Section-level `variantContainer`** — a *region* node, sibling of sections
524
+ (`defaultSections` + `variants[].sections`). Resolved **on the server** from
525
+ the visitor's audience or experiment arm, so the first paint is already
526
+ correct: no flash, and the page is complete with JavaScript off. Reach for it
527
+ when a whole band varies. Since kywi-cms#119 the owner does not need an agent
528
+ to author it: the section chrome in the admin layout editor and the
529
+ front-of-site overlay alike offers **Personalize** / **A/B test** actions
530
+ that wrap the section on the spot, seeding the default variant from its
531
+ current content and opening straight into its config.
532
+ - **Module-level `moduleVariantContainer`** (kywi-cms#161) a *column* node,
533
+ sibling of modules (`defaultModule` + `variants[].module`, exactly one
534
+ module per arm; arm module types may differ, so an image arm can face a
535
+ text arm). Also resolved **entirely on the server** same no-flash,
536
+ JS-off-complete guarantee. Reach for it when ONE element varies inside a
537
+ section that otherwise stays put: a headline, a CTA, a pricing card. The
538
+ owner reaches it from the module's own hover chrome or its props rail (the
539
+ same two actions), and an agent reaches it with **`personalize_module`**
540
+ (kywi-cms#162), which does the read-modify-write wrap and hands back the
541
+ container and arm ids. It always seeds one variant arm — a detached copy of
542
+ the module's current content whether or not `audienceId` is passed: pass
543
+ it to bind the arm immediately, or omit it and the arm starts unbound
544
+ (`''`, serving nobody) until something binds it later.
545
+ - **The legacy `variantContainer` MODULE** retired in 0.13.0 (kywi-cms#163).
546
+ Its arms were raw HTML strings revealed client-side by `@kywi-software/js`.
547
+ It is gone from the palette and from `list_module_types`, and
548
+ `personalize_module` is what you want instead. **Existing placements keep
549
+ rendering and stay editable** — nothing was deleted and no migration is
550
+ forced — so a page that already has one is not broken, it is simply not the
551
+ shape to add more of.
552
+
553
+ **Neither container ever nests.** Not one inside the other, not one inside
554
+ itself. A module already sitting in a personalized section's arm cannot be
555
+ promoted — the editor withholds the action, `personalize_module` returns a
556
+ structured error saying why, and `update_layout` rejects the shape outright.
557
+
558
+ **`ab_test` mode needs its own `experimentId`, and it must be FRESH.** Both
559
+ container kinds refuse to validate without one, and both the editors and
560
+ `personalize_module` mint a new id per container. Copying an experiment id
561
+ between pages silently enrols a second page's container in the first page's run.
548
562
 
549
563
  Four traps, each of which fails silently:
550
564
 
551
- 1. **Use the layout module, not the React component.** `VariantContainer.tsx`
552
- (`core/src/components/personalization/`) has a loading branch that renders
553
- the skeleton and nothing else — a JS-off visitor gets an empty container —
554
- and its `ab_test` path draws a fresh `Math.random()` per render, so the same
555
- visitor sees a different arm on every refresh. The layout module
556
- (`VariantContainerModule`) always renders the default arm.
557
- 2. **Leave `skeleton` off.** With `skeleton: true` the container ships
558
- `aria-busy="true"` and only the client runtime clears it a JS-off visitor
559
- sits in a loading state forever.
560
- 3. **An audience match beats the experiment.** `resolveVariant` returns the
565
+ 1. **Don't reach for the retired `variantContainer` module, or the React
566
+ component.** `VariantContainer.tsx` (`core/src/components/personalization/`)
567
+ has a loading branch that renders the skeleton and nothing else — a JS-off
568
+ visitor gets an empty container — and its `ab_test` path draws a fresh
569
+ `Math.random()` per render, so the same visitor sees a different arm on
570
+ every refresh. The layout module (`VariantContainerModule`) always renders
571
+ the default arm.
572
+ 2. (Legacy module only.) **Leave `skeleton` off.** With `skeleton: true` the
573
+ container ships `aria-busy="true"` and only the client runtime clears it —
574
+ a JS-off visitor sits in a loading state forever.
575
+ 3. **An audience match beats the experiment.** `selectVariantArm` returns the
561
576
  audience arm first, so a visitor who matches an audience never enters the
562
577
  split. Don't run an experiment and an audience variant on the same container.
563
578
  4. **The client runtime needs `/kywi.js`.** Self-ID, behavioral re-evaluation
@@ -34,7 +34,15 @@ export interface ModuleTypeCategory {
34
34
  category: string;
35
35
  modules: ModuleTypeSummary[];
36
36
  }
37
- /** Flat list of every built-in module, summarized. */
37
+ /**
38
+ * Flat list of every built-in module an agent may still place, summarized.
39
+ *
40
+ * Deprecated entries are excluded (kywi-cms#163): the legacy
41
+ * `variantContainer` module is superseded by the real `moduleVariantContainer`
42
+ * node, and an agent told about both would reach for the wrong one. It is only
43
+ * hidden — existing placements still render, and `update_layout` still accepts
44
+ * the type.
45
+ */
38
46
  export declare function listModuleTypeSummaries(): ModuleTypeSummary[];
39
47
  /** Same list, grouped by category (registry declaration order within each group). */
40
48
  export declare function listModuleTypesByCategory(): ModuleTypeCategory[];
@@ -1 +1 @@
1
- {"version":3,"file":"module-types.d.ts","sourceRoot":"","sources":["../src/module-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAkBD,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAE7D;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,IAAI,kBAAkB,EAAE,CAQhE;AAWD,wBAAgB,qBAAqB,IAAI;IACvC,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1C,CAIA;AAQD,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAM/D"}
1
+ {"version":3,"file":"module-types.d.ts","sourceRoot":"","sources":["../src/module-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE;;;;;;;;;;GAUG;AAIH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,EAAE,CAE7D;AAED,qFAAqF;AACrF,wBAAgB,yBAAyB,IAAI,kBAAkB,EAAE,CAQhE;AAWD,wBAAgB,qBAAqB,IAAI;IACvC,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1C,CAIA;AAQD,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAM/D"}
@@ -14,9 +14,17 @@ function summarizeModule(mod) {
14
14
  }
15
15
  return { name: mod.name, label: mod.label, category: mod.category ?? 'Other', props };
16
16
  }
17
- /** Flat list of every built-in module, summarized. */
17
+ /**
18
+ * Flat list of every built-in module an agent may still place, summarized.
19
+ *
20
+ * Deprecated entries are excluded (kywi-cms#163): the legacy
21
+ * `variantContainer` module is superseded by the real `moduleVariantContainer`
22
+ * node, and an agent told about both would reach for the wrong one. It is only
23
+ * hidden — existing placements still render, and `update_layout` still accepts
24
+ * the type.
25
+ */
18
26
  export function listModuleTypeSummaries() {
19
- return BUILT_IN_MODULES.map(summarizeModule);
27
+ return BUILT_IN_MODULES.filter(mod => !mod.deprecated).map(summarizeModule);
20
28
  }
21
29
  /** Same list, grouped by category (registry declaration order within each group). */
22
30
  export function listModuleTypesByCategory() {
@@ -1 +1 @@
1
- {"version":3,"file":"module-types.js","sourceRoot":"","sources":["../src/module-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-types.js","sourceRoot":"","sources":["../src/module-types.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,36 @@ interface ModuleNode {
6
6
  instanceId: string;
7
7
  props: Record<string, unknown>;
8
8
  style: Record<string, string>;
9
+ componentId?: string;
9
10
  }
11
+ /**
12
+ * One arm of a MODULE-level variant container (kywi-cms#162).
13
+ *
14
+ * `audienceId` is REQUIRED, matching the core `ModuleVariantEntry` (owner
15
+ * amendment, kywi-cms#161): `''` is the single legal spelling of "unbound
16
+ * draft arm," never an absent field.
17
+ */
18
+ interface ModuleVariantEntryNode {
19
+ id: string;
20
+ label: string;
21
+ audienceId: string;
22
+ weight?: number;
23
+ module: ModuleNode;
24
+ }
25
+ interface ModuleVariantContainerNode {
26
+ id: string;
27
+ type: 'moduleVariantContainer';
28
+ mode: 'personalization' | 'ab_test';
29
+ experimentId?: string;
30
+ winnerId?: string;
31
+ defaultModule: ModuleNode;
32
+ variants: ModuleVariantEntryNode[];
33
+ }
34
+ type ColumnNode = ModuleNode | ModuleVariantContainerNode;
10
35
  interface LayoutColumn {
11
36
  id: string;
12
37
  width: number;
13
- nodes: ModuleNode[];
38
+ nodes: ColumnNode[];
14
39
  }
15
40
  interface LayoutSection {
16
41
  id: string;
@@ -18,8 +43,18 @@ interface LayoutSection {
18
43
  style: Record<string, string>;
19
44
  columns: LayoutColumn[];
20
45
  }
46
+ /** A SECTION-level variantContainer (sibling of sections in a region). */
47
+ interface SectionVariantContainerLike {
48
+ id: string;
49
+ type: 'variantContainer';
50
+ defaultSections?: LayoutSection[];
51
+ variants?: Array<{
52
+ sections?: LayoutSection[];
53
+ }>;
54
+ }
55
+ type RegionNodeLike = LayoutSection | SectionVariantContainerLike;
21
56
  interface LayoutDocument {
22
- regions: Record<string, LayoutSection[]>;
57
+ regions: Record<string, RegionNodeLike[]>;
23
58
  }
24
59
  declare function findSection(layout: LayoutDocument, region: string, rowId: string): LayoutSection | undefined;
25
60
  declare function findColumn(section: LayoutSection, colId: string): LayoutColumn | undefined;
@@ -158,6 +193,59 @@ export declare function handleRemoveRow(sdk: KywiSdkScope, args: {
158
193
  }];
159
194
  isError: true;
160
195
  }>;
196
+ /** Where a module sits in a page's REGION-LEVEL sections (never inside a personalized band). */
197
+ export interface ModuleSlot {
198
+ section: LayoutSection;
199
+ column: LayoutColumn;
200
+ index: number;
201
+ module: ModuleNode;
202
+ }
203
+ /**
204
+ * Find a module by id in a region's own sections only.
205
+ *
206
+ * Deliberately NOT arm-aware: a module inside a section-level variantContainer
207
+ * arm may not be promoted (containers never nest), so "not found here" and
208
+ * "found, but ineligible" are answered separately below — an agent that gets a
209
+ * bare "not found" for a module it can see in `get_layout` will keep retrying.
210
+ */
211
+ export declare function findModuleSlot(layout: LayoutDocument, moduleId: string): ModuleSlot | null;
212
+ /**
213
+ * Promote one module to a module-level variant container, in place.
214
+ *
215
+ * The read-modify-write counterpart of the editor's
216
+ * `WRAP_MODULE_IN_VARIANT_CONTAINER`: the original module becomes the Default
217
+ * arm — so the page renders identically until it's bound — and this ALWAYS
218
+ * seeds exactly one variant arm from a DETACHED copy of it (fresh ids, no
219
+ * `componentId`, so editing the challenger never rewrites a shared component).
220
+ * Matches the editor's `ADD_MODULE_VARIANT_ARM` contract: an `audienceId`
221
+ * binds the seeded arm immediately; omitting it leaves the arm UNBOUND
222
+ * (`audienceId: ''`) — a draft that serves nobody until it's bound — never
223
+ * an empty `variants: []`.
224
+ *
225
+ * `ab_test` mints a FRESH `experimentId` and never carries a winner: an
226
+ * experiment id copied between pages silently enrols a second page's container
227
+ * in the first page's run.
228
+ */
229
+ export declare function handlePersonalizeModule(sdk: KywiSdkScope, args: {
230
+ type: string;
231
+ id: string;
232
+ moduleId: string;
233
+ mode: 'personalization' | 'ab_test';
234
+ audienceId?: string | undefined;
235
+ label?: string | undefined;
236
+ }): Promise<{
237
+ content: [{
238
+ type: "text";
239
+ text: string;
240
+ }];
241
+ isError?: undefined;
242
+ } | {
243
+ content: [{
244
+ type: "text";
245
+ text: string;
246
+ }];
247
+ isError: true;
248
+ }>;
161
249
  export { findSection, findColumn, findModule, parseLayout };
162
250
  export declare function registerLayoutTools(server: McpServer, sdk: KywiSdkScope): void;
163
251
  //# sourceMappingURL=layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"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"}
@@ -5,13 +5,13 @@ function findSection(layout, region, rowId) {
5
5
  const sections = layout.regions[region];
6
6
  if (!sections)
7
7
  return undefined;
8
- return sections.find((s) => s.id === rowId);
8
+ return sections.find((s) => s.id === rowId && s.type === 'section');
9
9
  }
10
10
  function findColumn(section, colId) {
11
11
  return section.columns.find((c) => c.id === colId);
12
12
  }
13
13
  function findModule(column, instanceId) {
14
- return column.nodes.find((n) => n.instanceId === instanceId);
14
+ return column.nodes.find((n) => n.type !== 'moduleVariantContainer' && n.instanceId === instanceId);
15
15
  }
16
16
  function parseLayout(content) {
17
17
  // Core 0.6.1 stores the layout as a `layout` jsonb object. Older content used a
@@ -79,7 +79,7 @@ export async function handleRemoveModule(sdk, args) {
79
79
  if (!column)
80
80
  return errorResult(`Column '${args.colId}' not found in row '${args.rowId}'`);
81
81
  const before = column.nodes.length;
82
- column.nodes = column.nodes.filter((n) => n.instanceId !== args.instanceId);
82
+ column.nodes = column.nodes.filter((n) => n.type === 'moduleVariantContainer' || n.instanceId !== args.instanceId);
83
83
  if (column.nodes.length === before) {
84
84
  return errorResult(`Module '${args.instanceId}' not found in column '${args.colId}'`);
85
85
  }
@@ -152,6 +152,119 @@ export async function handleRemoveRow(sdk, args) {
152
152
  });
153
153
  return updated ? textResult({ removed: args.rowId, layout }) : errorResult('Failed to save layout');
154
154
  }
155
+ /**
156
+ * Find a module by id in a region's own sections only.
157
+ *
158
+ * Deliberately NOT arm-aware: a module inside a section-level variantContainer
159
+ * arm may not be promoted (containers never nest), so "not found here" and
160
+ * "found, but ineligible" are answered separately below — an agent that gets a
161
+ * bare "not found" for a module it can see in `get_layout` will keep retrying.
162
+ */
163
+ export function findModuleSlot(layout, moduleId) {
164
+ for (const nodes of Object.values(layout.regions ?? {})) {
165
+ for (const node of nodes ?? []) {
166
+ if (node.type !== 'section')
167
+ continue;
168
+ for (const column of node.columns ?? []) {
169
+ for (let i = 0; i < (column.nodes ?? []).length; i++) {
170
+ const entry = column.nodes[i];
171
+ if (entry && entry.type !== 'moduleVariantContainer' && entry.id === moduleId) {
172
+ return { section: node, column, index: i, module: entry };
173
+ }
174
+ }
175
+ }
176
+ }
177
+ }
178
+ return null;
179
+ }
180
+ /** Is this module id inside a SECTION-level variantContainer arm, or already inside a module container? */
181
+ function describeIneligibility(layout, moduleId) {
182
+ for (const nodes of Object.values(layout.regions ?? {})) {
183
+ for (const node of nodes ?? []) {
184
+ if (node.type === 'variantContainer') {
185
+ const arms = [
186
+ ...(node.defaultSections ?? []),
187
+ ...(node.variants ?? []).flatMap((v) => v.sections ?? []),
188
+ ];
189
+ for (const section of arms) {
190
+ for (const column of section.columns ?? []) {
191
+ for (const entry of column.nodes ?? []) {
192
+ if (entry.id === moduleId) {
193
+ return `Module '${moduleId}' is already inside a personalized section (variantContainer '${node.id}'). Personalization containers never nest — edit that section's variants instead.`;
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ if (node.type !== 'section')
200
+ continue;
201
+ for (const column of node.columns ?? []) {
202
+ for (const entry of column.nodes ?? []) {
203
+ if (entry.type !== 'moduleVariantContainer')
204
+ continue;
205
+ const mvc = entry;
206
+ if (mvc.id === moduleId || mvc.defaultModule.id === moduleId || mvc.variants.some((v) => v.module.id === moduleId)) {
207
+ return `Module '${moduleId}' is already personalized by moduleVariantContainer '${mvc.id}'. Add a variant to it with update_layout instead.`;
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+ return null;
214
+ }
215
+ /**
216
+ * Promote one module to a module-level variant container, in place.
217
+ *
218
+ * The read-modify-write counterpart of the editor's
219
+ * `WRAP_MODULE_IN_VARIANT_CONTAINER`: the original module becomes the Default
220
+ * arm — so the page renders identically until it's bound — and this ALWAYS
221
+ * seeds exactly one variant arm from a DETACHED copy of it (fresh ids, no
222
+ * `componentId`, so editing the challenger never rewrites a shared component).
223
+ * Matches the editor's `ADD_MODULE_VARIANT_ARM` contract: an `audienceId`
224
+ * binds the seeded arm immediately; omitting it leaves the arm UNBOUND
225
+ * (`audienceId: ''`) — a draft that serves nobody until it's bound — never
226
+ * an empty `variants: []`.
227
+ *
228
+ * `ab_test` mints a FRESH `experimentId` and never carries a winner: an
229
+ * experiment id copied between pages silently enrols a second page's container
230
+ * in the first page's run.
231
+ */
232
+ export async function handlePersonalizeModule(sdk, args) {
233
+ const item = await sdk.content.getById(args.id);
234
+ if (!item)
235
+ return errorResult('Content not found');
236
+ const layout = parseLayout(item) ?? { regions: {} };
237
+ const slot = findModuleSlot(layout, args.moduleId);
238
+ if (!slot) {
239
+ const why = describeIneligibility(layout, args.moduleId);
240
+ return errorResult(why ?? `Module '${args.moduleId}' not found in this layout`);
241
+ }
242
+ const detached = (node) => ({
243
+ id: crypto.randomUUID(),
244
+ type: node.type,
245
+ instanceId: crypto.randomUUID(),
246
+ props: JSON.parse(JSON.stringify(node.props ?? {})),
247
+ style: JSON.parse(JSON.stringify(node.style ?? {})),
248
+ });
249
+ const armId = crypto.randomUUID();
250
+ const container = {
251
+ id: crypto.randomUUID(),
252
+ type: 'moduleVariantContainer',
253
+ mode: args.mode,
254
+ ...(args.mode === 'ab_test' ? { experimentId: crypto.randomUUID() } : {}),
255
+ defaultModule: slot.module,
256
+ variants: [{ id: armId, label: args.label ?? '', audienceId: args.audienceId ?? '', module: detached(slot.module) }],
257
+ };
258
+ slot.column.nodes[slot.index] = container;
259
+ const updated = await sdk.content.update(args.type, args.id, { layout });
260
+ if (!updated)
261
+ return errorResult('Failed to save layout');
262
+ return textResult({
263
+ container,
264
+ armId,
265
+ layout,
266
+ });
267
+ }
155
268
  // Export helpers for testing
156
269
  export { findSection, findColumn, findModule, parseLayout };
157
270
  // ─── Registration ───────────────────────────────────────────────────────────
@@ -164,16 +277,17 @@ export function registerLayoutTools(server, sdk) {
164
277
  },
165
278
  }, async (args) => handleGetLayout(sdk, args));
166
279
  server.registerTool('update_layout', {
167
- description: 'Replace the entire layout JSON for a content item. Shape: `{ regions: { [regionName]: Section[] } }`, ' +
280
+ description: 'Replace the entire layout JSON for a content item. Shape: `{ regions: { [regionName]: RegionNode[] } }`, ' +
168
281
  'where each section has `columns` (each `{ id, width, nodes }`; widths in a row should sum to 12) whose ' +
169
- '`nodes` are ModuleNodes — call list_module_types for valid `type` values and their props. A region can ' +
170
- 'also hold a section-level `variantContainer` (sibling of sections, mode `personalization` | `ab_test`, ' +
171
- 'server-resolved audience/experiment variants no flash of default content), while a column can hold a ' +
172
- 'module-level `variantContainer` module (client-revealed HTML arms via `defaultContent` / ' +
173
- '`variants[].content`, for self-ID-driven swaps). Editors can also wrap an existing section into a ' +
174
- 'section-level variantContainer directly in the layout editor or front-of-site overlay via the section ' +
175
- "chrome's \"Personalize this section\" / \"A/B test\" action you don't need to hand-author this JSON just " +
176
- 'to enable personalization on a section that already exists. See get_building_patterns for the full reference.',
282
+ '`nodes` are ModuleNodes — call list_module_types for valid `type` values and their props. ' +
283
+ 'PERSONALIZATION COMES IN TWO GRANULARITIES, both server-resolved (no flash of default content): a region ' +
284
+ 'can hold a section-level `variantContainer` (sibling of sections; `defaultSections` + `variants[].sections`), ' +
285
+ 'and a COLUMN can hold a module-level `moduleVariantContainer` (`defaultModule` + `variants[].module`, one ' +
286
+ 'module per arm, arm types may differ). Both take `mode: personalization | ab_test`, and `ab_test` requires ' +
287
+ 'its own fresh `experimentId`. Containers never nest neither inside the other, nor inside itself. ' +
288
+ "You rarely need to hand-author either shape: the editor's section chrome offers Personalize / A/B test on a " +
289
+ 'section, its module chrome offers the same on a module, and the `personalize_module` tool does the module ' +
290
+ 'wrap over the API. See get_building_patterns for the full reference.',
177
291
  inputSchema: {
178
292
  type: z.string().describe('Content type name'),
179
293
  id: z.string().describe('Content ID'),
@@ -183,9 +297,9 @@ export function registerLayoutTools(server, sdk) {
183
297
  server.registerTool('add_module', {
184
298
  description: 'Add a module to a specific column in a layout row. `module` must be a `type` name from list_module_types ' +
185
299
  '(built-ins) or a custom module defined in kywi.config.ts — call list_module_types first if you have not ' +
186
- "already. `props` should match that module's props schema. For section-level A/B tests or audience " +
187
- 'variants, add a `variantContainer` row instead (see update_layout / get_building_patterns); for ' +
188
- 'client-revealed self-ID swaps within a column, use a `variantContainer` module.',
300
+ "already. `props` should match that module's props schema. " +
301
+ 'For section-level A/B tests or audience variants, add a `variantContainer` row (see update_layout); to vary ' +
302
+ 'ONE module, add it normally and then call personalize_module.',
189
303
  inputSchema: {
190
304
  type: z.string().describe('Content type name'),
191
305
  id: z.string().describe('Content ID'),
@@ -239,5 +353,23 @@ export function registerLayoutTools(server, sdk) {
239
353
  rowId: z.string().describe('Row/section ID to remove'),
240
354
  },
241
355
  }, async (args) => handleRemoveRow(sdk, args));
356
+ server.registerTool('personalize_module', {
357
+ description: 'Turn ONE module in a layout into a personalized (audience) or A/B-tested module, in place. The module ' +
358
+ 'becomes the Default arm of a `moduleVariantContainer`, so the page renders identically until the seeded arm ' +
359
+ 'is bound; it always seeds one variant arm as a detached copy of the module — pass `audienceId` (and ' +
360
+ "optionally `label`) to bind it immediately, otherwise it starts unbound ('' — serves nobody until bound). " +
361
+ 'A/B mode mints a fresh experiment id — never reuse one across pages. Refused for a module already inside a ' +
362
+ 'personalized SECTION or an existing personalized module: personalization containers never nest. Edit each ' +
363
+ "arm's content afterwards with update_layout, or hand the page to the owner — the editor's module chrome " +
364
+ 'offers the same Personalize / A/B test actions.',
365
+ inputSchema: {
366
+ type: z.string().describe('Content type name'),
367
+ id: z.string().describe('Content ID'),
368
+ moduleId: z.string().describe('The `id` of the ModuleNode to promote (not its instanceId)'),
369
+ mode: z.enum(['personalization', 'ab_test']).describe('personalization = by audience; ab_test = weighted split'),
370
+ audienceId: z.string().optional().describe('Bind the seeded variant to this audience id (personalization) or variant key (ab_test); omit to leave it unbound'),
371
+ label: z.string().optional().describe('Human label for the seeded variant'),
372
+ },
373
+ }, async (args) => handlePersonalizeModule(sdk, args));
242
374
  }
243
375
  //# sourceMappingURL=layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/site/tools/layout.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kywi-software/mcp",
3
- "version": "0.12.1",
3
+ "version": "0.14.0",
4
4
  "description": "Model Context Protocol servers for Kywi CMS — a site server (content/nav/media over the REST API) and a developer server (kywi.config.ts scaffolding and mutation).",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -47,8 +47,8 @@
47
47
  "dependencies": {
48
48
  "@modelcontextprotocol/sdk": "^1.12.0",
49
49
  "zod": "^3.25.0",
50
- "@kywi-software/core": "0.12.1",
51
- "@kywi-software/sdk": "0.12.1"
50
+ "@kywi-software/core": "0.14.0",
51
+ "@kywi-software/sdk": "0.14.0"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/node": "^20.0.0",