@mcp-abap-adt/adt-clients 31.1.0 → 32.2.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 (130) hide show
  1. package/README.md +49 -6
  2. package/dist/batch/AdtBatchConnection.d.ts +29 -0
  3. package/dist/batch/AdtBatchConnection.d.ts.map +1 -0
  4. package/dist/batch/AdtBatchConnection.js +155 -0
  5. package/dist/batch/index.d.ts +2 -0
  6. package/dist/batch/index.d.ts.map +1 -0
  7. package/dist/batch/index.js +5 -0
  8. package/dist/batch/wire.d.ts +10 -0
  9. package/dist/batch/wire.d.ts.map +1 -0
  10. package/dist/batch/wire.js +88 -0
  11. package/dist/clients/AdtClient.d.ts +6 -6
  12. package/dist/clients/AdtClient.d.ts.map +1 -1
  13. package/dist/constants/contentTypes.d.ts +7 -2
  14. package/dist/constants/contentTypes.d.ts.map +1 -1
  15. package/dist/constants/contentTypes.js +10 -4
  16. package/dist/core/accessControl/versions.d.ts +1 -1
  17. package/dist/core/accessControl/versions.js +1 -1
  18. package/dist/core/appendStructure/versions.d.ts +1 -1
  19. package/dist/core/appendStructure/versions.js +1 -1
  20. package/dist/core/behaviorDefinition/versions.d.ts +1 -1
  21. package/dist/core/behaviorDefinition/versions.js +1 -1
  22. package/dist/core/behaviorImplementation/versions.d.ts +1 -1
  23. package/dist/core/behaviorImplementation/versions.js +1 -1
  24. package/dist/core/class/AdtClass.d.ts +6 -2
  25. package/dist/core/class/AdtClass.d.ts.map +1 -1
  26. package/dist/core/class/AdtClass.js +11 -0
  27. package/dist/core/class/enhancements.d.ts +4 -0
  28. package/dist/core/class/enhancements.d.ts.map +1 -0
  29. package/dist/core/class/enhancements.js +25 -0
  30. package/dist/core/class/types.d.ts +6 -0
  31. package/dist/core/class/types.d.ts.map +1 -1
  32. package/dist/core/class/types.js +2 -0
  33. package/dist/core/enhancement/AdtEnhancement.d.ts +10 -3
  34. package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
  35. package/dist/core/enhancement/AdtEnhancement.js +13 -1
  36. package/dist/core/enhancement/activation.d.ts +1 -1
  37. package/dist/core/enhancement/activation.js +1 -1
  38. package/dist/core/enhancement/create.d.ts +0 -2
  39. package/dist/core/enhancement/create.d.ts.map +1 -1
  40. package/dist/core/enhancement/create.js +30 -28
  41. package/dist/core/enhancement/read.d.ts +1 -1
  42. package/dist/core/enhancement/read.js +3 -3
  43. package/dist/core/enhancement/types.d.ts +8 -5
  44. package/dist/core/enhancement/types.d.ts.map +1 -1
  45. package/dist/core/enhancement/types.js +7 -10
  46. package/dist/core/enhancement/unlock.d.ts +1 -1
  47. package/dist/core/enhancement/unlock.js +1 -1
  48. package/dist/core/enhancement/update.d.ts +2 -0
  49. package/dist/core/enhancement/update.d.ts.map +1 -1
  50. package/dist/core/enhancement/update.js +21 -0
  51. package/dist/core/enhancement/versions.js +1 -1
  52. package/dist/core/functionGroup/AdtFunctionGroup.d.ts +6 -2
  53. package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
  54. package/dist/core/functionGroup/AdtFunctionGroup.js +11 -0
  55. package/dist/core/functionGroup/create.js +1 -1
  56. package/dist/core/functionGroup/enhancements.d.ts +4 -0
  57. package/dist/core/functionGroup/enhancements.d.ts.map +1 -0
  58. package/dist/core/functionGroup/enhancements.js +25 -0
  59. package/dist/core/functionGroup/types.d.ts +6 -0
  60. package/dist/core/functionGroup/types.d.ts.map +1 -1
  61. package/dist/core/functionGroup/types.js +2 -0
  62. package/dist/core/functionInclude/versions.js +1 -1
  63. package/dist/core/functionModule/versions.js +1 -1
  64. package/dist/core/include/AdtInclude.d.ts +10 -2
  65. package/dist/core/include/AdtInclude.d.ts.map +1 -1
  66. package/dist/core/include/AdtInclude.js +20 -0
  67. package/dist/core/include/enhancements.d.ts +4 -0
  68. package/dist/core/include/enhancements.d.ts.map +1 -0
  69. package/dist/core/include/enhancements.js +27 -0
  70. package/dist/core/include/types.d.ts +6 -0
  71. package/dist/core/include/types.d.ts.map +1 -1
  72. package/dist/core/include/types.js +2 -0
  73. package/dist/core/program/AdtProgram.d.ts +6 -2
  74. package/dist/core/program/AdtProgram.d.ts.map +1 -1
  75. package/dist/core/program/AdtProgram.js +11 -0
  76. package/dist/core/program/enhancements.d.ts +4 -0
  77. package/dist/core/program/enhancements.d.ts.map +1 -0
  78. package/dist/core/program/enhancements.js +25 -0
  79. package/dist/core/program/types.d.ts +6 -0
  80. package/dist/core/program/types.d.ts.map +1 -1
  81. package/dist/core/program/types.js +2 -0
  82. package/dist/core/scalarFunction/versions.d.ts +1 -1
  83. package/dist/core/scalarFunction/versions.js +1 -1
  84. package/dist/core/scalarFunctionImplementation/versions.d.ts +1 -1
  85. package/dist/core/scalarFunctionImplementation/versions.js +1 -1
  86. package/dist/core/service/AdtService.js +2 -2
  87. package/dist/core/service/lock.d.ts +1 -1
  88. package/dist/core/service/lock.js +1 -1
  89. package/dist/core/service/types.d.ts +2 -2
  90. package/dist/core/serviceDefinition/versions.d.ts +1 -1
  91. package/dist/core/serviceDefinition/versions.js +1 -1
  92. package/dist/core/shared/AdtUtils.d.ts +5 -6
  93. package/dist/core/shared/AdtUtils.d.ts.map +1 -1
  94. package/dist/core/shared/AdtUtils.js +5 -6
  95. package/dist/core/structure/versions.d.ts +1 -1
  96. package/dist/core/structure/versions.js +1 -1
  97. package/dist/core/tabletype/versions.d.ts +1 -1
  98. package/dist/core/tabletype/versions.js +1 -1
  99. package/dist/core/transformation/versions.d.ts +1 -1
  100. package/dist/core/transformation/versions.js +1 -1
  101. package/dist/core/transport/AdtRequest.d.ts +2 -2
  102. package/dist/core/transport/AdtRequest.js +2 -2
  103. package/dist/core/transport/objects.d.ts +1 -1
  104. package/dist/core/transport/objects.js +1 -1
  105. package/dist/endpoints/objects.d.ts +22 -1
  106. package/dist/endpoints/objects.d.ts.map +1 -1
  107. package/dist/endpoints/objects.js +15 -2
  108. package/dist/index.d.ts +1 -0
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +3 -1
  111. package/dist/runtime/debugger/abap.d.ts.map +1 -1
  112. package/dist/runtime/debugger/abap.js +28 -40
  113. package/dist/runtime/debugger/batchPayload.d.ts +2 -16
  114. package/dist/runtime/debugger/batchPayload.d.ts.map +1 -1
  115. package/dist/runtime/debugger/batchPayload.js +5 -28
  116. package/dist/runtime/dumps/read.d.ts +1 -1
  117. package/dist/runtime/dumps/read.js +1 -1
  118. package/dist/runtime/index.d.ts +1 -0
  119. package/dist/runtime/index.d.ts.map +1 -1
  120. package/dist/runtime/index.js +3 -0
  121. package/dist/utils/activationUtils.d.ts.map +1 -1
  122. package/dist/utils/activationUtils.js +5 -9
  123. package/docs/usage/ADT_OBJECT_ENTITIES.md +5 -5
  124. package/docs/usage/BATCH.md +160 -0
  125. package/docs/usage/CLIENT_API_REFERENCE.md +170 -6
  126. package/docs/usage/ERRATA.md +1 -1
  127. package/docs/usage/MIGRATION-32.md +50 -0
  128. package/docs/usage/OBJECT_LIFECYCLE.md +1 -1
  129. package/docs/usage/STATEFUL_SESSION_GUIDE.md +2 -2
  130. package/package.json +2 -2
