@wootsup/mcp 0.1.0 → 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.
Files changed (208) hide show
  1. package/CHANGELOG.md +157 -83
  2. package/README.md +31 -27
  3. package/SECURITY.md +15 -6
  4. package/dist/auth/keychain.d.ts +27 -1
  5. package/dist/auth/keychain.js +48 -2
  6. package/dist/auth/keychain.js.map +1 -1
  7. package/dist/catalog/build-catalog.d.ts +31 -0
  8. package/dist/catalog/build-catalog.js +68 -0
  9. package/dist/catalog/build-catalog.js.map +1 -0
  10. package/dist/cli-hint.d.ts +22 -0
  11. package/dist/cli-hint.js +55 -0
  12. package/dist/cli-hint.js.map +1 -0
  13. package/dist/index.js +129 -22
  14. package/dist/index.js.map +1 -1
  15. package/dist/install-skill.js +1 -1
  16. package/dist/modules/apimapper/auto-layout.d.ts +21 -0
  17. package/dist/modules/apimapper/auto-layout.js +54 -0
  18. package/dist/modules/apimapper/auto-layout.js.map +1 -0
  19. package/dist/modules/apimapper/cache.js +25 -17
  20. package/dist/modules/apimapper/cache.js.map +1 -1
  21. package/dist/modules/apimapper/client.d.ts +115 -4
  22. package/dist/modules/apimapper/client.js +699 -304
  23. package/dist/modules/apimapper/client.js.map +1 -1
  24. package/dist/modules/apimapper/connections-format.d.ts +31 -1
  25. package/dist/modules/apimapper/connections-format.js +97 -5
  26. package/dist/modules/apimapper/connections-format.js.map +1 -1
  27. package/dist/modules/apimapper/connections.d.ts +9 -7
  28. package/dist/modules/apimapper/connections.js +449 -127
  29. package/dist/modules/apimapper/connections.js.map +1 -1
  30. package/dist/modules/apimapper/credential-sanitizer.d.ts +5 -0
  31. package/dist/modules/apimapper/credential-sanitizer.js +60 -1
  32. package/dist/modules/apimapper/credential-sanitizer.js.map +1 -1
  33. package/dist/modules/apimapper/credentials.js +105 -61
  34. package/dist/modules/apimapper/credentials.js.map +1 -1
  35. package/dist/modules/apimapper/diagnose.js +21 -2
  36. package/dist/modules/apimapper/diagnose.js.map +1 -1
  37. package/dist/modules/apimapper/elicitation.d.ts +29 -0
  38. package/dist/modules/apimapper/elicitation.js +62 -0
  39. package/dist/modules/apimapper/elicitation.js.map +1 -1
  40. package/dist/modules/apimapper/example-extract.d.ts +13 -0
  41. package/dist/modules/apimapper/example-extract.js +111 -0
  42. package/dist/modules/apimapper/example-extract.js.map +1 -0
  43. package/dist/modules/apimapper/filter-operators.d.ts +24 -0
  44. package/dist/modules/apimapper/filter-operators.js +103 -0
  45. package/dist/modules/apimapper/filter-operators.js.map +1 -0
  46. package/dist/modules/apimapper/flows-format.js +92 -22
  47. package/dist/modules/apimapper/flows-format.js.map +1 -1
  48. package/dist/modules/apimapper/flows.d.ts +8 -7
  49. package/dist/modules/apimapper/flows.js +275 -120
  50. package/dist/modules/apimapper/flows.js.map +1 -1
  51. package/dist/modules/apimapper/gateway/advanced-read-tool.d.ts +9 -0
  52. package/dist/modules/apimapper/gateway/advanced-read-tool.js +172 -0
  53. package/dist/modules/apimapper/gateway/advanced-read-tool.js.map +1 -0
  54. package/dist/modules/apimapper/gateway/advanced-tool.js +66 -106
  55. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -1
  56. package/dist/modules/apimapper/gateway/collect-module-tools.d.ts +17 -0
  57. package/dist/modules/apimapper/gateway/collect-module-tools.js +44 -0
  58. package/dist/modules/apimapper/gateway/collect-module-tools.js.map +1 -0
  59. package/dist/modules/apimapper/gateway/essentials.d.ts +1 -1
  60. package/dist/modules/apimapper/gateway/essentials.js +21 -2
  61. package/dist/modules/apimapper/gateway/essentials.js.map +1 -1
  62. package/dist/modules/apimapper/gateway/gateway-shared.d.ts +21 -0
  63. package/dist/modules/apimapper/gateway/gateway-shared.js +124 -0
  64. package/dist/modules/apimapper/gateway/gateway-shared.js.map +1 -0
  65. package/dist/modules/apimapper/gateway/test-support.d.ts +1 -17
  66. package/dist/modules/apimapper/gateway/test-support.js +4 -33
  67. package/dist/modules/apimapper/gateway/test-support.js.map +1 -1
  68. package/dist/modules/apimapper/get-skill-cores.d.ts +4 -0
  69. package/dist/modules/apimapper/get-skill-cores.js +220 -0
  70. package/dist/modules/apimapper/get-skill-cores.js.map +1 -0
  71. package/dist/modules/apimapper/get-skill.d.ts +1 -1
  72. package/dist/modules/apimapper/get-skill.js +74 -9
  73. package/dist/modules/apimapper/get-skill.js.map +1 -1
  74. package/dist/modules/apimapper/graph-builder.d.ts +85 -2
  75. package/dist/modules/apimapper/graph-builder.js +151 -15
  76. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  77. package/dist/modules/apimapper/graph.js +152 -48
  78. package/dist/modules/apimapper/graph.js.map +1 -1
  79. package/dist/modules/apimapper/index.js +27 -13
  80. package/dist/modules/apimapper/index.js.map +1 -1
  81. package/dist/modules/apimapper/jmespath-test.d.ts +4 -0
  82. package/dist/modules/apimapper/jmespath-test.js +152 -0
  83. package/dist/modules/apimapper/jmespath-test.js.map +1 -0
  84. package/dist/modules/apimapper/library.js +553 -88
  85. package/dist/modules/apimapper/library.js.map +1 -1
  86. package/dist/modules/apimapper/license.js +12 -36
  87. package/dist/modules/apimapper/license.js.map +1 -1
  88. package/dist/modules/apimapper/list-footer.d.ts +27 -0
  89. package/dist/modules/apimapper/list-footer.js +57 -0
  90. package/dist/modules/apimapper/list-footer.js.map +1 -0
  91. package/dist/modules/apimapper/local-sources.js +100 -57
  92. package/dist/modules/apimapper/local-sources.js.map +1 -1
  93. package/dist/modules/apimapper/mcp-client-identity.d.ts +32 -0
  94. package/dist/modules/apimapper/mcp-client-identity.js +70 -0
  95. package/dist/modules/apimapper/mcp-client-identity.js.map +1 -0
  96. package/dist/modules/apimapper/merge-constants.d.ts +6 -0
  97. package/dist/modules/apimapper/merge-constants.js +26 -0
  98. package/dist/modules/apimapper/merge-constants.js.map +1 -0
  99. package/dist/modules/apimapper/misc.js +13 -27
  100. package/dist/modules/apimapper/misc.js.map +1 -1
  101. package/dist/modules/apimapper/node-schema.d.ts +52 -2
  102. package/dist/modules/apimapper/node-schema.js +95 -4
  103. package/dist/modules/apimapper/node-schema.js.map +1 -1
  104. package/dist/modules/apimapper/onboarding.d.ts +59 -1
  105. package/dist/modules/apimapper/onboarding.js +231 -28
  106. package/dist/modules/apimapper/onboarding.js.map +1 -1
  107. package/dist/modules/apimapper/read-cache.d.ts +16 -3
  108. package/dist/modules/apimapper/read-cache.js +59 -4
  109. package/dist/modules/apimapper/read-cache.js.map +1 -1
  110. package/dist/modules/apimapper/render/index.js +26 -5
  111. package/dist/modules/apimapper/render/index.js.map +1 -1
  112. package/dist/modules/apimapper/resource-id.d.ts +13 -0
  113. package/dist/modules/apimapper/resource-id.js +69 -0
  114. package/dist/modules/apimapper/resource-id.js.map +1 -0
  115. package/dist/modules/apimapper/schema.js +9 -18
  116. package/dist/modules/apimapper/schema.js.map +1 -1
  117. package/dist/modules/apimapper/settings.js +49 -52
  118. package/dist/modules/apimapper/settings.js.map +1 -1
  119. package/dist/modules/apimapper/sites-tools.d.ts +29 -0
  120. package/dist/modules/apimapper/sites-tools.js +165 -0
  121. package/dist/modules/apimapper/sites-tools.js.map +1 -0
  122. package/dist/modules/apimapper/tool-result.d.ts +66 -0
  123. package/dist/modules/apimapper/tool-result.js +125 -0
  124. package/dist/modules/apimapper/tool-result.js.map +1 -0
  125. package/dist/modules/apimapper/toolslist-size.d.ts +12 -11
  126. package/dist/modules/apimapper/toolslist-size.js +34 -21
  127. package/dist/modules/apimapper/toolslist-size.js.map +1 -1
  128. package/dist/modules/apimapper/types.d.ts +34 -0
  129. package/dist/modules/apimapper/types.js +1 -1
  130. package/dist/modules/apimapper/types.js.map +1 -1
  131. package/dist/modules/apimapper/whitelist-drift.d.ts +85 -0
  132. package/dist/modules/apimapper/whitelist-drift.js +375 -0
  133. package/dist/modules/apimapper/whitelist-drift.js.map +1 -0
  134. package/dist/modules/apimapper/workflows.js +302 -58
  135. package/dist/modules/apimapper/workflows.js.map +1 -1
  136. package/dist/modules/apimapper/yootheme-binding.d.ts +35 -0
  137. package/dist/modules/apimapper/yootheme-binding.js +267 -0
  138. package/dist/modules/apimapper/yootheme-binding.js.map +1 -0
  139. package/dist/platform/index.d.ts +56 -0
  140. package/dist/platform/index.js +158 -2
  141. package/dist/platform/index.js.map +1 -1
  142. package/dist/proxy/bridge.d.ts +35 -0
  143. package/dist/proxy/bridge.js +129 -0
  144. package/dist/proxy/bridge.js.map +1 -0
  145. package/dist/proxy/mode.d.ts +9 -0
  146. package/dist/proxy/mode.js +20 -0
  147. package/dist/proxy/mode.js.map +1 -0
  148. package/dist/setup/detect-clients.d.ts +40 -1
  149. package/dist/setup/detect-clients.js +148 -1
  150. package/dist/setup/detect-clients.js.map +1 -1
  151. package/dist/setup/probe-auth.d.ts +51 -0
  152. package/dist/setup/probe-auth.js +141 -0
  153. package/dist/setup/probe-auth.js.map +1 -0
  154. package/dist/setup/probe-handshake.js +40 -7
  155. package/dist/setup/probe-handshake.js.map +1 -1
  156. package/dist/setup/remove-config.d.ts +8 -0
  157. package/dist/setup/remove-config.js +145 -0
  158. package/dist/setup/remove-config.js.map +1 -0
  159. package/dist/setup/uninstall.d.ts +34 -0
  160. package/dist/setup/uninstall.js +147 -0
  161. package/dist/setup/uninstall.js.map +1 -0
  162. package/dist/setup-cli.d.ts +16 -0
  163. package/dist/setup-cli.js +63 -1
  164. package/dist/setup-cli.js.map +1 -1
  165. package/dist/sites/loader.d.ts +48 -0
  166. package/dist/sites/loader.js +134 -0
  167. package/dist/sites/loader.js.map +1 -0
  168. package/dist/sites/schema.d.ts +69 -0
  169. package/dist/sites/schema.js +71 -0
  170. package/dist/sites/schema.js.map +1 -0
  171. package/dist/sites/secret-resolver.d.ts +47 -0
  172. package/dist/sites/secret-resolver.js +150 -0
  173. package/dist/sites/secret-resolver.js.map +1 -0
  174. package/dist/skill-instructions.d.ts +14 -1
  175. package/dist/skill-instructions.js +35 -6
  176. package/dist/skill-instructions.js.map +1 -1
  177. package/dist/transports/stdio.js +4 -4
  178. package/dist/transports/stdio.js.map +1 -1
  179. package/dist/uninstall-skill.d.ts +27 -0
  180. package/dist/uninstall-skill.js +89 -0
  181. package/dist/uninstall-skill.js.map +1 -0
  182. package/docs/architecture.md +21 -21
  183. package/docs/customgraph-internal-migration.md +4 -4
  184. package/docs/security.md +2 -21
  185. package/docs/tools.md +40 -12
  186. package/manifest.json +77 -79
  187. package/package.json +69 -65
  188. package/skills/apimapper/SKILL.md +128 -7
  189. package/skills/apimapper/reference/conditional-style-multi-items.md +114 -0
  190. package/skills/apimapper/reference/dynamize-existing-layout.md +158 -0
  191. package/skills/apimapper/reference/jmespath-cookbook.md +241 -0
  192. package/skills/apimapper/reference/jmespath-pitfalls.md +189 -0
  193. package/skills/apimapper/reference/joomla.md +1 -1
  194. package/skills/apimapper/reference/library-template-discovery.md +65 -0
  195. package/skills/apimapper/reference/merge-two-sources-on-key.md +204 -0
  196. package/skills/apimapper/reference/oauth.md +143 -52
  197. package/skills/apimapper/reference/troubleshooting.md +22 -2
  198. package/skills/apimapper/reference/yootheme-source-to-builder-handoff.md +348 -0
  199. package/skills/apimapper/reference/yootheme.md +75 -44
  200. package/dist/auth/oauth-provider.d.ts +0 -68
  201. package/dist/auth/oauth-provider.js +0 -232
  202. package/dist/auth/oauth-provider.js.map +0 -1
  203. package/dist/server-http.d.ts +0 -22
  204. package/dist/server-http.js +0 -159
  205. package/dist/server-http.js.map +0 -1
  206. package/dist/transports/http.d.ts +0 -29
  207. package/dist/transports/http.js +0 -267
  208. package/dist/transports/http.js.map +0 -1
