@wootsup/mcp 0.1.0-rc.8 → 0.1.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 (171) hide show
  1. package/README.md +7 -7
  2. package/dist/index.d.ts +19 -0
  3. package/dist/index.js +72 -6
  4. package/dist/index.js.map +1 -1
  5. package/dist/modules/apimapper/cache.d.ts +2 -2
  6. package/dist/modules/apimapper/cache.js +107 -25
  7. package/dist/modules/apimapper/cache.js.map +1 -1
  8. package/dist/modules/apimapper/client.d.ts +40 -0
  9. package/dist/modules/apimapper/client.js +82 -12
  10. package/dist/modules/apimapper/client.js.map +1 -1
  11. package/dist/modules/apimapper/connections-format.d.ts +51 -0
  12. package/dist/modules/apimapper/connections-format.js +261 -0
  13. package/dist/modules/apimapper/connections-format.js.map +1 -0
  14. package/dist/modules/apimapper/connections-trim.d.ts +82 -0
  15. package/dist/modules/apimapper/connections-trim.js +224 -0
  16. package/dist/modules/apimapper/connections-trim.js.map +1 -0
  17. package/dist/modules/apimapper/connections.d.ts +14 -2
  18. package/dist/modules/apimapper/connections.js +447 -143
  19. package/dist/modules/apimapper/connections.js.map +1 -1
  20. package/dist/modules/apimapper/credentials-format.d.ts +21 -0
  21. package/dist/modules/apimapper/credentials-format.js +145 -0
  22. package/dist/modules/apimapper/credentials-format.js.map +1 -0
  23. package/dist/modules/apimapper/credentials.d.ts +12 -2
  24. package/dist/modules/apimapper/credentials.js +253 -72
  25. package/dist/modules/apimapper/credentials.js.map +1 -1
  26. package/dist/modules/apimapper/diagnose.d.ts +54 -2
  27. package/dist/modules/apimapper/diagnose.js +193 -11
  28. package/dist/modules/apimapper/diagnose.js.map +1 -1
  29. package/dist/modules/apimapper/elicitation.d.ts +54 -0
  30. package/dist/modules/apimapper/elicitation.js +90 -0
  31. package/dist/modules/apimapper/elicitation.js.map +1 -0
  32. package/dist/modules/apimapper/flows-format.d.ts +50 -0
  33. package/dist/modules/apimapper/flows-format.js +318 -0
  34. package/dist/modules/apimapper/flows-format.js.map +1 -0
  35. package/dist/modules/apimapper/flows.d.ts +13 -2
  36. package/dist/modules/apimapper/flows.js +325 -118
  37. package/dist/modules/apimapper/flows.js.map +1 -1
  38. package/dist/modules/apimapper/gateway/advanced-tool.d.ts +9 -0
  39. package/dist/modules/apimapper/gateway/advanced-tool.js +214 -0
  40. package/dist/modules/apimapper/gateway/advanced-tool.js.map +1 -0
  41. package/dist/modules/apimapper/gateway/capturing-server.d.ts +81 -0
  42. package/dist/modules/apimapper/gateway/capturing-server.js +87 -0
  43. package/dist/modules/apimapper/gateway/capturing-server.js.map +1 -0
  44. package/dist/modules/apimapper/gateway/essentials.d.ts +4 -0
  45. package/dist/modules/apimapper/gateway/essentials.js +28 -0
  46. package/dist/modules/apimapper/gateway/essentials.js.map +1 -0
  47. package/dist/modules/apimapper/gateway/test-support.d.ts +17 -0
  48. package/dist/modules/apimapper/gateway/test-support.js +43 -0
  49. package/dist/modules/apimapper/gateway/test-support.js.map +1 -0
  50. package/dist/modules/apimapper/get-skill.d.ts +3 -3
  51. package/dist/modules/apimapper/get-skill.js +4 -2
  52. package/dist/modules/apimapper/get-skill.js.map +1 -1
  53. package/dist/modules/apimapper/graph-builder.js +1 -1
  54. package/dist/modules/apimapper/graph-builder.js.map +1 -1
  55. package/dist/modules/apimapper/graph.d.ts +2 -2
  56. package/dist/modules/apimapper/graph.js +165 -34
  57. package/dist/modules/apimapper/graph.js.map +1 -1
  58. package/dist/modules/apimapper/index.d.ts +17 -1
  59. package/dist/modules/apimapper/index.js +66 -17
  60. package/dist/modules/apimapper/index.js.map +1 -1
  61. package/dist/modules/apimapper/inspect.d.ts +3 -2
  62. package/dist/modules/apimapper/inspect.js +97 -13
  63. package/dist/modules/apimapper/inspect.js.map +1 -1
  64. package/dist/modules/apimapper/library.d.ts +2 -2
  65. package/dist/modules/apimapper/library.js +303 -60
  66. package/dist/modules/apimapper/library.js.map +1 -1
  67. package/dist/modules/apimapper/license-format.d.ts +22 -0
  68. package/dist/modules/apimapper/license-format.js +149 -0
  69. package/dist/modules/apimapper/license-format.js.map +1 -0
  70. package/dist/modules/apimapper/license.d.ts +16 -2
  71. package/dist/modules/apimapper/license.js +85 -37
  72. package/dist/modules/apimapper/license.js.map +1 -1
  73. package/dist/modules/apimapper/local-sources.d.ts +2 -2
  74. package/dist/modules/apimapper/local-sources.js +58 -30
  75. package/dist/modules/apimapper/local-sources.js.map +1 -1
  76. package/dist/modules/apimapper/misc.d.ts +30 -2
  77. package/dist/modules/apimapper/misc.js +129 -50
  78. package/dist/modules/apimapper/misc.js.map +1 -1
  79. package/dist/modules/apimapper/node-schema.d.ts +52 -0
  80. package/dist/modules/apimapper/node-schema.js +70 -2
  81. package/dist/modules/apimapper/node-schema.js.map +1 -1
  82. package/dist/modules/apimapper/normalizers.d.ts +1 -0
  83. package/dist/modules/apimapper/normalizers.js +51 -0
  84. package/dist/modules/apimapper/normalizers.js.map +1 -1
  85. package/dist/modules/apimapper/onboarding.d.ts +48 -2
  86. package/dist/modules/apimapper/onboarding.js +324 -17
  87. package/dist/modules/apimapper/onboarding.js.map +1 -1
  88. package/dist/modules/apimapper/read-cache.d.ts +31 -2
  89. package/dist/modules/apimapper/read-cache.js +20 -6
  90. package/dist/modules/apimapper/read-cache.js.map +1 -1
  91. package/dist/modules/apimapper/render/_shared.d.ts +24 -0
  92. package/dist/modules/apimapper/render/_shared.js +84 -0
  93. package/dist/modules/apimapper/render/_shared.js.map +1 -0
  94. package/dist/modules/apimapper/render/dag.d.ts +18 -0
  95. package/dist/modules/apimapper/render/dag.js +70 -0
  96. package/dist/modules/apimapper/render/dag.js.map +1 -0
  97. package/dist/modules/apimapper/render/index.d.ts +2 -0
  98. package/dist/modules/apimapper/render/index.js +112 -0
  99. package/dist/modules/apimapper/render/index.js.map +1 -0
  100. package/dist/modules/apimapper/render/renderers/chart-bar.d.ts +2 -0
  101. package/dist/modules/apimapper/render/renderers/chart-bar.js +70 -0
  102. package/dist/modules/apimapper/render/renderers/chart-bar.js.map +1 -0
  103. package/dist/modules/apimapper/render/renderers/chart-line.d.ts +2 -0
  104. package/dist/modules/apimapper/render/renderers/chart-line.js +71 -0
  105. package/dist/modules/apimapper/render/renderers/chart-line.js.map +1 -0
  106. package/dist/modules/apimapper/render/renderers/diff.d.ts +2 -0
  107. package/dist/modules/apimapper/render/renderers/diff.js +154 -0
  108. package/dist/modules/apimapper/render/renderers/diff.js.map +1 -0
  109. package/dist/modules/apimapper/render/renderers/flow-diagram.d.ts +1 -0
  110. package/dist/modules/apimapper/render/renderers/flow-diagram.js +180 -0
  111. package/dist/modules/apimapper/render/renderers/flow-diagram.js.map +1 -0
  112. package/dist/modules/apimapper/render/renderers/json-tree.d.ts +2 -0
  113. package/dist/modules/apimapper/render/renderers/json-tree.js +87 -0
  114. package/dist/modules/apimapper/render/renderers/json-tree.js.map +1 -0
  115. package/dist/modules/apimapper/render/renderers/schema-diagram.d.ts +2 -0
  116. package/dist/modules/apimapper/render/renderers/schema-diagram.js +83 -0
  117. package/dist/modules/apimapper/render/renderers/schema-diagram.js.map +1 -0
  118. package/dist/modules/apimapper/render/renderers/table.d.ts +2 -0
  119. package/dist/modules/apimapper/render/renderers/table.js +75 -0
  120. package/dist/modules/apimapper/render/renderers/table.js.map +1 -0
  121. package/dist/modules/apimapper/render/schemas.d.ts +23 -0
  122. package/dist/modules/apimapper/render/schemas.js +56 -0
  123. package/dist/modules/apimapper/render/schemas.js.map +1 -0
  124. package/dist/modules/apimapper/render/secret-masking.d.ts +5 -0
  125. package/dist/modules/apimapper/render/secret-masking.js +51 -0
  126. package/dist/modules/apimapper/render/secret-masking.js.map +1 -0
  127. package/dist/modules/apimapper/render/sidecar.d.ts +21 -0
  128. package/dist/modules/apimapper/render/sidecar.js +66 -0
  129. package/dist/modules/apimapper/render/sidecar.js.map +1 -0
  130. package/dist/modules/apimapper/render/token-cap.d.ts +21 -0
  131. package/dist/modules/apimapper/render/token-cap.js +57 -0
  132. package/dist/modules/apimapper/render/token-cap.js.map +1 -0
  133. package/dist/modules/apimapper/schema.d.ts +2 -2
  134. package/dist/modules/apimapper/schema.js +100 -32
  135. package/dist/modules/apimapper/schema.js.map +1 -1
  136. package/dist/modules/apimapper/settings-format.d.ts +23 -0
  137. package/dist/modules/apimapper/settings-format.js +135 -0
  138. package/dist/modules/apimapper/settings-format.js.map +1 -0
  139. package/dist/modules/apimapper/settings.d.ts +2 -2
  140. package/dist/modules/apimapper/settings.js +101 -40
  141. package/dist/modules/apimapper/settings.js.map +1 -1
  142. package/dist/modules/apimapper/skill-resources.d.ts +2 -2
  143. package/dist/modules/apimapper/skill-resources.js.map +1 -1
  144. package/dist/modules/apimapper/token-baseline.harness.d.ts +91 -0
  145. package/dist/modules/apimapper/token-baseline.harness.js +291 -0
  146. package/dist/modules/apimapper/token-baseline.harness.js.map +1 -0
  147. package/dist/modules/apimapper/toolslist-size.d.ts +55 -0
  148. package/dist/modules/apimapper/toolslist-size.js +190 -0
  149. package/dist/modules/apimapper/toolslist-size.js.map +1 -0
  150. package/dist/modules/apimapper/types.d.ts +23 -8
  151. package/dist/modules/apimapper/types.js +26 -1
  152. package/dist/modules/apimapper/types.js.map +1 -1
  153. package/dist/modules/apimapper/use-profile.d.ts +21 -0
  154. package/dist/modules/apimapper/use-profile.js +56 -2
  155. package/dist/modules/apimapper/use-profile.js.map +1 -1
  156. package/dist/modules/apimapper/workflows.d.ts +2 -2
  157. package/dist/modules/apimapper/workflows.js +143 -16
  158. package/dist/modules/apimapper/workflows.js.map +1 -1
  159. package/dist/platform/index.js +44 -5
  160. package/dist/platform/index.js.map +1 -1
  161. package/dist/setup-cli.d.ts +53 -0
  162. package/dist/setup-cli.js +135 -6
  163. package/dist/setup-cli.js.map +1 -1
  164. package/docs/architecture.md +1 -1
  165. package/docs/tools.md +1 -1
  166. package/manifest.json +12 -3
  167. package/package.json +9 -4
  168. package/skills/apimapper/SKILL.md +1 -1
  169. package/skills/apimapper/reference/render.md +132 -0
  170. package/skills/apimapper/reference/troubleshooting.md +1 -1
  171. package/skills/apimapper/reference/yootheme.md +1 -1