package/README.md CHANGED
@@ -91,7 +91,7 @@ This package interacts with external packages **ONLY through interfaces**:
91
91
 
92
92
  | package | what this package takes from it |
93
93
  |---|---|
94
- | [`@mcp-abap-adt/interfaces-adt`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt) `^16.0.0` | the capability atoms, every object's config, `IAdtResponse`, `IAnalyse`, `IAdtAnalyseOptions`, `IResultStrategy`, `ADT_NO_FAILURE`, `ADT_TASK_TYPE` |
94
+ | [`@mcp-abap-adt/interfaces-adt`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt) `^18.0.0` | the capability atoms, every object's config, `IAdtResponse`, `IAnalyse`, `IAdtAnalyseOptions`, `IResultStrategy`, `ADT_NO_FAILURE`, `ADT_TASK_TYPE` |
95
95
  | [`@mcp-abap-adt/interfaces-adt-connection`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt-connection) `^3.0.0` | `IAbapConnection`, `IAdtWireResponse`, `IAbapRequestOptions`, the connection capability atoms, `ADT_SESSION_ERROR` |
96
96
  | [`@mcp-abap-adt/interfaces-network`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-network) `^2.0.1` | `IWebSocketTransport` and its four companions, `HttpError` |
97
97
  | [`@mcp-abap-adt/interfaces-utils`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-utils) `^1.1.1` | `ILogger`, `LogLevel`, `XmlNode` |
@@ -162,7 +162,7 @@ npm install @mcp-abap-adt/adt-clients
162
162
 
163
163
  6. **AbapDebugger, AmdpDebugger, MemorySnapshots**
164
164
  - Standalone, from `@mcp-abap-adt/adt-clients/runtime` or the root: `new AbapDebugger(connection, logger, results?, { onConflict? })`
165
- - One member per request, contracts `IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots` from `@mcp-abap-adt/interfaces-adt` (contract 16 pairs with clients 31)
165
+ - One member per request, contracts `IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots` from `@mcp-abap-adt/interfaces-adt` (contract 18 pairs with clients 32)
166
166
  - **The identity states its mode.** `{ debuggingMode: 'user', requestUser, terminalId, ideId }`, or `{ debuggingMode: 'terminal', terminalId, ideId }`; `attach` takes the identity, not the user. A terminal-mode listener catches a run that carries its ids: `run(target, { debuggee: { terminalId, ideId } })` sends them in `SAP-PASSPORT` (since 29.1.0)
167
167
  - **Breakpoints are replaced, not added to.** `setBreakpoints` and `syncBreakpoints` replace the identity's set, and `stopListener` deletes it: arm the whole set in one call
168
168
  - **Two sessions.** The ABAP listener holds one stateful connection; each debuggee caught is attached on a new one, routed to its application server. The AMDP debugger answers events on one session and takes commands on another
@@ -177,6 +177,8 @@ npm install @mcp-abap-adt/adt-clients
177
177
  | Behavior Definitions (BDEF) | ✅ |
178
178
  | Interfaces (INTF) | ✅ |
179
179
  | Programs (PROG) | ✅ |
180
+ | Includes (PROG/I) | ✅ |
181
+ | Enhancements (ENHO/XHB, ENHO/XHH, ENHS/XSB) | ✅ |
180
182
  | Function Groups (FUGR) | ✅ |
181
183
  | Function Modules (FUGR/FF) | ✅ |
182
184
  | Function Includes (FUGR/I) | ✅ |
@@ -191,6 +193,18 @@ npm install @mcp-abap-adt/adt-clients
191
193
  | Feature Toggles (FTG2/FT) | ✅ |
192
194
  | Transports (TRNS) | ✅ |
193
195
 