@@ -1,13 +1,22 @@
1
1
  // src/modules/apimapper/get-skill.ts — Phase 7.4.
2
2
  //
3
- // apimapper_get_skill: returns the markdown content of one of the 6 bundled
4
- // skill docs. Sibling to skill://apimapper/<topic> resources (Phase 7.3) for
5
- // clients that prefer tool-call discovery over resource discovery.
3
+ // apimapper_get_skill: returns the markdown content of one of the bundled
4
+ // skill docs (the canonical set lives in SKILL_TOPICS below). Sibling to
5
+ // skill://apimapper/<topic> resources (Phase 7.3) for clients that prefer
6
+ // tool-call discovery over resource discovery.
7
+ //
8
+ // SINGLE SOURCE OF TRUTH: SKILL_TOPICS is the canonical topic list. The two
9
+ // other surfaces that advertise topics — SKILL_TOPIC_POINTER in
10
+ // ../../skill-instructions.ts (the server `instructions` field) and the
11
+ // apimapper_get_skill cross-reference in gateway/advanced-tool.ts — MUST stay
12
+ // identical to this list. topic-sync.test.ts pins all three against each other
13
+ // so they can never drift again (Wave-B audit C2, 2026-06-03).
6
14
  import { z } from "zod";
7
- import { readFileSync } from "node:fs";
15
+ import { existsSync, readFileSync } from "node:fs";
8
16
  import { fileURLToPath } from "node:url";
