bc-code-intelligence-mcp 1.3.3 → 1.3.4

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 (548) hide show
  1. package/dist/config/test-enhanced-layer-service.js +10 -10
  2. package/dist/config/test-enhanced-layer-service.js.map +1 -1
  3. package/dist/dev/hot-reload.d.ts +2 -2
  4. package/dist/dev/hot-reload.d.ts.map +1 -1
  5. package/dist/dev/hot-reload.js.map +1 -1
  6. package/dist/index.d.ts +0 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +34 -38
  9. package/dist/index.js.map +1 -1
  10. package/dist/layers/index.d.ts +1 -1
  11. package/dist/layers/index.d.ts.map +1 -1
  12. package/dist/layers/index.js +1 -1
  13. package/dist/layers/index.js.map +1 -1
  14. package/dist/services/code-analysis-service.d.ts.map +1 -1
  15. package/dist/services/code-analysis-service.js +4 -0
  16. package/dist/services/code-analysis-service.js.map +1 -1
  17. package/dist/services/knowledge-service.d.ts +21 -10
  18. package/dist/services/knowledge-service.d.ts.map +1 -1
  19. package/dist/services/knowledge-service.js +71 -54
  20. package/dist/services/knowledge-service.js.map +1 -1
  21. package/dist/services/multi-content-layer-service.d.ts +90 -0
  22. package/dist/services/multi-content-layer-service.d.ts.map +1 -1
  23. package/dist/services/multi-content-layer-service.js +380 -0
  24. package/dist/services/multi-content-layer-service.js.map +1 -1
  25. package/dist/services/workflow-service.d.ts +11 -3
  26. package/dist/services/workflow-service.d.ts.map +1 -1
  27. package/dist/services/workflow-service.js +119 -78
  28. package/dist/services/workflow-service.js.map +1 -1
  29. package/dist/streamlined-handlers.d.ts +31 -2
  30. package/dist/streamlined-handlers.d.ts.map +1 -1
  31. package/dist/streamlined-handlers.js +151 -109
  32. package/dist/streamlined-handlers.js.map +1 -1
  33. package/dist/streamlined-tools.d.ts +12 -0
  34. package/dist/streamlined-tools.d.ts.map +1 -1
  35. package/dist/streamlined-tools.js +11 -6
  36. package/dist/streamlined-tools.js.map +1 -1
  37. package/package.json +13 -4
  38. package/embedded-knowledge/.github/ISSUE_TEMPLATE/bug-report.md +0 -24
  39. package/embedded-knowledge/.github/ISSUE_TEMPLATE/content-improvement.md +0 -24
  40. package/embedded-knowledge/.github/ISSUE_TEMPLATE/knowledge-request.md +0 -30
  41. package/embedded-knowledge/AGENTS.md +0 -178
  42. package/embedded-knowledge/CONTRIBUTING.md +0 -58
  43. package/embedded-knowledge/LICENSE +0 -21
  44. package/embedded-knowledge/README.md +0 -32
  45. package/embedded-knowledge/domains/alex-architect/api-delegate-operation-pattern.md +0 -90
  46. package/embedded-knowledge/domains/alex-architect/api-fieldset-registration-pattern.md +0 -113
  47. package/embedded-knowledge/domains/alex-architect/api-interface-design-patterns.md +0 -101
  48. package/embedded-knowledge/domains/alex-architect/api-page-development-patterns.md +0 -87
  49. package/embedded-knowledge/domains/alex-architect/complex-facade-patterns.md +0 -155
  50. package/embedded-knowledge/domains/alex-architect/facade-pattern-al-implementation.md +0 -138
  51. package/embedded-knowledge/domains/alex-architect/facade-pattern-external-api.md +0 -79
  52. package/embedded-knowledge/domains/alex-architect/samples/api-delegate-operation.md +0 -280
  53. package/embedded-knowledge/domains/alex-architect/samples/api-fieldset-registration.md +0 -200
  54. package/embedded-knowledge/domains/alex-architect/samples/api-interface-design.md +0 -565
  55. package/embedded-knowledge/domains/alex-architect/samples/api-page-implementation.md +0 -665
  56. package/embedded-knowledge/domains/alex-architect/samples/complex-facade-patterns.md +0 -325
  57. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern-al.md +0 -696
  58. package/embedded-knowledge/domains/alex-architect/samples/facade-pattern.md +0 -320
  59. package/embedded-knowledge/domains/alex-architect/samples/subscriber-organization.md +0 -102
  60. package/embedded-knowledge/domains/alex-architect/samples/systemid-integration.md +0 -433
  61. package/embedded-knowledge/domains/alex-architect/subscriber-codeunit-size-optimization.md +0 -66
  62. package/embedded-knowledge/domains/alex-architect/systemid-integration.md +0 -115
  63. package/embedded-knowledge/domains/dean-debug/bc24-no-series-conversion-guide.md +0 -360
  64. package/embedded-knowledge/domains/dean-debug/case-statement-performance-best-practices.md +0 -86
  65. package/embedded-knowledge/domains/dean-debug/compound-statements-debugging.md +0 -96
  66. package/embedded-knowledge/domains/dean-debug/custom-dimensions-best-practices.md +0 -70
  67. package/embedded-knowledge/domains/dean-debug/custom-telemetry-implementation.md +0 -84
  68. package/embedded-knowledge/domains/dean-debug/deleteall-performance-tradeoff.md +0 -93
  69. package/embedded-knowledge/domains/dean-debug/deleteall-sql-performance.md +0 -73
  70. package/embedded-knowledge/domains/dean-debug/extension-telemetry-isolation.md +0 -78
  71. package/embedded-knowledge/domains/dean-debug/maintainsiftindex-property-behavior.md +0 -79
  72. package/embedded-knowledge/domains/dean-debug/no-series-implementation-patterns.md +0 -87
  73. package/embedded-knowledge/domains/dean-debug/no-series-module-patterns-bc24.md +0 -209
  74. package/embedded-knowledge/domains/dean-debug/no-series-validation-module-bc24.md +0 -246
  75. package/embedded-knowledge/domains/dean-debug/no-series-validation-patterns.md +0 -107
  76. package/embedded-knowledge/domains/dean-debug/odata-query-optimization.md +0 -105
  77. package/embedded-knowledge/domains/dean-debug/samples/bc24-no-series-conversion.md +0 -186
  78. package/embedded-knowledge/domains/dean-debug/samples/case-performance-optimization.md +0 -60
  79. package/embedded-knowledge/domains/dean-debug/samples/compound-statements-debugging.md +0 -139
  80. package/embedded-knowledge/domains/dean-debug/samples/custom-dimensions.md +0 -190
  81. package/embedded-knowledge/domains/dean-debug/samples/custom-telemetry.md +0 -516
  82. package/embedded-knowledge/domains/dean-debug/samples/deleteall-performance.md +0 -298
  83. package/embedded-knowledge/domains/dean-debug/samples/error-correlation.md +0 -324
  84. package/embedded-knowledge/domains/dean-debug/samples/extension-isolation.md +0 -344
  85. package/embedded-knowledge/domains/dean-debug/samples/logmessage-methods.md +0 -137
  86. package/embedded-knowledge/domains/dean-debug/samples/maintainsiftindex-examples.md +0 -340
  87. package/embedded-knowledge/domains/dean-debug/samples/no-series-implementation.md +0 -810
  88. package/embedded-knowledge/domains/dean-debug/samples/no-series-module-bc24.md +0 -86
  89. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation-module-bc24.md +0 -110
  90. package/embedded-knowledge/domains/dean-debug/samples/no-series-validation.md +0 -758
  91. package/embedded-knowledge/domains/dean-debug/samples/odata-query-optimization.md +0 -665
  92. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-case.md +0 -316
  93. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-before-filters.md +0 -223
  94. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-filter-exclusion.md +0 -149
  95. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-optimization.md +0 -412
  96. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-performance.md +0 -211
  97. package/embedded-knowledge/domains/dean-debug/samples/setloadfields-primary-key.md +0 -155
  98. package/embedded-knowledge/domains/dean-debug/samples/sift-technology-fundamentals.md +0 -475
  99. package/embedded-knowledge/domains/dean-debug/samples/singleinstance-subscribers.md +0 -238
  100. package/embedded-knowledge/domains/dean-debug/samples/table-event-batching.md +0 -97
  101. package/embedded-knowledge/domains/dean-debug/samples/table-key-requirements.md +0 -666
  102. package/embedded-knowledge/domains/dean-debug/samples/telemetry-performance.md +0 -319
  103. package/embedded-knowledge/domains/dean-debug/samples/verbosity-strategy.md +0 -236
  104. package/embedded-knowledge/domains/dean-debug/session-logmessage-methods.md +0 -59
  105. package/embedded-knowledge/domains/dean-debug/setloadfields-filter-field-exclusion.md +0 -67
  106. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-impact.md +0 -70
  107. package/embedded-knowledge/domains/dean-debug/setloadfields-performance-optimization.md +0 -90
  108. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-case-statements.md +0 -87
  109. package/embedded-knowledge/domains/dean-debug/setloadfields-placement-before-filters.md +0 -70
  110. package/embedded-knowledge/domains/dean-debug/setloadfields-primary-key-optimization.md +0 -74
  111. package/embedded-knowledge/domains/dean-debug/sift-technology-fundamentals.md +0 -81
  112. package/embedded-knowledge/domains/dean-debug/subscriber-singleinstance-performance.md +0 -56
  113. package/embedded-knowledge/domains/dean-debug/table-event-batch-operation-impact.md +0 -66
  114. package/embedded-knowledge/domains/dean-debug/table-key-requirements.md +0 -79
  115. package/embedded-knowledge/domains/dean-debug/telemetry-error-correlation.md +0 -78
  116. package/embedded-knowledge/domains/dean-debug/telemetry-performance-considerations.md +0 -83
  117. package/embedded-knowledge/domains/dean-debug/telemetry-verbosity-strategy.md +0 -76
  118. package/embedded-knowledge/domains/dean-debug/testfield-performance.md +0 -104
  119. package/embedded-knowledge/domains/eva-errors/fielderror-default-messages.md +0 -145
  120. package/embedded-knowledge/domains/eva-errors/fielderror-message-construction.md +0 -104
  121. package/embedded-knowledge/domains/eva-errors/fielderror-method-syntax.md +0 -114
  122. package/embedded-knowledge/domains/eva-errors/samples/fielderror-default-messages.md +0 -356
  123. package/embedded-knowledge/domains/eva-errors/samples/fielderror-syntax.md +0 -256
  124. package/embedded-knowledge/domains/eva-errors/samples/table-safety-validation-patterns.md +0 -101
  125. package/embedded-knowledge/domains/eva-errors/samples/testfield-error-handling.md +0 -108
  126. package/embedded-knowledge/domains/eva-errors/testfield-error-handling.md +0 -80
  127. package/embedded-knowledge/domains/jordan-bridge/al-event-subscriber-architecture.md +0 -98
  128. package/embedded-knowledge/domains/jordan-bridge/automatic-registration.md +0 -123
  129. package/embedded-knowledge/domains/jordan-bridge/business-process-template-patterns.md +0 -96
  130. package/embedded-knowledge/domains/jordan-bridge/error-response-patterns.md +0 -115
  131. package/embedded-knowledge/domains/jordan-bridge/etag-implementation.md +0 -115
  132. package/embedded-knowledge/domains/jordan-bridge/field-control-selection.md +0 -114
  133. package/embedded-knowledge/domains/jordan-bridge/samples/al-event-subscriber-architecture.md +0 -395
  134. package/embedded-knowledge/domains/jordan-bridge/samples/api-error-responses.md +0 -479
  135. package/embedded-knowledge/domains/jordan-bridge/samples/api-field-control.md +0 -548
  136. package/embedded-knowledge/domains/jordan-bridge/samples/api-url-naming.md +0 -287
  137. package/embedded-knowledge/domains/jordan-bridge/samples/business-process-templates.md +0 -434
  138. package/embedded-knowledge/domains/jordan-bridge/samples/etag-implementation.md +0 -508
  139. package/embedded-knowledge/domains/jordan-bridge/samples/task-scheduler-pattern.md +0 -615
  140. package/embedded-knowledge/domains/jordan-bridge/task-scheduler-pattern-implementation.md +0 -144
  141. package/embedded-knowledge/domains/jordan-bridge/url-structure-naming-patterns.md +0 -96
  142. package/embedded-knowledge/domains/maya-mentor/case-multiple-conditions-ranges.md +0 -124
  143. package/embedded-knowledge/domains/maya-mentor/case-statement-syntax-structure.md +0 -84
  144. package/embedded-knowledge/domains/maya-mentor/fielderror-syntax-usage.md +0 -75
  145. package/embedded-knowledge/domains/maya-mentor/fielderror-vs-testfield.md +0 -96
  146. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-multiple-conditions.md +0 -385
  147. package/embedded-knowledge/domains/maya-mentor/samples/case-statement-syntax-structure.md +0 -72
  148. package/embedded-knowledge/domains/maya-mentor/samples/fielderror-syntax-usage.md +0 -48
  149. package/embedded-knowledge/domains/maya-mentor/samples/testfield-basic-syntax.md +0 -49
  150. package/embedded-knowledge/domains/maya-mentor/testfield-basic-syntax.md +0 -67
  151. package/embedded-knowledge/domains/quinn-tester/fielderror-validation-patterns.md +0 -119
  152. package/embedded-knowledge/domains/quinn-tester/rule-execution.md +0 -123
  153. package/embedded-knowledge/domains/quinn-tester/samples/case-error-handling.md +0 -64
  154. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-message-construction.md +0 -60
  155. package/embedded-knowledge/domains/quinn-tester/samples/fielderror-validation-patterns.md +0 -83
  156. package/embedded-knowledge/domains/quinn-tester/samples/rule-execution.md +0 -716
  157. package/embedded-knowledge/domains/quinn-tester/samples/table-safety-validation-patterns.md +0 -101
  158. package/embedded-knowledge/domains/quinn-tester/samples/temporary-table-operation-validation.md +0 -91
  159. package/embedded-knowledge/domains/quinn-tester/table-safety-validation-patterns.md +0 -79
  160. package/embedded-knowledge/domains/quinn-tester/temporary-table-operation-validation.md +0 -79
  161. package/embedded-knowledge/domains/roger-reviewer/al-begin-end-block-structure.md +0 -89
  162. package/embedded-knowledge/domains/roger-reviewer/al-binary-operator-spacing.md +0 -76
  163. package/embedded-knowledge/domains/roger-reviewer/al-blank-line-organization.md +0 -76
  164. package/embedded-knowledge/domains/roger-reviewer/al-case-action-formatting.md +0 -76
  165. package/embedded-knowledge/domains/roger-reviewer/al-code-spacing-conventions.md +0 -81
  166. package/embedded-knowledge/domains/roger-reviewer/al-comment-spacing-standards.md +0 -76
  167. package/embedded-knowledge/domains/roger-reviewer/al-end-else-pairing.md +0 -75
  168. package/embedded-knowledge/domains/roger-reviewer/al-keyword-indentation-rules.md +0 -76
  169. package/embedded-knowledge/domains/roger-reviewer/al-line-start-keyword-positioning.md +0 -76
  170. package/embedded-knowledge/domains/roger-reviewer/al-separate-if-else-formatting.md +0 -76
  171. package/embedded-knowledge/domains/roger-reviewer/al-standard-abbreviations.md +0 -96
  172. package/embedded-knowledge/domains/roger-reviewer/al-statement-per-line-rule.md +0 -76
  173. package/embedded-knowledge/domains/roger-reviewer/al-unnecessary-else-elimination.md +0 -86
  174. package/embedded-knowledge/domains/roger-reviewer/al-variable-declaration-order.md +0 -90
  175. package/embedded-knowledge/domains/roger-reviewer/al-variable-naming-conventions.md +0 -82
  176. package/embedded-knowledge/domains/roger-reviewer/begin-block-statement-clarity.md +0 -78
  177. package/embedded-knowledge/domains/roger-reviewer/begin-end-positioning-patterns.md +0 -76
  178. package/embedded-knowledge/domains/roger-reviewer/binary-operator-line-positioning.md +0 -78
  179. package/embedded-knowledge/domains/roger-reviewer/boolean-expression-simplification-al.md +0 -100
  180. package/embedded-knowledge/domains/roger-reviewer/case-statement-error-handling-troubleshooting.md +0 -115
  181. package/embedded-knowledge/domains/roger-reviewer/compound-statement-readability.md +0 -124
  182. package/embedded-knowledge/domains/roger-reviewer/lonely-repeat-statement-pattern.md +0 -110
  183. package/embedded-knowledge/domains/roger-reviewer/samples/al-begin-end-blocks.md +0 -438
  184. package/embedded-knowledge/domains/roger-reviewer/samples/al-binary-operator-spacing.md +0 -255
  185. package/embedded-knowledge/domains/roger-reviewer/samples/al-comment-spacing-standards.md +0 -209
  186. package/embedded-knowledge/domains/roger-reviewer/samples/al-keyword-indentation-rules.md +0 -218
  187. package/embedded-knowledge/domains/roger-reviewer/samples/al-line-start-keyword-positioning.md +0 -218
  188. package/embedded-knowledge/domains/roger-reviewer/samples/al-separate-if-else-formatting.md +0 -280
  189. package/embedded-knowledge/domains/roger-reviewer/samples/al-statement-per-line-rule.md +0 -188
  190. package/embedded-knowledge/domains/roger-reviewer/samples/al-unnecessary-else-elimination.md +0 -245
  191. package/embedded-knowledge/domains/roger-reviewer/samples/al-variable-declaration-order.md +0 -244
  192. package/embedded-knowledge/domains/roger-reviewer/samples/begin-end-positioning.md +0 -278
  193. package/embedded-knowledge/domains/roger-reviewer/samples/boolean-simplification-examples.md +0 -484
  194. package/embedded-knowledge/domains/roger-reviewer/samples/case-error-handling.md +0 -64
  195. package/embedded-knowledge/domains/roger-reviewer/samples/compound-statement-readability.md +0 -107
  196. package/embedded-knowledge/domains/roger-reviewer/samples/lonely-repeat-examples.md +0 -280
  197. package/embedded-knowledge/domains/sam-coder/al-formatting-consistency-patterns.md +0 -75
  198. package/embedded-knowledge/domains/sam-coder/al-line-comment-formatting.md +0 -67
  199. package/embedded-knowledge/domains/sam-coder/al-lonely-repeat-pattern.md +0 -76
  200. package/embedded-knowledge/domains/sam-coder/al-named-parameter-pattern.md +0 -98
  201. package/embedded-knowledge/domains/sam-coder/al-object-navigation-shortcuts.md +0 -128
  202. package/embedded-knowledge/domains/sam-coder/al-readability-optimization.md +0 -75
  203. package/embedded-knowledge/domains/sam-coder/al-record-find-early-exit.md +0 -95
  204. package/embedded-knowledge/domains/sam-coder/command-queue-pattern-al.md +0 -141
  205. package/embedded-knowledge/domains/sam-coder/deleteall-alternative-implementation.md +0 -91
  206. package/embedded-knowledge/domains/sam-coder/deleteall-method-usage.md +0 -118
  207. package/embedded-knowledge/domains/sam-coder/deleteall-trigger-execution.md +0 -111
  208. package/embedded-knowledge/domains/sam-coder/event-bridge-pattern-al.md +0 -113
  209. package/embedded-knowledge/domains/sam-coder/event-payload-design-patterns.md +0 -127
  210. package/embedded-knowledge/domains/sam-coder/generic-method-patterns-al.md +0 -141
  211. package/embedded-knowledge/domains/sam-coder/manual-binding-conditional-subscribers.md +0 -66
  212. package/embedded-knowledge/domains/sam-coder/nested-compound-best-practices.md +0 -96
  213. package/embedded-knowledge/domains/sam-coder/samples/al-blank-line-organization.md +0 -161
  214. package/embedded-knowledge/domains/sam-coder/samples/al-case-action-formatting.md +0 -177
  215. package/embedded-knowledge/domains/sam-coder/samples/al-lonely-repeat-pattern.md +0 -239
  216. package/embedded-knowledge/domains/sam-coder/samples/al-named-parameter-pattern.md +0 -346
  217. package/embedded-knowledge/domains/sam-coder/samples/al-record-find-early-exit.md +0 -298
  218. package/embedded-knowledge/domains/sam-coder/samples/command-queue-pattern.md +0 -677
  219. package/embedded-knowledge/domains/sam-coder/samples/deleteall-alternative-implementation.md +0 -117
  220. package/embedded-knowledge/domains/sam-coder/samples/deleteall-triggers.md +0 -75
  221. package/embedded-knowledge/domains/sam-coder/samples/deleteall-usage.md +0 -169
  222. package/embedded-knowledge/domains/sam-coder/samples/event-bridge-pattern.md +0 -399
  223. package/embedded-knowledge/domains/sam-coder/samples/event-payload-design.md +0 -356
  224. package/embedded-knowledge/domains/sam-coder/samples/generic-method-patterns.md +0 -889
  225. package/embedded-knowledge/domains/sam-coder/samples/manual-binding.md +0 -84
  226. package/embedded-knowledge/domains/sam-coder/samples/nested-compound-best-practices.md +0 -127
  227. package/embedded-knowledge/domains/sam-coder/samples/single-to-compound-conversion.md +0 -89
  228. package/embedded-knowledge/domains/sam-coder/samples/template-method-pattern.md +0 -516
  229. package/embedded-knowledge/domains/sam-coder/samples/testfield-patterns.md +0 -61
  230. package/embedded-knowledge/domains/sam-coder/samples/type-safe-operations.md +0 -427
  231. package/embedded-knowledge/domains/sam-coder/single-to-compound-conversion.md +0 -122
  232. package/embedded-knowledge/domains/sam-coder/template-method-pattern-al.md +0 -96
  233. package/embedded-knowledge/domains/sam-coder/testfield-patterns.md +0 -101
  234. package/embedded-knowledge/domains/sam-coder/type-safe-operations-al.md +0 -149
  235. package/embedded-knowledge/domains/sam-coder/vs-code-al-keyboard-shortcuts.md +0 -107
  236. package/embedded-knowledge/domains/seth-security/al-temporary-table-safety.md +0 -95
  237. package/embedded-knowledge/domains/seth-security/api-permission-model.md +0 -115
  238. package/embedded-knowledge/domains/seth-security/istemporary-safeguard-pattern.md +0 -78
  239. package/embedded-knowledge/domains/seth-security/samples/al-temporary-table-safety.md +0 -373
  240. package/embedded-knowledge/domains/seth-security/samples/api-permission-model.md +0 -308
  241. package/embedded-knowledge/domains/shared/al-file-naming-conventions.md +0 -146
  242. package/embedded-knowledge/domains/taylor-docs/al-xml-documentation-structure.md +0 -79
  243. package/embedded-knowledge/domains/uma-ux/bc-action-shortcuts-syntax.md +0 -78
  244. package/embedded-knowledge/domains/uma-ux/shortcut-key-user-experience-design.md +0 -81
  245. package/embedded-knowledge/indexes/bc-version-matrix.json +0 -188
  246. package/embedded-knowledge/indexes/domain-catalog.json +0 -106
  247. package/embedded-knowledge/indexes/tags/abbreviations.json +0 -1
  248. package/embedded-knowledge/indexes/tags/abstraction.json +0 -1
  249. package/embedded-knowledge/indexes/tags/access-control.json +0 -1
  250. package/embedded-knowledge/indexes/tags/accessibility.json +0 -1
  251. package/embedded-knowledge/indexes/tags/actions.json +0 -1
  252. package/embedded-knowledge/indexes/tags/advanced-patterns.json +0 -1
  253. package/embedded-knowledge/indexes/tags/advanced.json +0 -1
  254. package/embedded-knowledge/indexes/tags/al-extension.json +0 -1
  255. package/embedded-knowledge/indexes/tags/al-generics.json +0 -1
  256. package/embedded-knowledge/indexes/tags/al-objects.json +0 -1
  257. package/embedded-knowledge/indexes/tags/al-syntax.json +0 -1
  258. package/embedded-knowledge/indexes/tags/algorithm-structure.json +0 -1
  259. package/embedded-knowledge/indexes/tags/alternatives.json +0 -1
  260. package/embedded-knowledge/indexes/tags/analytics.json +0 -1
  261. package/embedded-knowledge/indexes/tags/api-delegates.json +0 -1
  262. package/embedded-knowledge/indexes/tags/api-design.json +0 -1
  263. package/embedded-knowledge/indexes/tags/api-documentation.json +0 -1
  264. package/embedded-knowledge/indexes/tags/api-endpoints.json +0 -1
  265. package/embedded-knowledge/indexes/tags/api-extensibility.json +0 -1
  266. package/embedded-knowledge/indexes/tags/api-fieldsets.json +0 -1
  267. package/embedded-knowledge/indexes/tags/api-integration.json +0 -1
  268. package/embedded-knowledge/indexes/tags/api-interfaces.json +0 -1
  269. package/embedded-knowledge/indexes/tags/api-optimization.json +0 -1
  270. package/embedded-knowledge/indexes/tags/api-pages.json +0 -1
  271. package/embedded-knowledge/indexes/tags/api-patterns.json +0 -1
  272. package/embedded-knowledge/indexes/tags/api-permissions.json +0 -1
  273. package/embedded-knowledge/indexes/tags/api-responses.json +0 -1
  274. package/embedded-knowledge/indexes/tags/api-simplification.json +0 -1
  275. package/embedded-knowledge/indexes/tags/api.json +0 -1
  276. package/embedded-knowledge/indexes/tags/architecture.json +0 -1
  277. package/embedded-knowledge/indexes/tags/async-patterns.json +0 -1
  278. package/embedded-knowledge/indexes/tags/async-processing.json +0 -1
  279. package/embedded-knowledge/indexes/tags/automatic-registration.json +0 -1
  280. package/embedded-knowledge/indexes/tags/batch-operations.json +0 -1
  281. package/embedded-knowledge/indexes/tags/bc24-migration.json +0 -1
  282. package/embedded-knowledge/indexes/tags/begin-blocks.json +0 -1
  283. package/embedded-knowledge/indexes/tags/begin-end.json +0 -1
  284. package/embedded-knowledge/indexes/tags/behavioral-patterns.json +0 -1
  285. package/embedded-knowledge/indexes/tags/best-practices.json +0 -1
  286. package/embedded-knowledge/indexes/tags/binding.json +0 -1
  287. package/embedded-knowledge/indexes/tags/block-structure.json +0 -1
  288. package/embedded-knowledge/indexes/tags/blocks.json +0 -1
  289. package/embedded-knowledge/indexes/tags/boolean-expressions.json +0 -1
  290. package/embedded-knowledge/indexes/tags/branching.json +0 -1
  291. package/embedded-knowledge/indexes/tags/breaking-changes.json +0 -1
  292. package/embedded-knowledge/indexes/tags/breakpoints.json +0 -1
  293. package/embedded-knowledge/indexes/tags/business-foundation.json +0 -1
  294. package/embedded-knowledge/indexes/tags/business-infrastructure.json +0 -1
  295. package/embedded-knowledge/indexes/tags/business-process.json +0 -1
  296. package/embedded-knowledge/indexes/tags/business-rules.json +0 -1
  297. package/embedded-knowledge/indexes/tags/caching.json +0 -1
  298. package/embedded-knowledge/indexes/tags/case-statements.json +0 -1
  299. package/embedded-knowledge/indexes/tags/case.json +0 -1
  300. package/embedded-knowledge/indexes/tags/code-analysis.json +0 -1
  301. package/embedded-knowledge/indexes/tags/code-clarity.json +0 -1
  302. package/embedded-knowledge/indexes/tags/code-comprehension.json +0 -1
  303. package/embedded-knowledge/indexes/tags/code-conversion.json +0 -1
  304. package/embedded-knowledge/indexes/tags/code-formatting.json +0 -1
  305. package/embedded-knowledge/indexes/tags/code-organization.json +0 -1
  306. package/embedded-knowledge/indexes/tags/code-patterns.json +0 -1
  307. package/embedded-knowledge/indexes/tags/code-quality.json +0 -1
  308. package/embedded-knowledge/indexes/tags/code-reuse.json +0 -1
  309. package/embedded-knowledge/indexes/tags/code-simplification.json +0 -1
  310. package/embedded-knowledge/indexes/tags/code-standards.json +0 -1
  311. package/embedded-knowledge/indexes/tags/code-structure.json +0 -1
  312. package/embedded-knowledge/indexes/tags/code-style.json +0 -1
  313. package/embedded-knowledge/indexes/tags/codeunit-design.json +0 -1
  314. package/embedded-knowledge/indexes/tags/command-queue.json +0 -1
  315. package/embedded-knowledge/indexes/tags/comments.json +0 -1
  316. package/embedded-knowledge/indexes/tags/compile-time-validation.json +0 -1
  317. package/embedded-knowledge/indexes/tags/complex-facade.json +0 -1
  318. package/embedded-knowledge/indexes/tags/complexity-hiding.json +0 -1
  319. package/embedded-knowledge/indexes/tags/complexity-management.json +0 -1
  320. package/embedded-knowledge/indexes/tags/compound-statements.json +0 -1
  321. package/embedded-knowledge/indexes/tags/concurrency.json +0 -1
  322. package/embedded-knowledge/indexes/tags/conditional-logic.json +0 -1
  323. package/embedded-knowledge/indexes/tags/conditional.json +0 -1
  324. package/embedded-knowledge/indexes/tags/conflict-resolution.json +0 -1
  325. package/embedded-knowledge/indexes/tags/consistency.json +0 -1
  326. package/embedded-knowledge/indexes/tags/contract-design.json +0 -1
  327. package/embedded-knowledge/indexes/tags/control-flow.json +0 -1
  328. package/embedded-knowledge/indexes/tags/conversion-guide.json +0 -1
  329. package/embedded-knowledge/indexes/tags/correlation.json +0 -1
  330. package/embedded-knowledge/indexes/tags/custom-messages.json +0 -1
  331. package/embedded-knowledge/indexes/tags/data-access.json +0 -1
  332. package/embedded-knowledge/indexes/tags/data-exposure.json +0 -1
  333. package/embedded-knowledge/indexes/tags/data-integrity.json +0 -1
  334. package/embedded-knowledge/indexes/tags/data-loading.json +0 -1
  335. package/embedded-knowledge/indexes/tags/data-manipulation.json +0 -1
  336. package/embedded-knowledge/indexes/tags/data-modeling.json +0 -1
  337. package/embedded-knowledge/indexes/tags/data-patterns.json +0 -1
  338. package/embedded-knowledge/indexes/tags/data-protection.json +0 -1
  339. package/embedded-knowledge/indexes/tags/data-validation.json +0 -1
  340. package/embedded-knowledge/indexes/tags/database.json +0 -1
  341. package/embedded-knowledge/indexes/tags/debugging.json +0 -1
  342. package/embedded-knowledge/indexes/tags/decision-making.json +0 -1
  343. package/embedded-knowledge/indexes/tags/declaration.json +0 -1
  344. package/embedded-knowledge/indexes/tags/default-messages.json +0 -1
  345. package/embedded-knowledge/indexes/tags/defensive-programming.json +0 -1
  346. package/embedded-knowledge/indexes/tags/deleteall.json +0 -1
  347. package/embedded-knowledge/indexes/tags/dependencies.json +0 -1
  348. package/embedded-knowledge/indexes/tags/deployment.json +0 -1
  349. package/embedded-knowledge/indexes/tags/developer-productivity.json +0 -1
  350. package/embedded-knowledge/indexes/tags/development-workflow.json +0 -1
  351. package/embedded-knowledge/indexes/tags/diagnostics.json +0 -1
  352. package/embedded-knowledge/indexes/tags/dimensions.json +0 -1
  353. package/embedded-knowledge/indexes/tags/documentation.json +0 -1
  354. package/embedded-knowledge/indexes/tags/early-exit.json +0 -1
  355. package/embedded-knowledge/indexes/tags/else-clauses.json +0 -1
  356. package/embedded-knowledge/indexes/tags/end-statements.json +0 -1
  357. package/embedded-knowledge/indexes/tags/enterprise-patterns.json +0 -1
  358. package/embedded-knowledge/indexes/tags/entity-relationships.json +0 -1
  359. package/embedded-knowledge/indexes/tags/error-handling.json +0 -1
  360. package/embedded-knowledge/indexes/tags/error-messages.json +0 -1
  361. package/embedded-knowledge/indexes/tags/error-prevention.json +0 -1
  362. package/embedded-knowledge/indexes/tags/error-text.json +0 -1
  363. package/embedded-knowledge/indexes/tags/etag.json +0 -1
  364. package/embedded-knowledge/indexes/tags/event-bridge.json +0 -1
  365. package/embedded-knowledge/indexes/tags/event-payload.json +0 -1
  366. package/embedded-knowledge/indexes/tags/event-routing.json +0 -1
  367. package/embedded-knowledge/indexes/tags/events.json +0 -1
  368. package/embedded-knowledge/indexes/tags/execution-flow.json +0 -1
  369. package/embedded-knowledge/indexes/tags/expressions.json +0 -1
  370. package/embedded-knowledge/indexes/tags/extensibility.json +0 -1
  371. package/embedded-knowledge/indexes/tags/extensions.json +0 -1
  372. package/embedded-knowledge/indexes/tags/facade-composition.json +0 -1
  373. package/embedded-knowledge/indexes/tags/facade-pattern.json +0 -1
  374. package/embedded-knowledge/indexes/tags/field-control.json +0 -1
  375. package/embedded-knowledge/indexes/tags/field-exclusion.json +0 -1
  376. package/embedded-knowledge/indexes/tags/field-registration.json +0 -1
  377. package/embedded-knowledge/indexes/tags/field-state.json +0 -1
  378. package/embedded-knowledge/indexes/tags/field-validation.json +0 -1
  379. package/embedded-knowledge/indexes/tags/fielderror.json +0 -1
  380. package/embedded-knowledge/indexes/tags/fields.json +0 -1
  381. package/embedded-knowledge/indexes/tags/filtering.json +0 -1
  382. package/embedded-knowledge/indexes/tags/filters.json +0 -1
  383. package/embedded-knowledge/indexes/tags/formatting.json +0 -1
  384. package/embedded-knowledge/indexes/tags/generic-methods.json +0 -1
  385. package/embedded-knowledge/indexes/tags/http-status.json +0 -1
  386. package/embedded-knowledge/indexes/tags/if-statements.json +0 -1
  387. package/embedded-knowledge/indexes/tags/implementation.json +0 -1
  388. package/embedded-knowledge/indexes/tags/indentation.json +0 -1
  389. package/embedded-knowledge/indexes/tags/index-summary.json +0 -277
  390. package/embedded-knowledge/indexes/tags/indexing.json +0 -1
  391. package/embedded-knowledge/indexes/tags/inheritance.json +0 -1
  392. package/embedded-knowledge/indexes/tags/integration.json +0 -1
  393. package/embedded-knowledge/indexes/tags/integrity-checking.json +0 -1
  394. package/embedded-knowledge/indexes/tags/intellisense.json +0 -1
  395. package/embedded-knowledge/indexes/tags/interface-design.json +0 -1
  396. package/embedded-knowledge/indexes/tags/interface-segregation.json +0 -1
  397. package/embedded-knowledge/indexes/tags/isolation.json +0 -1
  398. package/embedded-knowledge/indexes/tags/job-processing.json +0 -1
  399. package/embedded-knowledge/indexes/tags/keyboard-navigation.json +0 -1
  400. package/embedded-knowledge/indexes/tags/keywords.json +0 -1
  401. package/embedded-knowledge/indexes/tags/legacy-modernization.json +0 -1
  402. package/embedded-knowledge/indexes/tags/line-breaks.json +0 -1
  403. package/embedded-knowledge/indexes/tags/line-organization.json +0 -1
  404. package/embedded-knowledge/indexes/tags/line-positioning.json +0 -1
  405. package/embedded-knowledge/indexes/tags/localization.json +0 -1
  406. package/embedded-knowledge/indexes/tags/logging.json +0 -1
  407. package/embedded-knowledge/indexes/tags/loose-coupling.json +0 -1
  408. package/embedded-knowledge/indexes/tags/maintainability.json +0 -1
  409. package/embedded-knowledge/indexes/tags/memory-management.json +0 -1
  410. package/embedded-knowledge/indexes/tags/memory-optimization.json +0 -1
  411. package/embedded-knowledge/indexes/tags/memory.json +0 -1
  412. package/embedded-knowledge/indexes/tags/message-design.json +0 -1
  413. package/embedded-knowledge/indexes/tags/message-formatting.json +0 -1
  414. package/embedded-knowledge/indexes/tags/message-patterns.json +0 -1
  415. package/embedded-knowledge/indexes/tags/metadata-driven.json +0 -1
  416. package/embedded-knowledge/indexes/tags/method-comparison.json +0 -1
  417. package/embedded-knowledge/indexes/tags/module-architecture.json +0 -1
  418. package/embedded-knowledge/indexes/tags/module-validation.json +0 -1
  419. package/embedded-knowledge/indexes/tags/monitoring.json +0 -1
  420. package/embedded-knowledge/indexes/tags/multi-layer-facade.json +0 -1
  421. package/embedded-knowledge/indexes/tags/multi-tenancy.json +0 -1
  422. package/embedded-knowledge/indexes/tags/multiple-values.json +0 -1
  423. package/embedded-knowledge/indexes/tags/naming-conventions.json +0 -1
  424. package/embedded-knowledge/indexes/tags/naming.json +0 -1
  425. package/embedded-knowledge/indexes/tags/navigation.json +0 -1
  426. package/embedded-knowledge/indexes/tags/nested-statements.json +0 -1
  427. package/embedded-knowledge/indexes/tags/no-series-conversion.json +0 -1
  428. package/embedded-knowledge/indexes/tags/no-series-validation.json +0 -1
  429. package/embedded-knowledge/indexes/tags/no-series.json +0 -1
  430. package/embedded-knowledge/indexes/tags/number-generation.json +0 -1
  431. package/embedded-knowledge/indexes/tags/object-documentation.json +0 -1
  432. package/embedded-knowledge/indexes/tags/odata.json +0 -1
  433. package/embedded-knowledge/indexes/tags/ondelete.json +0 -1
  434. package/embedded-knowledge/indexes/tags/onvalidate.json +0 -1
  435. package/embedded-knowledge/indexes/tags/operation-delegation.json +0 -1
  436. package/embedded-knowledge/indexes/tags/operation-safety.json +0 -1
  437. package/embedded-knowledge/indexes/tags/operators.json +0 -1
  438. package/embedded-knowledge/indexes/tags/optimization.json +0 -1
  439. package/embedded-knowledge/indexes/tags/order.json +0 -1
  440. package/embedded-knowledge/indexes/tags/organization.json +0 -1
  441. package/embedded-knowledge/indexes/tags/pages.json +0 -1
  442. package/embedded-knowledge/indexes/tags/parameters.json +0 -1
  443. package/embedded-knowledge/indexes/tags/patterns.json +0 -1
  444. package/embedded-knowledge/indexes/tags/performance-optimization.json +0 -1
  445. package/embedded-knowledge/indexes/tags/performance.json +0 -1
  446. package/embedded-knowledge/indexes/tags/placement.json +0 -1
  447. package/embedded-knowledge/indexes/tags/posting-codeunits.json +0 -1
  448. package/embedded-knowledge/indexes/tags/posting.json +0 -1
  449. package/embedded-knowledge/indexes/tags/preconditions.json +0 -1
  450. package/embedded-knowledge/indexes/tags/primary-key.json +0 -1
  451. package/embedded-knowledge/indexes/tags/privacy.json +0 -1
  452. package/embedded-knowledge/indexes/tags/process-automation.json +0 -1
  453. package/embedded-knowledge/indexes/tags/production.json +0 -1
  454. package/embedded-knowledge/indexes/tags/productivity.json +0 -1
  455. package/embedded-knowledge/indexes/tags/query-performance.json +0 -1
  456. package/embedded-knowledge/indexes/tags/queue-management.json +0 -1
  457. package/embedded-knowledge/indexes/tags/ranges.json +0 -1
  458. package/embedded-knowledge/indexes/tags/readability.json +0 -1
  459. package/embedded-knowledge/indexes/tags/record-access.json +0 -1
  460. package/embedded-knowledge/indexes/tags/record-methods.json +0 -1
  461. package/embedded-knowledge/indexes/tags/refactoring.json +0 -1
  462. package/embedded-knowledge/indexes/tags/reference.json +0 -1
  463. package/embedded-knowledge/indexes/tags/repeat-loops.json +0 -1
  464. package/embedded-knowledge/indexes/tags/repeat-statement.json +0 -1
  465. package/embedded-knowledge/indexes/tags/runtime-errors.json +0 -1
  466. package/embedded-knowledge/indexes/tags/runtime.json +0 -1
  467. package/embedded-knowledge/indexes/tags/safeguards.json +0 -1
  468. package/embedded-knowledge/indexes/tags/security.json +0 -1
  469. package/embedded-knowledge/indexes/tags/sequence-management.json +0 -1
  470. package/embedded-knowledge/indexes/tags/serialization.json +0 -1
  471. package/embedded-knowledge/indexes/tags/session-logmessage.json +0 -1
  472. package/embedded-knowledge/indexes/tags/session.json +0 -1
  473. package/embedded-knowledge/indexes/tags/setloadfields.json +0 -1
  474. package/embedded-knowledge/indexes/tags/shortcuts.json +0 -1
  475. package/embedded-knowledge/indexes/tags/sift.json +0 -1
  476. package/embedded-knowledge/indexes/tags/singleinstance.json +0 -1
  477. package/embedded-knowledge/indexes/tags/spacing.json +0 -1
  478. package/embedded-knowledge/indexes/tags/sql-translation.json +0 -1
  479. package/embedded-knowledge/indexes/tags/standards.json +0 -1
  480. package/embedded-knowledge/indexes/tags/statements.json +0 -1
  481. package/embedded-knowledge/indexes/tags/streaming.json +0 -1
  482. package/embedded-knowledge/indexes/tags/strong-typing.json +0 -1
  483. package/embedded-knowledge/indexes/tags/structural-patterns.json +0 -1
  484. package/embedded-knowledge/indexes/tags/structure.json +0 -1
  485. package/embedded-knowledge/indexes/tags/subscribers.json +0 -1
  486. package/embedded-knowledge/indexes/tags/switch.json +0 -1
  487. package/embedded-knowledge/indexes/tags/symbol-search.json +0 -1
  488. package/embedded-knowledge/indexes/tags/syntax.json +0 -1
  489. package/embedded-knowledge/indexes/tags/systemid.json +0 -1
  490. package/embedded-knowledge/indexes/tags/table-configuration.json +0 -1
  491. package/embedded-knowledge/indexes/tags/table-events.json +0 -1
  492. package/embedded-knowledge/indexes/tags/table-keys.json +0 -1
  493. package/embedded-knowledge/indexes/tags/table-safety.json +0 -1
  494. package/embedded-knowledge/indexes/tags/task-scheduler.json +0 -1
  495. package/embedded-knowledge/indexes/tags/telemetry.json +0 -1
  496. package/embedded-knowledge/indexes/tags/template-method.json +0 -1
  497. package/embedded-knowledge/indexes/tags/temporary-tables.json +0 -1
  498. package/embedded-knowledge/indexes/tags/testfield.json +0 -1
  499. package/embedded-knowledge/indexes/tags/tradeoffs.json +0 -1
  500. package/embedded-knowledge/indexes/tags/triggers.json +0 -1
  501. package/embedded-knowledge/indexes/tags/troubleshooting.json +0 -1
  502. package/embedded-knowledge/indexes/tags/type-safety.json +0 -1
  503. package/embedded-knowledge/indexes/tags/url-structure.json +0 -1
  504. package/embedded-knowledge/indexes/tags/user-experience.json +0 -1
  505. package/embedded-knowledge/indexes/tags/user-feedback.json +0 -1
  506. package/embedded-knowledge/indexes/tags/user-interface.json +0 -1
  507. package/embedded-knowledge/indexes/tags/validation-feedback.json +0 -1
  508. package/embedded-knowledge/indexes/tags/validation.json +0 -1
  509. package/embedded-knowledge/indexes/tags/variables.json +0 -1
  510. package/embedded-knowledge/indexes/tags/verbosity.json +0 -1
  511. package/embedded-knowledge/indexes/tags/vs-code.json +0 -1
  512. package/embedded-knowledge/indexes/tags/web-services.json +0 -1
  513. package/embedded-knowledge/indexes/tags/workflow-management.json +0 -1
  514. package/embedded-knowledge/indexes/tags/workflow-optimization.json +0 -1
  515. package/embedded-knowledge/indexes/tags/workflow-templates.json +0 -1
  516. package/embedded-knowledge/indexes/tags/workspace.json +0 -1
  517. package/embedded-knowledge/indexes/tags/xml-documentation.json +0 -1
  518. package/embedded-knowledge/indexes/topic-relationships.json +0 -128
  519. package/embedded-knowledge/methodologies/index.json +0 -81
  520. package/embedded-knowledge/methodologies/phases/analysis-full.md +0 -208
  521. package/embedded-knowledge/methodologies/phases/analysis-quick.md +0 -44
  522. package/embedded-knowledge/methodologies/phases/analysis.md +0 -182
  523. package/embedded-knowledge/methodologies/phases/execution-validation-full.md +0 -174
  524. package/embedded-knowledge/methodologies/phases/execution-validation-quick.md +0 -31
  525. package/embedded-knowledge/methodologies/phases/execution-validation.md +0 -174
  526. package/embedded-knowledge/methodologies/phases/performance-full.md +0 -211
  527. package/embedded-knowledge/methodologies/phases/performance-quick.md +0 -32
  528. package/embedded-knowledge/methodologies/phases/performance.md +0 -211
  529. package/embedded-knowledge/methodologies/phases/verification-full.md +0 -162
  530. package/embedded-knowledge/methodologies/phases/verification-quick.md +0 -48
  531. package/embedded-knowledge/methodologies/phases/verification.md +0 -146
  532. package/embedded-knowledge/methodologies/workflow-enforcement.md +0 -142
  533. package/embedded-knowledge/methodologies/workflows/code-review-workflow.md +0 -99
  534. package/embedded-knowledge/specialists/alex-architect.md +0 -216
  535. package/embedded-knowledge/specialists/casey-copilot.md +0 -226
  536. package/embedded-knowledge/specialists/chris-config.md +0 -267
  537. package/embedded-knowledge/specialists/dean-debug.md +0 -222
  538. package/embedded-knowledge/specialists/eva-errors.md +0 -235
  539. package/embedded-knowledge/specialists/jordan-bridge.md +0 -235
  540. package/embedded-knowledge/specialists/logan-legacy.md +0 -209
  541. package/embedded-knowledge/specialists/maya-mentor.md +0 -211
  542. package/embedded-knowledge/specialists/morgan-market.md +0 -226
  543. package/embedded-knowledge/specialists/quinn-tester.md +0 -235
  544. package/embedded-knowledge/specialists/roger-reviewer.md +0 -234
  545. package/embedded-knowledge/specialists/sam-coder.md +0 -359
  546. package/embedded-knowledge/specialists/seth-security.md +0 -235
  547. package/embedded-knowledge/specialists/taylor-docs.md +0 -257
  548. package/embedded-knowledge/specialists/uma-ux.md +0 -235