@@ -1,2 +1,30 @@
1
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerMiscTools(server: McpServer): void;
1
+ import type { ToolRegistrar } from "./gateway/capturing-server.js";
2
+ export declare const UUID4_REGEX: RegExp;
3
+ /**
4
+ * A1-P3-2: Wire-shape for the `POST /feedback` REST response.
5
+ *
6
+ * Mirror of the PHP `@phpstan-type FeedbackResponse` aliases declared in:
7
+ * - WP: src/modules/admin-wordpress/.../FeedbackController.php
8
+ * - Joomla: src/modules/admin-joomla/.../FeedbackAjaxHandler.php
9
+ *
10
+ * All fields except `success` are optional because the PHP layer emits
11
+ * different subsets depending on the path:
12
+ * - 500 webhook-not-configured → `{ success: false, error }`
13
+ * - 400 missing-required-field → `{ success: false, error }`
14
+ * - 200 idempotency-duplicate → `{ success: true, queued, ticket_id, duplicate, idempotency_key }`
15
+ * - 200 fresh-submission → `{ success: true, queued?, ticket_id?, idempotency_key? }`
16
+ *
17
+ * Hoisted out of the inline `request<{...}>(...)` call-site (was at
18
+ * misc.ts:245-249) so the named interface is the single TS counterpart
19
+ * to the PHP @phpstan-type — touching one side without the other now
20
+ * shows up immediately as a cross-stack drift.
21
+ */
22
+ export interface FeedbackSubmitResponse {
23
+ success: boolean;
24
+ queued?: boolean;
25
+ ticket_id?: string | null;
26
+ duplicate?: boolean;
27
+ idempotency_key?: string;
28
+ error?: string;
29
+ }
30
+ export declare function registerMiscTools(server: ToolRegistrar): void;
@@ -1,6 +1,36 @@
1
+ // src/modules/apimapper/misc.ts — Releases + Brandfetch + Feedback
2
+ //
3
+ // REST surface: GET /releases, POST /releases/download, GET /brandfetch/{domain},
4
+ // POST /feedback.
5
+ // Domain: tail-end of the plugin surface — release listing + download URL,
6
+ // brand SVG proxy, and customer-feedback submission (proxied to Discord webhook).
7
+ // `feedback_submit` uses `unwrapInnerSuccess` because the queue can refuse
8
+ // (rate limit, mis-config) with 200+{success:false}.
9
+ import { randomUUID } from "node:crypto";
1
10
  import { z } from "zod";
