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.
- package/LICENSE +21 -0
- package/README.md +222 -0
- package/bin/arc1.js +12 -0
- package/dist/adt/btp.d.ts +122 -0
- package/dist/adt/btp.d.ts.map +1 -0
- package/dist/adt/btp.js +392 -0
- package/dist/adt/btp.js.map +1 -0
- package/dist/adt/client.d.ts +89 -0
- package/dist/adt/client.d.ts.map +1 -0
- package/dist/adt/client.js +208 -0
- package/dist/adt/client.js.map +1 -0
- package/dist/adt/codeintel.d.ts +38 -0
- package/dist/adt/codeintel.d.ts.map +1 -0
- package/dist/adt/codeintel.js +61 -0
- package/dist/adt/codeintel.js.map +1 -0
- package/dist/adt/config.d.ts +65 -0
- package/dist/adt/config.d.ts.map +1 -0
- package/dist/adt/config.js +35 -0
- package/dist/adt/config.js.map +1 -0
- package/dist/adt/cookies.d.ts +27 -0
- package/dist/adt/cookies.d.ts.map +1 -0
- package/dist/adt/cookies.js +67 -0
- package/dist/adt/cookies.js.map +1 -0
- package/dist/adt/crud.d.ts +35 -0
- package/dist/adt/crud.d.ts.map +1 -0
- package/dist/adt/crud.js +87 -0
- package/dist/adt/crud.js.map +1 -0
- package/dist/adt/devtools.d.ts +32 -0
- package/dist/adt/devtools.d.ts.map +1 -0
- package/dist/adt/devtools.js +154 -0
- package/dist/adt/devtools.js.map +1 -0
- package/dist/adt/errors.d.ts +49 -0
- package/dist/adt/errors.d.ts.map +1 -0
- package/dist/adt/errors.js +80 -0
- package/dist/adt/errors.js.map +1 -0
- package/dist/adt/features.d.ts +44 -0
- package/dist/adt/features.d.ts.map +1 -0
- package/dist/adt/features.js +173 -0
- package/dist/adt/features.js.map +1 -0
- package/dist/adt/http.d.ts +116 -0
- package/dist/adt/http.d.ts.map +1 -0
- package/dist/adt/http.js +374 -0
- package/dist/adt/http.js.map +1 -0
- package/dist/adt/safety.d.ts +70 -0
- package/dist/adt/safety.d.ts.map +1 -0
- package/dist/adt/safety.js +222 -0
- package/dist/adt/safety.js.map +1 -0
- package/dist/adt/transport.d.ts +18 -0
- package/dist/adt/transport.d.ts.map +1 -0
- package/dist/adt/transport.js +66 -0
- package/dist/adt/transport.js.map +1 -0
- package/dist/adt/types.d.ts +91 -0
- package/dist/adt/types.d.ts.map +1 -0
- package/dist/adt/types.js +9 -0
- package/dist/adt/types.js.map +1 -0
- package/dist/adt/xml-parser.d.ts +109 -0
- package/dist/adt/xml-parser.d.ts.map +1 -0
- package/dist/adt/xml-parser.js +283 -0
- package/dist/adt/xml-parser.js.map +1 -0
- package/dist/cache/cache.d.ts +61 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +14 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/memory.d.ts +25 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +69 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/sqlite.d.ts +26 -0
- package/dist/cache/sqlite.d.ts.map +1 -0
- package/dist/cache/sqlite.js +130 -0
- package/dist/cache/sqlite.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +101 -0
- package/dist/cli.js.map +1 -0
- package/dist/context/compressor.d.ts +33 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +208 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/contract.d.ts +14 -0
- package/dist/context/contract.d.ts.map +1 -0
- package/dist/context/contract.js +202 -0
- package/dist/context/contract.js.map +1 -0
- package/dist/context/deps.d.ts +32 -0
- package/dist/context/deps.d.ts.map +1 -0
- package/dist/context/deps.js +240 -0
- package/dist/context/deps.js.map +1 -0
- package/dist/context/types.d.ts +56 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +10 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handlers/intent.d.ts +46 -0
- package/dist/handlers/intent.d.ts.map +1 -0
- package/dist/handlers/intent.js +539 -0
- package/dist/handlers/intent.js.map +1 -0
- package/dist/handlers/tools.d.ts +21 -0
- package/dist/handlers/tools.d.ts.map +1 -0
- package/dist/handlers/tools.js +260 -0
- package/dist/handlers/tools.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/lint.d.ts +35 -0
- package/dist/lint/lint.d.ts.map +1 -0
- package/dist/lint/lint.js +67 -0
- package/dist/lint/lint.js.map +1 -0
- package/dist/server/audit.d.ts +96 -0
- package/dist/server/audit.d.ts.map +1 -0
- package/dist/server/audit.js +27 -0
- package/dist/server/audit.js.map +1 -0
- package/dist/server/config.d.ts +19 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +101 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/context.d.ts +20 -0
- package/dist/server/context.d.ts.map +1 -0
- package/dist/server/context.js +20 -0
- package/dist/server/context.js.map +1 -0
- package/dist/server/elicit.d.ts +43 -0
- package/dist/server/elicit.d.ts.map +1 -0
- package/dist/server/elicit.js +183 -0
- package/dist/server/elicit.js.map +1 -0
- package/dist/server/http.d.ts +34 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +328 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/logger.d.ts +57 -0
- package/dist/server/logger.d.ts.map +1 -0
- package/dist/server/logger.js +129 -0
- package/dist/server/logger.js.map +1 -0
- package/dist/server/server.d.ts +25 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +307 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/sinks/btp-auditlog.d.ts +48 -0
- package/dist/server/sinks/btp-auditlog.d.ts.map +1 -0
- package/dist/server/sinks/btp-auditlog.js +232 -0
- package/dist/server/sinks/btp-auditlog.js.map +1 -0
- package/dist/server/sinks/file.d.ts +22 -0
- package/dist/server/sinks/file.d.ts.map +1 -0
- package/dist/server/sinks/file.js +59 -0
- package/dist/server/sinks/file.js.map +1 -0
- package/dist/server/sinks/stderr.d.ts +19 -0
- package/dist/server/sinks/stderr.d.ts.map +1 -0
- package/dist/server/sinks/stderr.js +63 -0
- package/dist/server/sinks/stderr.js.map +1 -0
- package/dist/server/sinks/types.d.ts +14 -0
- package/dist/server/sinks/types.d.ts.map +1 -0
- package/dist/server/sinks/types.js +8 -0
- package/dist/server/sinks/types.js.map +1 -0
- package/dist/server/types.d.ts +54 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +42 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/xsuaa.d.ts +77 -0
- package/dist/server/xsuaa.d.ts.map +1 -0
- package/dist/server/xsuaa.js +364 -0
- package/dist/server/xsuaa.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File log sink for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Appends JSON-line audit events to a file.
|
|
5
|
+
* Useful in Docker (mount volume) or for post-hoc log analysis.
|
|
6
|
+
*
|
|
7
|
+
* Writes are fire-and-forget — errors are logged to stderr but never thrown.
|
|
8
|
+
* All events are written regardless of level (file is the full audit trail).
|
|
9
|
+
*/
|
|
10
|
+
import { appendFile } from 'node:fs/promises';
|
|
11
|
+
export class FileSink {
|
|
12
|
+
filePath;
|
|
13
|
+
buffer = [];
|
|
14
|
+
flushTimer;
|
|
15
|
+
constructor(filePath) {
|
|
16
|
+
this.filePath = filePath;
|
|
17
|
+
// Flush buffer every 500ms to balance write frequency vs latency
|
|
18
|
+
this.flushTimer = setInterval(() => {
|
|
19
|
+
this.flushSync();
|
|
20
|
+
}, 500);
|
|
21
|
+
// Don't prevent process exit
|
|
22
|
+
if (this.flushTimer.unref) {
|
|
23
|
+
this.flushTimer.unref();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
write(event) {
|
|
27
|
+
this.buffer.push(JSON.stringify(event));
|
|
28
|
+
}
|
|
29
|
+
async flush() {
|
|
30
|
+
if (this.flushTimer) {
|
|
31
|
+
clearInterval(this.flushTimer);
|
|
32
|
+
this.flushTimer = undefined;
|
|
33
|
+
}
|
|
34
|
+
await this.writeBuffer();
|
|
35
|
+
}
|
|
36
|
+
flushSync() {
|
|
37
|
+
if (this.buffer.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
const lines = this.buffer.splice(0);
|
|
40
|
+
const data = `${lines.join('\n')}\n`;
|
|
41
|
+
// Fire-and-forget — errors go to stderr
|
|
42
|
+
appendFile(this.filePath, data, 'utf-8').catch((err) => {
|
|
43
|
+
process.stderr.write(`[FileSink] Failed to write to ${this.filePath}: ${err}\n`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
async writeBuffer() {
|
|
47
|
+
if (this.buffer.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
const lines = this.buffer.splice(0);
|
|
50
|
+
const data = `${lines.join('\n')}\n`;
|
|
51
|
+
try {
|
|
52
|
+
await appendFile(this.filePath, data, 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
process.stderr.write(`[FileSink] Failed to write to ${this.filePath}: ${err}\n`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../ts-src/server/sinks/file.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,MAAM,OAAO,QAAQ;IAIC;IAHZ,MAAM,GAAa,EAAE,CAAC;IACtB,UAAU,CAA6C;IAE/D,YAAoB,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;QAClC,iEAAiE;QACjE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,6BAA6B;QAC7B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAiB;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC,wCAAwC;QACxC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,KAAK,GAAG,IAAI,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr log sink for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Writes audit events to stderr in text or JSON format.
|
|
5
|
+
* This is the default sink — always active.
|
|
6
|
+
*
|
|
7
|
+
* Critical: never write to stdout (reserved for MCP JSON-RPC).
|
|
8
|
+
*/
|
|
9
|
+
import type { AuditEvent } from '../audit.js';
|
|
10
|
+
import type { LogLevel } from '../logger.js';
|
|
11
|
+
import type { LogSink } from './types.js';
|
|
12
|
+
export type LogFormat = 'text' | 'json';
|
|
13
|
+
export declare class StderrSink implements LogSink {
|
|
14
|
+
private format;
|
|
15
|
+
private minLevel;
|
|
16
|
+
constructor(format?: LogFormat, minLevel?: LogLevel);
|
|
17
|
+
write(event: AuditEvent): void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=stderr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stderr.d.ts","sourceRoot":"","sources":["../../../ts-src/server/sinks/stderr.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AASxC,qBAAa,UAAW,YAAW,OAAO;IAItC,OAAO,CAAC,MAAM;IAHhB,OAAO,CAAC,QAAQ,CAAS;gBAGf,MAAM,GAAE,SAAkB,EAClC,QAAQ,GAAE,QAAiB;IAK7B,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;CAa/B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stderr log sink for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Writes audit events to stderr in text or JSON format.
|
|
5
|
+
* This is the default sink — always active.
|
|
6
|
+
*
|
|
7
|
+
* Critical: never write to stdout (reserved for MCP JSON-RPC).
|
|
8
|
+
*/
|
|
9
|
+
const LEVEL_PRIORITY = {
|
|
10
|
+
debug: 0,
|
|
11
|
+
info: 1,
|
|
12
|
+
warn: 2,
|
|
13
|
+
error: 3,
|
|
14
|
+
};
|
|
15
|
+
export class StderrSink {
|
|
16
|
+
format;
|
|
17
|
+
minLevel;
|
|
18
|
+
constructor(format = 'text', minLevel = 'info') {
|
|
19
|
+
this.format = format;
|
|
20
|
+
this.minLevel = LEVEL_PRIORITY[minLevel];
|
|
21
|
+
}
|
|
22
|
+
write(event) {
|
|
23
|
+
if (LEVEL_PRIORITY[event.level] < this.minLevel)
|
|
24
|
+
return;
|
|
25
|
+
const safeEvent = redactSensitive(event);
|
|
26
|
+
if (this.format === 'json') {
|
|
27
|
+
process.stderr.write(`${JSON.stringify(safeEvent)}\n`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
const { timestamp, level, event: eventType, ...rest } = safeEvent;
|
|
31
|
+
const ctx = Object.keys(rest).length > 0 ? ` ${JSON.stringify(rest)}` : '';
|
|
32
|
+
process.stderr.write(`[${timestamp}] ${level.toUpperCase()}: [${eventType}]${ctx}\n`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Redact known sensitive fields to prevent credential leakage in logs */
|
|
37
|
+
function redactSensitive(event) {
|
|
38
|
+
const sensitiveKeys = ['password', 'token', 'cookie', 'authorization', 'secret', 'csrf'];
|
|
39
|
+
const result = {};
|
|
40
|
+
for (const [key, value] of Object.entries(event)) {
|
|
41
|
+
if (sensitiveKeys.some((s) => key.toLowerCase().includes(s))) {
|
|
42
|
+
result[key] = '[REDACTED]';
|
|
43
|
+
}
|
|
44
|
+
else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
45
|
+
// Shallow redaction for nested objects (e.g., args)
|
|
46
|
+
const nested = {};
|
|
47
|
+
for (const [nk, nv] of Object.entries(value)) {
|
|
48
|
+
if (sensitiveKeys.some((s) => nk.toLowerCase().includes(s))) {
|
|
49
|
+
nested[nk] = '[REDACTED]';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
nested[nk] = nv;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
result[key] = nested;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
result[key] = value;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=stderr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stderr.js","sourceRoot":"","sources":["../../../ts-src/server/sinks/stderr.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log sink interface for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Sinks receive structured audit events and persist them.
|
|
5
|
+
* write() is fire-and-forget — sinks must not throw.
|
|
6
|
+
*/
|
|
7
|
+
import type { AuditEvent } from '../audit.js';
|
|
8
|
+
export interface LogSink {
|
|
9
|
+
/** Write an audit event. Must not throw. */
|
|
10
|
+
write(event: AuditEvent): void;
|
|
11
|
+
/** Flush pending writes (for graceful shutdown). */
|
|
12
|
+
flush?(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../ts-src/server/sinks/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,OAAO;IACtB,4CAA4C;IAC5C,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,oDAAoD;IACpD,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../ts-src/server/sinks/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server configuration types for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Configuration priority (highest to lowest):
|
|
5
|
+
* 1. CLI flags (--url, --user, etc.)
|
|
6
|
+
* 2. Environment variables (SAP_URL, SAP_USER, etc.)
|
|
7
|
+
* 3. .env file
|
|
8
|
+
* 4. Defaults
|
|
9
|
+
*
|
|
10
|
+
* This matches the Go version's configuration precedence.
|
|
11
|
+
*/
|
|
12
|
+
/** MCP transport type */
|
|
13
|
+
export type TransportType = 'stdio' | 'http-streamable';
|
|
14
|
+
/** Feature toggle: auto detects from SAP system, on/off forces */
|
|
15
|
+
export type FeatureToggle = 'auto' | 'on' | 'off';
|
|
16
|
+
/** Server configuration — all fields needed to start ARC-1 */
|
|
17
|
+
export interface ServerConfig {
|
|
18
|
+
url: string;
|
|
19
|
+
username: string;
|
|
20
|
+
password: string;
|
|
21
|
+
client: string;
|
|
22
|
+
language: string;
|
|
23
|
+
insecure: boolean;
|
|
24
|
+
cookieFile?: string;
|
|
25
|
+
cookieString?: string;
|
|
26
|
+
transport: TransportType;
|
|
27
|
+
httpAddr: string;
|
|
28
|
+
readOnly: boolean;
|
|
29
|
+
blockFreeSQL: boolean;
|
|
30
|
+
allowedOps: string;
|
|
31
|
+
disallowedOps: string;
|
|
32
|
+
allowedPackages: string[];
|
|
33
|
+
allowTransportableEdits: boolean;
|
|
34
|
+
enableTransports: boolean;
|
|
35
|
+
featureAbapGit: FeatureToggle;
|
|
36
|
+
featureRap: FeatureToggle;
|
|
37
|
+
featureAmdp: FeatureToggle;
|
|
38
|
+
featureUi5: FeatureToggle;
|
|
39
|
+
featureTransport: FeatureToggle;
|
|
40
|
+
featureHana: FeatureToggle;
|
|
41
|
+
apiKey?: string;
|
|
42
|
+
oidcIssuer?: string;
|
|
43
|
+
oidcAudience?: string;
|
|
44
|
+
xsuaaAuth: boolean;
|
|
45
|
+
ppEnabled: boolean;
|
|
46
|
+
ppStrict: boolean;
|
|
47
|
+
logFile?: string;
|
|
48
|
+
logLevel: 'debug' | 'info' | 'warn' | 'error';
|
|
49
|
+
logFormat: 'text' | 'json';
|
|
50
|
+
verbose: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** Default configuration values */
|
|
53
|
+
export declare const DEFAULT_CONFIG: ServerConfig;
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../ts-src/server/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,yBAAyB;AACzB,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAExD,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AAElD,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAE3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IAGjB,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,uBAAuB,EAAE,OAAO,CAAC;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAG1B,cAAc,EAAE,aAAa,CAAC;IAC9B,UAAU,EAAE,aAAa,CAAC;IAC1B,WAAW,EAAE,aAAa,CAAC;IAC3B,UAAU,EAAE,aAAa,CAAC;IAC1B,gBAAgB,EAAE,aAAa,CAAC;IAChC,WAAW,EAAE,aAAa,CAAC;IAG3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IAGnB,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAGlB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9C,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAG3B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,mCAAmC;AACnC,eAAO,MAAM,cAAc,EAAE,YA4B5B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server configuration types for ARC-1.
|
|
3
|
+
*
|
|
4
|
+
* Configuration priority (highest to lowest):
|
|
5
|
+
* 1. CLI flags (--url, --user, etc.)
|
|
6
|
+
* 2. Environment variables (SAP_URL, SAP_USER, etc.)
|
|
7
|
+
* 3. .env file
|
|
8
|
+
* 4. Defaults
|
|
9
|
+
*
|
|
10
|
+
* This matches the Go version's configuration precedence.
|
|
11
|
+
*/
|
|
12
|
+
/** Default configuration values */
|
|
13
|
+
export const DEFAULT_CONFIG = {
|
|
14
|
+
url: '',
|
|
15
|
+
username: '',
|
|
16
|
+
password: '',
|
|
17
|
+
client: '001',
|
|
18
|
+
language: 'EN',
|
|
19
|
+
insecure: false,
|
|
20
|
+
transport: 'stdio',
|
|
21
|
+
httpAddr: '0.0.0.0:8080',
|
|
22
|
+
readOnly: false,
|
|
23
|
+
blockFreeSQL: false,
|
|
24
|
+
allowedOps: '',
|
|
25
|
+
disallowedOps: '',
|
|
26
|
+
allowedPackages: [],
|
|
27
|
+
allowTransportableEdits: false,
|
|
28
|
+
enableTransports: false,
|
|
29
|
+
featureAbapGit: 'auto',
|
|
30
|
+
featureRap: 'auto',
|
|
31
|
+
featureAmdp: 'auto',
|
|
32
|
+
featureUi5: 'auto',
|
|
33
|
+
featureTransport: 'auto',
|
|
34
|
+
featureHana: 'auto',
|
|
35
|
+
xsuaaAuth: false,
|
|
36
|
+
ppEnabled: false,
|
|
37
|
+
ppStrict: false,
|
|
38
|
+
logLevel: 'info',
|
|
39
|
+
logFormat: 'text',
|
|
40
|
+
verbose: false,
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../ts-src/server/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA8DH,mCAAmC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,GAAG,EAAE,EAAE;IACP,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,KAAK;IACf,YAAY,EAAE,KAAK;IACnB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,EAAE;IACjB,eAAe,EAAE,EAAE;IACnB,uBAAuB,EAAE,KAAK;IAC9B,gBAAgB,EAAE,KAAK;IACvB,cAAc,EAAE,MAAM;IACtB,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,MAAM;IAClB,gBAAgB,EAAE,MAAM;IACxB,WAAW,EAAE,MAAM;IACnB,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,MAAM;IACjB,OAAO,EAAE,KAAK;CACf,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XSUAA OAuth proxy for MCP-native clients.
|
|
3
|
+
*
|
|
4
|
+
* Enables Claude Desktop, Cursor, VS Code, and MCP Inspector to authenticate
|
|
5
|
+
* via BTP XSUAA using the MCP specification's OAuth discovery (RFC 8414).
|
|
6
|
+
*
|
|
7
|
+
* Uses the MCP SDK's ProxyOAuthServerProvider to delegate the OAuth flow
|
|
8
|
+
* to XSUAA, and @sap/xssec for SAP-specific JWT validation.
|
|
9
|
+
*
|
|
10
|
+
* Design decisions:
|
|
11
|
+
*
|
|
12
|
+
* 1. @sap/xssec for token validation (not jose):
|
|
13
|
+
* - SAP-specific x5t thumbprint and proof-of-possession validation
|
|
14
|
+
* - Proper XSUAA audience format handling
|
|
15
|
+
* - Offline validation with automatic JWKS caching
|
|
16
|
+
* - checkLocalScope() for scope enforcement
|
|
17
|
+
*
|
|
18
|
+
* 2. In-memory client store for dynamic registration:
|
|
19
|
+
* - MCP clients (Claude Desktop, Cursor) register dynamically via RFC 7591
|
|
20
|
+
* - Registrations are lost on restart — clients re-register on reconnect
|
|
21
|
+
* - XSUAA clientId is pre-registered as the default client
|
|
22
|
+
*
|
|
23
|
+
* 3. Chained token verifier:
|
|
24
|
+
* - Tries XSUAA → Entra ID OIDC → API key in order
|
|
25
|
+
* - All three auth modes coexist on the same /mcp endpoint
|
|
26
|
+
*/
|
|
27
|
+
import type { OAuthRegisteredClientsStore } from '@modelcontextprotocol/sdk/server/auth/clients.js';
|
|
28
|
+
import { ProxyOAuthServerProvider } from '@modelcontextprotocol/sdk/server/auth/providers/proxyProvider.js';
|
|
29
|
+
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
30
|
+
import type { OAuthClientInformationFull } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
31
|
+
/** XSUAA credentials from VCAP_SERVICES */
|
|
32
|
+
export interface XsuaaCredentials {
|
|
33
|
+
url: string;
|
|
34
|
+
clientid: string;
|
|
35
|
+
clientsecret: string;
|
|
36
|
+
xsappname: string;
|
|
37
|
+
uaadomain: string;
|
|
38
|
+
verificationkey?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* In-memory store for OAuth client registrations.
|
|
42
|
+
*
|
|
43
|
+
* MCP clients dynamically register via RFC 7591. The XSUAA service binding
|
|
44
|
+
* clientId is pre-registered as the default client so that clients can
|
|
45
|
+
* use it directly without registration.
|
|
46
|
+
*/
|
|
47
|
+
export declare class InMemoryClientStore implements OAuthRegisteredClientsStore {
|
|
48
|
+
private clients;
|
|
49
|
+
constructor(xsuaaClientId: string, xsuaaClientSecret: string);
|
|
50
|
+
getClient(clientId: string): Promise<OAuthClientInformationFull | undefined>;
|
|
51
|
+
registerClient(client: Omit<OAuthClientInformationFull, 'client_id' | 'client_id_issued_at'>): Promise<OAuthClientInformationFull>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify a JWT token using @sap/xssec.
|
|
55
|
+
*
|
|
56
|
+
* Creates a security context from the token using the XSUAA service,
|
|
57
|
+
* then maps it to the MCP SDK's AuthInfo format.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createXsuaaTokenVerifier(credentials: XsuaaCredentials): (token: string) => Promise<AuthInfo>;
|
|
60
|
+
/**
|
|
61
|
+
* Create a token verifier that chains multiple auth methods.
|
|
62
|
+
*
|
|
63
|
+
* Tries in order:
|
|
64
|
+
* 1. XSUAA (@sap/xssec) — if XSUAA credentials are available
|
|
65
|
+
* 2. Entra ID OIDC (jose) — if SAP_OIDC_ISSUER is configured
|
|
66
|
+
* 3. API Key — if ARC1_API_KEY is configured
|
|
67
|
+
*/
|
|
68
|
+
export declare function createChainedTokenVerifier(config: {
|
|
69
|
+
apiKey?: string;
|
|
70
|
+
oidcIssuer?: string;
|
|
71
|
+
oidcAudience?: string;
|
|
72
|
+
}, xsuaaVerifier?: (token: string) => Promise<AuthInfo>, oidcVerifier?: (token: string) => Promise<AuthInfo>): (token: string) => Promise<AuthInfo>;
|
|
73
|
+
export declare function createXsuaaOAuthProvider(credentials: XsuaaCredentials, appUrl: string): {
|
|
74
|
+
provider: ProxyOAuthServerProvider;
|
|
75
|
+
clientStore: InMemoryClientStore;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=xsuaa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xsuaa.d.ts","sourceRoot":"","sources":["../../ts-src/server/xsuaa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kEAAkE,CAAC;AAC5G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAe3F,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,2BAA2B;IACrE,OAAO,CAAC,OAAO,CAAiD;gBAEpD,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAsBtD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAW5E,cAAc,CAClB,MAAM,EAAE,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,qBAAqB,CAAC,GAC5E,OAAO,CAAC,0BAA0B,CAAC;CAcvC;AAID;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CA2C5G;AAID;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACvE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,EACpD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,GAClD,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAsDtC;AAmMD,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,wBAAwB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAA;CAAE,CAa1E"}
|