@@ -1,373 +0,0 @@
1
- # Temporary Table Safety - AL Code Examples
2
-
3
- ## Good Examples
4
-
5
- ### Secure Temporary Table with Cleanup
6
- ```al
7
- procedure ProcessSensitiveCustomerData(CustomerFilter: Text): Boolean
8
- var
9
- Customer: Record Customer;
10
- TempCustomerBuffer: Record Customer temporary;
11
- ProcessingResult: Boolean;
12
- begin
13
- // Validate user permissions before populating temporary table
14
- if not UserPermissions.CanViewCustomerData() then
15
- exit(false);
16
-
17
- Customer.SetFilter("No.", CustomerFilter);
18
- if not Customer.FindSet() then
19
- exit(false);
20
-
21
- try
22
- // Populate temporary table with filtered data
23
- repeat
24
- // Only include data user has permission to see
25
- if UserPermissions.CanViewCustomer(Customer."No.") then begin
26
- TempCustomerBuffer := Customer;
27
- TempCustomerBuffer.Insert();
28
- end;
29
- until Customer.Next() = 0;
30
-
31
- // Process temporary data
32
- ProcessingResult := ProcessCustomerBuffer(TempCustomerBuffer);
33
-
34
- finally
35
- // Always clear sensitive temporary data
36
- TempCustomerBuffer.DeleteAll();
37
- end;
38
-
39
- exit(ProcessingResult);
40
- end;
41
- ```
42
-
43
- ### Permission-Aware Temporary Processing
44
- ```al
45
- procedure GenerateCustomerReport(CustomerNo: Code[20]): Text
46
- var
47
- Customer: Record Customer;
48
- CustLedgerEntry: Record "Cust. Ledger Entry";
49
- TempReportBuffer: Record "Name/Value Buffer" temporary;
50
- ReportText: Text;
51
- begin
52
- // Early permission validation
53
- if not Customer.ReadPermission then
54
- exit('Access Denied');
55
-
56
- if not Customer.Get(CustomerNo) then
57
- exit('Customer Not Found');
58
-
59
- // Verify specific customer access
60
- if not UserPermissions.CanViewCustomer(CustomerNo) then
61
- exit('Access Denied');
62
-
63
- try
64
- // Build temporary report data with permission checks
65
- TempReportBuffer.Init();
66
- TempReportBuffer.Name := 'Customer Name';
67
- TempReportBuffer.Value := Customer.Name;
68
- TempReportBuffer.Insert();
69
-
70
- // Only include financial data if user has permission
71
- if CustLedgerEntry.ReadPermission and UserPermissions.CanViewFinancialData() then begin
72
- CustLedgerEntry.SetRange("Customer No.", CustomerNo);
73
- CustLedgerEntry.CalcSums("Remaining Amt. (LCY)");
74
-
75
- TempReportBuffer.Init();
76
- TempReportBuffer.Name := 'Outstanding Amount';
77
- TempReportBuffer.Value := Format(CustLedgerEntry."Remaining Amt. (LCY)");
78
- TempReportBuffer.Insert();
79
- end;
80
-
81
- // Generate report from temporary data
82
- ReportText := BuildReportFromBuffer(TempReportBuffer);
83
-
84
- finally
85
- // Always clear temporary data containing sensitive information
86
- TempReportBuffer.DeleteAll();
87
- end;
88
-
89
- exit(ReportText);
90
- end;
91
- ```
92
-
93
- ### Scoped Temporary Table Processing
94
- ```al
95
- procedure CalculateItemProfitability(ItemFilter: Text): Decimal
96
- var
97
- Item: Record Item;
98
- ItemLedgerEntry: Record "Item Ledger Entry";
99
- TempProfitBuffer: Record "Integer" temporary;
100
- TotalProfit: Decimal;
101
- LineNo: Integer;
102
- begin
103
- // Validate permissions for cost data access
104
- if not UserPermissions.CanViewCostInformation() then
105
- exit(0);
106
-
107
- Item.SetFilter("No.", ItemFilter);
108
- if not Item.FindSet() then
109
- exit(0);
110
-
111
- try
112
- LineNo := 0;
113
- repeat
114
- // Only process items user can view
115
- if UserPermissions.CanViewItem(Item."No.") then begin
116
- LineNo += 10000;
117
-
118
- // Calculate profit for this item
119
- ItemLedgerEntry.SetRange("Item No.", Item."No.");
120
- ItemLedgerEntry.CalcSums("Sales Amount (Actual)", "Cost Amount (Actual)");
121
-
122
- // Store in temporary buffer with limited scope
123
- TempProfitBuffer.Init();
124
- TempProfitBuffer.Number := LineNo;
125
- TempProfitBuffer.Insert();
126
-
127
- TotalProfit += (ItemLedgerEntry."Sales Amount (Actual)" - ItemLedgerEntry."Cost Amount (Actual)");
128
- end;
129
- until Item.Next() = 0;
130
-
131
- finally
132
- // Cleanup temporary data
133
- TempProfitBuffer.DeleteAll();
134
- end;
135
-
136
- exit(TotalProfit);
137
- end;
138
- ```
139
-
140
- ## Bad Examples
141
-
142
- ### Temporary Table Without Permission Validation
143
- ```al
144
- procedure ProcessAllCustomerData(): Boolean
145
- var
146
- Customer: Record Customer;
147
- TempCustomerBuffer: Record Customer temporary;
148
- begin
149
- // BAD: No permission validation before accessing sensitive data
150
- Customer.FindSet();
151
- repeat
152
- TempCustomerBuffer := Customer;
153
- TempCustomerBuffer.Insert();
154
- until Customer.Next() = 0;
155
-
156
- // BAD: Processing all customer data regardless of user permissions
157
- ProcessCustomerBuffer(TempCustomerBuffer);
158
-
159
- // BAD: No cleanup of sensitive temporary data
160
- exit(true);
161
- end;
162
- ```
163
-
164
- ### No Cleanup in Error Scenarios
165
- ```al
166
- procedure RiskyTemporaryProcessing(CustomerNo: Code[20]): Boolean
167
- var
168
- Customer: Record Customer;
169
- TempSensitiveData: Record Customer temporary;
170
- begin
171
- if Customer.Get(CustomerNo) then begin
172
- TempSensitiveData := Customer;
173
- TempSensitiveData.Insert();
174
-
175
- // BAD: If this processing fails, temporary data is not cleaned up
176
- if ProcessSensitiveData(TempSensitiveData) then begin
177
- TempSensitiveData.DeleteAll();
178
- exit(true);
179
- end;
180
-
181
- // BAD: Error path doesn't clean up temporary data
182
- exit(false);
183
- end;
184
- end;
185
- ```
186
-
187
- ### Cross-Session Data Leakage Risk
188
- ```al
189
- codeunit 50100 "Unsafe Temporary Processing"
190
- {
191
- // BAD: Global temporary table could leak data between sessions
192
- var
193
- GlobalTempBuffer: Record Customer temporary;
194
-
195
- procedure ProcessCustomer(CustomerNo: Code[20]): Boolean
196
- begin
197
- // BAD: Global temporary data persists across procedure calls
198
- GlobalTempBuffer."No." := CustomerNo;
199
- GlobalTempBuffer.Insert();
200
-
201
- // BAD: No session isolation or cleanup
202
- exit(ProcessGlobalBuffer());
203
- end;
204
- }
205
- ```
206
-
207
- ## Best Practices
208
-
209
- ### Comprehensive Error Handling
210
- ```al
211
- procedure SecureTemporaryProcessing(RecordID: RecordID): Boolean
212
- var
213
- RecordRef: RecordRef;
214
- TempProcessingBuffer: Record "Integer" temporary;
215
- ProcessingSuccess: Boolean;
216
- ErrorOccurred: Boolean;
217
- begin
218
- // Early permission validation
219
- if not UserPermissions.CanAccessRecord(RecordID) then
220
- exit(false);
221
-
222
- if not RecordRef.Get(RecordID) then
223
- exit(false);
224
-
225
- try
226
- // Initialize temporary processing with minimal data
227
- TempProcessingBuffer.Init();
228
- TempProcessingBuffer.Number := RecordID.RecordId;
229
- TempProcessingBuffer.Insert();
230
-
231
- // Secure processing with error handling
232
- ProcessingSuccess := ProcessRecordSecurely(RecordRef, TempProcessingBuffer);
233
-
234
- except
235
- ErrorOccurred := true;
236
- end;
237
-
238
- // Always cleanup, even in error scenarios
239
- TempProcessingBuffer.DeleteAll();
240
-
241
- if ErrorOccurred then
242
- exit(false);
243
-
244
- exit(ProcessingSuccess);
245
- end;
246
- ```
247
-
248
- ### Session-Isolated Temporary Processing
249
- ```al
250
- procedure SessionSafeProcessing(UserID: Code[50]): Boolean
251
- var
252
- TempUserBuffer: Record User temporary;
253
- SessionGuid: Guid;
254
- begin
255
- // Create session-specific identifier
256
- SessionGuid := CreateGuid();
257
-
258
- // Validate current user permissions
259
- if (UserID <> UserId) and (not UserPermissions.CanViewOtherUsers()) then
260
- exit(false);
261
-
262
- try
263
- // Session-isolated temporary data
264
- TempUserBuffer.Init();
265
- TempUserBuffer."User Security ID" := SessionGuid;
266
- TempUserBuffer."User Name" := UserID;
267
- TempUserBuffer.Insert();
268
-
269
- // Process with session context
270
- exit(ProcessUserInSession(TempUserBuffer, SessionGuid));
271
-
272
- finally
273
- // Session cleanup
274
- TempUserBuffer.DeleteAll();
275
- end;
276
- end;
277
- ```
278
-
279
- ### Audit-Compliant Temporary Processing
280
- ```al
281
- procedure AuditSafeProcessing(DocumentNo: Code[20]): Boolean
282
- var
283
- SalesHeader: Record "Sales Header";
284
- TempAuditBuffer: Record "Change Log Entry" temporary;
285
- AuditEntryNo: Integer;
286
- begin
287
- // Permission and audit validation
288
- if not UserPermissions.CanViewDocument(DocumentNo) then begin
289
- LogSecurityEvent('Unauthorized access attempt', DocumentNo);
290
- exit(false);
291
- end;
292
-
293
- if not SalesHeader.Get(SalesHeader."Document Type"::Order, DocumentNo) then
294
- exit(false);
295
-
296
- try
297
- // Create audit trail for temporary data access
298
- AuditEntryNo := CreateAuditEntry('Temporary Processing', DocumentNo);
299
-
300
- // Limited temporary data with audit context
301
- TempAuditBuffer.Init();
302
- TempAuditBuffer."Entry No." := AuditEntryNo;
303
- TempAuditBuffer."Table No." := Database::"Sales Header";
304
- TempAuditBuffer."Primary Key Field 1 Value" := DocumentNo;
305
- TempAuditBuffer.Insert();
306
-
307
- // Audited processing
308
- exit(ProcessWithAuditTrail(SalesHeader, TempAuditBuffer));
309
-
310
- finally
311
- // Cleanup with audit completion
312
- TempAuditBuffer.DeleteAll();
313
- CompleteAuditEntry(AuditEntryNo);
314
- end;
315
- end;
316
- ```
317
-
318
- ### Memory-Efficient Cleanup
319
- ```al
320
- procedure LargeDatasetProcessing(FilterText: Text): Boolean
321
- var
322
- SourceRecord: Record "Item Ledger Entry";
323
- TempProcessingBuffer: Record "Item Ledger Entry" temporary;
324
- BatchSize: Integer;
325
- ProcessedCount: Integer;
326
- begin
327
- BatchSize := 1000; // Process in batches to manage memory
328
-
329
- SourceRecord.SetFilter("Item No.", FilterText);
330
- if not SourceRecord.FindSet() then
331
- exit(false);
332
-
333
- repeat
334
- try
335
- // Process in batches with cleanup
336
- ProcessedCount := 0;
337
- repeat
338
- TempProcessingBuffer := SourceRecord;
339
- TempProcessingBuffer.Insert();
340
- ProcessedCount += 1;
341
-
342
- // Batch boundary cleanup
343
- if ProcessedCount >= BatchSize then begin
344
- ProcessBatch(TempProcessingBuffer);
345
- TempProcessingBuffer.DeleteAll();
346
- ProcessedCount := 0;
347
- end;
348
-
349
- until (SourceRecord.Next() = 0) or (ProcessedCount >= BatchSize);
350
-
351
- // Process remaining records
352
- if ProcessedCount > 0 then
353
- ProcessBatch(TempProcessingBuffer);
354
-
355
- finally
356
- // Always cleanup batch data
357
- TempProcessingBuffer.DeleteAll();
358
- end;
359
-
360
- until SourceRecord.Next() = 0;
361
-
362
- exit(true);
363
- end;
364
- ```
365
-
366
- ## Security Guidelines
367
-
368
- 1. **Validate permissions before populating temporary tables with sensitive data**
369
- 2. **Use try-finally blocks to ensure cleanup even in error scenarios**
370
- 3. **Apply session isolation to prevent cross-user data leakage**
371
- 4. **Implement audit trails for temporary access to sensitive information**
372
- 5. **Process large datasets in batches with regular cleanup**
373
- 6. **Document temporary table security requirements and cleanup procedures**
@@ -1,308 +0,0 @@
1
- # API Page Permission Model - AL Code Sample
2
-
3
- ## Basic Permission Set for API Access
4
-
5
- ```al
6
- permissionset 50100 "Customer API Access"
7
- {
8
- Caption = 'Customer API Access';
9
- Access = Public;
10
- Assignable = true;
11
-
12
- Permissions =
13
- tabledata Customer = RI, // Read and Insert permissions
14
- tabledata "Customer Bank Account" = R, // Read-only access to related data
15
- page "Customer API" = X, // Execute permission for API page
16
- codeunit "Customer Management" = X; // Execute related business logic
17
- }
18
-
19
- // Example API page with permission requirements
20
- page 50100 "Customer API"
21
- {
22
- PageType = API;
23
- APIPublisher = 'contoso';
24
- APIGroup = 'customers';
25
- APIVersion = 'v1.0';
26
- EntityName = 'customer';
27
- EntitySetName = 'customers';
28
- SourceTable = Customer;
29
- DelayedInsert = true;
30
- ODataKeyFields = SystemId;
31
-
32
- layout
33
- {
34
- area(Content)
35
- {
36
- repeater(GroupName)
37
- {
38
- field(id; Rec.SystemId)
39
- {
40
- Caption = 'Id';
41
- Editable = false;
42
- }
43
- field(number; Rec."No.")
44
- {
45
- Caption = 'Number';
46
- }
47
- field(displayName; Rec.Name)
48
- {
49
- Caption = 'Display Name';
50
- }
51
- }
52
- }
53
- }
54
- }
55
- ```
56
-
57
- ## Advanced Permission Model with Role-Based Access
58
-
59
- ```al
60
- // Base API permission set - minimal access
61
- permissionset 50101 "Base API Reader"
62
- {
63
- Caption = 'Base API Reader';
64
- Access = Public;
65
- Assignable = false; // Only used as building block
66
-
67
- Permissions =
68
- tabledata Customer = R,
69
- tabledata Item = R,
70
- tabledata Vendor = R;
71
- }
72
-
73
- // Extended permission set for API writers
74
- permissionset 50102 "API Data Writer"
75
- {
76
- Caption = 'API Data Writer';
77
- Access = Public;
78
- Assignable = true;
79
-
80
- IncludedPermissionSets = "Base API Reader"; // Inherit read permissions
81
-
82
- Permissions =
83
- tabledata Customer = RIM, // Read, Insert, Modify
84
- tabledata Item = RIM,
85
- tabledata Vendor = RIM,
86
- tabledata "Gen. Journal Line" = RIMD, // Full access for transaction APIs
87
- page "Customer API" = X,
88
- page "Item API" = X,
89
- page "Vendor API" = X,
90
- codeunit "API Helper Functions" = X;
91
- }
92
-
93
- // Administrative permission set with full API control
94
- permissionset 50103 "API Administrator"
95
- {
96
- Caption = 'API Administrator';
97
- Access = Public;
98
- Assignable = true;
99
-
100
- IncludedPermissionSets = "API Data Writer";
101
-
102
- Permissions =
103
- tabledata "Web Service" = RIMD, // Manage web service registrations
104
- tabledata "OAuth 2.0 Setup" = RIMD, // Manage API authentication
105
- tabledata "User Setup" = RM, // Modify user API permissions
106
- page "Web Services" = X,
107
- codeunit "Web Service Management" = X;
108
- }
109
- ```
110
-
111
- ## Permission Validation in API Implementation
112
-
113
- ```al
114
- codeunit 50100 "API Security Helper"
115
- {
116
- // Validate user has required permissions for API operation
117
- procedure ValidateAPIPermissions(TableID: Integer; Operation: Text): Boolean
118
- var
119
- Permission: Record Permission;
120
- UserPermissions: Record "Access Control";
121
- begin
122
- // Check if user has appropriate table permissions
123
- case Operation of
124
- 'READ':
125
- exit(HasTablePermission(TableID, 'R'));
126
- 'CREATE':
127
- exit(HasTablePermission(TableID, 'I'));
128
- 'UPDATE':
129
- exit(HasTablePermission(TableID, 'M'));
130
- 'DELETE':
131
- exit(HasTablePermission(TableID, 'D'));
132
- else
133
- exit(false);
134
- end;
135
- end;
136
-
137
- local procedure HasTablePermission(TableID: Integer; PermissionType: Text): Boolean
138
- var
139
- Permission: Record Permission;
140
- AccessControl: Record "Access Control";
141
- begin
142
- AccessControl.SetRange("User Security ID", UserSecurityId());
143
- if AccessControl.FindSet() then
144
- repeat
145
- Permission.SetRange("Role ID", AccessControl."Role ID");
146
- Permission.SetRange("Object Type", Permission."Object Type"::"Table Data");
147
- Permission.SetRange("Object ID", TableID);
148
- if Permission.FindFirst() then
149
- if StrPos(Permission."Read Permission", PermissionType) > 0 then
150
- exit(true);
151
- until AccessControl.Next() = 0;
152
- exit(false);
153
- end;
154
- }
155
-
156
- // API page with permission enforcement
157
- page 50101 "Secure Customer API"
158
- {
159
- PageType = API;
160
- APIPublisher = 'contoso';
161
- APIGroup = 'customers';
162
- APIVersion = 'v1.0';
163
- EntityName = 'secureCustomer';
164
- EntitySetName = 'secureCustomers';
165
- SourceTable = Customer;
166
- DelayedInsert = true;
167
- ODataKeyFields = SystemId;
168
-
169
- trigger OnOpenPage()
170
- var
171
- APISecurityHelper: Codeunit "API Security Helper";
172
- begin
173
- // Validate user has read permissions
174
- if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'READ') then
175
- Error('Insufficient permissions to access Customer API');
176
- end;
177
-
178
- trigger OnInsertRecord(BelowxRec: Boolean): Boolean
179
- var
180
- APISecurityHelper: Codeunit "API Security Helper";
181
- begin
182
- // Validate user has insert permissions
183
- if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'CREATE') then
184
- Error('Insufficient permissions to create customers via API');
185
- exit(true);
186
- end;
187
-
188
- trigger OnModifyRecord(): Boolean
189
- var
190
- APISecurityHelper: Codeunit "API Security Helper";
191
- begin
192
- // Validate user has modify permissions
193
- if not APISecurityHelper.ValidateAPIPermissions(Database::Customer, 'UPDATE') then
194
- Error('Insufficient permissions to modify customers via API');
195
- exit(true);
196
- end;
197
- }
198
- ```
199
-
200
- ## OAuth 2.0 Integration with Permissions
201
-
202
- ```al
203
- // OAuth setup with permission scope mapping
204
- table 50100 "API OAuth Configuration"
205
- {
206
- Caption = 'API OAuth Configuration';
207
- DataClassification = SystemMetadata;
208
-
209
- fields
210
- {
211
- field(1; "Scope Name"; Text[100])
212
- {
213
- Caption = 'Scope Name';
214
- }
215
- field(2; "Permission Set Code"; Code[20])
216
- {
217
- Caption = 'Permission Set Code';
218
- TableRelation = "Permission Set"."Role ID";
219
- }
220
- field(3; "Description"; Text[250])
221
- {
222
- Caption = 'Description';
223
- }
224
- field(4; "Active"; Boolean)
225
- {
226
- Caption = 'Active';
227
- InitValue = true;
228
- }
229
- }
230
-
231
- keys
232
- {
233
- key(PK; "Scope Name")
234
- {
235
- Clustered = true;
236
- }
237
- }
238
- }
239
-
240
- // Codeunit for OAuth scope to permission mapping
241
- codeunit 50101 "OAuth Permission Manager"
242
- {
243
- // Map OAuth scopes to BC permission sets
244
- procedure AssignPermissionsFromOAuthScope(UserID: Guid; OAuthScope: Text)
245
- var
246
- OAuthConfig: Record "API OAuth Configuration";
247
- AccessControl: Record "Access Control";
248
- Scopes: List of [Text];
249
- Scope: Text;
250
- begin
251
- // Parse OAuth scopes (space-separated)
252
- Scopes := OAuthScope.Split(' ');
253
-
254
- foreach Scope in Scopes do begin
255
- OAuthConfig.Reset();
256
- OAuthConfig.SetRange("Scope Name", Scope);
257
- OAuthConfig.SetRange(Active, true);
258
- if OAuthConfig.FindSet() then
259
- repeat
260
- // Assign corresponding permission set
261
- if not AccessControl.Get(UserID, OAuthConfig."Permission Set Code", '', '') then begin
262
- AccessControl.Init();
263
- AccessControl."User Security ID" := UserID;
264
- AccessControl."Role ID" := OAuthConfig."Permission Set Code";
265
- AccessControl.Insert();
266
- end;
267
- until OAuthConfig.Next() = 0;
268
- end;
269
- end;
270
-
271
- // Validate OAuth token has required scope for operation
272
- procedure ValidateOAuthScope(RequiredScope: Text; ProvidedScopes: Text): Boolean
273
- var
274
- Scopes: List of [Text];
275
- Scope: Text;
276
- begin
277
- Scopes := ProvidedScopes.Split(' ');
278
- foreach Scope in Scopes do
279
- if Scope = RequiredScope then
280
- exit(true);
281
- exit(false);
282
- end;
283
- }
284
- ```
285
-
286
- ## Implementation Notes
287
-
288
- **Permission Model Best Practices:**
289
-
290
- 1. **Principle of Least Privilege:**
291
- - Grant minimum permissions required for API functionality
292
- - Use specific table permissions rather than blanket access
293
- - Separate read and write permissions into different sets
294
-
295
- 2. **Role-Based Access Control:**
296
- - Create permission sets that align with business roles
297
- - Use inheritance to build complex permission structures
298
- - Implement permission validation at API endpoints
299
-
300
- 3. **OAuth Integration:**
301
- - Map OAuth scopes to specific BC permission sets
302
- - Validate scopes before processing API requests
303
- - Implement dynamic permission assignment based on token scopes
304
-
305
- 4. **Security Monitoring:**
306
- - Log permission failures for security auditing
307
- - Monitor API access patterns for unusual behavior
308
- - Implement rate limiting based on permission levels