arc-1 1.5.2 → 1.7.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 (472) hide show
  1. package/README.md +26 -16
  2. package/bin/arc1-source.js +83 -0
  3. package/dist/adt/accept-fallback.d.ts +4 -0
  4. package/dist/adt/accept-fallback.d.ts.map +1 -0
  5. package/dist/adt/accept-fallback.js +27 -0
  6. package/dist/adt/accept-fallback.js.map +1 -0
  7. package/dist/adt/api-release.d.ts +40 -0
  8. package/dist/adt/api-release.d.ts.map +1 -0
  9. package/dist/adt/api-release.js +224 -0
  10. package/dist/adt/api-release.js.map +1 -0
  11. package/dist/adt/application-log.d.ts +36 -0
  12. package/dist/adt/application-log.d.ts.map +1 -0
  13. package/dist/adt/application-log.js +143 -0
  14. package/dist/adt/application-log.js.map +1 -0
  15. package/dist/adt/authorization-trace.d.ts.map +1 -1
  16. package/dist/adt/authorization-trace.js +2 -1
  17. package/dist/adt/authorization-trace.js.map +1 -1
  18. package/dist/adt/class-structure.d.ts +2 -1
  19. package/dist/adt/class-structure.d.ts.map +1 -1
  20. package/dist/adt/class-structure.js +28 -10
  21. package/dist/adt/class-structure.js.map +1 -1
  22. package/dist/adt/client.d.ts +12 -6
  23. package/dist/adt/client.d.ts.map +1 -1
  24. package/dist/adt/client.js +32 -49
  25. package/dist/adt/client.js.map +1 -1
  26. package/dist/adt/codeintel.d.ts +9 -23
  27. package/dist/adt/codeintel.d.ts.map +1 -1
  28. package/dist/adt/codeintel.js +14 -34
  29. package/dist/adt/codeintel.js.map +1 -1
  30. package/dist/adt/ddic-xml.d.ts +5 -3
  31. package/dist/adt/ddic-xml.d.ts.map +1 -1
  32. package/dist/adt/ddic-xml.js +14 -0
  33. package/dist/adt/ddic-xml.js.map +1 -1
  34. package/dist/adt/devtools.d.ts +8 -1
  35. package/dist/adt/devtools.d.ts.map +1 -1
  36. package/dist/adt/devtools.js +94 -40
  37. package/dist/adt/devtools.js.map +1 -1
  38. package/dist/adt/diagnostics.d.ts +2 -0
  39. package/dist/adt/diagnostics.d.ts.map +1 -1
  40. package/dist/adt/diagnostics.js +10 -8
  41. package/dist/adt/diagnostics.js.map +1 -1
  42. package/dist/adt/enhancement-impl.d.ts +125 -0
  43. package/dist/adt/enhancement-impl.d.ts.map +1 -0
  44. package/dist/adt/enhancement-impl.js +408 -0
  45. package/dist/adt/enhancement-impl.js.map +1 -0
  46. package/dist/adt/enhancements.d.ts.map +1 -1
  47. package/dist/adt/enhancements.js +4 -2
  48. package/dist/adt/enhancements.js.map +1 -1
  49. package/dist/adt/enho-filter.d.ts +49 -0
  50. package/dist/adt/enho-filter.d.ts.map +1 -0
  51. package/dist/adt/enho-filter.js +229 -0
  52. package/dist/adt/enho-filter.js.map +1 -0
  53. package/dist/adt/errors.d.ts +5 -1
  54. package/dist/adt/errors.d.ts.map +1 -1
  55. package/dist/adt/errors.js +32 -8
  56. package/dist/adt/errors.js.map +1 -1
  57. package/dist/adt/features.d.ts +3 -9
  58. package/dist/adt/features.d.ts.map +1 -1
  59. package/dist/adt/features.js +24 -8
  60. package/dist/adt/features.js.map +1 -1
  61. package/dist/adt/feed-schema.d.ts +32 -0
  62. package/dist/adt/feed-schema.d.ts.map +1 -0
  63. package/dist/adt/feed-schema.js +123 -0
  64. package/dist/adt/feed-schema.js.map +1 -0
  65. package/dist/adt/fm-parameter-docs.d.ts +7 -0
  66. package/dist/adt/fm-parameter-docs.d.ts.map +1 -0
  67. package/dist/adt/fm-parameter-docs.js +134 -0
  68. package/dist/adt/fm-parameter-docs.js.map +1 -0
  69. package/dist/adt/fm-signature.d.ts +8 -1
  70. package/dist/adt/fm-signature.d.ts.map +1 -1
  71. package/dist/adt/fm-signature.js +37 -28
  72. package/dist/adt/fm-signature.js.map +1 -1
  73. package/dist/adt/http-deadline.d.ts.map +1 -1
  74. package/dist/adt/http-deadline.js +4 -1
  75. package/dist/adt/http-deadline.js.map +1 -1
  76. package/dist/adt/http-retry-after.d.ts +20 -0
  77. package/dist/adt/http-retry-after.d.ts.map +1 -0
  78. package/dist/adt/http-retry-after.js +37 -0
  79. package/dist/adt/http-retry-after.js.map +1 -0
  80. package/dist/adt/http.d.ts +7 -20
  81. package/dist/adt/http.d.ts.map +1 -1
  82. package/dist/adt/http.js +112 -135
  83. package/dist/adt/http.js.map +1 -1
  84. package/dist/adt/include-expansion.d.ts +143 -0
  85. package/dist/adt/include-expansion.d.ts.map +1 -0
  86. package/dist/adt/include-expansion.js +475 -0
  87. package/dist/adt/include-expansion.js.map +1 -0
  88. package/dist/adt/internal-data-operations.d.ts +3 -3
  89. package/dist/adt/internal-data-operations.d.ts.map +1 -1
  90. package/dist/adt/internal-data-operations.js +9 -2
  91. package/dist/adt/internal-data-operations.js.map +1 -1
  92. package/dist/adt/legacy-content-handler.d.ts +2 -0
  93. package/dist/adt/legacy-content-handler.d.ts.map +1 -1
  94. package/dist/adt/legacy-content-handler.js +13 -1
  95. package/dist/adt/legacy-content-handler.js.map +1 -1
  96. package/dist/adt/package-contents.d.ts +5 -0
  97. package/dist/adt/package-contents.d.ts.map +1 -1
  98. package/dist/adt/package-contents.js +31 -0
  99. package/dist/adt/package-contents.js.map +1 -1
  100. package/dist/adt/rap-generate.d.ts +2 -4
  101. package/dist/adt/rap-generate.d.ts.map +1 -1
  102. package/dist/adt/rap-generate.js +2 -4
  103. package/dist/adt/rap-generate.js.map +1 -1
  104. package/dist/adt/revision-feed.d.ts +8 -0
  105. package/dist/adt/revision-feed.d.ts.map +1 -0
  106. package/dist/adt/revision-feed.js +108 -0
  107. package/dist/adt/revision-feed.js.map +1 -0
  108. package/dist/adt/security-session-gate.d.ts +23 -0
  109. package/dist/adt/security-session-gate.d.ts.map +1 -0
  110. package/dist/adt/security-session-gate.js +56 -0
  111. package/dist/adt/security-session-gate.js.map +1 -0
  112. package/dist/adt/server-driven.d.ts +12 -1
  113. package/dist/adt/server-driven.d.ts.map +1 -1
  114. package/dist/adt/server-driven.js +22 -4
  115. package/dist/adt/server-driven.js.map +1 -1
  116. package/dist/adt/source-diff.d.ts +4 -1
  117. package/dist/adt/source-diff.d.ts.map +1 -1
  118. package/dist/adt/source-diff.js +5 -3
  119. package/dist/adt/source-diff.js.map +1 -1
  120. package/dist/adt/stored-text/chunks.d.ts +8 -0
  121. package/dist/adt/stored-text/chunks.d.ts.map +1 -0
  122. package/dist/adt/stored-text/chunks.js +55 -0
  123. package/dist/adt/stored-text/chunks.js.map +1 -0
  124. package/dist/adt/stored-text/decoder.d.ts +31 -0
  125. package/dist/adt/stored-text/decoder.d.ts.map +1 -0
  126. package/dist/adt/stored-text/decoder.js +319 -0
  127. package/dist/adt/stored-text/decoder.js.map +1 -0
  128. package/dist/adt/stored-text/errors.d.ts +10 -0
  129. package/dist/adt/stored-text/errors.d.ts.map +1 -0
  130. package/dist/adt/stored-text/errors.js +10 -0
  131. package/dist/adt/stored-text/errors.js.map +1 -0
  132. package/dist/adt/stored-text/index.d.ts +7 -0
  133. package/dist/adt/stored-text/index.d.ts.map +1 -0
  134. package/dist/adt/stored-text/index.js +6 -0
  135. package/dist/adt/stored-text/index.js.map +1 -0
  136. package/dist/adt/stored-text/key.d.ts +3 -0
  137. package/dist/adt/stored-text/key.d.ts.map +1 -0
  138. package/dist/adt/stored-text/key.js +23 -0
  139. package/dist/adt/stored-text/key.js.map +1 -0
  140. package/dist/adt/stored-text/reader.d.ts +52 -0
  141. package/dist/adt/stored-text/reader.d.ts.map +1 -0
  142. package/dist/adt/stored-text/reader.js +142 -0
  143. package/dist/adt/stored-text/reader.js.map +1 -0
  144. package/dist/adt/stored-text/source.d.ts +5 -0
  145. package/dist/adt/stored-text/source.d.ts.map +1 -0
  146. package/dist/adt/stored-text/source.js +284 -0
  147. package/dist/adt/stored-text/source.js.map +1 -0
  148. package/dist/adt/stored-text/types.d.ts +38 -0
  149. package/dist/adt/stored-text/types.d.ts.map +1 -0
  150. package/dist/adt/stored-text/types.js +2 -0
  151. package/dist/adt/stored-text/types.js.map +1 -0
  152. package/dist/adt/structure-hierarchy.d.ts.map +1 -1
  153. package/dist/adt/structure-hierarchy.js +11 -27
  154. package/dist/adt/structure-hierarchy.js.map +1 -1
  155. package/dist/adt/syntax-batch.d.ts +66 -0
  156. package/dist/adt/syntax-batch.d.ts.map +1 -0
  157. package/dist/adt/syntax-batch.js +115 -0
  158. package/dist/adt/syntax-batch.js.map +1 -0
  159. package/dist/adt/table-index.d.ts +23 -0
  160. package/dist/adt/table-index.d.ts.map +1 -0
  161. package/dist/adt/table-index.js +69 -0
  162. package/dist/adt/table-index.js.map +1 -0
  163. package/dist/adt/table-query.d.ts +4 -2
  164. package/dist/adt/table-query.d.ts.map +1 -1
  165. package/dist/adt/table-query.js +37 -10
  166. package/dist/adt/table-query.js.map +1 -1
  167. package/dist/adt/table-settings.d.ts +67 -0
  168. package/dist/adt/table-settings.d.ts.map +1 -0
  169. package/dist/adt/table-settings.js +207 -0
  170. package/dist/adt/table-settings.js.map +1 -0
  171. package/dist/adt/text-elements.d.ts +7 -1
  172. package/dist/adt/text-elements.d.ts.map +1 -1
  173. package/dist/adt/text-elements.js +67 -25
  174. package/dist/adt/text-elements.js.map +1 -1
  175. package/dist/adt/text-part-changes.d.ts +4 -0
  176. package/dist/adt/text-part-changes.d.ts.map +1 -0
  177. package/dist/adt/text-part-changes.js +43 -0
  178. package/dist/adt/text-part-changes.js.map +1 -0
  179. package/dist/adt/transport-diff.d.ts +16 -25
  180. package/dist/adt/transport-diff.d.ts.map +1 -1
  181. package/dist/adt/transport-diff.js +201 -103
  182. package/dist/adt/transport-diff.js.map +1 -1
  183. package/dist/adt/transport-review-budget.d.ts +15 -0
  184. package/dist/adt/transport-review-budget.d.ts.map +1 -0
  185. package/dist/adt/transport-review-budget.js +57 -0
  186. package/dist/adt/transport-review-budget.js.map +1 -0
  187. package/dist/adt/transport.d.ts +1 -1
  188. package/dist/adt/transport.d.ts.map +1 -1
  189. package/dist/adt/transport.js +4 -3
  190. package/dist/adt/transport.js.map +1 -1
  191. package/dist/adt/types.d.ts +10 -4
  192. package/dist/adt/types.d.ts.map +1 -1
  193. package/dist/adt/user-agent.d.ts +1 -1
  194. package/dist/adt/where-used-native.d.ts +22 -0
  195. package/dist/adt/where-used-native.d.ts.map +1 -0
  196. package/dist/adt/where-used-native.js +111 -0
  197. package/dist/adt/where-used-native.js.map +1 -0
  198. package/dist/adt/xml-parser.d.ts +6 -36
  199. package/dist/adt/xml-parser.d.ts.map +1 -1
  200. package/dist/adt/xml-parser.js +28 -235
  201. package/dist/adt/xml-parser.js.map +1 -1
  202. package/dist/aff/validator.d.ts.map +1 -1
  203. package/dist/aff/validator.js +8 -2
  204. package/dist/aff/validator.js.map +1 -1
  205. package/dist/authz/policy.d.ts.map +1 -1
  206. package/dist/authz/policy.js +10 -2
  207. package/dist/authz/policy.js.map +1 -1
  208. package/dist/cache/sqlite-driver.d.ts +24 -0
  209. package/dist/cache/sqlite-driver.d.ts.map +1 -0
  210. package/dist/cache/sqlite-driver.js +59 -0
  211. package/dist/cache/sqlite-driver.js.map +1 -0
  212. package/dist/cache/sqlite.d.ts +4 -2
  213. package/dist/cache/sqlite.d.ts.map +1 -1
  214. package/dist/cache/sqlite.js +5 -4
  215. package/dist/cache/sqlite.js.map +1 -1
  216. package/dist/cli.js +4 -1
  217. package/dist/cli.js.map +1 -1
  218. package/dist/context/grep.d.ts +2 -0
  219. package/dist/context/grep.d.ts.map +1 -1
  220. package/dist/context/grep.js +8 -7
  221. package/dist/context/grep.js.map +1 -1
  222. package/dist/context/line-range.d.ts +6 -0
  223. package/dist/context/line-range.d.ts.map +1 -0
  224. package/dist/context/line-range.js +23 -0
  225. package/dist/context/line-range.js.map +1 -0
  226. package/dist/extract-sap-cookies.js +1 -0
  227. package/dist/extract-sap-cookies.js.map +1 -1
  228. package/dist/handlers/activate.d.ts.map +1 -1
  229. package/dist/handlers/activate.js +69 -7
  230. package/dist/handlers/activate.js.map +1 -1
  231. package/dist/handlers/activation-results.d.ts.map +1 -1
  232. package/dist/handlers/activation-results.js +9 -1
  233. package/dist/handlers/activation-results.js.map +1 -1
  234. package/dist/handlers/api-release-fields.d.ts +23 -0
  235. package/dist/handlers/api-release-fields.d.ts.map +1 -0
  236. package/dist/handlers/api-release-fields.js +21 -0
  237. package/dist/handlers/api-release-fields.js.map +1 -0
  238. package/dist/handlers/application-log-input.d.ts +32 -0
  239. package/dist/handlers/application-log-input.d.ts.map +1 -0
  240. package/dist/handlers/application-log-input.js +34 -0
  241. package/dist/handlers/application-log-input.js.map +1 -0
  242. package/dist/handlers/application-log.d.ts +4 -0
  243. package/dist/handlers/application-log.d.ts.map +1 -0
  244. package/dist/handlers/application-log.js +14 -0
  245. package/dist/handlers/application-log.js.map +1 -0
  246. package/dist/handlers/cds-hints.d.ts +2 -2
  247. package/dist/handlers/cds-hints.d.ts.map +1 -1
  248. package/dist/handlers/cds-hints.js +21 -63
  249. package/dist/handlers/cds-hints.js.map +1 -1
  250. package/dist/handlers/context.d.ts.map +1 -1
  251. package/dist/handlers/context.js +7 -3
  252. package/dist/handlers/context.js.map +1 -1
  253. package/dist/handlers/diagnose.d.ts.map +1 -1
  254. package/dist/handlers/diagnose.js +10 -1
  255. package/dist/handlers/diagnose.js.map +1 -1
  256. package/dist/handlers/dispatch.d.ts.map +1 -1
  257. package/dist/handlers/dispatch.js +54 -9
  258. package/dist/handlers/dispatch.js.map +1 -1
  259. package/dist/handlers/dump-filter-inputs.d.ts +38 -0
  260. package/dist/handlers/dump-filter-inputs.d.ts.map +1 -0
  261. package/dist/handlers/dump-filter-inputs.js +44 -0
  262. package/dist/handlers/dump-filter-inputs.js.map +1 -0
  263. package/dist/handlers/expanded-read.d.ts +24 -0
  264. package/dist/handlers/expanded-read.d.ts.map +1 -0
  265. package/dist/handlers/expanded-read.js +56 -0
  266. package/dist/handlers/expanded-read.js.map +1 -0
  267. package/dist/handlers/feature-cache.d.ts +11 -3
  268. package/dist/handlers/feature-cache.d.ts.map +1 -1
  269. package/dist/handlers/feature-cache.js +57 -3
  270. package/dist/handlers/feature-cache.js.map +1 -1
  271. package/dist/handlers/function-parameter-language.d.ts +5 -0
  272. package/dist/handlers/function-parameter-language.d.ts.map +1 -0
  273. package/dist/handlers/function-parameter-language.js +19 -0
  274. package/dist/handlers/function-parameter-language.js.map +1 -0
  275. package/dist/handlers/function-processing.d.ts +5 -0
  276. package/dist/handlers/function-processing.d.ts.map +1 -1
  277. package/dist/handlers/function-processing.js +5 -0
  278. package/dist/handlers/function-processing.js.map +1 -1
  279. package/dist/handlers/hyperfocused.d.ts +1 -1
  280. package/dist/handlers/hyperfocused.d.ts.map +1 -1
  281. package/dist/handlers/hyperfocused.js +2 -1
  282. package/dist/handlers/hyperfocused.js.map +1 -1
  283. package/dist/handlers/long-text-input.d.ts +113 -0
  284. package/dist/handlers/long-text-input.d.ts.map +1 -0
  285. package/dist/handlers/long-text-input.js +113 -0
  286. package/dist/handlers/long-text-input.js.map +1 -0
  287. package/dist/handlers/long-text.d.ts +5 -0
  288. package/dist/handlers/long-text.d.ts.map +1 -0
  289. package/dist/handlers/long-text.js +122 -0
  290. package/dist/handlers/long-text.js.map +1 -0
  291. package/dist/handlers/manage.d.ts.map +1 -1
  292. package/dist/handlers/manage.js +7 -23
  293. package/dist/handlers/manage.js.map +1 -1
  294. package/dist/handlers/navigate.d.ts.map +1 -1
  295. package/dist/handlers/navigate.js +8 -3
  296. package/dist/handlers/navigate.js.map +1 -1
  297. package/dist/handlers/object-types.d.ts.map +1 -1
  298. package/dist/handlers/object-types.js +31 -7
  299. package/dist/handlers/object-types.js.map +1 -1
  300. package/dist/handlers/query-input.d.ts +50 -0
  301. package/dist/handlers/query-input.d.ts.map +1 -0
  302. package/dist/handlers/query-input.js +59 -0
  303. package/dist/handlers/query-input.js.map +1 -0
  304. package/dist/handlers/query-tool.d.ts +11 -0
  305. package/dist/handlers/query-tool.d.ts.map +1 -0
  306. package/dist/handlers/query-tool.js +99 -0
  307. package/dist/handlers/query-tool.js.map +1 -0
  308. package/dist/handlers/query.d.ts +1 -1
  309. package/dist/handlers/query.d.ts.map +1 -1
  310. package/dist/handlers/query.js +7 -1
  311. package/dist/handlers/query.js.map +1 -1
  312. package/dist/handlers/read.d.ts +1 -0
  313. package/dist/handlers/read.d.ts.map +1 -1
  314. package/dist/handlers/read.js +119 -14
  315. package/dist/handlers/read.js.map +1 -1
  316. package/dist/handlers/schemas.d.ts +57 -4
  317. package/dist/handlers/schemas.d.ts.map +1 -1
  318. package/dist/handlers/schemas.js +140 -17
  319. package/dist/handlers/schemas.js.map +1 -1
  320. package/dist/handlers/search.d.ts.map +1 -1
  321. package/dist/handlers/search.js +10 -6
  322. package/dist/handlers/search.js.map +1 -1
  323. package/dist/handlers/syntax.d.ts.map +1 -1
  324. package/dist/handlers/syntax.js +8 -0
  325. package/dist/handlers/syntax.js.map +1 -1
  326. package/dist/handlers/table-type-fields.d.ts +33 -0
  327. package/dist/handlers/table-type-fields.d.ts.map +1 -0
  328. package/dist/handlers/table-type-fields.js +22 -0
  329. package/dist/handlers/table-type-fields.js.map +1 -0
  330. package/dist/handlers/tool-descriptions.d.ts.map +1 -1
  331. package/dist/handlers/tool-descriptions.js +8 -3
  332. package/dist/handlers/tool-descriptions.js.map +1 -1
  333. package/dist/handlers/tool-registry.d.ts +5 -5
  334. package/dist/handlers/tool-registry.d.ts.map +1 -1
  335. package/dist/handlers/tool-registry.js +10 -7
  336. package/dist/handlers/tool-registry.js.map +1 -1
  337. package/dist/handlers/tools.d.ts +1 -1
  338. package/dist/handlers/tools.d.ts.map +1 -1
  339. package/dist/handlers/tools.js +99 -101
  340. package/dist/handlers/tools.js.map +1 -1
  341. package/dist/handlers/transport-review.d.ts +5 -0
  342. package/dist/handlers/transport-review.d.ts.map +1 -0
  343. package/dist/handlers/transport-review.js +108 -0
  344. package/dist/handlers/transport-review.js.map +1 -0
  345. package/dist/handlers/transport.d.ts.map +1 -1
  346. package/dist/handlers/transport.js +3 -58
  347. package/dist/handlers/transport.js.map +1 -1
  348. package/dist/handlers/where-used-details.d.ts +28 -0
  349. package/dist/handlers/where-used-details.d.ts.map +1 -0
  350. package/dist/handlers/where-used-details.js +67 -0
  351. package/dist/handlers/where-used-details.js.map +1 -0
  352. package/dist/handlers/where-used.d.ts +8 -3
  353. package/dist/handlers/where-used.d.ts.map +1 -1
  354. package/dist/handlers/where-used.js +40 -18
  355. package/dist/handlers/where-used.js.map +1 -1
  356. package/dist/handlers/write/create.d.ts.map +1 -1
  357. package/dist/handlers/write/create.js +69 -27
  358. package/dist/handlers/write/create.js.map +1 -1
  359. package/dist/handlers/write/rap.d.ts.map +1 -1
  360. package/dist/handlers/write/rap.js +2 -4
  361. package/dist/handlers/write/rap.js.map +1 -1
  362. package/dist/handlers/write/table-settings.d.ts +5 -0
  363. package/dist/handlers/write/table-settings.d.ts.map +1 -0
  364. package/dist/handlers/write/table-settings.js +27 -0
  365. package/dist/handlers/write/table-settings.js.map +1 -0
  366. package/dist/handlers/write/update-delete.d.ts +1 -1
  367. package/dist/handlers/write/update-delete.d.ts.map +1 -1
  368. package/dist/handlers/write/update-delete.js +32 -12
  369. package/dist/handlers/write/update-delete.js.map +1 -1
  370. package/dist/handlers/write-helpers.d.ts +4 -1
  371. package/dist/handlers/write-helpers.d.ts.map +1 -1
  372. package/dist/handlers/write-helpers.js +68 -8
  373. package/dist/handlers/write-helpers.js.map +1 -1
  374. package/dist/handlers/write.d.ts.map +1 -1
  375. package/dist/handlers/write.js +6 -10
  376. package/dist/handlers/write.js.map +1 -1
  377. package/dist/server/audit.d.ts +4 -0
  378. package/dist/server/audit.d.ts.map +1 -1
  379. package/dist/server/audit.js +49 -2
  380. package/dist/server/audit.js.map +1 -1
  381. package/dist/server/config.d.ts.map +1 -1
  382. package/dist/server/config.js +43 -2
  383. package/dist/server/config.js.map +1 -1
  384. package/dist/server/destination-discovery.d.ts +12 -2
  385. package/dist/server/destination-discovery.d.ts.map +1 -1
  386. package/dist/server/destination-discovery.js +33 -7
  387. package/dist/server/destination-discovery.js.map +1 -1
  388. package/dist/server/destination-registry.d.ts +10 -6
  389. package/dist/server/destination-registry.d.ts.map +1 -1
  390. package/dist/server/destination-registry.js +38 -15
  391. package/dist/server/destination-registry.js.map +1 -1
  392. package/dist/server/http-request-body.d.ts +4 -0
  393. package/dist/server/http-request-body.d.ts.map +1 -0
  394. package/dist/server/http-request-body.js +65 -0
  395. package/dist/server/http-request-body.js.map +1 -0
  396. package/dist/server/http.d.ts +5 -2
  397. package/dist/server/http.d.ts.map +1 -1
  398. package/dist/server/http.js +71 -9
  399. package/dist/server/http.js.map +1 -1
  400. package/dist/server/multi-target-authorization-audit.d.ts +5 -0
  401. package/dist/server/multi-target-authorization-audit.d.ts.map +1 -0
  402. package/dist/server/multi-target-authorization-audit.js +18 -0
  403. package/dist/server/multi-target-authorization-audit.js.map +1 -0
  404. package/dist/server/multi-target-authorization-startup.d.ts +8 -0
  405. package/dist/server/multi-target-authorization-startup.d.ts.map +1 -0
  406. package/dist/server/multi-target-authorization-startup.js +38 -0
  407. package/dist/server/multi-target-authorization-startup.js.map +1 -0
  408. package/dist/server/multi-target-authorization.d.ts +29 -0
  409. package/dist/server/multi-target-authorization.d.ts.map +1 -0
  410. package/dist/server/multi-target-authorization.js +97 -0
  411. package/dist/server/multi-target-authorization.js.map +1 -0
  412. package/dist/server/multi-target-bearer-auth.d.ts +5 -0
  413. package/dist/server/multi-target-bearer-auth.d.ts.map +1 -0
  414. package/dist/server/multi-target-bearer-auth.js +39 -0
  415. package/dist/server/multi-target-bearer-auth.js.map +1 -0
  416. package/dist/server/multi-target-catalog-enforced.d.ts +29 -0
  417. package/dist/server/multi-target-catalog-enforced.d.ts.map +1 -0
  418. package/dist/server/multi-target-catalog-enforced.js +142 -0
  419. package/dist/server/multi-target-catalog-enforced.js.map +1 -0
  420. package/dist/server/multi-target-catalog-projection.d.ts +7 -0
  421. package/dist/server/multi-target-catalog-projection.d.ts.map +1 -0
  422. package/dist/server/multi-target-catalog-projection.js +52 -0
  423. package/dist/server/multi-target-catalog-projection.js.map +1 -0
  424. package/dist/server/multi-target-feature-state.d.ts +0 -2
  425. package/dist/server/multi-target-feature-state.d.ts.map +1 -1
  426. package/dist/server/multi-target-feature-state.js +0 -19
  427. package/dist/server/multi-target-feature-state.js.map +1 -1
  428. package/dist/server/multi-target-identity.d.ts +3 -0
  429. package/dist/server/multi-target-identity.d.ts.map +1 -1
  430. package/dist/server/multi-target-identity.js +9 -0
  431. package/dist/server/multi-target-identity.js.map +1 -1
  432. package/dist/server/multi-target-request-projection.d.ts +14 -0
  433. package/dist/server/multi-target-request-projection.d.ts.map +1 -0
  434. package/dist/server/multi-target-request-projection.js +16 -0
  435. package/dist/server/multi-target-request-projection.js.map +1 -0
  436. package/dist/server/multi-target-runtime.d.ts.map +1 -1
  437. package/dist/server/multi-target-runtime.js +1 -0
  438. package/dist/server/multi-target-runtime.js.map +1 -1
  439. package/dist/server/multi-target-server.d.ts +4 -1
  440. package/dist/server/multi-target-server.d.ts.map +1 -1
  441. package/dist/server/multi-target-server.js +111 -11
  442. package/dist/server/multi-target-server.js.map +1 -1
  443. package/dist/server/multi-target-tools.d.ts +1 -1
  444. package/dist/server/multi-target-tools.d.ts.map +1 -1
  445. package/dist/server/multi-target-tools.js +22 -15
  446. package/dist/server/multi-target-tools.js.map +1 -1
  447. package/dist/server/private-mcp-response.d.ts +4 -0
  448. package/dist/server/private-mcp-response.d.ts.map +1 -0
  449. package/dist/server/private-mcp-response.js +14 -0
  450. package/dist/server/private-mcp-response.js.map +1 -0
  451. package/dist/server/server-cache.d.ts +5 -0
  452. package/dist/server/server-cache.d.ts.map +1 -0
  453. package/dist/server/server-cache.js +30 -0
  454. package/dist/server/server-cache.js.map +1 -0
  455. package/dist/server/server.d.ts +7 -21
  456. package/dist/server/server.d.ts.map +1 -1
  457. package/dist/server/server.js +60 -89
  458. package/dist/server/server.js.map +1 -1
  459. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -1
  460. package/dist/server/sinks/btp-auditlog.js +4 -1
  461. package/dist/server/sinks/btp-auditlog.js.map +1 -1
  462. package/dist/server/tool-auth.d.ts +1 -1
  463. package/dist/server/tool-auth.d.ts.map +1 -1
  464. package/dist/server/tool-auth.js +24 -4
  465. package/dist/server/tool-auth.js.map +1 -1
  466. package/dist/server/types.d.ts +7 -0
  467. package/dist/server/types.d.ts.map +1 -1
  468. package/dist/server/types.js +4 -0
  469. package/dist/server/types.js.map +1 -1
  470. package/dist/version.d.ts +1 -1
  471. package/dist/version.js +1 -1
  472. package/package.json +21 -13