2
- import { formatResult, autoFormatTable, readOnly, creating } from "@getimo/mcp-toolkit";
11
+ import { formatResult, tableResult, detailResult, errorResult, readOnly, mutating, } from "@getimo/mcp-toolkit";
3
12
  import { request, hintFor } from "./client.js";
13
+ // rc.13 Welle 3 (2026-05-20) — heavy read tools migrated to the toolkit's
14
+ // structuredContent builders. Migration is purely additive (text `content`
15
+ // block preserved, `_meta.ui` added).
16
+ // - release_list → tableResult (display="data-table").
17
+ // - brandfetch → detailResult (display="detail") — the flat {domain,
18
+ // has_svg, svg_size, hash} object renders as a grouped key-value detail.
19
+ // - release_download / feedback_submit keep their formatResult success
20
+ // payloads (a signed URL / a small confirmation); error branches →
21
+ // errorResult.
22
+ // - all error returns → errorResult (display="error", isError:true).
23
+ // ── release_list table shape ──────────────────────────────────────────
24
+ const RELEASE_COLUMNS = [
25
+ { key: "version", label: "VERSION", width: 12 },
26
+ { key: "date", label: "DATE", width: 22 },
27
+ { key: "breaking", label: "BREAKING", width: 8 },
28
+ { key: "is_current", label: "CURRENT", width: 7 },
29
+ ];
30
+ // RFC 4122 UUID v4 regex (lowercase + uppercase tolerated).
31
+ // Exported so tests can pin both request-body and response-payload formats
32
+ // against the same canonical pattern (single source of truth).
33
+ export const UUID4_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
4
34
  export function registerMiscTools(server) {
5
35
  // ── apimapper_release_list ─────────────────────────────────────────
6
36
  // F-A6-03: PHP ReleaseHandler returns `{success, current_version, releases}`.
@@ -14,33 +44,29 @@ export function registerMiscTools(server) {
14
44
  inputSchema: {
15
45
  limit: z.number().min(1).max(50).default(10).describe("Max items (1-50)"),
16
46
  },
17
- annotations: readOnly(),
47
+ annotations: readOnly({ title: "List Releases", openWorld: true }),
18
48
  }, async ({ limit }) => {
19
49
  const r = await request("/releases");
20
50
  if (!r.success) {
21
- return formatResult({
22
- error: r.error,
23
- status: r.status,
24
- errorCode: r.errorCode,
25
- context: { limit },
26
- hint: hintFor(r.errorCode),
27
- }, true);
51
+ return errorResult({
52
+ message: r.error ?? "release list failed",
53
+ code: r.errorCode ?? (r.status ? String(r.status) : undefined),
54
+ suggestion: hintFor(r.errorCode),
55
+ details: { limit },
56
+ });
28
57
  }
29
58
  const allReleases = Array.isArray(r.data?.releases) ? r.data.releases : [];
30
59
  const releases = allReleases.slice(0, limit);
31
60
  const currentVersion = r.data?.current_version ?? "?";
32
- return autoFormatTable(releases.map((rel) => ({
61
+ // W3.1 tableResult: ASCII table for the LLM + typed DataTable payload
62
+ // for the Rich Card. IA-10: the footer carries the next-step guidance.
63
+ return tableResult(releases.map((rel) => ({
33
64
  version: rel.version ?? "?",
34
65
  date: rel.date ?? "—",
35
66
  breaking: rel.has_breaking_changes ? "✓" : "✗",
36
67
  is_current: rel.version === currentVersion ? "✓" : "",
37
68
  })), {
38
- columns: [
39
- { key: "version", label: "VERSION", width: 12 },
40
- { key: "date", label: "DATE", width: 22 },
41
- { key: "breaking", label: "BREAKING", width: 8 },
42
- { key: "is_current", label: "CURRENT", width: 7 },
43
- ],
69
+ columns: RELEASE_COLUMNS,
44
70
  header: (n) => `${n} releases (current=${currentVersion})`,
45
71
  footer: "Use apimapper_release_download to fetch a download URL.",
46
72
  });
@@ -60,32 +86,33 @@ export function registerMiscTools(server) {
60
86
  .describe('Release version (e.g., "2.0.7")'),
61
87
  product: z.enum(["wordpress", "joomla"]).describe("Product variant"),
62
88
  },
63
- annotations: creating(),
89
+ // W1.26 (IA-1): the description already states this is read-only server-side
90
+ // (no state change — generates a signed URL). The annotation now matches.
91
+ annotations: readOnly({ title: "Get Release Download URL", openWorld: true }),
64
92
  }, async ({ version, product }) => {
65
93
  const r = await request("/releases/download", {
66
94
  method: "POST",
67
95
  body: JSON.stringify({ version, product }),
68
96
  });
69
97
  if (!r.success) {
70
- return formatResult({
71
- error: r.error,
72
- status: r.status,
73
- errorCode: r.errorCode,
74
- context: { version, product },
75
- hint: hintFor(r.errorCode),
76
- }, true);
98
+ return errorResult({
99
+ message: r.error ?? "release download failed",
100
+ code: r.errorCode ?? (r.status ? String(r.status) : undefined),
101
+ suggestion: hintFor(r.errorCode),
102
+ details: { version, product },
103
+ });
77
104
  }
78
105
  // Defensive read: PHP currently returns flat `{success, download_url}`
79
106
  // (post Wave 1B), but older shape wrapped under `data.download_url`.
80
107
  // Tolerate either.
81
108
  const downloadUrl = r.data?.data?.download_url ?? r.data?.download_url;
82
109
  if (!downloadUrl) {
83
- return formatResult({
84
- error: "no download URL returned",
85
- status: r.status,
86
- context: { version, product },
87
- hint: "Server returned 200 but no download_url field. Verify version+product combination.",
88
- }, true);
110
+ return errorResult({
111
+ message: "no download URL returned",
112
+ code: r.status ? String(r.status) : undefined,
113
+ suggestion: "Server returned 200 but no download_url field. Verify version+product combination.",
114
+ details: { version, product },
115
+ });
89
116
  }
90
117
  return formatResult({
91
118
  download_url: downloadUrl,
@@ -106,22 +133,44 @@ export function registerMiscTools(server) {
106
133
  inputSchema: {
107
134
  domain: z.string().describe('Domain (e.g., "calendly.com", "google.com")'),
108
135
  },
109
- annotations: readOnly(),
136
+ annotations: readOnly({ title: "Brand Fetch", openWorld: true }),
110
137
  }, async ({ domain }) => {
111
138
  const r = await request(`/brandfetch/${encodeURIComponent(domain)}`);
112
139
  if (!r.success) {
113
- return formatResult({ error: r.error, status: r.status, errorCode: r.errorCode, context: { domain }, hint: hintFor(r.errorCode) }, true);
140
+ return errorResult({
141
+ message: r.error ?? "brandfetch failed",
142
+ code: r.errorCode ?? (r.status ? String(r.status) : undefined),
143
+ suggestion: hintFor(r.errorCode),
144
+ details: { domain },
145
+ });
114
146
  }
115
147
  // Defensive read: tolerate both flat (Wave 1B) and wrapped (legacy) shapes.
116
148
  const svg = r.data?.data?.svg ?? r.data?.svg;
117
149
  const hash = r.data?.data?.hash ?? r.data?.hash;
118
150
  const normalisedDomain = r.data?.data?.domain ?? r.data?.domain ?? domain;
119
- return formatResult({
120
- domain: normalisedDomain,
121
- has_svg: Boolean(svg),
122
- svg_size: svg ? svg.length : 0,
123
- hash,
124
- }, false, { maxChars: 2000 });
151
+ const hasSvg = Boolean(svg);
152
+ // W3.1 — detailResult: the flat {domain, has_svg, svg_size, hash} object
153
+ // renders as a grouped key-value detail for the Rich Card.
154
+ const entries = [
155
+ { key: "domain", label: "Domain", value: normalisedDomain, format: "text" },
156
+ { key: "has_svg", label: "Has SVG", value: hasSvg, format: "boolean" },
157
+ {
158
+ key: "svg_size",
159
+ label: "SVG size (bytes)",
160
+ value: svg ? svg.length : 0,
161
+ },
162
+ ];
163
+ if (hash) {
164
+ entries.push({ key: "hash", label: "SRI hash", value: hash, format: "code" });
165
+ }
166
+ return detailResult({
167
+ title: `Brand: ${normalisedDomain}`,
168
+ subtitle: hasSvg ? "SVG logo available" : "no SVG logo",
169
+ badge: hasSvg
170
+ ? { text: "svg", variant: "success" }
171
+ : { text: "no svg", variant: "secondary" },
172
+ groups: [{ label: "Logo", entries }],
173
+ });
125
174
  });
126
175
  // ── apimapper_feedback_submit ──────────────────────────────────────
127
176
  // F-A6-13: PHP FeedbackController accepts `type`, `message`, and forwards
@@ -140,27 +189,57 @@ export function registerMiscTools(server) {
140
189
  email: z.string().email().optional().describe("Reply email (optional)"),
141
190
  attachments: z
142
191
  .array(z.string().url())
192
+ .max(5)
143
193
  .optional()
144
- .describe("Optional attachment URLs (e.g., screenshots already uploaded elsewhere)"),
194
+ .describe("Optional attachment URLs (e.g., screenshots already uploaded elsewhere). Max 5."),
195
+ idempotency_key: z
196
+ .string()
197
+ .regex(UUID4_REGEX, "idempotency_key must be a UUID v4")
198
+ .optional()
199
+ .describe("Optional UUID4 idempotency key to prevent duplicate submissions on retry. " +
200
+ "If omitted, the MCP auto-generates one. Server dedupes within 15 minutes."),
145
201
  },
146
- annotations: creating(),
147
- }, async ({ type, subject, message, email, attachments }) => {
148
- const r = await request("/feedback", { method: "POST", body: JSON.stringify({ type, subject, message, email, attachments }) }, { unwrapInnerSuccess: true });
202
+ // W1.26 (IA-1): feedback_submit is idempotent — W1.20 added UUID4 dedupe on
203
+ // the server side (15-min window). Re-submitting the same idempotency_key
204
+ // returns the existing record. mutating() captures "writes + idempotent";
205
+ // creating() implied a new row per call which is no longer true.
206
+ annotations: mutating({ title: "Submit Feedback", openWorld: true }),
207
+ }, async ({ type, subject, message, email, attachments, idempotency_key }) => {
208
+ const key = idempotency_key ?? randomUUID();
209
+ // A1-P3-2: named `FeedbackSubmitResponse` interface — hoisted so it
210
+ // mirrors the PHP @phpstan-type FeedbackResponse alias on both
211
+ // FeedbackController (WP) and FeedbackAjaxHandler (Joomla).
212
+ const r = await request("/feedback", {
213
+ method: "POST",
214
+ body: JSON.stringify({
215
+ type,
216
+ subject,
217
+ message,
218
+ email,
219
+ attachments,
220
+ idempotency_key: key,
221
+ }),
222
+ }, { unwrapInnerSuccess: true });
149
223
  if (!r.success) {
150
- return formatResult({
151
- error: r.error,
152
- status: r.status,
153
- errorCode: r.errorCode,
154
- payloadFailed: r.payloadFailed,
155
- context: { type, subject_len: subject.length },
156
- hint: r.payloadFailed
224
+ return errorResult({
225
+ message: r.error ?? "feedback submission failed",
226
+ code: r.errorCode ?? (r.status ? String(r.status) : undefined),
227
+ suggestion: r.payloadFailed
157
228
  ? "Server accepted the request but the proxy did not deliver it. Reason in error field."
158
229
  : hintFor(r.errorCode),
159
- }, true);
230
+ details: {
231
+ type,
232
+ subject_len: subject.length,
233
+ idempotency_key: key,
234
+ payloadFailed: r.payloadFailed,
235
+ },
236
+ });
160
237
  }
161
238
  // unwrapInnerSuccess already caught success:false, so here success is true.
162
239
  return formatResult({
163
240
  submitted: true,
241
+ idempotency_key: r.data?.idempotency_key ?? key,
242
+ duplicate: r.data?.duplicate ?? false,
164
243
  }, false, { maxChars: 2000 });
165
244
  });
166
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/modules/apimapper/misc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../src/modules/apimapper/misc.ts"],"names":[],"mappings":"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"}
@@ -215,3 +215,55 @@ export declare const nodeSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
215
215
  }, z.core.$loose>;
216
216
  }, z.core.$strip>], "type">;
217
217
  export type FlowNode = z.infer<typeof nodeSchema>;
218
+ /**
219
+ * Strict edge schema shared by flow_create, graph_preview, and graph_validate.
220
+ *
221
+ * Centralized so the 3 tool registrations have identical shape contracts —
222
+ * preventing silent drift where one site accepts a shape the others reject.
223
+ *
224
+ * Before W1.6 each site used `z.array(z.record(z.string(), z.unknown()))` —
225
+ * arbitrary structures (e.g. `{source: 1, target: null}`) passed validation
226
+ * and then failed at graph-execution with confusing errors.
227
+ *
228
+ * Defense-in-depth: source + target are required non-empty strings;
229
+ * non-string types and empty strings are rejected at the Zod boundary.
230
+ *
231
+ * For merge nodes, targetHandle uses "input-0" / "input-1" convention
232
+ * (zero-indexed by input slot — matches frontend BaseNode.tsx Handle id rendering
233
+ * and the backend DagExecutor tolerant input-slot resolution).
234
+ */
235
+ export declare const edgeSchema: z.ZodObject<{
236
+ id: z.ZodOptional<z.ZodString>;
237
+ source: z.ZodString;
238
+ target: z.ZodString;
239
+ sourceHandle: z.ZodOptional<z.ZodString>;
240
+ targetHandle: z.ZodOptional<z.ZodString>;
241
+ }, z.core.$strip>;
242
+ export type FlowEdge = z.infer<typeof edgeSchema>;
243
+ /**
244
+ * W1.18 (F-32): case-insensitive substring filter applied in-memory after
245
+ * the upstream list fetch.
246
+ *
247
+ * Shared between `apimapper_flow_list` and `apimapper_connection_list` so
248
+ * the two tools cannot drift on semantics (case-folding, undefined-skip,
249
+ * empty-string behaviour). The min-2-char guard lives on each tool's Zod
250
+ * schema (`z.string().min(2).optional()`) — this helper deliberately does
251
+ * NOT enforce the length here so that direct programmatic callers (e.g.
252
+ * unit tests, internal composers) can still pass a 1-char needle when
253
+ * they really mean it. The wire boundary is the gate; this helper is the
254
+ * pure transform.
255
+ *
256
+ * Contract:
257
+ * - `needle === undefined` → returns the input array unchanged (no filter)
258
+ * - `needle === ""` → returns the input array unchanged (empty
259
+ * haystack-match is meaningless; treat as
260
+ * "no filter applied")
261
+ * - otherwise → returns items whose `name` (lowercased)
262
+ * contains the lowercased needle
263
+ *
264
+ * Generic over `T extends { name?: string }` — accepts both `Flow` and
265
+ * `Connection` shapes without adapter wrappers at the call site.
266
+ */
267
+ export declare function filterByNameQuery<T extends {
268
+ name?: string;
269
+ }>(items: T[], needle: string | undefined): T[];
@@ -138,11 +138,11 @@ export const mergeNodeSchema = z
138
138
  .enum(["concat", "join"])
139
139
  .describe("'concat' = stack items from both inputs; 'join' = relational join on key. " +
140
140
  "Strategies 'append', 'chronological', etc. are NOT valid here."),
141
- joinKey: z.string().optional().describe("Field on input-A (required if strategy='join')"),
141
+ joinKey: z.string().optional().describe("Field on input-0 (required if strategy='join')"),
142
142
  joinKeyRight: z
143
143
  .string()
144
144
  .optional()
145
- .describe("Field on input-B (defaults to joinKey when omitted)"),
145
+ .describe("Field on input-1 (defaults to joinKey when omitted)"),
146
146
  joinType: z
147
147
  .enum(["left", "right", "inner", "outer"])
148
148
  .optional()
@@ -215,4 +215,72 @@ export const nodeSchema = z
215
215
  }),
