arc-1 1.6.0 → 1.8.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 (411) hide show
  1. package/README.md +26 -18
  2. package/dist/adt/application-log.d.ts +36 -0
  3. package/dist/adt/application-log.d.ts.map +1 -0
  4. package/dist/adt/application-log.js +143 -0
  5. package/dist/adt/application-log.js.map +1 -0
  6. package/dist/adt/aunit-package.d.ts.map +1 -1
  7. package/dist/adt/aunit-package.js +9 -1
  8. package/dist/adt/aunit-package.js.map +1 -1
  9. package/dist/adt/ci-quality.d.ts.map +1 -1
  10. package/dist/adt/ci-quality.js +1 -1
  11. package/dist/adt/ci-quality.js.map +1 -1
  12. package/dist/adt/class-structure.d.ts +2 -1
  13. package/dist/adt/class-structure.d.ts.map +1 -1
  14. package/dist/adt/class-structure.js +28 -10
  15. package/dist/adt/class-structure.js.map +1 -1
  16. package/dist/adt/client.d.ts +27 -9
  17. package/dist/adt/client.d.ts.map +1 -1
  18. package/dist/adt/client.js +23 -16
  19. package/dist/adt/client.js.map +1 -1
  20. package/dist/adt/codeintel.d.ts +9 -23
  21. package/dist/adt/codeintel.d.ts.map +1 -1
  22. package/dist/adt/codeintel.js +14 -34
  23. package/dist/adt/codeintel.js.map +1 -1
  24. package/dist/adt/crud.d.ts +3 -2
  25. package/dist/adt/crud.d.ts.map +1 -1
  26. package/dist/adt/crud.js +13 -3
  27. package/dist/adt/crud.js.map +1 -1
  28. package/dist/adt/devtools.d.ts +21 -7
  29. package/dist/adt/devtools.d.ts.map +1 -1
  30. package/dist/adt/devtools.js +98 -44
  31. package/dist/adt/devtools.js.map +1 -1
  32. package/dist/adt/diagnostics.d.ts +2 -0
  33. package/dist/adt/diagnostics.d.ts.map +1 -1
  34. package/dist/adt/diagnostics.js +12 -10
  35. package/dist/adt/diagnostics.js.map +1 -1
  36. package/dist/adt/errors.d.ts +5 -1
  37. package/dist/adt/errors.d.ts.map +1 -1
  38. package/dist/adt/errors.js +26 -0
  39. package/dist/adt/errors.js.map +1 -1
  40. package/dist/adt/feed-schema.d.ts +32 -0
  41. package/dist/adt/feed-schema.d.ts.map +1 -0
  42. package/dist/adt/feed-schema.js +123 -0
  43. package/dist/adt/feed-schema.js.map +1 -0
  44. package/dist/adt/fm-parameter-docs.d.ts +7 -0
  45. package/dist/adt/fm-parameter-docs.d.ts.map +1 -0
  46. package/dist/adt/fm-parameter-docs.js +134 -0
  47. package/dist/adt/fm-parameter-docs.js.map +1 -0
  48. package/dist/adt/fm-signature.d.ts +8 -1
  49. package/dist/adt/fm-signature.d.ts.map +1 -1
  50. package/dist/adt/fm-signature.js +37 -28
  51. package/dist/adt/fm-signature.js.map +1 -1
  52. package/dist/adt/http-deadline.d.ts +2 -0
  53. package/dist/adt/http-deadline.d.ts.map +1 -1
  54. package/dist/adt/http-deadline.js +4 -1
  55. package/dist/adt/http-deadline.js.map +1 -1
  56. package/dist/adt/http-retry-after.d.ts +20 -0
  57. package/dist/adt/http-retry-after.d.ts.map +1 -0
  58. package/dist/adt/http-retry-after.js +37 -0
  59. package/dist/adt/http-retry-after.js.map +1 -0
  60. package/dist/adt/http.d.ts +11 -20
  61. package/dist/adt/http.d.ts.map +1 -1
  62. package/dist/adt/http.js +104 -90
  63. package/dist/adt/http.js.map +1 -1
  64. package/dist/adt/include-expansion.d.ts +143 -0
  65. package/dist/adt/include-expansion.d.ts.map +1 -0
  66. package/dist/adt/include-expansion.js +475 -0
  67. package/dist/adt/include-expansion.js.map +1 -0
  68. package/dist/adt/internal-data-operations.d.ts +3 -3
  69. package/dist/adt/internal-data-operations.d.ts.map +1 -1
  70. package/dist/adt/internal-data-operations.js +9 -2
  71. package/dist/adt/internal-data-operations.js.map +1 -1
  72. package/dist/adt/package-browser.d.ts +23 -0
  73. package/dist/adt/package-browser.d.ts.map +1 -0
  74. package/dist/adt/package-browser.js +139 -0
  75. package/dist/adt/package-browser.js.map +1 -0
  76. package/dist/adt/package-contents.d.ts +2 -0
  77. package/dist/adt/package-contents.d.ts.map +1 -1
  78. package/dist/adt/package-contents.js +3 -1
  79. package/dist/adt/package-contents.js.map +1 -1
  80. package/dist/adt/pinned-write-policy.d.ts +15 -0
  81. package/dist/adt/pinned-write-policy.d.ts.map +1 -0
  82. package/dist/adt/pinned-write-policy.js +111 -0
  83. package/dist/adt/pinned-write-policy.js.map +1 -0
  84. package/dist/adt/revision-feed.d.ts +8 -0
  85. package/dist/adt/revision-feed.d.ts.map +1 -0
  86. package/dist/adt/revision-feed.js +108 -0
  87. package/dist/adt/revision-feed.js.map +1 -0
  88. package/dist/adt/safety.d.ts +11 -0
  89. package/dist/adt/safety.d.ts.map +1 -1
  90. package/dist/adt/safety.js +18 -2
  91. package/dist/adt/safety.js.map +1 -1
  92. package/dist/adt/security-session-gate.d.ts +23 -0
  93. package/dist/adt/security-session-gate.d.ts.map +1 -0
  94. package/dist/adt/security-session-gate.js +56 -0
  95. package/dist/adt/security-session-gate.js.map +1 -0
  96. package/dist/adt/source-diff.d.ts +4 -1
  97. package/dist/adt/source-diff.d.ts.map +1 -1
  98. package/dist/adt/source-diff.js +5 -3
  99. package/dist/adt/source-diff.js.map +1 -1
  100. package/dist/adt/stored-text/chunks.d.ts +8 -0
  101. package/dist/adt/stored-text/chunks.d.ts.map +1 -0
  102. package/dist/adt/stored-text/chunks.js +55 -0
  103. package/dist/adt/stored-text/chunks.js.map +1 -0
  104. package/dist/adt/stored-text/decoder.d.ts +31 -0
  105. package/dist/adt/stored-text/decoder.d.ts.map +1 -0
  106. package/dist/adt/stored-text/decoder.js +319 -0
  107. package/dist/adt/stored-text/decoder.js.map +1 -0
  108. package/dist/adt/stored-text/errors.d.ts +10 -0
  109. package/dist/adt/stored-text/errors.d.ts.map +1 -0
  110. package/dist/adt/stored-text/errors.js +10 -0
  111. package/dist/adt/stored-text/errors.js.map +1 -0
  112. package/dist/adt/stored-text/index.d.ts +7 -0
  113. package/dist/adt/stored-text/index.d.ts.map +1 -0
  114. package/dist/adt/stored-text/index.js +6 -0
  115. package/dist/adt/stored-text/index.js.map +1 -0
  116. package/dist/adt/stored-text/key.d.ts +3 -0
  117. package/dist/adt/stored-text/key.d.ts.map +1 -0
  118. package/dist/adt/stored-text/key.js +23 -0
  119. package/dist/adt/stored-text/key.js.map +1 -0
  120. package/dist/adt/stored-text/reader.d.ts +52 -0
  121. package/dist/adt/stored-text/reader.d.ts.map +1 -0
  122. package/dist/adt/stored-text/reader.js +142 -0
  123. package/dist/adt/stored-text/reader.js.map +1 -0
  124. package/dist/adt/stored-text/source.d.ts +5 -0
  125. package/dist/adt/stored-text/source.d.ts.map +1 -0
  126. package/dist/adt/stored-text/source.js +284 -0
  127. package/dist/adt/stored-text/source.js.map +1 -0
  128. package/dist/adt/stored-text/types.d.ts +38 -0
  129. package/dist/adt/stored-text/types.d.ts.map +1 -0
  130. package/dist/adt/stored-text/types.js +2 -0
  131. package/dist/adt/stored-text/types.js.map +1 -0
  132. package/dist/adt/structure-hierarchy.d.ts.map +1 -1
  133. package/dist/adt/structure-hierarchy.js +11 -27
  134. package/dist/adt/structure-hierarchy.js.map +1 -1
  135. package/dist/adt/syntax-batch.d.ts +66 -0
  136. package/dist/adt/syntax-batch.d.ts.map +1 -0
  137. package/dist/adt/syntax-batch.js +115 -0
  138. package/dist/adt/syntax-batch.js.map +1 -0
  139. package/dist/adt/table-query.d.ts +3 -1
  140. package/dist/adt/table-query.d.ts.map +1 -1
  141. package/dist/adt/table-query.js +32 -4
  142. package/dist/adt/table-query.js.map +1 -1
  143. package/dist/adt/table-settings.d.ts +3 -0
  144. package/dist/adt/table-settings.d.ts.map +1 -1
  145. package/dist/adt/table-settings.js +11 -1
  146. package/dist/adt/table-settings.js.map +1 -1
  147. package/dist/adt/text-elements.js +1 -1
  148. package/dist/adt/text-elements.js.map +1 -1
  149. package/dist/adt/transport-diff.d.ts +16 -25
  150. package/dist/adt/transport-diff.d.ts.map +1 -1
  151. package/dist/adt/transport-diff.js +201 -103
  152. package/dist/adt/transport-diff.js.map +1 -1
  153. package/dist/adt/transport-locks.d.ts +7 -0
  154. package/dist/adt/transport-locks.d.ts.map +1 -0
  155. package/dist/adt/transport-locks.js +56 -0
  156. package/dist/adt/transport-locks.js.map +1 -0
  157. package/dist/adt/transport-review-budget.d.ts +15 -0
  158. package/dist/adt/transport-review-budget.d.ts.map +1 -0
  159. package/dist/adt/transport-review-budget.js +57 -0
  160. package/dist/adt/transport-review-budget.js.map +1 -0
  161. package/dist/adt/transport.d.ts +5 -2
  162. package/dist/adt/transport.d.ts.map +1 -1
  163. package/dist/adt/transport.js +8 -46
  164. package/dist/adt/transport.js.map +1 -1
  165. package/dist/adt/types.d.ts +1 -0
  166. package/dist/adt/types.d.ts.map +1 -1
  167. package/dist/adt/user-agent.d.ts +1 -1
  168. package/dist/adt/where-used-native.d.ts +22 -0
  169. package/dist/adt/where-used-native.d.ts.map +1 -0
  170. package/dist/adt/where-used-native.js +111 -0
  171. package/dist/adt/where-used-native.js.map +1 -0
  172. package/dist/adt/xml-parser.d.ts +2 -3
  173. package/dist/adt/xml-parser.d.ts.map +1 -1
  174. package/dist/adt/xml-parser.js +1 -91
  175. package/dist/adt/xml-parser.js.map +1 -1
  176. package/dist/aff/validator.d.ts.map +1 -1
  177. package/dist/aff/validator.js +8 -2
  178. package/dist/aff/validator.js.map +1 -1
  179. package/dist/authz/policy.d.ts.map +1 -1
  180. package/dist/authz/policy.js +10 -2
  181. package/dist/authz/policy.js.map +1 -1
  182. package/dist/cache/sqlite-driver.d.ts +24 -0
  183. package/dist/cache/sqlite-driver.d.ts.map +1 -0
  184. package/dist/cache/sqlite-driver.js +59 -0
  185. package/dist/cache/sqlite-driver.js.map +1 -0
  186. package/dist/cache/sqlite.d.ts +4 -2
  187. package/dist/cache/sqlite.d.ts.map +1 -1
  188. package/dist/cache/sqlite.js +5 -4
  189. package/dist/cache/sqlite.js.map +1 -1
  190. package/dist/cli-ide.d.ts +11 -0
  191. package/dist/cli-ide.d.ts.map +1 -0
  192. package/dist/cli-ide.js +69 -0
  193. package/dist/cli-ide.js.map +1 -0
  194. package/dist/cli.d.ts.map +1 -1
  195. package/dist/cli.js +9 -2
  196. package/dist/cli.js.map +1 -1
  197. package/dist/context/grep.d.ts +2 -0
  198. package/dist/context/grep.d.ts.map +1 -1
  199. package/dist/context/grep.js +8 -7
  200. package/dist/context/grep.js.map +1 -1
  201. package/dist/extract-sap-cookies.js +1 -0
  202. package/dist/extract-sap-cookies.js.map +1 -1
  203. package/dist/handlers/activate.d.ts.map +1 -1
  204. package/dist/handlers/activate.js +3 -0
  205. package/dist/handlers/activate.js.map +1 -1
  206. package/dist/handlers/application-log-input.d.ts +32 -0
  207. package/dist/handlers/application-log-input.d.ts.map +1 -0
  208. package/dist/handlers/application-log-input.js +34 -0
  209. package/dist/handlers/application-log-input.js.map +1 -0
  210. package/dist/handlers/application-log.d.ts +4 -0
  211. package/dist/handlers/application-log.d.ts.map +1 -0
  212. package/dist/handlers/application-log.js +14 -0
  213. package/dist/handlers/application-log.js.map +1 -0
  214. package/dist/handlers/cds-hints.d.ts +1 -1
  215. package/dist/handlers/cds-hints.d.ts.map +1 -1
  216. package/dist/handlers/cds-hints.js +21 -63
  217. package/dist/handlers/cds-hints.js.map +1 -1
  218. package/dist/handlers/context.d.ts.map +1 -1
  219. package/dist/handlers/context.js +7 -3
  220. package/dist/handlers/context.js.map +1 -1
  221. package/dist/handlers/diagnose.d.ts.map +1 -1
  222. package/dist/handlers/diagnose.js +10 -1
  223. package/dist/handlers/diagnose.js.map +1 -1
  224. package/dist/handlers/dispatch.d.ts +2 -1
  225. package/dist/handlers/dispatch.d.ts.map +1 -1
  226. package/dist/handlers/dispatch.js +63 -12
  227. package/dist/handlers/dispatch.js.map +1 -1
  228. package/dist/handlers/dump-filter-inputs.d.ts +38 -0
  229. package/dist/handlers/dump-filter-inputs.d.ts.map +1 -0
  230. package/dist/handlers/dump-filter-inputs.js +44 -0
  231. package/dist/handlers/dump-filter-inputs.js.map +1 -0
  232. package/dist/handlers/expanded-read.d.ts +24 -0
  233. package/dist/handlers/expanded-read.d.ts.map +1 -0
  234. package/dist/handlers/expanded-read.js +56 -0
  235. package/dist/handlers/expanded-read.js.map +1 -0
  236. package/dist/handlers/function-parameter-language.d.ts +5 -0
  237. package/dist/handlers/function-parameter-language.d.ts.map +1 -0
  238. package/dist/handlers/function-parameter-language.js +19 -0
  239. package/dist/handlers/function-parameter-language.js.map +1 -0
  240. package/dist/handlers/function-processing.d.ts +5 -0
  241. package/dist/handlers/function-processing.d.ts.map +1 -1
  242. package/dist/handlers/function-processing.js +5 -0
  243. package/dist/handlers/function-processing.js.map +1 -1
  244. package/dist/handlers/hyperfocused.d.ts.map +1 -1
  245. package/dist/handlers/hyperfocused.js +2 -1
  246. package/dist/handlers/hyperfocused.js.map +1 -1
  247. package/dist/handlers/long-text-input.d.ts +113 -0
  248. package/dist/handlers/long-text-input.d.ts.map +1 -0
  249. package/dist/handlers/long-text-input.js +113 -0
  250. package/dist/handlers/long-text-input.js.map +1 -0
  251. package/dist/handlers/long-text.d.ts +5 -0
  252. package/dist/handlers/long-text.d.ts.map +1 -0
  253. package/dist/handlers/long-text.js +122 -0
  254. package/dist/handlers/long-text.js.map +1 -0
  255. package/dist/handlers/navigate.d.ts.map +1 -1
  256. package/dist/handlers/navigate.js +8 -3
  257. package/dist/handlers/navigate.js.map +1 -1
  258. package/dist/handlers/object-types.d.ts.map +1 -1
  259. package/dist/handlers/object-types.js +12 -5
  260. package/dist/handlers/object-types.js.map +1 -1
  261. package/dist/handlers/query-input.d.ts +50 -0
  262. package/dist/handlers/query-input.d.ts.map +1 -0
  263. package/dist/handlers/query-input.js +59 -0
  264. package/dist/handlers/query-input.js.map +1 -0
  265. package/dist/handlers/query-tool.d.ts +11 -0
  266. package/dist/handlers/query-tool.d.ts.map +1 -0
  267. package/dist/handlers/query-tool.js +99 -0
  268. package/dist/handlers/query-tool.js.map +1 -0
  269. package/dist/handlers/query.d.ts +1 -1
  270. package/dist/handlers/query.d.ts.map +1 -1
  271. package/dist/handlers/query.js +7 -1
  272. package/dist/handlers/query.js.map +1 -1
  273. package/dist/handlers/read.d.ts +1 -0
  274. package/dist/handlers/read.d.ts.map +1 -1
  275. package/dist/handlers/read.js +62 -11
  276. package/dist/handlers/read.js.map +1 -1
  277. package/dist/handlers/schemas.d.ts +23 -4
  278. package/dist/handlers/schemas.d.ts.map +1 -1
  279. package/dist/handlers/schemas.js +82 -9
  280. package/dist/handlers/schemas.js.map +1 -1
  281. package/dist/handlers/syntax.d.ts.map +1 -1
  282. package/dist/handlers/syntax.js +8 -0
  283. package/dist/handlers/syntax.js.map +1 -1
  284. package/dist/handlers/tool-descriptions.js +2 -2
  285. package/dist/handlers/tool-descriptions.js.map +1 -1
  286. package/dist/handlers/tools.d.ts.map +1 -1
  287. package/dist/handlers/tools.js +81 -74
  288. package/dist/handlers/tools.js.map +1 -1
  289. package/dist/handlers/transport-review.d.ts +5 -0
  290. package/dist/handlers/transport-review.d.ts.map +1 -0
  291. package/dist/handlers/transport-review.js +108 -0
  292. package/dist/handlers/transport-review.js.map +1 -0
  293. package/dist/handlers/transport.d.ts.map +1 -1
  294. package/dist/handlers/transport.js +3 -58
  295. package/dist/handlers/transport.js.map +1 -1
  296. package/dist/handlers/where-used-details.d.ts +28 -0
  297. package/dist/handlers/where-used-details.d.ts.map +1 -0
  298. package/dist/handlers/where-used-details.js +67 -0
  299. package/dist/handlers/where-used-details.js.map +1 -0
  300. package/dist/handlers/where-used.d.ts +8 -3
  301. package/dist/handlers/where-used.d.ts.map +1 -1
  302. package/dist/handlers/where-used.js +40 -18
  303. package/dist/handlers/where-used.js.map +1 -1
  304. package/dist/handlers/write/create.d.ts.map +1 -1
  305. package/dist/handlers/write/create.js +15 -12
  306. package/dist/handlers/write/create.js.map +1 -1
  307. package/dist/handlers/write/pinned-activation.d.ts +8 -0
  308. package/dist/handlers/write/pinned-activation.d.ts.map +1 -0
  309. package/dist/handlers/write/pinned-activation.js +68 -0
  310. package/dist/handlers/write/pinned-activation.js.map +1 -0
  311. package/dist/handlers/write/pinned.d.ts +10 -0
  312. package/dist/handlers/write/pinned.d.ts.map +1 -0
  313. package/dist/handlers/write/pinned.js +202 -0
  314. package/dist/handlers/write/pinned.js.map +1 -0
  315. package/dist/handlers/write/update-delete.d.ts.map +1 -1
  316. package/dist/handlers/write/update-delete.js +5 -3
  317. package/dist/handlers/write/update-delete.js.map +1 -1
  318. package/dist/handlers/write-helpers.d.ts +2 -2
  319. package/dist/handlers/write-helpers.d.ts.map +1 -1
  320. package/dist/handlers/write-helpers.js +8 -6
  321. package/dist/handlers/write-helpers.js.map +1 -1
  322. package/dist/handlers/write.d.ts.map +1 -1
  323. package/dist/handlers/write.js +4 -1
  324. package/dist/handlers/write.js.map +1 -1
  325. package/dist/server/audit.d.ts +1 -0
  326. package/dist/server/audit.d.ts.map +1 -1
  327. package/dist/server/audit.js +49 -2
  328. package/dist/server/audit.js.map +1 -1
  329. package/dist/server/config.d.ts.map +1 -1
  330. package/dist/server/config.js +29 -1
  331. package/dist/server/config.js.map +1 -1
  332. package/dist/server/destination-registry.d.ts +14 -0
  333. package/dist/server/destination-registry.d.ts.map +1 -1
  334. package/dist/server/destination-registry.js +43 -4
  335. package/dist/server/destination-registry.js.map +1 -1
  336. package/dist/server/http.d.ts.map +1 -1
  337. package/dist/server/http.js +25 -5
  338. package/dist/server/http.js.map +1 -1
  339. package/dist/server/ide-links.d.ts +14 -0
  340. package/dist/server/ide-links.d.ts.map +1 -0
  341. package/dist/server/ide-links.js +146 -0
  342. package/dist/server/ide-links.js.map +1 -0
  343. package/dist/server/ide-request.d.ts +13 -0
  344. package/dist/server/ide-request.d.ts.map +1 -0
  345. package/dist/server/ide-request.js +14 -0
  346. package/dist/server/ide-request.js.map +1 -0
  347. package/dist/server/multi-target-authorization.d.ts +1 -1
  348. package/dist/server/multi-target-authorization.d.ts.map +1 -1
  349. package/dist/server/multi-target-authorization.js +5 -3
  350. package/dist/server/multi-target-authorization.js.map +1 -1
  351. package/dist/server/multi-target-catalog-enforced.d.ts +6 -1
  352. package/dist/server/multi-target-catalog-enforced.d.ts.map +1 -1
  353. package/dist/server/multi-target-catalog-enforced.js +3 -0
  354. package/dist/server/multi-target-catalog-enforced.js.map +1 -1
  355. package/dist/server/multi-target-catalog-projection.d.ts.map +1 -1
  356. package/dist/server/multi-target-catalog-projection.js +1 -0
  357. package/dist/server/multi-target-catalog-projection.js.map +1 -1
  358. package/dist/server/multi-target-catalog.d.ts.map +1 -1
  359. package/dist/server/multi-target-catalog.js +1 -0
  360. package/dist/server/multi-target-catalog.js.map +1 -1
  361. package/dist/server/multi-target-destination-config.d.ts +2 -0
  362. package/dist/server/multi-target-destination-config.d.ts.map +1 -1
  363. package/dist/server/multi-target-destination-config.js +18 -0
  364. package/dist/server/multi-target-destination-config.js.map +1 -1
  365. package/dist/server/multi-target-identity.d.ts.map +1 -1
  366. package/dist/server/multi-target-identity.js +4 -3
  367. package/dist/server/multi-target-identity.js.map +1 -1
  368. package/dist/server/multi-target-request-projection.d.ts +2 -0
  369. package/dist/server/multi-target-request-projection.d.ts.map +1 -1
  370. package/dist/server/multi-target-request-projection.js +2 -0
  371. package/dist/server/multi-target-request-projection.js.map +1 -1
  372. package/dist/server/multi-target-runtime.d.ts +5 -1
  373. package/dist/server/multi-target-runtime.d.ts.map +1 -1
  374. package/dist/server/multi-target-runtime.js +30 -3
  375. package/dist/server/multi-target-runtime.js.map +1 -1
  376. package/dist/server/multi-target-server.d.ts.map +1 -1
  377. package/dist/server/multi-target-server.js +42 -6
  378. package/dist/server/multi-target-server.js.map +1 -1
  379. package/dist/server/multi-target-tools.d.ts.map +1 -1
  380. package/dist/server/multi-target-tools.js +64 -7
  381. package/dist/server/multi-target-tools.js.map +1 -1
  382. package/dist/server/multi-target-write-surface.d.ts +9 -0
  383. package/dist/server/multi-target-write-surface.d.ts.map +1 -0
  384. package/dist/server/multi-target-write-surface.js +42 -0
  385. package/dist/server/multi-target-write-surface.js.map +1 -0
  386. package/dist/server/per-user-transport.d.ts +18 -0
  387. package/dist/server/per-user-transport.d.ts.map +1 -0
  388. package/dist/server/per-user-transport.js +72 -0
  389. package/dist/server/per-user-transport.js.map +1 -0
  390. package/dist/server/server-instructions.d.ts +2 -0
  391. package/dist/server/server-instructions.d.ts.map +1 -1
  392. package/dist/server/server-instructions.js +10 -12
  393. package/dist/server/server-instructions.js.map +1 -1
  394. package/dist/server/server.d.ts +3 -0
  395. package/dist/server/server.d.ts.map +1 -1
  396. package/dist/server/server.js +22 -8
  397. package/dist/server/server.js.map +1 -1
  398. package/dist/server/tool-auth.d.ts +1 -1
  399. package/dist/server/tool-auth.d.ts.map +1 -1
  400. package/dist/server/tool-auth.js +24 -4
  401. package/dist/server/tool-auth.js.map +1 -1
  402. package/dist/server/types.d.ts +7 -0
  403. package/dist/server/types.d.ts.map +1 -1
  404. package/dist/server/types.js +3 -0
  405. package/dist/server/types.js.map +1 -1
  406. package/dist/server/ui-state.d.ts.map +1 -1
  407. package/dist/server/ui-state.js +1 -0
  408. package/dist/server/ui-state.js.map +1 -1
  409. package/dist/version.d.ts +1 -1
  410. package/dist/version.js +1 -1
  411. package/package.json +14 -10
