@mcp-abap-adt/adt-clients 7.3.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/clients/AdtClient.d.ts +32 -0
  2. package/dist/clients/AdtClient.d.ts.map +1 -1
  3. package/dist/clients/AdtClient.js +75 -30
  4. package/dist/core/accessControl/AdtAccessControl.d.ts +3 -1
  5. package/dist/core/accessControl/AdtAccessControl.d.ts.map +1 -1
  6. package/dist/core/accessControl/AdtAccessControl.js +9 -1
  7. package/dist/core/appendStructure/AdtAppendStructure.d.ts +3 -1
  8. package/dist/core/appendStructure/AdtAppendStructure.d.ts.map +1 -1
  9. package/dist/core/appendStructure/AdtAppendStructure.js +11 -2
  10. package/dist/core/authorizationField/AdtAuthorizationField.d.ts +3 -1
  11. package/dist/core/authorizationField/AdtAuthorizationField.d.ts.map +1 -1
  12. package/dist/core/authorizationField/AdtAuthorizationField.js +9 -1
  13. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts +3 -1
  14. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts.map +1 -1
  15. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.js +9 -1
  16. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts +2 -1
  17. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts.map +1 -1
  18. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.js +4 -2
  19. package/dist/core/class/AdtClass.d.ts +3 -1
  20. package/dist/core/class/AdtClass.d.ts.map +1 -1
  21. package/dist/core/class/AdtClass.js +14 -2
  22. package/dist/core/dataElement/AdtDataElement.d.ts +3 -1
  23. package/dist/core/dataElement/AdtDataElement.d.ts.map +1 -1
  24. package/dist/core/dataElement/AdtDataElement.js +9 -1
  25. package/dist/core/ddl/AdtDdl.d.ts +3 -1
  26. package/dist/core/ddl/AdtDdl.d.ts.map +1 -1
  27. package/dist/core/ddl/AdtDdl.js +9 -1
  28. package/dist/core/domain/AdtDomain.d.ts +3 -1
  29. package/dist/core/domain/AdtDomain.d.ts.map +1 -1
  30. package/dist/core/domain/AdtDomain.js +11 -1
  31. package/dist/core/enhancement/AdtEnhancement.d.ts +12 -1
  32. package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
  33. package/dist/core/enhancement/AdtEnhancement.js +28 -1
  34. package/dist/core/featureToggle/AdtFeatureToggle.d.ts +3 -1
  35. package/dist/core/featureToggle/AdtFeatureToggle.d.ts.map +1 -1
  36. package/dist/core/featureToggle/AdtFeatureToggle.js +12 -1
  37. package/dist/core/functionGroup/AdtFunctionGroup.d.ts +3 -1
  38. package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
  39. package/dist/core/functionGroup/AdtFunctionGroup.js +9 -1
  40. package/dist/core/functionInclude/AdtFunctionInclude.d.ts +9 -1
  41. package/dist/core/functionInclude/AdtFunctionInclude.d.ts.map +1 -1
  42. package/dist/core/functionInclude/AdtFunctionInclude.js +28 -1
  43. package/dist/core/functionModule/AdtFunctionModule.d.ts +9 -1
  44. package/dist/core/functionModule/AdtFunctionModule.d.ts.map +1 -1
  45. package/dist/core/functionModule/AdtFunctionModule.js +25 -1
  46. package/dist/core/interface/AdtInterface.d.ts +3 -1
  47. package/dist/core/interface/AdtInterface.d.ts.map +1 -1
  48. package/dist/core/interface/AdtInterface.js +9 -1
  49. package/dist/core/messageClass/AdtMessageClass.d.ts +5 -4
  50. package/dist/core/messageClass/AdtMessageClass.d.ts.map +1 -1
  51. package/dist/core/messageClass/AdtMessageClass.js +16 -8
  52. package/dist/core/messageClass/AdtMessageClassMessage.d.ts +2 -1
  53. package/dist/core/messageClass/AdtMessageClassMessage.d.ts.map +1 -1
  54. package/dist/core/messageClass/AdtMessageClassMessage.js +10 -3
  55. package/dist/core/messageClass/create.d.ts +3 -5
  56. package/dist/core/messageClass/create.d.ts.map +1 -1
  57. package/dist/core/messageClass/create.js +7 -6
  58. package/dist/core/messageClass/delete.d.ts +3 -3
  59. package/dist/core/messageClass/delete.d.ts.map +1 -1
  60. package/dist/core/messageClass/delete.js +7 -4
  61. package/dist/core/messageClass/types.d.ts +2 -2
  62. package/dist/core/messageClass/types.d.ts.map +1 -1
  63. package/dist/core/messageClass/update.d.ts +1 -1
  64. package/dist/core/messageClass/update.d.ts.map +1 -1
  65. package/dist/core/messageClass/update.js +5 -2
  66. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts +3 -1
  67. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts.map +1 -1
  68. package/dist/core/metadataExtension/AdtMetadataExtension.js +9 -1
  69. package/dist/core/package/AdtPackage.d.ts +3 -1
  70. package/dist/core/package/AdtPackage.d.ts.map +1 -1
  71. package/dist/core/package/AdtPackage.js +9 -1
  72. package/dist/core/program/AdtProgram.d.ts +3 -1
  73. package/dist/core/program/AdtProgram.d.ts.map +1 -1
  74. package/dist/core/program/AdtProgram.js +9 -1
  75. package/dist/core/scalarFunction/AdtScalarFunction.d.ts +3 -1
  76. package/dist/core/scalarFunction/AdtScalarFunction.d.ts.map +1 -1
  77. package/dist/core/scalarFunction/AdtScalarFunction.js +11 -2
  78. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts +3 -1
  79. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts.map +1 -1
  80. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.js +14 -2
  81. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts +3 -1
  82. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
  83. package/dist/core/serviceDefinition/AdtServiceDefinition.js +9 -1
  84. package/dist/core/shared/LockRegistry.d.ts +77 -0
  85. package/dist/core/shared/LockRegistry.d.ts.map +1 -0
  86. package/dist/core/shared/LockRegistry.js +91 -0
  87. package/dist/core/structure/AdtStructure.d.ts +3 -1
  88. package/dist/core/structure/AdtStructure.d.ts.map +1 -1
  89. package/dist/core/structure/AdtStructure.js +9 -1
  90. package/dist/core/table/AdtTable.d.ts +3 -1
  91. package/dist/core/table/AdtTable.d.ts.map +1 -1
  92. package/dist/core/table/AdtTable.js +9 -1
  93. package/dist/core/tabletype/AdtDdicTableType.d.ts +3 -1
  94. package/dist/core/tabletype/AdtDdicTableType.d.ts.map +1 -1
  95. package/dist/core/tabletype/AdtDdicTableType.js +9 -1
  96. package/dist/core/transformation/AdtTransformation.d.ts +3 -1
  97. package/dist/core/transformation/AdtTransformation.d.ts.map +1 -1
  98. package/dist/core/transformation/AdtTransformation.js +9 -1
  99. package/package.json +1 -1
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtInterface = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activation_1 = require("./activation");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -36,12 +37,14 @@ class AdtInterface {
36
37
  logger;
37
38
  systemContext;
38
39
  contentTypes;
40
+ lockTracker;
39
41
  objectType = 'Interface';
40
- constructor(connection, logger, systemContext, contentTypes) {
42
+ constructor(connection, logger, systemContext, contentTypes, lockRegistry) {
41
43
  this.connection = connection;
42
44
  this.logger = logger;
43
45
  this.systemContext = systemContext ?? {};
44
46
  this.contentTypes = contentTypes;
47
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (interfaceName, lockHandle) => (0, unlock_1.unlockInterface)(this.connection, interfaceName, lockHandle));
45
48
  }
46
49
  /**
47
50
  * Validate interface configuration before creation
@@ -198,6 +201,7 @@ class AdtInterface {
198
201
  const lockResult = await (0, lock_1.lockInterface)(this.connection, config.interfaceName);
199
202
  lockHandle = lockResult.lockHandle;
200
203
  state.lockHandle = lockHandle;
204
+ this.lockTracker.track(config.interfaceName, lockHandle);
201
205
  this.logger?.info?.('Interface locked, handle:', lockHandle);
202
206
  // 2. Check inactive with code for update (from options or config)
203
207
  const codeToCheck = options?.sourceCode || config.sourceCode;
@@ -233,6 +237,7 @@ class AdtInterface {
233
237
  const unlockResponse = await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
234
238
  state.unlockResult = unlockResponse;
235
239
  this.connection.setSessionType('stateless');
240
+ this.lockTracker.untrack(config.interfaceName);
236
241
  lockHandle = undefined;
237
242
  this.logger?.info?.('Interface unlocked');
238
243
  }
@@ -276,6 +281,7 @@ class AdtInterface {
276
281
  this.connection.setSessionType('stateful');
277
282
  await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
278
283
  this.connection.setSessionType('stateless');
284
+ this.lockTracker.untrack(config.interfaceName);
279
285
  }
280
286
  catch (unlockError) {
281
287
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -422,6 +428,7 @@ class AdtInterface {
422
428
  }
423
429
  this.connection.setSessionType('stateful');
424
430
  const result = await (0, lock_1.lockInterface)(this.connection, config.interfaceName);
431
+ this.lockTracker.track(config.interfaceName, result.lockHandle);
425
432
  return result.lockHandle;
426
433
  }
427
434
  /**
@@ -434,6 +441,7 @@ class AdtInterface {
434
441
  this.connection.setSessionType('stateful');
435
442
  const result = await (0, unlock_1.unlockInterface)(this.connection, config.interfaceName, lockHandle);
436
443
  this.connection.setSessionType('stateless');
444
+ this.lockTracker.untrack(config.interfaceName);
437
445
  return {
438
446
  unlockResult: result,
439
447
  errors: [],
@@ -10,19 +10,20 @@
10
10
  * Unsupported operations (message classes are not activatable):
11
11
  * - activate, check, getVersions, getVersionSource → throwUnsupportedOperation
12
12
  *
13
- * transport / corrNr: parsed in config but not sent in requests yet.
14
- * Task 6.2 will wire it for transportable packages after a probe confirms the
15
- * corrNr query parameter is accepted by the endpoint.
13
+ * transport: config.transportRequest is sent as corrNr on create/update and as
14
+ * <del:transportNumber> on delete (transportable packages); local packages send none.
16
15
  */
17
16
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
18
17
  import type { IAdtSystemContext } from '../../clients/AdtClient';
18
+ import { type LockRegistry } from '../shared/LockRegistry';
19
19
  import type { IMessageClassConfig, IMessageClassState } from './types';
20
20
  export declare class AdtMessageClass implements IAdtObject<IMessageClassConfig, IMessageClassState> {
21
21
  private readonly connection;
22
22
  private readonly logger?;
23
23
  private readonly systemContext;
24
+ private readonly lockTracker;
24
25
  readonly objectType: string;
25
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
26
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
26
27
  /**
27
28
  * Validate name + description via the ADT validation endpoint.
28
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtMessageClass.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAQjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAOvE,qBAAa,eACX,YAAW,UAAU,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAE9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAkB;gBAGlD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAqB9B;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAoC9B;;;OAGG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAsB1C;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAoD9B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IA0B9B;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;KAAE,GACvE,OAAO,CAAC,kBAAkB,CAAC;IAW9B;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAO9B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAa9B,yDAAyD;IACnD,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAO9B,yEAAyE;IACnE,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAI9B,4EAA4E;IACtE,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,cAAc,EAAE,CAAC;IAO5B,qFAAqF;IAC/E,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
1
+ {"version":3,"file":"AdtMessageClass.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClass.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAOvE,qBAAa,eACX,YAAW,UAAU,CAAC,mBAAmB,EAAE,kBAAkB,CAAC;IAE9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAkB;gBAGlD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAqB9B;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAoC9B;;;OAGG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAsB1C;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,kBAAkB,CAAC;IAwD9B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IA2B9B;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;KAAE,GACvE,OAAO,CAAC,kBAAkB,CAAC;IAW9B;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACnC,OAAO,CAAC,kBAAkB,CAAC;IAO9B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAUjE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,EACpC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,kBAAkB,CAAC;IAc9B,yDAAyD;IACnD,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAO9B,yEAAyE;IACnE,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,kBAAkB,CAAC;IAI9B,4EAA4E;IACtE,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,OAAO,CAAC,cAAc,EAAE,CAAC;IAO5B,qFAAqF;IAC/E,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
@@ -11,14 +11,14 @@
11
11
  * Unsupported operations (message classes are not activatable):
12
12
  * - activate, check, getVersions, getVersionSource → throwUnsupportedOperation
13
13
  *
14
- * transport / corrNr: parsed in config but not sent in requests yet.
15
- * Task 6.2 will wire it for transportable packages after a probe confirms the
16
- * corrNr query parameter is accepted by the endpoint.
14
+ * transport: config.transportRequest is sent as corrNr on create/update and as
15
+ * <del:transportNumber> on delete (transportable packages); local packages send none.
17
16
  */
18
17
  Object.defineProperty(exports, "__esModule", { value: true });
19
18
  exports.AdtMessageClass = void 0;
20
19
  const internalUtils_1 = require("../../utils/internalUtils");
21
20
  const timeouts_1 = require("../../utils/timeouts");
21
+ const LockRegistry_1 = require("../shared/LockRegistry");
22
22
  const unsupported_1 = require("../shared/unsupported");
23
23
  const create_1 = require("./create");
24
24
  const delete_1 = require("./delete");
@@ -32,11 +32,13 @@ class AdtMessageClass {
32
32
  connection;
33
33
  logger;
34
34
  systemContext;
35
+ lockTracker;
35
36
  objectType = 'MessageClass';
36
- constructor(connection, logger, systemContext) {
37
+ constructor(connection, logger, systemContext, lockRegistry) {
37
38
  this.connection = connection;
38
39
  this.logger = logger;
39
40
  this.systemContext = systemContext ?? {};
41
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockMessageClass)(this.connection, name, lockHandle));
40
42
  }
41
43
  /**
42
44
  * Validate name + description via the ADT validation endpoint.
@@ -82,7 +84,7 @@ class AdtMessageClass {
82
84
  master_language: config.masterLanguage?.trim() ||
83
85
  this.systemContext.masterLanguage?.trim() ||
84
86
  'EN',
85
- // corrNr wiring deferred to the transportable-package task
87
+ // sent as ?corrNr= for a transportable package; empty for local
86
88
  transport_request: config.transportRequest,
87
89
  });
88
90
  this.logger?.info?.('Message class created');
@@ -132,13 +134,15 @@ class AdtMessageClass {
132
134
  this.logger?.info?.('lock');
133
135
  this.connection.setSessionType('stateful');
134
136
  lockHandle = await (0, lock_1.lockMessageClass)(this.connection, config.name);
137
+ this.lockTracker.track(config.name, lockHandle);
135
138
  this.logger?.info?.('locked');
136
139
  this.logger?.info?.('update');
137
- const updateResult = await (0, update_1.updateMessageClass)(this.connection, config.name, lockHandle, config.description);
140
+ const updateResult = await (0, update_1.updateMessageClass)(this.connection, config.name, lockHandle, config.description, config.transportRequest);
138
141
  this.logger?.info?.('updated');
139
142
  this.logger?.info?.('unlock');
140
143
  const unlockResult = await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
141
144
  this.connection.setSessionType('stateless');
145
+ this.lockTracker.untrack(config.name);
142
146
  lockHandle = undefined;
143
147
  this.logger?.info?.('unlocked');
144
148
  return { updateResult, unlockResult, errors: [] };
@@ -149,6 +153,7 @@ class AdtMessageClass {
149
153
  try {
150
154
  this.logger?.warn?.('Unlocking message class during error cleanup');
151
155
  await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
156
+ this.lockTracker.untrack(config.name);
152
157
  }
153
158
  catch (unlockError) {
154
159
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -175,7 +180,7 @@ class AdtMessageClass {
175
180
  this.logger?.info?.('delete: check');
176
181
  await (0, delete_1.checkDeletion)(this.connection, config.name);
177
182
  this.logger?.info?.('delete: delete');
178
- const deleteResult = await (0, delete_1.deleteMessageClass)(this.connection, config.name);
183
+ const deleteResult = await (0, delete_1.deleteMessageClass)(this.connection, config.name, config.transportRequest);
179
184
  this.logger?.info?.('deleted');
180
185
  return { deleteResult, errors: [] };
181
186
  }
@@ -213,7 +218,9 @@ class AdtMessageClass {
213
218
  throw new Error('Message class name is required');
214
219
  }
215
220
  this.connection.setSessionType('stateful');
216
- return (0, lock_1.lockMessageClass)(this.connection, config.name);
221
+ const lockHandle = await (0, lock_1.lockMessageClass)(this.connection, config.name);
222
+ this.lockTracker.track(config.name, lockHandle);
223
+ return lockHandle;
217
224
  }
218
225
  /**
219
226
  * Unlock message class (low-level).
@@ -224,6 +231,7 @@ class AdtMessageClass {
224
231
  }
225
232
  const unlockResult = await (0, unlock_1.unlockMessageClass)(this.connection, config.name, lockHandle);
226
233
  this.connection.setSessionType('stateless');
234
+ this.lockTracker.untrack(config.name);
227
235
  return { unlockResult, errors: [] };
228
236
  }
229
237
  /** Message classes are not activated — always throws. */
@@ -21,7 +21,8 @@
21
21
  * Unsupported: activate, check, validate, lock, unlock, getVersions,
22
22
  * getVersionSource, readTransport → throwUnsupportedOperation.
23
23
  *
24
- * transport / corrNr: not sent yet Task 6.2 will wire it.
24
+ * transport: when config.transportRequest is set (transportable package), it is
25
+ * appended as &corrNr= on the class PUT, like the other CRUD object types.
25
26
  */
26
27
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
27
28
  import type { IMessageClassMessageConfig, IMessageClassMessageState } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"AdtMessageClassMessage.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClassMessage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAMjB,qBAAa,sBACX,YAAW,UAAU,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAE5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAyB;gBAE/C,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAOzD;;;;OAIG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAkCjD;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,0BAA0B,EAClC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;IAIrC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC3C,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;YAIvB,cAAc;IAqH5B;;;;;;;;;;;;OAYG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAsFrC,oFAAoF;IAC9E,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAY/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,aAAa,CACjB,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE,MAAM,CACV,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;IAI/B,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
1
+ {"version":3,"file":"AdtMessageClassMessage.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/AdtMessageClassMessage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EACV,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAMjB,qBAAa,sBACX,YAAW,UAAU,CAAC,0BAA0B,EAAE,yBAAyB,CAAC;IAE5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAyB;gBAE/C,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAOzD;;;;OAIG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC;IAkCjD;;;OAGG;IACG,MAAM,CACV,MAAM,EAAE,0BAA0B,EAClC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;IAIrC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC3C,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,yBAAyB,CAAC;YAIvB,cAAc;IAwH5B;;;;;;;;;;;;OAYG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAyFrC,oFAAoF;IAC9E,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC1C,OAAO,CAAC,yBAAyB,CAAC;IAY/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,QAAQ,CACZ,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,KAAK,CACT,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,aAAa,CACjB,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,yBAAyB,CAAC;IAI/B,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAInE,MAAM,CACV,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,EAC5C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;IAI/B,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,0BAA0B,CAAC,GAC3C,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
@@ -22,7 +22,8 @@
22
22
  * Unsupported: activate, check, validate, lock, unlock, getVersions,
23
23
  * getVersionSource, readTransport → throwUnsupportedOperation.
24
24
  *
25
- * transport / corrNr: not sent yet Task 6.2 will wire it.
25
+ * transport: when config.transportRequest is set (transportable package), it is
26
+ * appended as &corrNr= on the class PUT, like the other CRUD object types.
26
27
  */
27
28
  Object.defineProperty(exports, "__esModule", { value: true });
28
29
  exports.AdtMessageClassMessage = void 0;
@@ -146,8 +147,11 @@ class AdtMessageClassMessage {
146
147
  messageLockHandles: { [no]: messageLockHandle },
147
148
  });
148
149
  const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
150
+ const corrNr = config.transportRequest?.trim()
151
+ ? `&corrNr=${encodeURIComponent(config.transportRequest)}`
152
+ : '';
149
153
  const updateResult = await this.connection.makeAdtRequest({
150
- url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}`,
154
+ url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}${corrNr}`,
151
155
  method: 'PUT',
152
156
  timeout: (0, timeouts_1.getTimeout)('default'),
153
157
  data: xmlBody,
@@ -234,8 +238,11 @@ class AdtMessageClassMessage {
234
238
  messageLockHandles: { [no]: messageLockHandle },
235
239
  });
236
240
  const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
241
+ const corrNr = config.transportRequest?.trim()
242
+ ? `&corrNr=${encodeURIComponent(config.transportRequest)}`
243
+ : '';
237
244
  const deleteResult = await this.connection.makeAdtRequest({
238
- url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}`,
245
+ url: `${BASE}/${encoded}?lockHandle=${encodeURIComponent(classLockHandle)}${corrNr}`,
239
246
  method: 'PUT',
240
247
  timeout: (0, timeouts_1.getTimeout)('default'),
241
248
  data: xmlBody,
@@ -5,11 +5,9 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
5
5
  import type { ICreateMessageClassParams } from './types';
6
6
  /**
7
7
  * Create a new message class (shell — no messages yet).
8
- * POST /sap/bc/adt/messageclass with Content-Type application/xml.
9
- *
10
- * corrNr (transport) is intentionally omitted here — the local/no-transport
11
- * path is the only one confirmed by probe. Task 6.2 will wire it for
12
- * transportable packages once a corrNr probe succeeds.
8
+ * POST /sap/bc/adt/messageclass[?corrNr={transport}] with Content-Type application/xml.
9
+ * For a transportable package pass `transport_request` (added as `?corrNr=`), like
10
+ * domain/class create; local packages send no corrNr.
13
11
  */
14
12
  export declare function createMessageClass(connection: IAbapConnection, params: ICreateMessageClassParams): Promise<IAdtResponse>;
15
13
  //# sourceMappingURL=create.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAKzD;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CAsBvB"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAC;AAKzD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,YAAY,CAAC,CA0BvB"}
@@ -9,11 +9,9 @@ const xml_1 = require("./xml");
9
9
  const BASE = '/sap/bc/adt/messageclass';
10
10
  /**
11
11
  * Create a new message class (shell — no messages yet).
12
- * POST /sap/bc/adt/messageclass with Content-Type application/xml.
13
- *
14
- * corrNr (transport) is intentionally omitted here — the local/no-transport
15
- * path is the only one confirmed by probe. Task 6.2 will wire it for
16
- * transportable packages once a corrNr probe succeeds.
12
+ * POST /sap/bc/adt/messageclass[?corrNr={transport}] with Content-Type application/xml.
13
+ * For a transportable package pass `transport_request` (added as `?corrNr=`), like
14
+ * domain/class create; local packages send no corrNr.
17
15
  */
18
16
  async function createMessageClass(connection, params) {
19
17
  // Emit BOTH adtcore:language and adtcore:masterLanguage (like domain/class),
@@ -27,8 +25,11 @@ async function createMessageClass(connection, params) {
27
25
  masterLanguage: lang,
28
26
  messages: [],
29
27
  });
28
+ const corrNrParam = params.transport_request?.trim()
29
+ ? `?corrNr=${encodeURIComponent(params.transport_request)}`
30
+ : '';
30
31
  return connection.makeAdtRequest({
31
- url: BASE,
32
+ url: `${BASE}${corrNrParam}`,
32
33
  method: 'POST',
33
34
  timeout: (0, timeouts_1.getTimeout)('default'),
34
35
  data: xmlBody,
@@ -18,8 +18,8 @@ export declare function checkDeletion(connection: IAbapConnection, name: string)
18
18
  * Low-level: delete the message class via the deletion service.
19
19
  * POST /sap/bc/adt/deletion/delete (stateless — no lock handle).
20
20
  *
21
- * corrNr / transport_request is intentionally omitted local/no-transport path
22
- * only, wired for transportable packages in the corrNr task.
21
+ * For a transportable package pass `transportRequest` (emitted as
22
+ * `<del:transportNumber>`), like domain; local packages send an empty tag.
23
23
  */
24
- export declare function deleteMessageClass(connection: IAbapConnection, name: string): Promise<IAdtResponse>;
24
+ export declare function deleteMessageClass(connection: IAbapConnection, name: string, transportRequest?: string): Promise<IAdtResponse>;
25
25
  //# sourceMappingURL=delete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAe9E;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,CAAC,CAkBvB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
@@ -43,16 +43,19 @@ async function checkDeletion(connection, name) {
43
43
  * Low-level: delete the message class via the deletion service.
44
44
  * POST /sap/bc/adt/deletion/delete (stateless — no lock handle).
45
45
  *
46
- * corrNr / transport_request is intentionally omitted local/no-transport path
47
- * only, wired for transportable packages in the corrNr task.
46
+ * For a transportable package pass `transportRequest` (emitted as
47
+ * `<del:transportNumber>`), like domain; local packages send an empty tag.
48
48
  */
49
- async function deleteMessageClass(connection, name) {
49
+ async function deleteMessageClass(connection, name, transportRequest) {
50
50
  if (!name)
51
51
  throw new Error('name is required');
52
+ const transportNumberTag = transportRequest?.trim()
53
+ ? `<del:transportNumber>${transportRequest}</del:transportNumber>`
54
+ : '<del:transportNumber/>';
52
55
  const xmlPayload = `<?xml version="1.0" encoding="UTF-8"?>
53
56
  <del:deletionRequest xmlns:del="http://www.sap.com/adt/deletion" xmlns:adtcore="http://www.sap.com/adt/core">
54
57
  <del:object adtcore:uri="${objectUri(name)}">
55
- <del:transportNumber/>
58
+ ${transportNumberTag}
56
59
  </del:object>
57
60
  </del:deletionRequest>`;
58
61
  return connection.makeAdtRequest({
@@ -21,7 +21,7 @@ export interface IMessageClassConfig {
21
21
  description?: string;
22
22
  /** Package name — required for create */
23
23
  packageName?: string;
24
- /** Transport request — parsed but not sent until Task 6.2 wires corrNr */
24
+ /** Transport request — sent as corrNr (create/update) or <del:transportNumber> (delete) for transportable packages */
25
25
  transportRequest?: string;
26
26
  /** Master language of the message class — defaults to 'EN' on create */
27
27
  masterLanguage?: string;
@@ -42,7 +42,7 @@ export interface IMessageClassMessageConfig {
42
42
  selfExplanatory?: boolean;
43
43
  /** Long description for the message (adtcore:description attribute) */
44
44
  description?: string;
45
- /** Transport request — parsed but not sent until Task 6.2 wires corrNr */
45
+ /** Transport request — sent as &corrNr= on the parent-class PUT for create/update/delete (transportable packages) */
46
46
  transportRequest?: string;
47
47
  }
48
48
  /** State returned from operations on a single message. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,iDAAiD;IACjD,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAID,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,6DAA6D;IAC7D,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGjE,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAGD,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sHAAsH;IACtH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,iDAAiD;IACjD,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACpC;AAID,8EAA8E;AAC9E,MAAM,WAAW,0BAA0B;IACzC,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qHAAqH;IACrH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,6DAA6D;IAC7D,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B"}
@@ -12,5 +12,5 @@ import type { IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
12
12
  *
13
13
  * NOTE: Caller must enable stateful session and hold a valid lockHandle.
14
14
  */
15
- export declare function updateMessageClass(connection: IAbapConnection, name: string, lockHandle: string, description: string | undefined): Promise<IAdtResponse>;
15
+ export declare function updateMessageClass(connection: IAbapConnection, name: string, lockHandle: string, description: string | undefined, transportRequest?: string): Promise<IAdtResponse>;
16
16
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAS9E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,YAAY,CAAC,CAyBvB"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/core/messageClass/update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAS9E;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CA4BvB"}
@@ -20,7 +20,7 @@ const BASE = '/sap/bc/adt/messageclass';
20
20
  *
21
21
  * NOTE: Caller must enable stateful session and hold a valid lockHandle.
22
22
  */
23
- async function updateMessageClass(connection, name, lockHandle, description) {
23
+ async function updateMessageClass(connection, name, lockHandle, description, transportRequest) {
24
24
  // 1. Read current state to preserve existing messages and all SAP-managed attrs
25
25
  const currentResponse = await (0, read_1.getMessageClassSource)(connection, name);
26
26
  const current = (0, xml_1.parseMessageClass)(String(currentResponse.data));
@@ -33,7 +33,10 @@ async function updateMessageClass(connection, name, lockHandle, description) {
33
33
  const xmlBody = (0, xml_1.buildMessageClassXml)(updated);
34
34
  // 4. PUT with lock handle
35
35
  const encoded = (0, internalUtils_1.encodeSapObjectName)(name.toLowerCase());
36
- const url = `${BASE}/${encoded}?lockHandle=${encodeURIComponent(lockHandle)}`;
36
+ const corrNrParam = transportRequest?.trim()
37
+ ? `&corrNr=${encodeURIComponent(transportRequest)}`
38
+ : '';
39
+ const url = `${BASE}/${encoded}?lockHandle=${encodeURIComponent(lockHandle)}${corrNrParam}`;
37
40
  return connection.makeAdtRequest({
38
41
  url,
39
42
  method: 'PUT',
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { IMetadataExtensionConfig, IMetadataExtensionState } from './types';
24
25
  export declare class AdtMetadataExtension implements IAdtObject<IMetadataExtensionConfig, IMetadataExtensionState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate metadata extension configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtMetadataExtension.d.ts","sourceRoot":"","sources":["../../../src/core/metadataExtension/AdtMetadataExtension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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;AAWpD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AASjB,qBAAa,oBACX,YAAW,UAAU,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;IAExE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAuB;gBAGvD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAwBnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,wBAAwB,EAChC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAyCnC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAqC/C;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,CAAC;IAiCnC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,uBAAuB,CAAC;IAoCnC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IAiMnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAkCnC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IA6BnC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;IAoBnC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAatE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,uBAAuB,CAAC;IAkBnC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAIrD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtMetadataExtension.d.ts","sourceRoot":"","sources":["../../../src/core/metadataExtension/AdtMetadataExtension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;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,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AASjB,qBAAa,oBACX,YAAW,UAAU,CAAC,wBAAwB,EAAE,uBAAuB,CAAC;IAExE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAuB;gBAGvD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAwBnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,wBAAwB,EAChC,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAyCnC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAqC/C;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,uBAAuB,CAAC;IAiCnC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,uBAAuB,CAAC;IAoCnC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IAoMnC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IAkCnC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACxC,OAAO,CAAC,uBAAuB,CAAC;IA6BnC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC;IAoBnC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IActE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,EACzC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,uBAAuB,CAAC;IAmBnC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC;IAIrD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtMetadataExtension = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activate_1 = require("./activate");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -35,11 +36,13 @@ class AdtMetadataExtension {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'MetadataExtension';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockMetadataExtension)(this.connection, name, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate metadata extension configuration before creation
@@ -232,6 +235,7 @@ class AdtMetadataExtension {
232
235
  this.logger?.info?.('Step 1: Locking metadata extension');
233
236
  this.connection.setSessionType('stateful');
234
237
  lockHandle = await (0, lock_1.lockMetadataExtension)(this.connection, config.name);
238
+ this.lockTracker.track(config.name, lockHandle);
235
239
  this.logger?.info?.('Metadata extension locked, handle:', lockHandle);
236
240
  // 2. Check inactive with code for update (from options or config)
237
241
  const codeToCheck = options?.sourceCode || config.sourceCode;
@@ -264,6 +268,7 @@ class AdtMetadataExtension {
264
268
  this.connection.setSessionType('stateful');
265
269
  await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
266
270
  this.connection.setSessionType('stateless');
271
+ this.lockTracker.untrack(config.name);
267
272
  lockHandle = undefined;
268
273
  this.logger?.info?.('Metadata extension unlocked');
269
274
  }
@@ -311,6 +316,7 @@ class AdtMetadataExtension {
311
316
  this.connection.setSessionType('stateful');
312
317
  await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
313
318
  this.connection.setSessionType('stateless');
319
+ this.lockTracker.untrack(config.name);
314
320
  }
315
321
  catch (unlockError) {
316
322
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -419,6 +425,7 @@ class AdtMetadataExtension {
419
425
  }
420
426
  this.connection.setSessionType('stateful');
421
427
  const lockHandle = await (0, lock_1.lockMetadataExtension)(this.connection, config.name);
428
+ this.lockTracker.track(config.name, lockHandle);
422
429
  return lockHandle;
423
430
  }
424
431
  /**
@@ -431,6 +438,7 @@ class AdtMetadataExtension {
431
438
  this.connection.setSessionType('stateful');
432
439
  const result = await (0, unlock_1.unlockMetadataExtension)(this.connection, config.name, lockHandle);
433
440
  this.connection.setSessionType('stateless');
441
+ this.lockTracker.untrack(config.name);
434
442
  return {
435
443
  unlockResult: result,
436
444
  errors: [],
@@ -22,14 +22,16 @@
22
22
  */
23
23
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger, IObjectVersion } from '@mcp-abap-adt/interfaces';
24
24
  import type { IAdtSystemContext } from '../../clients/AdtClient';
25
+ import { type LockRegistry } from '../shared/LockRegistry';
25
26
  import type { IReadOptions } from '../shared/types';
26
27
  import type { IPackageConfig, IPackageState } from './types';
27
28
  export declare class AdtPackage implements IAdtObject<IPackageConfig, IPackageState> {
28
29
  protected readonly connection: IAbapConnection;
29
30
  protected readonly logger?: ILogger;
30
31
  protected readonly systemContext: IAdtSystemContext;
32
+ private readonly lockTracker;
31
33
  readonly objectType: string;
32
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
34
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
33
35
  /**
34
36
  * Validate package configuration before creation
35
37
  */
@@ -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,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,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;IAsGzB;;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;IAqLzB;;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;IAU5D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,EAC/B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,aAAa,CAAC;IAkBnB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
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,EACP,cAAc,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D,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,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAa;gBAG7C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;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;IAsGzB;;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;IAwLzB;;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;IAmBnB,WAAW,CACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG7D"}
@@ -24,6 +24,7 @@
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.AdtPackage = void 0;
26
26
  const internalUtils_1 = require("../../utils/internalUtils");
27
+ const LockRegistry_1 = require("../shared/LockRegistry");
27
28
  const versions_1 = require("../shared/versions");
28
29
  const check_1 = require("./check");
29
30
  const create_1 = require("./create");
@@ -37,11 +38,13 @@ class AdtPackage {
37
38
  connection;
38
39
  logger;
39
40
  systemContext;
41
+ lockTracker;
40
42
  objectType = 'Package';
41
- constructor(connection, logger, systemContext) {
43
+ constructor(connection, logger, systemContext, lockRegistry) {
42
44
  this.connection = connection;
43
45
  this.logger = logger;
44
46
  this.systemContext = systemContext ?? {};
47
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (packageName, lockHandle) => (0, unlock_1.unlockPackage)(this.connection, packageName, lockHandle));
45
48
  }
46
49
  /**
47
50
  * Validate package configuration before creation
@@ -306,6 +309,7 @@ class AdtPackage {
306
309
  const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
307
310
  lockHandle = lockResult.lockHandle;
308
311
  lockCorrNr = lockResult.corrNr;
312
+ this.lockTracker.track(config.packageName, lockHandle);
309
313
  this.logger?.info?.(`Package locked, handle: ${lockHandle}, corrNr: ${lockCorrNr}`);
310
314
  // 2. Check inactive with XML for update (if provided)
311
315
  const xmlToCheck = options?.xmlContent;
@@ -352,6 +356,7 @@ class AdtPackage {
352
356
  this.connection.setSessionType('stateful');
353
357
  await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
354
358
  this.connection.setSessionType('stateless');
359
+ this.lockTracker.untrack(config.packageName);
355
360
  lockHandle = undefined;
356
361
  this.logger?.info?.('Package unlocked');
357
362
  }
@@ -371,6 +376,7 @@ class AdtPackage {
371
376
  this.connection.setSessionType('stateful');
372
377
  await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
373
378
  this.connection.setSessionType('stateless');
379
+ this.lockTracker.untrack(config.packageName);
374
380
  }
375
381
  catch (unlockError) {
376
382
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -456,6 +462,7 @@ class AdtPackage {
456
462
  }
457
463
  this.connection.setSessionType('stateful');
458
464
  const lockResult = await (0, lock_1.lockPackage)(this.connection, config.packageName);
465
+ this.lockTracker.track(config.packageName, lockResult.lockHandle);
459
466
  return lockResult.lockHandle;
460
467
  }
461
468
  /**
@@ -468,6 +475,7 @@ class AdtPackage {
468
475
  this.connection.setSessionType('stateful');
469
476
  const result = await (0, unlock_1.unlockPackage)(this.connection, config.packageName, lockHandle);
470
477
  this.connection.setSessionType('stateless');
478
+ this.lockTracker.untrack(config.packageName);
471
479
  return {
472
480
  unlockResult: result,
473
481
  errors: [],
@@ -20,6 +20,7 @@
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
22
  import type { IAdtContentTypes } from '../shared/contentTypes';
23
+ import { type LockRegistry } from '../shared/LockRegistry';
23
24
  import type { IReadOptions } from '../shared/types';
24
25
  import type { IProgramConfig, IProgramState } from './types';
25
26
  export declare class AdtProgram implements IAdtObject<IProgramConfig, IProgramState> {
@@ -27,8 +28,9 @@ export declare class AdtProgram implements IAdtObject<IProgramConfig, IProgramSt
27
28
  protected readonly logger?: ILogger;
28
29
  protected readonly systemContext: IAdtSystemContext;
29
30
  protected readonly contentTypes?: IAdtContentTypes;
31
+ private readonly lockTracker;
30
32
  readonly objectType: string;
31
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes);
33
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, contentTypes?: IAdtContentTypes, lockRegistry?: LockRegistry);
32
34
  /**
33
35
  * Validate program configuration before creation
34
36
  */