genexus-mcp 3.6.0 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,19 +12,21 @@
12
12
 
13
13
  ---
14
14
 
15
- **GeneXus MCP Server** lets AI agents — Claude Desktop, Claude Code, Cursor, Antigravity, and any MCP-compatible client — read, edit, analyze, and refactor objects inside a Knowledge Base supported by the selected GeneXus SDK. It talks to the **native GeneXus SDK**, so the agent works with the *real* KB, not a copy or a parsed approximation.
15
+ **GeneXus MCP Server** lets AI agents — Claude Desktop, Claude Code, Cursor, Antigravity, and any MCP-compatible client — read, edit, analyze, and refactor objects inside a Knowledge Base supported by the selected native SDK or legacy compatibility driver. Native SDK paths work with the **real GeneXus SDK** and legacy paths use explicit reflection/COM adapters; neither path relies on a parsed copy of the KB.
16
16
 
17
17
  In practice: you point the MCP at your KB, then ask your AI assistant things like *"list all transactions with attribute CustomerId"*, *"add a rule to the Order transaction that validates the total"*, or *"refactor this procedure to use the new SDT"* — and it does it.
18
18
 
19
19
  ---
20
20
 
21
- ## Multi-version SDK support
21
+ ## Multi-version GeneXus support
22
22
 
23
- The same MCP distribution supports the SDK majors listed in the generated
24
- compatibility document. Each configured MCP process selects one installed SDK
25
- with `--gx`; no separate MCP installation is required. The commands below are
26
- examples of switching the existing configuration, not running two majors in
27
- the same process:
23
+ The same MCP distribution supports the official native SDK majors listed in the
24
+ generated compatibility document. It also includes basic, best-effort
25
+ compatibility for the legacy versions listed there through separate drivers;
26
+ that path is not equivalent to full native-SDK support. Each configured MCP
27
+ process selects one installed SDK or legacy driver with `--gx`; no separate MCP
28
+ installation is required. The commands below are examples of switching the
29
+ existing configuration, not running two majors in the same process:
28
30
 