@@ -0,0 +1,139 @@
1
+ /** Direct native package contents; never used as write-authorization evidence. */
2
+ import { XMLValidator } from 'fast-xml-parser';
3
+ import { getCurrentContext } from '../server/context.js';
4
+ import { DataResponseBudget } from './data-result-context.js';
5
+ import { AdtError } from './errors.js';
6
+ import { throwIfRequestCancelled } from './http-deadline.js';
7
+ import { DIRECT_PACKAGE_NAME, DIRECT_PACKAGE_TYPE } from './package-contents.js';
8
+ import { canonicalHostRelativeAdtPath } from './path-safety.js';
9
+ import { RequestAttemptBudget } from './request-attempt-budget.js';
10
+ import { clampUrlLimit } from './result-limits.js';
11
+ import { checkOperation, OperationType } from './safety.js';
12
+ import { parseXml } from './xml-parser.js';
13
+ const invalid = () => new AdtError('Invalid native package-tree response; no listing was returned.');
14
+ const ambiguous = () => new AdtError('SAP returned no package-tree evidence. The package may be empty, missing or inaccessible. ' +
15
+ 'Verify the exact package name in SAP ADT; this response cannot establish an empty package.');
16
+ function record(value) {
17
+ if (!value || typeof value !== 'object' || Array.isArray(value))
18
+ throw invalid();
19
+ return value;
20
+ }
21
+ function rows(value, key) {
22
+ if (value === '')
23
+ return [];
24
+ const container = record(value);
25
+ if (!Object.hasOwn(container, key))
26
+ throw invalid();
27
+ return (Array.isArray(container[key]) ? container[key] : [container[key]]).map(record);
28
+ }
29
+ function scalar(value, allowEmpty = false) {
30
+ if (typeof value !== 'string' || (!allowEmpty && !value.trim()))
31
+ throw invalid();
32
+ return value;
33
+ }
34
+ function parseTree(xml, root) {
35
+ if (!xml.trim())
36
+ throw root ? ambiguous() : invalid();
37
+ if (XMLValidator.validate(xml) !== true || /<!DOCTYPE/i.test(xml))
38
+ throw invalid();
39
+ const values = record(record(parseXml(xml).abap).values).DATA;
40
+ if (!Array.isArray(values) || values.length !== 1)
41
+ throw invalid();
42
+ const data = record(values[0]);
43
+ const objects = rows(data.TREE_CONTENT, 'SEU_ADT_REPOSITORY_OBJ_NODE').map((node) => {
44
+ const type = scalar(node.OBJECT_TYPE);
45
+ const name = scalar(node.OBJECT_NAME);
46
+ const uri = scalar(node.OBJECT_URI, true);
47
+ if (!DIRECT_PACKAGE_TYPE.test(type) || (!root && type === 'DEVC/K'))
48
+ throw invalid();
49
+ if (uri && !canonicalHostRelativeAdtPath(uri, '/sap/bc/adt/', { allowRawEncodedSlash: true }))
50
+ throw invalid();
51
+ return { type, name, uri };
52
+ });
53
+ // Expansion OBJECT_TYPES contains object IDs too; only root IDs may drive a request.
54
+ const folders = root
55
+ ? rows(data.OBJECT_TYPES, 'SEU_ADT_OBJECT_TYPE_INFO').map((node) => {
56
+ const type = scalar(node.OBJECT_TYPE);
57
+ const id = scalar(node.NODE_ID);
58
+ if (!DIRECT_PACKAGE_TYPE.test(type) || !/^\d{6}$/.test(id) || id === '000000')
59
+ throw invalid();
60
+ return { type, id };
61
+ })
62
+ : [];
63
+ if (root && !objects.length && !folders.length)
64
+ throw ambiguous();
65
+ return { objects, folders };
66
+ }
67
+ export async function getDirectPackageContents(http, safety, packageName, maxResults, objectType) {
68
+ checkOperation(safety, OperationType.Read, 'GetPackage');
69
+ if (!DIRECT_PACKAGE_NAME.test(packageName))
70
+ throw new AdtError('Direct package browsing requires an exact package name (1–30 characters).');
71
+ if (objectType !== undefined && !DIRECT_PACKAGE_TYPE.test(objectType))
72
+ throw new AdtError('Use an exact advertised package folder type, for example CLAS/OC.');
73
+ const request = {
74
+ deadline: Date.now() + 10_000,
75
+ signal: getCurrentContext()?.signal,
76
+ responseBudget: new DataResponseBudget(2 * 1024 * 1024, 'package-browser'),
77
+ attemptBudget: new RequestAttemptBudget(8),
78
+ retryTransientErrors: false,
79
+ };
80
+ const encoded = encodeURIComponent(packageName.toUpperCase());
81
+ const path = '/sap/bc/adt/repository/nodestructure' +
82
+ `?parent_type=DEVC%2FK&parent_name=${encoded}&parent_tech_name=${encoded}&withShortDescriptions=false`;
83
+ const read = async (ids, root) => {
84
+ throwIfRequestCancelled(request);
85
+ const body = '<?xml version="1.0" encoding="UTF-8"?>' +
86
+ '<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"><asx:values><DATA>' +
87
+ ids.map((id) => `<TV_NODEKEY>${id}</TV_NODEKEY>`).join('') +
88
+ '</DATA></asx:values></asx:abap>';
89
+ const response = await http.post(path, body, 'application/vnd.sap.as+xml; charset=UTF-8; dataname=null', { Accept: 'application/vnd.sap.as+xml' }, request);
90
+ throwIfRequestCancelled(request);
91
+ return parseTree(response.body, root);
92
+ };
93
+ const root = await read(['000000'], true);
94
+ if (objectType && !root.folders.some((folder) => folder.type === objectType)) {
95
+ throw new AdtError(`Package folder ${objectType} is not advertised. Available types: ${[...new Set(root.folders.map((folder) => folder.type))].join(', ') || 'none'}.`);
96
+ }
97
+ const ids = [];
98
+ for (const folder of root.folders) {
99
+ if (folder.type === 'DEVC/K' || (objectType && folder.type !== objectType))
100
+ continue;
101
+ if (!ids.includes(folder.id) && ids.length < 16)
102
+ ids.push(folder.id);
103
+ }
104
+ const unexpandedTypes = [
105
+ ...new Set(root.folders
106
+ .filter((folder) => folder.type !== 'DEVC/K' && !ids.includes(folder.id))
107
+ .map((folder) => folder.type)),
108
+ ];
109
+ const expanded = ids.length ? (await read(ids, false)).objects : [];
110
+ if (!ids.length && !root.objects.length)
111
+ throw ambiguous();
112
+ if (ids.length && !expanded.length)
113
+ throw invalid();
114
+ const unique = new Map();
115
+ for (const object of [...(!objectType || objectType === 'DEVC/K' ? root.objects : []), ...expanded]) {
116
+ unique.set(JSON.stringify([object.type, object.name, object.uri]), object);
117
+ }
118
+ const effectiveLimit = clampUrlLimit(maxResults, 200);
119
+ const objects = [...unique.values()].slice(0, effectiveLimit);
120
+ throwIfRequestCancelled(request);
121
+ const limitReached = objects.length >= effectiveLimit;
122
+ return {
123
+ objects,
124
+ listing: {
125
+ scope: 'direct',
126
+ coverage: 'adt-nodestructure',
127
+ completeness: 'unknown',
128
+ total: null,
129
+ returned: objects.length,
130
+ effectiveLimit,
131
+ limitReached,
132
+ possiblyTruncated: limitReached || unexpandedTypes.length > 0,
133
+ unexpandedTypes,
134
+ note: 'Direct package contents only; subpackages are not visited. Descriptions are omitted. ' +
135
+ 'This is not a complete inventory or snapshot. Narrow with an advertised objectType; maxResults only caps returned entries.',
136
+ },
137
+ };
138
+ }
139
+ //# sourceMappingURL=package-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-browser.js","sourceRoot":"","sources":["../../src/adt/package-browser.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import type { AdtHttpClient } from './http.js';
2
+ export declare const DIRECT_PACKAGE_NAME: RegExp;
3
+ export declare const DIRECT_PACKAGE_TYPE: RegExp;
2
4
  /** Require SAP's advertised filter for getPackageContents' request (no objectType/useSearchProvider).
3
5
  * Slash-typed objectType or useSearchProvider overrides can select classic search, which ignores packageName. */
