arc-1 1.3.0 → 1.5.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 (279) hide show
  1. package/README.md +1 -1
  2. package/dist/adt/abapgit.d.ts.map +1 -1
  3. package/dist/adt/abapgit.js +64 -7
  4. package/dist/adt/abapgit.js.map +1 -1
  5. package/dist/adt/aunit.js +4 -4
  6. package/dist/adt/aunit.js.map +1 -1
  7. package/dist/adt/class-structure.d.ts +4 -2
  8. package/dist/adt/class-structure.d.ts.map +1 -1
  9. package/dist/adt/class-structure.js +18 -9
  10. package/dist/adt/class-structure.js.map +1 -1
  11. package/dist/adt/client.d.ts +18 -52
  12. package/dist/adt/client.d.ts.map +1 -1
  13. package/dist/adt/client.js +69 -92
  14. package/dist/adt/client.js.map +1 -1
  15. package/dist/adt/config.d.ts +5 -0
  16. package/dist/adt/config.d.ts.map +1 -1
  17. package/dist/adt/config.js.map +1 -1
  18. package/dist/adt/create-request.d.ts +4 -0
  19. package/dist/adt/create-request.d.ts.map +1 -0
  20. package/dist/adt/create-request.js +16 -0
  21. package/dist/adt/create-request.js.map +1 -0
  22. package/dist/adt/crud.d.ts +3 -3
  23. package/dist/adt/crud.d.ts.map +1 -1
  24. package/dist/adt/crud.js +28 -9
  25. package/dist/adt/crud.js.map +1 -1
  26. package/dist/adt/data-source-policy.d.ts +20 -8
  27. package/dist/adt/data-source-policy.d.ts.map +1 -1
  28. package/dist/adt/data-source-policy.js +55 -109
  29. package/dist/adt/data-source-policy.js.map +1 -1
  30. package/dist/adt/ddic-xml.d.ts +9 -0
  31. package/dist/adt/ddic-xml.d.ts.map +1 -1
  32. package/dist/adt/ddic-xml.js +17 -3
  33. package/dist/adt/ddic-xml.js.map +1 -1
  34. package/dist/adt/devtools.d.ts.map +1 -1
  35. package/dist/adt/devtools.js +10 -7
  36. package/dist/adt/devtools.js.map +1 -1
  37. package/dist/adt/diagnostics.d.ts +11 -9
  38. package/dist/adt/diagnostics.d.ts.map +1 -1
  39. package/dist/adt/diagnostics.js +88 -14
  40. package/dist/adt/diagnostics.js.map +1 -1
  41. package/dist/adt/enhancements.d.ts +7 -0
  42. package/dist/adt/enhancements.d.ts.map +1 -0
  43. package/dist/adt/enhancements.js +89 -0
  44. package/dist/adt/enhancements.js.map +1 -0
  45. package/dist/adt/errors.d.ts +21 -10
  46. package/dist/adt/errors.d.ts.map +1 -1
  47. package/dist/adt/errors.js +76 -54
  48. package/dist/adt/errors.js.map +1 -1
  49. package/dist/adt/features.d.ts.map +1 -1
  50. package/dist/adt/features.js +2 -0
  51. package/dist/adt/features.js.map +1 -1
  52. package/dist/adt/flp.d.ts.map +1 -1
  53. package/dist/adt/flp.js +5 -4
  54. package/dist/adt/flp.js.map +1 -1
  55. package/dist/adt/fm-signature.d.ts +1 -1
  56. package/dist/adt/fm-signature.d.ts.map +1 -1
  57. package/dist/adt/fm-signature.js +9 -1
  58. package/dist/adt/fm-signature.js.map +1 -1
  59. package/dist/adt/http-deadline.d.ts +2 -0
  60. package/dist/adt/http-deadline.d.ts.map +1 -1
  61. package/dist/adt/http-deadline.js.map +1 -1
  62. package/dist/adt/http.d.ts +12 -29
  63. package/dist/adt/http.d.ts.map +1 -1
  64. package/dist/adt/http.js +102 -95
  65. package/dist/adt/http.js.map +1 -1
  66. package/dist/adt/internal-data-operations.d.ts +3 -2
  67. package/dist/adt/internal-data-operations.d.ts.map +1 -1
  68. package/dist/adt/internal-data-operations.js +8 -1
  69. package/dist/adt/internal-data-operations.js.map +1 -1
  70. package/dist/adt/lock-object.d.ts +92 -0
  71. package/dist/adt/lock-object.d.ts.map +1 -0
  72. package/dist/adt/lock-object.js +195 -0
  73. package/dist/adt/lock-object.js.map +1 -0
  74. package/dist/adt/publish-state.d.ts +4 -0
  75. package/dist/adt/publish-state.d.ts.map +1 -0
  76. package/dist/adt/publish-state.js +61 -0
  77. package/dist/adt/publish-state.js.map +1 -0
  78. package/dist/adt/rap-generate.d.ts +5 -1
  79. package/dist/adt/rap-generate.d.ts.map +1 -1
  80. package/dist/adt/rap-generate.js +112 -100
  81. package/dist/adt/rap-generate.js.map +1 -1
  82. package/dist/adt/server-driven.d.ts +56 -13
  83. package/dist/adt/server-driven.d.ts.map +1 -1
  84. package/dist/adt/server-driven.js +114 -23
  85. package/dist/adt/server-driven.js.map +1 -1
  86. package/dist/adt/source-precondition.d.ts +3 -0
  87. package/dist/adt/source-precondition.d.ts.map +1 -0
  88. package/dist/adt/source-precondition.js +12 -0
  89. package/dist/adt/source-precondition.js.map +1 -0
  90. package/dist/adt/text-search.js +5 -5
  91. package/dist/adt/text-search.js.map +1 -1
  92. package/dist/adt/transport.d.ts +1 -2
  93. package/dist/adt/transport.d.ts.map +1 -1
  94. package/dist/adt/transport.js +20 -15
  95. package/dist/adt/transport.js.map +1 -1
  96. package/dist/adt/types.d.ts +21 -1
  97. package/dist/adt/types.d.ts.map +1 -1
  98. package/dist/adt/user-agent.d.ts +4 -0
  99. package/dist/adt/user-agent.d.ts.map +1 -0
  100. package/dist/adt/user-agent.js +11 -0
  101. package/dist/adt/user-agent.js.map +1 -0
  102. package/dist/adt/xml-entities.d.ts +3 -0
  103. package/dist/adt/xml-entities.d.ts.map +1 -0
  104. package/dist/adt/xml-entities.js +19 -0
  105. package/dist/adt/xml-entities.js.map +1 -0
  106. package/dist/adt/xml-parser.d.ts +7 -30
  107. package/dist/adt/xml-parser.d.ts.map +1 -1
  108. package/dist/adt/xml-parser.js +25 -54
  109. package/dist/adt/xml-parser.js.map +1 -1
  110. package/dist/authz/policy.d.ts.map +1 -1
  111. package/dist/authz/policy.js +2 -0
  112. package/dist/authz/policy.js.map +1 -1
  113. package/dist/cache/caching-layer.d.ts.map +1 -1
  114. package/dist/cache/caching-layer.js +5 -10
  115. package/dist/cache/caching-layer.js.map +1 -1
  116. package/dist/cli.js +1 -1
  117. package/dist/cli.js.map +1 -1
  118. package/dist/context/grep.d.ts +14 -0
  119. package/dist/context/grep.d.ts.map +1 -1
  120. package/dist/context/grep.js +49 -0
  121. package/dist/context/grep.js.map +1 -1
  122. package/dist/context/unit-surgery.d.ts +4 -2
  123. package/dist/context/unit-surgery.d.ts.map +1 -1
  124. package/dist/context/unit-surgery.js +54 -6
  125. package/dist/context/unit-surgery.js.map +1 -1
  126. package/dist/handlers/activate.d.ts.map +1 -1
  127. package/dist/handlers/activate.js +11 -20
  128. package/dist/handlers/activate.js.map +1 -1
  129. package/dist/handlers/diagnose.d.ts.map +1 -1
  130. package/dist/handlers/diagnose.js +11 -30
  131. package/dist/handlers/diagnose.js.map +1 -1
  132. package/dist/handlers/dispatch.d.ts.map +1 -1
  133. package/dist/handlers/dispatch.js +63 -8
  134. package/dist/handlers/dispatch.js.map +1 -1
  135. package/dist/handlers/editable-source.d.ts +6 -0
  136. package/dist/handlers/editable-source.d.ts.map +1 -0
  137. package/dist/handlers/editable-source.js +53 -0
  138. package/dist/handlers/editable-source.js.map +1 -0
  139. package/dist/handlers/feature-cache.d.ts +2 -0
  140. package/dist/handlers/feature-cache.d.ts.map +1 -1
  141. package/dist/handlers/feature-cache.js +8 -0
  142. package/dist/handlers/feature-cache.js.map +1 -1
  143. package/dist/handlers/hyperfocused.js +1 -1
  144. package/dist/handlers/hyperfocused.js.map +1 -1
  145. package/dist/handlers/lint.d.ts.map +1 -1
  146. package/dist/handlers/lint.js +13 -4
  147. package/dist/handlers/lint.js.map +1 -1
  148. package/dist/handlers/object-types.d.ts +2 -3
  149. package/dist/handlers/object-types.d.ts.map +1 -1
  150. package/dist/handlers/object-types.js +13 -5
  151. package/dist/handlers/object-types.js.map +1 -1
  152. package/dist/handlers/publish-failure.d.ts +7 -0
  153. package/dist/handlers/publish-failure.d.ts.map +1 -0
  154. package/dist/handlers/publish-failure.js +42 -0
  155. package/dist/handlers/publish-failure.js.map +1 -0
  156. package/dist/handlers/read.d.ts.map +1 -1
  157. package/dist/handlers/read.js +39 -9
  158. package/dist/handlers/read.js.map +1 -1
  159. package/dist/handlers/schemas.d.ts +45 -0
  160. package/dist/handlers/schemas.d.ts.map +1 -1
  161. package/dist/handlers/schemas.js +50 -7
  162. package/dist/handlers/schemas.js.map +1 -1
  163. package/dist/handlers/syntax.d.ts +5 -0
  164. package/dist/handlers/syntax.d.ts.map +1 -0
  165. package/dist/handlers/syntax.js +35 -0
  166. package/dist/handlers/syntax.js.map +1 -0
  167. package/dist/handlers/tool-descriptions.d.ts.map +1 -1
  168. package/dist/handlers/tool-descriptions.js +7 -5
  169. package/dist/handlers/tool-descriptions.js.map +1 -1
  170. package/dist/handlers/tool-registry.d.ts +4 -4
  171. package/dist/handlers/tool-registry.d.ts.map +1 -1
  172. package/dist/handlers/tool-registry.js +4 -0
  173. package/dist/handlers/tool-registry.js.map +1 -1
  174. package/dist/handlers/tools.d.ts +1 -16
  175. package/dist/handlers/tools.d.ts.map +1 -1
  176. package/dist/handlers/tools.js +44 -55
  177. package/dist/handlers/tools.js.map +1 -1
  178. package/dist/handlers/transport.d.ts.map +1 -1
  179. package/dist/handlers/transport.js +17 -3
  180. package/dist/handlers/transport.js.map +1 -1
  181. package/dist/handlers/write/class-edit.d.ts +16 -0
  182. package/dist/handlers/write/class-edit.d.ts.map +1 -0
  183. package/dist/handlers/write/class-edit.js +55 -0
  184. package/dist/handlers/write/class-edit.js.map +1 -0
  185. package/dist/handlers/write/class-surgery.d.ts +2 -2
  186. package/dist/handlers/write/class-surgery.d.ts.map +1 -1
  187. package/dist/handlers/write/class-surgery.js +189 -220
  188. package/dist/handlers/write/class-surgery.js.map +1 -1
  189. package/dist/handlers/write/context.d.ts +1 -8
  190. package/dist/handlers/write/context.d.ts.map +1 -1
  191. package/dist/handlers/write/create.d.ts.map +1 -1
  192. package/dist/handlers/write/create.js +11 -4
  193. package/dist/handlers/write/create.js.map +1 -1
  194. package/dist/handlers/write/metadata-update.d.ts +4 -0
  195. package/dist/handlers/write/metadata-update.d.ts.map +1 -0
  196. package/dist/handlers/write/metadata-update.js +58 -0
  197. package/dist/handlers/write/metadata-update.js.map +1 -0
  198. package/dist/handlers/write/rap.d.ts.map +1 -1
  199. package/dist/handlers/write/rap.js +132 -155
  200. package/dist/handlers/write/rap.js.map +1 -1
  201. package/dist/handlers/write/unit-surgery.d.ts +2 -2
  202. package/dist/handlers/write/unit-surgery.d.ts.map +1 -1
  203. package/dist/handlers/write/unit-surgery.js +58 -34
  204. package/dist/handlers/write/unit-surgery.js.map +1 -1
  205. package/dist/handlers/write/update-delete.d.ts.map +1 -1
  206. package/dist/handlers/write/update-delete.js +34 -82
  207. package/dist/handlers/write/update-delete.js.map +1 -1
  208. package/dist/handlers/write-helpers.d.ts +4 -3
  209. package/dist/handlers/write-helpers.d.ts.map +1 -1
  210. package/dist/handlers/write-helpers.js +135 -21
  211. package/dist/handlers/write-helpers.js.map +1 -1
  212. package/dist/handlers/write.d.ts.map +1 -1
  213. package/dist/handlers/write.js +13 -31
  214. package/dist/handlers/write.js.map +1 -1
  215. package/dist/lint/config-builder.d.ts +10 -1
  216. package/dist/lint/config-builder.d.ts.map +1 -1
  217. package/dist/lint/config-builder.js +4 -0
  218. package/dist/lint/config-builder.js.map +1 -1
  219. package/dist/lint/lint.d.ts +3 -1
  220. package/dist/lint/lint.d.ts.map +1 -1
  221. package/dist/lint/lint.js +2 -1
  222. package/dist/lint/lint.js.map +1 -1
  223. package/dist/public/read-only-client.d.ts +6 -0
  224. package/dist/public/read-only-client.d.ts.map +1 -0
  225. package/dist/public/read-only-client.js +66 -0
  226. package/dist/public/read-only-client.js.map +1 -0
  227. package/dist/public/testing.d.ts +4 -0
  228. package/dist/public/testing.d.ts.map +1 -1
  229. package/dist/public/testing.js +6 -0
  230. package/dist/public/testing.js.map +1 -1
  231. package/dist/public/types.d.ts +14 -15
  232. package/dist/public/types.d.ts.map +1 -1
  233. package/dist/server/audit.d.ts +6 -1
  234. package/dist/server/audit.d.ts.map +1 -1
  235. package/dist/server/audit.js.map +1 -1
  236. package/dist/server/config.d.ts.map +1 -1
  237. package/dist/server/config.js +9 -2
  238. package/dist/server/config.js.map +1 -1
  239. package/dist/server/deny-actions.d.ts +2 -1
  240. package/dist/server/deny-actions.d.ts.map +1 -1
  241. package/dist/server/deny-actions.js +13 -2
  242. package/dist/server/deny-actions.js.map +1 -1
  243. package/dist/server/http.d.ts.map +1 -1
  244. package/dist/server/http.js +7 -5
  245. package/dist/server/http.js.map +1 -1
  246. package/dist/server/logger.d.ts +3 -3
  247. package/dist/server/logger.d.ts.map +1 -1
  248. package/dist/server/logger.js +7 -7
  249. package/dist/server/logger.js.map +1 -1
  250. package/dist/server/multi-target-basic-auth.d.ts.map +1 -1
  251. package/dist/server/multi-target-basic-auth.js +1 -0
  252. package/dist/server/multi-target-basic-auth.js.map +1 -1
  253. package/dist/server/multi-target-runtime.d.ts.map +1 -1
  254. package/dist/server/multi-target-runtime.js +1 -0
  255. package/dist/server/multi-target-runtime.js.map +1 -1
  256. package/dist/server/oauth-redirect-policy.d.ts +13 -0
  257. package/dist/server/oauth-redirect-policy.d.ts.map +1 -0
  258. package/dist/server/oauth-redirect-policy.js +21 -0
  259. package/dist/server/oauth-redirect-policy.js.map +1 -0
  260. package/dist/server/plugin-loader.d.ts.map +1 -1
  261. package/dist/server/plugin-loader.js +1 -3
  262. package/dist/server/plugin-loader.js.map +1 -1
  263. package/dist/server/safe-http-client.d.ts +8 -14
  264. package/dist/server/safe-http-client.d.ts.map +1 -1
  265. package/dist/server/safe-http-client.js +51 -73
  266. package/dist/server/safe-http-client.js.map +1 -1
  267. package/dist/server/server.d.ts +5 -4
  268. package/dist/server/server.d.ts.map +1 -1
  269. package/dist/server/server.js +36 -27
  270. package/dist/server/server.js.map +1 -1
  271. package/dist/server/types.d.ts +6 -4
  272. package/dist/server/types.d.ts.map +1 -1
  273. package/dist/server/types.js +2 -0
  274. package/dist/server/types.js.map +1 -1
  275. package/dist/version.d.ts +3 -0
  276. package/dist/version.d.ts.map +1 -0
  277. package/dist/version.js +3 -0
  278. package/dist/version.js.map +1 -0
  279. package/package.json +15 -15