@@ -0,0 +1,18 @@
1
+ import { logger } from './logger.js';
2
+ export function auditTargetGrantDenial(grant, authInfo, requestId, tool, target) {
3
+ logger.emitAudit({
4
+ timestamp: new Date().toISOString(),
5
+ level: 'warn',
6
+ event: 'target_resolution_failed',
7
+ requestId,
8
+ user: authInfo?.extra?.userName,
9
+ clientId: authInfo?.clientId,
10
+ tool,
11
+ target,
12
+ errorCode: grant.mode === 'none' ? grant.status : 'TARGET_NOT_GRANTED',
13
+ targetAccessMode: 'xsuaa-attribute',
14
+ grantMode: grant.mode,
15
+ ...(grant.mode === 'exact' ? { exactGrantCount: grant.exactGrantCount } : {}),
16
+ });
17
+ }
18
+ //# sourceMappingURL=multi-target-authorization-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-authorization-audit.js","sourceRoot":"","sources":["../../src/server/multi-target-authorization-audit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,UAAU,sBAAsB,CACpC,KAAkB,EAClB,QAA8B,EAC9B,SAAiB,EACjB,IAAY,EACZ,MAAe;IAEf,MAAM,CAAC,SAAS,CAAC;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,0BAA0B;QACjC,SAAS;QACT,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAA8B;QACrD,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,IAAI;QACJ,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB;QACtE,gBAAgB,EAAE,iBAAiB;QACnC,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Reject alternate independent connections before any startup authentication or network contact. */
2
+ import type { BTPConfig } from '@arc-mcp/xsuaa-auth/btp';
3
+ import { DestinationRegistry } from './destination-registry.js';
4
+ import type { ServerConfig } from './types.js';
5
+ /** Registry discovery uses the same mode as request enforcement and its catalog limits. */
6
+ export declare function discoverMultiTargetRegistry(config: ServerConfig, btpConfig: BTPConfig): Promise<DestinationRegistry>;
7
+ export declare function assertMultiTargetAuthorizationStartup(config: ServerConfig, env?: NodeJS.ProcessEnv): void;
8
+ //# sourceMappingURL=multi-target-authorization-startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-authorization-startup.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-authorization-startup.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAErG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,2FAA2F;AAC3F,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,IAAI,CAmBN"}
@@ -0,0 +1,38 @@
1
+ /** Reject alternate independent connections before any startup authentication or network contact. */
2
+ import { DestinationRegistry } from './destination-registry.js';
3
+ import { logger } from './logger.js';
4
+ import { MULTI_TARGET_MAX } from './multi-target-identity.js';
5
+ /** Registry discovery uses the same mode as request enforcement and its catalog limits. */
6
+ export async function discoverMultiTargetRegistry(config, btpConfig) {
7
+ logger.info(config.multiTargetAuthorization === 'xsuaa-attribute'
8
+ ? `Multi-target authorization enforced; catalog bounded to ${MULTI_TARGET_MAX} ARC-related destinations.`
9
+ : 'Standard multi-target authorization: per-target grants are not enforced.', { mode: config.multiTargetAuthorization ?? 'standard' });
10
+ const options = { authorizationMode: config.multiTargetAuthorization };
11
+ try {
12
+ const { discoverDestinations } = await import('./destination-discovery.js');
13
+ return DestinationRegistry.fromDiscovery(await discoverDestinations(btpConfig, options), config, options);
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : 'Destination discovery failed.';
17
+ logger.error('Multi-target destination discovery failed', { error: message });
18
+ return DestinationRegistry.unavailable({ code: 'REGISTRY_DISCOVERY_ERROR', message }, options);
19
+ }
20
+ }
21
+ export function assertMultiTargetAuthorizationStartup(config, env = process.env) {
22
+ if (config.multiTargetAuthorization !== 'xsuaa-attribute')
23
+ return;
24
+ if (!config.multiTargetEndpoints) {
25
+ throw new Error('ARC1_MULTI_TARGET_AUTHORIZATION=xsuaa-attribute requires ARC1_MULTI_TARGET_ENDPOINTS=true.');
26
+ }
27
+ if (config.url ||
28
+ config.username ||
29
+ config.password ||
30
+ config.destinationName ||
31
+ config.btpServiceKey ||
32
+ config.btpServiceKeyFile ||
33
+ env.SAP_BTP_DESTINATION ||
34
+ env.SAP_BTP_PP_DESTINATION) {
35
+ throw new Error('Enforced multi-target authorization requires a multi-only deployment. Remove single-target connection settings; use a separate application and XSUAA identity for single-target access.');
36
+ }
37
+ }
38
+ //# sourceMappingURL=multi-target-authorization-startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-authorization-startup.js","sourceRoot":"","sources":["../../src/server/multi-target-authorization-startup.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAGrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAoB,EACpB,SAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,wBAAwB,KAAK,iBAAiB;QACnD,CAAC,CAAC,2DAA2D,gBAAgB,4BAA4B;QACzG,CAAC,CAAC,0EAA0E,EAC9E,EAAE,IAAI,EAAE,MAAM,CAAC,wBAAwB,IAAI,UAAU,EAAE,CACxD,CAAC;IACF,MAAM,OAAO,GAAG,EAAE,iBAAiB,EAAE,MAAM,CAAC,wBAAwB,EAAE,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC5E,OAAO,mBAAmB,CAAC,aAAa,CAAC,MAAM,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+BAA+B,CAAC;QACzF,MAAM,CAAC,KAAK,CAAC,2CAA2C,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9E,OAAO,mBAAmB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qCAAqC,CACnD,MAAoB,EACpB,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,IAAI,MAAM,CAAC,wBAAwB,KAAK,iBAAiB;QAAE,OAAO;IAClE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4FAA4F,CAAC,CAAC;IAChH,CAAC;IACD,IACE,MAAM,CAAC,GAAG;QACV,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,eAAe;QACtB,MAAM,CAAC,aAAa;QACpB,MAAM,CAAC,iBAAiB;QACxB,GAAG,CAAC,mBAAmB;QACvB,GAAG,CAAC,sBAAsB,EAC1B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,yLAAyL,CAC1L,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Pure, fail-closed target grants from the verified XSUAA attribute boundary. */
2
+ import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
3
+ export type MultiTargetAuthorizationMode = 'standard' | 'xsuaa-attribute';
4
+ export type TargetGrantFailure = 'TARGET_GRANT_MISSING' | 'TARGET_GRANT_MALFORMED' | 'TARGET_GRANT_LIMIT_EXCEEDED';
5
+ export type TargetGrant = Readonly<{
6
+ mode: 'none';
7
+ status: TargetGrantFailure;
8
+ }> | Readonly<{
9
+ mode: 'exact';
10
+ status: 'valid';
11
+ targets: readonly string[];
12
+ exactGrantCount: number;
13
+ }> | Readonly<{
14
+ mode: 'all';
15
+ status: 'valid';
16
+ }>;
17
+ /**
18
+ * Consume only the auth package's verified, allowlisted values and extraction status.
19
+ * This function neither verifies JWTs nor authorizes standard mode. The HTTP boundary must
20
+ * supply AuthInfo from its configured XSUAA verifier; callers cannot supply their own extra.
21
+ */
22
+ export declare function parseTargetGrant(authInfo?: Pick<AuthInfo, 'extra'>): TargetGrant;
23
+ /** The requested ID must already be canonical; even all-target grants never accept bad syntax. */
24
+ export declare function isTargetGranted(grant: TargetGrant, targetId: string): boolean;
25
+ /** Filter an immutable registry projection without mutating it or revealing unknown grants. */
26
+ export declare function projectGrantedTargets<T extends {
27
+ readonly target: string;
28
+ }>(targets: readonly T[], grant: TargetGrant): readonly T[];
29
+ //# sourceMappingURL=multi-target-authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-authorization.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-authorization.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAG/E,MAAM,MAAM,4BAA4B,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAC1E,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,GAAG,wBAAwB,GAAG,6BAA6B,CAAC;AAEnH,MAAM,MAAM,WAAW,GACnB,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,CAAC,GACtD,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,GACjG,QAAQ,CAAC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAoB/C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,WAAW,CA6ChF;AAED,kGAAkG;AAClG,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAU7E;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EACzE,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,KAAK,EAAE,WAAW,GACjB,SAAS,CAAC,EAAE,CAGd"}
@@ -0,0 +1,97 @@
1
+ /** Pure, fail-closed target grants from the verified XSUAA attribute boundary. */
2
+ import { TARGET_ID_PATTERN } from './multi-target-identity.js';
3
+ const ATTRIBUTE = 'arc1_targets';
4
+ const MAX_RAW_VALUES = 1_024;
5
+ const MAX_VALUE_BYTES = 128;
6
+ const MAX_TOTAL_BYTES = 16 * 1_024;
7
+ const MAX_UNIQUE_VALUES = 256;
8
+ const MAX_TARGET_LENGTH = 36;
9
+ const EMPTY_TARGETS = Object.freeze([]);
10
+ function none(status) {
11
+ return Object.freeze({ mode: 'none', status });
12
+ }
13
+ /** Only own data properties are accepted; inherited values/accessors are not claims. */
14
+ function ownValue(value, key) {
15
+ if (!value || typeof value !== 'object' || Array.isArray(value))
16
+ return undefined;
17
+ return Object.getOwnPropertyDescriptor(value, key)?.value;
18
+ }
19
+ /**
20
+ * Consume only the auth package's verified, allowlisted values and extraction status.
21
+ * This function neither verifies JWTs nor authorizes standard mode. The HTTP boundary must
22
+ * supply AuthInfo from its configured XSUAA verifier; callers cannot supply their own extra.
23
+ */
24
+ export function parseTargetGrant(authInfo) {
25
+ const extra = ownValue(authInfo, 'extra');
26
+ const values = ownValue(ownValue(extra, 'xsuaaUserAttributes'), ATTRIBUTE);
27
+ const status = ownValue(ownValue(extra, 'xsuaaUserAttributeStatus'), ATTRIBUTE);
28
+ if (status === 'missing')
29
+ return none('TARGET_GRANT_MISSING');
30
+ if (status === 'invalid')
31
+ return none('TARGET_GRANT_MALFORMED');
32
+ if (status === 'limit_exceeded')
33
+ return none('TARGET_GRANT_LIMIT_EXCEEDED');
34
+ if (status === undefined && values === undefined)
35
+ return none('TARGET_GRANT_MISSING');
36
+ if (status !== 'valid')
37
+ return none('TARGET_GRANT_MALFORMED');
38
+ if (typeof values !== 'string' && !Array.isArray(values))
39
+ return none('TARGET_GRANT_MALFORMED');
40
+ const rawValues = typeof values === 'string' ? [values] : values;
41
+ if (rawValues.length > MAX_RAW_VALUES)
42
+ return none('TARGET_GRANT_LIMIT_EXCEEDED');
43
+ if (rawValues.length === 0)
44
+ return none('TARGET_GRANT_MISSING');
45
+ // Bound every original value before trimming or deduplication. The cheap code-unit
46
+ // guard avoids scanning an arbitrarily large string merely to measure its UTF-8 bytes.
47
+ let totalBytes = 0;
48
+ for (const value of rawValues) {
49
+ if (typeof value !== 'string')
50
+ return none('TARGET_GRANT_MALFORMED');
51
+ if (value.length > MAX_VALUE_BYTES)
52
+ return none('TARGET_GRANT_LIMIT_EXCEEDED');
53
+ const bytes = Buffer.byteLength(value, 'utf8');
54
+ totalBytes += bytes;
55
+ if (bytes > MAX_VALUE_BYTES || totalBytes > MAX_TOTAL_BYTES)
56
+ return none('TARGET_GRANT_LIMIT_EXCEEDED');
57
+ }
58
+ const canonical = new Set();
59
+ for (const value of rawValues) {
60
+ // IAM values must be ASCII before normalization: Unicode case folding and
61
+ // whitespace removal must never manufacture an exact ID or the all-target grant.
62
+ if (!/^[\t\n\v\f\r -~]*$/.test(value))
63
+ return none('TARGET_GRANT_MALFORMED');
64
+ const trimmed = value.trim();
65
+ const slash = trimmed.indexOf('/');
66
+ // Unlike forgiving tool arguments, grants reject non-ASCII above. Uppercase only
67
+ // the system segment; never split CSV, Unicode-fold an ID, or expand globs.
68
+ const normalized = slash >= 0 ? `${trimmed.slice(0, slash).toUpperCase()}${trimmed.slice(slash)}` : trimmed;
69
+ if (normalized !== '*' && !TARGET_ID_PATTERN.test(normalized))
70
+ return none('TARGET_GRANT_MALFORMED');
71
+ canonical.add(normalized);
72
+ if (canonical.size > MAX_UNIQUE_VALUES)
73
+ return none('TARGET_GRANT_LIMIT_EXCEEDED');
74
+ }
75
+ // A broad grant must not conceal a later malformed value or exceed the unique bound.
76
+ if (canonical.has('*'))
77
+ return Object.freeze({ mode: 'all', status: 'valid' });
78
+ const targets = Object.freeze([...canonical].sort());
79
+ return Object.freeze({ mode: 'exact', status: 'valid', targets, exactGrantCount: targets.length });
80
+ }
81
+ /** The requested ID must already be canonical; even all-target grants never accept bad syntax. */
82
+ export function isTargetGranted(grant, targetId) {
83
+ if (typeof targetId !== 'string' ||
84
+ targetId.length > MAX_TARGET_LENGTH ||
85
+ targetId !== targetId.trim() ||
86
+ !TARGET_ID_PATTERN.test(targetId)) {
87
+ return false;
88
+ }
89
+ return grant.mode === 'all' || (grant.mode === 'exact' && grant.targets.includes(targetId));
90
+ }
91
+ /** Filter an immutable registry projection without mutating it or revealing unknown grants. */
92
+ export function projectGrantedTargets(targets, grant) {
93
+ if (grant.mode === 'none')
94
+ return EMPTY_TARGETS;
95
+ return Object.freeze(targets.filter((target) => isTargetGranted(grant, target.target)));
96
+ }
97
+ //# sourceMappingURL=multi-target-authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-authorization.js","sourceRoot":"","sources":["../../src/server/multi-target-authorization.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Principal denials intentionally omit the SDK's insufficient_scope/re-login challenge. */
2
+ import { type Verifier } from '@arc-mcp/xsuaa-auth';
3
+ import type { RequestHandler } from 'express';
4
+ export declare function requireXsuaaUserBearerAuth(verifier: Verifier, resourceMetadataUrl: string): RequestHandler;
5
+ //# sourceMappingURL=multi-target-bearer-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-bearer-auth.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-bearer-auth.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,qBAAqB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,GAAG,cAAc,CAiC1G"}
@@ -0,0 +1,39 @@
1
+ /** Principal denials intentionally omit the SDK's insufficient_scope/re-login challenge. */
2
+ import { XsuaaUserTokenRequiredError } from '@arc-mcp/xsuaa-auth';
3
+ import { requireBearerAuth } from '@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js';
4
+ export function requireXsuaaUserBearerAuth(verifier, resourceMetadataUrl) {
5
+ return async (req, res, next) => {
6
+ // Keep the SDK's header parsing and token-expiry checks authoritative. Only valid-looking
7
+ // headers need preverification to distinguish principal rejection from missing scope.
8
+ // xsuaa-auth 1.1.0 already maps to SDK 403; this adapter preserves ADR-0008's
9
+ // forbidden response without a WWW-Authenticate challenge inviting futile login retries.
10
+ const [kind, token] = req.headers.authorization?.split(' ') ?? [];
11
+ if (kind?.toLowerCase() !== 'bearer' || !token) {
12
+ await requireBearerAuth({ verifier: { verifyAccessToken: verifier }, resourceMetadataUrl })(req, res, next);
13
+ return;
14
+ }
15
+ try {
16
+ const auth = await verifier(token);
17
+ await requireBearerAuth({
18
+ verifier: { verifyAccessToken: async () => auth },
19
+ resourceMetadataUrl,
20
+ })(req, res, next);
21
+ }
22
+ catch (error) {
23
+ if (error instanceof XsuaaUserTokenRequiredError) {
24
+ res.status(403).json({ error: 'forbidden', error_description: 'A supported XSUAA user token is required.' });
25
+ return;
26
+ }
27
+ // Preserve SDK 401/500 classification without performing signature verification twice.
28
+ await requireBearerAuth({
29
+ verifier: {
30
+ verifyAccessToken: async () => {
31
+ throw error;
32
+ },
33
+ },
34
+ resourceMetadataUrl,
35
+ })(req, res, next);
36
+ }
37
+ };
38
+ }
39
+ //# sourceMappingURL=multi-target-bearer-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-bearer-auth.js","sourceRoot":"","sources":["../../src/server/multi-target-bearer-auth.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,OAAO,EAAiB,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gEAAgE,CAAC;AAGnG,MAAM,UAAU,0BAA0B,CAAC,QAAkB,EAAE,mBAA2B;IACxF,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC9B,0FAA0F;QAC1F,sFAAsF;QACtF,8EAA8E;QAC9E,yFAAyF;QACzF,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClE,IAAI,IAAI,EAAE,WAAW,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/C,MAAM,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5G,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,iBAAiB,CAAC;gBACtB,QAAQ,EAAE,EAAE,iBAAiB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE;gBACjD,mBAAmB;aACpB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;gBACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,2CAA2C,EAAE,CAAC,CAAC;gBAC7G,OAAO;YACT,CAAC;YACD,uFAAuF;YACvF,MAAM,iBAAiB,CAAC;gBACtB,QAAQ,EAAE;oBACR,iBAAiB,EAAE,KAAK,IAAI,EAAE;wBAC5B,MAAM,KAAK,CAAC;oBACd,CAAC;iBACF;gBACD,mBAAmB;aACpB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Complete, caller-sensitive catalog for the explicitly opted-in authorization mode. */
2
+ import type { ToolResult } from '../handlers/shared.js';
3
+ import type { DestinationRegistry } from './destination-registry.js';
4
+ export declare const TARGET_CATALOG_MAX_RESULT_BYTES: number;
5
+ export interface TargetCatalogEnforcement {
6
+ readonly allowsTarget: (target: string) => boolean;
7
+ readonly authorization: Readonly<{
8
+ mode: 'xsuaa-attribute';
9
+ grantMode: 'none' | 'exact' | 'all';
10
+ status: 'valid' | 'TARGET_GRANT_MISSING' | 'TARGET_GRANT_MALFORMED' | 'TARGET_GRANT_LIMIT_EXCEEDED';
11
+ exactGrantCount?: number;
12
+ }>;
13
+ }
14
+ export interface EnforcedCatalogOptions {
15
+ admin: boolean;
16
+ query?: string;
17
+ enforcement: TargetCatalogEnforcement;
18
+ runtimeAuth?: (target: string) => {
19
+ status: string;
20
+ checkedAt?: string;
21
+ };
22
+ }
23
+ export declare function buildEnforcedTargetCatalog(registry: DestinationRegistry, options: EnforcedCatalogOptions): unknown;
24
+ export declare function catalogResultWithinBudget(result: ToolResult): boolean;
25
+ /** The budget covers the entire wire wrapper, including escaped JSON text. */
26
+ export declare function buildEnforcedTargetCatalogResult(registry: DestinationRegistry, options: EnforcedCatalogOptions): ToolResult;
27
+ /** Reserve the complete operator view and maximum bounded passive-health fields at startup. */
28
+ export declare function enforcedCatalogFitsSnapshot(registry: DestinationRegistry): boolean;
29
+ //# sourceMappingURL=multi-target-catalog-enforced.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-catalog-enforced.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-catalog-enforced.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,2BAA2B,CAAC;AAGvF,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAE1D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;QAC/B,IAAI,EAAE,iBAAiB,CAAC;QACxB,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;QACpC,MAAM,EAAE,OAAO,GAAG,sBAAsB,GAAG,wBAAwB,GAAG,6BAA6B,CAAC;QACpG,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,wBAAwB,CAAC;IACtC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1E;AAkDD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAmElH;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAErE;AAED,8EAA8E;AAC9E,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,sBAAsB,GAC9B,UAAU,CAiBZ;AAED,+FAA+F;AAC/F,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAmBlF"}
@@ -0,0 +1,142 @@
1
+ import { textResult, toolJson } from '../handlers/shared.js';
2
+ import { compareCatalogStrings, projectEnforcedDiagnostic } from './multi-target-catalog-projection.js';
3
+ export const TARGET_CATALOG_MAX_RESULT_BYTES = 512 * 1024;
4
+ const SHARED_AUTH_STATES = new Set([
5
+ 'not_checked',
6
+ 'checking',
7
+ 'healthy',
8
+ 'configuration_invalid',
9
+ 'authentication_failed',
10
+ 'authorization_failed',
11
+ 'temporarily_unavailable',
12
+ ]);
13
+ const NORMAL_SHARED_AUTH_STATES = new Set(['not_checked', 'checking', 'healthy']);
14
+ const CHECKED_AT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
15
+ function matchesTarget(target, query) {
16
+ return !query || target.target.toLowerCase().includes(query) || target.description.toLowerCase().includes(query);
17
+ }
18
+ function authorizationView(enforcement) {
19
+ const value = enforcement.authorization;
20
+ return {
21
+ mode: 'xsuaa-attribute',
22
+ grantMode: value.grantMode,
23
+ status: value.status,
24
+ ...(value.grantMode === 'exact' ? { exactGrantCount: value.exactGrantCount } : {}),
25
+ };
26
+ }
27
+ function failureView(registry, enforcement, failure = registry.failure) {
28
+ return {
29
+ targets: [],
30
+ admin: {
31
+ state: 'error',
32
+ source: 'btp-subaccount',
33
+ loadedAt: registry.loadedAt,
34
+ revision: registry.revision,
35
+ authorization: authorizationView(enforcement),
36
+ countsComplete: registry.countsComplete,
37
+ ...(registry.countsComplete ? { counts: registry.counts } : {}),
38
+ ...(registry.arcRelatedAtLeast === undefined ? {} : { arcRelatedAtLeast: registry.arcRelatedAtLeast }),
39
+ failure,
40
+ destinations: [],
41
+ },
42
+ };
43
+ }
44
+ export function buildEnforcedTargetCatalog(registry, options) {
45
+ if (registry.failure)
46
+ return options.admin ? failureView(registry, options.enforcement) : [];
47
+ const query = options.query?.trim().toLowerCase() ?? '';
48
+ const targets = registry.targets
49
+ .filter((target) => matchesTarget(target, query))
50
+ .sort((a, b) => compareCatalogStrings(a.target, b.target));
51
+ const publicTargets = targets
52
+ .filter((target) => options.admin || options.enforcement.allowsTarget(target.target))
53
+ .map((target) => ({
54
+ target: target.target,
55
+ description: target.description,
56
+ identity: target.identity,
57
+ ...(options.admin ? { granted: options.enforcement.allowsTarget(target.target) } : {}),
58
+ }));
59
+ if (!options.admin)
60
+ return publicTargets;
61
+ const shared = registry.targets.filter((target) => target.identity === 'shared');
62
+ const statusCounts = {};
63
+ const exceptions = [];
64
+ for (const target of shared) {
65
+ const state = options.runtimeAuth?.(target.target) ?? { status: 'not_checked' };
66
+ const status = SHARED_AUTH_STATES.has(state.status) ? state.status : 'temporarily_unavailable';
67
+ statusCounts[status] = (statusCounts[status] ?? 0) + 1;
68
+ if (!NORMAL_SHARED_AUTH_STATES.has(status) && matchesTarget(target, query)) {
69
+ const checkedAt = state.checkedAt && CHECKED_AT.test(state.checkedAt) ? state.checkedAt : undefined;
70
+ exceptions.push({ target: target.target, status, ...(checkedAt ? { checkedAt } : {}) });
71
+ }
72
+ }
73
+ exceptions.sort((a, b) => compareCatalogStrings(a.target, b.target));
74
+ const destinations = registry.diagnostics
75
+ .map(projectEnforcedDiagnostic)
76
+ .map((entry) => ({ ...entry, destinationName: entry.destinationName || undefined }))
77
+ .filter((entry) => !query ||
78
+ [entry.destinationName, entry.target, entry.description, entry.status, entry.code, entry.message].some((value) => value?.toLowerCase().includes(query)))
79
+ .sort((a, b) => compareCatalogStrings(`${a.destinationName ?? ''}\0${a.target ?? ''}\0${a.code}`, `${b.destinationName ?? ''}\0${b.target ?? ''}\0${b.code}`));
80
+ return {
81
+ targets: publicTargets,
82
+ admin: {
83
+ state: registry.counts.quarantined ? 'degraded' : 'ready',
84
+ source: 'btp-subaccount',
85
+ loadedAt: registry.loadedAt,
86
+ revision: registry.revision,
87
+ counts: registry.counts,
88
+ countsComplete: true,
89
+ authorization: authorizationView(options.enforcement),
90
+ ...(shared.length
91
+ ? {
92
+ sharedAuthentication: {
93
+ targets: shared.length,
94
+ statusCounts,
95
+ ...(exceptions.length ? { exceptions } : {}),
96
+ },
97
+ }
98
+ : {}),
99
+ destinations,
100
+ },
101
+ };
102
+ }
103
+ export function catalogResultWithinBudget(result) {
104
+ return Buffer.byteLength(JSON.stringify(result), 'utf8') <= TARGET_CATALOG_MAX_RESULT_BYTES;
105
+ }
106
+ /** The budget covers the entire wire wrapper, including escaped JSON text. */
107
+ export function buildEnforcedTargetCatalogResult(registry, options) {
108
+ const result = textResult(toolJson(buildEnforcedTargetCatalog(registry, options)));
109
+ if (registry.failure)
110
+ result.isError = true;
111
+ if (catalogResultWithinBudget(result))
112
+ return result;
113
+ return {
114
+ ...textResult(toolJson(options.admin
115
+ ? failureView(registry, options.enforcement, {
116
+ code: 'CATALOG_SIZE_LIMIT_EXCEEDED',
117
+ message: 'Complete target catalog exceeds its size limit; no partial inventory is returned.',
118
+ })
119
+ : { error: 'CATALOG_SIZE_LIMIT_EXCEEDED', message: 'Target catalog exceeds its size limit.' })),
120
+ isError: true,
121
+ };
122
+ }
123
+ /** Reserve the complete operator view and maximum bounded passive-health fields at startup. */
124
+ export function enforcedCatalogFitsSnapshot(registry) {
125
+ const payload = buildEnforcedTargetCatalog(registry, {
126
+ admin: true,
127
+ enforcement: {
128
+ allowsTarget: () => false,
129
+ authorization: {
130
+ mode: 'xsuaa-attribute',
131
+ grantMode: 'exact',
132
+ status: 'valid',
133
+ exactGrantCount: 256,
134
+ },
135
+ },
136
+ runtimeAuth: () => ({ status: 'temporarily_unavailable', checkedAt: '9999-12-31T23:59:59.999Z' }),
137
+ });
138
+ // Mixed passive-state counts and the longest grant-error status add small metadata differences.
139
+ // Reserve these before accepting a snapshot; the final serialized-result guard remains authoritative.
140
+ return (Buffer.byteLength(JSON.stringify(textResult(toolJson(payload))), 'utf8') + 1024 <= TARGET_CATALOG_MAX_RESULT_BYTES);
141
+ }
142
+ //# sourceMappingURL=multi-target-catalog-enforced.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-catalog-enforced.js","sourceRoot":"","sources":["../../src/server/multi-target-catalog-enforced.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Bounded display-only projection. Never use these fields for connection validation or drift. */
2
+ import type { TargetDiagnostic } from './destination-registry.js';
3
+ export declare function boundedCatalogText(value: string | undefined, maximum: number): string | undefined;
4
+ export declare function projectEnforcedDiagnostic(entry: TargetDiagnostic): TargetDiagnostic;
5
+ /** Code-unit order is independent of operating-system locale and ICU version. */
6
+ export declare function compareCatalogStrings(left: string, right: string): number;
7
+ //# sourceMappingURL=multi-target-catalog-projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-catalog-projection.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-catalog-projection.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAWlE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAyCnF;AAED,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,52 @@
1
+ import { normalizeTargetDisplayText, SAP_SYSID_PATTERN, TARGET_ID_PATTERN, TARGET_SYSTEM_ALIAS_PATTERN, } from './multi-target-identity.js';
2
+ const SAFE_NAME = /^[A-Za-z0-9_.-]{1,200}$/;
3
+ const SAFE_CODE = /^[A-Z][A-Z0-9_]{0,63}$/;
4
+ export function boundedCatalogText(value, maximum) {
5
+ if (typeof value !== 'string' || value.length > maximum * 4)
6
+ return undefined;
7
+ const normalized = normalizeTargetDisplayText(value);
8
+ return normalized && normalized.length <= maximum ? normalized : undefined;
9
+ }
10
+ export function projectEnforcedDiagnostic(entry) {
11
+ const unknownPropertyCount = Math.max(entry.arcConfig.unknownPropertyCount ?? 0, entry.arcConfig.unknownProperties?.length ?? 0);
12
+ const arcConfig = Object.freeze({
13
+ ...(typeof entry.arcConfig.enabled === 'boolean' ? { enabled: entry.arcConfig.enabled } : {}),
14
+ ...(typeof entry.arcConfig.allowDataPreview === 'boolean'
15
+ ? { allowDataPreview: entry.arcConfig.allowDataPreview }
16
+ : {}),
17
+ ...(typeof entry.arcConfig.allowFreeSQL === 'boolean' ? { allowFreeSQL: entry.arcConfig.allowFreeSQL } : {}),
18
+ ...(TARGET_SYSTEM_ALIAS_PATTERN.test(entry.arcConfig.targetAlias ?? '')
19
+ ? { targetAlias: entry.arcConfig.targetAlias }
20
+ : {}),
21
+ ...(unknownPropertyCount ? { unknownPropertyCount } : {}),
22
+ });
23
+ return Object.freeze({
24
+ destinationName: SAFE_NAME.test(entry.destinationName) ? entry.destinationName : '',
25
+ ...(TARGET_ID_PATTERN.test(entry.target ?? '') ? { target: entry.target } : {}),
26
+ status: entry.status,
27
+ code: entry.code,
28
+ message: entry.code === 'UNKNOWN_ARC1_PROPERTY'
29
+ ? 'Unsupported ARC-1 destination properties; inspect the configuration in BTP Cockpit.'
30
+ : (boundedCatalogText(entry.message, 256) ?? 'Destination configuration requires administrator review.'),
31
+ ...(boundedCatalogText(entry.description, 160) ? { description: boundedCatalogText(entry.description, 160) } : {}),
32
+ ...(entry.type === 'HTTP' ? { type: entry.type } : {}),
33
+ ...(entry.authentication === 'PrincipalPropagation' || entry.authentication === 'BasicAuthentication'
34
+ ? { authentication: entry.authentication }
35
+ : {}),
36
+ ...(entry.proxyType === 'OnPremise' ? { proxyType: entry.proxyType } : {}),
37
+ ...(SAP_SYSID_PATTERN.test(entry.sid ?? '') ? { sid: entry.sid } : {}),
38
+ ...(/^\d{3}$/.test(entry.client ?? '') ? { client: entry.client } : {}),
39
+ ...(/^[A-Z]{2}$/.test(entry.language ?? '') ? { language: entry.language } : {}),
40
+ hasCloudConnectorLocationId: entry.hasCloudConnectorLocationId === true,
41
+ ...(entry.requestedPolicy ? { requestedPolicy: entry.requestedPolicy } : {}),
42
+ ...(entry.effectivePolicy ? { effectivePolicy: entry.effectivePolicy } : {}),
43
+ ...(entry.limitedByInstance ? { limitedByInstance: true } : {}),
44
+ arcConfig,
45
+ warnings: Object.freeze([...new Set(entry.warnings.filter((code) => SAFE_CODE.test(code)))].sort().slice(0, 16)),
46
+ });
47
+ }
48
+ /** Code-unit order is independent of operating-system locale and ICU version. */
49
+ export function compareCatalogStrings(left, right) {
50
+ return left < right ? -1 : left > right ? 1 : 0;
51
+ }
52
+ //# sourceMappingURL=multi-target-catalog-projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-target-catalog-projection.js","sourceRoot":"","sources":["../../src/server/multi-target-catalog-projection.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,SAAS,GAAG,yBAAyB,CAAC;AAC5C,MAAM,SAAS,GAAG,wBAAwB,CAAC;AAE3C,MAAM,UAAU,kBAAkB,CAAC,KAAyB,EAAE,OAAe;IAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9E,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACrD,OAAO,UAAU,IAAI,UAAU,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAuB;IAC/D,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CACnC,KAAK,CAAC,SAAS,CAAC,oBAAoB,IAAI,CAAC,EACzC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC,CAC/C,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,GAAG,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,gBAAgB,KAAK,SAAS;YACvD,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,EAAE;YACxD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,GAAG,CAAC,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,IAAI,EAAE,CAAC;YACrE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;YAC9C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,eAAe,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;QACnF,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EACL,KAAK,CAAC,IAAI,KAAK,uBAAuB;YACpC,CAAC,CAAC,qFAAqF;YACvF,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,0DAA0D,CAAC;QAC5G,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClH,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,sBAAsB,IAAI,KAAK,CAAC,cAAc,KAAK,qBAAqB;YACnG,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE;YAC1C,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,2BAA2B,EAAE,KAAK,CAAC,2BAA2B,KAAK,IAAI;QACvE,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,SAAS;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KACjH,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,KAAa;IAC/D,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -1,6 +1,4 @@
1
1
  /** Authorization-safe, success-only feature state for discovered targets. */
