arc-1 0.9.14 → 0.9.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -4
- package/dist/adt/class-structure.d.ts +1 -1
- package/dist/adt/class-structure.js +1 -1
- package/dist/adt/client.d.ts +16 -3
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +40 -35
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/ddic-xml.d.ts.map +1 -1
- package/dist/adt/ddic-xml.js +46 -53
- package/dist/adt/ddic-xml.js.map +1 -1
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +46 -15
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/fm-signature.d.ts +1 -1
- package/dist/adt/fm-signature.js +1 -1
- package/dist/adt/rap-generate.js +1 -1
- package/dist/adt/rap-generate.js.map +1 -1
- package/dist/adt/rap-handlers.d.ts +1 -1
- package/dist/adt/rap-handlers.js +1 -1
- package/dist/adt/refactoring.d.ts.map +1 -1
- package/dist/adt/refactoring.js +11 -14
- package/dist/adt/refactoring.js.map +1 -1
- package/dist/adt/server-driven.d.ts +46 -2
- package/dist/adt/server-driven.d.ts.map +1 -1
- package/dist/adt/server-driven.js +13 -3
- package/dist/adt/server-driven.js.map +1 -1
- package/dist/adt/xml-parser.d.ts +8 -1
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +57 -49
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/authz/policy.d.ts +1 -1
- package/dist/authz/policy.js +1 -1
- package/dist/cache/cache.d.ts +1 -0
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/memory.d.ts +1 -0
- package/dist/cache/memory.d.ts.map +1 -1
- package/dist/cache/memory.js +3 -0
- package/dist/cache/memory.js.map +1 -1
- package/dist/cache/sqlite.d.ts +1 -0
- package/dist/cache/sqlite.d.ts.map +1 -1
- package/dist/cache/sqlite.js +3 -0
- package/dist/cache/sqlite.js.map +1 -1
- package/dist/cache/warmup.d.ts.map +1 -1
- package/dist/cache/warmup.js +85 -38
- package/dist/cache/warmup.js.map +1 -1
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/context/compressor.d.ts.map +1 -1
- package/dist/context/compressor.js +22 -13
- package/dist/context/compressor.js.map +1 -1
- package/dist/context/contract.d.ts.map +1 -1
- package/dist/context/contract.js +4 -3
- package/dist/context/contract.js.map +1 -1
- package/dist/context/deps.d.ts.map +1 -1
- package/dist/context/deps.js +3 -2
- package/dist/context/deps.js.map +1 -1
- package/dist/context/method-surgery.d.ts.map +1 -1
- package/dist/context/method-surgery.js +3 -2
- package/dist/context/method-surgery.js.map +1 -1
- package/dist/handlers/activate.d.ts +25 -0
- package/dist/handlers/activate.d.ts.map +1 -0
- package/dist/handlers/activate.js +334 -0
- package/dist/handlers/activate.js.map +1 -0
- package/dist/handlers/cache-security.d.ts +22 -0
- package/dist/handlers/cache-security.d.ts.map +1 -0
- package/dist/handlers/cache-security.js +51 -0
- package/dist/handlers/cache-security.js.map +1 -0
- package/dist/handlers/cds-hints.d.ts +26 -0
- package/dist/handlers/cds-hints.d.ts.map +1 -0
- package/dist/handlers/cds-hints.js +380 -0
- package/dist/handlers/cds-hints.js.map +1 -0
- package/dist/handlers/context.d.ts +10 -0
- package/dist/handlers/context.d.ts.map +1 -0
- package/dist/handlers/context.js +344 -0
- package/dist/handlers/context.js.map +1 -0
- package/dist/handlers/diagnose.d.ts +8 -0
- package/dist/handlers/diagnose.d.ts.map +1 -0
- package/dist/handlers/diagnose.js +274 -0
- package/dist/handlers/diagnose.js.map +1 -0
- package/dist/handlers/dispatch.d.ts +39 -0
- package/dist/handlers/dispatch.d.ts.map +1 -0
- package/dist/handlers/dispatch.js +640 -0
- package/dist/handlers/dispatch.js.map +1 -0
- package/dist/handlers/feature-cache.d.ts +26 -0
- package/dist/handlers/feature-cache.d.ts.map +1 -0
- package/dist/handlers/feature-cache.js +45 -0
- package/dist/handlers/feature-cache.js.map +1 -0
- package/dist/handlers/git.d.ts +9 -0
- package/dist/handlers/git.d.ts.map +1 -0
- package/dist/handlers/git.js +227 -0
- package/dist/handlers/git.js.map +1 -0
- package/dist/handlers/lint.d.ts +9 -0
- package/dist/handlers/lint.d.ts.map +1 -0
- package/dist/handlers/lint.js +82 -0
- package/dist/handlers/lint.js.map +1 -0
- package/dist/handlers/manage.d.ts +10 -0
- package/dist/handlers/manage.d.ts.map +1 -0
- package/dist/handlers/manage.js +375 -0
- package/dist/handlers/manage.js.map +1 -0
- package/dist/handlers/navigate.d.ts +8 -0
- package/dist/handlers/navigate.d.ts.map +1 -0
- package/dist/handlers/navigate.js +188 -0
- package/dist/handlers/navigate.js.map +1 -0
- package/dist/handlers/object-types.d.ts +103 -0
- package/dist/handlers/object-types.d.ts.map +1 -0
- package/dist/handlers/object-types.js +476 -0
- package/dist/handlers/object-types.js.map +1 -0
- package/dist/handlers/query.d.ts +7 -0
- package/dist/handlers/query.d.ts.map +1 -0
- package/dist/handlers/query.js +190 -0
- package/dist/handlers/query.js.map +1 -0
- package/dist/handlers/read.d.ts +18 -0
- package/dist/handlers/read.d.ts.map +1 -0
- package/dist/handlers/read.js +581 -0
- package/dist/handlers/read.js.map +1 -0
- package/dist/handlers/schemas.d.ts +28 -26
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +14 -151
- package/dist/handlers/schemas.js.map +1 -1
- package/dist/handlers/search.d.ts +24 -0
- package/dist/handlers/search.d.ts.map +1 -0
- package/dist/handlers/search.js +208 -0
- package/dist/handlers/search.js.map +1 -0
- package/dist/handlers/shared.d.ts +19 -0
- package/dist/handlers/shared.d.ts.map +1 -0
- package/dist/handlers/shared.js +23 -0
- package/dist/handlers/shared.js.map +1 -0
- package/dist/handlers/tool-registry.d.ts +44 -0
- package/dist/handlers/tool-registry.d.ts.map +1 -0
- package/dist/handlers/tool-registry.js +152 -0
- package/dist/handlers/tool-registry.js.map +1 -0
- package/dist/handlers/tools.d.ts +9 -0
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +41 -144
- package/dist/handlers/tools.js.map +1 -1
- package/dist/handlers/transport.d.ts +8 -0
- package/dist/handlers/transport.d.ts.map +1 -0
- package/dist/handlers/transport.js +281 -0
- package/dist/handlers/transport.js.map +1 -0
- package/dist/handlers/write/class-surgery.d.ts +18 -0
- package/dist/handlers/write/class-surgery.d.ts.map +1 -0
- package/dist/handlers/write/class-surgery.js +376 -0
- package/dist/handlers/write/class-surgery.js.map +1 -0
- package/dist/handlers/write/context.d.ts +43 -0
- package/dist/handlers/write/context.d.ts.map +1 -0
- package/dist/handlers/write/context.js +5 -0
- package/dist/handlers/write/context.js.map +1 -0
- package/dist/handlers/write/create.d.ts +8 -0
- package/dist/handlers/write/create.d.ts.map +1 -0
- package/dist/handlers/write/create.js +603 -0
- package/dist/handlers/write/create.js.map +1 -0
- package/dist/handlers/write/rap.d.ts +8 -0
- package/dist/handlers/write/rap.d.ts.map +1 -0
- package/dist/handlers/write/rap.js +235 -0
- package/dist/handlers/write/rap.js.map +1 -0
- package/dist/handlers/write/update-delete.d.ts +8 -0
- package/dist/handlers/write/update-delete.d.ts.map +1 -0
- package/dist/handlers/write/update-delete.js +182 -0
- package/dist/handlers/write/update-delete.js.map +1 -0
- package/dist/handlers/write-helpers.d.ts +155 -0
- package/dist/handlers/write-helpers.d.ts.map +1 -0
- package/dist/handlers/write-helpers.js +859 -0
- package/dist/handlers/write-helpers.js.map +1 -0
- package/dist/handlers/write.d.ts +16 -0
- package/dist/handlers/write.d.ts.map +1 -0
- package/dist/handlers/write.js +210 -0
- package/dist/handlers/write.js.map +1 -0
- package/dist/handlers/zod-errors.d.ts +1 -1
- package/dist/handlers/zod-errors.js +1 -1
- package/dist/lint/abaplint-config-cache.d.ts +5 -0
- package/dist/lint/abaplint-config-cache.d.ts.map +1 -0
- package/dist/lint/abaplint-config-cache.js +29 -0
- package/dist/lint/abaplint-config-cache.js.map +1 -0
- package/dist/lint/config-builder.d.ts.map +1 -1
- package/dist/lint/config-builder.js +3 -4
- package/dist/lint/config-builder.js.map +1 -1
- package/dist/lint/lint.d.ts +1 -1
- package/dist/lint/lint.d.ts.map +1 -1
- package/dist/lint/lint.js +3 -2
- package/dist/lint/lint.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +22 -8
- package/dist/server/config.js.map +1 -1
- package/dist/server/mcp-rate-limit.d.ts +1 -1
- package/dist/server/mcp-rate-limit.js +1 -1
- package/dist/server/server.d.ts +1 -1
- package/dist/server/server.js +3 -2
- package/dist/server/server.js.map +1 -1
- package/package.json +15 -10
- package/dist/handlers/intent.d.ts +0 -144
- package/dist/handlers/intent.d.ts.map +0 -1
- package/dist/handlers/intent.js +0 -6837
- package/dist/handlers/intent.js.map +0 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAPActivate handler — activate single/batch objects, CDS activation ordering, message
|
|
3
|
+
* formatting.
|
|
4
|
+
*/
|
|
5
|
+
import { activate, activateBatch, publishServiceBinding, unpublishServiceBinding, } from '../adt/devtools.js';
|
|
6
|
+
import { AdtSafetyError } from '../adt/errors.js';
|
|
7
|
+
import { isServerDrivenObjectType, serverDrivenBlueContentType, serverDrivenObjectUrl } from '../adt/server-driven.js';
|
|
8
|
+
import { invalidateInactiveList } from './cache-security.js';
|
|
9
|
+
import { buildCdsActivationDependencyHint } from './cds-hints.js';
|
|
10
|
+
import { isTablesEndpointAvailable } from './feature-cache.js';
|
|
11
|
+
import { normalizeObjectType, objectUrlForType } from './object-types.js';
|
|
12
|
+
import { errorResult, textResult } from './shared.js';
|
|
13
|
+
import { enforceAllowedPackageForObjectUrl, inactiveSyntaxDiagnostic, SERVICEBINDING_V2_ACCEPT, } from './write-helpers.js';
|
|
14
|
+
// ─── SAPActivate Handler ─────────────────────────────────────────────
|
|
15
|
+
export async function handleSAPActivate(client, args, cachingLayer, cacheSecurity) {
|
|
16
|
+
const action = String(args.action ?? 'activate');
|
|
17
|
+
const name = String(args.name ?? '');
|
|
18
|
+
const version = String(args.version ?? '0001');
|
|
19
|
+
const explicitServiceType = args.service_type;
|
|
20
|
+
// Resolve the OData service type for publish/unpublish endpoints.
|
|
21
|
+
// Explicit service_type parameter takes precedence; otherwise auto-detect from SRVB metadata.
|
|
22
|
+
async function resolveServiceType() {
|
|
23
|
+
if (explicitServiceType === 'odatav4' || explicitServiceType === 'odatav2')
|
|
24
|
+
return explicitServiceType;
|
|
25
|
+
try {
|
|
26
|
+
const { source: srvbJson } = await client.getSrvb(name);
|
|
27
|
+
const srvb = JSON.parse(srvbJson);
|
|
28
|
+
if (srvb.odataVersion === 'V4')
|
|
29
|
+
return 'odatav4';
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// If readback fails, fall back to odatav2 (legacy default)
|
|
33
|
+
}
|
|
34
|
+
return 'odatav2';
|
|
35
|
+
}
|
|
36
|
+
// Publish service binding
|
|
37
|
+
if (action === 'publish_srvb') {
|
|
38
|
+
if (!name) {
|
|
39
|
+
return errorResult('Missing required "name" parameter for publish_srvb action.');
|
|
40
|
+
}
|
|
41
|
+
await enforceAllowedPackageForObjectUrl(client, objectUrlForType('SRVB', name), `Publish of service binding '${name}'`, SERVICEBINDING_V2_ACCEPT);
|
|
42
|
+
const serviceType = await resolveServiceType();
|
|
43
|
+
const result = await publishServiceBinding(client.http, client.safety, name, version, serviceType);
|
|
44
|
+
if (result.severity === 'ERROR') {
|
|
45
|
+
return errorResult(`Failed to publish service binding ${name}: ${result.shortText}${result.longText ? ` — ${result.longText}` : ''}`);
|
|
46
|
+
}
|
|
47
|
+
let srvbInfo;
|
|
48
|
+
try {
|
|
49
|
+
srvbInfo = (await client.getSrvb(name)).source;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
if (result.severity === 'UNKNOWN') {
|
|
53
|
+
return errorResult(`Publish response for ${name} could not be parsed and readback failed — use SAPRead to verify publish status.`);
|
|
54
|
+
}
|
|
55
|
+
return textResult(`Successfully published service binding ${name} (readback of binding metadata failed — use SAPRead to verify)`);
|
|
56
|
+
}
|
|
57
|
+
// Verify the published flag from the SRVB readback
|
|
58
|
+
try {
|
|
59
|
+
const srvbData = JSON.parse(srvbInfo);
|
|
60
|
+
if (srvbData.published === false) {
|
|
61
|
+
return errorResult(`Publish of service binding ${name} may have failed — binding is still unpublished.\n\n${srvbInfo}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// If we can't parse the readback JSON, fall through — better to return what we have
|
|
66
|
+
}
|
|
67
|
+
if (result.severity === 'UNKNOWN') {
|
|
68
|
+
return textResult(`Publish request for ${name} completed but response could not be fully parsed. Verify status below:\n\n${srvbInfo}`);
|
|
69
|
+
}
|
|
70
|
+
return textResult(`Successfully published service binding ${name}.\n\n${srvbInfo}`);
|
|
71
|
+
}
|
|
72
|
+
// Unpublish service binding
|
|
73
|
+
if (action === 'unpublish_srvb') {
|
|
74
|
+
if (!name) {
|
|
75
|
+
return errorResult('Missing required "name" parameter for unpublish_srvb action.');
|
|
76
|
+
}
|
|
77
|
+
await enforceAllowedPackageForObjectUrl(client, objectUrlForType('SRVB', name), `Unpublish of service binding '${name}'`, SERVICEBINDING_V2_ACCEPT);
|
|
78
|
+
const serviceType = await resolveServiceType();
|
|
79
|
+
const result = await unpublishServiceBinding(client.http, client.safety, name, version, serviceType);
|
|
80
|
+
if (result.severity === 'ERROR') {
|
|
81
|
+
return errorResult(`Failed to unpublish service binding ${name}: ${result.shortText}${result.longText ? ` — ${result.longText}` : ''}`);
|
|
82
|
+
}
|
|
83
|
+
let srvbInfo;
|
|
84
|
+
try {
|
|
85
|
+
srvbInfo = (await client.getSrvb(name)).source;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Readback failed — fall through with what we have
|
|
89
|
+
}
|
|
90
|
+
// Verify the published flag from the SRVB readback
|
|
91
|
+
if (srvbInfo) {
|
|
92
|
+
try {
|
|
93
|
+
const srvbData = JSON.parse(srvbInfo);
|
|
94
|
+
if (srvbData.published === true) {
|
|
95
|
+
return errorResult(`Unpublish of service binding ${name} may have failed — binding is still published.\n\n${srvbInfo}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// If we can't parse the readback JSON, fall through
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (result.severity === 'UNKNOWN') {
|
|
103
|
+
return textResult(`Unpublish request for ${name} completed but response could not be fully parsed.${srvbInfo ? ` Verify status below:\n\n${srvbInfo}` : ' Use SAPRead to verify status.'}`);
|
|
104
|
+
}
|
|
105
|
+
return textResult(`Successfully unpublished service binding ${name}.${srvbInfo ? `\n\n${srvbInfo}` : ''}`);
|
|
106
|
+
}
|
|
107
|
+
// Batch activation: multiple objects at once (for RAP stacks etc.)
|
|
108
|
+
const type = normalizeObjectType(String(args.type ?? ''));
|
|
109
|
+
const preaudit = args.preaudit !== undefined ? Boolean(args.preaudit) : undefined;
|
|
110
|
+
const activateOpts = preaudit !== undefined ? { preaudit } : undefined;
|
|
111
|
+
if (args.objects && Array.isArray(args.objects)) {
|
|
112
|
+
const rawObjects = args.objects;
|
|
113
|
+
// Resolve URLs sequentially. For TABL we await the URL resolver so DDIC
|
|
114
|
+
// structures (which live at /sap/bc/adt/ddic/structures/) are addressed
|
|
115
|
+
// correctly; the resolver short-circuits on its in-memory cache.
|
|
116
|
+
// For FUNC the URL needs the parent function-group baked into the path
|
|
117
|
+
// (issue #250); each batch entry must carry `group` or be auto-resolvable
|
|
118
|
+
// by name.
|
|
119
|
+
const objects = await Promise.all(rawObjects.map(async (o) => {
|
|
120
|
+
const objType = normalizeObjectType(String(o.type ?? type));
|
|
121
|
+
const objName = String(o.name ?? '');
|
|
122
|
+
let url;
|
|
123
|
+
if (objType === 'TABL') {
|
|
124
|
+
// Use the write-path resolver: refuses TABL/DT activation on systems
|
|
125
|
+
// that don't expose /sap/bc/adt/ddic/tables/ (NW 7.50/7.51), where
|
|
126
|
+
// activate would hit the wrong endpoint. See issue #285.
|
|
127
|
+
url = await client.resolveTablObjectUrlForWrite(objName, {
|
|
128
|
+
tablesEndpointAvailable: isTablesEndpointAvailable(),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else if (objType === 'FUNC') {
|
|
132
|
+
let group = String(o.group ?? args.group ?? '').trim();
|
|
133
|
+
if (!group) {
|
|
134
|
+
const resolved = cachingLayer
|
|
135
|
+
? await cachingLayer.resolveFuncGroup(client, objName)
|
|
136
|
+
: await client.resolveFunctionGroup(objName);
|
|
137
|
+
if (!resolved) {
|
|
138
|
+
throw new Error(`Cannot resolve function group for FM "${objName}" in batch activate. Provide "group" on each FUNC entry.`);
|
|
139
|
+
}
|
|
140
|
+
group = resolved;
|
|
141
|
+
}
|
|
142
|
+
const groupLc = encodeURIComponent(group.toLowerCase());
|
|
143
|
+
url = `/sap/bc/adt/functions/groups/${groupLc}/fmodules/${encodeURIComponent(objName.toLowerCase())}`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
url = objectUrlForType(objType, objName);
|
|
147
|
+
}
|
|
148
|
+
return { type: objType, name: objName, url };
|
|
149
|
+
}));
|
|
150
|
+
// Enforce the allowedPackages ceiling against each object's REAL package before
|
|
151
|
+
// activating ANY of them — one out-of-allowlist object aborts the whole batch
|
|
152
|
+
// (no partial activation). Fail-closed; no-op when unrestricted. (security audit 2026-06)
|
|
153
|
+
for (const o of objects) {
|
|
154
|
+
await enforceAllowedPackageForObjectUrl(client, o.url, `Activation of ${o.type} '${o.name}'`);
|
|
155
|
+
}
|
|
156
|
+
const result = await activateBatch(client.http, client.safety, objects, activateOpts);
|
|
157
|
+
const names = objects.map((o) => o.name).join(', ');
|
|
158
|
+
const batchStatuses = buildBatchActivationStatuses(objects, result);
|
|
159
|
+
const statusDetails = formatBatchActivationStatuses(batchStatuses);
|
|
160
|
+
if (result.success) {
|
|
161
|
+
for (const object of objects) {
|
|
162
|
+
cachingLayer?.invalidate(object.type, object.name, 'all');
|
|
163
|
+
}
|
|
164
|
+
invalidateInactiveList(cachingLayer, client, cacheSecurity);
|
|
165
|
+
return textResult(`Successfully activated ${objects.length} objects: ${names}.${statusDetails}`);
|
|
166
|
+
}
|
|
167
|
+
// On batch failure enrich with per-object inactive-version syntax errors —
|
|
168
|
+
// only for objects whose activation returned no error details, to avoid duplicating messages.
|
|
169
|
+
const objectsNeedingSyntaxCheck = objects.filter((_o, i) => batchStatuses[i].status !== 'error');
|
|
170
|
+
const diagnostics = await Promise.all(objectsNeedingSyntaxCheck.map((o) => inactiveSyntaxDiagnostic(client, o.type, o.name)));
|
|
171
|
+
const combinedDiag = diagnostics
|
|
172
|
+
.map((d, i) => (d ? `\n[${objectsNeedingSyntaxCheck[i].name}]${d}` : ''))
|
|
173
|
+
.filter(Boolean)
|
|
174
|
+
.join('');
|
|
175
|
+
return errorResult(`Batch activation failed for: ${names}.${statusDetails}\n${formatActivationMessages(result)}${combinedDiag}`);
|
|
176
|
+
}
|
|
177
|
+
// Single activation (existing behavior). For TABL we use the write-path
|
|
178
|
+
// resolver so transparent-table activations on NW 7.50/7.51 are refused
|
|
179
|
+
// with the SE11 hint instead of silently activating against /structures/
|
|
180
|
+
// (which would not even be the right object). See issue #285.
|
|
181
|
+
// For FUNC the URL needs the parent function group baked into the path
|
|
182
|
+
// (issue #250) — `objectBasePath('FUNC')` deliberately throws so generic
|
|
183
|
+
// builders fail loudly. Auto-resolve the group when omitted.
|
|
184
|
+
let objectUrl;
|
|
185
|
+
if (type === 'TABL') {
|
|
186
|
+
try {
|
|
187
|
+
objectUrl = await client.resolveTablObjectUrlForWrite(name, {
|
|
188
|
+
tablesEndpointAvailable: isTablesEndpointAvailable(),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
catch (resolveErr) {
|
|
192
|
+
if (resolveErr instanceof AdtSafetyError) {
|
|
193
|
+
return errorResult(resolveErr.message);
|
|
194
|
+
}
|
|
195
|
+
throw resolveErr;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (type === 'FUNC') {
|
|
199
|
+
let group = String(args.group ?? '').trim();
|
|
200
|
+
if (!group) {
|
|
201
|
+
const resolved = cachingLayer
|
|
202
|
+
? await cachingLayer.resolveFuncGroup(client, name)
|
|
203
|
+
: await client.resolveFunctionGroup(name);
|
|
204
|
+
if (!resolved) {
|
|
205
|
+
return errorResult(`Cannot resolve function group for FM "${name}". Provide the "group" parameter explicitly.`);
|
|
206
|
+
}
|
|
207
|
+
group = resolved;
|
|
208
|
+
}
|
|
209
|
+
const groupLc = encodeURIComponent(group.toLowerCase());
|
|
210
|
+
objectUrl = `/sap/bc/adt/functions/groups/${groupLc}/fmodules/${encodeURIComponent(name.toLowerCase())}`;
|
|
211
|
+
}
|
|
212
|
+
else if (isServerDrivenObjectType(type)) {
|
|
213
|
+
// Server-driven objects (8.16+): objectBasePath(<sdo>) throws, so route via the registry href.
|
|
214
|
+
// Single-object activation only — SDO is not added to the batch resolver above (batch is
|
|
215
|
+
// RAP-stack-oriented). The generic activate() endpoint handles SDO (verified: activate(DESD) → ok).
|
|
216
|
+
objectUrl = serverDrivenObjectUrl(type, name);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
objectUrl = objectUrlForType(type, name);
|
|
220
|
+
}
|
|
221
|
+
// Enforce the allowedPackages ceiling against the object's REAL package before
|
|
222
|
+
// activating — activation is a write-class state change (inactive draft → active
|
|
223
|
+
// runtime version) and must honor the same package boundary as create/update/delete.
|
|
224
|
+
// Fail-closed; no-op when allowedPackages is unrestricted. (security audit 2026-06)
|
|
225
|
+
// SDO metadata only renders its packageRef under the blues Accept — thread it for SDO types.
|
|
226
|
+
await enforceAllowedPackageForObjectUrl(client, objectUrl, `Activation of ${type} '${name}'`, isServerDrivenObjectType(type) ? serverDrivenBlueContentType(type) : undefined);
|
|
227
|
+
const result = await activate(client.http, client.safety, objectUrl, { ...activateOpts, name });
|
|
228
|
+
if (result.success) {
|
|
229
|
+
cachingLayer?.invalidate(type, name, 'all');
|
|
230
|
+
invalidateInactiveList(cachingLayer, client, cacheSecurity);
|
|
231
|
+
return textResult(`Successfully activated ${type} ${name}.${formatActivationMessages(result)}`);
|
|
232
|
+
}
|
|
233
|
+
// On failure, try to enrich with the actual compiler errors from the inactive version —
|
|
234
|
+
// especially useful when SAP returned <ioc:inactiveObjects> with no <msg> detail.
|
|
235
|
+
// Skip when activation already returned error details to avoid duplicating the same messages.
|
|
236
|
+
const hasActivationErrors = result.details.some((d) => d.severity === 'error');
|
|
237
|
+
const syntaxDetail = hasActivationErrors ? '' : await inactiveSyntaxDiagnostic(client, type, name);
|
|
238
|
+
let activationError = `Activation failed for ${type} ${name}.\n${formatActivationMessages(result)}${syntaxDetail}`;
|
|
239
|
+
if (type === 'DDLS') {
|
|
240
|
+
activationError += `\n\n${await buildCdsActivationDependencyHint(client, name, objectUrl)}`;
|
|
241
|
+
}
|
|
242
|
+
return errorResult(activationError);
|
|
243
|
+
}
|
|
244
|
+
/** Format activation result messages with structured detail (line numbers, URIs) when available */
|
|
245
|
+
function formatActivationMessages(result) {
|
|
246
|
+
if (result.details.length === 0)
|
|
247
|
+
return '';
|
|
248
|
+
const errors = result.details.filter((d) => d.severity === 'error');
|
|
249
|
+
const warnings = result.details.filter((d) => d.severity === 'warning');
|
|
250
|
+
const parts = [];
|
|
251
|
+
if (errors.length > 0) {
|
|
252
|
+
const formatted = errors.map((e) => {
|
|
253
|
+
const prefix = e.line ? `[line ${e.line}] ` : '';
|
|
254
|
+
const suffix = e.uri ? ` (${e.uri})` : '';
|
|
255
|
+
return `- ${prefix}${e.text}${suffix}`;
|
|
256
|
+
});
|
|
257
|
+
parts.push(`Errors:\n${formatted.join('\n')}`);
|
|
258
|
+
}
|
|
259
|
+
if (warnings.length > 0) {
|
|
260
|
+
const formatted = warnings.map((w) => {
|
|
261
|
+
const prefix = w.line ? `[line ${w.line}] ` : '';
|
|
262
|
+
return `- ${prefix}${w.text}`;
|
|
263
|
+
});
|
|
264
|
+
parts.push(`Warnings:\n${formatted.join('\n')}`);
|
|
265
|
+
}
|
|
266
|
+
// Fall back to flat messages if no errors/warnings but info messages exist
|
|
267
|
+
if (parts.length === 0 && result.messages.length > 0) {
|
|
268
|
+
return `\nMessages: ${result.messages.join('; ')}`;
|
|
269
|
+
}
|
|
270
|
+
return parts.length > 0 ? `\n${parts.join('\n')}` : '';
|
|
271
|
+
}
|
|
272
|
+
function normalizeActivationUri(uri) {
|
|
273
|
+
if (!uri)
|
|
274
|
+
return undefined;
|
|
275
|
+
return uri.replace(/#.*$/, '').replace(/\/+$/, '').toLowerCase();
|
|
276
|
+
}
|
|
277
|
+
export function buildBatchActivationStatuses(objects, result) {
|
|
278
|
+
// Group error details by object. SAP error URIs may be subpaths of the object URL
|
|
279
|
+
// (e.g. .../classes/zcl_demo/source/main for object .../classes/ZCL_DEMO) and may
|
|
280
|
+
// differ in case, so we lowercase and use startsWith for matching.
|
|
281
|
+
const objectKeys = objects.map((obj) => normalizeActivationUri(obj.url) ?? '');
|
|
282
|
+
const perObject = objects.map(() => []);
|
|
283
|
+
const unassigned = [];
|
|
284
|
+
for (const detail of result.details) {
|
|
285
|
+
const detailUri = normalizeActivationUri(detail.uri);
|
|
286
|
+
const prefix = detail.line ? `[line ${detail.line}] ` : '';
|
|
287
|
+
const suffix = detail.uri ? ` (${detail.uri})` : '';
|
|
288
|
+
if (!detailUri) {
|
|
289
|
+
unassigned.push(`${prefix}${detail.text}${suffix}`);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const matchIdx = objectKeys.findIndex((k) => k && detailUri.startsWith(k));
|
|
293
|
+
if (matchIdx >= 0) {
|
|
294
|
+
perObject[matchIdx].push({ severity: detail.severity, text: `${prefix}${detail.text}${suffix}` });
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
unassigned.push(`${prefix}${detail.text}${suffix}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return objects.map((obj, index) => {
|
|
301
|
+
const details = perObject[index];
|
|
302
|
+
const hasError = details.some((detail) => detail.severity === 'error');
|
|
303
|
+
const hasWarning = details.some((detail) => detail.severity === 'warning');
|
|
304
|
+
const status = hasError ? 'error' : hasWarning ? 'warning' : 'active';
|
|
305
|
+
const messages = details.map((detail) => detail.text);
|
|
306
|
+
if (index === 0 && unassigned.length > 0) {
|
|
307
|
+
messages.push(...unassigned);
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
type: obj.type,
|
|
311
|
+
name: obj.name,
|
|
312
|
+
status,
|
|
313
|
+
messages,
|
|
314
|
+
};
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
export function formatBatchActivationStatuses(statuses) {
|
|
318
|
+
if (statuses.length === 0)
|
|
319
|
+
return '';
|
|
320
|
+
const lines = [];
|
|
321
|
+
for (const status of statuses) {
|
|
322
|
+
if (status.messages.length === 0) {
|
|
323
|
+
lines.push(`- ${status.name} (${status.type}): ${status.status}`);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
for (const msg of status.messages) {
|
|
327
|
+
lines.push(`- ${status.name} (${status.type}) ${msg}`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return `\n${lines.join('\n')}`;
|
|
332
|
+
}
|
|
333
|
+
// ─── SAPDiagnose Handler ─────────────────────────────────────────────
|
|
334
|
+
//# sourceMappingURL=activate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activate.js","sourceRoot":"","sources":["../../src/handlers/activate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache-security context for per-user (principal-propagation) clients — upstream fix #393.
|
|
3
|
+
*
|
|
4
|
+
* Under PP, every user gets their own SAP session; shared per-process caches (the inactive-object
|
|
5
|
+
* list, the dependency-payload cache) must be keyed per user — or bypassed — so one user's view
|
|
6
|
+
* never leaks into another's. handleToolCall builds the context once per call and threads it into
|
|
7
|
+
* the read/write/activate/context handlers and the server-driven write engine.
|
|
8
|
+
*
|
|
9
|
+
* This is the leaf home for the helpers because five handler modules + dispatch consume them.
|
|
10
|
+
*/
|
|
11
|
+
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
12
|
+
import type { AdtClient } from '../adt/client.js';
|
|
13
|
+
import type { CachingLayer } from '../cache/caching-layer.js';
|
|
14
|
+
export interface CacheSecurityContext {
|
|
15
|
+
isPerUserClient: boolean;
|
|
16
|
+
userKey?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function buildCacheSecurityContext(authInfo: AuthInfo | undefined, isPerUserClient?: boolean): CacheSecurityContext;
|
|
19
|
+
export declare function inactiveListUserKey(client: AdtClient, cacheSecurity: CacheSecurityContext): string | undefined;
|
|
20
|
+
export declare function invalidateInactiveList(cachingLayer: CachingLayer | undefined, client: AdtClient, cacheSecurity: CacheSecurityContext): void;
|
|
21
|
+
export declare function contextCacheForDependencyPayloads(cachingLayer: CachingLayer | undefined, cacheSecurity: CacheSecurityContext): CachingLayer | undefined;
|
|
22
|
+
//# sourceMappingURL=cache-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-security.d.ts","sourceRoot":"","sources":["../../src/handlers/cache-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiCD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,eAAe,CAAC,EAAE,OAAO,GACxB,oBAAoB,CAMtB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAE9G;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,oBAAoB,GAClC,IAAI,CAEN;AAED,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,aAAa,EAAE,oBAAoB,GAClC,YAAY,GAAG,SAAS,CAE1B"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache-security context for per-user (principal-propagation) clients — upstream fix #393.
|
|
3
|
+
*
|
|
4
|
+
* Under PP, every user gets their own SAP session; shared per-process caches (the inactive-object
|
|
5
|
+
* list, the dependency-payload cache) must be keyed per user — or bypassed — so one user's view
|
|
6
|
+
* never leaks into another's. handleToolCall builds the context once per call and threads it into
|
|
7
|
+
* the read/write/activate/context handlers and the server-driven write engine.
|
|
8
|
+
*
|
|
9
|
+
* This is the leaf home for the helpers because five handler modules + dispatch consume them.
|
|
10
|
+
*/
|
|
11
|
+
function nonEmptyString(value) {
|
|
12
|
+
return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
|
|
13
|
+
}
|
|
14
|
+
function resolveCacheUserKey(authInfo) {
|
|
15
|
+
if (!authInfo)
|
|
16
|
+
return undefined;
|
|
17
|
+
const extra = (authInfo.extra ?? {});
|
|
18
|
+
const issuerOrClient = nonEmptyString(extra.iss) ?? nonEmptyString(authInfo.clientId) ?? 'unknown-auth-source';
|
|
19
|
+
const namespace = issuerOrClient.toLowerCase();
|
|
20
|
+
const userName = nonEmptyString(extra.userName);
|
|
21
|
+
if (userName)
|
|
22
|
+
return `${namespace}:userName:${userName.toUpperCase()}`;
|
|
23
|
+
const email = nonEmptyString(extra.email);
|
|
24
|
+
if (email)
|
|
25
|
+
return `${namespace}:email:${email.toLowerCase()}`;
|
|
26
|
+
const sub = nonEmptyString(extra.sub);
|
|
27
|
+
if (sub)
|
|
28
|
+
return `${namespace}:sub:${sub}`;
|
|
29
|
+
const preferredUsername = nonEmptyString(extra.preferred_username);
|
|
30
|
+
if (preferredUsername)
|
|
31
|
+
return `${namespace}:preferred_username:${preferredUsername.toLowerCase()}`;
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
export function buildCacheSecurityContext(authInfo, isPerUserClient) {
|
|
35
|
+
if (!isPerUserClient)
|
|
36
|
+
return { isPerUserClient: false };
|
|
37
|
+
return {
|
|
38
|
+
isPerUserClient: true,
|
|
39
|
+
userKey: resolveCacheUserKey(authInfo),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function inactiveListUserKey(client, cacheSecurity) {
|
|
43
|
+
return cacheSecurity.isPerUserClient ? cacheSecurity.userKey : client.username;
|
|
44
|
+
}
|
|
45
|
+
export function invalidateInactiveList(cachingLayer, client, cacheSecurity) {
|
|
46
|
+
cachingLayer?.inactiveLists.invalidate(inactiveListUserKey(client, cacheSecurity));
|
|
47
|
+
}
|
|
48
|
+
export function contextCacheForDependencyPayloads(cachingLayer, cacheSecurity) {
|
|
49
|
+
return cacheSecurity.isPerUserClient ? undefined : cachingLayer;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cache-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-security.js","sourceRoot":"","sources":["../../src/handlers/cache-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAED,SAAS,mBAAmB,CAAC,QAA8B;IACzD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAMlC,CAAC;IACF,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC;IAC/G,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,QAAQ;QAAE,OAAO,GAAG,SAAS,aAAa,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;IAEvE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO,GAAG,SAAS,UAAU,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;IAE9D,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,GAAG;QAAE,OAAO,GAAG,SAAS,QAAQ,GAAG,EAAE,CAAC;IAE1C,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACnE,IAAI,iBAAiB;QAAE,OAAO,GAAG,SAAS,uBAAuB,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC;IAEnG,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAA8B,EAC9B,eAAyB;IAEzB,IAAI,CAAC,eAAe;QAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IACxD,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,mBAAmB,CAAC,QAAQ,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,aAAmC;IACxF,OAAO,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,YAAsC,EACtC,MAAiB,EACjB,aAAmC;IAEnC,YAAY,EAAE,aAAa,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,YAAsC,EACtC,aAAmC;IAEnC,OAAO,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDS impact + pre-write hint helpers.
|
|
3
|
+
*
|
|
4
|
+
* Downstream-impact bucketing/ordering, where-used scoping, the update/delete/activation
|
|
5
|
+
* dependency hints, and the CDS reserved-keyword guard. Shared by the SAPWrite, SAPActivate and
|
|
6
|
+
* SAPContext handlers.
|
|
7
|
+
*/
|
|
8
|
+
import type { AdtClient } from '../adt/client.js';
|
|
9
|
+
import type { ResolvedFeatures } from '../adt/types.js';
|
|
10
|
+
import { errorResult } from './shared.js';
|
|
11
|
+
export declare const CDS_DEPENDENCY_SENSITIVE_TYPES: Set<string>;
|
|
12
|
+
export declare function buildCdsUpdateCrudHint(client: AdtClient, name: string, objectUrl: string): Promise<string>;
|
|
13
|
+
export declare function buildCdsDeleteDependencyHint(client: AdtClient, type: string, name: string, objectUrl: string): Promise<string | undefined>;
|
|
14
|
+
export declare function buildCdsActivationDependencyHint(client: AdtClient, name: string, objectUrl: string): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Guard CDS syntax against known version-dependent features.
|
|
17
|
+
* Returns an error result if the source uses unsupported syntax, or undefined to proceed.
|
|
18
|
+
* Best-effort: if cachedFeatures is not available (no probe yet), always proceeds.
|
|
19
|
+
*/
|
|
20
|
+
export declare function guardCdsSyntax(type: string, source: string, features: ResolvedFeatures | undefined): ReturnType<typeof errorResult> | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Detect CDS reserved keywords used as field names in DDL source.
|
|
23
|
+
* Returns a warning string listing suspicious field names, or undefined if none found.
|
|
24
|
+
*/
|
|
25
|
+
export declare function warnCdsReservedKeywords(source: string): string | undefined;
|
|
26
|
+
//# sourceMappingURL=cds-hints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cds-hints.d.ts","sourceRoot":"","sources":["../../src/handlers/cds-hints.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,eAAO,MAAM,8BAA8B,aAAoE,CAAC;AAgOhH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BhH;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA2C7B;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAsBjB;AAuCD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GACrC,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,SAAS,CA8B5C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAyB1E"}
|