@@ -2,15 +2,15 @@
2
2
  * SAPWrite actions — update + delete.
3
3
  */
4
4
  import { isTextElementObjectType, TEXT_ELEMENT_OBJECT_TYPES, TEXT_ELEMENT_PARTS, } from '../../adt/client.js';
5
- import { deleteObject, lockObject, safeUpdateClassInclude, safeUpdateObject, safeUpdateSource, unlockObject, } from '../../adt/crud.js';
6
- import { formatKtdWriteReport, rewriteKtdDocument, } from '../../adt/ddic-xml.js';
5
+ import { deleteObject, lockObject, safeUpdateClassInclude, safeUpdateSource, unlockObject } from '../../adt/crud.js';
7
6
  import { AdtApiError } from '../../adt/errors.js';
8
7
  import { spliceFmSignature } from '../../adt/fm-signature.js';
9
8
  import { buildCdsDeleteDependencyHint, buildCdsUpdateCrudHint, CDS_DEPENDENCY_SENSITIVE_TYPES, guardCdsSyntax, } from '../cds-hints.js';
10
9
  import { getCachedFeatures } from '../feature-cache.js';
11
10
  import { CLASS_WRITE_INCLUDES, canonicalTablType, classIncludeUrl } from '../object-types.js';
12
11
  import { errorResult, textResult } from '../shared.js';