196
+ `getEnhancement().updateMetadata()` writes the whole object document from
197
+ `options.source` under the caller's lock, then the caller unlocks and activates.
198
+ This writes BAdI spot definitions and container implementations; the result slot
199
+ is `metadataUpdated`. See the [BAdI example](docs/usage/CLIENT_API_REFERENCE.md#enhancements-and-their-hosts).
200
+
201
+ Class, program and function-group handlers also expose `readEnhancementElements`
202
+ and `readEnhancementOptions` (`IAdtEnhancementHost`). `getInclude()` exposes
203
+ both through `IAdtIncludeEnhancementHost`, with `context` set to the main
204
+ program name. The default answers XML; custom result sets provide
205
+ `enhancementElements` and `enhancementOptions`. These reads live on the hosts,
206
+ not `AdtUtils`. See [enhancement examples](docs/usage/CLIENT_API_REFERENCE.md#enhancements-and-their-hosts).
207
+
194
208
  ## Quick Start
195
209
 
196
210
  ### Using AdtClient (Recommended - High-Level CRUD API)
@@ -436,7 +450,7 @@ await utils.readObjectSource('view' satisfies AdtSourceObjectType, 'ZOK_I_CDS_TE
436
450
  The `withLongPolling` parameter asks ADT to hold a read until the object is
437
451
  available, instead of answering from whatever is there right now:
438
452
 
439
- > **Measured caveat — do not rely on it for readiness.** On an SAP BTP trial the
453
+ > **Measured caveat — do not rely on it for readiness.** On the ABAP Cloud system the
440
454
  > parameter changes nothing on an object read. Reading a message class straight
441
455
  > after creating it returned `404` in ~650ms **with** the flag — the same
442
456
  > latency as without it — and the server did not hold the request. The system's
@@ -860,7 +874,7 @@ everything else is not.
860
874
 
861
875
  ### Single Definition Site: the contract packages
862
876
 
863
- Since **7.5.0**, every contract type is **defined once**, in the contract packages — today `@mcp-abap-adt/interfaces-adt` (`^16.0.0`) for the ADT contracts and `@mcp-abap-adt/interfaces-adt-connection` (`^3.0.0`) for the connection. This package declares no copies of its own — every `IXxxConfig`, the capability atoms, the option and response types and the cross-cutting shared types all live there.
877
+ Since **7.5.0**, every contract type is **defined once**, in the contract packages — today `@mcp-abap-adt/interfaces-adt` (`^18.0.0`) for the ADT contracts and `@mcp-abap-adt/interfaces-adt-connection` (`^3.0.0`) for the connection. This package declares no copies of its own — every `IXxxConfig`, the capability atoms, the option and response types and the cross-cutting shared types all live there.
864
878
 
865
879
  **Import them from the package that owns them:**
866
880
 
@@ -891,7 +905,7 @@ What this package exports is what it owns: the clients, the handler classes, the
891
905
 
892
906
  ### Honest capability types (since 8.0.0)
893
907
 
894
- `@mcp-abap-adt/interfaces-adt` has **capability atoms and nothing above them** — `IAdtCreatable`, `IAdtReadable`, `IAdtMetadataReadable`, `IAdtUpdatable`, `IAdtMetadataUpdatable`, `IAdtDeletable`, `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware` — each covering one operation against one resource. **There is no composite.** `IAdtObject`, `IAdtCrud`, `IAdtModifiable` and `IAdtSourceObject` were removed in interfaces 29.0.0: they forced one result type on members that answer different things, and a create does not answer what a read answers. `IAdtSearchable` went in 30.0.0 — searching is not something an object does to itself, and the question already had a home in `IAdtInformationSystem.search`. A handler declares the atoms it honours, so there is nothing a composite could drift from.
908
+ `@mcp-abap-adt/interfaces-adt` has **capability atoms and nothing above them** — `IAdtCreatable`, `IAdtReadable`, `IAdtMetadataReadable`, `IAdtUpdatable`, `IAdtMetadataUpdatable`, `IAdtDeletable`, `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware`, `IAdtEnhancementHost`, `IAdtIncludeEnhancementHost` — each covering one operation against one resource. **There is no composite.** `IAdtObject`, `IAdtCrud`, `IAdtModifiable` and `IAdtSourceObject` were removed in interfaces 29.0.0: they forced one result type on members that answer different things, and a create does not answer what a read answers. `IAdtSearchable` went in 30.0.0 — searching is not something an object does to itself, and the question already had a home in `IAdtInformationSystem.search`. A handler declares the atoms it honours, so there is nothing a composite could drift from.
895
909
 
896
910
  Since **8.0.0**, each handler `implements` only the atoms it genuinely supports, and `AdtClient.getXxx()` return types are narrowed to match:
897
911
 
@@ -940,7 +954,7 @@ contracts (`IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots`, 13.1.0). This
940
954
  package no longer declares or exports any contract type — every contract name it uses is
941
955
  sourced from the contract packages.
942
956
 
943
- > **Version pairing.** `adt-clients` 31 pairs with `interfaces-adt` 16 and `interfaces-adt-connection` 3 (the per-request `signal` and `ADT_REQUEST_ERROR` are gone), and `adt-strategies` 0.11.0 declares the same ranges. Because the types are sourced rather than copied, `@mcp-abap-adt/interfaces-adt` and `@mcp-abap-adt/interfaces-adt-connection` are hard peers of this package's public API. A major bump there implies a bump here; keep the two in step rather than letting a resolver pick a mismatched pair.
957
+ > **Version pairing.** `adt-clients` 32 pairs with `interfaces-adt` 18 and `interfaces-adt-connection` 3 (the enhancement subtype and host contracts), and `adt-strategies` 0.12.0 declares the same ranges. Because the types are sourced rather than copied, `@mcp-abap-adt/interfaces-adt` and `@mcp-abap-adt/interfaces-adt-connection` are hard peers of this package's public API. A major bump there implies a bump here; keep the two in step rather than letting a resolver pick a mismatched pair.
944
958
 
945
959
  ### Naming Conventions
946
960
 
@@ -977,6 +991,7 @@ See [Architecture Documentation](docs/architecture/ARCHITECTURE.md#type-system-a
977
991
  One document per breaking release, each written for a consumer on the contract
978
992
  before it:
979
993
 
994
+ - **[31.x → 32.0.0](docs/usage/MIGRATION-32.md)** — interfaces-adt 18, three enhancement subtypes, subtype-specific create fields, two new result slots for enhancement hosts, and `metadataUpdated` for enhancement document writes.
980
995
  - **[30.x → 31.0.0](docs/usage/MIGRATION-31.md)** — `interfaces-adt` 16 and
981
996
  `interfaces-adt-connection` 3: the per-request `signal`, `ADT_REQUEST_ERROR`
982
997
  and `IAdtError.refusal` are gone; code written for 30.x compiles unchanged.
@@ -1100,3 +1115,31 @@ users can replace it with their own build.
1100
1115
  ## Author
1101
1116
 
1102
1117
  Oleksii Kyslytsia <oleksij.kyslytsja@gmail.com>
1118
+
1119
+ ### Recording batches
1120
+
1121
+ `AdtBatchConnection` records calls from the existing clients. Start the member
1122
+ calls, execute the queue, then await their results. Group creates before locks,
1123
+ then queue writes with the returned lock handles before unlocks;
1124
+ activate all objects with one plain `activateObjectsGroup` call. At a debugger
1125
+ stop, record step + stack + variables on the attached stateful connection.
1126
+ See [domain and debugger examples](docs/usage/BATCH.md).
1127
+
1128
+ `execute()` also sends follow-up envelopes for requests recorded during settlement,
1129
+ including automatic 406/415 negotiation retries (up to 100 envelopes, then all
1130
+ remaining requests reject). Explicit session switches apply to the next recording;
1131
+ LOCK/UNLOCK run in stateful envelopes; other ordinary members run stateless.
1132
+ Consecutive LOCKs, consecutive UNLOCKs, and consecutive stateless requests each
1133
+ form separate envelopes sent in queue order.
1134
+ Execution returns the last outer response. An envelope failure stops sending and
1135
+ rejects unsent requests with a clear library error; inner HTTP failures remain
1136
+ per-part failures. The wrapped session mode is restored after execution.
1137
+
1138
+ ```typescript
1139
+ import { AdtBatchConnection, AdtClient } from '@mcp-abap-adt/adt-clients';
1140
+
1141
+ const batch = new AdtBatchConnection(connection, { endpoint: 'communication' });
1142
+ const pending = new AdtClient(batch).getDomain().readMetadata({ domainName: 'Z_DOMAIN' });
1143
+ await batch.execute();
1144
+ const answer = await pending;
1145
+ ```
@@ -0,0 +1,29 @@
1
+ import type { IAbapConnection, IAbapRequestOptions, IAdtWireResponse } from '@mcp-abap-adt/interfaces-adt-connection';
2
+ import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
3
+ type Session = 'stateful' | 'stateless';
4
+ /** Records member requests; execute also drains requests queued during settlement. */
5
+ export declare class AdtBatchConnection implements IAbapConnection {
6
+ private readonly connection;
7
+ private readonly options;
8
+ private queue;
9
+ private session;
10
+ private readonly defaultSession;
11
+ private settlementFailure?;
12
+ private executing;
13
+ constructor(connection: IAbapConnection, options: {
14
+ endpoint: 'communication' | 'debugger';
15
+ logger?: ILogger;
16
+ });
17
+ private wrappedSession;
18
+ connect(): Promise<void>;
19
+ getBaseUrl(): Promise<string>;
20
+ getSessionId(): string | null;
21
+ setSessionType(type: Session): void;
22
+ getSessionType(): Session;
23
+ makeAdtRequest<T = unknown, D = unknown>(request: IAbapRequestOptions): Promise<IAdtWireResponse<T, D>>;
24
+ private envelopeKey;
25
+ /** Empty queues return a synthetic 204, data '', without network traffic. */
26
+ execute(): Promise<IAdtWireResponse>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=AdtBatchConnection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdtBatchConnection.d.ts","sourceRoot":"","sources":["../../src/batch/AdtBatchConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAI9D,KAAK,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAQxC,sFAAsF;AACtF,qBAAa,kBAAmB,YAAW,eAAe;IAOtD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAqB;IAC/C,OAAO,CAAC,SAAS,CAAS;gBAEP,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE;QACxB,QAAQ,EAAE,eAAe,GAAG,UAAU,CAAC;QACvC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAQH,OAAO,CAAC,cAAc;IAWtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAGxB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAG7B,YAAY,IAAI,MAAM,GAAG,IAAI;IAG7B,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAGnC,cAAc,IAAI,OAAO;IAGzB,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAuBlC,OAAO,CAAC,WAAW;IAkBnB,6EAA6E;IACvE,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAuF3C"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdtBatchConnection = void 0;
4
+ const objects_1 = require("../endpoints/objects");
5
+ const wire_1 = require("./wire");
6
+ /** Records member requests; execute also drains requests queued during settlement. */
7
+ class AdtBatchConnection {
8
+ connection;
9
+ options;
10
+ queue = [];
11
+ session;
12
+ defaultSession;
13
+ settlementFailure;
14
+ executing = false;
15
+ constructor(connection, options) {
16
+ this.connection = connection;
17
+ this.options = options;
18
+ // Debugger requests use the attached stateful session; communication
19
+ // members opt into stateful mode only for their own LOCK or UNLOCK.
20
+ this.defaultSession =
21
+ options.endpoint === 'debugger' ? 'stateful' : 'stateless';
22
+ this.session = this.defaultSession;
23
+ }
24
+ wrappedSession() {
25
+ const connection = this.connection;
26
+ return (connection.getSessionType?.() ??
27
+ connection.getSessionMode?.() ??
28
+ 'stateless');
29
+ }
30
+ connect() {
31
+ return this.connection.connect();
32
+ }
33
+ getBaseUrl() {
34
+ return this.connection.getBaseUrl();
35
+ }
36
+ getSessionId() {
37
+ return this.connection.getSessionId();
38
+ }
39
+ setSessionType(type) {
40
+ this.session = type;
41
+ }
42
+ getSessionType() {
43
+ return this.session;
44
+ }
45
+ makeAdtRequest(request) {
46
+ if (this.settlementFailure)
47
+ return Promise.reject(this.settlementFailure.error);
48
+ const headers = { ...request.headers };
49
+ const stateful = this.session === 'stateful' ||
50
+ Object.entries(headers).some(([key, value]) => key.toLowerCase() === 'x-sap-adt-sessiontype' && value === 'stateful');
51
+ // Members restore their mode only after the deferred answer. Scope an
52
+ // explicit switch to this recording so neighbouring members cannot inherit it.
53
+ this.session = this.defaultSession;
54
+ if (stateful)
55
+ headers['X-sap-adt-sessiontype'] = 'stateful';
56
+ return new Promise((resolve, reject) => {
57
+ this.queue.push({
58
+ request: { ...request, headers },
59
+ stateful,
60
+ resolve,
61
+ reject,
62
+ });
63
+ });
64
+ }
65
+ envelopeKey(part) {
66
+ if (!part.stateful)
67
+ return 'stateless';
68
+ if (this.options.endpoint === 'debugger')
69
+ return 'stateful';
70
+ const action = new URL(part.request.url, 'https://batch.invalid').searchParams.get('_action') ??
71
+ new URLSearchParams(part.request.params).get('_action');
72
+ if (action === 'LOCK')
73
+ return 'lock';
74
+ if (action === 'UNLOCK')
75
+ return 'unlock';
76
+ // Communication members currently use stateful mode only for LOCK/UNLOCK.
77
+ // Keep any future other stateful requests in their own consecutive group.
78
+ return 'stateful';
79
+ }
80
+ /** Empty queues return a synthetic 204, data '', without network traffic. */
81
+ async execute() {
82
+ if (this.executing)
83
+ throw new Error('An ADT batch execute is already in progress');
84
+ const pending = this.queue;
85
+ this.queue = [];
86
+ if (!pending.length)
87
+ return { status: 204, statusText: 'Empty batch', headers: {}, data: '' };
88
+ this.executing = true;
89
+ const previous = this.wrappedSession();
90
+ let active = [];
91
+ try {
92
+ let response;
93
+ for (let envelope = 0;; envelope++) {
94
+ if (envelope === 100)
95
+ throw new Error('ADT batch exceeded 100 settlement envelopes');
96
+ const key = this.envelopeKey(pending[0]);
97
+ const nextMode = pending.findIndex((part) => this.envelopeKey(part) !== key);
98
+ active = pending.splice(0, nextMode < 0 ? pending.length : nextMode);
99
+ const payload = (0, wire_1.buildBatchPayload)(active.map((part) => (0, wire_1.innerRequest)(part.request)));
100
+ this.connection.setSessionType(active[0].stateful ? 'stateful' : 'stateless');
101
+ this.options.logger?.debug('Executing ADT batch', {
102
+ endpoint: this.options.endpoint,
103
+ parts: active.length,
104
+ });
105
+ response = await this.connection.makeAdtRequest({
106
+ url: objects_1.BATCH[this.options.endpoint],
107
+ method: 'POST',
108
+ timeout: 0,
109
+ data: payload.body,
110
+ headers: {
111
+ 'Content-Type': `multipart/mixed; boundary=${payload.boundary}`,
112
+ Accept: 'multipart/mixed',
113
+ },
114
+ });
115
+ const parts = (0, wire_1.parseBatchResponse)(response);
116
+ for (const [index, part] of active.entries()) {
117
+ const answer = parts[index];
118
+ if (!answer)
119
+ part.reject(new Error(`ADT batch response part count mismatch: expected ${active.length}, received ${parts.length}; missing part ${index + 1}`));
120
+ else if (answer.status >= 200 && answer.status < 300)
121
+ part.resolve(answer);
122
+ else
123
+ part.reject(Object.assign(new Error(`Request failed with status code ${answer.status}`), { response: answer }));
124
+ }
125
+ if (parts.length !== active.length)
126
+ throw new Error(`ADT batch response part count mismatch: expected ${active.length}, received ${parts.length}`);
127
+ active = [];
128
+ // Let negotiation and member continuations record their follow-up calls.
129
+ await new Promise((resolve) => setImmediate(resolve));
130
+ pending.push(...this.queue.splice(0));
131
+ if (!pending.length)
132
+ return response;
133
+ }
134
+ }
135
+ catch (error) {
136
+ const unsentError = new Error('ADT batch request not sent because an earlier batch envelope failed', { cause: error });
137
+ this.settlementFailure = { error: unsentError };
138
+ for (const part of active)
139
+ part.reject(error);
140
+ for (const part of pending)
141
+ part.reject(unsentError);
142
+ await new Promise((resolve) => setImmediate(resolve));
143
+ for (const part of this.queue.splice(0))
144
+ part.reject(unsentError);
145
+ await new Promise((resolve) => setImmediate(resolve));
146
+ throw error;
147
+ }
148
+ finally {
149
+ this.connection.setSessionType(previous);
150
+ this.executing = false;
151
+ this.settlementFailure = undefined;
152
+ }
153
+ }
154
+ }
155
+ exports.AdtBatchConnection = AdtBatchConnection;
@@ -0,0 +1,2 @@
1
+ export { AdtBatchConnection } from './AdtBatchConnection';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdtBatchConnection = void 0;
4
+ var AdtBatchConnection_1 = require("./AdtBatchConnection");
5
+ Object.defineProperty(exports, "AdtBatchConnection", { enumerable: true, get: function () { return AdtBatchConnection_1.AdtBatchConnection; } });
@@ -0,0 +1,10 @@
1
+ import type { IAbapRequestOptions, IAdtWireResponse } from '@mcp-abap-adt/interfaces-adt-connection';
2
+ export declare const createBatchBoundary: () => string;
3
+ export declare const createRequestId: () => string;
4
+ export declare function buildBatchPayload(requests: readonly string[], boundary?: string): {
5
+ boundary: string;
6
+ body: string;
7
+ };
8
+ export declare function innerRequest(request: IAbapRequestOptions): string;
9
+ export declare function parseBatchResponse(response: IAdtWireResponse): IAdtWireResponse[];
10
+ //# sourceMappingURL=wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/batch/wire.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,yCAAyC,CAAC;AAEjD,eAAO,MAAM,mBAAmB,QAAO,MAAiC,CAAC;AACzE,eAAO,MAAM,eAAe,QAAO,MAAwC,CAAC;AAE5E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,SAAwB,GAC/B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWpC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAqBjE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,EAAE,CAyDpB"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRequestId = exports.createBatchBoundary = void 0;
4
+ exports.buildBatchPayload = buildBatchPayload;
5
+ exports.innerRequest = innerRequest;
6
+ exports.parseBatchResponse = parseBatchResponse;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const createBatchBoundary = () => `batch_${(0, node_crypto_1.randomUUID)()}`;
9
+ exports.createBatchBoundary = createBatchBoundary;
10
+ const createRequestId = () => (0, node_crypto_1.randomUUID)().replace(/-/g, '');
11
+ exports.createRequestId = createRequestId;
12
+ function buildBatchPayload(requests, boundary = (0, exports.createBatchBoundary)()) {
13
+ return {
14
+ boundary,
15
+ body: requests
16
+ .map((request) => `--${boundary}\r\nContent-Type: application/http\r\ncontent-transfer-encoding: binary\r\n\r\n${request}`)
17
+ .join('') + `\r\n--${boundary}--\r\n`,
18
+ };
19
+ }
20
+ function innerRequest(request) {
21
+ const headers = { ...request.headers };
22
+ // `data: null` is how a member says "no body" (lock, unlock): it must not
23
+ // become the four characters "null". Sent that way, every PUT under those
24
+ // locks was refused 423 "invalid lock handle" (on an on-premise system, 2026-10-16).
25
+ const hasBody = request.data !== undefined && request.data !== null;
26
+ const body = hasBody ? String(request.data) : '';
27
+ if (hasBody) {
28
+ for (const key of Object.keys(headers))
29
+ if (key.toLowerCase() === 'content-length')
30
+ delete headers[key];
31
+ headers['Content-Length'] = String(Buffer.byteLength(body));
32
+ }
33
+ const params = request.params
34
+ ? new URLSearchParams(request.params).toString()
35
+ : '';
36
+ const url = request.url +
37
+ (params ? `${request.url.includes('?') ? '&' : '?'}${params}` : '');
38
+ return `${request.method} ${url} HTTP/1.1\r\n${Object.entries(headers)
39
+ .map(([key, value]) => `${key}: ${value}\r\n`)
40
+ .join('')}\r\n${body}\r\n`;
41
+ }
42
+ function parseBatchResponse(response) {
43
+ const contentType = Object.entries(response.headers).find(([key]) => key.toLowerCase() === 'content-type')?.[1];
44
+ const boundary = /boundary=(?:"([^"]+)"|([^;\s]+))/i.exec(String(contentType));
45
+ if (!boundary)
46
+ throw new Error('Invalid ADT batch response: missing multipart boundary');
47
+ const escaped = (boundary[1] ?? boundary[2]).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
48
+ // Only complete delimiter lines count; boundary-like body text is payload.
49
+ const delimiter = new RegExp(`(?:^|\\r?\\n)--${escaped}(--)?[ \t]*(?:\\r?\\n|$)`, 'g');
50
+ const body = String(response.data);
51
+ const chunks = [];
52
+ let start;
53
+ for (const match of body.matchAll(delimiter)) {
54
+ if (start !== undefined)
55
+ chunks.push(body.slice(start, match.index));
56
+ if (match[1])
57
+ break;
58
+ start = match.index + match[0].length;
59
+ }
60
+ return chunks.map((part) => {
61
+ const match = /(?:^|\r?\n)HTTP\/1\.\d\s+(\d{3})\s*([^\r\n]*)\r?\n/.exec(part);
62
+ if (!match || match.index === undefined)
63
+ throw new Error('Invalid ADT batch response: missing inner HTTP status');
64
+ const rest = part.slice(match.index + match[0].length);
65
+ // A bodyless answer (an UNLOCK's 200) ends right after its headers: the
66
+ // empty line's last CRLF belongs to the next delimiter (RFC 2046), so the
67
+ // part holds one line break, not two. Headers then run to the end.
68
+ // Immediately after the status line, one blank line means no headers.
69
+ const found = /^(?:\r?\n)|\r?\n\r?\n/.exec(rest);
70
+ const split = found && found.index !== undefined
71
+ ? { index: found.index, length: found[0].length }
72
+ : { index: rest.length, length: 0 };
73
+ const headers = {};
74
+ for (const line of rest.slice(0, split.index).split(/\r?\n/)) {
75
+ const colon = line.indexOf(':');
76
+ if (colon > 0)
77
+ headers[line.slice(0, colon).toLowerCase()] = line
78
+ .slice(colon + 1)
79
+ .trim();
80
+ }
81
+ return {
82
+ status: Number(match[1]),
83
+ statusText: match[2].trim(),
84
+ headers,
85
+ data: rest.slice(split.index + split.length),
86
+ };
87
+ });
88
+ }
@@ -12,7 +12,7 @@
12
12
  * Each factory method returns an IAdtObject instance that can be used
13
13
  * to perform operations on a specific object type.
14
14
  */
15
- import type { IAdtActivatable, IAdtCheckable, IAdtClientOptions, IAdtContentTypes, IAdtCreatable, IAdtDataPreview, IAdtDeletable, IAdtDiscovery, IAdtGroupLifecycle, IAdtInformationSystem, IAdtLockable, IAdtMetadataReadable, IAdtMetadataUpdatable, IAdtObjectAccess, IAdtReadable, IAdtRepositoryStructure, IAdtRequest, IAdtServiceBindingTypes, IAdtServiceGroupReadable, IAdtSystemContext, IAdtTransportAware, IAdtTransportMoveObjects, IAdtTransportObjectActions, IAdtTransportSearchConfigurations, IAdtTransportSortAndCompress, IAdtUpdatable, IAdtValidatable, IAdtVersionable, ICdsTestDoubleCheckable, IFeatureToggleObject, IIncludeConfig, IServiceBindingConfig } from '@mcp-abap-adt/interfaces-adt';
15
+ import type { IAdtActivatable, IAdtCheckable, IAdtClientOptions, IAdtContentTypes, IAdtCreatable, IAdtDataPreview, IAdtDeletable, IAdtDiscovery, IAdtEnhancementHost, IAdtGroupLifecycle, IAdtIncludeEnhancementHost, IAdtInformationSystem, IAdtLockable, IAdtMetadataReadable, IAdtMetadataUpdatable, IAdtObjectAccess, IAdtReadable, IAdtRepositoryStructure, IAdtRequest, IAdtServiceBindingTypes, IAdtServiceGroupReadable, IAdtSystemContext, IAdtTransportAware, IAdtTransportMoveObjects, IAdtTransportObjectActions, IAdtTransportSearchConfigurations, IAdtTransportSortAndCompress, IAdtUpdatable, IAdtValidatable, IAdtVersionable, ICdsTestDoubleCheckable, IFeatureToggleObject, IIncludeConfig, IServiceBindingConfig } from '@mcp-abap-adt/interfaces-adt';
16
16
  import type { IAbapConnection } from '@mcp-abap-adt/interfaces-adt-connection';
17
17
  import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
18
18
  import { accessControlDocuments, type IAccessControlConfig, type IAccessControlResults } from '../core/accessControl';
@@ -60,9 +60,9 @@ import { type ITransportConfig, type ITransportResults, transportDocuments } fro
60
60
  * disagreement is no longer expressible. `capabilities/shape.ts` checks these
61
61
  * against the manifest.
62
62
  */
63
- export type IClassContract<R extends IClassResults> = IAdtCreatable<IClassConfig, ReturnType<R['created']>> & IAdtReadable<IClassConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IClassConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IClassConfig>, ReturnType<R['updated']>> & IAdtDeletable<IClassConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IClassConfig, ReturnType<R['validation']>> & IAdtCheckable<IClassConfig, ReturnType<R['check']>> & IAdtActivatable<IClassConfig, ReturnType<R['activation']>> & IAdtLockable<IClassConfig> & IAdtTransportAware<IClassConfig, string> & IAdtVersionable<IClassConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
64
- export type IProgramContract<R extends IProgramResults> = IAdtCreatable<IProgramConfig, ReturnType<R['created']>> & IAdtReadable<IProgramConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IProgramConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IProgramConfig>, ReturnType<R['updated']>> & IAdtDeletable<IProgramConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IProgramConfig, ReturnType<R['validation']>> & IAdtCheckable<IProgramConfig, ReturnType<R['check']>> & IAdtActivatable<IProgramConfig, ReturnType<R['activation']>> & IAdtLockable<IProgramConfig> & IAdtTransportAware<IProgramConfig, ReturnType<R['transport']>> & IAdtVersionable<IProgramConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
65
- export type IIncludeContract<R extends IIncludeResults> = IAdtCreatable<IIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IIncludeConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IIncludeConfig>, ReturnType<R['updated']>> & IAdtDeletable<IIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IIncludeConfig, ReturnType<R['validation']>> & IAdtActivatable<IIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IIncludeConfig>;
63
+ export type IClassContract<R extends IClassResults> = IAdtCreatable<IClassConfig, ReturnType<R['created']>> & IAdtReadable<IClassConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IClassConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IClassConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IClassConfig>, ReturnType<R['updated']>> & IAdtDeletable<IClassConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IClassConfig, ReturnType<R['validation']>> & IAdtCheckable<IClassConfig, ReturnType<R['check']>> & IAdtActivatable<IClassConfig, ReturnType<R['activation']>> & IAdtLockable<IClassConfig> & IAdtTransportAware<IClassConfig, string> & IAdtVersionable<IClassConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
64
+ export type IProgramContract<R extends IProgramResults> = IAdtCreatable<IProgramConfig, ReturnType<R['created']>> & IAdtReadable<IProgramConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IProgramConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IProgramConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IProgramConfig>, ReturnType<R['updated']>> & IAdtDeletable<IProgramConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IProgramConfig, ReturnType<R['validation']>> & IAdtCheckable<IProgramConfig, ReturnType<R['check']>> & IAdtActivatable<IProgramConfig, ReturnType<R['activation']>> & IAdtLockable<IProgramConfig> & IAdtTransportAware<IProgramConfig, ReturnType<R['transport']>> & IAdtVersionable<IProgramConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
65
+ export type IIncludeContract<R extends IIncludeResults> = IAdtCreatable<IIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IIncludeConfig, ReturnType<R['metadata']>> & IAdtIncludeEnhancementHost<IIncludeConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IIncludeConfig>, ReturnType<R['updated']>> & IAdtDeletable<IIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IIncludeConfig, ReturnType<R['validation']>> & IAdtActivatable<IIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IIncludeConfig>;
66
66
  export type IInterfaceContract<R extends IInterfaceResults> = IAdtCreatable<IInterfaceConfig, ReturnType<R['created']>> & IAdtReadable<IInterfaceConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IInterfaceConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IInterfaceConfig>, ReturnType<R['updated']>> & IAdtDeletable<IInterfaceConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IInterfaceConfig, ReturnType<R['validation']>> & IAdtCheckable<IInterfaceConfig, ReturnType<R['check']>> & IAdtActivatable<IInterfaceConfig, ReturnType<R['activation']>> & IAdtLockable<IInterfaceConfig> & IAdtTransportAware<IInterfaceConfig, ReturnType<R['transport']>> & IAdtVersionable<IInterfaceConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
67
67
  export type IDomainContract<R extends IDomainResults> = IAdtCreatable<IDomainConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IDomainConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IDomainConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IDomainConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDomainConfig, ReturnType<R['validation']>> & IAdtCheckable<IDomainConfig, ReturnType<R['check']>> & IAdtActivatable<IDomainConfig, ReturnType<R['activation']>> & IAdtLockable<IDomainConfig> & IAdtTransportAware<IDomainConfig, ReturnType<R['transport']>>;
68
68
  export type IDataElementContract<R extends IDataElementResults> = IAdtCreatable<IDataElementConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IDataElementConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IDataElementConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IDataElementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDataElementConfig, ReturnType<R['validation']>> & IAdtCheckable<IDataElementConfig, ReturnType<R['check']>> & IAdtActivatable<IDataElementConfig, ReturnType<R['activation']>> & IAdtLockable<IDataElementConfig> & IAdtTransportAware<IDataElementConfig, ReturnType<R['transport']>>;
@@ -71,7 +71,7 @@ export type IStructureContract<R extends IStructureResults> = IAdtCreatable<IStr
71
71
  export type ITableContract<R extends ITableResults> = IAdtCreatable<ITableConfig, ReturnType<R['created']>> & IAdtReadable<ITableConfig, ReturnType<R['source']>> & IAdtMetadataReadable<ITableConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<ITableConfig>, ReturnType<R['updated']>> & IAdtDeletable<ITableConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<ITableConfig, ReturnType<R['validation']>> & IAdtCheckable<ITableConfig, ReturnType<R['check']>> & IAdtActivatable<ITableConfig, ReturnType<R['activation']>> & IAdtLockable<ITableConfig> & IAdtTransportAware<ITableConfig, ReturnType<R['transport']>> & IAdtVersionable<ITableConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
72
72
  export type ITableTypeContract<R extends ITableTypeResults> = IAdtCreatable<ITableTypeConfig, ReturnType<R['created']>> & IAdtMetadataReadable<ITableTypeConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<ITableTypeConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<ITableTypeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<ITableTypeConfig, ReturnType<R['validation']>> & IAdtCheckable<ITableTypeConfig, ReturnType<R['check']>> & IAdtActivatable<ITableTypeConfig, ReturnType<R['activation']>> & IAdtLockable<ITableTypeConfig> & IAdtTransportAware<ITableTypeConfig, ReturnType<R['transport']>> & IAdtVersionable<ITableTypeConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
73
73
  export type IDdlContract<R extends IDdlResults> = IAdtCreatable<IDdlConfig, ReturnType<R['created']>> & IAdtReadable<IDdlConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IDdlConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IDdlConfig>, ReturnType<R['updated']>> & IAdtDeletable<IDdlConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDdlConfig, ReturnType<R['validation']>> & IAdtCheckable<IDdlConfig, ReturnType<R['check']>> & IAdtActivatable<IDdlConfig, ReturnType<R['activation']>> & IAdtLockable<IDdlConfig> & IAdtTransportAware<IDdlConfig, ReturnType<R['transport']>> & IAdtVersionable<IDdlConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>> & ICdsTestDoubleCheckable<ReturnType<R['testDoubles']>>;
74
- export type IFunctionGroupContract<R extends IFunctionGroupResults> = IAdtCreatable<IFunctionGroupConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IFunctionGroupConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IFunctionGroupConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionGroupConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionGroupConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionGroupConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionGroupConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionGroupConfig> & IAdtTransportAware<IFunctionGroupConfig, ReturnType<R['transport']>>;
74
+ export type IFunctionGroupContract<R extends IFunctionGroupResults> = IAdtCreatable<IFunctionGroupConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IFunctionGroupConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IFunctionGroupConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtMetadataUpdatable<Partial<IFunctionGroupConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionGroupConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionGroupConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionGroupConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionGroupConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionGroupConfig> & IAdtTransportAware<IFunctionGroupConfig, ReturnType<R['transport']>>;
75
75
  export type IFunctionModuleContract<R extends IFunctionModuleResults> = IAdtCreatable<IFunctionModuleConfig, ReturnType<R['created']>> & IAdtReadable<IFunctionModuleConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IFunctionModuleConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IFunctionModuleConfig>, ReturnType<R['updated']>> & IAdtDeletable<IFunctionModuleConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionModuleConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionModuleConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionModuleConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionModuleConfig> & IAdtTransportAware<IFunctionModuleConfig, ReturnType<R['transport']>> & IAdtVersionable<IFunctionModuleConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
76
76
  export type IFunctionIncludeContract<R extends IFunctionIncludeResults> = IAdtCreatable<IFunctionIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IFunctionIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IFunctionIncludeConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IFunctionIncludeConfig>, ReturnType<R['updated']>> & IAdtMetadataUpdatable<Partial<IFunctionIncludeConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionIncludeConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionIncludeConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionIncludeConfig> & IAdtVersionable<IFunctionIncludeConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
77
77
  export type IPackageContract<R extends IPackageResults> = IAdtCreatable<IPackageConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IPackageConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IPackageConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IPackageConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IPackageConfig, ReturnType<R['validation']>> & IAdtCheckable<IPackageConfig, ReturnType<R['check']>> & IAdtLockable<IPackageConfig> & IAdtTransportAware<IPackageConfig, ReturnType<R['transport']>>;
@@ -109,7 +109,7 @@ export type IAppendStructureContract<R extends IAppendStructureResults> = IAdtCr
109
109
  export type IBehaviorDefinitionContract<R extends IBehaviorDefinitionResults> = IAdtCreatable<IBehaviorDefinitionConfig, ReturnType<R['created']>> & IAdtReadable<IBehaviorDefinitionConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IBehaviorDefinitionConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IBehaviorDefinitionConfig>, ReturnType<R['updated']>> & IAdtDeletable<IBehaviorDefinitionConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IBehaviorDefinitionConfig, ReturnType<R['validation']>> & IAdtCheckable<IBehaviorDefinitionConfig, ReturnType<R['check']>> & IAdtActivatable<IBehaviorDefinitionConfig, ReturnType<R['activation']>> & IAdtLockable<IBehaviorDefinitionConfig> & IAdtTransportAware<IBehaviorDefinitionConfig, ReturnType<R['transport']>> & IAdtVersionable<IBehaviorDefinitionConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
110
110
  export type IBehaviorImplementationContract<R extends IClassResults> = IAdtCreatable<IBehaviorImplementationConfig, ReturnType<R['created']>> & IAdtReadable<IBehaviorImplementationConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IBehaviorImplementationConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IBehaviorImplementationConfig>, ReturnType<R['updated']>> & IAdtDeletable<IBehaviorImplementationConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IBehaviorImplementationConfig, ReturnType<R['validation']>> & IAdtCheckable<IBehaviorImplementationConfig, ReturnType<R['check']>> & IAdtActivatable<IBehaviorImplementationConfig, ReturnType<R['activation']>> & IAdtLockable<IBehaviorImplementationConfig> & IAdtTransportAware<IBehaviorImplementationConfig, string> & IAdtVersionable<IBehaviorImplementationConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
111
111
  export type IMetadataExtensionContract<R extends IMetadataExtensionResults> = IAdtCreatable<IMetadataExtensionConfig, ReturnType<R['created']>> & IAdtReadable<IMetadataExtensionConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IMetadataExtensionConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IMetadataExtensionConfig>, ReturnType<R['updated']>> & IAdtDeletable<IMetadataExtensionConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IMetadataExtensionConfig, ReturnType<R['validation']>> & IAdtCheckable<IMetadataExtensionConfig, ReturnType<R['check']>> & IAdtActivatable<IMetadataExtensionConfig, ReturnType<R['activation']>> & IAdtLockable<IMetadataExtensionConfig> & IAdtTransportAware<IMetadataExtensionConfig, ReturnType<R['transport']>> & IAdtVersionable<IMetadataExtensionConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
112
- export type IEnhancementContract<R extends IEnhancementResults> = IAdtCreatable<IEnhancementConfig, ReturnType<R['created']>> & IAdtReadable<IEnhancementConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IEnhancementConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IEnhancementConfig>, ReturnType<R['updated']>> & IAdtDeletable<IEnhancementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IEnhancementConfig, ReturnType<R['validation']>> & IAdtCheckable<IEnhancementConfig, ReturnType<R['check']>> & IAdtActivatable<IEnhancementConfig, ReturnType<R['activation']>> & IAdtLockable<IEnhancementConfig> & IAdtTransportAware<IEnhancementConfig, ReturnType<R['transport']>> & IAdtVersionable<IEnhancementConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
112
+ export type IEnhancementContract<R extends IEnhancementResults> = IAdtCreatable<IEnhancementConfig, ReturnType<R['created']>> & IAdtReadable<IEnhancementConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IEnhancementConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<IEnhancementConfig, ReturnType<R['metadataUpdated']>> & IAdtUpdatable<Partial<IEnhancementConfig>, ReturnType<R['updated']>> & IAdtDeletable<IEnhancementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IEnhancementConfig, ReturnType<R['validation']>> & IAdtCheckable<IEnhancementConfig, ReturnType<R['check']>> & IAdtActivatable<IEnhancementConfig, ReturnType<R['activation']>> & IAdtLockable<IEnhancementConfig> & IAdtTransportAware<IEnhancementConfig, ReturnType<R['transport']>> & IAdtVersionable<IEnhancementConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
113
113
  /**
114
114
  * `IAdtTransportObjectActions`, `IAbapObjectEntry` and
115
115
  * `IAdtTransportSearchConfigurations` are imported, not declared.