@caelo-cms/shared 0.11.0 → 0.11.2

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 (137) hide show
  1. package/dist/ai-tools.d.ts +32 -144
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +46 -139
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/bug-intake.d.ts +46 -3
  6. package/dist/bug-intake.d.ts.map +1 -1
  7. package/dist/bug-intake.js +52 -3
  8. package/dist/bug-intake.js.map +1 -1
  9. package/dist/build-page.d.ts +5 -5
  10. package/dist/build-page.d.ts.map +1 -1
  11. package/dist/build-page.js +14 -9
  12. package/dist/build-page.js.map +1 -1
  13. package/dist/content.d.ts +14 -2
  14. package/dist/content.d.ts.map +1 -1
  15. package/dist/content.js +73 -15
  16. package/dist/content.js.map +1 -1
  17. package/dist/css-scope-scan.js +1 -1
  18. package/dist/css-var-scan.js +3 -3
  19. package/dist/css-var-scan.js.map +1 -1
  20. package/dist/escaped-line-breaks.d.ts +44 -0
  21. package/dist/escaped-line-breaks.d.ts.map +1 -0
  22. package/dist/escaped-line-breaks.js +203 -0
  23. package/dist/escaped-line-breaks.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/interactions.js +5 -5
  29. package/dist/interactions.js.map +1 -1
  30. package/dist/lists/default-types.d.ts +12 -0
  31. package/dist/lists/default-types.d.ts.map +1 -1
  32. package/dist/lists/default-types.js +36 -0
  33. package/dist/lists/default-types.js.map +1 -1
  34. package/dist/lists/fields.d.ts.map +1 -1
  35. package/dist/lists/fields.js +1 -0
  36. package/dist/lists/fields.js.map +1 -1
  37. package/dist/lists/render-data.d.ts +9 -0
  38. package/dist/lists/render-data.d.ts.map +1 -1
  39. package/dist/lists/render-deps.d.ts +4 -3
  40. package/dist/lists/render-deps.d.ts.map +1 -1
  41. package/dist/lists/render-deps.js +5 -3
  42. package/dist/lists/render-deps.js.map +1 -1
  43. package/dist/lists/resolve.d.ts +13 -0
  44. package/dist/lists/resolve.d.ts.map +1 -1
  45. package/dist/lists/resolve.js +95 -3
  46. package/dist/lists/resolve.js.map +1 -1
  47. package/dist/live-events.d.ts +44 -0
  48. package/dist/live-events.d.ts.map +1 -0
  49. package/dist/live-events.js +128 -0
  50. package/dist/live-events.js.map +1 -0
  51. package/dist/markup-structure.d.ts +20 -2
  52. package/dist/markup-structure.d.ts.map +1 -1
  53. package/dist/markup-structure.js +69 -3
  54. package/dist/markup-structure.js.map +1 -1
  55. package/dist/media.d.ts +15 -0
  56. package/dist/media.d.ts.map +1 -1
  57. package/dist/media.js.map +1 -1
  58. package/dist/module-id-tag.d.ts +4 -1
  59. package/dist/module-id-tag.d.ts.map +1 -1
  60. package/dist/module-id-tag.js +11 -2
  61. package/dist/module-id-tag.js.map +1 -1
  62. package/dist/nested-module-render.d.ts +13 -0
  63. package/dist/nested-module-render.d.ts.map +1 -1
  64. package/dist/nested-module-render.js +34 -0
  65. package/dist/nested-module-render.js.map +1 -1
  66. package/dist/preview-compose.d.ts +18 -1
  67. package/dist/preview-compose.d.ts.map +1 -1
  68. package/dist/preview-compose.js +26 -7
  69. package/dist/preview-compose.js.map +1 -1
  70. package/dist/redirect-plan.d.ts +13 -0
  71. package/dist/redirect-plan.d.ts.map +1 -1
  72. package/dist/redirect-plan.js +22 -0
  73. package/dist/redirect-plan.js.map +1 -1
  74. package/dist/seo.d.ts +21 -0
  75. package/dist/seo.d.ts.map +1 -1
  76. package/dist/seo.js +32 -0
  77. package/dist/seo.js.map +1 -1
  78. package/dist/source-text-transport.d.ts +28 -2
  79. package/dist/source-text-transport.d.ts.map +1 -1
  80. package/dist/source-text-transport.js +12 -4
  81. package/dist/source-text-transport.js.map +1 -1
  82. package/dist/template-sections.d.ts.map +1 -1
  83. package/dist/template-sections.js +17 -4
  84. package/dist/template-sections.js.map +1 -1
  85. package/dist/theme-render.js +11 -26
  86. package/dist/theme-render.js.map +1 -1
  87. package/dist/themes.d.ts.map +1 -1
  88. package/dist/themes.js +12 -9
  89. package/dist/themes.js.map +1 -1
  90. package/dist/version.d.ts +2 -2
  91. package/dist/version.js +1 -1
  92. package/package.json +1 -1
  93. package/src/__tests__/redos-hardening.test.ts +1 -0
  94. package/src/ai-tools-add-module-modes.test.ts +1 -1
  95. package/src/ai-tools.test.ts +7 -20
  96. package/src/ai-tools.ts +57 -151
  97. package/src/bug-intake.test.ts +48 -1
  98. package/src/bug-intake.ts +58 -3
  99. package/src/build-page.ts +14 -9
  100. package/src/content.test.ts +26 -1
  101. package/src/content.ts +84 -16
  102. package/src/css-scope-scan.ts +1 -1
  103. package/src/css-var-scan.ts +3 -3
  104. package/src/escaped-line-breaks.ts +221 -0
  105. package/src/index.ts +2 -0
  106. package/src/interactions.ts +5 -5
  107. package/src/link-refs.test.ts +1 -0
  108. package/src/lists/default-types.ts +39 -0
  109. package/src/lists/fields.ts +1 -0
  110. package/src/lists/list-fixtures.test.ts +9 -3
  111. package/src/lists/render-data.ts +9 -0
  112. package/src/lists/render-deps.ts +6 -3
  113. package/src/lists/resolve.test.ts +182 -5
  114. package/src/lists/resolve.ts +101 -3
  115. package/src/live-events.ts +138 -0
  116. package/src/markup-structure.test.ts +47 -0
  117. package/src/markup-structure.ts +74 -3
  118. package/src/media.ts +12 -0
  119. package/src/module-id-tag.test.ts +38 -0
  120. package/src/module-id-tag.ts +11 -2
  121. package/src/nested-module-render.test.ts +39 -0
  122. package/src/nested-module-render.ts +35 -0
  123. package/src/preview-compose-deferrals.test.ts +44 -0
  124. package/src/preview-compose.ts +47 -10
  125. package/src/redirect-plan.test.ts +25 -0
  126. package/src/redirect-plan.ts +24 -0
  127. package/src/seo.test.ts +58 -0
  128. package/src/seo.ts +49 -0
  129. package/src/source-text-transport.test.ts +98 -3
  130. package/src/source-text-transport.ts +15 -4
  131. package/src/template-engine-lists.test.ts +55 -0
  132. package/src/template-sections.ts +18 -4
  133. package/src/theme-importers/__tests__/proto-pollution.test.ts +13 -3
  134. package/src/theme-render-sanitize.test.ts +8 -0
  135. package/src/theme-render.ts +11 -26
  136. package/src/themes.ts +12 -7
  137. package/src/version.ts +1 -1