13
- import { buildCreateXml, getMetadataWriteProperties, isMetadataWriteType, mergeMetadataWriteProperties, mergePreWriteWarnings, resolveWriteSystemType, runPreWriteLint, runPreWriteSyntaxCheck, runRapPreflightValidation, SKTD_V2_CONTENT_TYPE, stripFmParamCommentBlock, vendorContentTypeForType, } from '../write-helpers.js';
12
+ import { isMetadataWriteType, mergePreWriteWarnings, runPreWriteLint, runPreWriteSyntaxCheck, runRapPreflightValidation, stripFmParamCommentBlock, } from '../write-helpers.js';
13
+ import { writeMetadataUpdate } from './metadata-update.js';
14
14
  function isDeleteDependencyError(err) {
15
15
  const clean = AdtApiError.extractCleanMessage(err.responseBody ?? err.message).toLowerCase();
16
16
  const body = (err.responseBody ?? '').toLowerCase();
@@ -39,54 +39,13 @@ export async function writeActionUpdate(ctx) {
39
39
  // the testclasses (CCAU) include is absent — a content PUT alone fails
40
40
  // with HTTP 500 "…CCAU does not have any inactive version". safeUpdateClassInclude
41
41
  // probes the include and POST-creates it (under the same lock) before the PUT.
42
- const { initialized } = await safeUpdateClassInclude(client.http, client.safety, objectUrl, classIncludeUrl(name, include), source, transport, getCachedFeatures()?.abapRelease);
42
+ const { initialized } = await safeUpdateClassInclude(client.http, client.safety, objectUrl, classIncludeUrl(name, include), source, transport, getCachedFeatures()?.abapRelease, args.expectedSourceHash);
43
43
  invalidateWrittenObject(type, name);
44
44
  const initNote = initialized ? ` (initialised the ${include} include first)` : '';
45
45
  return textResult(`Successfully updated ${type} ${name} include ${include}${initNote}. Active version remains unchanged until activation; read with SAPRead(version="inactive") to verify the draft.`);
46
46
  }
47
- if (type === 'SKTD') {
48
- // KTD update requires the full <sktd:docu> XML envelope with the Markdown
49
- // body base64-encoded inside <sktd:text>, PUT with
50
- // `application/vnd.sap.adt.sktdv2+xml`. PUTting raw text/plain silently
51
- // no-ops (or 415s on strict systems). Fetch the current envelope,
52
- // replace only the <sktd:text> body, and PUT it back — preserves
53
- // responsible/masterLanguage/packageRef/refObject metadata.
54
- //
55
- // Deliberately no `version`: ADT's default view already carries the pending
56
- // inactive draft, so consecutive node writes without an activation in between
57
- // accumulate instead of reverting to the active version (live-verified
58
- // 2026-09-02). SAPRead defaults to "active", so its node list can lag this one;
59
- // every refusal raised below lists the ids of the envelope it actually merged.
60
- const { source: currentEnvelope } = await client.getKtd(name);
61
- const report = { proseHeadings: [] };
62
- const body = rewriteKtdDocument(currentEnvelope, hasSource ? source : undefined, args.shortTexts, report);
63
- // Report both changed nodes and headings retained as prose so a new body exposes its routing.
64
- const summary = formatKtdWriteReport(currentEnvelope, body, report, args.dryRun === true);
65
- // A KTD update is a merge: only the addressed nodes change. dryRun runs the identical
66
- // validation and reports the outcome without the PUT, so a 90-node edit can be checked
67
- // before it touches SAP.
68
- if (args.dryRun === true) {
69
- return textResult(`Dry run for ${type} ${name} — nothing was written.\n${summary}`);
70
- }
71
- await safeUpdateObject(client.http, client.safety, objectUrl, body, SKTD_V2_CONTENT_TYPE, transport, getCachedFeatures()?.abapRelease);
72
- invalidateWrittenObject(type, name);
73
- return textResult(`Successfully updated ${type} ${name}.\n${summary}`);
74
- }
75
- if (isMetadataWriteType(type)) {
76
- // Metadata updates are full-XML-replace — we must fetch existing metadata
77
- // and merge with provided fields so omitted fields keep their current values.
78
- // Without this, updating just labels would reset dataType/typeKind to defaults.
79
- const metadataProps = getMetadataWriteProperties(args);
80
- const mergedProps = await mergeMetadataWriteProperties(client, type, name, metadataProps);
81
- const description = String(args.description ?? mergedProps._description ?? name);
82
- const pkg = String(args.package ?? existingPackage ?? mergedProps._package ?? '$TMP');
83
- // Keep the full-XML-replace body cloud-correct on BTP (G-3); resolve the user from the JWT (G-5).
84
- const systemType = resolveWriteSystemType(config, client);
85
- const responsible = config.username || (await client.getEffectiveUser());
86
- const body = buildCreateXml(type, name, pkg, description, mergedProps, config.language, responsible, systemType === 'btp');
87
- await safeUpdateObject(client.http, client.safety, objectUrl, body, vendorContentTypeForType(type), transport, getCachedFeatures()?.abapRelease);
88
- invalidateWrittenObject(type, name);
89
- return textResult(`Successfully updated ${type} ${name}.`);
47
+ if (type === 'SKTD' || isMetadataWriteType(type)) {
48
+ return writeMetadataUpdate(ctx, existingPackage);
90
49
  }
91
50
  // RAP deterministic preflight validation
92
51
  const preflightWarnings = runRapPreflightValidation(source, type, name, getCachedFeatures(), config.systemType, preflightOverride);
@@ -104,59 +63,52 @@ export async function writeActionUpdate(ctx) {
104
63
  //
105
64
  // Issue #252: when `parameters` is supplied as a structured array, splice
106
65
  // it into the FM source as ABAP-source-based signature syntax. If `source`
107
- // is omitted entirely, fetch the existing source first to preserve the
66
+ // is omitted entirely, read the existing source under the lock to preserve the
108
67
  // body. The structured clause replaces any existing signature region.
109
68
  let effectiveSource = source;
110
69
  let fmParamStripWarning;
111
- let fmParamMergeWarning;
112
- if (type === 'FUNC') {
113
- const parameters = args.parameters;
114
- if (parameters !== undefined) {
115
- // If caller passed parameters but no source, fetch the current source so
116
- // the body is preserved (the parameters array re-emits only the signature).
117
- let baseSource = source;
118
- if (!baseSource || baseSource.trim() === '') {
119
- const groupName = String(args.group ?? '');
120
- const fetched = await client.getFunction(groupName, name).catch(() => null);
121
- baseSource = fetched?.source ?? `FUNCTION ${name}.\nENDFUNCTION.\n`;
122
- }
123
- else if (!/^\s*FUNCTION\s+/i.test(baseSource)) {
124
- // Body-only source: wrap in FUNCTION/ENDFUNCTION so the splicer has
125
- // something to work with. Common shape from LLMs: just the body.
126
- baseSource = `FUNCTION ${name}.\n${baseSource}\nENDFUNCTION.\n`;
127
- }
128
- try {
129
- effectiveSource = spliceFmSignature(baseSource, name, parameters);
130
- }
131
- catch {
132
- // No FUNCTION token in the supplied source — fall back to user's source.
133
- effectiveSource = baseSource;
134
- fmParamMergeWarning =
135
- 'Could not splice structured parameters: source did not start with FUNCTION keyword. Used the supplied source verbatim.';
136
- }
137
- }
138
- // Defense-in-depth: strip *" comment blocks even after splicing — the
139
- // user's body may contain them (e.g. pasted from SAPGUI).
140
- const stripped = stripFmParamCommentBlock(effectiveSource);
141
- effectiveSource = stripped.source;
70
+ const parameters = args.parameters;
71
+ const needsCurrentFunctionSource = type === 'FUNC' && parameters !== undefined && !source.trim();
72
+ const prepareFunctionSource = (baseSource) => {
73
+ if (parameters !== undefined)
74
+ baseSource = spliceFmSignature(baseSource, name, parameters);
75
+ const stripped = stripFmParamCommentBlock(baseSource);
142
76
  if (stripped.wasStripped) {
143
77
  fmParamStripWarning =
144
78
  'Stripped *"…IMPORTING/EXPORTING…*" parameter comment blocks (SAP rejects them on PUT — pass `parameters` as a structured array instead).';
145
79
  }
80
+ return stripped.source;
81
+ };
82
+ if (type === 'FUNC' && !needsCurrentFunctionSource) {
83
+ // Only caller-supplied body text may be wrapped. A fetched source must contain the real FUNCTION envelope.
84
+ const bodyOnly = parameters !== undefined && !/^\s*FUNCTION\s+/i.test(source);
85
+ effectiveSource = prepareFunctionSource(bodyOnly ? `FUNCTION ${name}.\n${source}\nENDFUNCTION.\n` : source);
86
+ }
87
+ if (!needsCurrentFunctionSource && !effectiveSource.trim()) {
88
+ return errorResult(`"source" is required for action="update" on ${type} ${name}; no write was made.`);
146
89
  }
147
90
  // Pre-write lint validation (uses sanitized source for FUNC)
148
91
  const lintWarnings = runPreWriteLint(effectiveSource, type, name, config, lintOverride);
149
92
  if (lintWarnings.blocked)
150
93
  return lintWarnings.result;
151
94
  // Pre-write server-side syntax check (opt-in; never blocks — warnings only).
152
- const checkNotes = await runPreWriteSyntaxCheck(client, type, effectiveSource, objectUrl, config, checkOverride);
95
+ let checkNotes = '';
96
+ const checkSource = async (candidate, http = client.http) => {
97
+ checkNotes = await runPreWriteSyntaxCheck({ http, safety: client.safety }, type, candidate, objectUrl, config, checkOverride);
98
+ return candidate;
99
+ };
100
+ // A signature-only FUNC edit derives its replacement from fresh bytes under the lock.
101
+ // A failed read aborts; there is no empty-body fallback or unlocked source read.
102
+ const replacement = needsCurrentFunctionSource
103
+ ? (current, session) => checkSource(prepareFunctionSource(current), session)
104
+ : await checkSource(effectiveSource);
153
105
  // If safeUpdateSource throws (lock conflict, network error, etc.), checkNotes
154
106
  // is intentionally discarded — pre-check warnings only matter when the write succeeded.
155
- await safeUpdateSource(client.http, client.safety, objectUrl, srcUrl, effectiveSource, transport, getCachedFeatures()?.abapRelease);
107
+ await safeUpdateSource(client.http, client.safety, objectUrl, srcUrl, replacement, transport, getCachedFeatures()?.abapRelease, args.expectedSourceHash);
156
108
  invalidateWrittenObject(type, name);
157
109
  const msg = `Successfully updated ${type} ${name}.`;
158
110
  const cdsUpdateHint = type === 'DDLS' ? await buildCdsUpdateCrudHint(client, name, objectUrl) : undefined;
159
- const warnings = mergePreWriteWarnings(preflightWarnings.warnings, lintWarnings.warnings, checkNotes, cdsUpdateHint, fmParamStripWarning, fmParamMergeWarning);
111
+ const warnings = mergePreWriteWarnings(preflightWarnings.warnings, lintWarnings.warnings, checkNotes, cdsUpdateHint, fmParamStripWarning);
160
112
  return warnings ? textResult(`${msg}\n\n${warnings}`) : textResult(msg);
161
113
  }
162
114
  export async function writeActionDelete(ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"update-delete.js","sourceRoot":"","sources":["../../../src/handlers/write/update-delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAoB,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,EACtB,8BAA8B,EAC9B,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAmB,UAAU,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,qBAAqB,CAAC;AAG7B,SAAS,uBAAuB,CAAC,GAAgB;IAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1E,OAAO,iGAAiG,CAAC,IAAI,CAC3G,GAAG,KAAK,KAAK,IAAI,EAAE,CACpB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAoB;IAC1D,MAAM,EACJ,MAAM,EACN,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,SAAS,EACT,OAAO,EACP,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,SAAS,EACT,MAAM,EACN,uBAAuB,EACvB,+BAA+B,GAChC,GAAG,GAAG,CAAC;IACR,MAAM,eAAe,GAAG,MAAM,+BAA+B,EAAE,CAAC;IAEhE,gFAAgF;IAChF,+EAA+E;IAC/E,oFAAoF;IACpF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,WAAW,CAChB,yBAAyB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpG,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,0EAA0E,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,WAAW,CAAC,oDAAoD,CAAC,CAAC;QAC3E,CAAC;QAED,wEAAwE;QACxE,uEAAuE;QACvE,mFAAmF;QACnF,+EAA+E;QAC/E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,sBAAsB,CAClD,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,SAAS,EACT,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,EAC9B,MAAM,EACN,SAAS,EACT,iBAAiB,EAAE,EAAE,WAAW,CACjC,CAAC;QACF,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,qBAAqB,OAAO,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,UAAU,CACf,wBAAwB,IAAI,IAAI,IAAI,YAAY,OAAO,GAAG,QAAQ,iHAAiH,CACpL,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,0EAA0E;QAC1E,mDAAmD;QACnD,wEAAwE;QACxE,kEAAkE;QAClE,iEAAiE;QACjE,4DAA4D;QAC5D,EAAE;QACF,4EAA4E;QAC5E,8EAA8E;QAC9E,uEAAuE;QACvE,gFAAgF;QAChF,+EAA+E;QAC/E,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAmB,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,kBAAkB,CAC7B,eAAe,EACf,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9B,IAAI,CAAC,UAAwC,EAC7C,MAAM,CACP,CAAC;QACF,8FAA8F;QAC9F,MAAM,OAAO,GAAG,oBAAoB,CAAC,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAC1F,sFAAsF;QACtF,uFAAuF;QACvF,yBAAyB;QACzB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,UAAU,CAAC,eAAe,IAAI,IAAI,IAAI,4BAA4B,OAAO,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,gBAAgB,CACpB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,SAAS,EACT,IAAI,EACJ,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EAAE,EAAE,WAAW,CACjC,CAAC;QACF,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC,wBAAwB,IAAI,IAAI,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,0EAA0E;QAC1E,8EAA8E;QAC9E,gFAAgF;QAChF,MAAM,aAAa,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAC1F,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,IAAI,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;QACtF,kGAAkG;QAClG,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,cAAc,CACzB,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,WAAW,EACX,WAAW,EACX,MAAM,CAAC,QAAQ,EACf,WAAW,EACX,UAAU,KAAK,KAAK,CACrB,CAAC;QACF,MAAM,gBAAgB,CACpB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,SAAS,EACT,IAAI,EACJ,wBAAwB,CAAC,IAAI,CAAC,EAC9B,SAAS,EACT,iBAAiB,EAAE,EAAE,WAAW,CACjC,CAAC;QACF,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,UAAU,CAAC,wBAAwB,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,yCAAyC;IACzC,MAAM,iBAAiB,GAAG,yBAAyB,CACjD,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,iBAAiB,EAAE,EACnB,MAAM,CAAC,UAAU,EACjB,iBAAiB,CAClB,CAAC;IACF,IAAI,iBAAiB,CAAC,OAAO;QAAE,OAAO,iBAAiB,CAAC,MAAO,CAAC;IAEhE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACzE,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,yEAAyE;IACzE,2EAA2E;IAC3E,+EAA+E;IAC/E,4EAA4E;IAC5E,wDAAwD;IACxD,EAAE;IACF,0EAA0E;IAC1E,2EAA2E;IAC3E,uEAAuE;IACvE,sEAAsE;IACtE,IAAI,eAAe,GAAG,MAAM,CAAC;IAC7B,IAAI,mBAAuC,CAAC;IAC5C,IAAI,mBAAuC,CAAC;IAC5C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAuC,CAAC;QAChE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,yEAAyE;YACzE,4EAA4E;YAC5E,IAAI,UAAU,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC5E,UAAU,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,IAAI,mBAAmB,CAAC;YACtE,CAAC;iBAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChD,oEAAoE;gBACpE,iEAAiE;gBACjE,UAAU,GAAG,YAAY,IAAI,MAAM,UAAU,kBAAkB,CAAC;YAClE,CAAC;YACD,IAAI,CAAC;gBACH,eAAe,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACpE,CAAC;YAAC,MAAM,CAAC;gBACP,yEAAyE;gBACzE,eAAe,GAAG,UAAU,CAAC;gBAC7B,mBAAmB;oBACjB,wHAAwH,CAAC;YAC7H,CAAC;QACH,CAAC;QACD,sEAAsE;QACtE,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC3D,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC;QAClC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC;YACzB,mBAAmB;gBACjB,0IAA0I,CAAC;QAC/I,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACxF,IAAI,YAAY,CAAC,OAAO;QAAE,OAAO,YAAY,CAAC,MAAO,CAAC;IAEtD,6EAA6E;IAC7E,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAEjH,8EAA8E;IAC9E,wFAAwF;IACxF,MAAM,gBAAgB,CACpB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,MAAM,EACb,SAAS,EACT,MAAM,EACN,eAAe,EACf,SAAS,EACT,iBAAiB,EAAE,EAAE,WAAW,CACjC,CAAC;IACF,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,wBAAwB,IAAI,IAAI,IAAI,GAAG,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1G,MAAM,QAAQ,GAAG,qBAAqB,CACpC,iBAAiB,CAAC,QAAQ,EAC1B,YAAY,CAAC,QAAQ,EACrB,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,mBAAmB,CACpB,CAAC;IACF,OAAO,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAoB;IAC1D,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,uBAAuB,EAAE,+BAA+B,EAAE,GAAG,GAAG,CAAC;IACnH,MAAM,+BAA+B,EAAE,CAAC;IACxC,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,0HAA0H;IAC1H,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,WAAW,CAAC,CAAC;YAC7G,aAAa,GAAG,IAAI,CAAC;YACrB,MAAM,kBAAkB,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;YAC7F,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBACH,MAAM,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,6DAA6D;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,2EAA2E;QAC3E,2EAA2E;QAC3E,6EAA6E;QAC7E,4DAA4D;QAC5D,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;YAClE,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAC1C,GAAG,CAAC,4BAA4B,GAAG,QAAQ,CAAC;YAC9C,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,0EAA0E;gBAC1E,2EAA2E;gBAC3E,yEAAyE;gBACzE,GAAG,CAAC,4BAA4B;oBAC9B,QAAQ,YAAY,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAClF,CAAC;QACH,CAAC;QACD,IAAI,GAAG,YAAY,WAAW,IAAI,8BAA8B,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9F,MAAM,yBAAyB,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,4BAA4B,KAAK,QAAQ,CAAC,CAAC;YAC3G,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,4BAA4B,KAAK,SAAS,CAAC,CAAC;YAC/G,MAAM,kBAAkB,GACtB,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,IAAI,yBAAyB,IAAI,4BAA4B,CAAC,CAAC;YACjH,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,yBAAyB,CAAC;YAC/F,IAAI,kBAAkB,IAAI,sBAAsB,EAAE,CAAC;gBACjD,MAAM,IAAI,GAAG,MAAM,4BAA4B,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC/E,IAAI,IAAI,EAAE,CAAC;oBACT,oEAAoE;oBACpE,iEAAiE;oBACjE,qEAAqE;oBACrE,2DAA2D;oBAC3D,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,uBAAuB,EAAE,CAAC;IAC1B,OAAO,UAAU,CAAC,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;;;4FAK4F;AAC5F,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,GAAoB;IACnE,MAAM,EACJ,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,SAAS,EACT,SAAS,EACT,+BAA+B,EAC/B,uBAAuB,GACxB,GAAG,GAAG,CAAC;IACR,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,WAAW,CAChB,0CAA0C,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CACjG,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAI,IAAI,CAAC,QAA+B,IAAI,SAAS,CAAC;IACzE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,aAAgC,CAAC,EAAE,CAAC;QACnE,OAAO,WAAW,CAAC,qBAAqB,aAAa,qBAAqB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9G,CAAC;IACD,MAAM,IAAI,GAAG,aAAgC,CAAC;IAC9C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,WAAW,CAAC,yCAAyC,IAAI,yBAAyB,CAAC,CAAC;IAC7F,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,kDAAkD,IAAI,eAAe,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtH,CAAC;IACD,MAAM,+BAA+B,EAAE,CAAC;IACxC,MAAM,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACvE,uBAAuB,EAAE,CAAC;IAC1B,OAAO,UAAU,CAAC,WAAW,IAAI,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED;gCACgC;AAChC,MAAM,iBAAiB,GAAoC;IACzD,OAAO,EAAE,kFAAkF;IAC3F,UAAU,EAAE,kFAAkF;IAC9F,QAAQ,EAAE,sDAAsD;CACjE,CAAC"}
1
+ {"version":3,"file":"update-delete.js","sourceRoot":"","sources":["../../../src/handlers/write/update-delete.ts"],"names":[],"mappings":"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"}
@@ -103,8 +103,8 @@ export declare function enforceAllowedPackageForObjectUrl(client: AdtClient, obj
103
103
  * (create gates the caller-supplied package like every create; update/delete resolve the object's true
104
104
  * package under the metadata Accept). The `source` param carries AFF JSON or DDL text per the type's
105
105
  * registry sourceFormat — the JSON ones are parse-validated before the
106
- * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. Create leaves the
107
- * object inactive — callers follow with SAPActivate (never auto-activated).
106
+ * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. SAP controls
107
+ * activation: APLO saves are immediately active; other types need SAPActivate.
108
108
  */
109
109
  export declare function handleServerDrivenObjectWrite(client: AdtClient, action: string, type: string, name: string, args: Record<string, unknown>, cachingLayer: CachingLayer | undefined, cacheSecurity: CacheSecurityContext): Promise<ToolResult>;
110
110
  /** Pre-write lint check result */
@@ -157,12 +157,13 @@ export declare function runPreWriteLint(source: string, type: string, name: stri
157
157
  * intermediate writes legitimately trip compile errors that resolve once the whole
158
158
  * sequence lands. Real blocking is deferred to SAPActivate, which runs after all
159
159
  * dependencies are in place. Best-effort: network/endpoint failures return ''. */
160
- export declare function runPreWriteSyntaxCheck(client: AdtClient, type: string, source: string, objectUrl: string, config: ServerConfig, perCallOverride?: boolean): Promise<string>;
160
+ export declare function runPreWriteSyntaxCheck(client: Pick<AdtClient, 'http' | 'safety'>, type: string, source: string, objectUrl: string, config: ServerConfig, perCallOverride?: boolean): Promise<string>;
161
161
  /** Run a syntax check on the inactive version and format the errors for appending to an
162
162
  * error message. Returns '' on any failure or when no errors are reported. */
163
163
  export declare function inactiveSyntaxDiagnostic(client: AdtClient, type: string, name: string): Promise<string>;
164
164
  export declare function tryPostSaveSyntaxCheck(client: AdtClient, type: string, name: string): Promise<string>;
165
165
  export declare const TABL_DT_WRITE_UNAVAILABLE_HINT: string;
166
+ export declare const ENQU_WRITE_UNAVAILABLE_HINT: string;
166
167
  export declare const TTYP_WRITE_UNAVAILABLE_HINT: string;
167
168
  export declare const DOMA_WRITE_UNAVAILABLE_HINT: string;
168
169
  export declare const DEVC_WRITE_UNAVAILABLE_HINT: string;
@@ -1 +1 @@
1
- {"version":3,"file":"write-helpers.d.ts","sourceRoot":"","sources":["../../src/handlers/write-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AA6BlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAElF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,KAAK,oBAAoB,EAA0B,MAAM,qBAAqB,CAAC;AAIxF,OAAO,EAAe,KAAK,UAAU,EAAc,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAS7G;AAID,eAAO,MAAM,sBAAsB,0DAA0D,CAAC;AAC9F,eAAO,MAAM,2BAA2B,+DAA+D,CAAC;AACxG,eAAO,MAAM,8BAA8B,kFACsC,CAAC;AAOlF,eAAO,MAAM,wBAAwB,mEAAmE,CAAC;AAGzG,eAAO,MAAM,oBAAoB,uCAAuC,CAAC;AAWzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAgBD,wCAAwC;AACxC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,EAAE,WAAW,UAAQ,GAAG,MAAM,CAYjG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA0B7D;AAaD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA8ClG;AAiBD,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkFlC;AAED;;;;;;GAMG;AAEH;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAItG;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,UAAQ,GACZ,MAAM,CAGR;AAwXD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAIjG;AAID;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,aAOlC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,wBAAsB,iCAAiC,CACrD,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,aAAa,EAAE,oBAAoB,GAClC,OAAO,CAAC,UAAU,CAAC,CAuFrB;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,UAAU,0BAA0B;IAClC,4DAA4D;IAC5D,OAAO,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,gBAAgB,EAAE,YAAY,CAAC,YAAY,CAAC,EAC5C,eAAe,CAAC,EAAE,OAAO,GACxB,0BAA0B,CAgC5B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAIhG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,eAAe,CAAC,EAAE,OAAO,GACxB,kBAAkB,CA+DpB;AAkBD;;;;;;mFAMmF;AACnF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,YAAY,EACpB,eAAe,CAAC,EAAE,OAAO,GACxB,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAKD;+EAC+E;AAC/E,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB7G;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG3G;AAID,eAAO,MAAM,8BAA8B,QAMQ,CAAC;AAEpD,eAAO,MAAM,2BAA2B,QAG+F,CAAC;AAGxI,eAAO,MAAM,2BAA2B,QAIwD,CAAC;AAEjG,eAAO,MAAM,2BAA2B,QAI0B,CAAC"}
1
+ {"version":3,"file":"write-helpers.d.ts","sourceRoot":"","sources":["../../src/handlers/write-helpers.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,8 @@
7
7
  */
8
8
  import { adtResponsibleAttr, buildDataElementXml, buildDomainXml, buildMessageClassXml, buildServiceBindingXml, buildTableTypeXml, normalizeAdtLanguage, normalizeAdtResponsible, } from '../adt/ddic-xml.js';
9
9
  import { syntaxCheck } from '../adt/devtools.js';
10
- import { AdtSafetyError } from '../adt/errors.js';
10
+ import { AdtError, AdtSafetyError } from '../adt/errors.js';
11
+ import { buildLockObjectXml, getLockObject, LOCKOBJECT_CONTENT_TYPE, mergeLockObjectDefinition, parseLockObjectDefinition, } from '../adt/lock-object.js';
11
12
  import { formatRapPreflightFindings, validateRapSource } from '../adt/rap-preflight.js';
12
13
  import { checkPackage } from '../adt/safety.js';
13
14
  import { createServerDrivenObject, deleteServerDrivenObject, ensureServerDrivenSupport, serverDrivenMetadataContentType, serverDrivenObjectUrl, serverDrivenSourceFormat, serverDrivenUnavailableMessage, updateServerDrivenObjectSource, } from '../adt/server-driven.js';
@@ -28,10 +29,18 @@ import { errorResult, textResult } from './shared.js';
28
29
  */
29
30
  export function buildLintConfigOptions(config, ruleOverrides) {
30
31
  // Probe-detected system type is most accurate; fall back to CLI config
31
- const systemType = getCachedFeatures()?.systemType ?? (config.systemType !== 'auto' ? config.systemType : undefined);
32
+ const cachedFeatures = getCachedFeatures();
33
+ const systemType = cachedFeatures?.systemType ?? (config.systemType !== 'auto' ? config.systemType : undefined);
34
+ const systemTypeSource = cachedFeatures?.systemType
35
+ ? (cachedFeatures.systemTypeSource ?? 'probe')
36
+ : config.systemType !== 'auto'
37
+ ? 'config'
38
+ : 'default';
32
39
  return {
33
40
  systemType,
34
- abapRelease: getCachedFeatures()?.abapRelease ?? config.abapRelease,
41
+ systemTypeSource,
42
+ abapRelease: cachedFeatures?.abapRelease ?? config.abapRelease,
43
+ abapReleaseSource: cachedFeatures?.abapRelease ? 'probe' : config.abapRelease ? 'config' : 'unknown',
35
44
  configFile: config.abaplintConfig,
36
45
  ruleOverrides,
37
46
  };
@@ -60,7 +69,7 @@ const FUNCTION_MODULE_CONTENT_TYPE = 'application/vnd.sap.adt.functions.fmodules
60
69
  // "Supported Media Types: …fincludes.v2+xml" — verified on npl 7.50 and a4h 758.
61
70
  const FUNCTION_INCLUDE_CONTENT_TYPE = 'application/vnd.sap.adt.functions.fincludes.v2+xml';
62
71
  export function isMetadataWriteType(type) {
63
- return type === 'DOMA' || type === 'DTEL' || type === 'MSAG' || type === 'SRVB' || type === 'TTYP';
72
+ return type === 'DOMA' || type === 'DTEL' || type === 'MSAG' || type === 'SRVB' || type === 'TTYP' || type === 'ENQU';
64
73
  }
65
74
  /** Types that require a specific vendor content type for creation (not application/*) */
66
75
  function needsVendorContentType(type) {
@@ -70,6 +79,7 @@ function needsVendorContentType(type) {
70
79
  type === 'MSAG' ||
71
80
  type === 'SKTD' ||
72
81
  type === 'TTYP' ||
82
+ type === 'ENQU' ||
73
83
  type === 'FUGR' ||
74
84
  type === 'FUNC');
75
85
  }
@@ -106,6 +116,8 @@ export function vendorContentTypeForType(type) {
106
116
  return SKTD_V2_CONTENT_TYPE;
107
117
  case 'TTYP':
108
118
  return TABLETYPE_CONTENT_TYPE;
119
+ case 'ENQU':
120
+ return LOCKOBJECT_CONTENT_TYPE;
109
121
  case 'FUGR':
110
122
  return FUNCTION_GROUP_CONTENT_TYPE;
111
123
  case 'FUNC':
@@ -174,6 +186,8 @@ export function getMetadataWriteProperties(input) {
174
186
  // /source/main. Preserve the ADT wire values exactly.
175
187
  processingType: input.processingType,
176
188
  updateTaskKind: input.updateTaskKind,
189
+ // ENQU carries its definition as JSON in "source" (the same shape SAPRead returns).
190
+ lockObjectSource: input.source,
177
191
  };
178
192
  return props;
179
193
  }
@@ -259,6 +273,19 @@ export async function mergeMetadataWriteProperties(client, type, name, provided)
259
273
  deactivateBIDIFiltering: existing.deactivateBIDIFiltering,
260
274
  };
261
275
  }
276
+ if (type === 'ENQU') {
277
+ // Merge over the developer view so consecutive unactivated edits accumulate.
278
+ const existing = await getLockObject(client.http, client.safety, name);
279
+ const source = provided.lockObjectSource;
280
+ const definition = source === undefined || source === null || String(source).trim() === ''
281
+ ? {}
282
+ : parseLockObjectDefinition(String(source));
283
+ return {
284
+ _description: existing.description,
285
+ _package: existing.package,
286
+ lockObjectDefinition: mergeLockObjectDefinition(existing, definition),
287
+ };
288
+ }
262
289
  if (type === 'SRVB') {
263
290
  const { source: existingRaw } = await client.getSrvb(name);
264
291
  const existing = JSON.parse(existingRaw);
@@ -272,6 +299,40 @@ export async function mergeMetadataWriteProperties(client, type, name, provided)
272
299
  odataVersion: provided.odataVersion ?? existing.odataVersion,
273
300
  };
274
301
  }
302
+ if (type === 'TTYP') {
303
+ const existing = await client.getTableType(name).catch((err) => {
304
+ // SAP and transport failures are reported as they are; an unreadable shape has to say why the update stops.
305
+ if (err instanceof AdtError)
306
+ throw err;
307
+ throw new Error(`Cannot update TTYP ${name}: ARC-1 could not read its stored metadata ` +
308
+ `(${err instanceof Error ? err.message : String(err)}) and will not overwrite it blind. ` +
309
+ 'Nothing was written. Change this table type in ADT or SE11.');
310
+ });
311
+ // The two row kinds buildTableTypeXml writes, as rowTypeKind values. Ref and range rows have none.
312
+ const storedKind = existing.rowTypeKind === 'predefinedAbapType'
313
+ ? 'builtin'
314
+ : existing.rowTypeKind === 'dictionaryType'
315
+ ? 'structure'
316
+ : undefined;
317
+ const requested = String(provided.rowType ?? '').trim();
318
+ // Without rowType the caller keeps the stored definition, so ARC-1 must be able to write it back unchanged.
319
+ if (!requested && !(storedKind && existing.plainStandardTable)) {
320
+ const lost = storedKind ? 'its access type, keys or initial row count' : `its ${existing.rowTypeKind} row type`;
321
+ throw new Error(`Cannot update TTYP ${name} without "rowType": ARC-1 rewrites a table type as a standard table with a ` +
322
+ `non-unique standard key and cannot keep ${lost}. Nothing was written. ` +
323
+ 'Pass rowType to accept that rewrite, or change this table type in ADT or SE11.');
324
+ }
325
+ // The stored kind and built-in length describe the stored row type: keep them only while it is unchanged.
326
+ const unchanged = !!storedKind && (!requested || requested.toUpperCase() === existing.rowType.toUpperCase());
327
+ return {
328
+ _description: existing.description,
329
+ _package: existing.package,
330
+ rowType: requested || existing.rowType,
331
+ rowTypeKind: provided.rowTypeKind ?? (unchanged ? storedKind : undefined),
332
+ rowTypeLength: unchanged ? existing.rowTypeLength : undefined,
333
+ rowTypeDecimals: unchanged ? existing.rowTypeDecimals : undefined,
334
+ };
335
+ }
275
336
  return provided;
276
337
  }
277
338
  /**
@@ -548,10 +609,18 @@ function buildCreateXmlBody(type, name, pkg, description, properties, language,
548
609
  package: pkg,
549
610
  rowType,
550
611
  rowTypeKind,
612
+ rowTypeLength: properties?.rowTypeLength,
613
+ rowTypeDecimals: properties?.rowTypeDecimals,
551
614
  language: masterLanguage,
552
615
  responsible: responsibleUser,
553
616
  });
554
617
  }
618
+ case 'ENQU': {
619
+ // Update passes the merged definition; create parses the caller's JSON source.
620
+ const definition = properties?.lockObjectDefinition ??
621
+ parseLockObjectDefinition(String(properties?.lockObjectSource ?? '{}'));
622
+ return buildLockObjectXml({ name, description, package: pkg, definition, masterLanguage, responsibleAttr });
623
+ }
555
624
  case 'DTEL': {
556
625
  const typeKindRaw = String(properties?.typeKind ?? '');
557
626
  const typeKind = typeKindRaw === 'domain' || typeKindRaw === 'predefinedAbapType' ? typeKindRaw : undefined;
@@ -691,6 +760,7 @@ export const NAME_CASE_GUARD_ACTIONS = new Set([
691
760
  'update',
692
761
  'edit_method',
693
762
  'edit_unit',
763
+ 'add_unit',
694
764
  'delete',
695
765
  'edit_text_symbols',
696
766
  ]);
@@ -724,8 +794,8 @@ export async function enforceAllowedPackageForObjectUrl(client, objectUrl, label
724
794
  * (create gates the caller-supplied package like every create; update/delete resolve the object's true
725
795
  * package under the metadata Accept). The `source` param carries AFF JSON or DDL text per the type's
726
796
  * registry sourceFormat — the JSON ones are parse-validated before the
727
- * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. Create leaves the
728
- * object inactive — callers follow with SAPActivate (never auto-activated).
797
+ * PUT; ABAP-specific pre-write steps (lint, RAP preflight, CDS guard) do not apply. SAP controls
798
+ * activation: APLO saves are immediately active; other types need SAPActivate.
729
799
  */
730
800
  export async function handleServerDrivenObjectWrite(client, action, type, name, args, cachingLayer, cacheSecurity) {
731
801
  // Discovery gate — mirror handleSAPRead's server-driven branch.
@@ -735,12 +805,15 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
735
805
  const transport = args.transport;
736
806
  const objUrl = serverDrivenObjectUrl(type, name);
737
807
  const metadataAccept = serverDrivenMetadataContentType(type);
808
+ const activationHint = type === 'APLO'
809
+ ? 'APLO changes are active immediately; no activation is required.'
810
+ : `Next step: SAPActivate(type="${type}", name="${name}").`;
738
811
  const invalidate = () => {
739
812
  cachingLayer?.invalidate(type, name, 'all');
740
813
  invalidateInactiveList(cachingLayer, client, cacheSecurity);
741
814
  };
742
- // SDO source is AFF JSON for most types but DDL text for others (DTSC, DSFD, DTDC) — only parse-validate
743
- // the JSON ones. Validating DDL text as JSON would reject every valid source.
815
+ // Only parse-validate entries whose sourceFormat is 'json'. Validating DDL text as JSON
816
+ // would reject every valid source.
744
817
  const validateSource = () => {
745
818
  const src = String(args.source ?? '');
746
819
  if (serverDrivenSourceFormat(type) === 'json') {
@@ -762,25 +835,51 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
762
835
  case 'create': {
763
836
  const pkg = String(args.package ?? '$TMP');
764
837
  await checkPackage(client.safety, pkg, client.getPackageHierarchyResolver());
838
+ if (type === 'APLO' && name.length > 20) {
839
+ return errorResult('APLO names must be at most 20 characters. Nothing was created.');
840
+ }
765
841
  const description = String(args.description ?? name);
766
842
  // Validate BEFORE the create POST — validating after would leave an inactive orphan on SAP
767
843
  // that the caller never asked for and has to clean up by hand.
768
844
  const validated = hasSourceArg ? validateSource() : undefined;
769
845
  if (validated && !validated.ok)
770
846
  return validated.result;
847
+ // The job creation wizard requires this reference before the source PUT (notably on 758).
848
+ let creationProperties;
849
+ if (type === 'SAJC' || type === 'SAJT') {
850
+ const field = type === 'SAJC' ? 'className' : 'catalogName';
851
+ const reference = validated?.ok ? JSON.parse(validated.source)?.generalInformation?.[field] : undefined;
852
+ if (typeof reference !== 'string' || !reference.trim()) {
853
+ return errorResult(`Creating ${type} requires source.generalInformation.${field} in the AFF JSON source.`);
854
+ }
855
+ creationProperties = { [field]: reference };
856
+ }
771
857
  await createServerDrivenObject(client.http, client.safety, type, name, {
772
858
  package: pkg,
773
859
  description,
774
860
  transport,
861
+ creationProperties,
775
862
  });
776
- let wroteSource = false;
777
- if (validated?.ok) {
778
- await updateServerDrivenObjectSource(client.http, client.safety, type, name, validated.source, { transport });
779
- wroteSource = true;
863
+ try {
864
+ if (validated?.ok) {
865
+ await updateServerDrivenObjectSource(client.http, client.safety, type, name, validated.source, { transport });
866
+ }
780
867
  }
781
- invalidate();
782
- return textResult(`Created ${type} ${name} in package ${pkg}${wroteSource ? ' and wrote source' : ''}.\n` +
783
- `Next step: SAPActivate(type="${type}", name="${name}").`);
868
+ catch (cause) {
869
+ // The POST succeeded; both HTTP and network failures can leave the object with a partial source.
870
+ const err = cause instanceof AdtError ? cause : new AdtError(cause instanceof Error ? cause.message : String(cause));
871
+ err.extraHint = `${type} ${name} was created in package ${pkg}${type === 'APLO' ? ' and is active' : ''}, but the follow-up source step failed. Check it with SAPRead before using SAPWrite(action="update") — do not repeat create.`;
872
+ throw err;
873
+ }
874
+ finally {
875
+ try {
876
+ invalidate();
877
+ }
878
+ catch {
879
+ // Cache bookkeeping must not replace the confirmed create outcome or its original failure.
880
+ }
881
+ }
882
+ return textResult(`Created ${type} ${name} in package ${pkg}${validated?.ok ? ' and wrote source' : ''}.\n${activationHint}`);
784
883
  }
785
884
  case 'update': {
786
885
  if (!hasSourceArg) {
@@ -792,17 +891,26 @@ export async function handleServerDrivenObjectWrite(client, action, type, name,
792
891
  await enforceAllowedPackageForObjectUrl(client, objUrl, `Operations on ${type} '${name}'`, metadataAccept);
793
892
  await updateServerDrivenObjectSource(client.http, client.safety, type, name, v.source, { transport });
794
893
  invalidate();
795
- return textResult(`Updated source of ${type} ${name}.\nNext step: SAPActivate(type="${type}", name="${name}").`);
894
+ return textResult(`Updated source of ${type} ${name}.\n${activationHint}`);
796
895
  }
797
896
  case 'delete': {
798
897
  await enforceAllowedPackageForObjectUrl(client, objUrl, `Operations on ${type} '${name}'`, metadataAccept);
799
- await deleteServerDrivenObject(client.http, client.safety, type, name, { transport });
800
- invalidate();
898
+ try {
899
+ await deleteServerDrivenObject(client.http, client.safety, type, name, { transport });
900
+ }
901
+ finally {
902
+ try {
903
+ invalidate();
904
+ }
905
+ catch {
906
+ // Best-effort cleanup must not mask partial deletion or prevent the audit event.
907
+ }
908
+ }
801
909
  return textResult(`Deleted ${type} ${name}.`);
802
910
  }
803
911
  default:
804
912
  return errorResult(`Action "${action}" is not supported for server-driven object type ${type}. ` +
805
- 'Supported: create, update, delete — then SAPActivate to activate.');
913
+ 'Supported: create, update, delete.');
806
914
  }
807
915
  }
808
916
  /**
@@ -900,8 +1008,11 @@ export function runPreWriteLint(source, type, name, config, perCallOverride) {
900
1008
  const errorLines = result.errors.map((e) => ` Line ${e.line}: [${e.rule}] ${e.message}`).join('\n');
901
1009
  return {
902
1010
  blocked: true,
903
- result: errorResult(`Pre-write lint check failed for ${type} ${name}. Fix these errors before writing:\n${errorLines}\n\n` +
904
- 'Use SAPLint action="lint_and_fix" to auto-fix, or disable with --lint-before-write=false.'),
1011
+ result: errorResult(`Pre-write lint check failed for ${type} ${name} (abaplint syntax ${JSON.stringify(result.syntaxVersion)}). ` +
1012
+ `Fix these errors before writing:\n${errorLines}\n\n` +
1013
+ 'For parser/version findings, check SAPLint action="list_rules" and the target SAP release before ' +
1014
+ 'changing valid source. Use SAPLint action="lint_and_fix" for fixable findings, or ' +
1015
+ 'lintBeforeWrite=false to skip this check for this call.'),
905
1016
  };
906
1017
  }
907
1018
  if (result.warnings.length > 0) {
@@ -1007,6 +1118,9 @@ export const TABL_DT_WRITE_UNAVAILABLE_HINT = 'Transparent table writes via ADT
1007
1118
  'Use SE11 in SAPGUI, or connect ARC-1 to an SAP_BASIS ≥ 7.52 system. ' +
1008
1119
  'Writing the source via /sap/bc/adt/ddic/structures/ would silently flip ' +
1009
1120
  'DD02L-TABCLASS to INTTAB and corrupt the table.';
1121
+ export const ENQU_WRITE_UNAVAILABLE_HINT = 'Lock object (ENQU) writes are not available on this system ' +
1122
+ '(/sap/bc/adt/ddic/lockobjects/sources is not exposed by ADT discovery). ' +
1123
+ 'Use SE11 in SAPGUI, or connect ARC-1 to a system that exposes the lock-object endpoint.';
1010
1124
  export const TTYP_WRITE_UNAVAILABLE_HINT = 'Table type (TTYP) writes are not available on this system ' +
1011
1125
  '(/sap/bc/adt/ddic/tabletypes/ is not exposed by ADT discovery — verified absent on NW 7.50). ' +
1012
1126
  'Use SE11 in SAPGUI, or connect ARC-1 to a system that exposes the table-type endpoint (S/4HANA 2023 / ABAP Platform 2025 verified).';