29
31
  ```bash
30
32
  npx genexus-mcp@latest init --kb "C:\KBs\KBTeste17" --gx "C:\Program Files (x86)\GeneXus\GeneXus17Trial"
@@ -45,7 +47,9 @@ that checks every supported major against one published artifact.
45
47
 
46
48
  The Gateway reports the detected SDK through `genexus_whoami`:
47
49
 
48
- - `geneXus.supportedMajors`: explicitly validated SDK majors from the version catalog
50
+ - `geneXus.supportedMajors`: explicitly validated native SDK majors from the version catalog
51
+ - `geneXus.legacyMajors`: catalogued legacy majors handled by their compatibility drivers
52
+ - `geneXus.sdkCompatibility.supportLevel`: `native-sdk` or `basic-legacy` for the detected installation
49
53
  - `geneXus.matchedMajor`: the major detected for the configured installation
50
54
  - `geneXus.versionMatches`: whether the detected installation is in that catalog
51
55
  - `geneXus.supportedMajor`: retained as the legacy single-major alias for the catalog primary
@@ -57,23 +61,29 @@ needed. Existing tool names, arguments, and MCP client configuration formats do
57
61
  not change.
58
62
 
59
63
  <!-- BEGIN GENERATED: gx-compatibility -->
60
- Supported SDK majors: **GeneXus 16, GeneXus 17, GeneXus 18**.
64
+ Supported SDK majors: **GeneXus 16, GeneXus 17, GeneXus 18** (native SDK).
65
+ Basic legacy compatibility: **GeneXus Evolution 3, GeneXus Evolution 2, GeneXus Evolution 1, GeneXus 15, GeneXus 9.0, GeneXus 8.0** via `com-gxpublic` and `dotnet-reflection` (not the native SDK build).
61
66
  Primary SDK: **GeneXus 18**.
62
67
  Source of truth: `config/gx-versions.json`.
63
68
  <!-- END GENERATED: gx-compatibility -->
64
69
 
65
- To add another GeneXus major in the future, add it to the explicit version
66
- catalog only after compiling the Worker with that SDK and passing the focused
67
- tests plus a live KB smoke. This prevents the server from claiming compatibility
68
- based only on a version string.
70
+ To add another native-SDK major in the future, add it to the explicit
71
+ `supportedMajors` catalog only after compiling the Worker with that SDK and
72
+ passing the focused tests plus a live KB smoke. This prevents the server from
73
+ claiming native-SDK compatibility based only on a version string.
69
74
 
70
- ### Legacy GeneXus compatibility (GX8 to GX15)
75
+ ### Basic legacy compatibility (not native SDK support)
71
76
 
72
- The server also includes best-effort dynamic compatibility for legacy installations:
77
+ Every legacy version currently declared in `legacyMajors` uses a best-effort
78
+ driver rather than the native SDK build:
73
79
  - **GeneXus Evolution 1 (10.1), Evolution 2 (10.2), Evolution 3 (10.3), and GeneXus 15**: Driven via runtime reflection (`dotnet-reflection`), dynamically adapting to missing types or structural differences (such as module-less KBs without `QualifiedName`).
74
- - **GeneXus 8.0 and GeneXus 9.0**: Driven via classic Win32 COM automation (`com-gxpublic`), late-binding to `GXPublic.GXPublic` on an STA thread to open, inspect, and read objects from classic `.gxi` Knowledge Bases.
80
+ - **GeneXus 8.0 and GeneXus 9.0**: Driven through the classic GXPublic surface (`com-gxpublic`), detected from `gx.exe`/`gxdl32.dll` and classic `.gxi` Knowledge Bases. GXPublic is a metadata-oriented OLE DB/COM surface; this path is intentionally limited to basic metadata/core operations and does not claim native-SDK source/edit parity.
75
81
  - **Graceful degradation**: Modern tools that require features introduced in newer GeneXus versions (such as `genexus_api`, `genexus_gam`, or `genexus_module`) return structured `UNSUPPORTED_IN_GENEXUS_VERSION` errors indicating the required minimum version rather than failing ungracefully.
76
82
 
83
+ This legacy path is intended for basic core operations where implemented; it
84
+ does not claim the same feature parity as the native SDK contract for GeneXus
85
+ 16, 17, and 18.
86
+
77
87
  ---
78
88
 
79
89
  ## What you can do with it
@@ -93,7 +103,10 @@ A quick map of what the agent can do against your real KB through the **50 tools
93
103
  | 🌿 **Versioning, transfer & teams** | KB model versions/branches, **real XPZ export/import** (dependency-aware), GXserver (Team Development) sync + **CI pipelines**, git-style history, multi-KB parallel work |
94
104
  | 🔐 **Security** | GAM / integrated-security provisioning, KB security audit + native Security Scanner |
95
105
 
96
- It works through the **native GeneXus SDK** — the same code paths the IDE uses — so edits are real and validated, not text hacks on KB files.
106
+ Native SDK support works through the **native GeneXus SDK** — the same code paths
107
+ the IDE uses — so edits are real and validated, not text hacks on KB files.
108
+ Legacy support uses the reflection or COM driver listed in the catalog and
109
+ degrades unsupported modern tools explicitly.
97
110
 
98
111
  ---
99
112
 
@@ -102,9 +115,9 @@ It works through the **native GeneXus SDK** — the same code paths the IDE uses
102
115
  Before you start, make sure you have:
103
116
 
104
117
  - ✅ **Windows** (GeneXus is Windows-only)
105
- - ✅ **A supported GeneXus SDK** installed locally (see [`docs/generated/supported-versions.md`](docs/generated/supported-versions.md); pass another install path explicitly when needed)
106
- - ✅ **GeneXus 18** installed locally (the primary supported SDK; other catalogued majors are also supported)
107
- - ✅ **A Knowledge Base created with a supported GeneXus major** and opened at least once in the IDE (so it's initialized)
118
+ - ✅ **A supported GeneXus installation** installed locally: GeneXus 16, 17, or 18 for native SDK support, or a catalogued legacy installation for basic compatibility (see [`docs/generated/supported-versions.md`](docs/generated/supported-versions.md); pass another install path explicitly when needed)
119
+ - ✅ **GeneXus 18** installed locally for the primary native-SDK path; other catalogued native and legacy versions are also supported according to their listed driver
120
+ - ✅ **A Knowledge Base created with a supported native or legacy GeneXus major** and opened at least once in the IDE (so it's initialized)
108
121
  - ✅ **Node.js 22+** — check with `node --version` in a terminal; install from [nodejs.org](https://nodejs.org/) if missing
109
122
  - ✅ **An MCP-compatible AI client** — [Claude Desktop](https://claude.ai/download), [Claude Code](https://claude.com/claude-code), Cursor, Antigravity, etc.
110
123
 
package/cli/lib/config.js CHANGED
@@ -113,6 +113,11 @@ function getGeneXusVersionCatalog() {
113
113
  };
114
114
  }
115
115
 
116
+ function hasGeneXusExecutable(gxPath) {
117
+ return Boolean(gxPath) && ['genexus.exe', 'gx.exe']
118
+ .some((name) => fs.existsSync(path.join(gxPath, name)));
119
+ }
120
+
116
121
  function getGeneXusCatalogEntries(preferredMajor = null) {
117
122
  const catalog = getGeneXusVersionCatalog();
118
123
  const all = [...catalog.supportedMajors, ...(catalog.legacyMajors || [])];
@@ -153,7 +158,7 @@ function discoverGeneXusFromRegistry(preferredMajor = null) {
153
158
  const match = out.match(/InstallationDirectory\s+REG_SZ\s+(.+?)\r?\n/i);
154
159
  if (match) {
155
160
  const candidate = match[1].trim().replace(/[\\/]+$/, '');
156
- if (candidate && fs.existsSync(path.join(candidate, 'genexus.exe')) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
161
+ if (candidate && hasGeneXusExecutable(candidate) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
157
162
  return candidate;
158
163
  }
159
164
  }
@@ -172,7 +177,7 @@ function discoverGeneXusFromRegistry(preferredMajor = null) {
172
177
  const match = out.match(/InstallPath\s+REG_SZ\s+(.+?)\r?\n/i);
173
178
  if (match) {
174
179
  const candidate = match[1].trim().replace(/[\\/]+$/, '');
175
- if (candidate && fs.existsSync(path.join(candidate, 'genexus.exe')) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) return candidate;
180
+ if (candidate && hasGeneXusExecutable(candidate) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) return candidate;
176
181
  }
177
182
  } catch {
178
183
  }
@@ -187,7 +192,7 @@ function discoverGeneXusFromRegistry(preferredMajor = null) {
187
192
  function discoverGeneXusInstallation(preferredMajor = null) {
188
193
  if (process.env.GENEXUS_HOME) {
189
194
  const candidate = process.env.GENEXUS_HOME.replace(/[\\/]+$/, '');
190
- if (fs.existsSync(path.join(candidate, 'genexus.exe')) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) return candidate;
195
+ if (hasGeneXusExecutable(candidate) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) return candidate;
191
196
  }
192
197
 
193
198
  const fromRegistry = discoverGeneXusFromRegistry(preferredMajor);
@@ -205,7 +210,11 @@ function discoverGeneXusInstallation(preferredMajor = null) {
205
210
  const entries = getGeneXusCatalogEntries(preferredMajor);
206
211
  const seen = new Set();
207
212
  for (const base of programDirs) {
208
- const root = path.join(base, 'GeneXus');
213
+ const roots = [
214
+ path.join(base, 'GeneXus'),
215
+ path.join(base, 'Artech', 'GeneXus')
216
+ ];
217
+ for (const root of roots) {
209
218
  const key = root.toLowerCase();
210
219
  if (seen.has(key)) continue;
211
220
  seen.add(key);
@@ -217,7 +226,7 @@ function discoverGeneXusInstallation(preferredMajor = null) {
217
226
  for (const ver of candidateNames) {
218
227
  if (!ver) continue;
219
228
  const candidate = path.join(root, ver);
220
- if (fs.existsSync(path.join(candidate, 'genexus.exe')) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
229
+ if (hasGeneXusExecutable(candidate) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
221
230
  return candidate;
222
231
  }
223
232
  }
@@ -230,13 +239,14 @@ function discoverGeneXusInstallation(preferredMajor = null) {
230
239
  const majorMatch = entry.match(/^GeneXus\s*(\d+)/i);
231
240
  if (majorMatch && !entries.some((item) => String(item.major) === majorMatch[1])) continue;
232
241
  const candidate = path.join(root, entry);
233
- if (fs.existsSync(path.join(candidate, 'genexus.exe')) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
242
+ if (hasGeneXusExecutable(candidate) && matchesPreferredGeneXusMajor(candidate, preferredMajor)) {
234
243
  return candidate;
235
244
  }
236
245
  }
237
246
  }
238
247
  } catch {
239
248
  }
249
+ }
240
250
  }
241
251
 
242
252
  const fromPath = discoverGeneXusFromPath(preferredMajor);
@@ -249,15 +259,22 @@ function discoverGeneXusFromPath(preferredMajor = null) {
249
259
  if (process.platform !== 'win32') return null;
250
260
  try {
251
261
  const { execFileSync } = require('child_process');
252
- const out = execFileSync('where.exe', ['genexus.exe'], {
253
- encoding: 'utf8',
254
- stdio: ['ignore', 'pipe', 'ignore'],
255
- windowsHide: true,
256
- timeout: 3000
257
- });
258
- const first = out.split(/\r?\n/).map((s) => s.trim()).find(Boolean);
259
- if (first && fs.existsSync(first) && matchesPreferredGeneXusMajor(path.dirname(first), preferredMajor)) {
260
- return path.dirname(first);
262
+ for (const executable of ['genexus.exe', 'gx.exe']) {
263
+ let out;
264
+ try {
265
+ out = execFileSync('where.exe', [executable], {
266
+ encoding: 'utf8',
267
+ stdio: ['ignore', 'pipe', 'ignore'],
268
+ windowsHide: true,
269
+ timeout: 3000
270
+ });
271
+ } catch {
272
+ continue;
273
+ }
274
+ const first = out.split('\n').map((s) => s.trim()).find(Boolean);
275
+ if (first && fs.existsSync(first) && matchesPreferredGeneXusMajor(path.dirname(first), preferredMajor)) {
276
+ return path.dirname(first);
277
+ }
261
278
  }
262
279
  } catch {
263
280
  }
package/cli/run.test.js CHANGED
@@ -20,6 +20,7 @@ const {
20
20
  getLauncher,
21
21
  getGeneXusMajor,
22
22
  getGeneXusCatalogEntries,
23
+ discoverGeneXusInstallation,
23
24
  readGeneXusInstallationIdentity,
24
25
  readGeneXusKbIdentity,
25
26
  compareGeneXusKbAndInstallation,
@@ -553,6 +554,37 @@ test('GeneXus installation identity falls back to executable metadata', () => {
553
554
  }
554
555
  });
555
556
 
557
+ test('classic GeneXus installation identity reads gx.exe metadata', () => {
558
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'genexus-mcp-classic-version-'));
559
+ try {
560
+ fs.writeFileSync(path.join(tempRoot, 'gx.exe'), 'not-a-real-executable');
561
+ const identity = readGeneXusInstallationIdentity(tempRoot, {
562
+ readExecutableVersion: (exePath) => exePath.endsWith('gx.exe') ? '9.0.123' : null
563
+ });
564
+ assert.deepEqual(identity, {
565
+ version: '9.0.123',
566
+ major: '9',
567
+ source: 'executable-metadata'
568
+ });
569
+ } finally {
570
+ removeTempPath(tempRoot, { recursive: true, force: true });
571
+ }
572
+ });
573
+
574
+ test('classic GeneXus installation discovery accepts GENEXUS_HOME with gx.exe', () => {
575
+ const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'genexus-mcp-classic-home-'));
576
+ const previousHome = process.env.GENEXUS_HOME;
577
+ try {
578
+ fs.writeFileSync(path.join(tempRoot, 'gx.exe'), 'not-a-real-executable');
579
+ process.env.GENEXUS_HOME = tempRoot;
580
+ assert.equal(discoverGeneXusInstallation(), tempRoot);
581
+ } finally {
582
+ if (previousHome === undefined) delete process.env.GENEXUS_HOME;
583
+ else process.env.GENEXUS_HOME = previousHome;
584
+ removeTempPath(tempRoot, { recursive: true, force: true });
585
+ }
586
+ });
587
+
556
588
  test('GeneXus installation identity ignores an invalid version file when executable metadata is valid', () => {
557
589
  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'genexus-mcp-invalid-version-'));
558
590
  try {
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "genexus-mcp",
3
- "version": "3.6.0",
3
+ "version": "3.6.1",
4
4
  "mcpName": "io.github.lennix1337/genexus",
5
- "description": "GeneXus 16, GeneXus 17, GeneXus 18 MCP server — read, edit, and analyze Knowledge Base objects directly from Claude, Cursor, and other AI agents over the Model Context Protocol.",
5
+ "description": "GeneXus 16, GeneXus 17, GeneXus 18 MCP server with native SDK support; basic legacy compatibility for GeneXus Evolution 3, GeneXus Evolution 2, GeneXus Evolution 1, GeneXus 15, GeneXus 9.0, GeneXus 8.0 via com-gxpublic and dotnet-reflection drivers — read, edit, and analyze Knowledge Base objects directly from Claude, Cursor, and other AI agents over the Model Context Protocol.",
6
6
  "keywords": [
7
7
  "mcp",
8
8
  "mcp-server",
@@ -7,7 +7,7 @@
7
7
  "targets": {
8
8
  ".NETCoreApp,Version=v10.0": {},
9
9
  ".NETCoreApp,Version=v10.0/win-x64": {
10
- "GxMcp.Gateway/3.6.0": {
10
+ "GxMcp.Gateway/3.6.1": {
11
11
  "dependencies": {
12
12
  "Newtonsoft.Json": "13.0.3",
13
13
  "System.Management": "10.0.5",
@@ -66,7 +66,7 @@
66
66
  }
67
67
  },
68
68
  "libraries": {
69
- "GxMcp.Gateway/3.6.0": {
69
+ "GxMcp.Gateway/3.6.1": {
70
70
  "type": "project",
71
71
  "serviceable": false,
72
72
  "sha512": ""
Binary file
Binary file
@@ -1,19 +1,19 @@
1
1
  {
2
- "GeneXus": {
3
- "WorkerExecutable": "worker\\\\GxMcp.Worker.exe",
4
- "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18"
2
+ "Environment": {
3
+ "ResolutionPolicy": "strict"
5
4
  },
6
5
  "Server": {
7
- "TerseResponses": true,
8
- "SessionIdleTimeoutMinutes": 10,
9
6
  "McpStdio": true,
7
+ "TerseResponses": true,
10
8
  "HttpPort": 0,
11
- "EmitStructuredContent": false,
12
- "WorkerIdleTimeoutMinutes": 5
9
+ "WorkerIdleTimeoutMinutes": 5,
10
+ "SessionIdleTimeoutMinutes": 10,
11
+ "EmitStructuredContent": false
13
12
  },
14
13
  "ConfigSchemaVersion": 2,
15
- "Environment": {
16
- "ResolutionPolicy": "strict"
14
+ "GeneXus": {
15
+ "InstallationPath": "C:\\Program Files (x86)\\GeneXus\\GeneXus18",
16
+ "WorkerExecutable": "worker\\\\GxMcp.Worker.exe"
17
17
  },
18
18
  "GatewayMode": "stdio-isolated"
19
19
  }
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-release-manifest/1",
3
- "version": "3.6.0",
4
- "sourceCommit": "d884b81d07f8749afbe2a1cc2fdcd4871bb8063f",
3
+ "version": "3.6.1",
4
+ "sourceCommit": "994b57d6eea67e439edda731572152bf13a41508",
5
5
  "sourceCommitPolicy": "exact-tag",
6
- "generatedAtUtc": "2026-09-18T04:20:09.8637010Z",
6
+ "generatedAtUtc": "2026-09-18T14:27:29.5142024Z",
7
7
  "runtime": {
8
8
  "gateway": "net10.0-windows",
9
9
  "worker": "net48-x86",
@@ -15,28 +15,28 @@
15
15
  "2026-07-28"
16
16
  ],
17
17
  "schema": "tool_definitions.json",
18
- "schemaSha256": "2a67065b8a2986fa642a8458db556a0525f786a9cd6d8fc04ef2de3c79f4dc85",
18
+ "schemaSha256": "c9bfe92403a70dd3760b7685bc357491ec35c46c9b5a362dd9717017a3784532",
19
19
  "provenance": "gxmcp-sbom.json",
20
20
  "artifacts": [
21
21
  {
22
22
  "path": "gxmcp-sbom.json",
23
23
  "size": 590,
24
- "sha256": "570adc7ca2acb00bcaea4b6baba22f2cabdb87e925272a42f006d1536014e94a"
24
+ "sha256": "3a437e76cc53aa499706dfd5da80e9ff8bc9d4b0176e47dc5bb1bb29112bdbdd"
25
25
  },
26
26
  {
27
27
  "path": "GxMcp.Gateway.exe",
28
28
  "size": 162304,
29
- "sha256": "235a64c3769f2ac3ba9de14d7eaac6cb9c9a0124bebf2856e6898bf4b8036f71"
29
+ "sha256": "15765fd9430a58eb0ecb8f95ed3a3638be76fdb5c224103aefa0a44398945c61"
30
30
  },
31
31
  {
32
32
  "path": "tool_definitions.json",
33
- "size": 124037,
34
- "sha256": "2a67065b8a2986fa642a8458db556a0525f786a9cd6d8fc04ef2de3c79f4dc85"
33
+ "size": 125411,
34
+ "sha256": "c9bfe92403a70dd3760b7685bc357491ec35c46c9b5a362dd9717017a3784532"
35
35
  },
36
36
  {
37
37
  "path": "worker/GxMcp.Worker.exe",
38
- "size": 3328000,
39
- "sha256": "3f8efd9c36efb4dd25b888d41cb3c015334ee40a7f391e0022199321b616ff6d"
38
+ "size": 3342336,
39
+ "sha256": "f837b7ce71044eaba8b84d9f7ccc258a15e9a75ba9be46b17c6c08670dffdfd6"
40
40
  }
41
41
  ]
42
42
  }
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "schemaVersion": "gxmcp-provenance/1",
3
- "version": "3.6.0",
4
- "sourceCommit": "d884b81d07f8749afbe2a1cc2fdcd4871bb8063f",
3
+ "version": "3.6.1",
4
+ "sourceCommit": "994b57d6eea67e439edda731572152bf13a41508",
5
5
  "sourceCommitPolicy": "exact-tag",
6
6
  "components": [
7
7
  {
8
8
  "name": "genexus-mcp",
9
9
  "lockfile": "package-lock.json",
10
10
  "size": 39914,
11
- "sha256": "b204a7ddcc66a3916bff82b8cdd7185b18e433b522d5a82e2e001b27ee085e94"
11
+ "sha256": "92dd4450cc4a5c899e43ff57d125ebf102621b00181143739d0992b326377913"
12
12
  },
13
13
  {
14
14
  "name": "nexus-ide",
15
15
  "lockfile": "src/nexus-ide/package-lock.json",
16
16
  "size": 274983,
17
- "sha256": "fdac074e28173149db6f0215fadeb7be9078ad7017bf0462d41f1f53a7ba7542"
17
+ "sha256": "ba124f270d7057b81f5d72741faf786eaac85ecfbf9a94ec719a693b7206946d"
18
18
  }
19
19
  ]
20
20
  }
@@ -27,7 +27,7 @@
27
27
  {"name":"genexus_kb","description":"Manage open KBs, session selection, startup config, Knowledge Base creation, and GeneXus environments. create bootstraps a brand new KB via native MSBuild tasks; list/open/close/select/set_session_default/set_persistent_default/set_default operate on WorkerPool and session context; select sets active KB for current session only without mutating config; set_persistent_default explicitly persists startup default to config.json and returns persistedTo; set_default is a legacy persistent default operation; set_startup/get_startup mirror IDE 'Set As Startup Object'; list_environments lists all configured environments; get_environment reads the active environment; set_environment selects an environment.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["list","open","close","select","set_session_default","set_persistent_default","set_default","set_startup","get_startup","list_environments","get_environment","set_environment","create"],"description":"KB pool or startup-selection operation to perform."},"alias":{"type":"string","description":"KB alias. open: auto from path basename if omitted."},"kb":{"type":"string","description":"KB alias for environment actions; required when more than one Worker is open."},"path":{"type":"string","description":"Absolute KB path (required for create and for open if alias not in config)."},"name":{"type":"string","description":"Object name (required for set_startup) or Knowledge Base name (optional for create, defaults to directory name)."},"environment":{"type":"string","description":"Environment name/folder (required for set_environment), e.g. development."},"persist":{"type":"boolean","description":"Persist KB to config.json for create and legacy set_default (default false for create, default true for set_default)."},"dbServer":{"type":"string","description":"create only: SQL Server instance name (default (LocalDB)\\MSSQLLocalDB)."},"dbName":{"type":"string","description":"create only: target database name (default gx_kb_<name>)."},"dbUser":{"type":"string","description":"create only: database user for SQL authentication (optional)."},"dbPassword":{"type":"string","description":"create only: database password for SQL authentication (optional)."},"template":{"type":"string","description":"create only: generator template path or name, e.g. CSharp/csharp.kbtemplate (optional)."},"sdkPath":{"type":"string","description":"create only: explicit GeneXus SDK installation directory (optional)."},"major":{"type":"string","description":"create only: target GeneXus major version, e.g. '16', '17', or '18' (optional)."},"openAfterCreate":{"type":"boolean","description":"create only: automatically open the KB and start a Worker instance after creation (default true)."},"dryRun":{"type":"boolean","description":"create only: preview KB creation plan without creating directories or running MSBuild (default false)."}},"required":["action"],"examples":[{"action":"open","path":"C:\\KBs\\MyKb"},{"action":"create","path":"C:\\KBs\\NewKb","major":"18"},{"action":"select","alias":"MyKb"},{"action":"set_persistent_default","alias":"MyKb"},{"action":"list"},{"action":"list_environments"},{"action":"get_environment"},{"action":"set_environment","environment":"development"}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
28
28
  {"name":"genexus_navigation","description":"View navigation report (IDE Right-click → View Navigation). latest=true reads the most recent report from .gx/navigation-cache; latest=false runs fresh and refreshes that per-KB cache.","inputSchema":{"type":"object","required":["action","name"],"properties":{"action":{"type":"string","enum":["view"],"description":"Navigation report operation to execute."},"name":{"type":"string"},"latest":{"type":"boolean","default":false,"description":"Read the most recent cached navigation when true; when false, run fresh and refresh the per-KB navigation cache."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"view","name":"Customer"},{"action":"view","name":"Customer","latest":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
29
29
  {"name":"genexus_api","description":"Inspect HTTP procedures and native API routes. action=list|describe|routes_inspect|routes_clone|routes_update|snapshot|diff_baseline|export_openapi|import_openapi. API route writes use typed ServiceGroupSource, optimistic versioning, full snapshot, rollback and post-save reread; no lifecycle operation is implicit.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["list","describe","routes_inspect","routes_clone","routes_update","snapshot","diff_baseline","export_openapi","import_openapi"],"description":"API introspection, route-editing, or baseline operation to perform."},"api":{"type":"string","description":"API name (routes_inspect|routes_clone|routes_update)."},"sourcePrefix":{"type":"string","description":"Source method/path prefix, e.g. inbound."},"targetPrefix":{"type":"string","description":"Target method/path prefix, e.g. reverse."},"routes":{"type":"array","items":{"type":"object","required":["sourceMethod","method","route"],"additionalProperties":false,"properties":{"sourceMethod":{"type":"string"},"method":{"type":"string"},"route":{"type":"string","pattern":"^/"},"verb":{"type":"string"}}}},"expectedVersion":{"type":"string","description":"versionToken returned by the preceding dry run or inspection."},"versionToken":{"type":"string","description":"Backward-compatible alias for expectedVersion; pass the token returned by the preceding dry run or inspection."},"dryRun":{"type":"boolean","default":true,"description":"routes_clone/routes_update: preview first; false writes only with expectedVersion or versionToken."},"rollbackOnFailure":{"type":"boolean","default":true,"description":"Restore the complete API snapshot when post-save verification diverges."},"operation":{"type":"string","description":"Operation value carried by the reused request contract, e.g. REVERSE."},"target":{"type":"string","description":"Procedure or API name (action=describe)."},"name":{"type":"string","description":"Baseline name (action=snapshot)."},"baseline":{"type":"string","description":"Baseline name under .gx/api-baselines/ or absolute path (action=diff_baseline)."},"pathPrefix":{"type":"string","description":"Folder prefix filter (action=list/export_openapi)."},"title":{"type":"string","description":"export_openapi: OpenAPI info.title."},"version":{"type":"string","description":"export_openapi: OpenAPI info.version."},"spec":{"type":"string","description":"import_openapi: OpenAPI 3 JSON document."},"content":{"type":"string","description":"Alias of spec for import_openapi."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"list"},{"action":"routes_inspect","api":"OrdersApi"},{"action":"routes_clone","api":"OrdersApi","sourcePrefix":"inbound","targetPrefix":"reverse","operation":"REVERSE","dryRun":true,"rollbackOnFailure":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
30
- {"name":"genexus_apply_pattern","description":"Apply a pattern (e.g. WorkWithPlus) to a parent (IDE Right-click → Apply Pattern). Transaction=family-gen; WebPanel/WebComponent/SDPanel=direct-attach (pass settings.template). mode=diagnose (or dryRun=true) returns findings without mutating. Working on Smart Devices? → resources/read uri=genexus://kb/skills/sd-panel-mobile for Main object semantics. mode=actions manages typed grid actions and Action Groups, persists and re-reads PatternInstance, supports dryRun diff, and never adds security permissions automatically.","inputSchema":{"type":"object","required":["name","pattern"],"properties":{"name":{"type":"string","description":"Target KBObject name."},"pattern":{"type":"string","description":"Pattern key ('WorkWithPlus') or GUID."},"mode":{"type":"string","enum":["apply","diagnose","actions"],"description":"apply (default) mutates; diagnose returns reasons without applying. actions exposes typed WWP action-group editing."},"action":{"type":"string","enum":["list_actions","add_grid_action","update_action","move_action","remove_action"],"description":"mode=actions operation."},"group":{"type":"string","description":"Action group name (e.g. TableActions)."},"actionName":{"type":"string","description":"Name of the action to add, update, or remove."},"newGroup":{"type":"string","description":"move_action: destination action group."},"position":{"type":"integer","minimum":0,"description":"zero-based index among actions in group."},"procedure":{"type":"string","description":"Target Procedure to execute on action click."},"selection":{"type":"string","enum":["current","multiple"],"description":"Execution scope: current (single record) or multiple."},"enabledWhen":{"type":"string","description":"Condition expression for action enablement."},"visibleWhen":{"type":"string","description":"Condition expression for action visibility."},"icon":{"type":"string","description":"Action icon name or class."},"description":{"type":"string","description":"Action tooltip / description text."},"confirmation":{"type":"string","description":"Confirmation message prompt."},"confirmTitle":{"type":"string","description":"Confirmation dialog title."},"settings":{"type":"object","description":"Pattern-instance settings tree."},"reapply":{"type":"boolean","default":false,"description":"Re-run on existing instance."},"validate":{"type":"boolean","default":false,"description":"After apply, build the generated host. Adds validation block (60-180s). Catches binding errors."},"dryRun":{"type":"boolean","default":false,"description":"Alias for mode=diagnose. When true, returns pattern findings without mutating. With mode=actions it previews the typed action diff."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Customer","pattern":"WorkWithPlus"},{"name":"Customer","pattern":"WorkWithPlus","mode":"diagnose"},{"name":"Customer","pattern":"WorkWithPlus","mode":"actions","action":"add_grid_action","group":"Actions","actionName":"Approve","procedure":"ApproveCustomer","dryRun":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
30
+ {"name":"genexus_apply_pattern","description":"Apply a pattern (e.g. WorkWithPlus) to a parent (IDE Right-click → Apply Pattern). Transaction=family-gen; WebPanel/WebComponent/SDPanel=direct-attach (pass settings.template). mode=diagnose (or dryRun=true) returns findings without mutating. Working on Smart Devices? → resources/read uri=genexus://kb/skills/sd-panel-mobile for Main object semantics. mode=actions manages typed grid and form-level actions, persists and re-reads PatternInstance, supports dryRun diff and rollbackOnFailure, and never adds security permissions automatically.","inputSchema":{"type":"object","required":["name","pattern"],"properties":{"name":{"type":"string","description":"Target KBObject name."},"pattern":{"type":"string","description":"Pattern key ('WorkWithPlus') or GUID."},"mode":{"type":"string","enum":["apply","diagnose","actions"],"description":"apply (default) mutates; diagnose returns reasons without applying. actions exposes typed WWP grid, form-level, and action-group editing."},"action":{"type":"string","enum":["list_actions","add_grid_action","add_user_action","update_action","move_action","remove_action"],"description":"mode=actions operation."},"group":{"type":"string","description":"Action group name (e.g. TableActions)."},"containerName":{"type":"string","description":"Form-level action container name, usually TableActions."},"actionName":{"type":"string","description":"Name of the action to add, update, or remove. Form-level actions derive the GeneXus event Do<actionName>."},"caption":{"type":"string","description":"Caption for add_user_action."},"newGroup":{"type":"string","description":"move_action: destination action group."},"position":{"type":"integer","minimum":0,"description":"zero-based index among actions in group."},"procedure":{"type":"string","description":"Target Procedure to execute on action click."},"selection":{"type":"string","enum":["current","multiple"],"description":"Execution scope: current (single record) or multiple."},"enabledWhen":{"type":"string","description":"Condition expression for action enablement."},"visibleWhen":{"type":"string","description":"Condition expression for action visibility."},"icon":{"type":"string","description":"Action icon name or class."},"description":{"type":"string","description":"Action tooltip / description text."},"confirmation":{"type":"string","description":"Confirmation message prompt."},"confirmTitle":{"type":"string","description":"Confirmation dialog title."},"settings":{"type":"object","description":"Pattern-instance settings tree."},"reapply":{"type":"boolean","default":false,"description":"Re-run on existing instance."},"validate":{"type":"boolean","default":false,"description":"apply mode only: optionally build the generated host. mode=actions never invokes Specify, Generate, Build, Rebuild, compilation, or tests."},"dryRun":{"type":"boolean","default":false,"description":"Alias for mode=diagnose. When true, returns pattern findings without mutating. With mode=actions it previews the typed action diff."},"rollbackOnFailure":{"type":"boolean","default":true,"description":"On a failed write or post-save verification, attempt to restore the original PatternInstance and report the rollback result."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"name":"Customer","pattern":"WorkWithPlus"},{"name":"Customer","pattern":"WorkWithPlus","mode":"diagnose"},{"name":"Customer","pattern":"WorkWithPlus","mode":"actions","action":"add_grid_action","group":"Actions","actionName":"Approve","procedure":"ApproveCustomer","dryRun":true},{"name":"WorkWithPlusImpressaoConfiguracao","pattern":"WorkWithPlus","mode":"actions","action":"add_user_action","containerName":"TableActions","actionName":"BaixarConfiguracao","caption":"Baixar Configuração","dryRun":true,"rollbackOnFailure":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
31
31
  {"name":"genexus_edit_and_build","description":"Edit + rebuild callers in one call. Returns edit diff + impact + a build block that may include taskId/pollTarget for lifecycle follow-up. validate=true/validationMode=specify validates the saved object; rollbackOnFailure restores its pre-write snapshot on specification failure.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Target object name."},"part":{"type":"string","description":"Part (Source, Rules, ...)."},"content":{"type":"string","description":"New content. For mode=patch may be {find,replace} object."},"patch":{"description":"Same shape as genexus_edit.patch. Auto-sets mode=patch."},"mode":{"type":"string","enum":["full","patch"],"default":"patch"},"type":{"type":"string","description":"Disambiguates ambiguous names."},"dryRun":{"type":"boolean","default":false},"validate":{"type":"boolean","default":false},"validationMode":{"type":"string","enum":["specify"],"default":"specify"},"rollbackOnFailure":{"type":"boolean","default":true},"buildIncludeCallees":{"type":"string","enum":["none","direct","transitive"],"default":"direct"},"buildPlanCap":{"type":"integer","default":200},"waitForIndex":{"type":"boolean","default":true},"waitTimeoutMs":{"type":"integer","default":30000},"visualVerify":{"type":"boolean","default":false,"description":"Post-edit headless screenshot + pixel-diff vs baseline. See tool-help."}},"required":["name","part"],"examples":[{"name":"Customer","part":"Source","patch":{"find":"oldValue","replace":"newValue"},"validate":true},{"name":"Customer","part":"Rules","mode":"patch","patch":{"find":"error(","replace":"msg("},"dryRun":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},
32
32
  {"name":"genexus_security","description":"Audit KB security. action=audit_gam scans GAM/env props; action=scan_secrets greps Source for credential-shaped literals; action=scan_native drives the native GeneXus Security Scanner (ISecurityScannerService). Returns findings with severity.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["audit_gam","scan_secrets","scan_native"],"description":"audit_gam: scans GAM and environment properties; scan_secrets: greps Source for credentials; scan_native: drives native GeneXus Security Scanner."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"audit_gam"},{"action":"scan_secrets"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
33
33
  {"name":"genexus_doctor","description":"Health check: GX install, KB state, worker, cache age, recent telemetry. Paste output for triage when something feels off. When more than one KB is open, pass kb=<alias> to pick which one to diagnose.","inputSchema":{"type":"object","properties":{"kb":{"type":"string","description":"Alias of the KB to diagnose. Optional; required only when multiple KBs are open (otherwise the single open / default KB is used)."}},"additionalProperties":false,"examples":[{},{"kb":"mykb"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
@@ -48,7 +48,7 @@
48
48
  {"name":"genexus_transfer","description":"Real XPZ export/import over the SDK's IKnowledgeManagerService — dependency-aware, IDE Export/Import parity (NOT the filesystem copy genexus_io/kb_import do). action=export (targets[]+outputFile; includeDependencies=true exports transitive closure) | inspect (explore an .xpz, read-only) | import (apply into KB; dryRun defaults true=preview via ExploreExport; dryRun=false requires confirm=true).","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["export","inspect","import"],"description":"XPZ export, inspection, or import operation to perform."},"targets":{"type":"array","items":{"type":"string"},"description":"export: object names to export."},"outputFile":{"type":"string","description":"export: absolute .xpz output path."},"includeDependencies":{"type":"boolean","description":"export: compute transitive dependency closure (Calls, Tables) and export all referenced objects.","default":false},"file":{"type":"string","description":"inspect/import: absolute .xpz path."},"type":{"type":"string","description":"export: disambiguate object type."},"dryRun":{"type":"boolean","description":"import: true (default) previews; false applies (needs confirm)."},"confirm":{"type":"boolean","description":"import with dryRun=false: required."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"export","targets":["Customer"],"outputFile":"C:\\tmp\\cust.xpz"},{"action":"export","targets":["Customer"],"outputFile":"C:\\tmp\\cust_full.xpz","includeDependencies":true},{"action":"inspect","file":"C:\\tmp\\cust.xpz"}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
49
49
  {"name":"genexus_deploy","description":"Deploy application over the SDK. action=list_targets (read-only, default) enumerates deployment target types (IDeploymentTargetService); action=deploy (destructive, confirm=true) runs IDeploymentService.Deploy(model).","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["list_targets","deploy"],"description":"Deployment-target or deployment execution operation to perform."},"confirm":{"type":"boolean","description":"deploy: required (builds + ships the app)."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"list_targets"},{"action":"deploy","confirm":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
50
50
  {"name":"genexus_generator_reference","description":"Native typed .NET generator references used by GxExternalReference. list and dry-run actions are read-only. add/remove validate a managed assembly when a path is supplied, require optimistic baseVersion for changes, save only the native GeneratorsPart, reread it, and restore the complete generator-property snapshot on verification failure. No lifecycle action runs implicitly.","inputSchema":{"type":"object","additionalProperties":false,"required":["action","environment","generator"],"properties":{"action":{"type":"string","enum":["list","dry_run_add","add","dry_run_remove","remove"],"description":"Typed .NET generator-reference operation to perform."},"environment":{"type":"string","description":"Active GeneXus Environment name; the tool never switches environments."},"generator":{"type":"string","description":"Generator display name, e.g. Default (.NET)."},"assembly":{"type":"string","description":"Assembly file name for add/remove, e.g. SpreadsheetLibrary.dll."},"assemblyPath":{"type":"string","description":"Absolute path or KB-relative path used to validate a managed assembly. Required for add unless found in a standard model/bin location."},"baseVersion":{"type":"string","description":"Optimistic token returned by list or a dry-run. Required for a real state change."},"dryRun":{"type":"boolean","default":false,"description":"Force add/remove to remain read-only."},"rollbackOnFailure":{"type":"boolean","default":true,"description":"Restore and verify the complete prior generator-property snapshot if save/reread diverges."},"kb":{"type":"string","description":"KB alias."}},"examples":[{"action":"list","environment":".Net Environment","generator":"Default (.NET)"},{"action":"dry_run_add","environment":".Net Environment","generator":"Default (.NET)","assembly":"SpreadsheetLibrary.dll","assemblyPath":"C:\\KBs\\Sample\\CSharpModel\\web\\bin\\SpreadsheetLibrary.dll"},{"action":"add","environment":".Net Environment","generator":"Default (.NET)","assembly":"SpreadsheetLibrary.dll","assemblyPath":"C:\\KBs\\Sample\\CSharpModel\\web\\bin\\SpreadsheetLibrary.dll","baseVersion":"sha256:<token>","rollbackOnFailure":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},
51
- {"name":"genexus_wwp","description":"Typed WorkWithPlus action, tab, grid, native table-type, and structural edits with dryRun, optimistic concurrency, exact snapshots, post-save reread, projection verification, and rollback. set_table_type mutates only an existing table type through the native PatternInstance SDK and preserves children, bindings, events, names, classes, defaultType, and childrenOrderedList. No lifecycle operation is implicit. Settings: embedded and separate WWP templates, paged reads and exact table-class dryRun; saves remain blocked.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["list","add_action","update_action","move_action","remove_action","add_tab","move_tab","remove_tab","set_table_type","add_grid_attribute","replace_web_component_with_user_action","settings_templates","settings_read","settings_edit"],"description":"WorkWithPlus action-group, tab, grid-attribute, or explicit native structural operation to perform."},"name":{"type":"string","description":"Transaction, WebPanel, or WorkWithPlus<Object> host."},"group":{"type":"string","description":"Action group name. add_action creates it when absent; update/remove use it as a filter."},"actionName":{"type":"string","description":"Action name."},"attribute":{"type":"string","description":"add_grid_attribute: GeneXus Attribute name."},"caption":{"type":"string","description":"Action caption. For a DropDownComponent pass the GeneXus expression used for the closed button, for example &Context.EmpresaDescricao."},"procedure":{"type":"string","description":"add/update: associated Procedure; existence is validated against the KB."},"selection":{"type":"string","enum":["single","multiple"],"description":"add/update: execution scope for grid actions."},"enabledWhen":{"type":"string","description":"Availability condition stored verbatim; expression semantics are not validated."},"icon":{"type":"string","description":"add/update: button icon."},"description":{"type":"string","description":"add/update: tooltip or description."},"confirm":{"type":"boolean","description":"Confirmation prompt; required to delete unless dryRun."},"buttonClass":{"type":"string","description":"add/update: theme button class."},"position":{"type":"integer","minimum":0,"description":"Zero-based action or tab index."},"toGroup":{"type":"string","description":"move_action: destination group (created when absent)."},"fromGroup":{"type":"string","description":"move_action: source group (optional; searched across groups when omitted)."},"dryRun":{"type":"boolean","description":"Return a typed diff and versionToken without mutation."},"controlName":{"type":"string","description":"Tab ControlName."},"title":{"type":"string","description":"add_tab: tab title."},"children":{"type":"array","description":"add_tab controls; flat children are wrapped in a responsive table.","items":{"$ref":"#/$defs/wwpControl"}},"sourceName":{"type":"string","description":"replace_web_component_with_user_action: existing WebComponent name."},"userActionName":{"type":"string","description":"replace_web_component_with_user_action: resulting UserAction name; defaults to sourceName."},"tablePath":{"type":"string","description":"set_table_type: existing table breadcrumb by names or indexed table segments; replace_web_component_with_user_action: full breadcrumb including the source node, for example TableHeader > TableUserRole > EmpresaSelector."},"tableType":{"type":"string","enum":["Regular","Responsive"],"description":"set_table_type: requested native WWP table type. Only the existing table @type changes; defaultType and all child identity/metadata remain guarded."},"gxobject":{"type":"string","description":"replace_web_component_with_user_action: existing WebComponent Gxobject to retain; it must match the current node."},"controlType":{"type":"string","enum":["DropDownComponent"],"description":"replace_web_component_with_user_action: resulting UserAction ControlType."},"webComponentLoad":{"type":"string","enum":["On Web Panel load","On first click","On every click"],"description":"DropDownComponent load timing."},"trigger":{"type":"string","enum":["Click","Hover"],"description":"DropDownComponent trigger."},"baseVersion":{"type":"string","description":"Optimistic-concurrency token returned by dryRun/read."},"expectedVersion":{"type":"string","description":"Alias for baseVersion."},"versionToken":{"type":"string","description":"Backward-compatible alias for baseVersion."},"kb":{"type":"string","description":"KB alias."},"template":{"description":"Settings catalog path, wwp:<template-guid>, or unique template name.","type":"string"},"limit":{"type":"integer","minimum":0,"description":"Settings nodes per page; offset=0, limit=0 includes full separate-template XML."},"guid":{"type":"string","description":"Pattern Settings object GUID for settings_* actions."},"nodePath":{"description":"Settings node path returned by settings_read.","type":"string"},"entityKey":{"type":"string"},"value":{"type":"string"},"property":{"description":"Exact SDK property name.","type":"string"},"offset":{"minimum":0,"type":"integer"}},"$defs":{"wwpControl":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["variable","userAction","table"]},"name":{"type":"string"},"caption":{"type":"string"},"description":{"type":"string"},"basicType":{"type":"string"},"length":{"type":"integer","minimum":1},"decimals":{"type":"integer","minimum":0},"controlType":{"type":"string"},"controlValues":{"type":"string"},"controlEmptyItem":{"type":"boolean"},"controlEmptyItemText":{"type":"string"},"columns":{"type":"integer","minimum":1},"themeClass":{"type":"string"},"children":{"type":"array","items":{"$ref":"#/$defs/wwpControl"}}},"additionalProperties":false}},"examples":[{"action":"list","name":"SampleOrderWW"},{"action":"add_action","name":"SampleOrderWW","group":"Operations","actionName":"Retry","procedure":"RetrySampleOrder","selection":"multiple","dryRun":true},{"action":"add_tab","name":"SamplePanel","controlName":"Details","title":"Details","children":[{"type":"variable","name":"Status","basicType":"VarChar","length":40},{"type":"userAction","name":"Refresh","caption":"Refresh"}],"dryRun":true},{"action":"add_grid_attribute","name":"SampleOrderWW","attribute":"SampleOrderStatus","caption":"Status","dryRun":true},{"action":"replace_web_component_with_user_action","name":"WorkWithPlusWorkWithPlusMasterPage","sourceName":"EmpresaSelector","userActionName":"EmpresaSelector","tablePath":"TableHeader > TableUserRole > EmpresaSelector","gxobject":"WWP_MasterPageEmpresaSelectorWC","controlType":"DropDownComponent","caption":"&Context.EmpresaDescricao","webComponentLoad":"On every click","trigger":"Click","dryRun":true},{"action":"set_table_type","name":"SamplePanel","tablePath":"TableMain > TableContent > TableLogin","tableType":"Responsive","dryRun":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
51
+ {"name":"genexus_wwp","description":"Typed WorkWithPlus action, form-level action, tab, grid, native table-type, and structural edits with dryRun, optimistic concurrency, exact snapshots, post-save reread, projection verification, and rollback. set_table_type mutates only an existing table type through the native PatternInstance SDK and preserves children, bindings, events, names, classes, defaultType, and childrenOrderedList. No lifecycle operation is implicit. Settings: embedded and separate WWP templates, paged reads and exact table-class dryRun; saves remain blocked.","inputSchema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["list","add_action","add_user_action","update_action","move_action","remove_action","add_tab","move_tab","remove_tab","set_table_type","add_grid_attribute","replace_web_component_with_user_action","settings_templates","settings_read","settings_edit"],"description":"WorkWithPlus action-group, tab, grid-attribute, or explicit native structural operation to perform."},"name":{"type":"string","description":"Transaction, WebPanel, or WorkWithPlus<Object> host."},"group":{"type":"string","description":"Action group name. add_action creates it when absent; update/remove use it as a filter."},"containerName":{"type":"string","description":"add_user_action: form-level action container, usually TableActions."},"actionName":{"type":"string","description":"Action name. add_user_action derives the GeneXus event Do<actionName>."},"attribute":{"type":"string","description":"add_grid_attribute: GeneXus Attribute name."},"caption":{"type":"string","description":"Action caption. For a DropDownComponent pass the GeneXus expression used for the closed button, for example &Context.EmpresaDescricao."},"procedure":{"type":"string","description":"add/update: associated Procedure; existence is validated against the KB."},"selection":{"type":"string","enum":["single","multiple"],"description":"add/update: execution scope for grid actions."},"enabledWhen":{"type":"string","description":"Availability condition stored verbatim; expression semantics are not validated."},"icon":{"type":"string","description":"add/update: button icon."},"description":{"type":"string","description":"add/update: tooltip or description."},"confirm":{"type":"boolean","description":"Confirmation prompt; required to delete unless dryRun."},"buttonClass":{"type":"string","description":"add/update: theme button class."},"position":{"type":"integer","minimum":0,"description":"Zero-based action or tab index."},"toGroup":{"type":"string","description":"move_action: destination group (created when absent)."},"fromGroup":{"type":"string","description":"move_action: source group (optional; searched across groups when omitted)."},"dryRun":{"type":"boolean","description":"Return a typed diff and versionToken without mutation."},"rollbackOnFailure":{"type":"boolean","default":true,"description":"On a failed write or post-save verification, restore the original PatternInstance when possible."},"controlName":{"type":"string","description":"Tab ControlName."},"title":{"type":"string","description":"add_tab: tab title."},"children":{"type":"array","description":"add_tab controls; flat children are wrapped in a responsive table.","items":{"$ref":"#/$defs/wwpControl"}},"sourceName":{"type":"string","description":"replace_web_component_with_user_action: existing WebComponent name."},"userActionName":{"type":"string","description":"replace_web_component_with_user_action: resulting UserAction name; defaults to sourceName."},"tablePath":{"type":"string","description":"set_table_type: existing table breadcrumb by names or indexed table segments; replace_web_component_with_user_action: full breadcrumb including the source node, for example TableHeader > TableUserRole > EmpresaSelector."},"tableType":{"type":"string","enum":["Regular","Responsive"],"description":"set_table_type: requested native WWP table type. Only the existing table @type changes; defaultType and all child identity/metadata remain guarded."},"gxobject":{"type":"string","description":"replace_web_component_with_user_action: existing WebComponent Gxobject to retain; it must match the current node."},"controlType":{"type":"string","enum":["DropDownComponent"],"description":"replace_web_component_with_user_action: resulting UserAction ControlType."},"webComponentLoad":{"type":"string","enum":["On Web Panel load","On first click","On every click"],"description":"DropDownComponent load timing."},"trigger":{"type":"string","enum":["Click","Hover"],"description":"DropDownComponent trigger."},"baseVersion":{"type":"string","description":"Optimistic-concurrency token returned by dryRun/read."},"expectedVersion":{"type":"string","description":"Alias for baseVersion."},"versionToken":{"type":"string","description":"Backward-compatible alias for baseVersion."},"kb":{"type":"string","description":"KB alias."},"template":{"description":"Settings catalog path, wwp:<template-guid>, or unique template name.","type":"string"},"limit":{"type":"integer","minimum":0,"description":"Settings nodes per page; offset=0, limit=0 includes full separate-template XML."},"guid":{"type":"string","description":"Pattern Settings object GUID for settings_* actions."},"nodePath":{"description":"Settings node path returned by settings_read.","type":"string"},"entityKey":{"type":"string"},"value":{"type":"string"},"property":{"description":"Exact SDK property name.","type":"string"},"offset":{"minimum":0,"type":"integer"}},"$defs":{"wwpControl":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["variable","userAction","table"]},"name":{"type":"string"},"caption":{"type":"string"},"description":{"type":"string"},"basicType":{"type":"string"},"length":{"type":"integer","minimum":1},"decimals":{"type":"integer","minimum":0},"controlType":{"type":"string"},"controlValues":{"type":"string"},"controlEmptyItem":{"type":"boolean"},"controlEmptyItemText":{"type":"string"},"columns":{"type":"integer","minimum":1},"themeClass":{"type":"string"},"children":{"type":"array","items":{"$ref":"#/$defs/wwpControl"}}},"additionalProperties":false}},"examples":[{"action":"list","name":"SampleOrderWW"},{"action":"add_action","name":"SampleOrderWW","group":"Operations","actionName":"Retry","procedure":"RetrySampleOrder","selection":"multiple","dryRun":true},{"action":"add_tab","name":"SamplePanel","controlName":"Details","title":"Details","children":[{"type":"variable","name":"Status","basicType":"VarChar","length":40},{"type":"userAction","name":"Refresh","caption":"Refresh"}],"dryRun":true},{"action":"add_grid_attribute","name":"SampleOrderWW","attribute":"SampleOrderStatus","caption":"Status","dryRun":true},{"action":"replace_web_component_with_user_action","name":"WorkWithPlusWorkWithPlusMasterPage","sourceName":"EmpresaSelector","userActionName":"EmpresaSelector","tablePath":"TableHeader > TableUserRole > EmpresaSelector","gxobject":"WWP_MasterPageEmpresaSelectorWC","controlType":"DropDownComponent","caption":"&Context.EmpresaDescricao","webComponentLoad":"On every click","trigger":"Click","dryRun":true},{"action":"set_table_type","name":"SamplePanel","tablePath":"TableMain > TableContent > TableLogin","tableType":"Responsive","dryRun":true},{"action":"add_user_action","name":"WorkWithPlusImpressaoConfiguracao","containerName":"TableActions","actionName":"BaixarConfiguracao","caption":"Baixar Configuração","dryRun":true,"rollbackOnFailure":true}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},
52
52
  {"name":"genexus_kb_diff","description":"Gateway-only filesystem comparison of two KB directories. Requires kbA and kbB aliases or paths; no active KB selection is used.","inputSchema":{"type":"object","required":["kbA","kbB"],"properties":{"kbA":{"type":"string"},"kbB":{"type":"string"}},"examples":[{"kbA":"development","kbB":"staging"}]},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},
53
53
  {"name":"genexus_kb_import","description":"Gateway-only filesystem copy of one object between two KB directories. Requires source and object identity; run lifecycle index afterwards.","inputSchema":{"type":"object","required":["from","name","type"],"properties":{"from":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"to":{"type":"string"}},"examples":[{"from":"C:\\KBs\\source","to":"C:\\KBs\\target","name":"Customer","type":"Transaction"}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},
54
54
  {"name":"genexus_sandbox","description":"Gateway-only filesystem sandbox management; clone or remove a KB directory without SDK dispatch.","inputSchema":{"type":"object","required":["action","name"],"properties":{"action":{"type":"string","enum":["create","remove"],"description":"Sandbox operation to create or remove a KB directory."},"name":{"type":"string"},"from":{"type":"string"},"overwrite":{"type":"boolean"}},"examples":[{"action":"create","name":"probe","from":"C:\\KBs\\base"},{"action":"remove","name":"probe"}]},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},
Binary file