216
216
  ])
217
217
  .describe("Flow node. Discriminator: `type` ∈ source | local-source | filter | transform | merge | output | output-yootheme | output-shortcode");
218
+ // ── edge ─────────────────────────────────────────────────────────────────
219
+ /**
220
+ * Strict edge schema shared by flow_create, graph_preview, and graph_validate.
221
+ *
222
+ * Centralized so the 3 tool registrations have identical shape contracts —
223
+ * preventing silent drift where one site accepts a shape the others reject.
224
+ *
225
+ * Before W1.6 each site used `z.array(z.record(z.string(), z.unknown()))` —
226
+ * arbitrary structures (e.g. `{source: 1, target: null}`) passed validation
227
+ * and then failed at graph-execution with confusing errors.
228
+ *
229
+ * Defense-in-depth: source + target are required non-empty strings;
230
+ * non-string types and empty strings are rejected at the Zod boundary.
231
+ *
232
+ * For merge nodes, targetHandle uses "input-0" / "input-1" convention
233
+ * (zero-indexed by input slot — matches frontend BaseNode.tsx Handle id rendering
234
+ * and the backend DagExecutor tolerant input-slot resolution).
235
+ */
236
+ export const edgeSchema = z
237
+ .object({
238
+ id: z.string().min(1).optional().describe("Stable edge identifier (optional)"),
239
+ source: z.string().min(1).describe("Source node id (required, non-empty)"),
240
+ target: z.string().min(1).describe("Target node id (required, non-empty)"),
241
+ sourceHandle: z
242
+ .string()
243
+ .min(1)
244
+ .optional()
245
+ .describe("Source-side handle (e.g., 'out')"),
246
+ targetHandle: z
247
+ .string()
248
+ .min(1)
249
+ .optional()
250
+ .describe('Target-side handle (e.g., "input-0" or "input-1" for merge nodes). ' +
251
+ 'Legacy "input-A"/"input-B" still accepted for backward-compat but new ' +
252
+ 'flows should use the canonical zero-indexed form.'),
253
+ })
254
+ .describe("Flow edge connecting two nodes. Shape: {id?, source, target, sourceHandle?, targetHandle?}");
255
+ // ── name_query filter helper ─────────────────────────────────────────────
256
+ /**
257
+ * W1.18 (F-32): case-insensitive substring filter applied in-memory after
258
+ * the upstream list fetch.
259
+ *
260
+ * Shared between `apimapper_flow_list` and `apimapper_connection_list` so
261
+ * the two tools cannot drift on semantics (case-folding, undefined-skip,
262
+ * empty-string behaviour). The min-2-char guard lives on each tool's Zod
263
+ * schema (`z.string().min(2).optional()`) — this helper deliberately does
264
+ * NOT enforce the length here so that direct programmatic callers (e.g.
265
+ * unit tests, internal composers) can still pass a 1-char needle when
266
+ * they really mean it. The wire boundary is the gate; this helper is the
267
+ * pure transform.
268
+ *
269
+ * Contract:
270
+ * - `needle === undefined` → returns the input array unchanged (no filter)
271
+ * - `needle === ""` → returns the input array unchanged (empty
272
+ * haystack-match is meaningless; treat as
273
+ * "no filter applied")
274
+ * - otherwise → returns items whose `name` (lowercased)
275
+ * contains the lowercased needle
276
+ *
277
+ * Generic over `T extends { name?: string }` — accepts both `Flow` and
278
+ * `Connection` shapes without adapter wrappers at the call site.
279
+ */
280
+ export function filterByNameQuery(items, needle) {
281
+ if (!needle)
282
+ return items;
283
+ const lowered = needle.toLowerCase();
284
+ return items.filter((item) => (item.name ?? "").toLowerCase().includes(lowered));
285
+ }
218
286
  //# sourceMappingURL=node-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-schema.js","sourceRoot":"","sources":["../../../src/modules/apimapper/node-schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-schema.js","sourceRoot":"","sources":["../../../src/modules/apimapper/node-schema.ts"],"names":[],"mappings":"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"}