2
- import type { ResolvedFeatures } from '../adt/types.js';
3
- export declare function hasAuthorizationLimitedFeatureEvidence(features: ResolvedFeatures): boolean;
4
2
  /** One in-flight probe per target. Rejections are observed, cleared, and never cached. */
5
3
  export declare function ensureMultiTargetFeatureProbe(target: string | undefined, alreadyKnown: boolean, probe: () => Promise<void>, clearFailedEvidence: () => void): Promise<void>;
6
4
  //# sourceMappingURL=multi-target-feature-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multi-target-feature-state.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-feature-state.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxD,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAkB1F;AAED,0FAA0F;AAC1F,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC1B,mBAAmB,EAAE,MAAM,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAef"}
1
+ {"version":3,"file":"multi-target-feature-state.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-feature-state.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAI7E,0FAA0F;AAC1F,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC1B,mBAAmB,EAAE,MAAM,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -1,24 +1,5 @@
1
1
  /** Authorization-safe, success-only feature state for discovered targets. */
2
2
  const probeFlights = new Map();
3
- export function hasAuthorizationLimitedFeatureEvidence(features) {
4
- const authMarker = /(authorization|auth failure|forbidden|\b401\b|\b403\b)/i;
5
- const featureStatuses = [
6
- features.hana,
7
- features.abapGit,
8
- features.gcts,
9
- features.rap,
10
- features.amdp,
11
- features.ui5,
12
- features.transport,
13
- features.ui5repo,
14
- features.flp,
15
- ];
16
- if (featureStatuses.some((status) => !status.available && authMarker.test(status.message ?? '')))
17
- return true;
18
- if (!features.textSearch?.available && authMarker.test(features.textSearch?.reason ?? ''))
19
- return true;
20
- return [features.authProbe?.searchReason, features.authProbe?.transportReason].some((reason) => authMarker.test(reason ?? ''));
21
- }
22
3
  /** One in-flight probe per target. Rejections are observed, cleared, and never cached. */
23
4
  export async function ensureMultiTargetFeatureProbe(target, alreadyKnown, probe, clearFailedEvidence) {
24
5
  if (!target || alreadyKnown)
@@ -1 +1 @@
1
- {"version":3,"file":"multi-target-feature-state.js","sourceRoot":"","sources":["../../src/server/multi-target-feature-state.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAI7E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEtD,MAAM,UAAU,sCAAsC,CAAC,QAA0B;IAC/E,MAAM,UAAU,GAAG,yDAAyD,CAAC;IAC7E,MAAM,eAAe,GAAG;QACtB,QAAQ,CAAC,IAAI;QACb,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,IAAI;QACb,QAAQ,CAAC,GAAG;QACZ,QAAQ,CAAC,IAAI;QACb,QAAQ,CAAC,GAAG;QACZ,QAAQ,CAAC,SAAS;QAClB,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,GAAG;KACb,CAAC;IACF,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9G,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACvG,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7F,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,MAA0B,EAC1B,YAAqB,EACrB,KAA0B,EAC1B,mBAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO;IACpC,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,KAAK,EAAE,CAAC;QACjB,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM;gBAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,mBAAmB,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"multi-target-feature-state.js","sourceRoot":"","sources":["../../src/server/multi-target-feature-state.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;AAEtD,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,MAA0B,EAC1B,YAAqB,EACrB,KAA0B,EAC1B,mBAA+B;IAE/B,IAAI,CAAC,MAAM,IAAI,YAAY;QAAE,OAAO;IACpC,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,KAAK,EAAE,CAAC;QACjB,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM;gBAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,mBAAmB,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,CAAC;AACf,CAAC"}
@@ -1,5 +1,8 @@
1
1
  /** Public target-ID and HTTP-route syntax for destination-discovered multi-target mode. */
2
2
  export declare const SAP_SYSID_PATTERN: RegExp;
3
+ export declare const MULTI_TARGET_MAX = 256;
4
+ /** Display labels only: never use normalization to validate a connection or grant. */
5
+ export declare function normalizeTargetDisplayText(value: string): string;
3
6
  export declare const TARGET_SYSTEM_SEGMENT_SOURCE = "[A-Z][A-Z0-9-]{1,30}[A-Z0-9]";
4
7
  export declare const TARGET_SYSTEM_ALIAS_PATTERN: RegExp;
5
8
  export declare const TARGET_ID_PATTERN: RegExp;
@@ -1 +1 @@
1
- {"version":3,"file":"multi-target-identity.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-identity.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,eAAO,MAAM,iBAAiB,QAAuB,CAAC;AAKtD,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,2BAA2B,QAAkD,CAAC;AAC3F,eAAO,MAAM,iBAAiB,QAA2D,CAAC;AAC1F,eAAO,MAAM,uBAAuB,QAAoE,CAAC;AACzG,eAAO,MAAM,qCAAqC,QAEjD,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE"}
1
+ {"version":3,"file":"multi-target-identity.d.ts","sourceRoot":"","sources":["../../src/server/multi-target-identity.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,eAAO,MAAM,iBAAiB,QAAuB,CAAC;AACtD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,sFAAsF;AACtF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhE;AAKD,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,2BAA2B,QAAkD,CAAC;AAC3F,eAAO,MAAM,iBAAiB,QAA2D,CAAC;AAC1F,eAAO,MAAM,uBAAuB,QAAoE,CAAC;AACzG,eAAO,MAAM,qCAAqC,QAEjD,CAAC;AAEF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE"}