4
6
  export declare function supportsPackageFilteredSearch(xml: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"package-contents.d.ts","sourceRoot":"","sources":["../../src/adt/package-contents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C;kHACkH;AAClH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAelE;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;;;;;kBAQpE,SAAS;;cAEb,YAAY;;EAMzB"}
1
+ {"version":3,"file":"package-contents.d.ts","sourceRoot":"","sources":["../../src/adt/package-contents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAI/C,eAAO,MAAM,mBAAmB,QAAkD,CAAC;AACnF,eAAO,MAAM,mBAAmB,QAA0C,CAAC;AAE3E;kHACkH;AAClH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAelE;AAED,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrF;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS;;;;;kBAQpE,SAAS;;cAEb,YAAY;;EAMzB"}
@@ -1,6 +1,8 @@
1
1
  import { AdtError } from './errors.js';
2
2
  import { clampUrlLimit } from './result-limits.js';
3
3
  import { findDeepNodes, parseXml } from './xml-parser.js';
4
+ export const DIRECT_PACKAGE_NAME = /^(?=.{1,30}$)(?:\/[A-Z0-9_]+\/)?[A-Z0-9_$]+$/i;
5
+ export const DIRECT_PACKAGE_TYPE = /^[A-Z0-9_]{1,8}(?:\/[A-Z0-9_]{1,8})?$/;
4
6
  /** Require SAP's advertised filter for getPackageContents' request (no objectType/useSearchProvider).
5
7
  * Slash-typed objectType or useSearchProvider overrides can select classic search, which ignores packageName. */
6
8
  export function supportsPackageFilteredSearch(xml) {
@@ -27,7 +29,7 @@ export async function requirePackageFilteredSearch(http) {
27
29
  const discovery = await http.get('/sap/bc/adt/discovery', { Accept: 'application/atomsvc+xml' });
28
30
  if (!supportsPackageFilteredSearch(discovery.body)) {
29
31
  throw new AdtError('Package contents are unavailable: this SAP system does not advertise package-filtered ADT search. ' +
30
- 'Use name/type searches or the native package browser; an unfiltered search could return unrelated objects.');
32
+ 'Use SAPRead type=DEVC with packageScope="direct" for bounded native browsing; an unfiltered search could return unrelated objects.');
31
33
  }
32
34
  }
33
35
  /** ADT quick search provides neither a total nor proof of full package coverage. */
@@ -1 +1 @@
1
- {"version":3,"file":"package-contents.js","sourceRoot":"","sources":["../../src/adt/package-contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE1D;kHACkH;AAClH,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACvD,MAAM,UAAU,GAAG,iDAAiD,CAAC;IACrE,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU;gBAAE,SAAS;YAC9F,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,uEAAuE;oBAAE,SAAS;gBACxG,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,qBAAqB,CAAC,CAAC,QAAQ,KAAK,UAAU;oBAAE,SAAS;gBAC9F,IAAI,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO,IAAI,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAAmB;IACpE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACjG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAChB,oGAAoG;YAClG,4GAA4G,CAC/G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,SAA6B;IACpF,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,QAAQ,IAAI,cAAc,CAAC;IAChD,OAAO;QACL,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,iBAAiB,EAAE,YAAY;QAC/B,YAAY,EAAE,SAAkB;QAChC,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,YAAqB;QAC/B,IAAI,EACF,CAAC,YAAY;YACX,CAAC,CAAC,mDAAmD,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,kCAAkC,EAAE;YACrL,CAAC,CAAC,EAAE,CAAC,GAAG,0FAA0F;KACvG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"package-contents.js","sourceRoot":"","sources":["../../src/adt/package-contents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,uCAAuC,CAAC;AAE3E;kHACkH;AAClH,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACvD,MAAM,UAAU,GAAG,iDAAiD,CAAC;IACrE,KAAK,MAAM,SAAS,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC;QAClE,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAChD,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,UAAU;gBAAE,SAAS;YAC9F,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,uEAAuE;oBAAE,SAAS;gBACxG,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,EAAE,qBAAqB,CAAC,CAAC,QAAQ,KAAK,UAAU;oBAAE,SAAS;gBAC9F,IAAI,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,OAAO,IAAI,CAAC;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAAmB;IACpE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC;IACjG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAChB,oGAAoG;YAClG,oIAAoI,CACvI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,SAA6B;IACpF,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,QAAQ,IAAI,cAAc,CAAC;IAChD,OAAO;QACL,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,iBAAiB,EAAE,YAAY;QAC/B,YAAY,EAAE,SAAkB;QAChC,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,YAAqB;QAC/B,IAAI,EACF,CAAC,YAAY;YACX,CAAC,CAAC,mDAAmD,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,iEAAiE,CAAC,CAAC,CAAC,kCAAkC,EAAE;YACrL,CAAC,CAAC,EAAE,CAAC,GAAG,0FAA0F;KACvG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /** Fail-closed local/CTS recording policy for the reviewed pinned PP write surface. */
2
+ import type { LockResult } from './crud.js';
3
+ import type { AdtHttpClient, AdtRequestOptions } from './http.js';
4
+ import { type SafetyConfig } from './safety.js';
5
+ export declare function assertPinnedOwner(type: unknown, name: unknown): asserts type is 'CLAS' | 'INTF';
6
+ export declare function checkPinnedRequest(safety: SafetyConfig, request: string): void;
7
+ /** Caller-selected tasks must be modifiable; lock evidence only proves parent membership. */
8
+ export declare function resolvePinnedRequest(http: AdtHttpClient, safety: SafetyConfig, id: string, options?: AdtRequestOptions): Promise<string>;
9
+ export interface PinnedRecording {
10
+ local: boolean;
11
+ request?: string;
12
+ }
13
+ export declare function pinnedRecording(http: AdtHttpClient, safety: SafetyConfig, owner: string, pkg: string, operation: 'I' | '', requested?: string, options?: AdtRequestOptions): Promise<PinnedRecording>;
14
+ export declare function validatePinnedLock(http: AdtHttpClient, safety: SafetyConfig, lock: LockResult, recording: PinnedRecording, options?: AdtRequestOptions): Promise<void>;
15
+ //# sourceMappingURL=pinned-write-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinned-write-policy.d.ts","sourceRoot":"","sources":["../../src/adt/pinned-write-policy.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAKxE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,GAAG,MAAM,CAS/F;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAS9E;AAED,6FAA6F;AAC7F,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAEjB;AA2DD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,GAAG,GAAG,EAAE,EACnB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAgC1B;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,111 @@
1
+ /** Fail-closed local/CTS recording policy for the reviewed pinned PP write surface. */
2
+ import { AdtSafetyError } from './errors.js';
3
+ import { isTransportInWhitelist } from './safety.js';
4
+ import { CTS_CONTENT_TYPE_ORGANIZER, getTransportInfo, parseTransportList } from './transport.js';
5
+ import { parseXml } from './xml-parser.js';
6
+ export function assertPinnedOwner(type, name) {
7
+ if ((type !== 'CLAS' && type !== 'INTF') ||
8
+ typeof name !== 'string' ||
9
+ !/^(?:\/[A-Z0-9_]+\/)?[A-Z][A-Z0-9_]{0,29}$/.test(name) ||
10
+ name.length > 30) {
11
+ throw new AdtSafetyError('Pinned writes require one uppercase CLAS or INTF owner (maximum 30 characters).');
12
+ }
13
+ }
14
+ export function checkPinnedRequest(safety, request) {
15
+ if (!safety.multiTargetWrite?.enabled ||
16
+ !safety.multiTargetWrite.allowedTransports.length ||
17
+ !isTransportInWhitelist({ allowedTransports: [...safety.multiTargetWrite.allowedTransports] }, request) ||
18
+ !isTransportInWhitelist({ allowedTransports: [...safety.multiTargetWrite.serverAllowedTransports] }, request)) {
19
+ throw new AdtSafetyError('CTS request is not allowed by both server and destination transport policies.');
20
+ }
21
+ }
22
+ /** Caller-selected tasks must be modifiable; lock evidence only proves parent membership. */
23
+ export async function resolvePinnedRequest(http, safety, id, options) {
24
+ return (await inspectPinnedRequest(http, safety, id, options, true)).id;
25
+ }
26
+ async function inspectPinnedRequest(http, safety, id, options, requireModifiableTask) {
27
+ if (!/^[A-Z0-9]{1,20}$/.test(id))
28
+ throw new AdtSafetyError('Invalid CTS request/task ID.');
29
+ const path = `/sap/bc/adt/cts/transportrequests/${id}`;
30
+ const response = await http.get(path, { Accept: CTS_CONTENT_TYPE_ORGANIZER }, options);
31
+ if (response.body.length > 1024 * 1024)
32
+ throw new AdtSafetyError('CTS request evidence exceeds the bounded qualification size.');
33
+ let matches = parseTransportList(response.body, path).filter((request) => request.id === id || request.tasks.some((task) => task.id === id));
34
+ if (matches.length === 0) {
35
+ // A task detail document places its parent request and task as siblings. Use only
36
+ // the exact task's parent attribute, then independently verify the parent's tree.
37
+ const root = parseXml(response.body).root;
38
+ const tasks = root?.task;
39
+ const selected = (Array.isArray(tasks) ? tasks : tasks ? [tasks] : []).filter((task) => task && typeof task === 'object' && task['@_number'] === id);
40
+ const parent = selected.length === 1 ? selected[0]['@_parent'] : undefined;
41
+ if (typeof parent !== 'string' ||
42
+ !/^[A-Z0-9]{1,20}$/.test(parent) ||
43
+ parent === id ||
44
+ (requireModifiableTask && selected[0]['@_status'] !== 'D'))
45
+ throw new AdtSafetyError('CTS task parent could not be established.');
46
+ const parentPath = `/sap/bc/adt/cts/transportrequests/${parent}`;
47
+ const parentResponse = await http.get(parentPath, { Accept: CTS_CONTENT_TYPE_ORGANIZER }, options);
48
+ if (parentResponse.body.length > 1024 * 1024)
49
+ throw new AdtSafetyError('CTS request evidence exceeds the bounded qualification size.');
50
+ matches = parseTransportList(parentResponse.body, parentPath).filter((request) => request.id === parent && request.tasks.some((task) => task.id === id));
51
+ }
52
+ if (matches.length !== 1)
53
+ throw new AdtSafetyError('CTS request/task membership could not be established.');
54
+ const request = matches[0];
55
+ if (!/^[A-Z0-9]{1,20}$/.test(request.id) ||
56
+ request.type !== 'K' ||
57
+ request.status !== 'D' ||
58
+ request.tasks.length > 256)
59
+ throw new AdtSafetyError('A modifiable Workbench request is required.');
60
+ if (request.id !== id &&
61
+ request.tasks.filter((task) => task.id === id && (!requireModifiableTask || task.status === 'D')).length !== 1)
62
+ throw new AdtSafetyError('The selected task must be modifiable.');
63
+ checkPinnedRequest(safety, request.id);
64
+ return request;
65
+ }
66
+ export async function pinnedRecording(http, safety, owner, pkg, operation, requested, options) {
67
+ const info = await getTransportInfo(http, safety, owner, pkg, operation, options);
68
+ if (info.lockedTransportAmbiguous || (info.lockedTasks.length && !info.lockedTransport))
69
+ throw new AdtSafetyError('Ambiguous CTS lock holders.');
70
+ if (info.result !== 'S' || info.devclass !== pkg || info.operation !== operation)
71
+ throw new AdtSafetyError('SAP did not affirm the requested package/recording context.');
72
+ if (info.isLocal &&
73
+ info.deliveryUnit === 'LOCAL' &&
74
+ !info.recording &&
75
+ !info.lockedTransport &&
76
+ info.lockedTasks.length === 0) {
77
+ if (requested)
78
+ throw new AdtSafetyError('A local object must not specify a CTS request/task.');
79
+ return { local: true };
80
+ }
81
+ if (info.isLocal || !info.deliveryUnit || info.deliveryUnit === 'LOCAL')
82
+ throw new AdtSafetyError('Ambiguous local/CTS recording evidence.');
83
+ const selected = requested ?? info.lockedTransport;
84
+ if (!selected)
85
+ throw new AdtSafetyError('This package requires an explicit allowed CTS request. Create/manage requests outside this multi-target write connection.');
86
+ const request = await inspectPinnedRequest(http, safety, selected, options, true);
87
+ if (info.lockedTransport && info.lockedTransport !== request.id)
88
+ throw new AdtSafetyError('The object is recorded in a different CTS request.');
89
+ // Reuse the authoritative parent tree. A released task is valid historical lock evidence,
90
+ // but it is never accepted as the caller-selected task for a new save.
91
+ for (const task of info.lockedTasks)
92
+ if (request.tasks.filter((entry) => entry.id === task).length !== 1)
93
+ throw new AdtSafetyError('A locked task does not belong unambiguously to the selected CTS request.');
94
+ return { local: false, request: request.id };
95
+ }
96
+ export async function validatePinnedLock(http, safety, lock, recording, options) {
97
+ if (!lock.lockHandle || lock.localityKnown !== true || lock.isLocal !== recording.local)
98
+ throw new AdtSafetyError('SAP lock does not affirm the preflight recording context.');
99
+ if (recording.local) {
100
+ if (lock.corrNr)
101
+ throw new AdtSafetyError('Local lock unexpectedly carries a CTS request.');
102
+ }
103
+ else {
104
+ if (!recording.request)
105
+ throw new AdtSafetyError('Missing CTS request.');
106
+ checkPinnedRequest(safety, recording.request);
107
+ if (lock.corrNr && (await inspectPinnedRequest(http, safety, lock.corrNr, options, false)).id !== recording.request)
108
+ throw new AdtSafetyError('Lock and requested CTS recording disagree.');
109
+ }
110
+ }
111
+ //# sourceMappingURL=pinned-write-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinned-write-policy.js","sourceRoot":"","sources":["../../src/adt/pinned-write-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RevisionListResult } from './types.js';
2
+ /** Fixed local explanation, safe to expose even when SAP diagnostics are hidden. */
3
+ export declare class RevisionHistoryError extends Error {
4
+ constructor();
5
+ }
6
+ /** Parse source revision history feed from /source/main/versions */
7
+ export declare function parseRevisionFeed(xml: string): RevisionListResult;
8
+ //# sourceMappingURL=revision-feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-feed.d.ts","sourceRoot":"","sources":["../../src/adt/revision-feed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAWnE,oFAAoF;AACpF,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,cAEC;CACF;AA8CD,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CA4CjE"}
@@ -0,0 +1,108 @@
1
+ import { XMLValidator } from 'fast-xml-parser';
2
+ import { parseXml, toRecordArray } from './xml-parser.js';
3
+ const TRANSPORT_RELS = new Set([
4
+ 'http://www.sap.com/adt/relations/transport/request', // live shape (a4h 758)
5
+ 'http://www.sap.com/adt/relations/transports', // legacy — kept for older releases
6
+ ]);
7
+ /** CTS request/task id: 3-char system + K/T/… + 6 alphanumerics, e.g. A4HK906291. */
8
+ const CTS_ID_RE = /^[A-Z0-9]{3}[A-Z][A-Z0-9]{6}$/;
9
+ /** Fixed local explanation, safe to expose even when SAP diagnostics are hidden. */
10
+ export class RevisionHistoryError extends Error {
11
+ constructor() {
12
+ super('Invalid or unexpected revision history response; this is not an empty history.');
13
+ }
14
+ }
15
+ /** Decode a URI component, returning the raw value rather than throwing on a malformed `%` escape. */
16
+ function safeDecode(value) {
17
+ try {
18
+ return decodeURIComponent(value);
19
+ }
20
+ catch {
21
+ return value;
22
+ }
23
+ }
24
+ /**
25
+ * CTS request id of a revision, from its transport link.
26
+ *
27
+ * `adtcore:name` carries the id; `@_title` is the transport DESCRIPTION (only used as a last
28
+ * resort, for releases that put the id there). The href tail is accepted ONLY when it looks
29
+ * like a CTS id — ADT also emits hrefs ending in `reference?obj_name=…`, and returning
30
+ * `"reference"` for every revision would silently break attribution everywhere.
31
+ * Evidence: docs/plans/2026-08-03-transport-diff.md §1.
32
+ */
33
+ function revisionTransportId(links) {
34
+ for (const link of links) {
35
+ if (!TRANSPORT_RELS.has(String(link['@_rel'] ?? '')))
36
+ continue;
37
+ const name = String(link['@_name'] ?? '').trim();
38
+ if (name)
39
+ return name;
40
+ const tail = safeDecode(String(link['@_href'] ?? '')
41
+ .split('/')
42
+ .pop()
43
+ ?.split('?')[0] ?? '')
44
+ .trim()
45
+ .toUpperCase();
46
+ if (CTS_ID_RE.test(tail))
47
+ return tail;
48
+ // `@_title`/`@_version` are last resorts for older releases that put the id there; both
49
+ // go through the shape guard, so a description can never be mistaken for a transport.
50
+ for (const attr of ['@_title', '@_version']) {
51
+ const value = String(link[attr] ?? '')
52
+ .trim()
53
+ .toUpperCase();
54
+ if (CTS_ID_RE.test(value))
55
+ return value;
56
+ }
57
+ }
58
+ return '';
59
+ }
60
+ /** Parse source revision history feed from /source/main/versions */
61
+ export function parseRevisionFeed(xml) {
62
+ if (!xml.trim())
63
+ throw new RevisionHistoryError();
64
+ try {
65
+ if (XMLValidator.validate(xml) !== true)
66
+ throw new Error('Invalid revision history XML.');
67
+ const parsed = parseXml(xml);
68
+ if (!Object.hasOwn(parsed, 'feed'))
69
+ throw new Error('Expected a revision Atom feed.');
70
+ if (parsed.feed !== '' && (!parsed.feed || typeof parsed.feed !== 'object' || Array.isArray(parsed.feed)))
71
+ throw new Error('Unexpected revision feed content.');
72
+ const feed = (parsed.feed ?? {});
73
+ const title = String(feed.title ?? '');
74
+ const match = title.match(/^Version List of (\S+) \(([A-Z]+)\)/);
75
+ const object = {
76
+ name: String(match?.[1] ?? ''),
77
+ type: String(match?.[2] ?? ''),
78
+ };
79
+ const revisions = [];
80
+ const rawEntries = feed.entry === undefined ? [] : Array.isArray(feed.entry) ? feed.entry : [feed.entry];
81
+ if (rawEntries.some((entry) => !entry || typeof entry !== 'object' || Array.isArray(entry)))
82
+ throw new Error('Unexpected revision entry.');
83
+ const entries = toRecordArray(feed.entry);
84
+ for (const entry of entries) {
85
+ const authorNode = toRecordArray(entry.author)[0] ?? {};
86
+ const contentNode = toRecordArray(entry.content)[0] ?? {};
87
+ if (!contentNode['@_src'])
88
+ throw new Error('Revision entry is missing its content reference.');
89
+ const links = toRecordArray(entry.link);
90
+ const transport = revisionTransportId(links);
91
+ const versionTitle = String(entry.title ?? '');
92
+ revisions.push({
93
+ id: String(entry.id ?? ''),
94
+ author: String(authorNode.name ?? ''),
95
+ timestamp: String(entry.updated ?? ''),
96
+ ...(versionTitle ? { versionTitle } : {}),
97
+ ...(transport ? { transport } : {}),
98
+ uri: String(contentNode['@_src'] ?? ''),
99
+ });
100
+ }
101
+ const next = toRecordArray(feed.link).find((link) => link['@_rel'] === 'next');
102
+ return { object, revisions, ...(next ? { historyComplete: false } : {}) };
103
+ }
104
+ catch {
105
+ throw new RevisionHistoryError();
106
+ }
107
+ }
108
+ //# sourceMappingURL=revision-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-feed.js","sourceRoot":"","sources":["../../src/adt/revision-feed.ts"],"names":[],"mappings":"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"}
@@ -42,7 +42,16 @@ export declare const OperationType: {
42
42
  readonly Transport: 'X';
43
43
  };
44
44
  export type OperationTypeCode = (typeof OperationType)[keyof typeof OperationType];
45
+ export interface MultiTargetWritePolicy {
46
+ readonly target: string;
47
+ readonly enabled: boolean;
48
+ readonly allowedPackages: readonly string[];
49
+ readonly allowedTransports: readonly string[];
50
+ readonly serverAllowedTransports: readonly string[];
51
+ }
45
52
  export interface SafetyConfig {
53
+ /** Present on every multi-target runtime, including read-only routes. */
54
+ multiTargetWrite?: MultiTargetWritePolicy;
46
55
  allowWrites: boolean;
47
56
  allowDataPreview: boolean;
48
57
  allowFreeSQL: boolean;
@@ -104,6 +113,8 @@ export declare function isPackageAllowed(config: SafetyConfig, pkg: string): boo
104
113
  * Reads are never package-gated; this function is only called on write paths.
105
114
  */
106
115
  export declare function checkPackage(config: SafetyConfig, pkg: string, resolver?: PackageHierarchyResolver | null): Promise<void>;
116
+ /** Check if a transport is in the whitelist. */
117
+ export declare function isTransportInWhitelist(config: Pick<SafetyConfig, 'allowedTransports'>, transport: string): boolean;
107
118
  /**
108
119
  * Check transport operation. Writes require `allowWrites && allowTransportWrites`.
109
120
  * Reads are always allowed at this layer (scope check enforces user gating upstream).
@@ -1 +1 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/adt/safety.ts"],"names":[],"mappings":"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"}
@@ -85,7 +85,7 @@ export function unrestrictedSafetyConfig() {
85
85
  /** Check if an operation type is allowed by the safety config. */
86
86
  export function isOperationAllowed(config, op) {
87
87
  // Mutating ops (Create/Update/Delete/Activate/Workflow/Transport) require allowWrites
88
- if (MUTATING_OPS.includes(op) && !config.allowWrites)
88
+ if (MUTATING_OPS.includes(op) && (!config.allowWrites || config.multiTargetWrite?.enabled === false))
89
89
  return false;
90
90
  // Transport mutation has an additional gate
91
91
  if (op === OperationType.Transport && !config.allowTransportWrites)
@@ -126,6 +126,13 @@ function explainOperationBlock(config, op) {
126
126
  * is reported as 'needs-hierarchy'.
127
127
  */
128
128
  export function decidePackageAllowed(config, pkg) {
129
+ if (config.multiTargetWrite) {
130
+ const global = decidePackageAllowed({ ...config, multiTargetWrite: undefined }, pkg);
131
+ const destination = decidePackageAllowed({ ...config, multiTargetWrite: undefined, allowedPackages: [...config.multiTargetWrite.allowedPackages] }, pkg);
132
+ if (!config.multiTargetWrite.allowedPackages.length || global === 'denied' || destination === 'denied')
133
+ return 'denied';
134
+ return global === 'needs-hierarchy' || destination === 'needs-hierarchy' ? 'needs-hierarchy' : 'allowed';
135
+ }
129
136
  if (listDeniesAll(config.allowedPackages))
130
137
  return 'denied';
131
138
  if (config.allowedPackages.length === 0)
@@ -190,6 +197,13 @@ function extractSubtreeRoots(config) {
190
197
  * Reads are never package-gated; this function is only called on write paths.
191
198
  */
192
199
  export async function checkPackage(config, pkg, resolver) {
200
+ if (config.multiTargetWrite) {
201
+ if (!config.multiTargetWrite.allowedPackages.length)
202
+ throw new AdtSafetyError('Destination package restriction is missing.');
203
+ await checkPackage({ ...config, multiTargetWrite: undefined }, pkg, resolver);
204
+ await checkPackage({ ...config, multiTargetWrite: undefined, allowedPackages: [...config.multiTargetWrite.allowedPackages] }, pkg, resolver);
205
+ return;
206
+ }
193
207
  const decision = decidePackageAllowed(config, pkg);
194
208
  if (decision === 'allowed')
195
209
  return;
@@ -228,7 +242,7 @@ export async function checkPackage(config, pkg, resolver) {
228
242
  throw new AdtSafetyError(`Operations on package '${pkg}' are blocked by safety configuration (allowed: ${displayAllowList(config.allowedPackages)})`);
229
243
  }
230
244
  /** Check if a transport is in the whitelist. */
231
- function isTransportInWhitelist(config, transport) {
245
+ export function isTransportInWhitelist(config, transport) {
232
246
  if (listDeniesAll(config.allowedTransports))
233
247
  return false;
234
248
  if (config.allowedTransports.length === 0)
@@ -305,6 +319,7 @@ export function deriveUserSafety(serverConfig, scopes) {
305
319
  if (expanded.has('sql'))
306
320
  expanded.add('data');
307
321
  const effective = {
322
+ multiTargetWrite: serverConfig.multiTargetWrite,
308
323
  ...serverConfig,
309
324
  allowedPackages: [...serverConfig.allowedPackages],
310
325
  allowedTransports: [...serverConfig.allowedTransports],
@@ -406,6 +421,7 @@ export function deriveUserSafetyFromProfile(serverConfig, profileSafety) {
406
421
  return narrowed.length > 0 ? narrowed : [DENY_ALL_LIST_ENTRY];
407
422
  };
408
423
  const effective = {
424
+ multiTargetWrite: serverConfig.multiTargetWrite,
409
425
  allowWrites: and(serverConfig.allowWrites, profileSafety.allowWrites),
410
426
  allowDataPreview: and(serverConfig.allowDataPreview, profileSafety.allowDataPreview),
411
427
  allowFreeSQL: and(serverConfig.allowFreeSQL, profileSafety.allowFreeSQL),