arc-1 0.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.
Files changed (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/bin/arc1.js +12 -0
  4. package/dist/adt/btp.d.ts +122 -0
  5. package/dist/adt/btp.d.ts.map +1 -0
  6. package/dist/adt/btp.js +392 -0
  7. package/dist/adt/btp.js.map +1 -0
  8. package/dist/adt/client.d.ts +89 -0
  9. package/dist/adt/client.d.ts.map +1 -0
  10. package/dist/adt/client.js +208 -0
  11. package/dist/adt/client.js.map +1 -0
  12. package/dist/adt/codeintel.d.ts +38 -0
  13. package/dist/adt/codeintel.d.ts.map +1 -0
  14. package/dist/adt/codeintel.js +61 -0
  15. package/dist/adt/codeintel.js.map +1 -0
  16. package/dist/adt/config.d.ts +65 -0
  17. package/dist/adt/config.d.ts.map +1 -0
  18. package/dist/adt/config.js +35 -0
  19. package/dist/adt/config.js.map +1 -0
  20. package/dist/adt/cookies.d.ts +27 -0
  21. package/dist/adt/cookies.d.ts.map +1 -0
  22. package/dist/adt/cookies.js +67 -0
  23. package/dist/adt/cookies.js.map +1 -0
  24. package/dist/adt/crud.d.ts +35 -0
  25. package/dist/adt/crud.d.ts.map +1 -0
  26. package/dist/adt/crud.js +87 -0
  27. package/dist/adt/crud.js.map +1 -0
  28. package/dist/adt/devtools.d.ts +32 -0
  29. package/dist/adt/devtools.d.ts.map +1 -0
  30. package/dist/adt/devtools.js +154 -0
  31. package/dist/adt/devtools.js.map +1 -0
  32. package/dist/adt/errors.d.ts +49 -0
  33. package/dist/adt/errors.d.ts.map +1 -0
  34. package/dist/adt/errors.js +80 -0
  35. package/dist/adt/errors.js.map +1 -0
  36. package/dist/adt/features.d.ts +44 -0
  37. package/dist/adt/features.d.ts.map +1 -0
  38. package/dist/adt/features.js +173 -0
  39. package/dist/adt/features.js.map +1 -0
  40. package/dist/adt/http.d.ts +116 -0
  41. package/dist/adt/http.d.ts.map +1 -0
  42. package/dist/adt/http.js +374 -0
  43. package/dist/adt/http.js.map +1 -0
  44. package/dist/adt/safety.d.ts +70 -0
  45. package/dist/adt/safety.d.ts.map +1 -0
  46. package/dist/adt/safety.js +222 -0
  47. package/dist/adt/safety.js.map +1 -0
  48. package/dist/adt/transport.d.ts +18 -0
  49. package/dist/adt/transport.d.ts.map +1 -0
  50. package/dist/adt/transport.js +66 -0
  51. package/dist/adt/transport.js.map +1 -0
  52. package/dist/adt/types.d.ts +91 -0
  53. package/dist/adt/types.d.ts.map +1 -0
  54. package/dist/adt/types.js +9 -0
  55. package/dist/adt/types.js.map +1 -0
  56. package/dist/adt/xml-parser.d.ts +109 -0
  57. package/dist/adt/xml-parser.d.ts.map +1 -0
  58. package/dist/adt/xml-parser.js +283 -0
  59. package/dist/adt/xml-parser.js.map +1 -0
  60. package/dist/cache/cache.d.ts +61 -0
  61. package/dist/cache/cache.d.ts.map +1 -0
  62. package/dist/cache/cache.js +14 -0
  63. package/dist/cache/cache.js.map +1 -0
  64. package/dist/cache/memory.d.ts +25 -0
  65. package/dist/cache/memory.d.ts.map +1 -0
  66. package/dist/cache/memory.js +69 -0
  67. package/dist/cache/memory.js.map +1 -0
  68. package/dist/cache/sqlite.d.ts +26 -0
  69. package/dist/cache/sqlite.d.ts.map +1 -0
  70. package/dist/cache/sqlite.js +130 -0
  71. package/dist/cache/sqlite.js.map +1 -0
  72. package/dist/cli.d.ts +14 -0
  73. package/dist/cli.d.ts.map +1 -0
  74. package/dist/cli.js +101 -0
  75. package/dist/cli.js.map +1 -0
  76. package/dist/context/compressor.d.ts +33 -0
  77. package/dist/context/compressor.d.ts.map +1 -0
  78. package/dist/context/compressor.js +208 -0
  79. package/dist/context/compressor.js.map +1 -0
  80. package/dist/context/contract.d.ts +14 -0
  81. package/dist/context/contract.d.ts.map +1 -0
  82. package/dist/context/contract.js +202 -0
  83. package/dist/context/contract.js.map +1 -0
  84. package/dist/context/deps.d.ts +32 -0
  85. package/dist/context/deps.d.ts.map +1 -0
  86. package/dist/context/deps.js +240 -0
  87. package/dist/context/deps.js.map +1 -0
  88. package/dist/context/types.d.ts +56 -0
  89. package/dist/context/types.d.ts.map +1 -0
  90. package/dist/context/types.js +10 -0
  91. package/dist/context/types.js.map +1 -0
  92. package/dist/handlers/intent.d.ts +46 -0
  93. package/dist/handlers/intent.d.ts.map +1 -0
  94. package/dist/handlers/intent.js +539 -0
  95. package/dist/handlers/intent.js.map +1 -0
  96. package/dist/handlers/tools.d.ts +21 -0
  97. package/dist/handlers/tools.d.ts.map +1 -0
  98. package/dist/handlers/tools.js +260 -0
  99. package/dist/handlers/tools.js.map +1 -0
  100. package/dist/index.d.ts +10 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +16 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/lint/lint.d.ts +35 -0
  105. package/dist/lint/lint.d.ts.map +1 -0
  106. package/dist/lint/lint.js +67 -0
  107. package/dist/lint/lint.js.map +1 -0
  108. package/dist/server/audit.d.ts +96 -0
  109. package/dist/server/audit.d.ts.map +1 -0
  110. package/dist/server/audit.js +27 -0
  111. package/dist/server/audit.js.map +1 -0
  112. package/dist/server/config.d.ts +19 -0
  113. package/dist/server/config.d.ts.map +1 -0
  114. package/dist/server/config.js +101 -0
  115. package/dist/server/config.js.map +1 -0
  116. package/dist/server/context.d.ts +20 -0
  117. package/dist/server/context.d.ts.map +1 -0
  118. package/dist/server/context.js +20 -0
  119. package/dist/server/context.js.map +1 -0
  120. package/dist/server/elicit.d.ts +43 -0
  121. package/dist/server/elicit.d.ts.map +1 -0
  122. package/dist/server/elicit.js +183 -0
  123. package/dist/server/elicit.js.map +1 -0
  124. package/dist/server/http.d.ts +34 -0
  125. package/dist/server/http.d.ts.map +1 -0
  126. package/dist/server/http.js +328 -0
  127. package/dist/server/http.js.map +1 -0
  128. package/dist/server/logger.d.ts +57 -0
  129. package/dist/server/logger.d.ts.map +1 -0
  130. package/dist/server/logger.js +129 -0
  131. package/dist/server/logger.js.map +1 -0
  132. package/dist/server/server.d.ts +25 -0
  133. package/dist/server/server.d.ts.map +1 -0
  134. package/dist/server/server.js +307 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/server/sinks/btp-auditlog.d.ts +48 -0
  137. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -0
  138. package/dist/server/sinks/btp-auditlog.js +232 -0
  139. package/dist/server/sinks/btp-auditlog.js.map +1 -0
  140. package/dist/server/sinks/file.d.ts +22 -0
  141. package/dist/server/sinks/file.d.ts.map +1 -0
  142. package/dist/server/sinks/file.js +59 -0
  143. package/dist/server/sinks/file.js.map +1 -0
  144. package/dist/server/sinks/stderr.d.ts +19 -0
  145. package/dist/server/sinks/stderr.d.ts.map +1 -0
  146. package/dist/server/sinks/stderr.js +63 -0
  147. package/dist/server/sinks/stderr.js.map +1 -0
  148. package/dist/server/sinks/types.d.ts +14 -0
  149. package/dist/server/sinks/types.d.ts.map +1 -0
  150. package/dist/server/sinks/types.js +8 -0
  151. package/dist/server/sinks/types.js.map +1 -0
  152. package/dist/server/types.d.ts +54 -0
  153. package/dist/server/types.d.ts.map +1 -0
  154. package/dist/server/types.js +42 -0
  155. package/dist/server/types.js.map +1 -0
  156. package/dist/server/xsuaa.d.ts +77 -0
  157. package/dist/server/xsuaa.d.ts.map +1 -0
  158. package/dist/server/xsuaa.js +364 -0
  159. package/dist/server/xsuaa.js.map +1 -0
  160. package/package.json +66 -0
@@ -0,0 +1,208 @@
1
+ /**
2
+ * ADT Client — main facade for all SAP ADT operations.
3
+ *
4
+ * This is the entry point for all SAP interactions. It wires together:
5
+ * - AdtHttpClient (HTTP transport, CSRF, cookies)
6
+ * - SafetyConfig (operation/package/transport gating)
7
+ * - FeatureConfig (optional feature detection)
8
+ *
9
+ * Every public method checks safety before making any HTTP call.
10
+ * The client is stateless between calls (no cached object state),
11
+ * except for CSRF token and session cookies managed by AdtHttpClient.
12
+ *
13
+ * Architecture: The client exposes high-level operations grouped by domain.
14
+ * Read operations are directly on the client, while CRUD, DevTools, etc.
15
+ * are imported from their respective modules when needed by handlers.
16
+ * This keeps the client class manageable (not a 2,400-line God class).
17
+ */
18
+ import { defaultAdtClientConfig } from './config.js';
19
+ import { AdtHttpClient } from './http.js';
20
+ import { isNotFoundError } from './errors.js';
21
+ import { checkOperation, OperationType } from './safety.js';
22
+ import { parseFunctionGroup, parseInstalledComponents, parsePackageContents, parseSearchResults, parseSystemInfo, parseTableContents, } from './xml-parser.js';
23
+ export class AdtClient {
24
+ http;
25
+ safety;
26
+ /** The configured SAP username (from --user / SAP_USER) */
27
+ username;
28
+ constructor(options = {}) {
29
+ const config = { ...defaultAdtClientConfig(), ...options };
30
+ this.safety = config.safety;
31
+ this.username = config.username;
32
+ const httpConfig = {
33
+ baseUrl: config.baseUrl,
34
+ username: config.username,
35
+ password: config.password,
36
+ client: config.client,
37
+ language: config.language,
38
+ insecure: config.insecure,
39
+ cookies: config.cookies,
40
+ btpProxy: config.btpProxy,
41
+ sapConnectivityAuth: config.sapConnectivityAuth,
42
+ };
43
+ this.http = new AdtHttpClient(httpConfig);
44
+ }
45
+ // ─── Source Code Read Operations ──────────────────────────────────
46
+ /** Get program source code */
47
+ async getProgram(name) {
48
+ checkOperation(this.safety, OperationType.Read, 'GetProgram');
49
+ const resp = await this.http.get(`/sap/bc/adt/programs/programs/${encodeURIComponent(name)}/source/main`);
50
+ return resp.body;
51
+ }
52
+ /** Get class source code (main include by default) */
53
+ async getClass(name, include) {
54
+ checkOperation(this.safety, OperationType.Read, 'GetClass');
55
+ const encodedName = encodeURIComponent(name);
56
+ if (!include) {
57
+ // Default: return full combined class source
58
+ const resp = await this.http.get(`/sap/bc/adt/oo/classes/${encodedName}/source/main`);
59
+ return resp.body;
60
+ }
61
+ const validIncludes = new Set(['main', 'definitions', 'implementations', 'macros', 'testclasses']);
62
+ const includes = include.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);
63
+ const parts = [];
64
+ for (const inc of includes) {
65
+ if (!validIncludes.has(inc)) {
66
+ parts.push(`=== ${inc} ===\n[Unknown include "${inc}". Valid: main, definitions, implementations, macros, testclasses]`);
67
+ continue;
68
+ }
69
+ // "main" uses /source/main; others use /includes/{type}
70
+ const path = inc === 'main'
71
+ ? `/sap/bc/adt/oo/classes/${encodedName}/source/main`
72
+ : `/sap/bc/adt/oo/classes/${encodedName}/includes/${inc}`;
73
+ try {
74
+ const resp = await this.http.get(path);
75
+ parts.push(`=== ${inc} ===\n${resp.body}`);
76
+ }
77
+ catch (err) {
78
+ if (isNotFoundError(err)) {
79
+ parts.push(`=== ${inc} ===\n[Include "${inc}" is not available for this class. Try reading without the include parameter to get the full source.]`);
80
+ }
81
+ else {
82
+ throw err; // Re-throw non-404 errors
83
+ }
84
+ }
85
+ }
86
+ return parts.join('\n\n');
87
+ }
88
+ /** Get interface source code */
89
+ async getInterface(name) {
90
+ checkOperation(this.safety, OperationType.Read, 'GetInterface');
91
+ const resp = await this.http.get(`/sap/bc/adt/oo/interfaces/${encodeURIComponent(name)}/source/main`);
92
+ return resp.body;
93
+ }
94
+ /** Get function module source code */
95
+ async getFunction(group, name) {
96
+ checkOperation(this.safety, OperationType.Read, 'GetFunction');
97
+ const resp = await this.http.get(`/sap/bc/adt/functions/groups/${encodeURIComponent(group)}/fmodules/${encodeURIComponent(name)}/source/main`);
98
+ return resp.body;
99
+ }
100
+ /** Get function group structure (list of function modules) */
101
+ async getFunctionGroup(name) {
102
+ checkOperation(this.safety, OperationType.Read, 'GetFunctionGroup');
103
+ const resp = await this.http.get(`/sap/bc/adt/functions/groups/${encodeURIComponent(name)}`);
104
+ return parseFunctionGroup(resp.body);
105
+ }
106
+ /** Get function group source code */
107
+ async getFunctionGroupSource(name) {
108
+ checkOperation(this.safety, OperationType.Read, 'GetFunctionGroupSource');
109
+ const resp = await this.http.get(`/sap/bc/adt/functions/groups/${encodeURIComponent(name)}/source/main`);
110
+ return resp.body;
111
+ }
112
+ /** Get include source code */
113
+ async getInclude(name) {
114
+ checkOperation(this.safety, OperationType.Read, 'GetInclude');
115
+ const resp = await this.http.get(`/sap/bc/adt/programs/includes/${encodeURIComponent(name)}/source/main`);
116
+ return resp.body;
117
+ }
118
+ /** Get CDS view source code (DDLS) */
119
+ async getDdls(name) {
120
+ checkOperation(this.safety, OperationType.Read, 'GetDDLS');
121
+ const resp = await this.http.get(`/sap/bc/adt/ddic/ddl/sources/${encodeURIComponent(name)}/source/main`);
122
+ return resp.body;
123
+ }
124
+ /** Get behavior definition source code (BDEF) */
125
+ async getBdef(name) {
126
+ checkOperation(this.safety, OperationType.Read, 'GetBDEF');
127
+ const resp = await this.http.get(`/sap/bc/adt/bo/behaviordefinitions/${encodeURIComponent(name)}/source/main`);
128
+ return resp.body;
129
+ }
130
+ /** Get service definition source code (SRVD) */
131
+ async getSrvd(name) {
132
+ checkOperation(this.safety, OperationType.Read, 'GetSRVD');
133
+ const resp = await this.http.get(`/sap/bc/adt/ddic/srvd/sources/${encodeURIComponent(name)}/source/main`);
134
+ return resp.body;
135
+ }
136
+ /** Get table definition source code */
137
+ async getTable(name) {
138
+ checkOperation(this.safety, OperationType.Read, 'GetTable');
139
+ const resp = await this.http.get(`/sap/bc/adt/ddic/tables/${encodeURIComponent(name)}/source/main`);
140
+ return resp.body;
141
+ }
142
+ /** Get view definition source code */
143
+ async getView(name) {
144
+ checkOperation(this.safety, OperationType.Read, 'GetView');
145
+ const resp = await this.http.get(`/sap/bc/adt/ddic/views/${encodeURIComponent(name)}/source/main`);
146
+ return resp.body;
147
+ }
148
+ // ─── Search Operations ─────────────────────────────────────────────
149
+ /** Search for ABAP objects by name pattern */
150
+ async searchObject(query, maxResults = 100) {
151
+ checkOperation(this.safety, OperationType.Search, 'SearchObject');
152
+ const resp = await this.http.get(`/sap/bc/adt/repository/informationsystem/search?operation=quickSearch&query=${encodeURIComponent(query)}&maxResults=${maxResults}`);
153
+ return parseSearchResults(resp.body);
154
+ }
155
+ // ─── Package Operations ────────────────────────────────────────────
156
+ /** Get package contents (objects and subpackages) */
157
+ async getPackageContents(packageName) {
158
+ checkOperation(this.safety, OperationType.Read, 'GetPackage');
159
+ const resp = await this.http.post(`/sap/bc/adt/repository/nodestructure?parent_type=DEVC/K&parent_name=${encodeURIComponent(packageName)}&withShortDescriptions=true`, undefined, 'application/xml');
160
+ return parsePackageContents(resp.body);
161
+ }
162
+ // ─── Table Data Operations ─────────────────────────────────────────
163
+ /** Get table contents via data preview */
164
+ async getTableContents(tableName, maxRows = 100, sqlFilter) {
165
+ checkOperation(this.safety, OperationType.Query, 'GetTableContents');
166
+ const resp = await this.http.post(`/sap/bc/adt/datapreview/ddic?rowNumber=${maxRows}&ddicEntityName=${encodeURIComponent(tableName)}`, sqlFilter, 'text/plain');
167
+ return parseTableContents(resp.body);
168
+ }
169
+ /** Execute freestyle SQL query */
170
+ async runQuery(sql, maxRows = 100) {
171
+ checkOperation(this.safety, OperationType.FreeSQL, 'RunQuery');
172
+ const resp = await this.http.post(`/sap/bc/adt/datapreview/freestyle?rowNumber=${maxRows}`, sql, 'text/plain');
173
+ return parseTableContents(resp.body);
174
+ }
175
+ // ─── System Information ────────────────────────────────────────────
176
+ /** Get system info as structured JSON (user, system details from discovery XML) */
177
+ async getSystemInfo() {
178
+ checkOperation(this.safety, OperationType.Read, 'GetSystemInfo');
179
+ const resp = await this.http.get('/sap/bc/adt/core/discovery');
180
+ const info = parseSystemInfo(resp.body, this.username);
181
+ return JSON.stringify(info, null, 2);
182
+ }
183
+ /** Get installed SAP components */
184
+ async getInstalledComponents() {
185
+ checkOperation(this.safety, OperationType.Read, 'GetInstalledComponents');
186
+ const resp = await this.http.get('/sap/bc/adt/system/components');
187
+ return parseInstalledComponents(resp.body);
188
+ }
189
+ /** Get message class messages */
190
+ async getMessages(messageClass) {
191
+ checkOperation(this.safety, OperationType.Read, 'GetMessages');
192
+ const resp = await this.http.get(`/sap/bc/adt/msg/messages/${encodeURIComponent(messageClass)}`);
193
+ return resp.body;
194
+ }
195
+ /** Get program text elements */
196
+ async getTextElements(program) {
197
+ checkOperation(this.safety, OperationType.Read, 'GetTextElements');
198
+ const resp = await this.http.get(`/sap/bc/adt/programs/programs/${encodeURIComponent(program)}/textelements`);
199
+ return resp.body;
200
+ }
201
+ /** Get program variants */
202
+ async getVariants(program) {
203
+ checkOperation(this.safety, OperationType.Read, 'GetVariants');
204
+ const resp = await this.http.get(`/sap/bc/adt/programs/programs/${encodeURIComponent(program)}/variants`);
205
+ return resp.body;
206
+ }
207
+ }
208
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../ts-src/adt/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,aAAa,EAAsB,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,OAAO,SAAS;IACX,IAAI,CAAgB;IACpB,MAAM,CAAe;IAC9B,2DAA2D;IAClD,QAAQ,CAAS;IAE1B,YAAY,UAAoC,EAAE;QAChD,MAAM,MAAM,GAAG,EAAE,GAAG,sBAAsB,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEhC,MAAM,UAAU,GAAkB;YAChC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;SAChD,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,qEAAqE;IAErE,8BAA8B;IAC9B,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAgB;QAC3C,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,6CAA6C;YAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,WAAW,cAAc,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QACnG,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,2BAA2B,GAAG,oEAAoE,CAAC,CAAC;gBACzH,SAAS;YACX,CAAC;YAED,wDAAwD;YACxD,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM;gBACzB,CAAC,CAAC,0BAA0B,WAAW,cAAc;gBACrD,CAAC,CAAC,0BAA0B,WAAW,aAAa,GAAG,EAAE,CAAC;YAE5D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,mBAAmB,GAAG,uGAAuG,CAAC,CAAC;gBACtJ,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAC,CAAC,0BAA0B;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,6BAA6B,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,IAAY;QAC3C,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9B,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAC7G,CAAC;QACF,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,sBAAsB,CAAC,IAAY;QACvC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAgC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,sCAAsC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,sEAAsE;IAEtE,8CAA8C;IAC9C,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,UAAU,GAAG,GAAG;QAChD,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9B,+EAA+E,kBAAkB,CAAC,KAAK,CAAC,eAAe,UAAU,EAAE,CACpI,CAAC;QACF,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,sEAAsE;IAEtE,qDAAqD;IACrD,KAAK,CAAC,kBAAkB,CACtB,WAAmB;QAEnB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAC/B,uEAAuE,kBAAkB,CAAC,WAAW,CAAC,6BAA6B,EACnI,SAAS,EACT,iBAAiB,CAClB,CAAC;QACF,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,sEAAsE;IAEtE,0CAA0C;IAC1C,KAAK,CAAC,gBAAgB,CACpB,SAAiB,EACjB,OAAO,GAAG,GAAG,EACb,SAAkB;QAElB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAC/B,0CAA0C,OAAO,mBAAmB,kBAAkB,CAAC,SAAS,CAAC,EAAE,EACnG,SAAS,EACT,YAAY,CACb,CAAC;QACF,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,OAAO,GAAG,GAAG;QACvC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC/G,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,sEAAsE;IAEtE,mFAAmF;IACnF,KAAK,CAAC,aAAa;QACjB,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,sBAAsB;QAC1B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAClE,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,WAAW,CAAC,YAAoB;QACpC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,4BAA4B,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACjG,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,iCAAiC,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1G,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Code intelligence for SAP ADT.
3
+ *
4
+ * - FindDefinition: navigate to symbol definition
5
+ * - FindReferences: where-used analysis
6
+ * - GetCompletion: code completion proposals
7
+ */
8
+ import type { AdtHttpClient } from './http.js';
9
+ import { type SafetyConfig } from './safety.js';
10
+ /** Definition navigation result */
11
+ export interface DefinitionResult {
12
+ uri: string;
13
+ type: string;
14
+ name: string;
15
+ line?: number;
16
+ column?: number;
17
+ }
18
+ /** Reference result */
19
+ export interface ReferenceResult {
20
+ uri: string;
21
+ type: string;
22
+ name: string;
23
+ line: number;
24
+ column: number;
25
+ }
26
+ /** Completion proposal */
27
+ export interface CompletionProposal {
28
+ text: string;
29
+ description: string;
30
+ type: string;
31
+ }
32
+ /** Navigate to definition of a symbol */
33
+ export declare function findDefinition(http: AdtHttpClient, safety: SafetyConfig, sourceUrl: string, line: number, column: number, source: string): Promise<DefinitionResult | null>;
34
+ /** Find all references to a symbol */
35
+ export declare function findReferences(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string): Promise<ReferenceResult[]>;
36
+ /** Get code completion proposals */
37
+ export declare function getCompletion(http: AdtHttpClient, safety: SafetyConfig, sourceUrl: string, line: number, column: number, source: string): Promise<CompletionProposal[]>;
38
+ //# sourceMappingURL=codeintel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeintel.d.ts","sourceRoot":"","sources":["../../ts-src/adt/codeintel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uBAAuB;AACvB,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,wBAAsB,cAAc,CAClC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsBlC;AAED,sCAAsC;AACtC,wBAAsB,cAAc,CAClC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,EAAE,CAAC,CAuB5B;AAED,oCAAoC;AACpC,wBAAsB,aAAa,CACjC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAuB/B"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Code intelligence for SAP ADT.
3
+ *
4
+ * - FindDefinition: navigate to symbol definition
5
+ * - FindReferences: where-used analysis
6
+ * - GetCompletion: code completion proposals
7
+ */
8
+ import { checkOperation, OperationType } from './safety.js';
9
+ /** Navigate to definition of a symbol */
10
+ export async function findDefinition(http, safety, sourceUrl, line, column, source) {
11
+ checkOperation(safety, OperationType.Intelligence, 'FindDefinition');
12
+ const resp = await http.post(`/sap/bc/adt/navigation/target?uri=${encodeURIComponent(sourceUrl)}&line=${line}&column=${column}`, source, 'text/plain', { Accept: 'application/xml' });
13
+ // Parse navigation response
14
+ const uriMatch = resp.body.match(/uri="([^"]*)"/);
15
+ const typeMatch = resp.body.match(/type="([^"]*)"/);
16
+ const nameMatch = resp.body.match(/name="([^"]*)"/);
17
+ if (!uriMatch)
18
+ return null;
19
+ return {
20
+ uri: uriMatch[1],
21
+ type: typeMatch?.[1] ?? '',
22
+ name: nameMatch?.[1] ?? '',
23
+ };
24
+ }
25
+ /** Find all references to a symbol */
26
+ export async function findReferences(http, safety, objectUrl) {
27
+ checkOperation(safety, OperationType.Intelligence, 'FindReferences');
28
+ const resp = await http.get(`/sap/bc/adt/repository/informationsystem/usageReferences?uri=${encodeURIComponent(objectUrl)}`, { Accept: 'application/xml' });
29
+ // Parse reference results
30
+ const results = [];
31
+ const refRegex = /uri="([^"]*)"[^>]*type="([^"]*)"[^>]*name="([^"]*)"/g;
32
+ let match;
33
+ while ((match = refRegex.exec(resp.body)) !== null) {
34
+ results.push({
35
+ uri: match[1],
36
+ type: match[2],
37
+ name: match[3],
38
+ line: 0,
39
+ column: 0,
40
+ });
41
+ }
42
+ return results;
43
+ }
44
+ /** Get code completion proposals */
45
+ export async function getCompletion(http, safety, sourceUrl, line, column, source) {
46
+ checkOperation(safety, OperationType.Intelligence, 'GetCompletion');
47
+ const resp = await http.post(`/sap/bc/adt/abapsource/codecompletion/proposals?uri=${encodeURIComponent(sourceUrl)}&line=${line}&column=${column}`, source, 'text/plain', { Accept: 'application/xml' });
48
+ // Parse completion proposals
49
+ const proposals = [];
50
+ const propRegex = /<proposal[^>]*text="([^"]*)"[^>]*description="([^"]*)"[^>]*type="([^"]*)"/g;
51
+ let match;
52
+ while ((match = propRegex.exec(resp.body)) !== null) {
53
+ proposals.push({
54
+ text: match[1],
55
+ description: match[2],
56
+ type: match[3],
57
+ });
58
+ }
59
+ return proposals;
60
+ }
61
+ //# sourceMappingURL=codeintel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeintel.js","sourceRoot":"","sources":["../../ts-src/adt/codeintel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * ADT client configuration types.
3
+ *
4
+ * Separates ADT-level config (SAP connection, auth, safety) from
5
+ * server-level config (MCP transport, HTTP address). The ADT client
6
+ * only needs to know about SAP — it doesn't care about MCP.
7
+ */
8
+ import type { BTPProxyConfig } from './btp.js';
9
+ import type { SafetyConfig } from './safety.js';
10
+ /** Feature mode: auto detects from SAP system, on/off forces */
11
+ export type FeatureMode = 'auto' | 'on' | 'off';
12
+ /** Feature configuration for optional SAP capabilities */
13
+ export interface FeatureConfig {
14
+ hana: FeatureMode;
15
+ abapGit: FeatureMode;
16
+ rap: FeatureMode;
17
+ amdp: FeatureMode;
18
+ ui5: FeatureMode;
19
+ transport: FeatureMode;
20
+ }
21
+ /** Default feature config: all auto-detect */
22
+ export declare function defaultFeatureConfig(): FeatureConfig;
23
+ /** ADT client configuration */
24
+ export interface AdtClientConfig {
25
+ /** SAP system URL (e.g., "http://sap:8000") */
26
+ baseUrl: string;
27
+ /** SAP username */
28
+ username: string;
29
+ /** SAP password */
30
+ password: string;
31
+ /** SAP client number (default: "001") */
32
+ client: string;
33
+ /** SAP language (default: "EN") */
34
+ language: string;
35
+ /** Skip TLS verification */
36
+ insecure: boolean;
37
+ /** Cookie-based auth (alternative to basic auth) */
38
+ cookies: Record<string, string>;
39
+ /** Safety configuration */
40
+ safety: SafetyConfig;
41
+ /** Feature detection config */
42
+ features: FeatureConfig;
43
+ /** Enable verbose logging */
44
+ verbose: boolean;
45
+ /** BTP Connectivity proxy (Cloud Connector) */
46
+ btpProxy?: BTPProxyConfig;
47
+ /**
48
+ * Per-user SAP-Connectivity-Authentication header (principal propagation).
49
+ * Contains a SAML assertion from the BTP Destination Service.
50
+ * When set, sent with every request to Cloud Connector for user mapping.
51
+ * Used for Approach A (Destination Service generates token) or Approach B Option 2 (backward compat).
52
+ */
53
+ sapConnectivityAuth?: string;
54
+ /**
55
+ * Per-user Proxy-Authorization override (principal propagation, recommended approach).
56
+ * Contains the user exchange access token from jwt-bearer exchange with the Connectivity Service.
57
+ * When set, replaces the regular connectivity proxy token in the Proxy-Authorization header.
58
+ * Per SAP docs (page 209): "Recommended. The application sends one header containing the
59
+ * user exchange token to the Connectivity proxy."
60
+ */
61
+ ppProxyAuth?: string;
62
+ }
63
+ /** Create default ADT client config */
64
+ export declare function defaultAdtClientConfig(): AdtClientConfig;
65
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../ts-src/adt/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,8CAA8C;AAC9C,wBAAgB,oBAAoB,IAAI,aAAa,CASpD;AAED,+BAA+B;AAC/B,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,2BAA2B;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,EAAE,aAAa,CAAC;IACxB,6BAA6B;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uCAAuC;AACvC,wBAAgB,sBAAsB,IAAI,eAAe,CAaxD"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ADT client configuration types.
3
+ *
4
+ * Separates ADT-level config (SAP connection, auth, safety) from
5
+ * server-level config (MCP transport, HTTP address). The ADT client
6
+ * only needs to know about SAP — it doesn't care about MCP.
7
+ */
8
+ import { unrestrictedSafetyConfig } from './safety.js';
9
+ /** Default feature config: all auto-detect */
10
+ export function defaultFeatureConfig() {
11
+ return {
12
+ hana: 'auto',
13
+ abapGit: 'auto',
14
+ rap: 'auto',
15
+ amdp: 'auto',
16
+ ui5: 'auto',
17
+ transport: 'auto',
18
+ };
19
+ }
20
+ /** Create default ADT client config */
21
+ export function defaultAdtClientConfig() {
22
+ return {
23
+ baseUrl: '',
24
+ username: '',
25
+ password: '',
26
+ client: '001',
27
+ language: 'EN',
28
+ insecure: false,
29
+ cookies: {},
30
+ safety: unrestrictedSafetyConfig(),
31
+ features: defaultFeatureConfig(),
32
+ verbose: false,
33
+ };
34
+ }
35
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../ts-src/adt/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAevD,8CAA8C;AAC9C,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,MAAM;QACX,SAAS,EAAE,MAAM;KAClB,CAAC;AACJ,CAAC;AA2CD,uCAAuC;AACvC,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,wBAAwB,EAAE;QAClC,QAAQ,EAAE,oBAAoB,EAAE;QAChC,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Cookie parsing for SAP ADT authentication.
3
+ *
4
+ * Supports two formats:
5
+ * 1. Netscape cookie file (used by curl, wget, browser extensions)
6
+ * Format: domain\tflag\tpath\tsecure\texpiration\tname\tvalue
7
+ * 2. Inline cookie string (key1=val1; key2=val2)
8
+ *
9
+ * Used for BTP Cloud Connector scenarios where browser cookies
10
+ * are exported and passed to ARC-1 for authentication.
11
+ */
12
+ /**
13
+ * Load cookies from a Netscape-format cookie file.
14
+ *
15
+ * Lines starting with # are comments.
16
+ * Empty lines are skipped.
17
+ * Falls back to key=value format if line doesn't have 7 tab-separated fields.
18
+ */
19
+ export declare function loadCookiesFromFile(cookieFile: string): Record<string, string>;
20
+ /** Parse cookie file content (separated for testability) */
21
+ export declare function parseCookieFileContent(content: string): Record<string, string>;
22
+ /**
23
+ * Parse a cookie string in the format "key1=val1; key2=val2".
24
+ * Used with --cookie-string CLI flag or SAP_COOKIE_STRING env var.
25
+ */
26
+ export declare function parseCookieString(cookieString: string): Record<string, string>;
27
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../ts-src/adt/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG9E;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuB9E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc9E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Cookie parsing for SAP ADT authentication.
3
+ *
4
+ * Supports two formats:
5
+ * 1. Netscape cookie file (used by curl, wget, browser extensions)
6
+ * Format: domain\tflag\tpath\tsecure\texpiration\tname\tvalue
7
+ * 2. Inline cookie string (key1=val1; key2=val2)
8
+ *
9
+ * Used for BTP Cloud Connector scenarios where browser cookies
10
+ * are exported and passed to ARC-1 for authentication.
11
+ */
12
+ import { readFileSync } from 'node:fs';
13
+ /**
14
+ * Load cookies from a Netscape-format cookie file.
15
+ *
16
+ * Lines starting with # are comments.
17
+ * Empty lines are skipped.
18
+ * Falls back to key=value format if line doesn't have 7 tab-separated fields.
19
+ */
20
+ export function loadCookiesFromFile(cookieFile) {
21
+ const content = readFileSync(cookieFile, 'utf-8');
22
+ return parseCookieFileContent(content);
23
+ }
24
+ /** Parse cookie file content (separated for testability) */
25
+ export function parseCookieFileContent(content) {
26
+ const cookies = {};
27
+ for (const rawLine of content.split('\n')) {
28
+ const line = rawLine.trim();
29
+ if (line === '' || line.startsWith('#'))
30
+ continue;
31
+ // Netscape format: 7 tab-separated fields
32
+ const parts = line.split('\t');
33
+ if (parts.length >= 7) {
34
+ const name = parts[5];
35
+ const value = parts[6];
36
+ cookies[name] = value;
37
+ }
38
+ else if (line.includes('=')) {
39
+ // Simple key=value fallback
40
+ const eqIndex = line.indexOf('=');
41
+ const key = line.slice(0, eqIndex).trim();
42
+ const val = line.slice(eqIndex + 1).trim();
43
+ if (key)
44
+ cookies[key] = val;
45
+ }
46
+ }
47
+ return cookies;
48
+ }
49
+ /**
50
+ * Parse a cookie string in the format "key1=val1; key2=val2".
51
+ * Used with --cookie-string CLI flag or SAP_COOKIE_STRING env var.
52
+ */
53
+ export function parseCookieString(cookieString) {
54
+ const cookies = {};
55
+ for (const part of cookieString.split(';')) {
56
+ const trimmed = part.trim();
57
+ if (!trimmed.includes('='))
58
+ continue;
59
+ const eqIndex = trimmed.indexOf('=');
60
+ const key = trimmed.slice(0, eqIndex).trim();
61
+ const val = trimmed.slice(eqIndex + 1).trim();
62
+ if (key)
63
+ cookies[key] = val;
64
+ }
65
+ return cookies;
66
+ }
67
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../ts-src/adt/cookies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,0CAA0C;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,4BAA4B;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,GAAG;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,YAAoB;IACpD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * CRUD operations for SAP ADT objects.
3
+ *
4
+ * All write operations follow the pattern: lock → modify → unlock
5
+ * The lock/unlock must happen on the same stateful HTTP session.
6
+ * We use AdtHttpClient.withStatefulSession() to guarantee this.
7
+ *
8
+ * Critical: unlock MUST happen even if modify fails (try-finally pattern).
9
+ * This was a hard-won lesson in the fr0ster codebase — earlier versions
10
+ * leaked locks on error, blocking the object for other developers.
11
+ */
12
+ import type { AdtHttpClient } from './http.js';
13
+ import { type SafetyConfig } from './safety.js';
14
+ /** Lock result from SAP */
15
+ export interface LockResult {
16
+ lockHandle: string;
17
+ corrNr: string;
18
+ isLocal: boolean;
19
+ }
20
+ /** Lock an ABAP object for editing */
21
+ export declare function lockObject(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, accessMode?: string): Promise<LockResult>;
22
+ /** Unlock an ABAP object */
23
+ export declare function unlockObject(http: AdtHttpClient, objectUrl: string, lockHandle: string): Promise<void>;
24
+ /** Create a new ABAP object */
25
+ export declare function createObject(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, body: string, contentType?: string, transport?: string): Promise<string>;
26
+ /** Update source code of an ABAP object (requires lock) */
27
+ export declare function updateSource(http: AdtHttpClient, safety: SafetyConfig, sourceUrl: string, source: string, lockHandle: string, transport?: string): Promise<void>;
28
+ /** Delete an ABAP object (requires lock) */
29
+ export declare function deleteObject(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, lockHandle: string, transport?: string): Promise<void>;
30
+ /**
31
+ * High-level: update source with guaranteed unlock.
32
+ * lock → updateSource → unlock (in try-finally)
33
+ */
34
+ export declare function safeUpdateSource(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, sourceUrl: string, source: string, transport?: string): Promise<void>;
35
+ //# sourceMappingURL=crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../ts-src/adt/crud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAyD,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACvG,2BAA2B;AAC3B,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sCAAsC;AACtC,wBAAsB,UAAU,CAC9B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,SAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,4BAA4B;AAC5B,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5G;AAED,+BAA+B;AAC/B,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,SAAoB,EAC/B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED,2DAA2D;AAC3D,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,4CAA4C;AAC5C,wBAAsB,YAAY,CAChC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CASf"}