@@ -11,3 +11,4 @@ export declare function trimSlashes(s: string): string;
11
11
  * slash is structural, not a path separator.
12
12
  */
13
13
  export declare function encodePathPreservingSlashes(s: string): string;
14
+ export declare function normalizeConnectionFromWire(raw: Record<string, unknown>): Record<string, unknown>;
@@ -34,4 +34,55 @@ export function encodePathPreservingSlashes(s) {
34
34
  .map((seg) => encodeURIComponent(seg))
35
35
  .join("/");
36
36
  }
37
+ /**
38
+ * Bridge camelCase wire-format keys from the `/connections` REST endpoint to
39
+ * the snake_case shape every consumer (connection_list table, connection_get
40
+ * detail, onboarding report) reads. The PHP backend returns
41
+ * `authType`/`credentialId`/etc. (camelCase) but our domain `Connection` type
42
+ * + every formatter reads `auth_type`/`credential_id` (snake_case). Without
43
+ * this bridge, `c.auth_type` evaluates to `undefined` → every connection in
44
+ * the AI's view appears as `auth=none` / `credential_id=null`, regardless of
45
+ * the real linked credential. F-LS-04 (live-smoke 2026-05-20).
46
+ *
47
+ * Behaviour: maps the 17 known camelCase keys to snake_case. Already-
48
+ * snake-case keys win on collision (forward-compat with future backend
49
+ * versions that may emit snake_case natively). Unknown keys pass through
50
+ * untouched. Idempotent — running this twice produces the same shape.
51
+ *
52
+ * The camelCase keys are intentionally preserved on the output so any
53
+ * consumer that already reads them keeps working; the snake_case keys are
54
+ * added in addition. Both representations are present after normalisation,
55
+ * which makes the function idempotent regardless of how often callers
56
+ * apply it.
57
+ */
58
+ const CAMEL_TO_SNAKE = [
59
+ ["authType", "auth_type"],
60
+ ["credentialId", "credential_id"],
61
+ ["originId", "origin_id"],
62
+ ["originHash", "origin_hash"],
63
+ ["itemsPath", "items_path"],
64
+ ["cacheTtl", "cache_ttl"],
65
+ ["templateId", "template_id"],
66
+ ["baseUrl", "base_url"],
67
+ ["createdAt", "created_at"],
68
+ ["updatedAt", "updated_at"],
69
+ ["deletedAt", "deleted_at"],
70
+ ["authConfig", "auth_config"],
71
+ ["computedFields", "computed_fields"],
72
+ ["templateFields", "template_fields"],
73
+ ["templateFieldLabels", "template_field_labels"],
74
+ ["defaultParams", "default_params"],
75
+ ["defaultHeaders", "default_headers"],
76
+ ];
77
+ export function normalizeConnectionFromWire(raw) {
78
+ const out = { ...raw };
79
+ for (const [camel, snake] of CAMEL_TO_SNAKE) {
80
+ if (camel in out && !(snake in out)) {
81
+ out[snake] = out[camel];
82
+ }
83
+ // intentionally keep the camelCase key as well — forward-compat for
84
+ // any consumer that already reads it; idempotency holds either way.
85
+ }
86
+ return out;
87
+ }
37
88
  //# sourceMappingURL=normalizers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizers.js","sourceRoot":"","sources":["../../../src/modules/apimapper/normalizers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AAIzE,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,oEAAoE;IACpE,oEAAoE;IACpE,uEAAuE;IACvE,oBAAoB;IACpB,sCAAsC;IACtC,OAAO,CAAC,IAAI,CACV,wDAAwD,KAAK,4BAA4B,CAC1F,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,CAAS;IACnD,OAAO,CAAC;SACL,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"normalizers.js","sourceRoot":"","sources":["../../../src/modules/apimapper/normalizers.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,yEAAyE;AAIzE,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,oEAAoE;IACpE,oEAAoE;IACpE,uEAAuE;IACvE,oBAAoB;IACpB,sCAAsC;IACtC,OAAO,CAAC,IAAI,CACV,wDAAwD,KAAK,4BAA4B,CAC1F,CAAC;IACF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,CAAS;IACnD,OAAO,CAAC;SACL,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;SACrC,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,cAAc,GAA6C;IAC/D,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,cAAc,EAAE,eAAe,CAAC;IACjC,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,SAAS,EAAE,UAAU,CAAC;IACvB,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IACrC,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IACrC,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;IAChD,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACnC,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CACzC,GAA4B;IAE5B,MAAM,GAAG,GAA4B,EAAE,GAAG,GAAG,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,cAAc,EAAE,CAAC;QAC5C,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;YACpC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,oEAAoE;QACpE,oEAAoE;IACtE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}