@mcp-abap-adt/adt-clients 12.0.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@ TypeScript clients for SAP ABAP Development Tools (ADT).
10
10
  - `AdtClient` – high-level CRUD API with automatic operation chains
11
11
  - `AdtClientBatch` – batch mode: multiple read operations in a single HTTP round-trip
12
12
  - `AdtExecutor` – execution API via `IExecutor` contracts (class/program, with profiling)
13
- - `AdtRuntimeClient` – stable runtime operations (ABAP debugger, traces, logs, dumps)
13
+ - `AdtRuntimeClient` – stable runtime operations (ABAP debugger, traces, logs, dumps, ATC check runs)
14
14
  - `AdtRuntimeClientBatch` – batch mode for runtime operations
15
15
  - `AdtRuntimeClientExperimental` – runtime APIs in progress (for example AMDP debugger)
16
16
  - `AdtClientsWS` – realtime WebSocket facade for event-driven workflows
@@ -68,7 +68,7 @@ This package is responsible for:
68
68
 
69
69
  This package interacts with external packages **ONLY through interfaces**:
70
70
 
71
- - **`@mcp-abap-adt/interfaces`** (`^14.1.0`): The contract package — the single definition site for every public type this package exposes (see [Type System](#type-system)). This is the one runtime dependency whose *types* are part of this package's public API.
71
+ - **`@mcp-abap-adt/interfaces`** (`^17.1.0`): The contract package — the single definition site for every public type this package exposes (see [Type System](#type-system)). This is the one runtime dependency whose *types* are part of this package's public API.
72
72
  - **`@mcp-abap-adt/connection`**: Uses the `IAbapConnection` interface for HTTP requests — does not know about the concrete connection implementation. It is a **dev** dependency; consumers supply their own implementation.
73
73
  - **No other direct package dependencies**: all remaining interactions happen through well-defined interfaces
74
74
 
@@ -96,8 +96,9 @@ npm install @mcp-abap-adt/adt-clients
96
96
  - Example: `await client.getClass().create({...}, { activateOnCreate: true })`
97
97
 
98
98
  2. **AdtRuntimeClient**
99
- - Stable runtime operations for ABAP debugging, traces, dumps, logs, feeds, and more
100
- - Factory accessors: `getProfiler()`, `getCrossTrace()`, `getSt05Trace()`, `getDebugger()`, `getApplicationLog()`, `getAtcLog()`, `getDdicActivation()`, `getDumps()`, `getFeeds()`, `getSystemMessages()`, `getGatewayErrorLog()`
99
+ - Stable runtime operations for ABAP debugging, traces, dumps, logs, feeds, ATC check runs, and more
100
+ - Factory accessors: `getProfiler()`, `getCrossTrace()`, `getSt05Trace()`, `getDebugger()`, `getApplicationLog()`, `getAtc()`, `getAtcLog()`, `getDdicActivation()`, `getDumps()`, `getFeeds()`, `getSystemMessages()`, `getGatewayErrorLog()`
101
+ - `getAtc()` runs ATC checks; `getAtcLog()` reads the execution and check-failure logs. Same subject, different resources — see [ATC check runs](docs/usage/CLIENT_API_REFERENCE.md#atc-check-runs)
101
102
  - Example: `await runtimeClient.getDebugger().getAbap().launch()`
102
103
 
103
104
  3. **AdtExecutor**
@@ -583,7 +584,7 @@ everything else is not.
583
584
 
584
585
  ### Single Definition Site: `@mcp-abap-adt/interfaces`
585
586
 
586
- Since **7.5.0**, every public type is **defined once**, in `@mcp-abap-adt/interfaces` (`^14.1.0`). This package declares no copies of its own — the low-level `*Params` interfaces, every `IXxxConfig`/`IXxxState` pair, the option/result types and the cross-cutting shared types all live there.
587
+ Since **7.5.0**, every public type is **defined once**, in `@mcp-abap-adt/interfaces` (`^17.1.0`). This package declares no copies of its own — the low-level `*Params` interfaces, every `IXxxConfig`/`IXxxState` pair, the option/result types and the cross-cutting shared types all live there.
587
588
 
588
589
  **Import them from the package that owns them:**
589
590
 
@@ -601,7 +602,7 @@ What this package exports is what it owns: the clients, the handler classes, the
601
602
 
602
603
  ### Honest capability types (since 8.0.0)
603
604
 
604
- `@mcp-abap-adt/interfaces` (`^17.0.0`) splits the fat `IAdtObject` contract into **capability atoms** — `IAdtCreatable`, `IAdtReadable`, `IAdtUpdatable`, `IAdtDeletable` (and `IAdtModifiable`/`IAdtCrud`, their composites), `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware`, `IAdtSearchable` — each covering one slice of the lifecycle, plus one named composite, `IAdtSourceObject`. There is no composite for "everything but versions": a vocabulary states what an object supports, never what it lacks. Since interfaces 13.0.0 `IAdtObject` is itself assembled from the atoms, so the atoms are the definitions and the composite cannot drift from them.
605
+ `@mcp-abap-adt/interfaces` (`^17.1.0`) splits the fat `IAdtObject` contract into **capability atoms** — `IAdtCreatable`, `IAdtReadable`, `IAdtUpdatable`, `IAdtDeletable` (and `IAdtModifiable`/`IAdtCrud`, their composites), `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware`, `IAdtSearchable` — each covering one slice of the lifecycle, plus one named composite, `IAdtSourceObject`. There is no composite for "everything but versions": a vocabulary states what an object supports, never what it lacks. Since interfaces 13.0.0 `IAdtObject` is itself assembled from the atoms, so the atoms are the definitions and the composite cannot drift from them.
605
606
 
606
607
  Since **8.0.0**, each handler `implements` only the atoms it genuinely supports, and `AdtClient.getXxx()` (and `AdtClientBatch.getXxx()`) return types are narrowed to match:
607
608
 
@@ -618,7 +619,9 @@ Since **9.0.0** no accessor returns the wide type, and since **12.0.0** none ret
618
619
 
619
620
  `getUnitTest()` and `getCdsUnitTest()` changed meaning rather than shape: a unit test's subject is the container class and its `testclasses` include, so `create()` creates that class and writes the tests into it, `update`/`delete`/`read` manage the include, `lock`/`unlock` take the container's lock, and running is `IAdtRunnable` — one method, with `getStatus`/`getResult` on `ITestRunInformation` because asking about a run is not running it.
620
621
 
621
- **A guard keeps this true.** `src/__tests__/unit/capabilities/` compares all 36 factory return types against the 10 atoms in both directions at compile time, calls every method of every declared capability against a recording connection to check it issues the request its capability names, and fails if a new factory appears without an entry. Adding a throwing method back to a narrowed handler stops compiling.
622
+ The runtime client narrows the same way. `AdtRuntimeClient.getAtc()` returns `IAdtRunnable & IAtcRunStatusReadable & IAtcFindings` — a check run is run and then read, never created, locked, activated or versioned, and the type says so rather than offering the rest and throwing.
623
+
624
+ **A guard keeps this true.** `src/__tests__/unit/capabilities/` compares all 36 factory return types against the 10 atoms in both directions at compile time, calls every method of every declared capability against a recording connection to check it issues the request its capability names, and fails if a new factory appears without an entry. Adding a throwing method back to a narrowed handler stops compiling. The guard walks `AdtClient` and `AdtClientLegacy` only; the runtime accessors are pinned by `src/__tests__/unit/clients/AdtRuntimeClient.factory.test.ts`.
622
625
 
623
626
  One category deliberately remains local, because it is code, not contract:
624
627
 
@@ -7,6 +7,7 @@
7
7
  * - getSt05Trace() — ST05 performance traces
8
8
  * - getDebugger() — Composite debugger (ABAP, AMDP, memory snapshots)
9
9
  * - getApplicationLog() — Application log analysis
10
+ * - getAtc() — ATC check runs: start one, poll it, read the worklist
10
11
  * - getAtcLog() — ATC check failure and execution logs
11
12
  * - getDdicActivation() — DDIC activation graph
12
13
  * - getDumps() — Runtime dump analysis
@@ -30,10 +31,13 @@
30
31
  *
31
32
  * // Logs
32
33
  * const appLog = await client.getApplicationLog().getObject('Z_MY_LOG');
34
+ * const started = await client.getAtc().run({
35
+ * objects: [{ objectType: 'class', objectName: 'ZCL_MY_CLASS' }],
36
+ * });
33
37
  * const atcLogs = await client.getAtcLog().getCheckFailureLogs();
34
38
  * ```
35
39
  */
36
- import type { IAbapConnection, IApplicationLog, IAtcLog, ICrossTrace, IDdicActivation, IDebugger, IFeedRepository, IGatewayErrorLog, ILogger, IProfiler, IRuntimeDumps, ISt05Trace, ISystemMessages } from '@mcp-abap-adt/interfaces';
40
+ import type { IAbapConnection, IAdtRunnable, IApplicationLog, IAtcFindings, IAtcLog, IAtcRunOptions, IAtcRunResult, IAtcRunStatusReadable, IAtcRunTarget, ICrossTrace, IDdicActivation, IDebugger, IFeedRepository, IGatewayErrorLog, ILogger, IProfiler, IRuntimeDumps, ISt05Trace, ISystemMessages } from '@mcp-abap-adt/interfaces';
37
41
  export declare class AdtRuntimeClient {
38
42
  protected readonly connection: IAbapConnection;
39
43
  protected readonly logger: ILogger;
@@ -42,6 +46,7 @@ export declare class AdtRuntimeClient {
42
46
  private _st05Trace?;
43
47
  private _debugger?;
44
48
  private _applicationLog?;
49
+ private _atc?;
45
50
  private _atcLog?;
46
51
  private _ddicActivation?;
47
52
  private _dumps?;
@@ -56,6 +61,13 @@ export declare class AdtRuntimeClient {
56
61
  getSt05Trace(): ISt05Trace;
57
62
  getDebugger(): IDebugger;
58
63
  getApplicationLog(): IApplicationLog;
64
+ /**
65
+ * ATC check runs.
66
+ *
67
+ * The intersection is spelled here rather than given a name: one getter has
68
+ * this set, and a composite earns a name when more than one handler does.
69
+ */
70
+ getAtc(): IAdtRunnable<IAtcRunTarget, IAtcRunResult, IAtcRunOptions> & IAtcRunStatusReadable & IAtcFindings;
59
71
  getAtcLog(): IAtcLog;
60
72
  getDdicActivation(): IDdicActivation;
61
73
  getDumps(): IRuntimeDumps;
@@ -1 +1 @@
1
- {"version":3,"file":"AdtRuntimeClient.d.ts","sourceRoot":"","sources":["../../src/clients/AdtRuntimeClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,OAAO,EACP,WAAW,EACX,eAAe,EACf,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAalC,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAkB;gBAGzC,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAE;IAoChD,WAAW,IAAI,SAAS;IAOxB,aAAa,IAAI,WAAW;IAO5B,YAAY,IAAI,UAAU;IAO1B,WAAW,IAAI,SAAS;IAOxB,iBAAiB,IAAI,eAAe;IAOpC,SAAS,IAAI,OAAO;IAOpB,iBAAiB,IAAI,eAAe;IAOpC,QAAQ,IAAI,aAAa;IAWzB,QAAQ,IAAI,eAAe;IAO3B,iBAAiB,IAAI,eAAe;IAOpC,kBAAkB,IAAI,gBAAgB;CAMvC"}
1
+ {"version":3,"file":"AdtRuntimeClient.d.ts","sourceRoot":"","sources":["../../src/clients/AdtRuntimeClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,WAAW,EACX,eAAe,EACf,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,OAAO,EACP,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAclC,qBAAa,gBAAgB;IAC3B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAiB;IAChC,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAkB;gBAGzC,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;KAAE;IAoChD,WAAW,IAAI,SAAS;IAOxB,aAAa,IAAI,WAAW;IAO5B,YAAY,IAAI,UAAU;IAO1B,WAAW,IAAI,SAAS;IAOxB,iBAAiB,IAAI,eAAe;IAOpC;;;;;OAKG;IACH,MAAM,IAAI,YAAY,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,GAClE,qBAAqB,GACrB,YAAY;IAOd,SAAS,IAAI,OAAO;IAOpB,iBAAiB,IAAI,eAAe;IAOpC,QAAQ,IAAI,aAAa;IAWzB,QAAQ,IAAI,eAAe;IAO3B,iBAAiB,IAAI,eAAe;IAOpC,kBAAkB,IAAI,gBAAgB;CAMvC"}
@@ -8,6 +8,7 @@
8
8
  * - getSt05Trace() — ST05 performance traces
9
9
  * - getDebugger() — Composite debugger (ABAP, AMDP, memory snapshots)
10
10
  * - getApplicationLog() — Application log analysis
11
+ * - getAtc() — ATC check runs: start one, poll it, read the worklist
11
12
  * - getAtcLog() — ATC check failure and execution logs
12
13
  * - getDdicActivation() — DDIC activation graph
13
14
  * - getDumps() — Runtime dump analysis
@@ -31,12 +32,16 @@
31
32
  *
32
33
  * // Logs
33
34
  * const appLog = await client.getApplicationLog().getObject('Z_MY_LOG');
35
+ * const started = await client.getAtc().run({
36
+ * objects: [{ objectType: 'class', objectName: 'ZCL_MY_CLASS' }],
37
+ * });
34
38
  * const atcLogs = await client.getAtcLog().getCheckFailureLogs();
35
39
  * ```
36
40
  */
37
41
  Object.defineProperty(exports, "__esModule", { value: true });
38
42
  exports.AdtRuntimeClient = void 0;
39
43
  const ApplicationLog_1 = require("../runtime/applicationLog/ApplicationLog");
44
+ const AdtAtc_1 = require("../runtime/atc/AdtAtc");
40
45
  const AtcLog_1 = require("../runtime/atc/AtcLog");
41
46
  const DdicActivation_1 = require("../runtime/ddic/DdicActivation");
42
47
  const Debugger_1 = require("../runtime/debugger/Debugger");
@@ -55,6 +60,7 @@ class AdtRuntimeClient {
55
60
  _st05Trace;
56
61
  _debugger;
57
62
  _applicationLog;
63
+ _atc;
58
64
  _atcLog;
59
65
  _ddicActivation;
60
66
  _dumps;
@@ -117,6 +123,18 @@ class AdtRuntimeClient {
117
123
  }
118
124
  return this._applicationLog;
119
125
  }
126
+ /**
127
+ * ATC check runs.
128
+ *
129
+ * The intersection is spelled here rather than given a name: one getter has
130
+ * this set, and a composite earns a name when more than one handler does.
131
+ */
132
+ getAtc() {
133
+ if (!this._atc) {
134
+ this._atc = new AdtAtc_1.AdtAtc(this.connection, this.logger);
135
+ }
136
+ return this._atc;
137
+ }
120
138
  getAtcLog() {
121
139
  if (!this._atcLog) {
122
140
  this._atcLog = new AtcLog_1.AtcLog(this.connection, this.logger);
@@ -103,4 +103,11 @@ export declare const ACCEPT_ABAPGIT_REPOS_V2 = "application/abapgit.adt.repos.v2
103
103
  export declare const CT_ABAPGIT_REPO_OBJECT_V2 = "application/abapgit.adt.repo.object.v2+xml";
104
104
  export declare const CT_ABAPGIT_EXTERNAL_REPO_INFO_REQUEST_V2 = "application/abapgit.adt.repo.info.ext.request.v2+xml";
105
105
  export declare const ACCEPT_ABAPGIT_EXTERNAL_REPO_INFO_RESPONSE_V2 = "application/abapgit.adt.repo.info.ext.response.v2+xml";
106
+ export declare const CT_ATC_WORKLIST_CREATE = "text/plain";
107
+ export declare const ACCEPT_ATC_WORKLIST_ID = "text/plain";
108
+ export declare const CT_ATC_RUN = "application/xml";
109
+ export declare const ACCEPT_ATC_RUN_RESPONSE = "application/xml";
110
+ export declare const ACCEPT_ATC_RUN_STATUS = "application/vnd.sap.adt.backgroundrun.v1+xml";
111
+ export declare const ACCEPT_ATC_WORKLIST_XML = "application/atc.worklist.v1+xml, application/vnd.sap.atc.worklist.v1+xml";
112
+ export declare const ACCEPT_ATC_CUSTOMIZING = "application/xml, application/vnd.sap.atc.customizing-v1+xml, application/vnd.sap.atc.customizing-v2+xml";
106
113
  //# sourceMappingURL=contentTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contentTypes.d.ts","sourceRoot":"","sources":["../../src/constants/contentTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contentTypes.d.ts","sourceRoot":"","sources":["../../src/constants/contentTypes.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,8 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.CT_DOMAIN = exports.ACCEPT_DOMAIN = exports.CT_TABLE_TYPE = exports.ACCEPT_TABLE_TYPE = exports.CT_TABLE = exports.ACCEPT_TABLE = exports.CT_FUNCTION_INCLUDE = exports.ACCEPT_FUNCTION_INCLUDE = exports.CT_FUNCTION_MODULE = exports.ACCEPT_FUNCTION_MODULE = exports.CT_FUNCTION_GROUP = exports.ACCEPT_FUNCTION_GROUP = exports.CT_PROGRAM = exports.ACCEPT_PROGRAM = exports.CT_INTERFACE = exports.ACCEPT_INTERFACE = exports.CT_CLASS = exports.ACCEPT_CLASS = exports.ACCEPT_DATA_PREVIEW = exports.CT_WHERE_USED_SCOPE = exports.ACCEPT_WHERE_USED_SCOPE = exports.CT_WHERE_USED_REQUEST = exports.ACCEPT_WHERE_USED_RESULT = exports.CT_VIRTUAL_FOLDERS = exports.ACCEPT_VIRTUAL_FOLDERS = exports.ACCEPT_NODE_STRUCTURE = exports.ACCEPT_DISCOVERY = exports.ACCEPT_JUNIT_RESULT = exports.ACCEPT_UNIT_TEST_RESULT = exports.ACCEPT_UNIT_TEST_STATUS = exports.CT_UNIT_TEST_RUN = exports.CT_TRANSPORT_CHECK = exports.ACCEPT_TRANSPORT_CHECK = exports.ACCEPT_TRANSPORT_CONFIGURATIONS = exports.ACCEPT_TRANSPORT_LIST = exports.ACCEPT_TRANSPORT = exports.ACCEPT_VALIDATION = exports.CT_ACTIVATION = exports.ACCEPT_ACTIVATION = exports.CT_DELETION = exports.ACCEPT_DELETION = exports.CT_DELETION_CHECK = exports.ACCEPT_DELETION_CHECK = exports.CT_CHECK_OBJECTS = exports.ACCEPT_CHECK_MESSAGES = exports.ACCEPT_LOCK = exports.CT_SOURCE = exports.ACCEPT_SOURCE_XML_FALLBACK = exports.ACCEPT_SOURCE_UTF8 = exports.ACCEPT_SOURCE = void 0;
11
- exports.ACCEPT_ABAPGIT_EXTERNAL_REPO_INFO_RESPONSE_V2 = exports.CT_ABAPGIT_EXTERNAL_REPO_INFO_REQUEST_V2 = exports.CT_ABAPGIT_REPO_OBJECT_V2 = exports.ACCEPT_ABAPGIT_REPOS_V2 = exports.CT_ABAPGIT_REPO_V4 = exports.CT_ABAPGIT_REPO_V3 = exports.MESSAGE_CLASS_UPDATE_CONTENT_TYPE = exports.ACCEPT_FEATURE_TOGGLE_SOURCE = exports.CT_FEATURE_TOGGLE_SOURCE = exports.CT_FEATURE_TOGGLE_TOGGLE_PARAMETERS = exports.CT_FEATURE_TOGGLE_CHECK_PARAMETERS = exports.ACCEPT_FEATURE_TOGGLE_CHECK_RESULT = exports.ACCEPT_FEATURE_TOGGLE_STATES = exports.CT_FEATURE_TOGGLE_METADATA = exports.ACCEPT_FEATURE_TOGGLE_METADATA = exports.ACCEPT_SYSTEM_INFO = exports.CT_TRACE_PARAMETERS = exports.ACCEPT_TRACE_CALLTREE = exports.ACCEPT_TRACE_FEED = exports.ACCEPT_TRACE_XML = exports.ACCEPT_VALIDATION_CLASS_NAME = exports.CT_ENHANCEMENT = exports.ACCEPT_ENHANCEMENT = exports.CT_TRANSFORMATION = exports.ACCEPT_TRANSFORMATION = exports.CT_ACCESS_CONTROL = exports.CT_METADATA_EXTENSION = exports.CT_SERVICE_DEFINITION = exports.CT_BEHAVIOR_DEFINITION = exports.CT_PACKAGE = exports.ACCEPT_PACKAGE = exports.ACCEPT_APPEND_STRUCTURE = exports.CT_SCALAR_FUNCTION_IMPL_SOURCE = exports.ACCEPT_SCALAR_FUNCTION_IMPL_SOURCE = exports.ACCEPT_SCALAR_FUNCTION_IMPL = exports.CT_SCALAR_FUNCTION_IMPL_UPDATE = exports.CT_SCALAR_FUNCTION_IMPL = exports.CT_SCALAR_FUNCTION = exports.ACCEPT_SCALAR_FUNCTION = exports.CT_VIEW = exports.ACCEPT_VIEW_METADATA = exports.ACCEPT_VIEW = exports.CT_STRUCTURE = exports.ACCEPT_STRUCTURE = exports.CT_DATA_ELEMENT = exports.ACCEPT_DATA_ELEMENT = exports.CT_AUTHORIZATION_FIELD = exports.ACCEPT_AUTHORIZATION_FIELD = void 0;
11
+ exports.ACCEPT_ATC_WORKLIST_ID = exports.CT_ATC_WORKLIST_CREATE = exports.ACCEPT_ABAPGIT_EXTERNAL_REPO_INFO_RESPONSE_V2 = exports.CT_ABAPGIT_EXTERNAL_REPO_INFO_REQUEST_V2 = exports.CT_ABAPGIT_REPO_OBJECT_V2 = exports.ACCEPT_ABAPGIT_REPOS_V2 = exports.CT_ABAPGIT_REPO_V4 = exports.CT_ABAPGIT_REPO_V3 = exports.MESSAGE_CLASS_UPDATE_CONTENT_TYPE = exports.ACCEPT_FEATURE_TOGGLE_SOURCE = exports.CT_FEATURE_TOGGLE_SOURCE = exports.CT_FEATURE_TOGGLE_TOGGLE_PARAMETERS = exports.CT_FEATURE_TOGGLE_CHECK_PARAMETERS = exports.ACCEPT_FEATURE_TOGGLE_CHECK_RESULT = exports.ACCEPT_FEATURE_TOGGLE_STATES = exports.CT_FEATURE_TOGGLE_METADATA = exports.ACCEPT_FEATURE_TOGGLE_METADATA = exports.ACCEPT_SYSTEM_INFO = exports.CT_TRACE_PARAMETERS = exports.ACCEPT_TRACE_CALLTREE = exports.ACCEPT_TRACE_FEED = exports.ACCEPT_TRACE_XML = exports.ACCEPT_VALIDATION_CLASS_NAME = exports.CT_ENHANCEMENT = exports.ACCEPT_ENHANCEMENT = exports.CT_TRANSFORMATION = exports.ACCEPT_TRANSFORMATION = exports.CT_ACCESS_CONTROL = exports.CT_METADATA_EXTENSION = exports.CT_SERVICE_DEFINITION = exports.CT_BEHAVIOR_DEFINITION = exports.CT_PACKAGE = exports.ACCEPT_PACKAGE = exports.ACCEPT_APPEND_STRUCTURE = exports.CT_SCALAR_FUNCTION_IMPL_SOURCE = exports.ACCEPT_SCALAR_FUNCTION_IMPL_SOURCE = exports.ACCEPT_SCALAR_FUNCTION_IMPL = exports.CT_SCALAR_FUNCTION_IMPL_UPDATE = exports.CT_SCALAR_FUNCTION_IMPL = exports.CT_SCALAR_FUNCTION = exports.ACCEPT_SCALAR_FUNCTION = exports.CT_VIEW = exports.ACCEPT_VIEW_METADATA = exports.ACCEPT_VIEW = exports.CT_STRUCTURE = exports.ACCEPT_STRUCTURE = exports.CT_DATA_ELEMENT = exports.ACCEPT_DATA_ELEMENT = exports.CT_AUTHORIZATION_FIELD = exports.ACCEPT_AUTHORIZATION_FIELD = void 0;
12
+ exports.ACCEPT_ATC_CUSTOMIZING = exports.ACCEPT_ATC_WORKLIST_XML = exports.ACCEPT_ATC_RUN_STATUS = exports.ACCEPT_ATC_RUN_RESPONSE = exports.CT_ATC_RUN = void 0;
12
13
  // =============================================================================
13
14
  // Cross-cutting (shared across object types)
14
15
  // =============================================================================
@@ -166,3 +167,17 @@ exports.CT_ABAPGIT_REPO_OBJECT_V2 = 'application/abapgit.adt.repo.object.v2+xml'
166
167
  // use different media-type families (request vs response sub-path).
167
168
  exports.CT_ABAPGIT_EXTERNAL_REPO_INFO_REQUEST_V2 = 'application/abapgit.adt.repo.info.ext.request.v2+xml';
168
169
  exports.ACCEPT_ABAPGIT_EXTERNAL_REPO_INFO_RESPONSE_V2 = 'application/abapgit.adt.repo.info.ext.response.v2+xml';
170
+ // ATC (ABAP Test Cockpit) — captured against a cloud trial, not taken from
171
+ // documentation. Two of these are the resource rather than a detail: the
172
+ // worklist is created and its id read as text/plain where everything around it
173
+ // is XML, and the run resource answers only to the backgroundrun type. A
174
+ // checkstyle Accept on the worklist is refused with 406 naming the one type it
175
+ // will serve, which is why there is no format option and no checkstyle
176
+ // constant here.
177
+ exports.CT_ATC_WORKLIST_CREATE = 'text/plain';
178
+ exports.ACCEPT_ATC_WORKLIST_ID = 'text/plain';
179
+ exports.CT_ATC_RUN = 'application/xml';
180
+ exports.ACCEPT_ATC_RUN_RESPONSE = 'application/xml';
181
+ exports.ACCEPT_ATC_RUN_STATUS = 'application/vnd.sap.adt.backgroundrun.v1+xml';
182
+ exports.ACCEPT_ATC_WORKLIST_XML = 'application/atc.worklist.v1+xml, application/vnd.sap.atc.worklist.v1+xml';
183
+ exports.ACCEPT_ATC_CUSTOMIZING = 'application/xml, application/vnd.sap.atc.customizing-v1+xml, application/vnd.sap.atc.customizing-v2+xml';
@@ -5,6 +5,7 @@
5
5
  export { AdtRuntimeClient } from './clients/AdtRuntimeClient';
6
6
  export { AdtRuntimeClientExperimental } from './clients/AdtRuntimeClientExperimental';
7
7
  export { ApplicationLog } from './runtime/applicationLog/ApplicationLog';
8
+ export { AdtAtc } from './runtime/atc/AdtAtc';
8
9
  export { AtcLog } from './runtime/atc/AtcLog';
9
10
  export { DdicActivation } from './runtime/ddic/DdicActivation';
10
11
  export { AbapDebugger } from './runtime/debugger/AbapDebugger';
@@ -1 +1 @@
1
- {"version":3,"file":"index.runtime.d.ts","sourceRoot":"","sources":["../src/index.runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.runtime.d.ts","sourceRoot":"","sources":["../src/index.runtime.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAI5E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC"}
@@ -4,13 +4,15 @@
4
4
  * Covers: AdtRuntimeClient, AdtRuntimeClientExperimental, and all runtime/** modules.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.St05Trace = exports.Profiler = exports.CrossTrace = exports.SystemMessages = exports.MemorySnapshots = exports.GatewayErrorLog = exports.FeedRepository = exports.RuntimeDumps = exports.buildRuntimeDumpsUserQuery = exports.buildDumpIdPrefix = exports.Debugger = exports.AmdpDebugger = exports.AbapDebugger = exports.DdicActivation = exports.AtcLog = exports.ApplicationLog = exports.AdtRuntimeClientExperimental = exports.AdtRuntimeClient = void 0;
7
+ exports.St05Trace = exports.Profiler = exports.CrossTrace = exports.SystemMessages = exports.MemorySnapshots = exports.GatewayErrorLog = exports.FeedRepository = exports.RuntimeDumps = exports.buildRuntimeDumpsUserQuery = exports.buildDumpIdPrefix = exports.Debugger = exports.AmdpDebugger = exports.AbapDebugger = exports.DdicActivation = exports.AtcLog = exports.AdtAtc = exports.ApplicationLog = exports.AdtRuntimeClientExperimental = exports.AdtRuntimeClient = void 0;
8
8
  var AdtRuntimeClient_1 = require("./clients/AdtRuntimeClient");
9
9
  Object.defineProperty(exports, "AdtRuntimeClient", { enumerable: true, get: function () { return AdtRuntimeClient_1.AdtRuntimeClient; } });
10
10
  var AdtRuntimeClientExperimental_1 = require("./clients/AdtRuntimeClientExperimental");
11
11
  Object.defineProperty(exports, "AdtRuntimeClientExperimental", { enumerable: true, get: function () { return AdtRuntimeClientExperimental_1.AdtRuntimeClientExperimental; } });
12
12
  var ApplicationLog_1 = require("./runtime/applicationLog/ApplicationLog");
13
13
  Object.defineProperty(exports, "ApplicationLog", { enumerable: true, get: function () { return ApplicationLog_1.ApplicationLog; } });
14
+ var AdtAtc_1 = require("./runtime/atc/AdtAtc");
15
+ Object.defineProperty(exports, "AdtAtc", { enumerable: true, get: function () { return AdtAtc_1.AdtAtc; } });
14
16
  var AtcLog_1 = require("./runtime/atc/AtcLog");
15
17
  Object.defineProperty(exports, "AtcLog", { enumerable: true, get: function () { return AtcLog_1.AtcLog; } });
16
18
  var DdicActivation_1 = require("./runtime/ddic/DdicActivation");
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ATC check runs: start one, ask whether it is done, read what it found.
3
+ *
4
+ * Three capabilities and no more. A check run is not created, updated, locked,
5
+ * activated or versioned — it is run, and then read — so this declares
6
+ * `IAdtRunnable` plus two readers rather than `IAdtObject`.
7
+ *
8
+ * **Nothing here defaults a missing value.** Each response this depends on
9
+ * carries one thing the next step cannot work without, and where that thing is
10
+ * absent the call fails naming it. A missing `Location` never becomes the
11
+ * worklist id and a missing `FINDING_STATS` never becomes `"0,0,0"`: the
12
+ * dangerous outcome on an unfamiliar system is not an exception, it is a
13
+ * confident zero that reads exactly like a clean check.
14
+ */
15
+ import { type IAbapConnection, type IAdtResponse, type IAdtRunnable, type IAtcFindings, type IAtcRunOptions, type IAtcRunResult, type IAtcRunStatus, type IAtcRunStatusReadable, type IAtcRunTarget, type ILogger } from '@mcp-abap-adt/interfaces';
16
+ export declare class AdtAtc implements IAdtRunnable<IAtcRunTarget, IAtcRunResult, IAtcRunOptions>, IAtcRunStatusReadable, IAtcFindings {
17
+ private readonly connection;
18
+ private readonly logger;
19
+ constructor(connection: IAbapConnection, logger: ILogger);
20
+ run(target: IAtcRunTarget, options?: IAtcRunOptions): Promise<IAtcRunResult>;
21
+ getRunStatus(runId: string): Promise<IAtcRunStatus>;
22
+ getFindings(worklistId: string): Promise<IAdtResponse>;
23
+ private assertTarget;
24
+ private assertMaximumVerdicts;
25
+ private resolveCheckVariant;
26
+ private createWorklist;
27
+ /** `clientWait=false`: 201, empty body, the run id in `Location`. */
28
+ private readStartedRun;
29
+ /** `clientWait=true`: 200, `<atcworklist:worklistRun>` with FINDING_STATS. */
30
+ private readWaitingRun;
31
+ }
32
+ //# sourceMappingURL=AdtAtc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdtAtc.d.ts","sourceRoot":"","sources":["../../../src/runtime/atc/AdtAtc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,OAAO,EACb,MAAM,0BAA0B,CAAC;AAmClC,qBAAa,MACX,YACE,YAAY,CAAC,aAAa,EAAE,aAAa,EAAE,cAAc,CAAC,EAC1D,qBAAqB,EACrB,YAAY;IAGZ,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,UAAU,EAAE,eAAe,EAC3B,MAAM,EAAE,OAAO;IAG5B,GAAG,CACP,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,aAAa,CAAC;IA+BnB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuBnD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAM5D,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,qBAAqB;YAUf,mBAAmB;YAcnB,cAAc;IAgB5B,qEAAqE;IACrE,OAAO,CAAC,cAAc;IAyBtB,8EAA8E;IAC9E,OAAO,CAAC,cAAc;CA4BvB"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * ATC check runs: start one, ask whether it is done, read what it found.
4
+ *
5
+ * Three capabilities and no more. A check run is not created, updated, locked,
6
+ * activated or versioned — it is run, and then read — so this declares
7
+ * `IAdtRunnable` plus two readers rather than `IAdtObject`.
8
+ *
9
+ * **Nothing here defaults a missing value.** Each response this depends on
10
+ * carries one thing the next step cannot work without, and where that thing is
11
+ * absent the call fails naming it. A missing `Location` never becomes the
12
+ * worklist id and a missing `FINDING_STATS` never becomes `"0,0,0"`: the
13
+ * dangerous outcome on an unfamiliar system is not an exception, it is a
14
+ * confident zero that reads exactly like a clean check.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.AdtAtc = void 0;
18
+ const interfaces_1 = require("@mcp-abap-adt/interfaces");
19
+ const parse_1 = require("./parse");
20
+ const run_1 = require("./run");
21
+ /** The default cap on results, and the only value anyone has run with. */
22
+ const DEFAULT_MAXIMUM_VERDICTS = 100;
23
+ function asText(data) {
24
+ return typeof data === 'string' ? data : String(data ?? '');
25
+ }
26
+ /** Header lookup that does not assume the server's capitalisation. */
27
+ function header(headers, name) {
28
+ if (!headers)
29
+ return undefined;
30
+ const key = Object.keys(headers).find((k) => k.toLowerCase() === name.toLowerCase());
31
+ const value = key ? headers[key] : undefined;
32
+ return typeof value === 'string' ? value : undefined;
33
+ }
34
+ class AdtAtc {
35
+ connection;
36
+ logger;
37
+ constructor(connection, logger) {
38
+ this.connection = connection;
39
+ this.logger = logger;
40
+ }
41
+ async run(target, options) {
42
+ // `options` is optional in the contract, so every read of it is guarded.
43
+ // A caller writing `run(target)` is doing what the interface allows.
44
+ const wait = options?.wait ?? false;
45
+ const maximumVerdicts = options?.maximumVerdicts ?? DEFAULT_MAXIMUM_VERDICTS;
46
+ this.assertTarget(target);
47
+ this.assertMaximumVerdicts(maximumVerdicts);
48
+ const checkVariant = options?.checkVariant ?? (await this.resolveCheckVariant());
49
+ const worklistId = await this.createWorklist(checkVariant);
50
+ const uris = target.objects.map((o) => (0, run_1.buildAtcObjectUri)(o.objectType, o.objectName));
51
+ const response = await (0, run_1.startAtcRun)(this.connection, worklistId, uris, maximumVerdicts, wait);
52
+ return wait
53
+ ? this.readWaitingRun(response, worklistId)
54
+ : this.readStartedRun(response, worklistId);
55
+ }
56
+ async getRunStatus(runId) {
57
+ const response = await (0, run_1.getAtcRunStatus)(this.connection, runId);
58
+ const parsed = (0, parse_1.parseRunStatus)(response.data);
59
+ const status = parsed.status;
60
+ if (!status) {
61
+ const error = new interfaces_1.AdtOperationError(`ATC run ${runId}: the run resource carried no runs:status. IAtcRunStatus.status is not optional, and resolving with undefined through it would be a lie the type cannot catch.`);
62
+ error.code = 'ATC_RUN_STATUS_MISSING';
63
+ throw error;
64
+ }
65
+ return {
66
+ status,
67
+ // Exact and case-normalised. A substring test would accept `unfinished`
68
+ // and `not_finished`, opening the worklist on a run that had not run.
69
+ isFinished: status.trim().toLowerCase() === 'finished',
70
+ worklistId: parsed.worklistId,
71
+ resultId: parsed.resultId,
72
+ };
73
+ }
74
+ async getFindings(worklistId) {
75
+ return (0, run_1.getAtcWorklist)(this.connection, worklistId);
76
+ }
77
+ // ---------------------------------------------------------------- private
78
+ assertTarget(target) {
79
+ // The tuple type stops a TypeScript caller; a JavaScript one arrives here
80
+ // anyway, and an empty object set would start a run over nothing.
81
+ if (!target?.objects?.length) {
82
+ const error = new interfaces_1.AdtOperationError('ATC run needs at least one object to check.');
83
+ error.code = interfaces_1.AdtObjectErrorCodes.VALIDATION_FAILED;
84
+ throw error;
85
+ }
86
+ }
87
+ assertMaximumVerdicts(value) {
88
+ if (!Number.isInteger(value) || value < 1) {
89
+ const error = new interfaces_1.AdtOperationError(`maximumVerdicts must be a positive integer, got ${value}. The server answers 0 with a 400, and a client that can name the problem should not spend a round trip being told.`);
90
+ error.code = interfaces_1.AdtObjectErrorCodes.VALIDATION_FAILED;
91
+ throw error;
92
+ }
93
+ }
94
+ async resolveCheckVariant() {
95
+ const response = await (0, run_1.getAtcCustomizing)(this.connection);
96
+ const variant = (0, parse_1.parseSystemCheckVariant)(response.data);
97
+ if (!variant) {
98
+ const error = new interfaces_1.AdtOperationError('ATC customizing carried no systemCheckVariant, and no checkVariant was given. Creating a worklist with an undefined variant would leave the server to decide what that means.');
99
+ error.code = 'ATC_NO_CHECK_VARIANT';
100
+ throw error;
101
+ }
102
+ this.logger?.debug?.(`ATC check variant from customizing: ${variant}`);
103
+ return variant;
104
+ }
105
+ async createWorklist(checkVariant) {
106
+ const response = await (0, run_1.createAtcWorklist)(this.connection, checkVariant);
107
+ const worklistId = asText(response.data).trim();
108
+ // Non-empty, and nothing more specific: the observed ids are 32-character
109
+ // hex on one system, but no contract states a format, and a stricter test
110
+ // would risk refusing a valid id from a system nobody has probed.
111
+ if (!worklistId) {
112
+ const error = new interfaces_1.AdtOperationError('ATC worklist creation answered with no id. A run against an empty worklist id is a request nobody can interpret.');
113
+ error.code = 'ATC_NO_WORKLIST_ID';
114
+ throw error;
115
+ }
116
+ return worklistId;
117
+ }
118
+ /** `clientWait=false`: 201, empty body, the run id in `Location`. */
119
+ readStartedRun(response, worklistId) {
120
+ const location = header(response.headers, 'location') ??
121
+ header(response.headers, 'content-location');
122
+ if (!location) {
123
+ const error = new interfaces_1.AdtOperationError('ATC run was accepted without a Location header, so it has no run id to poll. Falling back to the worklist id would look like success and fetch a run that does not exist.');
124
+ error.code = 'ATC_NO_RUN_LOCATION';
125
+ throw error;
126
+ }
127
+ const runId = location.replace(/\/+$/, '').split('/').pop();
128
+ if (!runId) {
129
+ const error = new interfaces_1.AdtOperationError(`ATC run Location carried no id: ${location}`);
130
+ error.code = 'ATC_NO_RUN_LOCATION';
131
+ throw error;
132
+ }
133
+ return { waited: false, worklistId, runId };
134
+ }
135
+ /** `clientWait=true`: 200, `<atcworklist:worklistRun>` with FINDING_STATS. */
136
+ readWaitingRun(response, worklistId) {
137
+ const parsed = (0, parse_1.parseWaitingRun)(response.data);
138
+ const findingStats = parsed.findingStats;
139
+ if (!findingStats) {
140
+ const error = new interfaces_1.AdtOperationError('ATC waiting run answered without FINDING_STATS. Defaulting it to "0,0,0" would report a confident zero, which is indistinguishable from a clean check.');
141
+ error.code = 'ATC_NO_FINDING_STATS';
142
+ throw error;
143
+ }
144
+ // The response echoes a worklist id. The one returned is the one this
145
+ // handler created — that is the id it controls and the id getFindings
146
+ // takes — so a differing echo is worth a warning and nothing more. It is
147
+ // not an error: the contract does not make it one, and turning a usable
148
+ // answer into a failure is not a decision an implementation gets to make.
149
+ const echoed = parsed.worklistId;
150
+ if (echoed && echoed !== worklistId) {
151
+ this.logger?.warn?.(`ATC run echoed worklist ${echoed} but was started against ${worklistId}; returning the one this client created.`);
152
+ }
153
+ return { waited: true, worklistId, findingStats };
154
+ }
155
+ }
156
+ exports.AdtAtc = AdtAtc;
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * ATC (ABAP Test Cockpit) - Exports
3
3
  */
4
+ export { AdtAtc } from './AdtAtc';
4
5
  export { AtcLog } from './AtcLog';
5
6
  export { getCheckFailureLogs, getExecutionLog, type IGetCheckFailureLogsOptions, } from './logs';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/atc/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,KAAK,2BAA2B,GACjC,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/atc/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,KAAK,2BAA2B,GACjC,MAAM,QAAQ,CAAC"}
@@ -3,7 +3,9 @@
3
3
  * ATC (ABAP Test Cockpit) - Exports
4
4
  */
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getExecutionLog = exports.getCheckFailureLogs = exports.AtcLog = void 0;
6
+ exports.getExecutionLog = exports.getCheckFailureLogs = exports.AtcLog = exports.AdtAtc = void 0;
7
+ var AdtAtc_1 = require("./AdtAtc");
8
+ Object.defineProperty(exports, "AdtAtc", { enumerable: true, get: function () { return AdtAtc_1.AdtAtc; } });
7
9
  var AtcLog_1 = require("./AtcLog");
8
10
  Object.defineProperty(exports, "AtcLog", { enumerable: true, get: function () { return AtcLog_1.AtcLog; } });
9
11
  var logs_1 = require("./logs");
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Reading the four ATC responses this client depends on.
3
+ *
4
+ * **Structurally, not by pattern.** These are XML documents, and two things
5
+ * about an XML document carry no meaning: the order of attributes on an
6
+ * element, and which prefix a namespace was bound to. A reader that depends on
7
+ * either is reading a formatting accident. `<property value="X"
8
+ * name="systemCheckVariant"/>` is the same element as the one the trial sent
9
+ * with the attributes the other way round, and a server free to emit it would
10
+ * have been told this system has no check variant.
11
+ *
12
+ * `removeNSPrefix` drops the prefixes so `runs:status` and `r:status` are the
13
+ * same attribute; `parseTagValue: false` keeps every text value a string, so a
14
+ * worklist id of `00000000000000000000000000000000` does not arrive as a
15
+ * number.
16
+ *
17
+ * The shapes come from `docs/evidence/2026-08-16-atc-trial-probe.md`.
18
+ */
19
+ /**
20
+ * `systemCheckVariant` out of an ATC customizing response, or null.
21
+ *
22
+ * It is one of several `<property>` elements and not the first, so it is found
23
+ * by its `name` rather than by position.
24
+ */
25
+ export declare function parseSystemCheckVariant(body: unknown): string | null;
26
+ export interface IParsedRunStatus {
27
+ /** `runs:status`, whatever prefix it arrived under. */
28
+ status?: string;
29
+ /** From the `worklistid` atom link, when the run carries a result. */
30
+ worklistId?: string;
31
+ /** From the `displayid` atom link. */
32
+ resultId?: string;
33
+ }
34
+ /**
35
+ * The run resource: its status, and the ids its result links point at.
36
+ *
37
+ * A run still going carries no `<result>` at all, so both ids are optional —
38
+ * this is the method that gets polled, and it will be called on states nobody
39
+ * has captured.
40
+ */
41
+ export declare function parseRunStatus(body: unknown): IParsedRunStatus;
42
+ export interface IParsedWaitingRun {
43
+ /** The worklist id the server echoed, if it echoed one. */
44
+ worklistId?: string;
45
+ /** The `FINDING_STATS` triple verbatim, if the run reported one. */
46
+ findingStats?: string;
47
+ }
48
+ /**
49
+ * The `<worklistRun>` a `clientWait=true` run answers with.
50
+ *
51
+ * `FINDING_STATS` is one `<info>` among possibly several, and the triple is a
52
+ * sibling of the type that names it — so the pair is found together, not by
53
+ * reaching for the first description in the document.
54
+ */
55
+ export declare function parseWaitingRun(body: unknown): IParsedWaitingRun;
56
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/runtime/atc/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA4CH;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAOpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAuB9D;AAED,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAWhE"}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * Reading the four ATC responses this client depends on.
4
+ *
5
+ * **Structurally, not by pattern.** These are XML documents, and two things
6
+ * about an XML document carry no meaning: the order of attributes on an
7
+ * element, and which prefix a namespace was bound to. A reader that depends on
8
+ * either is reading a formatting accident. `<property value="X"
9
+ * name="systemCheckVariant"/>` is the same element as the one the trial sent
10
+ * with the attributes the other way round, and a server free to emit it would
11
+ * have been told this system has no check variant.
12
+ *
13
+ * `removeNSPrefix` drops the prefixes so `runs:status` and `r:status` are the
14
+ * same attribute; `parseTagValue: false` keeps every text value a string, so a
15
+ * worklist id of `00000000000000000000000000000000` does not arrive as a
16
+ * number.
17
+ *
18
+ * The shapes come from `docs/evidence/2026-08-16-atc-trial-probe.md`.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.parseSystemCheckVariant = parseSystemCheckVariant;
22
+ exports.parseRunStatus = parseRunStatus;
23
+ exports.parseWaitingRun = parseWaitingRun;
24
+ const fast_xml_parser_1 = require("fast-xml-parser");
25
+ const parser = new fast_xml_parser_1.XMLParser({
26
+ ignoreAttributes: false,
27
+ attributeNamePrefix: '@_',
28
+ removeNSPrefix: true,
29
+ parseTagValue: false,
30
+ parseAttributeValue: false,
31
+ trimValues: true,
32
+ });
33
+ function parseXml(body) {
34
+ if (typeof body !== 'string' || body.trim() === '')
35
+ return null;
36
+ try {
37
+ return parser.parse(body);
38
+ }
39
+ catch {
40
+ // A body that is not XML is a body that carries none of what is looked for
41
+ // here. Each caller already fails naming the value it could not find, and
42
+ // that message is more useful than a parser's.
43
+ return null;
44
+ }
45
+ }
46
+ /** Elements that appear once are objects and many times are arrays. */
47
+ function asArray(value) {
48
+ if (value === undefined || value === null)
49
+ return [];
50
+ return (Array.isArray(value) ? value : [value]).filter((v) => typeof v === 'object' && v !== null);
51
+ }
52
+ function text(value) {
53
+ return typeof value === 'string' ? value : undefined;
54
+ }
55
+ /** The last path segment of a URI, ignoring trailing slashes. */
56
+ function lastSegment(uri) {
57
+ return uri.replace(/\/+$/, '').split('/').pop() || undefined;
58
+ }
59
+ /**
60
+ * `systemCheckVariant` out of an ATC customizing response, or null.
61
+ *
62
+ * It is one of several `<property>` elements and not the first, so it is found
63
+ * by its `name` rather than by position.
64
+ */
65
+ function parseSystemCheckVariant(body) {
66
+ const root = parseXml(body)?.customizing;
67
+ const properties = root?.properties?.property;
68
+ const match = asArray(properties).find((p) => text(p['@_name']) === 'systemCheckVariant');
69
+ return text(match?.['@_value']) ?? null;
70
+ }
71
+ /**
72
+ * The run resource: its status, and the ids its result links point at.
73
+ *
74
+ * A run still going carries no `<result>` at all, so both ids are optional —
75
+ * this is the method that gets polled, and it will be called on states nobody
76
+ * has captured.
77
+ */
78
+ function parseRunStatus(body) {
79
+ const run = parseXml(body)?.run;
80
+ if (!run)
81
+ return {};
82
+ const links = asArray(run.result?.link);
83
+ // `rel` is a full URL whose last segment names the relation. Matched on that
84
+ // segment rather than on the whole URL: the relation is what is meant, and
85
+ // the host in front of it is not this client's business.
86
+ const idOf = (relation) => {
87
+ const link = links.find((l) => lastSegment(text(l['@_rel']) ?? '')?.toLowerCase() ===
88
+ relation.toLowerCase());
89
+ const href = text(link?.['@_href']);
90
+ return href ? lastSegment(href) : undefined;
91
+ };
92
+ return {
93
+ status: text(run['@_status']),
94
+ worklistId: idOf('worklistid'),
95
+ resultId: idOf('displayid'),
96
+ };
97
+ }
98
+ /**
99
+ * The `<worklistRun>` a `clientWait=true` run answers with.
100
+ *
101
+ * `FINDING_STATS` is one `<info>` among possibly several, and the triple is a
102
+ * sibling of the type that names it — so the pair is found together, not by
103
+ * reaching for the first description in the document.
104
+ */
105
+ function parseWaitingRun(body) {
106
+ const run = parseXml(body)?.worklistRun;
107
+ if (!run)
108
+ return {};
109
+ const infos = asArray(run.infos?.info);
110
+ const stats = infos.find((i) => text(i.type) === 'FINDING_STATS');
111
+ return {
112
+ worklistId: text(run.worklistId),
113
+ findingStats: text(stats?.description),
114
+ };
115
+ }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ATC check runs: the five requests a run is made of.
3
+ *
4
+ * The traffic here was captured against a cloud trial rather than taken from
5
+ * documentation, and two of the headers are the resource rather than a detail:
6
+ * the worklist is created and read as `text/plain` where everything around it
7
+ * is XML, and the run resource answers only to
8
+ * `application/vnd.sap.adt.backgroundrun.v1+xml`. A checkstyle `Accept` on the
9
+ * worklist is refused with 406 naming the one type it will serve, which is why
10
+ * no format option exists.
11
+ *
12
+ * See `docs/evidence/2026-08-16-atc-trial-probe.md` for the captures.
13
+ */
14
+ import type { AtcObjectType, IAbapConnection, IAdtResponse } from '@mcp-abap-adt/interfaces';
15
+ /** The ADT URI ATC checks an object at. */
16
+ export declare function buildAtcObjectUri(objectType: AtcObjectType, objectName: string): string;
17
+ /**
18
+ * ATC customizing, which carries the system's default check variant.
19
+ *
20
+ * `GET`, not `POST`: the same path answers a POST with **405, "Resource
21
+ * controller does not support method POST"**.
22
+ */
23
+ export declare function getAtcCustomizing(connection: IAbapConnection): Promise<IAdtResponse>;
24
+ /**
25
+ * Create the worklist a run writes its findings into.
26
+ *
27
+ * Answers with a bare id in the body — no XML envelope, which is why both
28
+ * content types are `text/plain`.
29
+ */
30
+ export declare function createAtcWorklist(connection: IAbapConnection, checkVariant: string): Promise<IAdtResponse>;
31
+ /** The run payload: one inclusive object set, every reference in it. */
32
+ export declare function buildRunPayload(objectUris: readonly string[], maximumVerdicts: number): string;
33
+ /**
34
+ * Start the run.
35
+ *
36
+ * `clientWait` decides the shape of the answer, not just its timing:
37
+ * `false` → 201 with an empty body and the run id in `Location`;
38
+ * `true` → 200 with `<atcworklist:worklistRun>` and no `Location`.
39
+ */
40
+ export declare function startAtcRun(connection: IAbapConnection, worklistId: string, objectUris: readonly string[], maximumVerdicts: number, wait: boolean): Promise<IAdtResponse>;
41
+ /** The run resource, which carries `runs:status` and links to its results. */
42
+ export declare function getAtcRunStatus(connection: IAbapConnection, runId: string): Promise<IAdtResponse>;
43
+ /**
44
+ * The worklist: every object the run checked, each with its findings.
45
+ *
46
+ * `includeExemptedFindings=false` is the observed form. `true` was answered
47
+ * once, but the only `false` read happened before a run had finished and the
48
+ * only `true` read after, so the two differ by timing rather than by the flag
49
+ * — which is why it is not an option.
50
+ */
51
+ export declare function getAtcWorklist(connection: IAbapConnection, worklistId: string): Promise<IAdtResponse>;
52
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/runtime/atc/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,0BAA0B,CAAC;AAuClC,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,EACzB,UAAU,EAAE,MAAM,GACjB,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,YAAY,CAAC,CAOvB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,eAAe,EAC3B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAWvB;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAC7B,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,EAAE,MAAM,GACtB,MAAM,CAcR;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,CACnC,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,CAAC,CAOvB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,eAAe,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC,CAOvB"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * ATC check runs: the five requests a run is made of.
4
+ *
5
+ * The traffic here was captured against a cloud trial rather than taken from
6
+ * documentation, and two of the headers are the resource rather than a detail:
7
+ * the worklist is created and read as `text/plain` where everything around it
8
+ * is XML, and the run resource answers only to
9
+ * `application/vnd.sap.adt.backgroundrun.v1+xml`. A checkstyle `Accept` on the
10
+ * worklist is refused with 406 naming the one type it will serve, which is why
11
+ * no format option exists.
12
+ *
13
+ * See `docs/evidence/2026-08-16-atc-trial-probe.md` for the captures.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.buildAtcObjectUri = buildAtcObjectUri;
17
+ exports.getAtcCustomizing = getAtcCustomizing;
18
+ exports.createAtcWorklist = createAtcWorklist;
19
+ exports.buildRunPayload = buildRunPayload;
20
+ exports.startAtcRun = startAtcRun;
21
+ exports.getAtcRunStatus = getAtcRunStatus;
22
+ exports.getAtcWorklist = getAtcWorklist;
23
+ const contentTypes_1 = require("../../constants/contentTypes");
24
+ const internalUtils_1 = require("../../utils/internalUtils");
25
+ const timeouts_1 = require("../../utils/timeouts");
26
+ const ATC = '/sap/bc/adt/atc';
27
+ /**
28
+ * Where each checkable kind lives.
29
+ *
30
+ * Every template was confirmed by a run submitted at it whose finished
31
+ * worklist then listed the object under that type — see
32
+ * `docs/evidence/2026-08-17-atc-objecttype-confirmed.md`. A run being accepted
33
+ * proved nothing: a URI that cannot exist is answered 201 too.
34
+ *
35
+ * `program` and `include` are absent from `AtcObjectType` and so from here.
36
+ * The outside PR this work started from sent includes to
37
+ * `/programs/programs/`, which this library builds as `/programs/includes/`
38
+ * everywhere else; neither could be settled on a system that refuses to hold
39
+ * either kind.
40
+ */
41
+ const URI_TEMPLATES = {
42
+ class: '/sap/bc/adt/oo/classes/',
43
+ interface: '/sap/bc/adt/oo/interfaces/',
44
+ function_group: '/sap/bc/adt/functions/groups/',
45
+ package: '/sap/bc/adt/packages/',
46
+ ddl_source: '/sap/bc/adt/ddic/ddl/sources/',
47
+ table: '/sap/bc/adt/ddic/tables/',
48
+ behavior_definition: '/sap/bc/adt/bo/behaviordefinitions/',
49
+ };
50
+ /** The ADT URI ATC checks an object at. */
51
+ function buildAtcObjectUri(objectType, objectName) {
52
+ return `${URI_TEMPLATES[objectType]}${(0, internalUtils_1.encodeSapObjectName)(objectName).toUpperCase()}`;
53
+ }
54
+ /**
55
+ * ATC customizing, which carries the system's default check variant.
56
+ *
57
+ * `GET`, not `POST`: the same path answers a POST with **405, "Resource
58
+ * controller does not support method POST"**.
59
+ */
60
+ async function getAtcCustomizing(connection) {
61
+ return connection.makeAdtRequest({
62
+ url: `${ATC}/customizing`,
63
+ method: 'GET',
64
+ timeout: (0, timeouts_1.getTimeout)('default'),
65
+ headers: { Accept: contentTypes_1.ACCEPT_ATC_CUSTOMIZING },
66
+ });
67
+ }
68
+ /**
69
+ * Create the worklist a run writes its findings into.
70
+ *
71
+ * Answers with a bare id in the body — no XML envelope, which is why both
72
+ * content types are `text/plain`.
73
+ */
74
+ async function createAtcWorklist(connection, checkVariant) {
75
+ return connection.makeAdtRequest({
76
+ url: `${ATC}/worklists?checkVariant=${encodeURIComponent(checkVariant)}`,
77
+ method: 'POST',
78
+ timeout: (0, timeouts_1.getTimeout)('default'),
79
+ data: '',
80
+ headers: {
81
+ 'Content-Type': contentTypes_1.CT_ATC_WORKLIST_CREATE,
82
+ Accept: contentTypes_1.ACCEPT_ATC_WORKLIST_ID,
83
+ },
84
+ });
85
+ }
86
+ /** The run payload: one inclusive object set, every reference in it. */
87
+ function buildRunPayload(objectUris, maximumVerdicts) {
88
+ const references = objectUris
89
+ .map((uri) => `<adtcore:objectReference adtcore:uri="${uri}"/>`)
90
+ .join('');
91
+ return ('<?xml version="1.0" encoding="UTF-8"?>' +
92
+ `<atc:run maximumVerdicts="${maximumVerdicts}" xmlns:atc="http://www.sap.com/adt/atc">` +
93
+ '<objectSets xmlns:adtcore="http://www.sap.com/adt/core">' +
94
+ '<objectSet kind="inclusive">' +
95
+ `<adtcore:objectReferences>${references}</adtcore:objectReferences>` +
96
+ '</objectSet>' +
97
+ '</objectSets>' +
98
+ '</atc:run>');
99
+ }
100
+ /**
101
+ * Start the run.
102
+ *
103
+ * `clientWait` decides the shape of the answer, not just its timing:
104
+ * `false` → 201 with an empty body and the run id in `Location`;
105
+ * `true` → 200 with `<atcworklist:worklistRun>` and no `Location`.
106
+ */
107
+ async function startAtcRun(connection, worklistId, objectUris, maximumVerdicts, wait) {
108
+ return connection.makeAdtRequest({
109
+ url: `${ATC}/runs?worklistId=${encodeURIComponent(worklistId)}&clientWait=${wait}`,
110
+ method: 'POST',
111
+ timeout: (0, timeouts_1.getTimeout)('default'),
112
+ data: buildRunPayload(objectUris, maximumVerdicts),
113
+ headers: { 'Content-Type': contentTypes_1.CT_ATC_RUN, Accept: contentTypes_1.ACCEPT_ATC_RUN_RESPONSE },
114
+ });
115
+ }
116
+ /** The run resource, which carries `runs:status` and links to its results. */
117
+ async function getAtcRunStatus(connection, runId) {
118
+ return connection.makeAdtRequest({
119
+ url: `${ATC}/runs/${encodeURIComponent(runId)}`,
120
+ method: 'GET',
121
+ timeout: (0, timeouts_1.getTimeout)('default'),
122
+ headers: { Accept: contentTypes_1.ACCEPT_ATC_RUN_STATUS },
123
+ });
124
+ }
125
+ /**
126
+ * The worklist: every object the run checked, each with its findings.
127
+ *
128
+ * `includeExemptedFindings=false` is the observed form. `true` was answered
129
+ * once, but the only `false` read happened before a run had finished and the
130
+ * only `true` read after, so the two differ by timing rather than by the flag
131
+ * — which is why it is not an option.
132
+ */
133
+ async function getAtcWorklist(connection, worklistId) {
134
+ return connection.makeAdtRequest({
135
+ url: `${ATC}/worklists/${encodeURIComponent(worklistId)}?includeExemptedFindings=false`,
136
+ method: 'GET',
137
+ timeout: (0, timeouts_1.getTimeout)('default'),
138
+ headers: { Accept: contentTypes_1.ACCEPT_ATC_WORKLIST_XML },
139
+ });
140
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/adt-clients",
3
- "version": "12.0.0",
3
+ "version": "12.1.0",
4
4
  "description": "ADT clients for SAP ABAP systems - AdtClient and AdtRuntimeClient",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -113,14 +113,14 @@
113
113
  "node": ">=18.0.0"
114
114
  },
115
115
  "dependencies": {
116
- "@mcp-abap-adt/interfaces": "^17.0.0",
116
+ "@mcp-abap-adt/interfaces": "^17.1.0",
117
117
  "@mcp-abap-adt/logger": "^0.1.3",
118
118
  "axios": "^1.18.1",
119
119
  "fast-xml-parser": "^5.9.3"
120
120
  },
121
121
  "devDependencies": {
122
122
  "@biomejs/biome": "^2.4.4",
123
- "@mcp-abap-adt/connection": "^3.0.0",
123
+ "@mcp-abap-adt/connection": "^4.0.0",
124
124
  "@types/jest": "^30.0.0",
125
125
  "@types/node": "^25.3.3",
126
126
  "dotenv": "^17.3.1",