9
17
  import { dirname, join, resolve } from "node:path";
10
18
  import { readOnly } from "@getimo/mcp-toolkit";
19
+ import { SKILL_CORES, FULL_DOC_POINTER } from "./get-skill-cores.js";
11
20
  export const SKILL_TOPICS = [
12
21
  "getting-started",
13
22
  "oauth",
@@ -15,6 +24,13 @@ export const SKILL_TOPICS = [
15
24
  "joomla",
16
25
  "troubleshooting",
17
26
  "render",
27
+ "jmespath-pitfalls",
28
+ "jmespath-cookbook",
29
+ "merge-two-sources-on-key",
30
+ "conditional-style-multi-items",
31
+ "library-template-discovery",
32
+ "yootheme-source-to-builder-handoff",
33
+ "dynamize-existing-layout",
18
34
  ];
19
35
  const TOPIC_TO_FILE = {
20
36
  "getting-started": "SKILL.md",
@@ -23,26 +39,62 @@ const TOPIC_TO_FILE = {
23
39
  joomla: "reference/joomla.md",
24
40
  troubleshooting: "reference/troubleshooting.md",
25
41
  render: "reference/render.md",
42
+ "jmespath-pitfalls": "reference/jmespath-pitfalls.md",
43
+ "jmespath-cookbook": "reference/jmespath-cookbook.md",
44
+ "merge-two-sources-on-key": "reference/merge-two-sources-on-key.md",
45
+ "conditional-style-multi-items": "reference/conditional-style-multi-items.md",
46
+ "library-template-discovery": "reference/library-template-discovery.md",
47
+ "yootheme-source-to-builder-handoff": "reference/yootheme-source-to-builder-handoff.md",
48
+ "dynamize-existing-layout": "reference/dynamize-existing-layout.md",
26
49
  };
27
50
  function defaultSkillsRoot() {
28
- // <pkg-root>/src/modules/apimapper/get-skill.ts up three.
51
+ // Resolve the dir that CONTAINS `skills/apimapper/`. The module layout differs
52
+ // between build targets:
53
+ // - source/npm: this file is at <root>/src|dist/modules/apimapper/get-skill →
54
+ // the root is THREE levels up.
55
+ // - Claude Desktop .dxt: esbuild bundles everything into dist/index.js, so at
56
+ // runtime `here` = <extracted>/dist and the root holding skills/ is just ONE
57
+ // level up. The old hard-coded 3-up overshot past the extracted dir (it
58
+ // landed in ~/Library/Application Support/Claude/) → every apimapper_get_skill
59
+ // call returned ENOENT even though skills/ WAS bundled. (Bug found in the
60
+ // 2026-06-04 Claude Desktop session.)
61
+ // Probe candidate roots and return the first that actually holds the bundled
62
+ // skills; fall back to the npm 3-up layout to preserve prior behaviour.
29
63
  const here = dirname(fileURLToPath(import.meta.url));
30
- return resolve(here, "..", "..", "..");
64
+ const candidates = [
65
+ resolve(here, "..", "..", ".."), // source / npm: …/dist/modules/apimapper → root
66
+ resolve(here, ".."), // .dxt bundle: …/dist → extracted root
67
+ resolve(here, "..", ".."), // safety net
68
+ here,
69
+ ];
70
+ for (const candidate of candidates) {
71
+ if (existsSync(join(candidate, "skills", "apimapper", "SKILL.md"))) {
72
+ return candidate;
73
+ }
74
+ }
75
+ return candidates[0];
31
76
  }
32
77
  export function registerGetSkillTool(server, rootDir) {
33
78
  const baseDir = rootDir ?? defaultSkillsRoot();
34
79
  server.registerTool("apimapper_get_skill", {
35
80
  title: "Get Skill Doc",
36
- description: "Returns the markdown content of a bundled API Mapper skill doc. " +
81
+ description: "Returns a condensed CORE for a bundled API Mapper skill doc (the recipe + " +
82
+ "key patterns, ~2 KB). Pass `full: true` for the long form (prose, every example, pitfalls). " +
37
83
  `Topics: ${SKILL_TOPICS.join(", ")}. Sibling to skill://apimapper/<topic> resources.` +
38
- "\n\nExample:\n apimapper_get_skill({ topic: 'getting-started' })",
84
+ "\n\nExample:\n apimapper_get_skill({ topic: 'getting-started' }) // core\n" +
85
+ " apimapper_get_skill({ topic: 'merge-two-sources-on-key', full: true }) // long form",
39
86
  inputSchema: {
40
87
  topic: z
41
88
  .enum(SKILL_TOPICS)
42
89
  .describe(`Which doc to fetch — one of: ${SKILL_TOPICS.join(", ")}`),
90
+ full: z
91
+ .boolean()
92
+ .default(false)
93
+ .describe("Default false → the condensed core (recipe + patterns, ~2 KB). " +
94
+ "true → the full long-form markdown (prose, every example, pitfalls)."),
43
95
  },
44
96
  annotations: readOnly({ title: "Get Skill Resource", openWorld: false }),
45
- }, async ({ topic }) => {
97
+ }, async ({ topic, full }) => {
46
98
  // Defensive runtime check — zod already validates at the MCP layer, but
47
99
  // a direct unit-test invocation can bypass validation, and we want to
48
100
  // produce a helpful structured error rather than crash on undefined.
@@ -58,6 +110,19 @@ export function registerGetSkillTool(server, rootDir) {
58
110
  ],
59
111
  };
60
112
  }
113
+ // F196: the DEFAULT response is the condensed core. The core carries the
114
+ // recipe + load-bearing patterns and a pointer to the long form. Direct
115
+ // unit-test calls may omit `full`, so treat anything non-true as core.
116
+ if (full !== true) {
117
+ return {
118
+ content: [
119
+ {
120
+ type: "text",
121
+ text: SKILL_CORES[topic] + FULL_DOC_POINTER,
122
+ },
123
+ ],
124
+ };
125
+ }
61
126
  const filePath = join(baseDir, "skills", "apimapper", TOPIC_TO_FILE[topic]);
62
127
  let text;
63
128
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"get-skill.js","sourceRoot":"","sources":["../../../src/modules/apimapper/get-skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-skill.js","sourceRoot":"","sources":["../../../src/modules/apimapper/get-skill.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,33 @@
1
1
  import type { FlowNode, FlowEdge } from "./types.js";
2
+ /**
3
+ * Local-source descriptor (F25, 2026-06-10): a CMS-native content source
4
+ * (WordPress posts / Joomla articles) queried straight from the platform DB —
5
+ * no Connection. Mirrors the `local-source` node-schema (`data.contentType`,
6
+ * `data.limit`, `data.filters`).
7
+ */
8
+ export interface LocalSourceDescriptor {
9
+ /**
10
+ * Fully-qualified content type, e.g. `wordpress/post`, `wordpress/page`,
11
+ * `joomla/article`. The bare `post` is NOT accepted — the PHP save-time guard
12
+ * (F26) and the executor (C5) reject under-qualified types.
13
+ */
14
+ content_type: string;
15
+ /** Max items to fetch (clamped to the tier maximum server-side). */
16
+ limit?: number;
17
+ /** Server-side filters (e.g. `{ category: "news" }`). */
18
+ filters?: Record<string, unknown>;
19
+ }
2
20
  export interface SourceSpec {
3
- connection: string;
21
+ /**
22
+ * Connection ID for an API source. Mutually exclusive with `local_source`:
23
+ * exactly ONE of `connection` / `local_source` must be set per source.
24
+ */
25
+ connection?: string;
26
+ /**
27
+ * Local-source descriptor for a CMS-native source. Mutually exclusive with
28
+ * `connection`. F25 (2026-06-10).
29
+ */
30
+ local_source?: LocalSourceDescriptor;
4
31
  endpoint?: string;
5
32
  template_fields?: Record<string, string>;
6
33
  items_path?: string;
@@ -15,6 +42,28 @@ export interface MergeSpec {
15
42
  export interface TransformSpec {
16
43
  expression?: string;
17
44
  }
45
+ /**
46
+ * A single filter condition. `value` is omitted for value-less operators
47
+ * (`exists`/`not_exists`/`empty`/`not_empty`). F54 (2026-06-10).
48
+ */
49
+ export interface FilterCondition {
50
+ field: string;
51
+ operator: string;
52
+ value?: unknown;
53
+ }
54
+ /**
55
+ * One-shot filter descriptor (F54). Two shapes are accepted:
56
+ * - inline single condition: `{ field, operator, value }`
57
+ * - explicit list: `{ conditions: [...], logic? }`
58
+ * The inline form is normalised into a one-element `conditions` array.
59
+ */
60
+ export interface FilterSpec {
61
+ field?: string;
62
+ operator?: string;
63
+ value?: unknown;
64
+ conditions?: FilterCondition[];
65
+ logic?: "and" | "or";
66
+ }
18
67
  export interface OutputSpec {
19
68
  type?: "yootheme" | "shortcode";
20
69
  name: string;
@@ -23,9 +72,33 @@ export interface OutputSpec {
23
72
  export interface BuildFlowGraphInput {
24
73
  sources: SourceSpec[];
25
74
  merge?: MergeSpec;
26
- transform?: TransformSpec;
75
+ filter?: FilterSpec;
76
+ /**
77
+ * F181 (2026-06-12): a single `TransformSpec` OR an array of them. An array
78
+ * is chained source(s) → [merge →] [filter →] t1 → t2 → … → output, each
79
+ * transform's output feeding the next. This is the canonical remedy for the
80
+ * JMESPath depth cap (10): a too-deeply-nested reshape is split into two (or
81
+ * more) chained transforms — the pipe between nodes resets the depth counter.
82
+ * A bare object and a one-element array produce an identical graph; an empty
83
+ * array is treated as no transform at all (back-compat with `undefined`).
84
+ */
85
+ transform?: TransformSpec | TransformSpec[];
27
86
  output: OutputSpec;
28
87
  }
88
+ /**
89
+ * Normalise a {@link FilterSpec} into a validated `{ conditions, logic }`
90
+ * payload for the filter node, throwing a HARD error on any invalid condition
91
+ * (F53). This is the build chokepoint: rejecting here means the agent learns
92
+ * immediately, instead of shipping a flow that silently yields 0 rows at
93
+ * render time.
94
+ *
95
+ * @throws Error when a condition is missing `field`, uses an unknown operator,
96
+ * or omits a required `value`.
97
+ */
98
+ export declare function normalizeFilterSpec(filter: FilterSpec): {
99
+ conditions: FilterCondition[];
100
+ logic: "and" | "or";
101
+ };
29
102
  export interface BuildFlowGraphResult {
30
103
  nodes: FlowNode[];
31
104
  edges: FlowEdge[];
@@ -43,5 +116,15 @@ export interface BuildFlowGraphResult {
43
116
  * - sources.length === 0
44
117
  * - sources.length >= 2 without `merge`
45
118
  * - merge.strategy === "join" without `joinKey`
119
+ * - a source with NEITHER `connection` nor `local_source` (F25)
120
+ * - a source with BOTH `connection` and `local_source` (F25)
121
+ * - a `local_source` with an empty `content_type` (F25)
122
+ * - a `filter` condition with an unknown operator / missing field / missing
123
+ * required value (F53/F54)
124
+ *
125
+ * Node order is deterministic left-to-right: sources → merge? → filter? →
126
+ * transform? → output. The filter sits AFTER merge (so it filters the joined
127
+ * rows) and BEFORE transform (so a derived/coerced field a Transform produces
128
+ * is NOT yet visible — filter on raw fields, then reshape).
46
129
  */
47
130
  export declare function buildFlowGraph(input: BuildFlowGraphInput): BuildFlowGraphResult;
@@ -5,6 +5,50 @@
5
5
  // isolation and reusable from future tooling (Joomla parity, MCP composite
6
6
  // tools beyond setup_with_sources, etc.).
7
7
  import { normalizeMergeStrategy } from "./normalizers.js";
8
+ import { isValidFilterOperator, operatorNeedsValue, unknownOperatorMessage, } from "./filter-operators.js";
9
+ /**
10
+ * Normalise a {@link FilterSpec} into a validated `{ conditions, logic }`
11
+ * payload for the filter node, throwing a HARD error on any invalid condition
12
+ * (F53). This is the build chokepoint: rejecting here means the agent learns
13
+ * immediately, instead of shipping a flow that silently yields 0 rows at
14
+ * render time.
15
+ *
16
+ * @throws Error when a condition is missing `field`, uses an unknown operator,
17
+ * or omits a required `value`.
18
+ */
19
+ export function normalizeFilterSpec(filter) {
20
+ // Accept either the inline single-condition form or an explicit list.
21
+ let conditions;
22
+ if (Array.isArray(filter.conditions) && filter.conditions.length > 0) {
23
+ conditions = filter.conditions;
24
+ }
25
+ else if (typeof filter.field === "string") {
26
+ conditions = [{ field: filter.field, operator: filter.operator ?? "equals", value: filter.value }];
27
+ }
28
+ else {
29
+ throw new Error("filter requires either an inline `{ field, operator, value }` or a non-empty `conditions` array");
30
+ }
31
+ const validated = conditions.map((c, i) => {
32
+ if (typeof c.field !== "string" || c.field === "") {
33
+ throw new Error(`filter.conditions[${i}]: \`field\` is required (non-empty string)`);
34
+ }
35
+ const operator = c.operator;
36
+ if (typeof operator !== "string" || !isValidFilterOperator(operator)) {
37
+ throw new Error(`filter.conditions[${i}]: ${unknownOperatorMessage(String(operator))}`);
38
+ }
39
+ if (operatorNeedsValue(operator) && (c.value === undefined || c.value === null)) {
40
+ throw new Error(`filter.conditions[${i}]: operator "${operator}" requires a \`value\` (only ` +
41
+ `exists/not_exists/empty/not_empty are value-less).`);
42
+ }
43
+ // Re-emit a clean condition (drop stray keys, keep value only when present
44
+ // so value-less operators serialise minimally — matches FilterStep.php).
45
+ const out = { field: c.field, operator };
46
+ if (c.value !== undefined)
47
+ out.value = c.value;
48
+ return out;
49
+ });
50
+ return { conditions: validated, logic: filter.logic === "or" ? "or" : "and" };
51
+ }
8
52
  /**
9
53
  * Build a complete React-Flow graph from declarative source/merge/transform
10
54
  * /output specs. Layout is deterministic (left-to-right columns).
@@ -13,9 +57,19 @@ import { normalizeMergeStrategy } from "./normalizers.js";
13
57
  * - sources.length === 0
14
58
  * - sources.length >= 2 without `merge`
15
59
  * - merge.strategy === "join" without `joinKey`
60
+ * - a source with NEITHER `connection` nor `local_source` (F25)
61
+ * - a source with BOTH `connection` and `local_source` (F25)
62
+ * - a `local_source` with an empty `content_type` (F25)
63
+ * - a `filter` condition with an unknown operator / missing field / missing
64
+ * required value (F53/F54)
65
+ *
66
+ * Node order is deterministic left-to-right: sources → merge? → filter? →
67
+ * transform? → output. The filter sits AFTER merge (so it filters the joined
68
+ * rows) and BEFORE transform (so a derived/coerced field a Transform produces
69
+ * is NOT yet visible — filter on raw fields, then reshape).
16
70
  */
17
71
  export function buildFlowGraph(input) {
18
- const { sources, merge, transform, output } = input;
72
+ const { sources, merge, filter, transform, output } = input;
19
73
  if (sources.length === 0) {
20
74
  throw new Error("buildFlowGraph: at least one source is required");
21
75
  }
@@ -25,17 +79,63 @@ export function buildFlowGraph(input) {
25
79
  if (merge && (merge.strategy === "join") && !merge.joinKey) {
26
80
  throw new Error("buildFlowGraph: merge.joinKey is required for strategy=join");
27
81
  }
82
+ // F25 (2026-06-10): validate the connection-vs-local discriminator on every
83
+ // source up-front so the error names the offending index, instead of a
84
+ // confusing downstream compile failure on a half-built node.
85
+ sources.forEach((s, i) => {
86
+ const hasConnection = typeof s.connection === "string" && s.connection !== "";
87
+ const hasLocal = !!s.local_source;
88
+ if (!hasConnection && !hasLocal) {
89
+ throw new Error(`buildFlowGraph: source[${i}] must set either \`connection\` or \`local_source\``);
90
+ }
91
+ if (hasConnection && hasLocal) {
92
+ throw new Error(`buildFlowGraph: source[${i}] must set \`connection\` or \`local_source\`, not both`);
93
+ }
94
+ if (hasLocal && (typeof s.local_source.content_type !== "string" || s.local_source.content_type === "")) {
95
+ throw new Error(`buildFlowGraph: source[${i}].local_source.content_type is required (non-empty)`);
96
+ }
97
+ });
98
+ // F53/F54: validate + normalise the filter spec up-front so an unknown
99
+ // operator / missing field / missing value throws BEFORE we build any node
100
+ // (mirrors the source-validation pattern above — fail fast, name the issue).
101
+ const filterPayload = filter ? normalizeFilterSpec(filter) : null;
28
102
  const nodes = [];
29
103
  const edges = [];
30
104
  const baseX = 100;
31
- const colWidth = 280;
32
- const rowHeight = 200;
33
- // Sources column
105
+ // Column / row pitch for the auto-laid-out graph. Canvas node cards are
106
+ // `min-w-[220px] max-w-[300px]` (admin-ui BaseNode), so the pitch MUST exceed
107
+ // the max card width or programmatically-created nodes overlap / touch with no
108
+ // breathing room (reported 2026-06-14). Pitch = max card width (300) + a
109
+ // comfortable gutter so adjacent nodes never crowd, regardless of card width.
110
+ const colWidth = 400; // 300 max card + 100 horizontal gutter
111
+ const rowHeight = 240; // stacked merge sources: card height + vertical gutter
112
+ // Sources column. Each descriptor emits EITHER a connection `source` node OR
113
+ // a CMS-native `local-source` node (F25). Both share the `source-{n}` id
114
+ // convention so the merge/transform/output wiring below is source-kind-blind.
34
115
  sources.forEach((s, i) => {
116
+ const id = `source-${i + 1}`;
117
+ const position = { x: baseX, y: 100 + i * rowHeight };
118
+ if (s.local_source) {
119
+ const ls = s.local_source;
120
+ nodes.push({
121
+ id,
122
+ type: "local-source",
123
+ position,
124
+ data: {
125
+ label: s.label || `Source ${i + 1}`,
126
+ contentType: ls.content_type,
127
+ // Only forward limit/filters when provided so the node data stays
128
+ // minimal (executor defaults limit; filters default to []).
129
+ ...(ls.limit !== undefined ? { limit: ls.limit } : {}),
130
+ ...(ls.filters !== undefined ? { filters: ls.filters } : {}),
131
+ },
132
+ });
133
+ return;
134
+ }
35
135
  nodes.push({
36
- id: `source-${i + 1}`,
136
+ id,
37
137
  type: "source",
38
- position: { x: baseX, y: 100 + i * rowHeight },
138
+ position,
39
139
  data: {
40
140
  label: s.label || `Source ${i + 1}`,
41
141
  connectionId: s.connection,
@@ -75,32 +175,68 @@ export function buildFlowGraph(input) {
75
175
  });
76
176
  lastNodeId = mergeId;
77
177
  }
78
- // Transform column
79
- if (transform) {
80
- const transformId = "transform-1";
178
+ // F54: Filter column — sits AFTER merge, BEFORE transform. `col` tracks the
179
+ // next free left-to-right column so positions stay non-overlapping whether
180
+ // or not a filter/transform is present.
181
+ let col = 2;
182
+ if (filterPayload) {
183
+ const filterId = "filter-1";
184
+ nodes.push({
185
+ id: filterId,
186
+ type: "filter",
187
+ position: { x: baseX + col * colWidth, y: 200 },
188
+ data: {
189
+ label: "Filter",
190
+ conditions: filterPayload.conditions,
191
+ logic: filterPayload.logic,
192
+ },
193
+ });
194
+ edges.push({
195
+ id: `e-${lastNodeId}-filter`,
196
+ source: lastNodeId,
197
+ target: filterId,
198
+ });
199
+ lastNodeId = filterId;
200
+ col += 1;
201
+ }
202
+ // Transform column(s). F181: a bare TransformSpec is treated as a
203
+ // one-element chain; an array chains each transform's output into the next
204
+ // (source(s) → [merge →] [filter →] t1 → t2 → … → output). An empty array
205
+ // (or omitted transform) emits no transform node — identical to the legacy
206
+ // no-transform graph. The pipe between two chained transform nodes resets the
207
+ // JMESPath depth counter, so splitting a depth-cap-overflowing expression
208
+ // into N shallow transforms is now expressible in one composite call.
209
+ const transformChain = transform === undefined
210
+ ? []
211
+ : Array.isArray(transform)
212
+ ? transform
213
+ : [transform];
214
+ transformChain.forEach((t, i) => {
215
+ const transformId = `transform-${i + 1}`;
81
216
  nodes.push({
82
217
  id: transformId,
83
218
  type: "transform",
84
- position: { x: baseX + 2 * colWidth, y: 200 },
219
+ position: { x: baseX + (col + i) * colWidth, y: 200 },
85
220
  data: {
86
- label: "Transform",
87
- expression: transform.expression ?? "[*]",
221
+ label: transformChain.length > 1 ? `Transform ${i + 1}` : "Transform",
222
+ expression: t.expression ?? "[*]",
88
223
  },
89
224
  });
90
225
  edges.push({
91
- id: `e-${lastNodeId}-transform`,
226
+ id: `e-${lastNodeId}-${transformId}`,
92
227
  source: lastNodeId,
93
228
  target: transformId,
94
229
  });
95
230
  lastNodeId = transformId;
96
- }
231
+ });
232
+ col += transformChain.length;
97
233
  // Output column
98
234
  const outputId = "output-1";
99
235
  const outputType = output.type === "shortcode" ? "output-shortcode" : "output-yootheme";
100
236
  nodes.push({
101
237
  id: outputId,
102
238
  type: outputType,
103
- position: { x: baseX + 3 * colWidth, y: 200 },
239
+ position: { x: baseX + col * colWidth, y: 200 },
104
240
  data: {
105
241
  label: output.name,
106
242
  name: output.name,
@@ -1 +1 @@
1
- {"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../../src/modules/apimapper/graph-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../../src/modules/apimapper/graph-builder.ts"],"names":[],"mappings":"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"}