@mcp-abap-adt/adt-clients 3.10.2 → 3.11.3

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
@@ -1,5 +1,7 @@
1
1
  # @mcp-abap-adt/adt-clients
2
2
 
3
+ [![Stand With Ukraine](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/badges/StandWithUkraine.svg)](https://stand-with-ukraine.pp.ua)
4
+
3
5
  TypeScript clients for SAP ABAP Development Tools (ADT).
4
6
 
5
7
  ## Features
@@ -1,11 +1,27 @@
1
1
  /**
2
2
  * AdtClassLegacy - Class handler for legacy SAP systems (BASIS < 7.50)
3
3
  *
4
- * Overrides delete() to use direct DELETE instead of /sap/bc/adt/deletion/ API.
4
+ * On legacy systems, the x-sap-adt-sessiontype: stateful header causes locks
5
+ * to be stored in ABAP session memory instead of the global enqueue server.
6
+ * This means lock + update + unlock MUST happen within the same stateful
7
+ * HTTP session — switching to stateless between lock and update invalidates
8
+ * the lock handle (GitHub #11).
9
+ *
10
+ * Overrides:
11
+ * - update() — keeps lock→check→update→unlock in one stateful session
12
+ * - delete() — uses direct DELETE instead of /sap/bc/adt/deletion/ API
5
13
  */
14
+ import type { IAdtOperationOptions } from '@mcp-abap-adt/interfaces';
6
15
  import { AdtClass } from './AdtClass';
7
16
  import type { IClassConfig, IClassState } from './types';
8
17
  export declare class AdtClassLegacy extends AdtClass {
18
+ /**
19
+ * Update class — legacy override.
20
+ *
21
+ * Keeps lock→check→update→unlock in a single stateful session so the
22
+ * lock handle remains valid (legacy stores locks in ABAP session memory).
23
+ */
24
+ update(config: Partial<IClassConfig>, options?: IAdtOperationOptions): Promise<IClassState>;
9
25
  delete(config: Partial<IClassConfig>): Promise<IClassState>;
10
26
  }
11
27
  //# sourceMappingURL=AdtClassLegacy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdtClassLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClassLegacy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGzD,qBAAa,cAAe,SAAQ,QAAQ;IAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;CA+C3E"}
1
+ {"version":3,"file":"AdtClassLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/class/AdtClassLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAa,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAMhF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAIzD,qBAAa,cAAe,SAAQ,QAAQ;IAC1C;;;;;OAKG;IACY,MAAM,CACnB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,EAC7B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;IA6HR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;CA+C3E"}
@@ -2,16 +2,115 @@
2
2
  /**
3
3
  * AdtClassLegacy - Class handler for legacy SAP systems (BASIS < 7.50)
4
4
  *
5
- * Overrides delete() to use direct DELETE instead of /sap/bc/adt/deletion/ API.
5
+ * On legacy systems, the x-sap-adt-sessiontype: stateful header causes locks
6
+ * to be stored in ABAP session memory instead of the global enqueue server.
7
+ * This means lock + update + unlock MUST happen within the same stateful
8
+ * HTTP session — switching to stateless between lock and update invalidates
9
+ * the lock handle (GitHub #11).
10
+ *
11
+ * Overrides:
12
+ * - update() — keeps lock→check→update→unlock in one stateful session
13
+ * - delete() — uses direct DELETE instead of /sap/bc/adt/deletion/ API
6
14
  */
7
15
  Object.defineProperty(exports, "__esModule", { value: true });
8
16
  exports.AdtClassLegacy = void 0;
9
17
  const internalUtils_1 = require("../../utils/internalUtils");
10
18
  const deleteLegacy_1 = require("../shared/deleteLegacy");
11
19
  const AdtClass_1 = require("./AdtClass");
20
+ const activation_1 = require("./activation");
21
+ const check_1 = require("./check");
12
22
  const lock_1 = require("./lock");
13
23
  const unlock_1 = require("./unlock");
24
+ const update_1 = require("./update");
14
25
  class AdtClassLegacy extends AdtClass_1.AdtClass {
26
+ /**
27
+ * Update class — legacy override.
28
+ *
29
+ * Keeps lock→check→update→unlock in a single stateful session so the
30
+ * lock handle remains valid (legacy stores locks in ABAP session memory).
31
+ */
32
+ async update(config, options) {
33
+ if (!config.className) {
34
+ throw new Error('Class name is required');
35
+ }
36
+ // Low-level mode: caller owns the session
37
+ if (options?.lockHandle) {
38
+ return super.update(config, options);
39
+ }
40
+ let lockHandle;
41
+ const state = { errors: [] };
42
+ try {
43
+ // Enter stateful session for the entire lock→update→unlock chain
44
+ this.connection.setSessionType('stateful');
45
+ // 1. Lock
46
+ this.logger?.info?.('Legacy update step 1: Locking class');
47
+ lockHandle = await (0, lock_1.lockClass)(this.connection, config.className);
48
+ state.lockHandle = lockHandle;
49
+ this.logger?.info?.('Class locked, handle:', lockHandle);
50
+ // 2. Check inactive with source code
51
+ const codeToUpdate = options?.sourceCode || config.sourceCode;
52
+ if (codeToUpdate) {
53
+ this.logger?.info?.('Legacy update step 2: Checking inactive version');
54
+ state.checkResult = await (0, check_1.checkClass)(this.connection, config.className, 'inactive', codeToUpdate, this.contentTypes?.sourceArtifactContentType());
55
+ this.logger?.info?.('Check passed');
56
+ }
57
+ // 3. Update
58
+ if (codeToUpdate && lockHandle) {
59
+ this.logger?.info?.('Legacy update step 3: Updating class');
60
+ state.updateResult = await (0, update_1.updateClass)(this.connection, config.className, codeToUpdate, lockHandle, config.transportRequest, this.contentTypes?.sourceArtifactContentType());
61
+ this.logger?.info?.('Class updated');
62
+ }
63
+ // 4. Unlock (still within the same stateful session)
64
+ if (lockHandle) {
65
+ this.logger?.info?.('Legacy update step 4: Unlocking class');
66
+ state.unlockResult = await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
67
+ lockHandle = undefined;
68
+ this.logger?.info?.('Class unlocked');
69
+ }
70
+ }
71
+ catch (error) {
72
+ // Cleanup: try to unlock if still locked (within same session)
73
+ if (lockHandle) {
74
+ try {
75
+ this.logger?.warn?.('Unlocking class during error cleanup');
76
+ await (0, unlock_1.unlockClass)(this.connection, config.className, lockHandle);
77
+ }
78
+ catch (unlockError) {
79
+ this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
80
+ }
81
+ }
82
+ throw error;
83
+ }
84
+ finally {
85
+ // Always return to stateless after the chain
86
+ this.connection.setSessionType('stateless');
87
+ }
88
+ // Post-lock operations (stateless is fine)
89
+ // 5. Final check
90
+ this.logger?.info?.('Legacy update step 5: Final check');
91
+ state.checkResult = await (0, check_1.checkClass)(this.connection, config.className, 'inactive');
92
+ this.logger?.info?.('Final check passed');
93
+ // 6. Activate (if requested)
94
+ if (options?.activateOnUpdate) {
95
+ this.logger?.info?.('Legacy update step 6: Activating class');
96
+ const activateResult = await (0, activation_1.activateClass)(this.connection, config.className);
97
+ state.activateResult = activateResult;
98
+ this.logger?.info?.('Class activated, status:', activateResult.status);
99
+ // Read with long polling to ensure object is ready after activation
100
+ this.logger?.info?.('Read (wait for object ready after activation)');
101
+ try {
102
+ const readState = await this.read({ className: config.className }, 'active', { withLongPolling: true });
103
+ if (readState) {
104
+ state.readResult = readState.readResult;
105
+ }
106
+ this.logger?.info?.('Object is ready after activation');
107
+ }
108
+ catch (readError) {
109
+ this.logger?.warn?.('Read with long polling failed after activation:', (0, internalUtils_1.safeErrorMessage)(readError));
110
+ }
111
+ }
112
+ return state;
113
+ }
15
114
  async delete(config) {
16
115
  if (!config.className) {
17
116
  throw new Error('Class name is required');
@@ -13,5 +13,5 @@ import type { IAdtResponse as AxiosResponse, IAbapConnection, ILogger } from '@m
13
13
  *
14
14
  * Note: When xmlContent is provided, it should be the same XML that will be sent in PUT request.
15
15
  */
16
- export declare function checkDomainSyntax(connection: IAbapConnection, domainName: string, version: 'active' | 'inactive', xmlContent?: string, logger?: ILogger): Promise<AxiosResponse>;
16
+ export declare function checkDomainSyntax(connection: IAbapConnection, domainName: string, version: 'active' | 'inactive', xmlContent?: string, _logger?: ILogger): Promise<AxiosResponse>;
17
17
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/core/domain/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AASlC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,aAAa,CAAC,CAuDxB"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/core/domain/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,OAAO,EACR,MAAM,0BAA0B,CAAC;AASlC;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,QAAQ,GAAG,UAAU,EAC9B,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,CAAC,CAuDxB"}
@@ -19,7 +19,7 @@ const timeouts_1 = require("../../utils/timeouts");
19
19
  *
20
20
  * Note: When xmlContent is provided, it should be the same XML that will be sent in PUT request.
21
21
  */
22
- async function checkDomainSyntax(connection, domainName, version, xmlContent, logger) {
22
+ async function checkDomainSyntax(connection, domainName, version, xmlContent, _logger) {
23
23
  let response;
24
24
  if (xmlContent) {
25
25
  // Check with XML content (for unsaved changes or new content validation)
@@ -1 +1 @@
1
- {"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA0BvE;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAiGzB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IA0BrC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,CAAC;IAoCzB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,aAAa,CAAC;IAkCzB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAwKzB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BrE;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAkBzB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;CAiB1B"}
1
+ {"version":3,"file":"AdtPackage.d.ts","sourceRoot":"","sources":["../../../src/core/package/AdtPackage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7D,qBAAa,UAAW,YAAW,UAAU,CAAC,cAAc,EAAE,aAAa,CAAC;IAC1E,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC;IACpD,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA2BvE;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IA6FzB;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;IA0BrC;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,aAAa,CAAC;IAoCzB;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,aAAa,CAAC;IAkCzB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC;IAsLzB;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IA6BrE;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAMxE;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,CAAC;IAkBzB;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAW5D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;CAiB1B"}
@@ -62,6 +62,7 @@ class AdtPackage {
62
62
  transport_request: config.transportRequest,
63
63
  application_component: config.applicationComponent,
64
64
  responsible: config.responsible,
65
+ record_changes: config.recordChanges ?? false,
65
66
  });
66
67
  return {
67
68
  validationResponse: response,
@@ -99,6 +100,7 @@ class AdtPackage {
99
100
  transport_request: config.transportRequest,
100
101
  application_component: config.applicationComponent,
101
102
  responsible: config.responsible,
103
+ record_changes: config.recordChanges ?? false,
102
104
  });
103
105
  this.logger?.info?.('Validation passed');
104
106
  // 2. Create (no stateful needed)
@@ -113,8 +115,8 @@ class AdtPackage {
113
115
  transport_request: config.transportRequest,
114
116
  application_component: config.applicationComponent,
115
117
  responsible: config.responsible ?? this.systemContext.responsible,
116
- masterSystem: this.systemContext.masterSystem,
117
- record_changes: config.recordChanges,
118
+ master_system: this.systemContext.masterSystem,
119
+ record_changes: config.recordChanges ?? false,
118
120
  });
119
121
  this.logger?.info?.('Package created');
120
122
  // 2.5. Read with long polling (wait for object to be ready)
@@ -130,11 +132,7 @@ class AdtPackage {
130
132
  // Continue anyway - check might still work
131
133
  }
132
134
  objectCreated = true;
133
- // 3. Check after create (no stateful needed)
134
- this.logger?.info?.('Step 3: Checking created package');
135
- await (0, check_1.checkPackage)(this.connection, config.packageName, 'inactive');
136
- this.logger?.info?.('Check after create passed');
137
- // Packages are containers — no source code, no activation, no need to read back
135
+ // Packages are containers no source code, no activation, no syntax check needed
138
136
  return { errors: [] };
139
137
  }
140
138
  catch (error) {
@@ -273,7 +271,7 @@ class AdtPackage {
273
271
  description: config.description,
274
272
  package_type: config.packageType,
275
273
  responsible: config.responsible,
276
- record_changes: config.recordChanges,
274
+ record_changes: config.recordChanges ?? false,
277
275
  }, options.lockHandle);
278
276
  this.logger?.info?.('Package updated (low-level)');
279
277
  return {
@@ -281,14 +279,28 @@ class AdtPackage {
281
279
  errors: [],
282
280
  };
283
281
  }
282
+ // TODO: Package update via RFC (SADT_REST_RFC_ENDPOINT) fails with HTTP 400
283
+ // "Package is already locked" on PUT even though LOCK/UNLOCK succeed.
284
+ // Root cause: PAK framework locks are session-scoped. Each call to
285
+ // SADT_REST_RFC_ENDPOINT runs in a new internal ABAP context, so the
286
+ // PUT cannot access the PAK lock created by the LOCK call.
287
+ // DDIC objects are unaffected because their locks live in the DDIC buffer
288
+ // (accessible by lockHandle from any context).
289
+ // This is non-critical for release — HTTP is the primary transport for
290
+ // modern on-premise systems. RFC is used for legacy (BASIS < 7.50) where
291
+ // package CRUD is not supported anyway.
292
+ // Reference: docs/development/RFC_TESTING.md
284
293
  let lockHandle;
294
+ let lockCorrNr;
285
295
  try {
286
- // 1. Lock (update always starts with lock, stateful ONLY before lock)
296
+ // 1. Lock stateful mode stays active until after unlock
287
297
  this.logger?.info?.('Step 1: Locking package');
288
298
  this.connection.setSessionType('stateful');
289
- lockHandle = await (0, lock_1.lockPackage)(this.connection, config.packageName);
299
+ const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
300
+ lockHandle = lockResult.lockHandle;
301
+ lockCorrNr = lockResult.corrNr;
290
302
  this.connection.setSessionType('stateless');
291
- this.logger?.info?.('Package locked, handle:', lockHandle);
303
+ this.logger?.info?.(`Package locked, handle: ${lockHandle}, corrNr: ${lockCorrNr}`);
292
304
  // 2. Check inactive with XML for update (if provided)
293
305
  const xmlToCheck = options?.xmlContent;
294
306
  if (xmlToCheck) {
@@ -308,9 +320,10 @@ class AdtPackage {
308
320
  package_type: config.packageType,
309
321
  software_component: config.softwareComponent,
310
322
  transport_layer: config.transportLayer,
311
- transport_request: config.transportRequest,
323
+ transport_request: config.transportRequest || lockCorrNr,
312
324
  application_component: config.applicationComponent,
313
325
  responsible: config.responsible ?? this.systemContext.responsible,
326
+ master_system: config.masterSystem ?? this.systemContext.masterSystem,
314
327
  record_changes: config.recordChanges,
315
328
  }, lockHandle);
316
329
  this.logger?.info?.('Package updated');
@@ -327,7 +340,7 @@ class AdtPackage {
327
340
  // Continue anyway - unlock might still work
328
341
  }
329
342
  }
330
- // 4. Unlock (obligatory stateless after unlock)
343
+ // 4. Unlock set stateful before unlock, stateless after (standard pattern)
331
344
  if (lockHandle) {
332
345
  this.logger?.info?.('Step 4: Unlocking package');
333
346
  this.connection.setSessionType('stateful');
@@ -336,11 +349,7 @@ class AdtPackage {
336
349
  lockHandle = undefined;
337
350
  this.logger?.info?.('Package unlocked');
338
351
  }
339
- // 5. Final check (no stateful needed)
340
- this.logger?.info?.('Step 5: Final check');
341
- await (0, check_1.checkPackage)(this.connection, config.packageName, 'inactive');
342
- this.logger?.info?.('Final check passed');
343
- // Note: Packages don't have activate operation
352
+ // Note: Packages have no source code — no check or activate needed
344
353
  // Read and return result (no stateful needed)
345
354
  const readResponse = await (0, read_1.getPackage)(this.connection, config.packageName);
346
355
  return {
@@ -440,9 +449,9 @@ class AdtPackage {
440
449
  throw new Error('Package name is required');
441
450
  }
442
451
  this.connection.setSessionType('stateful');
443
- const lockHandle = await (0, lock_1.lockPackage)(this.connection, config.packageName);
452
+ const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
444
453
  this.connection.setSessionType('stateless');
445
- return lockHandle;
454
+ return lockResult.lockHandle;
446
455
  }
447
456
  /**
448
457
  * Unlock package
@@ -24,7 +24,7 @@ async function createPackage(connection, params) {
24
24
  // Description is limited to 60 characters in SAP ADT
25
25
  const description = escapeXml((0, internalUtils_1.limitDescription)(params.description || params.package_name));
26
26
  const packageType = params.package_type || 'development';
27
- const masterSystem = params.masterSystem;
27
+ const masterSystem = params.master_system;
28
28
  const responsibleUser = params.responsible || '';
29
29
  // Software component is required for package creation
30
30
  if (!params.software_component) {
@@ -1,18 +1,14 @@
1
1
  /**
2
2
  * Package delete operations
3
3
  */
4
- import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
5
- export interface DeletePackageParams {
6
- package_name: string;
7
- transport_request?: string;
8
- }
4
+ import type { IAdtResponse as AxiosResponse, IAbapConnection, IDeletePackageParams } from '@mcp-abap-adt/interfaces';
9
5
  /**
10
6
  * Check if package can be deleted (deletion check)
11
7
  * Returns response with isDeletable flag
12
8
  *
13
9
  * NOTE: Uses stateful session headers automatically if connection has stateful mode enabled
14
10
  */
15
- export declare function checkPackageDeletion(connection: IAbapConnection, params: DeletePackageParams): Promise<AxiosResponse>;
11
+ export declare function checkPackageDeletion(connection: IAbapConnection, params: IDeletePackageParams): Promise<AxiosResponse>;
16
12
  /**
17
13
  * Parse deletion check response to get isDeletable flag
18
14
  */
@@ -24,5 +20,5 @@ export declare function parsePackageDeletionCheck(response: AxiosResponse): {
24
20
  * Delete ABAP package using ADT deletion API
25
21
  * For packages, empty transportNumber tag may be required
26
22
  */
27
- export declare function deletePackage(connection: IAbapConnection, params: DeletePackageParams): Promise<AxiosResponse>;
23
+ export declare function deletePackage(connection: IAbapConnection, params: IDeletePackageParams): Promise<AxiosResponse>;
28
24
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/package/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAE7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAWlC,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CA+BA;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,aAAa,CAAC,CAwFxB"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/package/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAE7B,eAAe,EACf,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAWlC;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAClE,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CA+BA;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAwFxB"}
@@ -9,5 +9,9 @@ import type { IAbapConnection } from '@mcp-abap-adt/interfaces';
9
9
  * NOTE: Caller must enable stateful session mode via connection.setSessionType("stateful")
10
10
  * before calling this function
11
11
  */
12
- export declare function lockPackage(connection: IAbapConnection, packageName: string): Promise<string>;
12
+ export interface IPackageLockResult {
13
+ lockHandle: string;
14
+ corrNr?: string;
15
+ }
16
+ export declare function lockPackage(connection: IAbapConnection, packageName: string): Promise<IPackageLockResult>;
13
17
  //# sourceMappingURL=lock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/core/package/lock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAMhE;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/core/package/lock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAMhE;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAgC7B"}
@@ -8,15 +8,8 @@ const fast_xml_parser_1 = require("fast-xml-parser");
8
8
  const contentTypes_1 = require("../../constants/contentTypes");
9
9
  const internalUtils_1 = require("../../utils/internalUtils");
10
10
  const timeouts_1 = require("../../utils/timeouts");
11
- /**
12
- * Lock package for modification
13
- * Returns lock handle that must be used in subsequent requests
14
- *
15
- * NOTE: Caller must enable stateful session mode via connection.setSessionType("stateful")
16
- * before calling this function
17
- */
18
11
  async function lockPackage(connection, packageName) {
19
- const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName)}?_action=LOCK&accessMode=MODIFY`;
12
+ const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName.toLowerCase())}?_action=LOCK&accessMode=MODIFY`;
20
13
  const headers = {
21
14
  Accept: contentTypes_1.ACCEPT_LOCK,
22
15
  };
@@ -33,9 +26,11 @@ async function lockPackage(connection, packageName) {
33
26
  attributeNamePrefix: '',
34
27
  });
35
28
  const result = parser.parse(response.data);
36
- const lockHandle = result?.['asx:abap']?.['asx:values']?.DATA?.LOCK_HANDLE;
29
+ const data = result?.['asx:abap']?.['asx:values']?.DATA;
30
+ const lockHandle = data?.LOCK_HANDLE;
37
31
  if (!lockHandle) {
38
32
  throw new Error('Failed to obtain lock handle from SAP. Package may be locked by another user.');
39
33
  }
40
- return lockHandle;
34
+ const corrNr = data?.CORR_NUMBER || undefined;
35
+ return { lockHandle, corrNr };
41
36
  }
@@ -2,19 +2,7 @@
2
2
  * Package module type definitions
3
3
  */
4
4
  import type { IAdtObjectState } from '@mcp-abap-adt/interfaces';
5
- export interface ICreatePackageParams {
6
- package_name: string;
7
- description?: string;
8
- super_package: string;
9
- package_type?: string;
10
- software_component?: string;
11
- transport_layer?: string;
12
- transport_request?: string;
13
- application_component?: string;
14
- responsible?: string;
15
- masterSystem?: string;
16
- record_changes?: boolean;
17
- }
5
+ export type { ICreatePackageParams, IDeletePackageParams, IReadPackageParams, IUpdatePackageParams, } from '@mcp-abap-adt/interfaces';
18
6
  export interface IPackageConfig {
19
7
  packageName: string;
20
8
  superPackage?: string;
@@ -26,6 +14,7 @@ export interface IPackageConfig {
26
14
  transportRequest?: string;
27
15
  applicationComponent?: string;
28
16
  responsible?: string;
17
+ masterSystem?: string;
29
18
  recordChanges?: boolean;
30
19
  onLock?: (lockHandle: string) => void;
31
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/package/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAKD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;CAAG"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/package/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,YAAY,EACV,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAKlC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;CAAG"}
@@ -14,7 +14,7 @@ const timeouts_1 = require("../../utils/timeouts");
14
14
  * after calling this function
15
15
  */
16
16
  async function unlockPackage(connection, packageName, lockHandle) {
17
- const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName)}?_action=UNLOCK&lockHandle=${encodeURIComponent(lockHandle)}`;
17
+ const url = `/sap/bc/adt/packages/${(0, internalUtils_1.encodeSapObjectName)(packageName.toLowerCase())}?_action=UNLOCK&lockHandle=${encodeURIComponent(lockHandle)}`;
18
18
  return await connection.makeAdtRequest({
19
19
  url,
20
20
  method: 'POST',
@@ -5,17 +5,13 @@
5
5
  * This preserves all SAP-managed fields (abapLanguageVersion, etc.)
6
6
  * that would be lost if XML were built from scratch.
7
7
  */
8
- import type { IAdtResponse as AxiosResponse, IAbapConnection } from '@mcp-abap-adt/interfaces';
9
- import type { ICreatePackageParams } from './types';
10
- export interface UpdatePackageParams extends ICreatePackageParams {
11
- package_name: string;
12
- }
8
+ import type { IAdtResponse as AxiosResponse, IAbapConnection, IUpdatePackageParams } from '@mcp-abap-adt/interfaces';
13
9
  /**
14
10
  * Update package with new data (read-modify-write pattern)
15
11
  *
16
12
  * NOTE: Requires stateful session mode enabled via connection.setSessionType("stateful")
17
13
  */
18
- export declare function updatePackage(connection: IAbapConnection, params: UpdatePackageParams, lockHandle: string): Promise<AxiosResponse>;
14
+ export declare function updatePackage(connection: IAbapConnection, params: IUpdatePackageParams, lockHandle: string): Promise<AxiosResponse>;
19
15
  /**
20
16
  * Update only package description (safe update - only modifiable field)
21
17
  *
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/package/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAalC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAwDpD,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,mBAAmB,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAqCxB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/package/update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAyElC;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC,CAuCxB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,CAkBxB"}
@@ -26,6 +26,8 @@ function patchPackageXml(currentXml, args) {
26
26
  }
27
27
  // Responsible
28
28
  xml = (0, xmlPatch_1.patchIf)(xml, args.responsible, (x, val) => (0, xmlPatch_1.patchXmlAttribute)(x, 'adtcore:responsible', val));
29
+ // Master system
30
+ xml = (0, xmlPatch_1.patchIf)(xml, args.master_system, (x, val) => (0, xmlPatch_1.patchXmlAttribute)(x, 'adtcore:masterSystem', val));
29
31
  // Package type (pak:packageType attribute on pak:attributes element)
30
32
  xml = (0, xmlPatch_1.patchIf)(xml, args.package_type, (x, val) => (0, xmlPatch_1.patchXmlElementAttribute)(x, 'pak:attributes', 'pak:packageType', val));
31
33
  // Record changes
@@ -49,7 +51,7 @@ async function updatePackage(connection, params, lockHandle) {
49
51
  if (!params.package_name) {
50
52
  throw new Error('package_name is required');
51
53
  }
52
- const packageNameEncoded = (0, internalUtils_1.encodeSapObjectName)(params.package_name);
54
+ const packageNameEncoded = (0, internalUtils_1.encodeSapObjectName)(params.package_name.toLowerCase());
53
55
  // 1. GET current XML
54
56
  const currentResponse = await connection.makeAdtRequest({
55
57
  url: `/sap/bc/adt/packages/${packageNameEncoded}`,
@@ -93,5 +95,6 @@ async function updatePackageDescription(connection, packageName, description, lo
93
95
  package_name: packageName,
94
96
  description: (0, internalUtils_1.limitDescription)(description),
95
97
  super_package: superPackage || '',
98
+ record_changes: false,
96
99
  }, lockHandle);
97
100
  }
@@ -8,11 +8,10 @@
8
8
  * Key difference: Legacy systems return results synchronously (aunit:runResult)
9
9
  * from the POST to /testruns — no run ID, no async polling needed.
10
10
  */
11
- import type { IAdtResponse as AxiosResponse, IAbapConnection, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
11
+ import type { IAdtResponse as AxiosResponse, IAdtOperationOptions } from '@mcp-abap-adt/interfaces';
12
12
  import { AdtUnitTest } from './AdtUnitTest';
13
13
  import type { IClassUnitTestDefinition, IClassUnitTestRunOptions, IUnitTestConfig, IUnitTestState } from './types';
14
14
  export declare class AdtUnitTestLegacy extends AdtUnitTest {
15
- constructor(connection: IAbapConnection, logger?: ILogger);
16
15
  /**
17
16
  * Create unit test run using legacy endpoint.
18
17
  * Legacy returns results synchronously — no run ID or polling needed.
@@ -1 +1 @@
1
- {"version":3,"file":"AdtUnitTestLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/unitTest/AdtUnitTestLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,eAAe,EACf,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AAKjB,qBAAa,iBAAkB,SAAQ,WAAW;gBACpC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAIzD;;;OAGG;IACY,MAAM,CACnB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAkC1B;;OAEG;IACY,GAAG,CAChB,KAAK,EAAE,wBAAwB,EAAE,EACjC,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,GAAE,OAAc,GAC/B,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,GACzE,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,IAAI,CACjB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,QAAQ,GAAE,QAAQ,GAAG,UAAqB,GACzC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;CAWvC"}
1
+ {"version":3,"file":"AdtUnitTestLegacy.d.ts","sourceRoot":"","sources":["../../../src/core/unitTest/AdtUnitTestLegacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,YAAY,IAAI,aAAa,EAC7B,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAC;AAKjB,qBAAa,iBAAkB,SAAQ,WAAW;IAChD;;;OAGG;IACY,MAAM,CACnB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAkC1B;;OAEG;IACY,GAAG,CAChB,KAAK,EAAE,wBAAwB,EAAE,EACjC,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,MAAM,CAAC;IAKlB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,GAAE,OAAc,GAC/B,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,SAAS,CACtB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;KAAE,GACzE,OAAO,CAAC,aAAa,CAAC;IASzB;;;OAGG;IACY,IAAI,CACjB,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EACjC,QAAQ,GAAE,QAAQ,GAAG,UAAqB,GACzC,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;CAWvC"}
@@ -17,9 +17,6 @@ const runLegacy_1 = require("./runLegacy");
17
17
  /** Synthetic run ID for legacy synchronous results */
18
18
  const LEGACY_SYNC_RUN_ID = 'legacy-sync';
19
19
  class AdtUnitTestLegacy extends AdtUnitTest_1.AdtUnitTest {
20
- constructor(connection, logger) {
21
- super(connection, logger);
22
- }
23
20
  /**
24
21
  * Create unit test run using legacy endpoint.
25
22
  * Legacy returns results synchronously — no run ID or polling needed.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/adt-clients",
3
- "version": "3.10.2",
3
+ "version": "3.11.3",
4
4
  "description": "ADT clients for SAP ABAP systems - AdtClient and AdtRuntimeClient",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -66,7 +66,7 @@
66
66
  "node": ">=18.0.0"
67
67
  },
68
68
  "dependencies": {
69
- "@mcp-abap-adt/interfaces": "^3.1.0",
69
+ "@mcp-abap-adt/interfaces": "^5.0.0",
70
70
  "@mcp-abap-adt/logger": "^0.1.3",
71
71
  "axios": "^1.13.6",
72
72
  "fast-xml-parser": "^5.4.1",
@@ -77,7 +77,7 @@
77
77
  },
78
78
  "devDependencies": {
79
79
  "@biomejs/biome": "^2.4.4",
80
- "@mcp-abap-adt/connection": "^1.5.1",
80
+ "@mcp-abap-adt/connection": "^1.5.2",
81
81
  "@types/jest": "^30.0.0",
82
82
  "@types/node": "^25.3.3",
83
83
  "dotenv": "^17.3.1",