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 @@
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../ts-src/adt/features.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * ADT HTTP Transport for ARC-1.
3
+ *
4
+ * Handles all HTTP communication with SAP ADT REST API:
5
+ * - CSRF token lifecycle (fetch, cache, refresh on 403)
6
+ * - Cookie-based and Basic auth
7
+ * - Stateful sessions (lock → modify → unlock must share session)
8
+ * - Automatic retry on session expiry
9
+ *
10
+ * Design decisions:
11
+ *
12
+ * 1. CSRF token fetch uses HEAD /sap/bc/adt/core/discovery with "X-CSRF-Token: fetch".
13
+ * HEAD is ~5s vs ~56s for GET on slow systems (learned from Go version benchmarks).
14
+ *
15
+ * 2. Modifying requests (POST/PUT/DELETE/PATCH) auto-include CSRF token.
16
+ * On 403, token is refreshed and request is retried once.
17
+ * (Pattern from both abap-adt-api and fr0ster implementations.)
18
+ *
19
+ * 3. Stateful sessions use "X-sap-adt-sessiontype: stateful" header.
20
+ * Lock/modify/unlock must use the same session cookies.
21
+ * withStatefulSession() ensures session isolation.
22
+ * (fr0ster uses AsyncLocalStorage for this — we use a simpler approach
23
+ * with an isolated axios instance per session.)
24
+ *
25
+ * 4. sap-client and sap-language are added to every request as query params.
26
+ * This is an SAP convention, not ADT-specific.
27
+ */
28
+ import type { BTPProxyConfig } from './btp.js';
29
+ /** Session type for ADT requests */
30
+ export type SessionType = 'stateful' | 'stateless' | undefined;
31
+ /** Configuration for the ADT HTTP client */
32
+ export interface AdtHttpConfig {
33
+ baseUrl: string;
34
+ username?: string;
35
+ password?: string;
36
+ client?: string;
37
+ language?: string;
38
+ insecure?: boolean;
39
+ cookies?: Record<string, string>;
40
+ sessionType?: SessionType;
41
+ /** BTP Connectivity proxy (Cloud Connector) */
42
+ btpProxy?: BTPProxyConfig;
43
+ /**
44
+ * Per-user SAP-Connectivity-Authentication header value.
45
+ * Set when using BTP Cloud Connector principal propagation.
46
+ * Contains a SAML assertion with the user's identity.
47
+ * When set, this header is sent on EVERY request to the connectivity proxy,
48
+ * which forwards it to the Cloud Connector for user mapping.
49
+ */
50
+ sapConnectivityAuth?: string;
51
+ /** PP Option 1: jwt-bearer exchanged token replacing Proxy-Authorization */
52
+ ppProxyAuth?: string;
53
+ }
54
+ /** Response from an ADT HTTP request */
55
+ export interface AdtResponse {
56
+ statusCode: number;
57
+ headers: Record<string, string>;
58
+ body: string;
59
+ }
60
+ /**
61
+ * ADT HTTP Client — handles CSRF tokens, sessions, and authentication.
62
+ *
63
+ * Not a generic HTTP client: it's purpose-built for SAP ADT REST API conventions.
64
+ */
65
+ export declare class AdtHttpClient {
66
+ private csrfToken;
67
+ private axios;
68
+ private config;
69
+ /**
70
+ * Cookie jar — stores Set-Cookie headers from responses and sends them back.
71
+ *
72
+ * SAP ties CSRF tokens to session cookies (SAP_SESSIONID_*).
73
+ * Without cookie persistence, CSRF-protected requests (POST/PUT/DELETE) fail with 403.
74
+ * This was the root cause of integration test failures: token was fetched via HEAD,
75
+ * but the subsequent POST didn't include the session cookie, so SAP rejected it.
76
+ *
77
+ * Design: simple Map<name, value> — we don't need full cookie jar semantics
78
+ * (domain, path, expiry) because all requests go to the same SAP host.
79
+ */
80
+ private cookieJar;
81
+ constructor(config: AdtHttpConfig);
82
+ /** GET request */
83
+ get(path: string, headers?: Record<string, string>): Promise<AdtResponse>;
84
+ /** POST request (includes CSRF token) */
85
+ post(path: string, body?: string, contentType?: string, headers?: Record<string, string>): Promise<AdtResponse>;
86
+ /** PUT request (includes CSRF token) */
87
+ put(path: string, body: string, contentType?: string, headers?: Record<string, string>): Promise<AdtResponse>;
88
+ /** DELETE request (includes CSRF token) */
89
+ delete(path: string, headers?: Record<string, string>): Promise<AdtResponse>;
90
+ /**
91
+ * Execute a function within an isolated stateful session.
92
+ * Ensures lock/modify/unlock share the same SAP session cookies.
93
+ *
94
+ * Creates a new axios instance with stateful session header,
95
+ * shares CSRF token with the main client.
96
+ */
97
+ withStatefulSession<T>(fn: (client: AdtHttpClient) => Promise<T>): Promise<T>;
98
+ /** Core request method */
99
+ private request;
100
+ /** Handle response: throw on error status, return normalized response */
101
+ private handleResponse;
102
+ /**
103
+ * Fetch CSRF token from SAP.
104
+ * Uses HEAD /sap/bc/adt/core/discovery for speed.
105
+ */
106
+ fetchCsrfToken(): Promise<void>;
107
+ /**
108
+ * Extract and store cookies from a response's Set-Cookie headers.
109
+ * Only stores the name=value part; ignores path, domain, expiry
110
+ * since all requests go to the same SAP host.
111
+ */
112
+ private storeCookies;
113
+ /** Build full URL with sap-client and sap-language query params */
114
+ private buildUrl;
115
+ }
116
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../ts-src/adt/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,oCAAoC;AACpC,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;AAE/D,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAgB;IAC9B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,SAAS,CAAkC;gBAEvC,MAAM,EAAE,aAAa;IA2CjC,kBAAkB;IACZ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAI/E,yCAAyC;IACnC,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,WAAW,CAAC;IAIvB,wCAAwC;IAClC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAInH,2CAA2C;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAIlF;;;;;;OAMG;IACG,mBAAmB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYnF,0BAA0B;YACZ,OAAO;IA6JrB,yEAAyE;IACzE,OAAO,CAAC,cAAc;IAsBtB;;;OAGG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAgErC;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAgBpB,mEAAmE;IACnE,OAAO,CAAC,QAAQ;CAcjB"}
@@ -0,0 +1,374 @@
1
+ /**
2
+ * ADT HTTP Transport for ARC-1.
3
+ *
4
+ * Handles all HTTP communication with SAP ADT REST API:
5
+ * - CSRF token lifecycle (fetch, cache, refresh on 403)
6
+ * - Cookie-based and Basic auth
7
+ * - Stateful sessions (lock → modify → unlock must share session)
8
+ * - Automatic retry on session expiry
9
+ *
10
+ * Design decisions:
11
+ *
12
+ * 1. CSRF token fetch uses HEAD /sap/bc/adt/core/discovery with "X-CSRF-Token: fetch".
13
+ * HEAD is ~5s vs ~56s for GET on slow systems (learned from Go version benchmarks).
14
+ *
15
+ * 2. Modifying requests (POST/PUT/DELETE/PATCH) auto-include CSRF token.
16
+ * On 403, token is refreshed and request is retried once.
17
+ * (Pattern from both abap-adt-api and fr0ster implementations.)
18
+ *
19
+ * 3. Stateful sessions use "X-sap-adt-sessiontype: stateful" header.
20
+ * Lock/modify/unlock must use the same session cookies.
21
+ * withStatefulSession() ensures session isolation.
22
+ * (fr0ster uses AsyncLocalStorage for this — we use a simpler approach
23
+ * with an isolated axios instance per session.)
24
+ *
25
+ * 4. sap-client and sap-language are added to every request as query params.
26
+ * This is an SAP convention, not ADT-specific.
27
+ */
28
+ import { Agent as HttpAgent } from 'node:http';
29
+ import { Agent as HttpsAgent } from 'node:https';
30
+ import axios from 'axios';
31
+ import { logger } from '../server/logger.js';
32
+ import { AdtApiError, AdtNetworkError } from './errors.js';
33
+ /**
34
+ * ADT HTTP Client — handles CSRF tokens, sessions, and authentication.
35
+ *
36
+ * Not a generic HTTP client: it's purpose-built for SAP ADT REST API conventions.
37
+ */
38
+ export class AdtHttpClient {
39
+ csrfToken = '';
40
+ axios;
41
+ config;
42
+ /**
43
+ * Cookie jar — stores Set-Cookie headers from responses and sends them back.
44
+ *
45
+ * SAP ties CSRF tokens to session cookies (SAP_SESSIONID_*).
46
+ * Without cookie persistence, CSRF-protected requests (POST/PUT/DELETE) fail with 403.
47
+ * This was the root cause of integration test failures: token was fetched via HEAD,
48
+ * but the subsequent POST didn't include the session cookie, so SAP rejected it.
49
+ *
50
+ * Design: simple Map<name, value> — we don't need full cookie jar semantics
51
+ * (domain, path, expiry) because all requests go to the same SAP host.
52
+ */
53
+ cookieJar = new Map();
54
+ constructor(config) {
55
+ this.config = config;
56
+ const axiosConfig = {
57
+ baseURL: config.baseUrl,
58
+ // SAP ADT can be slow — 60s timeout
59
+ timeout: 60000,
60
+ // Don't throw on non-2xx (we handle errors ourselves)
61
+ validateStatus: () => true,
62
+ headers: {
63
+ Accept: '*/*',
64
+ },
65
+ };
66
+ // Basic auth
67
+ if (config.username && config.password) {
68
+ axiosConfig.auth = {
69
+ username: config.username,
70
+ password: config.password,
71
+ };
72
+ }
73
+ // Skip TLS verification (for self-signed SAP certs)
74
+ if (config.insecure) {
75
+ axiosConfig.httpsAgent = new HttpsAgent({ rejectUnauthorized: false });
76
+ }
77
+ // BTP Connectivity proxy (Cloud Connector)
78
+ // Routes requests through the BTP connectivity service to reach on-premise SAP.
79
+ // The Proxy-Authorization header is injected per-request in the request() method.
80
+ if (config.btpProxy) {
81
+ axiosConfig.proxy = {
82
+ host: config.btpProxy.host,
83
+ port: config.btpProxy.port,
84
+ protocol: config.btpProxy.protocol,
85
+ };
86
+ // Need an HTTP agent for the proxy connection (not HTTPS)
87
+ axiosConfig.httpAgent = new HttpAgent({ keepAlive: true });
88
+ }
89
+ this.axios = axios.create(axiosConfig);
90
+ }
91
+ /** GET request */
92
+ async get(path, headers) {
93
+ return this.request('GET', path, undefined, undefined, headers);
94
+ }
95
+ /** POST request (includes CSRF token) */
96
+ async post(path, body, contentType, headers) {
97
+ return this.request('POST', path, body, contentType, headers);
98
+ }
99
+ /** PUT request (includes CSRF token) */
100
+ async put(path, body, contentType, headers) {
101
+ return this.request('PUT', path, body, contentType, headers);
102
+ }
103
+ /** DELETE request (includes CSRF token) */
104
+ async delete(path, headers) {
105
+ return this.request('DELETE', path, undefined, undefined, headers);
106
+ }
107
+ /**
108
+ * Execute a function within an isolated stateful session.
109
+ * Ensures lock/modify/unlock share the same SAP session cookies.
110
+ *
111
+ * Creates a new axios instance with stateful session header,
112
+ * shares CSRF token with the main client.
113
+ */
114
+ async withStatefulSession(fn) {
115
+ const sessionConfig = {
116
+ ...this.config,
117
+ sessionType: 'stateful',
118
+ };
119
+ const sessionClient = new AdtHttpClient(sessionConfig);
120
+ // Share CSRF token and cookies so we don't need to re-fetch
121
+ sessionClient.csrfToken = this.csrfToken;
122
+ sessionClient.cookieJar = new Map(this.cookieJar);
123
+ return fn(sessionClient);
124
+ }
125
+ /** Core request method */
126
+ async request(method, path, body, contentType, extraHeaders) {
127
+ // Auto-fetch CSRF token for modifying requests
128
+ if (isModifyingMethod(method) && !this.csrfToken) {
129
+ await this.fetchCsrfToken();
130
+ }
131
+ const headers = {
132
+ ...extraHeaders,
133
+ };
134
+ if (isModifyingMethod(method)) {
135
+ headers['X-CSRF-Token'] = this.csrfToken;
136
+ }
137
+ if (this.config.sessionType === 'stateful') {
138
+ headers['X-sap-adt-sessiontype'] = 'stateful';
139
+ }
140
+ if (contentType) {
141
+ headers['Content-Type'] = contentType;
142
+ }
143
+ // Build cookie header from: config cookies + cookie jar (jar takes precedence)
144
+ const cookieParts = [];
145
+ if (this.config.cookies) {
146
+ for (const [k, v] of Object.entries(this.config.cookies)) {
147
+ cookieParts.push(`${k}=${v}`);
148
+ }
149
+ }
150
+ for (const [k, v] of this.cookieJar) {
151
+ cookieParts.push(`${k}=${v}`);
152
+ }
153
+ if (cookieParts.length > 0) {
154
+ headers.Cookie = cookieParts.join('; ');
155
+ }
156
+ // BTP Connectivity proxy: inject Proxy-Authorization JWT for Cloud Connector tunnel
157
+ if (this.config.btpProxy) {
158
+ if (this.config.ppProxyAuth) {
159
+ // PP Option 1 (not currently used — kept for future compatibility):
160
+ // The jwt-bearer exchanged token replaces the regular proxy token.
161
+ headers['Proxy-Authorization'] = this.config.ppProxyAuth;
162
+ }
163
+ else {
164
+ // Regular proxy auth — used for both non-PP and PP Option 2.
165
+ // For PP Option 2, this is the standard connectivity service token;
166
+ // the user identity is carried separately in SAP-Connectivity-Authentication.
167
+ const proxyToken = await this.config.btpProxy.getProxyToken();
168
+ headers['Proxy-Authorization'] = `Bearer ${proxyToken}`;
169
+ }
170
+ }
171
+ // Principal Propagation via SAP-Connectivity-Authentication header (Option 2).
172
+ // Contains the ORIGINAL user JWT (not exchanged). The Cloud Connector reads
173
+ // this header, extracts the user identity (email), generates a short-lived
174
+ // X.509 certificate (CN=<email>), and injects it as SSL_CLIENT_CERT when
175
+ // connecting to SAP's HTTPS port. SAP CERTRULE maps the cert to a SAP user.
176
+ // See: https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/configure-principal-propagation-via-user-exchange-token
177
+ if (this.config.sapConnectivityAuth && !this.config.ppProxyAuth) {
178
+ headers['SAP-Connectivity-Authentication'] = this.config.sapConnectivityAuth;
179
+ }
180
+ const url = this.buildUrl(path);
181
+ const httpStart = Date.now();
182
+ try {
183
+ const response = await this.axios.request({
184
+ method,
185
+ url,
186
+ data: body,
187
+ headers,
188
+ });
189
+ // Persist any Set-Cookie headers from the response
190
+ this.storeCookies(response);
191
+ // Handle CSRF token refresh on 403 (modifying requests only)
192
+ if (response.status === 403 && isModifyingMethod(method)) {
193
+ await this.fetchCsrfToken();
194
+ headers['X-CSRF-Token'] = this.csrfToken;
195
+ // Update cookie header after CSRF fetch may have set new cookies
196
+ const updatedCookieParts = [];
197
+ for (const [k, v] of this.cookieJar) {
198
+ updatedCookieParts.push(`${k}=${v}`);
199
+ }
200
+ if (updatedCookieParts.length > 0) {
201
+ headers.Cookie = updatedCookieParts.join('; ');
202
+ }
203
+ const retryResponse = await this.axios.request({
204
+ method,
205
+ url,
206
+ data: body,
207
+ headers,
208
+ });
209
+ this.storeCookies(retryResponse);
210
+ const result = this.handleResponse(retryResponse, path);
211
+ logger.emitAudit({
212
+ timestamp: new Date().toISOString(),
213
+ level: 'info',
214
+ event: 'http_request',
215
+ method,
216
+ path,
217
+ statusCode: retryResponse.status,
218
+ durationMs: Date.now() - httpStart,
219
+ });
220
+ return result;
221
+ }
222
+ // Store CSRF token from response
223
+ const responseToken = response.headers['x-csrf-token'];
224
+ if (responseToken && responseToken !== 'Required') {
225
+ this.csrfToken = responseToken;
226
+ }
227
+ const result = this.handleResponse(response, path);
228
+ logger.emitAudit({
229
+ timestamp: new Date().toISOString(),
230
+ level: 'debug',
231
+ event: 'http_request',
232
+ method,
233
+ path,
234
+ statusCode: response.status,
235
+ durationMs: Date.now() - httpStart,
236
+ });
237
+ return result;
238
+ }
239
+ catch (err) {
240
+ // Log failed HTTP requests
241
+ const durationMs = Date.now() - httpStart;
242
+ if (err instanceof AdtApiError) {
243
+ logger.emitAudit({
244
+ timestamp: new Date().toISOString(),
245
+ level: 'warn',
246
+ event: 'http_request',
247
+ method,
248
+ path,
249
+ statusCode: err.statusCode,
250
+ durationMs,
251
+ errorBody: err.responseBody?.slice(0, 200),
252
+ });
253
+ }
254
+ if (axios.isAxiosError(err)) {
255
+ throw new AdtNetworkError(err.message, err);
256
+ }
257
+ throw err;
258
+ }
259
+ }
260
+ /** Handle response: throw on error status, return normalized response */
261
+ handleResponse(response, path) {
262
+ const body = typeof response.data === 'string' ? response.data : String(response.data ?? '');
263
+ if (response.status >= 400) {
264
+ throw new AdtApiError(body.slice(0, 500), response.status, path, body);
265
+ }
266
+ // Flatten headers to Record<string, string>
267
+ const headers = {};
268
+ for (const [key, value] of Object.entries(response.headers)) {
269
+ if (typeof value === 'string') {
270
+ headers[key] = value;
271
+ }
272
+ }
273
+ return {
274
+ statusCode: response.status,
275
+ headers,
276
+ body,
277
+ };
278
+ }
279
+ /**
280
+ * Fetch CSRF token from SAP.
281
+ * Uses HEAD /sap/bc/adt/core/discovery for speed.
282
+ */
283
+ async fetchCsrfToken() {
284
+ const url = this.buildUrl('/sap/bc/adt/core/discovery');
285
+ const headers = {
286
+ 'X-CSRF-Token': 'fetch',
287
+ Accept: '*/*',
288
+ };
289
+ if (this.config.sessionType === 'stateful') {
290
+ headers['X-sap-adt-sessiontype'] = 'stateful';
291
+ }
292
+ // Include existing cookies (config + jar) so session is maintained
293
+ const cookieParts = [];
294
+ if (this.config.cookies) {
295
+ for (const [k, v] of Object.entries(this.config.cookies)) {
296
+ cookieParts.push(`${k}=${v}`);
297
+ }
298
+ }
299
+ for (const [k, v] of this.cookieJar) {
300
+ cookieParts.push(`${k}=${v}`);
301
+ }
302
+ if (cookieParts.length > 0) {
303
+ headers.Cookie = cookieParts.join('; ');
304
+ }
305
+ try {
306
+ const response = await this.axios.request({
307
+ method: 'HEAD',
308
+ url,
309
+ headers,
310
+ });
311
+ // Store cookies from CSRF response — critical for session correlation
312
+ this.storeCookies(response);
313
+ const token = response.headers['x-csrf-token'];
314
+ if (!token || token === 'Required') {
315
+ if (response.status === 401) {
316
+ throw new AdtApiError('Authentication failed (401): check username/password', 401, '/sap/bc/adt/core/discovery');
317
+ }
318
+ if (response.status === 403) {
319
+ throw new AdtApiError('Access forbidden (403): check user authorizations', 403, '/sap/bc/adt/core/discovery');
320
+ }
321
+ throw new AdtApiError(`No CSRF token in response (HTTP ${response.status})`, response.status, '/sap/bc/adt/core/discovery');
322
+ }
323
+ this.csrfToken = token;
324
+ }
325
+ catch (err) {
326
+ if (err instanceof AdtApiError)
327
+ throw err;
328
+ if (axios.isAxiosError(err)) {
329
+ throw new AdtNetworkError(`CSRF token fetch failed: ${err.message}`, err);
330
+ }
331
+ throw err;
332
+ }
333
+ }
334
+ /**
335
+ * Extract and store cookies from a response's Set-Cookie headers.
336
+ * Only stores the name=value part; ignores path, domain, expiry
337
+ * since all requests go to the same SAP host.
338
+ */
339
+ storeCookies(response) {
340
+ const setCookieHeaders = response.headers['set-cookie'];
341
+ if (!setCookieHeaders || !Array.isArray(setCookieHeaders))
342
+ return;
343
+ for (const cookie of setCookieHeaders) {
344
+ // Set-Cookie: name=value; Path=/; HttpOnly; ...
345
+ const nameValue = cookie.split(';')[0];
346
+ if (!nameValue)
347
+ continue;
348
+ const eqIdx = nameValue.indexOf('=');
349
+ if (eqIdx <= 0)
350
+ continue;
351
+ const name = nameValue.substring(0, eqIdx).trim();
352
+ const value = nameValue.substring(eqIdx + 1).trim();
353
+ this.cookieJar.set(name, value);
354
+ }
355
+ }
356
+ /** Build full URL with sap-client and sap-language query params */
357
+ buildUrl(path) {
358
+ const base = this.config.baseUrl.replace(/\/$/, '');
359
+ const normalizedPath = path.startsWith('/') ? path : `/${path}`;
360
+ const url = new URL(base + normalizedPath);
361
+ if (this.config.client) {
362
+ url.searchParams.set('sap-client', this.config.client);
363
+ }
364
+ if (this.config.language) {
365
+ url.searchParams.set('sap-language', this.config.language);
366
+ }
367
+ return url.toString();
368
+ }
369
+ }
370
+ /** HTTP methods that modify server state and require CSRF token */
371
+ function isModifyingMethod(method) {
372
+ return ['POST', 'PUT', 'DELETE', 'PATCH'].includes(method.toUpperCase());
373
+ }
374
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../ts-src/adt/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Safety system for ARC-1.
3
+ *
4
+ * Gates all operations before they reach SAP. This is the first line of defense
5
+ * against unintended modifications — it runs before any HTTP call.
6
+ *
7
+ * Key design principle: safety checks are declarative and composable.
8
+ * Each check is independent: readOnly, blockFreeSQL, allowedOps, disallowedOps,
9
+ * allowedPackages, enableTransports, etc. They combine additively — if ANY
10
+ * check blocks the operation, it's blocked.
11
+ *
12
+ * This matches the Go implementation exactly (pkg/adt/safety.go) to ensure
13
+ * behavioral parity during migration.
14
+ */
15
+ /**
16
+ * Operation type codes.
17
+ * Single-character codes used in allowedOps/disallowedOps strings.
18
+ * Example: "RSQ" = allow Read, Search, Query only.
19
+ */
20
+ export declare const OperationType: {
21
+ readonly Read: "R";
22
+ readonly Search: "S";
23
+ readonly Query: "Q";
24
+ readonly FreeSQL: "F";
25
+ readonly Create: "C";
26
+ readonly Update: "U";
27
+ readonly Delete: "D";
28
+ readonly Activate: "A";
29
+ readonly Test: "T";
30
+ readonly Lock: "L";
31
+ readonly Intelligence: "I";
32
+ readonly Workflow: "W";
33
+ readonly Transport: "X";
34
+ };
35
+ export type OperationTypeCode = (typeof OperationType)[keyof typeof OperationType];
36
+ export interface SafetyConfig {
37
+ readOnly: boolean;
38
+ blockFreeSQL: boolean;
39
+ allowedOps: string;
40
+ disallowedOps: string;
41
+ allowedPackages: string[];
42
+ dryRun: boolean;
43
+ enableTransports: boolean;
44
+ transportReadOnly: boolean;
45
+ allowedTransports: string[];
46
+ allowTransportableEdits: boolean;
47
+ }
48
+ /** Safe defaults: read-only, no free SQL, standard ops only */
49
+ export declare function defaultSafetyConfig(): SafetyConfig;
50
+ /** No restrictions — use with caution */
51
+ export declare function unrestrictedSafetyConfig(): SafetyConfig;
52
+ /** Check if an operation type is allowed by the safety config */
53
+ export declare function isOperationAllowed(config: SafetyConfig, op: OperationTypeCode): boolean;
54
+ /** Check operation and throw AdtSafetyError if blocked */
55
+ export declare function checkOperation(config: SafetyConfig, op: OperationTypeCode, opName: string): void;
56
+ /** Check if operations on a given package are allowed */
57
+ export declare function isPackageAllowed(config: SafetyConfig, pkg: string): boolean;
58
+ /** Check package and throw AdtSafetyError if blocked */
59
+ export declare function checkPackage(config: SafetyConfig, pkg: string): void;
60
+ /** Check if operations on a given transport are allowed */
61
+ export declare function isTransportAllowed(config: SafetyConfig, transport: string): boolean;
62
+ /** Check if transport write operations are allowed */
63
+ export declare function isTransportWriteAllowed(config: SafetyConfig): boolean;
64
+ /** Check transport operation and throw AdtSafetyError if blocked */
65
+ export declare function checkTransport(config: SafetyConfig, transport: string, opName: string, isWrite: boolean): void;
66
+ /** Check if editing a transportable object is allowed */
67
+ export declare function checkTransportableEdit(config: SafetyConfig, transport: string, opName: string): void;
68
+ /** Human-readable description of the safety configuration */
69
+ export declare function describeSafety(config: SafetyConfig): string;
70
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../ts-src/adt/safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;CAchB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAKnF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,YAAY,CAalD;AAED,yCAAyC;AACzC,wBAAgB,wBAAwB,IAAI,YAAY,CAavD;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAoBvF;AAED,0DAA0D;AAC1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAIhG;AAED,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAmB3E;AAED,wDAAwD;AACxD,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMpE;AAoBD,2DAA2D;AAC3D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAInF;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAGrE;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC9G;AAED,yDAAyD;AACzD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkBpG;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAiB3D"}