@@ -9,6 +9,7 @@
9
9
  * silent drops in the handler.
10
10
  */
11
11
  import { z } from "zod";
12
+ import type { SourceLanguage } from "./escaped-line-breaks.js";
12
13
  /**
13
14
  * An AI tool argument holding source text (html / css / js): the given
14
15
  * string schema, with whole-value transport encodings decoded first — a
@@ -18,121 +19,13 @@ import { z } from "zod";
18
19
  * is handled in one place instead of refused per tool.
19
20
  *
20
21
  * @param schema - the string schema (length caps, min) the decoded value must satisfy.
22
+ * @param language - the grammar of the value (`html`, `css`, `js`).
21
23
  */
22
- export declare function sourceTextArg<T extends z.ZodType<string>>(schema: T): z.ZodPreprocess<T, unknown>;
24
+ export declare function sourceTextArg<T extends z.ZodType<string>>(schema: T, language: SourceLanguage): z.ZodPreprocess<T, unknown>;
23
25
  export declare const positionInputSchema: z.ZodPreprocess<z.ZodUnion<readonly [z.ZodEnum<{
24
26
  top: "top";
25
27
  bottom: "bottom";
26
28
  }>, z.ZodPreprocess<z.ZodNumber, unknown>]>, unknown>;
27
- export declare const editModuleToolInput: z.ZodObject<{
28
- moduleId: z.ZodString;
29
- displayName: z.ZodOptional<z.ZodString>;
30
- description: z.ZodOptional<z.ZodString>;
31
- kind: z.ZodOptional<z.ZodEnum<{
32
- content: "content";
33
- chrome: "chrome";
34
- hero: "hero";
35
- cta: "cta";
36
- utility: "utility";
37
- }>>;
38
- type: z.ZodOptional<z.ZodString>;
39
- html: z.ZodOptional<z.ZodPreprocess<z.ZodString, unknown>>;
40
- css: z.ZodOptional<z.ZodPreprocess<z.ZodString, unknown>>;
41
- js: z.ZodOptional<z.ZodPreprocess<z.ZodString, unknown>>;
42
- fields: z.ZodOptional<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
43
- name: z.ZodString;
44
- kind: z.ZodEnum<{
45
- number: "number";
46
- boolean: "boolean";
47
- text: "text";
48
- richtext: "richtext";
49
- link: "link";
50
- url: "url";
51
- image: "image";
52
- }>;
53
- label: z.ZodString;
54
- default: z.ZodOptional<z.ZodUnknown>;
55
- }, z.core.$strict>, z.ZodObject<{
56
- name: z.ZodString;
57
- kind: z.ZodLiteral<"list">;
58
- label: z.ZodString;
59
- listType: z.ZodString;
60
- bind: z.ZodOptional<z.ZodEnum<{
61
- source: "source";
62
- local: "local";
63
- shared: "shared";
64
- }>>;
65
- list: z.ZodOptional<z.ZodString>;
66
- source: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
67
- kind: z.ZodLiteral<"query">;
68
- editable: z.ZodArray<z.ZodEnum<{
69
- page_type: "page_type";
70
- terms: "terms";
71
- terms_mode: "terms_mode";
72
- parent: "parent";
73
- exclude_current: "exclude_current";
74
- order: "order";
75
- limit: "limit";
76
- }>>;
77
- defaults: z.ZodObject<{
78
- page_type: z.ZodOptional<z.ZodOptional<z.ZodString>>;
79
- terms: z.ZodOptional<z.ZodOptional<z.ZodArray<z.ZodString>>>;
80
- terms_mode: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
81
- any: "any";
82
- all: "all";
83
- }>>>;
84
- parent: z.ZodOptional<z.ZodOptional<z.ZodString>>;
85
- exclude_current: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
86
- order: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
87
- published_desc: "published_desc";
88
- published_asc: "published_asc";
89
- title_asc: "title_asc";
90
- }>, z.ZodString]>>;
91
- limit: z.ZodOptional<z.ZodNumber>;
92
- }, z.core.$strict>;
93
- }, z.core.$strict>, z.ZodObject<{
94
- kind: z.ZodLiteral<"system">;
95
- name: z.ZodEnum<{
96
- breadcrumbs: "breadcrumbs";
97
- children: "children";
98
- siblings: "siblings";
99
- page_terms: "page_terms";
100
- term_pages: "term_pages";
101
- }>;
102
- }, z.core.$strict>, z.ZodObject<{
103
- kind: z.ZodLiteral<"plugin">;
104
- name: z.ZodString;
105
- }, z.core.$strict>], "kind">>;
106
- min: z.ZodOptional<z.ZodNumber>;
107
- max: z.ZodOptional<z.ZodNumber>;
108
- default: z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodType<import("./index.js").ListItemInput, unknown, z.core.$ZodTypeInternals<import("./index.js").ListItemInput, unknown>>>, z.ZodString]>>;
109
- }, z.core.$strict>, z.ZodObject<{
110
- name: z.ZodString;
111
- kind: z.ZodLiteral<"module">;
112
- label: z.ZodString;
113
- allowedModuleTypes: z.ZodOptional<z.ZodArray<z.ZodString>>;
114
- }, z.core.$strict>, z.ZodObject<{
115
- name: z.ZodString;
116
- kind: z.ZodLiteral<"module-list">;
117
- label: z.ZodString;
118
- allowedModuleTypes: z.ZodOptional<z.ZodArray<z.ZodString>>;
119
- min: z.ZodOptional<z.ZodNumber>;
120
- max: z.ZodOptional<z.ZodNumber>;
121
- }, z.core.$strict>], "kind">>>;
122
- bindThemeLiterals: z.ZodOptional<z.ZodBoolean>;
123
- }, z.core.$strict>;
124
- /**
125
- * v0.4.0 — `set_page_module_content` AI tool. Fills the content values for
126
- * a module placement on a specific page. Page-bound + branch-isolated per
127
- * chat until publish (unlike `edit_module` which is global + immediate).
128
- */
129
- export declare const setPageModuleContentToolInput: z.ZodObject<{
130
- pageId: z.ZodString;
131
- blockName: z.ZodString;
132
- position: z.ZodNumber;
133
- contentValues: z.ZodRecord<z.ZodString, z.ZodUnknown>;
134
- }, z.core.$strict>;
135
- export type SetPageModuleContentToolInput = z.infer<typeof setPageModuleContentToolInput>;
136
29
  export declare const siteMemoryProposeToolInput: z.ZodObject<{
137
30
  slot: z.ZodEnum<{
138
31
  purpose: "purpose";
@@ -360,8 +253,6 @@ export declare const forkPlacementContentToolInput: z.ZodObject<{
360
253
  blockName: z.ZodString;
361
254
  position: z.ZodNumber;
362
255
  }, z.core.$strict>;
363
- export declare const AI_TOOLS: readonly ["edit_module", "site_memory_propose", "add_module", "create_page", "update_pages_many", "delete_pages_many", "remove_module_from", "update_theme", "set_template_layout", "create_layout", "set_site_defaults", "duplicate_page", "repoint_page_template", "move_module", "reorder_module", "set_nav_menu", "add_plugin_to_page", "list_content_instances", "get_content_instance", "create_content_instance", "set_content_instance_values", "delete_content_instance", "set_placement_content", "fork_placement_content", "build_page", "create_content_instances", "set_page_module_content_many"];
364
- export type AiToolName = (typeof AI_TOOLS)[number];
365
256
  export type AddPluginToPageToolInput = z.infer<typeof addPluginToPageToolInput>;
366
257
  export type ListContentInstancesToolInput = z.infer<typeof listContentInstancesToolInput>;
367
258
  export type GetContentInstanceToolInput = z.infer<typeof getContentInstanceToolInput>;
@@ -415,7 +306,7 @@ export declare const CHAT_MAX_ATTACHMENTS = 4;
415
306
  * `position` / `field` (#917) — plus `item` / `key` for an entry of a
416
307
  * local list field (epic #1107) — name the placement field the text
417
308
  * comes from when the preview marked it, so the AI can address it in
418
- * `set_page_module_content` without inspecting the page first.
309
+ * `set_page_module_content_many` without inspecting the page first.
419
310
  * `listItem` is the `data-caelo-list-item` of the list entry the element
420
311
  * sits in (epic #1107, `docs/lists.md` §13): the chip then names that
421
312
  * entry — of a shared list, or of a module's own list — not just the
@@ -611,8 +502,8 @@ export declare const setSiteDefaultsToolInput: z.ZodObject<{
611
502
  export declare const duplicatePageToolInput: z.ZodObject<{
612
503
  sourcePageId: z.ZodString;
613
504
  newSlug: z.ZodString;
614
- newName: z.ZodOptional<z.ZodString>;
615
505
  newTitle: z.ZodOptional<z.ZodString>;
506
+ newShortTitle: z.ZodOptional<z.ZodString>;
616
507
  targetTemplateId: z.ZodOptional<z.ZodString>;
617
508
  newParentPageId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
618
509
  }, z.core.$strict>;
@@ -626,27 +517,39 @@ export declare const repointPageTemplateToolInput: z.ZodObject<{
626
517
  blockName: z.ZodString;
627
518
  }, z.core.$strict>], "kind">>;
628
519
  }, z.core.$strict>;
520
+ /**
521
+ * `move_module` position: `top` | `bottom` | a 0-based index in the target
522
+ * block, plus `up` / `down` (one slot within the module's CURRENT block).
523
+ * Same quote-stripping + numeric-string coercion as `positionInputSchema`.
524
+ */
525
+ export declare const movePositionInputSchema: z.ZodPreprocess<z.ZodUnion<readonly [z.ZodEnum<{
526
+ top: "top";
527
+ bottom: "bottom";
528
+ up: "up";
529
+ down: "down";
530
+ }>, z.ZodPreprocess<z.ZodNumber, unknown>]>, unknown>;
531
+ /**
532
+ * `move_module` — moves a placement to `toBlockName` (omitted = the block it
533
+ * is in now, i.e. a reorder) at `position`. `up` / `down` only make sense
534
+ * inside the current block; the handler refuses them with another block.
535
+ */
629
536
  export declare const moveModuleToolInput: z.ZodObject<{
630
537
  pageId: z.ZodString;
631
538
  moduleId: z.ZodString;
632
- toBlockName: z.ZodString;
539
+ fromBlockName: z.ZodOptional<z.ZodString>;
540
+ fromPosition: z.ZodPreprocess<z.ZodOptional<z.ZodNumber>, unknown>;
541
+ toBlockName: z.ZodOptional<z.ZodString>;
633
542
  position: z.ZodPreprocess<z.ZodUnion<readonly [z.ZodEnum<{
634
543
  top: "top";
635
544
  bottom: "bottom";
636
- }>, z.ZodPreprocess<z.ZodNumber, unknown>]>, unknown>;
637
- }, z.core.$strict>;
638
- export declare const reorderModuleToolInput: z.ZodObject<{
639
- pageId: z.ZodString;
640
- moduleId: z.ZodString;
641
- direction: z.ZodUnion<readonly [z.ZodEnum<{
642
545
  up: "up";
643
546
  down: "down";
644
- }>, z.ZodNumber]>;
547
+ }>, z.ZodPreprocess<z.ZodNumber, unknown>]>, unknown>;
645
548
  }, z.core.$strict>;
646
549
  /**
647
550
  * P7 — `find_media`. Searches the media library by alt-text /
648
551
  * filename / mime. Each row carries the media UUID (what
649
- * `set_theme_asset` / `set_media_alt` require) plus a pre-resolved
552
+ * `set_theme_asset` / `set_media_alt_many` require) plus a pre-resolved
650
553
  * variant URL. The AI's only media-inventory surface — the `## Media`
651
554
  * system-prompt block was removed by the context diet (#300), so every
652
555
  * asset lookup ("an image of a sunlit office") goes through this tool.
@@ -680,7 +583,7 @@ export declare const regenerateMediaVariantsToolInput: z.ZodObject<{
680
583
  }, z.core.$strict>;
681
584
  export type RegenerateMediaVariantsToolInput = z.infer<typeof regenerateMediaVariantsToolInput>;
682
585
  /**
683
- * P7 — `set_media_alt`. AI may improve a11y on an existing asset
586
+ * P7 — one item of `set_media_alt_many`. AI may improve a11y on an existing asset
684
587
  * without a human round-trip (e.g. when the editor uploaded an image
685
588
  * with the default alt and the AI reads its content). Updates only
686
589
  * the alt field on `media_assets`.
@@ -709,7 +612,7 @@ export declare const setNotFoundPageToolInput: z.ZodObject<{
709
612
  }, z.core.$strict>;
710
613
  export type SetNotFoundPageToolInput = z.infer<typeof setNotFoundPageToolInput>;
711
614
  /**
712
- * 0181 — `set_media_source`. AI records an asset's provenance (source
615
+ * 0181 — one item of `set_media_source_many`. AI records an asset's provenance (source
713
616
  * kind + origin detail) and licence when known. All fields but the
714
617
  * assetId are optional; the op COALESCEs so omitted fields stay
715
618
  * unchanged.
@@ -727,7 +630,7 @@ export declare const setMediaSourceToolInput: z.ZodObject<{
727
630
  }, z.core.$strict>;
728
631
  export type SetMediaSourceToolInput = z.infer<typeof setMediaSourceToolInput>;
729
632
  /**
730
- * P8 — `set_page_seo`. Manual / panel writes to the per-page SEO
633
+ * P8 — one item of `set_page_seo_many`. Manual / panel writes to the per-page SEO
731
634
  * sidecar. AI calls this only on explicit user intent
732
635
  * ("set the home meta description to ..."). Doesn't bump fingerprints
733
636
  * (autofilled_at / optimized_at).
@@ -751,7 +654,7 @@ export declare const setPageSeoToolInput: z.ZodObject<{
751
654
  }, z.core.$strict>;
752
655
  export type SetPageSeoToolInput = z.infer<typeof setPageSeoToolInput>;
753
656
  /**
754
- * P8 — `autofill_page_seo` (and, per item, `autofill_page_seo_many`).
657
+ * P8 — one item of `autofill_page_seo_many`.
755
658
  * Fill-once. Refuses when the page's SEO was already autofilled. The AI
756
659
  * calls it before a page's first Stage; staging and production builds
757
660
  * refuse pages without a meta description (deploy/missing-seo.ts).
@@ -762,19 +665,6 @@ export declare const autofillPageSeoToolInput: z.ZodObject<{
762
665
  ogImageAssetId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
763
666
  }, z.core.$strict>;
764
667
  export type AutofillPageSeoToolInput = z.infer<typeof autofillPageSeoToolInput>;
765
- /**
766
- * P8 — `optimize_page_seo`. Explicit re-optimization. Always allowed.
767
- * Takes optional context (keyword analysis / intent shifts / branding
768
- * changes). The AI can call this across N pages in one chat turn —
769
- * the resulting changes batch into one Publish-pill confirm.
770
- */
771
- export declare const optimizePageSeoToolInput: z.ZodObject<{
772
- pageId: z.ZodString;
773
- metaDescription: z.ZodString;
774
- ogImageAssetId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
775
- context: z.ZodOptional<z.ZodString>;
776
- }, z.core.$strict>;
777
- export type OptimizePageSeoToolInput = z.infer<typeof optimizePageSeoToolInput>;
778
668
  /**
779
669
  * P8 AI-first review pass — bulk variants. Per CLAUDE.md §11, bulk
780
670
  * tools save round-trips when the AI knows it has N changes to make
@@ -788,7 +678,7 @@ export declare const findRedirectsToolInput: z.ZodObject<{
788
678
  }, z.core.$strict>;
789
679
  export type FindRedirectsToolInput = z.infer<typeof findRedirectsToolInput>;
790
680
  export declare const bulkCreateRedirectsToolInput: z.ZodObject<{
791
- redirects: z.ZodArray<z.ZodObject<{
681
+ items: z.ZodArray<z.ZodObject<{
792
682
  fromPath: z.ZodString;
793
683
  toPath: z.ZodString;
794
684
  statusCode: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<301>, z.ZodLiteral<302>, z.ZodLiteral<307>, z.ZodLiteral<308>, z.ZodLiteral<410>]>>;
@@ -819,7 +709,7 @@ export declare const bulkDeleteRedirectsToolInput: z.ZodObject<{
819
709
  }, z.core.$strict>;
820
710
  export type BulkDeleteRedirectsToolInput = z.infer<typeof bulkDeleteRedirectsToolInput>;
821
711
  export declare const bulkOptimizeSeoToolInput: z.ZodObject<{
822
- updates: z.ZodArray<z.ZodObject<{
712
+ items: z.ZodArray<z.ZodObject<{
823
713
  pageId: z.ZodString;
824
714
  metaDescription: z.ZodString;
825
715
  ogImageAssetId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -827,7 +717,6 @@ export declare const bulkOptimizeSeoToolInput: z.ZodObject<{
827
717
  context: z.ZodOptional<z.ZodString>;
828
718
  }, z.core.$strict>;
829
719
  export type BulkOptimizeSeoToolInput = z.infer<typeof bulkOptimizeSeoToolInput>;
830
- export type EditModuleToolInput = z.infer<typeof editModuleToolInput>;
831
720
  export type SiteMemoryProposeToolInput = z.infer<typeof siteMemoryProposeToolInput>;
832
721
  export type CreateTemplateToolInput = z.infer<typeof createTemplateToolInput>;
833
722
  export type ChatCreateSessionInput = z.infer<typeof chatCreateSessionInput>;
@@ -844,7 +733,6 @@ export type SetSiteDefaultsToolInput = z.infer<typeof setSiteDefaultsToolInput>;
844
733
  export type DuplicatePageToolInput = z.infer<typeof duplicatePageToolInput>;
845
734
  export type RepointPageTemplateToolInput = z.infer<typeof repointPageTemplateToolInput>;
846
735
  export type MoveModuleToolInput = z.infer<typeof moveModuleToolInput>;
847
- export type ReorderModuleToolInput = z.infer<typeof reorderModuleToolInput>;
848
736
  /**
849
737
  * P10A — `propose_skill`. AI drafts a new skill body (or revision) and
850
738
  * queues it for Owner review. Per CLAUDE.md §2: skills augment the AI's
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../src/ai-tools.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmDxB;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,+BAEnE;AAED,eAAO,MAAM,mBAAmB;;;qDAS/B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAuC5B,CAAC;AAEL;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;kBAQ/B,CAAC;AACZ,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE1F,eAAO,MAAM,0BAA0B;;;;;;;;;;;kBAM5B,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,kBAAkB;;kBAapB,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE;;;GAGG;AACH;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAyG3B,CAAC;AACL,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE;;;;;;;;;GASG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;kBAQ1B,CAAC;AAIZ;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;kBAS/B,CAAC;AAEZ,eAAO,MAAM,2BAA2B;;kBAI7B,CAAC;AAEZ,eAAO,MAAM,8BAA8B;;;;;;kBAA8B,CAAC;AAC1E,eAAO,MAAM,iCAAiC;;;;;;;kBAA8B,CAAC;AAC7E,eAAO,MAAM,8BAA8B;;kBAA8B,CAAC;AAC1E,eAAO,MAAM,4BAA4B;;;;;;;;;kBAA4B,CAAC;AACtE,eAAO,MAAM,6BAA6B;;;;kBAA6B,CAAC;AAExE,eAAO,MAAM,QAAQ,ilBAoCX,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AACnD,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAChF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAC1F,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACtF,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAC5F,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAClG,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAC5F,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACxF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE1F,kEAAkE;AAClE,eAAO,MAAM,sBAAsB;;;;;;;;;;kBAoBxB,CAAC;AAEZ,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,iEAAkE,CAAC;AAChG,yFAAyF;AACzF,eAAO,MAAM,yBAAyB,QAAkB,CAAC;AAEzD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;kBAgB7B,CAAC;AACL,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;kBAiBhB,CAAC;AACZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,wEAAwE;AACxE,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4D9B,CAAC;AAEJ,eAAO,MAAM,sBAAsB;;;kBAKxB,CAAC;AAEZ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;kBAwClB,CAAC;AAEZ,eAAO,MAAM,gBAAgB;;;;;;;;;;kBAKlB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;;;kBAKrB,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;;;;;;;;kBAerB,CAAC;AAEZ;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;;;kBAI1B,CAAC;AAYZ;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;kBAuBzB,CAAC;AAEZ;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;kBAO3B,CAAC;AACZ,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAMlF,eAAO,MAAM,0BAA0B;;;kBAK5B,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;kBAmBvB,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;kBAQjC,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;;;;kBAWxB,CAAC;AAEZ,eAAO,MAAM,4BAA4B;;;;;;;;;kBAkB9B,CAAC;AAEZ,eAAO,MAAM,mBAAmB;;;;;;;;kBAQrB,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;kBAUxB,CAAC;AAEZ;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;kBAkBpB,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC;;;kBAQzC,CAAC;AACL,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAEhG;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB;;;kBAKtB,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;kBAAmD,CAAC;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;kBAA8D,CAAC;AACpG,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;kBAOzB,CAAC;AACZ,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;kBAYrB,CAAC;AACZ,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;kBAM1B,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;kBAO1B,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB;;;;kBAQxB,CAAC;AACZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E,eAAO,MAAM,4BAA4B;;;;;;;kBAwB9B,CAAC;AACZ,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAExF;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B;;;;;;kBAK7B,CAAC;AACZ,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEtF,eAAO,MAAM,4BAA4B;;;;kBAM9B,CAAC;AACZ,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAExF,eAAO,MAAM,wBAAwB;;;;;;;kBAgB1B,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACpF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACxE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAChE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAChF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACpF,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC1E,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAChF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,4BAA4B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AACxF,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAG5E;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;kBAqBvB,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB;;;;;kBAmBvB,CAAC;AACZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE1E;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B;;;;;;;;;;kBA6BhC,CAAC;AACZ,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAE5F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B;;;kBAQ5B,CAAC;AACZ,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC"}
1
+ {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../src/ai-tools.ts"],"names":[],"mappings":"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"}
package/dist/ai-tools.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * silent drops in the handler.
11
11
  */
12
12
  import { z } from "zod";
13
- import { contentInstanceCreateSchema, contentInstanceDeleteSchema, contentInstanceUpdateSchema, forkPlacementContentSchema, MODULE_CSS_MAX, MODULE_HTML_MAX, MODULE_JS_MAX, moduleFieldSchema, pageTypeSlugSchema, setPlacementContentSchema, slugSchema, } from "./content.js";
13
+ import { contentInstanceCreateSchema, contentInstanceDeleteSchema, contentInstanceUpdateSchema, forkPlacementContentSchema, moduleFieldSchema, pageShortTitleSchema, pageTypeSlugSchema, setPlacementContentSchema, slugSchema, } from "./content.js";
14
14
  import { LIST_ITEM_ATTR_RE } from "./lists/item-attr.js";
15
15
  import { pluginPreviewSelectionSchema } from "./plugin-preview.js";
16
16
  import { redirectTargetPathSchema } from "./redirect-target.js";
@@ -56,67 +56,15 @@ function stripSurroundingQuotes(v) {
56
56
  * is handled in one place instead of refused per tool.
57
57
  *
58
58
  * @param schema - the string schema (length caps, min) the decoded value must satisfy.
59
+ * @param language - the grammar of the value (`html`, `css`, `js`).
59
60
  */
60
- export function sourceTextArg(schema) {
61
- return z.preprocess(decodeSourceTextTransport, schema);
61
+ export function sourceTextArg(schema, language) {
62
+ return z.preprocess((value) => decodeSourceTextTransport(value, language), schema);
62
63
  }
63
64
  export const positionInputSchema = z.preprocess(stripSurroundingQuotes, z.union([
64
65
  z.enum(["top", "bottom"]),
65
66
  z.preprocess((v) => (typeof v === "string" && /^\d+$/.test(v) ? Number.parseInt(v, 10) : v), z.number().int().min(0).max(1000)),
66
67
  ]));
67
- export const editModuleToolInput = z
68
- .object({
69
- moduleId: z.string().uuid(),
70
- displayName: z.string().min(1).max(128).optional(),
71
- /**
72
- * v0.12.0 — rewrite the module's purpose. Optional; passing it
73
- * updates the `list_modules` catalog your future self will read.
74
- */
75
- description: z.string().max(1000).optional(),
76
- /** v0.12.0 — re-classify the module's role tag. */
77
- kind: z.enum(["chrome", "hero", "content", "cta", "utility"]).optional(),
78
- /**
79
- * v0.12.3 (issue #106) — re-classify the module's stable `type` (the
80
- * class a parent's `allowedModuleTypes` whitelist matches against,
81
- * e.g. `button`). Rarely needed; usually derived from displayName at
82
- * create time. Set it to make this module satisfy a parent's allowlist.
83
- */
84
- type: slugSchema.optional(),
85
- html: sourceTextArg(z.string().max(MODULE_HTML_MAX)).optional(),
86
- css: sourceTextArg(z.string().max(MODULE_CSS_MAX)).optional(),
87
- js: sourceTextArg(z.string().max(MODULE_JS_MAX)).optional(),
88
- /**
89
- * v0.4.0 — module field schema. Each field declares one substitution
90
- * slot referenced in the module HTML as `{{name}}`. Page placements
91
- * fill these via `set_page_module_content`. Optional on edits — pass
92
- * to replace the declared schema.
93
- */
94
- fields: z.array(moduleFieldSchema).max(64).optional(),
95
- /** issue #164 slice 2 — see addModuleToolInput.bindThemeLiterals. */
96
- bindThemeLiterals: z.boolean().optional(),
97
- })
98
- .strict()
99
- // e2e-livedit run 40351690739: a call with only a (placeholder)
100
- // moduleId reached the op and came back as a bare "module not found".
101
- // An edit that changes nothing is refused before any lookup, with the
102
- // fields that make it one.
103
- .refine((v) => Object.keys(v).some((k) => k !== "moduleId" && k !== "bindThemeLiterals"), {
104
- message: "edit_module changes nothing: pass what to change (html, css, js, fields, displayName, description, kind or type). list_modules shows the modules; add_module creates a new one.",
105
- });
106
- /**
107
- * v0.4.0 — `set_page_module_content` AI tool. Fills the content values for
108
- * a module placement on a specific page. Page-bound + branch-isolated per
109
- * chat until publish (unlike `edit_module` which is global + immediate).
110
- */
111
- export const setPageModuleContentToolInput = z
112
- .object({
113
- pageId: z.string().uuid(),
114
- blockName: z.string().min(1).max(64),
115
- position: z.number().int().nonnegative(),
116
- /** Map of module field name → value. Fully replaces existing values. */
117
- contentValues: z.record(z.string(), z.unknown()),
118
- })
119
- .strict();
120
68
  export const siteMemoryProposeToolInput = z
121
69
  .object({
122
70
  slot: z.enum(["purpose", "brand-voice", "tone", "banned-phrases", "instructions", "glossary"]),
@@ -186,9 +134,9 @@ export const addModuleToolInput = z
186
134
  description: z.string().max(1000).optional(),
187
135
  kind: z.enum(["chrome", "hero", "content", "cta", "utility"]).optional(),
188
136
  type: slugSchema.optional(),
189
- html: sourceTextArg(z.string().min(1).max(50_000)).optional(),
190
- css: sourceTextArg(z.string().max(50_000)).optional(),
191
- js: sourceTextArg(z.string().max(50_000)).optional(),
137
+ html: sourceTextArg(z.string().min(1).max(50_000), "html").optional(),
138
+ css: sourceTextArg(z.string().max(50_000), "css").optional(),
139
+ js: sourceTextArg(z.string().max(50_000), "js").optional(),
192
140
  fields: z.array(moduleFieldSchema).max(64).optional(),
193
141
  bindThemeLiterals: z.boolean().optional(),
194
142
  /**
@@ -201,8 +149,8 @@ export const addModuleToolInput = z
201
149
  * stores the values as the minted module's `fields[].default` —
202
150
  * which requires explicit `fields` (moduleize field names are
203
151
  * unknowable up front) and is rejected for `moduleId` reuse (a
204
- * shared module renders its stored defaults; edit_module changes
205
- * them).
152
+ * shared module renders its stored defaults; update_modules_many
153
+ * changes them).
206
154
  */
207
155
  values: z.record(z.string(), z.unknown()).optional(),
208
156
  })
@@ -212,7 +160,7 @@ export const addModuleToolInput = z
212
160
  if (input.moduleId !== undefined) {
213
161
  ctx.addIssue({
214
162
  code: z.ZodIssueCode.custom,
215
- message: "Reusing a module on a layout renders the module's STORED field defaults — `values` has nothing to bind to. Drop `values` (the chrome shows the module as-is), or change the shared copy via edit_module.",
163
+ message: "Reusing a module on a layout renders the module's STORED field defaults — `values` has nothing to bind to. Drop `values` (the chrome shows the module as-is), or change the shared copy via update_modules_many.",
216
164
  });
217
165
  }
218
166
  else if (input.fields === undefined || input.fields.length === 0) {
@@ -237,7 +185,7 @@ export const addModuleToolInput = z
237
185
  // (§1A/§11), so we do NOT reject a moduleId call that also carries authoring
238
186
  // fields. Those fields are not applied here; the tool HANDLER surfaces an
239
187
  // INFO for any ignored field whose value DIFFERS from the module's stored
240
- // one, pointing at edit_module — so a dropped change is never silent (§2).
188
+ // one, pointing at update_modules_many — so a dropped change is never silent (§2).
241
189
  if (input.moduleId !== undefined)
242
190
  return;
243
191
  if (input.displayName === undefined || input.html === undefined) {
@@ -318,43 +266,6 @@ export const setContentInstanceValuesToolInput = contentInstanceUpdateSchema;
318
266
  export const deleteContentInstanceToolInput = contentInstanceDeleteSchema;
319
267
  export const setPlacementContentToolInput = setPlacementContentSchema;
320
268
  export const forkPlacementContentToolInput = forkPlacementContentSchema;
321
- export const AI_TOOLS = [
322
- "edit_module",
323
- "site_memory_propose",
324
- "add_module",
325
- "create_page",
326
- // audit #3 — page metadata (name/title/slug/template/status) is one tool for
327
- // 1..200 pages: `update_pages_many`. The former rename_page / set_page_title
328
- // / change_page_slug were single-field wrappers over the same pages.update.
329
- "update_pages_many",
330
- // audit #4 — one delete tool for 1..200 pages, disposition per page.
331
- // The former singular delete_page folded in (n=1 is a one-item array).
332
- "delete_pages_many",
333
- // one remove-module tool routed by target (page|layout).
334
- "remove_module_from",
335
- "update_theme",
336
- "set_template_layout",
337
- "create_layout",
338
- "set_site_defaults",
339
- "duplicate_page",
340
- "repoint_page_template",
341
- "move_module",
342
- "reorder_module",
343
- "set_nav_menu",
344
- "add_plugin_to_page",
345
- // v0.12.0 — content_instances + placement binding
346
- "list_content_instances",
347
- "get_content_instance",
348
- "create_content_instance",
349
- "set_content_instance_values",
350
- "delete_content_instance",
351
- "set_placement_content",
352
- "fork_placement_content",
353
- // issue #299 — bulk-first build path (§11)
354
- "build_page",
355
- "create_content_instances",
356
- "set_page_module_content_many",
357
- ];
358
269
  /** Chat ops input shapes — used by the SvelteKit form actions. */
359
270
  export const chatCreateSessionInput = z
360
271
  .object({
@@ -415,7 +326,7 @@ export const CHAT_MAX_ATTACHMENTS = 4;
415
326
  * `position` / `field` (#917) — plus `item` / `key` for an entry of a
416
327
  * local list field (epic #1107) — name the placement field the text
417
328
  * comes from when the preview marked it, so the AI can address it in
418
- * `set_page_module_content` without inspecting the page first.
329
+ * `set_page_module_content_many` without inspecting the page first.
419
330
  * `listItem` is the `data-caelo-list-item` of the list entry the element
420
331
  * sits in (epic #1107, `docs/lists.md` §13): the chip then names that
421
332
  * entry — of a shared list, or of a module's own list — not just the
@@ -601,8 +512,8 @@ export const createTemplateToolInput = z
601
512
  .object({
602
513
  slug: slugInputSchema,
603
514
  displayName: z.string().min(1).max(256),
604
- html: sourceTextArg(z.string().min(1).max(2_000_000)),
605
- css: sourceTextArg(z.string().max(2_000_000)).default(""),
515
+ html: sourceTextArg(z.string().min(1).max(2_000_000), "html"),
516
+ css: sourceTextArg(z.string().max(2_000_000), "css").default(""),
606
517
  layoutId: z.string().uuid().optional(),
607
518
  /** Epic #1107 — the page type (slug) this template serves; omit for the site default. */
608
519
  pageType: pageTypeSlugSchema.optional(),
@@ -646,8 +557,8 @@ export const createLayoutToolInput = z
646
557
  .object({
647
558
  slug: slugInputSchema,
648
559
  displayName: z.string().min(1).max(200),
649
- html: sourceTextArg(z.string().min(1).max(50_000)),
650
- css: sourceTextArg(z.string().max(50_000)).optional(),
560
+ html: sourceTextArg(z.string().min(1).max(50_000), "html"),
561
+ css: sourceTextArg(z.string().max(50_000), "css").optional(),
651
562
  blocks: z
652
563
  .array(z
653
564
  .object({
@@ -679,8 +590,9 @@ export const duplicatePageToolInput = z
679
590
  .object({
680
591
  sourcePageId: z.string().uuid(),
681
592
  newSlug: slugInputSchema,
682
- newName: z.string().min(1).max(256).optional(),
683
593
  newTitle: z.string().min(1).max(256).optional(),
594
+ /** #1142 — the copy's breadcrumb label; omitted = newTitle when given, else the source's. */
595
+ newShortTitle: pageShortTitleSchema.optional(),
684
596
  targetTemplateId: z.string().uuid().optional(),
685
597
  /** Where the copy sits: a parent page id, or null for the top level.
686
598
  * Omitted = next to the source (same parent). */
@@ -706,30 +618,39 @@ export const repointPageTemplateToolInput = z
706
618
  .default({ kind: "drop" }),
707
619
  })
708
620
  .strict();
621
+ /**
622
+ * `move_module` position: `top` | `bottom` | a 0-based index in the target
623
+ * block, plus `up` / `down` (one slot within the module's CURRENT block).
624
+ * Same quote-stripping + numeric-string coercion as `positionInputSchema`.
625
+ */
626
+ export const movePositionInputSchema = z.preprocess(stripSurroundingQuotes, z.union([
627
+ z.enum(["top", "bottom", "up", "down"]),
628
+ z.preprocess((v) => (typeof v === "string" && /^\d+$/.test(v) ? Number.parseInt(v, 10) : v), z.number().int().min(0).max(1000)),
629
+ ]));
630
+ /**
631
+ * `move_module` — moves a placement to `toBlockName` (omitted = the block it
632
+ * is in now, i.e. a reorder) at `position`. `up` / `down` only make sense
633
+ * inside the current block; the handler refuses them with another block.
634
+ */
709
635
  export const moveModuleToolInput = z
710
- .object({
711
- pageId: z.string().uuid(),
712
- moduleId: z.string().uuid(),
713
- toBlockName: z.string().min(1).max(80),
714
- /** "top" | "bottom" | a 0-based index inside the destination block. */
715
- position: positionInputSchema,
716
- })
717
- .strict();
718
- export const reorderModuleToolInput = z
719
636
  .object({
720
637
  pageId: z.string().uuid(),
721
638
  moduleId: z.string().uuid(),
722
639
  /**
723
- * `up` / `down` shift one slot. An integer is an absolute 0-based
724
- * target position within the same block.
640
+ * #1195 — which placement of `moduleId` to move when the page holds it
641
+ * more than once: its block and 0-based position there. Needed only
642
+ * then; the error names the placements.
725
643
  */
726
- direction: z.union([z.enum(["up", "down"]), z.number().int().min(0).max(1000)]),
644
+ fromBlockName: z.string().min(1).max(80).optional(),
645
+ fromPosition: z.preprocess((v) => (typeof v === "string" && /^\d+$/.test(v) ? Number.parseInt(v, 10) : v), z.number().int().min(0).max(1000).optional()),
646
+ toBlockName: z.string().min(1).max(80).optional(),
647
+ position: movePositionInputSchema,
727
648
  })
728
649
  .strict();
729
650
  /**
730
651
  * P7 — `find_media`. Searches the media library by alt-text /
731
652
  * filename / mime. Each row carries the media UUID (what
732
- * `set_theme_asset` / `set_media_alt` require) plus a pre-resolved
653
+ * `set_theme_asset` / `set_media_alt_many` require) plus a pre-resolved
733
654
  * variant URL. The AI's only media-inventory surface — the `## Media`
734
655
  * system-prompt block was removed by the context diet (#300), so every
735
656
  * asset lookup ("an image of a sunlit office") goes through this tool.
@@ -770,7 +691,7 @@ export const regenerateMediaVariantsToolInput = z
770
691
  message: "pass either assetIds or allMissing: true (exactly one)",
771
692
  });
772
693
  /**
773
- * P7 — `set_media_alt`. AI may improve a11y on an existing asset
694
+ * P7 — one item of `set_media_alt_many`. AI may improve a11y on an existing asset
774
695
  * without a human round-trip (e.g. when the editor uploaded an image
775
696
  * with the default alt and the AI reads its content). Updates only
776
697
  * the alt field on `media_assets`.
@@ -794,7 +715,7 @@ export const setHomePageToolInput = z.object({ pageId: z.string().uuid() }).stri
794
715
  */
795
716
  export const setNotFoundPageToolInput = z.object({ pageId: z.string().uuid().nullable() }).strict();
796
717
  /**
797
- * 0181 — `set_media_source`. AI records an asset's provenance (source
718
+ * 0181 — one item of `set_media_source_many`. AI records an asset's provenance (source
798
719
  * kind + origin detail) and licence when known. All fields but the
799
720
  * assetId are optional; the op COALESCEs so omitted fields stay
800
721
  * unchanged.
@@ -808,7 +729,7 @@ export const setMediaSourceToolInput = z
808
729
  })
809
730
  .strict();
810
731
  /**
811
- * P8 — `set_page_seo`. Manual / panel writes to the per-page SEO
732
+ * P8 — one item of `set_page_seo_many`. Manual / panel writes to the per-page SEO
812
733
  * sidecar. AI calls this only on explicit user intent
813
734
  * ("set the home meta description to ..."). Doesn't bump fingerprints
814
735
  * (autofilled_at / optimized_at).
@@ -827,7 +748,7 @@ export const setPageSeoToolInput = z
827
748
  })
828
749
  .strict();
829
750
  /**
830
- * P8 — `autofill_page_seo` (and, per item, `autofill_page_seo_many`).
751
+ * P8 — one item of `autofill_page_seo_many`.
831
752
  * Fill-once. Refuses when the page's SEO was already autofilled. The AI
832
753
  * calls it before a page's first Stage; staging and production builds
833
754
  * refuse pages without a meta description (deploy/missing-seo.ts).
@@ -839,20 +760,6 @@ export const autofillPageSeoToolInput = z
839
760
  ogImageAssetId: z.string().uuid().nullable().optional(),
840
761
  })
841
762
  .strict();
842
- /**
843
- * P8 — `optimize_page_seo`. Explicit re-optimization. Always allowed.
844
- * Takes optional context (keyword analysis / intent shifts / branding
845
- * changes). The AI can call this across N pages in one chat turn —
846
- * the resulting changes batch into one Publish-pill confirm.
847
- */
848
- export const optimizePageSeoToolInput = z
849
- .object({
850
- pageId: z.string().uuid(),
851
- metaDescription: z.string().min(1).max(320),
852
- ogImageAssetId: z.string().uuid().nullable().optional(),
853
- context: z.string().max(4000).optional(),
854
- })
855
- .strict();
856
763
  /**
857
764
  * P8 AI-first review pass — bulk variants. Per CLAUDE.md §11, bulk
858
765
  * tools save round-trips when the AI knows it has N changes to make
@@ -870,7 +777,7 @@ export const findRedirectsToolInput = z
870
777
  .strict();
871
778
  export const bulkCreateRedirectsToolInput = z
872
779
  .object({
873
- redirects: z
780
+ items: z
874
781
  .array(z
875
782
  .object({
876
783
  fromPath: z.string().min(1).max(500),
@@ -914,7 +821,7 @@ export const bulkDeleteRedirectsToolInput = z
914
821
  .strict();
915
822
  export const bulkOptimizeSeoToolInput = z
916
823
  .object({
917
- updates: z
824
+ items: z
918
825
  .array(z
919
826
  .object({
920
827
  pageId: z.string().uuid(),