@peernova/cuneiform-sf 1.0.2 → 1.0.4-beta.8

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 (494) hide show
  1. package/LICENSE +81 -30
  2. package/README.md +59 -95
  3. package/lib/adapters/connection-facade.d.ts +458 -0
  4. package/lib/adapters/connection-facade.js +379 -0
  5. package/lib/adapters/connection-facade.js.map +1 -0
  6. package/lib/adapters/errors.d.ts +547 -0
  7. package/lib/adapters/errors.js +937 -0
  8. package/lib/adapters/errors.js.map +1 -0
  9. package/lib/adapters/index.d.ts +33 -0
  10. package/lib/adapters/index.js +50 -0
  11. package/lib/adapters/index.js.map +1 -0
  12. package/lib/adapters/lifecycle.d.ts +119 -0
  13. package/lib/adapters/lifecycle.js +94 -0
  14. package/lib/adapters/lifecycle.js.map +1 -0
  15. package/lib/adapters/rest/cache.d.ts +69 -0
  16. package/lib/adapters/rest/cache.js +133 -0
  17. package/lib/adapters/rest/cache.js.map +1 -0
  18. package/lib/adapters/rest/index.d.ts +11 -0
  19. package/lib/adapters/rest/index.js +18 -0
  20. package/lib/adapters/rest/index.js.map +1 -0
  21. package/lib/adapters/rest/profiling-rest-client.d.ts +137 -0
  22. package/lib/adapters/rest/profiling-rest-client.js +115 -0
  23. package/lib/adapters/rest/profiling-rest-client.js.map +1 -0
  24. package/lib/adapters/rest/rest-api-adapter.d.ts +389 -0
  25. package/lib/adapters/rest/rest-api-adapter.js +747 -0
  26. package/lib/adapters/rest/rest-api-adapter.js.map +1 -0
  27. package/lib/adapters/rest/types.d.ts +34 -0
  28. package/lib/adapters/rest/types.js +9 -0
  29. package/lib/adapters/rest/types.js.map +1 -0
  30. package/lib/adapters/retry.d.ts +91 -0
  31. package/lib/adapters/retry.js +215 -0
  32. package/lib/adapters/retry.js.map +1 -0
  33. package/lib/adapters/soql/cuneiform-query-builder.d.ts +391 -0
  34. package/lib/adapters/soql/cuneiform-query-builder.js +559 -0
  35. package/lib/adapters/soql/cuneiform-query-builder.js.map +1 -0
  36. package/lib/adapters/soql/index.d.ts +13 -0
  37. package/lib/adapters/soql/index.js +21 -0
  38. package/lib/adapters/soql/index.js.map +1 -0
  39. package/lib/adapters/soql/soql-query-adapter.d.ts +141 -0
  40. package/lib/adapters/soql/soql-query-adapter.js +259 -0
  41. package/lib/adapters/soql/soql-query-adapter.js.map +1 -0
  42. package/lib/adapters/soql/types.d.ts +37 -0
  43. package/lib/adapters/soql/types.js +19 -0
  44. package/lib/adapters/soql/types.js.map +1 -0
  45. package/lib/adapters/testing/index.d.ts +37 -0
  46. package/lib/adapters/testing/index.js +20 -0
  47. package/lib/adapters/testing/index.js.map +1 -0
  48. package/lib/adapters/testing/mock-connection.d.ts +77 -0
  49. package/lib/adapters/testing/mock-connection.js +207 -0
  50. package/lib/adapters/testing/mock-connection.js.map +1 -0
  51. package/lib/adapters/testing/mock-logger.d.ts +29 -0
  52. package/lib/adapters/testing/mock-logger.js +57 -0
  53. package/lib/adapters/testing/mock-logger.js.map +1 -0
  54. package/lib/adapters/testing/mock-mcp-adapters.d.ts +32 -0
  55. package/lib/adapters/testing/mock-mcp-adapters.js +52 -0
  56. package/lib/adapters/testing/mock-mcp-adapters.js.map +1 -0
  57. package/lib/adapters/testing/mock-oclif-config.d.ts +22 -0
  58. package/lib/adapters/testing/mock-oclif-config.js +90 -0
  59. package/lib/adapters/testing/mock-oclif-config.js.map +1 -0
  60. package/lib/adapters/testing/mock-rest-adapter.d.ts +26 -0
  61. package/lib/adapters/testing/mock-rest-adapter.js +243 -0
  62. package/lib/adapters/testing/mock-rest-adapter.js.map +1 -0
  63. package/lib/adapters/testing/mock-salesforce-connection.d.ts +40 -0
  64. package/lib/adapters/testing/mock-salesforce-connection.js +61 -0
  65. package/lib/adapters/testing/mock-salesforce-connection.js.map +1 -0
  66. package/lib/adapters/testing/mock-soql-adapter.d.ts +30 -0
  67. package/lib/adapters/testing/mock-soql-adapter.js +120 -0
  68. package/lib/adapters/testing/mock-soql-adapter.js.map +1 -0
  69. package/lib/adapters/testing/mock-tooling-adapter.d.ts +24 -0
  70. package/lib/adapters/testing/mock-tooling-adapter.js +163 -0
  71. package/lib/adapters/testing/mock-tooling-adapter.js.map +1 -0
  72. package/lib/adapters/testing/stub-connection.d.ts +93 -0
  73. package/lib/adapters/testing/stub-connection.js +97 -0
  74. package/lib/adapters/testing/stub-connection.js.map +1 -0
  75. package/lib/adapters/testing/stub-rest-adapter.d.ts +52 -0
  76. package/lib/adapters/testing/stub-rest-adapter.js +58 -0
  77. package/lib/adapters/testing/stub-rest-adapter.js.map +1 -0
  78. package/lib/adapters/testing/stub-soql-adapter.d.ts +56 -0
  79. package/lib/adapters/testing/stub-soql-adapter.js +50 -0
  80. package/lib/adapters/testing/stub-soql-adapter.js.map +1 -0
  81. package/lib/adapters/testing/types.d.ts +71 -0
  82. package/lib/adapters/testing/types.js +9 -0
  83. package/lib/adapters/testing/types.js.map +1 -0
  84. package/lib/adapters/tooling/index.d.ts +10 -0
  85. package/lib/adapters/tooling/index.js +17 -0
  86. package/lib/adapters/tooling/index.js.map +1 -0
  87. package/lib/adapters/tooling/tooling-api-adapter.d.ts +157 -0
  88. package/lib/adapters/tooling/tooling-api-adapter.js +339 -0
  89. package/lib/adapters/tooling/tooling-api-adapter.js.map +1 -0
  90. package/lib/adapters/tooling/types.d.ts +81 -0
  91. package/lib/adapters/tooling/types.js +9 -0
  92. package/lib/adapters/tooling/types.js.map +1 -0
  93. package/lib/adapters/types.d.ts +112 -0
  94. package/lib/adapters/types.js +169 -0
  95. package/lib/adapters/types.js.map +1 -0
  96. package/lib/base/cuneiform-command.d.ts +152 -0
  97. package/lib/base/cuneiform-command.js +243 -0
  98. package/lib/base/cuneiform-command.js.map +1 -0
  99. package/lib/commands/cuneiform/compatibility/check.d.ts +43 -0
  100. package/lib/commands/cuneiform/compatibility/check.js +114 -0
  101. package/lib/commands/cuneiform/compatibility/check.js.map +1 -0
  102. package/lib/commands/cuneiform/definition/create.d.ts +119 -0
  103. package/lib/commands/cuneiform/definition/create.js +693 -0
  104. package/lib/commands/cuneiform/definition/create.js.map +1 -0
  105. package/lib/commands/cuneiform/definition/export.d.ts +57 -0
  106. package/lib/commands/cuneiform/definition/export.js +133 -0
  107. package/lib/commands/cuneiform/definition/export.js.map +1 -0
  108. package/lib/commands/cuneiform/definition/get.d.ts +86 -0
  109. package/lib/commands/cuneiform/definition/get.js +270 -0
  110. package/lib/commands/cuneiform/definition/get.js.map +1 -0
  111. package/lib/commands/cuneiform/definition/import.d.ts +54 -0
  112. package/lib/commands/cuneiform/definition/import.js +118 -0
  113. package/lib/commands/cuneiform/definition/import.js.map +1 -0
  114. package/lib/commands/cuneiform/definition/list.d.ts +110 -0
  115. package/lib/commands/cuneiform/definition/list.js +344 -0
  116. package/lib/commands/cuneiform/definition/list.js.map +1 -0
  117. package/lib/commands/cuneiform/definition/purge.d.ts +105 -0
  118. package/lib/commands/cuneiform/definition/purge.js +533 -0
  119. package/lib/commands/cuneiform/definition/purge.js.map +1 -0
  120. package/lib/commands/cuneiform/definition/update.d.ts +58 -0
  121. package/lib/commands/cuneiform/definition/update.js +206 -0
  122. package/lib/commands/cuneiform/definition/update.js.map +1 -0
  123. package/lib/commands/cuneiform/mcp/serve.d.ts +56 -0
  124. package/lib/commands/cuneiform/mcp/serve.js +109 -0
  125. package/lib/commands/cuneiform/mcp/serve.js.map +1 -0
  126. package/lib/commands/cuneiform/object/describe.d.ts +61 -0
  127. package/lib/commands/cuneiform/object/describe.js +461 -0
  128. package/lib/commands/cuneiform/object/describe.js.map +1 -0
  129. package/lib/commands/cuneiform/object/list.d.ts +111 -0
  130. package/lib/commands/cuneiform/object/list.js +239 -0
  131. package/lib/commands/cuneiform/object/list.js.map +1 -0
  132. package/lib/commands/cuneiform/org/details.d.ts +99 -0
  133. package/lib/commands/cuneiform/org/details.js +521 -0
  134. package/lib/commands/cuneiform/org/details.js.map +1 -0
  135. package/lib/commands/cuneiform/org/reset.d.ts +46 -0
  136. package/lib/commands/cuneiform/org/reset.js +135 -0
  137. package/lib/commands/cuneiform/org/reset.js.map +1 -0
  138. package/lib/commands/cuneiform/profile/request/cancel.d.ts +59 -0
  139. package/lib/commands/cuneiform/profile/request/cancel.js +202 -0
  140. package/lib/commands/cuneiform/profile/request/cancel.js.map +1 -0
  141. package/lib/commands/cuneiform/profile/request/delete.d.ts +59 -0
  142. package/lib/commands/cuneiform/profile/request/delete.js +223 -0
  143. package/lib/commands/cuneiform/profile/request/delete.js.map +1 -0
  144. package/lib/commands/cuneiform/profile/request/list.d.ts +35 -0
  145. package/lib/commands/cuneiform/profile/request/list.js +102 -0
  146. package/lib/commands/cuneiform/profile/request/list.js.map +1 -0
  147. package/lib/commands/cuneiform/profile.d.ts +90 -0
  148. package/lib/commands/cuneiform/profile.js +322 -0
  149. package/lib/commands/cuneiform/profile.js.map +1 -0
  150. package/lib/commands/cuneiform/summary/purge.d.ts +77 -0
  151. package/lib/commands/cuneiform/summary/purge.js +429 -0
  152. package/lib/commands/cuneiform/summary/purge.js.map +1 -0
  153. package/lib/commands/cuneiform/summary/reprofile.d.ts +60 -0
  154. package/lib/commands/cuneiform/summary/reprofile.js +236 -0
  155. package/lib/commands/cuneiform/summary/reprofile.js.map +1 -0
  156. package/lib/commands/cuneiform/summary/stop.d.ts +59 -0
  157. package/lib/commands/cuneiform/summary/stop.js +234 -0
  158. package/lib/commands/cuneiform/summary/stop.js.map +1 -0
  159. package/lib/commands/cuneiform/user/details.d.ts +73 -0
  160. package/lib/commands/cuneiform/user/details.js +391 -0
  161. package/lib/commands/cuneiform/user/details.js.map +1 -0
  162. package/lib/constants/index.d.ts +8 -0
  163. package/lib/constants/index.js +16 -0
  164. package/lib/constants/index.js.map +1 -0
  165. package/lib/constants/namespace-constants.d.ts +91 -0
  166. package/lib/constants/namespace-constants.js +211 -0
  167. package/lib/constants/namespace-constants.js.map +1 -0
  168. package/lib/debug/command-debug-proxy.d.ts +101 -0
  169. package/lib/debug/command-debug-proxy.js +171 -0
  170. package/lib/debug/command-debug-proxy.js.map +1 -0
  171. package/lib/debug/debug-logger.d.ts +85 -0
  172. package/lib/debug/debug-logger.js +133 -0
  173. package/lib/debug/debug-logger.js.map +1 -0
  174. package/lib/debug/index.d.ts +12 -0
  175. package/lib/debug/index.js +20 -0
  176. package/lib/debug/index.js.map +1 -0
  177. package/lib/debug/service-debug-proxy.d.ts +30 -0
  178. package/lib/debug/service-debug-proxy.js +102 -0
  179. package/lib/debug/service-debug-proxy.js.map +1 -0
  180. package/lib/hooks/prerun.d.ts +25 -0
  181. package/lib/hooks/prerun.js +47 -0
  182. package/lib/hooks/prerun.js.map +1 -0
  183. package/lib/mcp/config/mcp-config.d.ts +55 -0
  184. package/lib/mcp/config/mcp-config.js +51 -0
  185. package/lib/mcp/config/mcp-config.js.map +1 -0
  186. package/lib/mcp/config/pagination.d.ts +96 -0
  187. package/lib/mcp/config/pagination.js +108 -0
  188. package/lib/mcp/config/pagination.js.map +1 -0
  189. package/lib/mcp/config/system-prompts.d.ts +18 -0
  190. package/lib/mcp/config/system-prompts.js +92 -0
  191. package/lib/mcp/config/system-prompts.js.map +1 -0
  192. package/lib/mcp/errors.d.ts +23 -0
  193. package/lib/mcp/errors.js +27 -0
  194. package/lib/mcp/errors.js.map +1 -0
  195. package/lib/mcp/schemas/input-schemas.d.ts +327 -0
  196. package/lib/mcp/schemas/input-schemas.js +302 -0
  197. package/lib/mcp/schemas/input-schemas.js.map +1 -0
  198. package/lib/mcp/server.d.ts +40 -0
  199. package/lib/mcp/server.js +316 -0
  200. package/lib/mcp/server.js.map +1 -0
  201. package/lib/mcp/tools/contactpoint-tools.d.ts +14 -0
  202. package/lib/mcp/tools/contactpoint-tools.js +34 -0
  203. package/lib/mcp/tools/contactpoint-tools.js.map +1 -0
  204. package/lib/mcp/tools/definition-io-tools.d.ts +19 -0
  205. package/lib/mcp/tools/definition-io-tools.js +152 -0
  206. package/lib/mcp/tools/definition-io-tools.js.map +1 -0
  207. package/lib/mcp/tools/definition-tools.d.ts +51 -0
  208. package/lib/mcp/tools/definition-tools.js +199 -0
  209. package/lib/mcp/tools/definition-tools.js.map +1 -0
  210. package/lib/mcp/tools/index.d.ts +37 -0
  211. package/lib/mcp/tools/index.js +88 -0
  212. package/lib/mcp/tools/index.js.map +1 -0
  213. package/lib/mcp/tools/object-tools.d.ts +22 -0
  214. package/lib/mcp/tools/object-tools.js +306 -0
  215. package/lib/mcp/tools/object-tools.js.map +1 -0
  216. package/lib/mcp/tools/org-tools.d.ts +14 -0
  217. package/lib/mcp/tools/org-tools.js +177 -0
  218. package/lib/mcp/tools/org-tools.js.map +1 -0
  219. package/lib/mcp/tools/profile-tools.d.ts +59 -0
  220. package/lib/mcp/tools/profile-tools.js +213 -0
  221. package/lib/mcp/tools/profile-tools.js.map +1 -0
  222. package/lib/mcp/tools/summary-tools.d.ts +14 -0
  223. package/lib/mcp/tools/summary-tools.js +38 -0
  224. package/lib/mcp/tools/summary-tools.js.map +1 -0
  225. package/lib/mcp/tools/tool-factory.d.ts +63 -0
  226. package/lib/mcp/tools/tool-factory.js +146 -0
  227. package/lib/mcp/tools/tool-factory.js.map +1 -0
  228. package/lib/mcp/tools/user-tools.d.ts +25 -0
  229. package/lib/mcp/tools/user-tools.js +167 -0
  230. package/lib/mcp/tools/user-tools.js.map +1 -0
  231. package/lib/models/date-literal.d.ts +211 -0
  232. package/lib/models/date-literal.js +615 -0
  233. package/lib/models/date-literal.js.map +1 -0
  234. package/lib/models/object-describe-types.d.ts +173 -0
  235. package/lib/models/object-describe-types.js +9 -0
  236. package/lib/models/object-describe-types.js.map +1 -0
  237. package/lib/models/profile-request-types.d.ts +118 -0
  238. package/lib/models/profile-request-types.js +23 -0
  239. package/lib/models/profile-request-types.js.map +1 -0
  240. package/lib/models/profiling-execution-types.d.ts +154 -0
  241. package/lib/models/profiling-execution-types.js +14 -0
  242. package/lib/models/profiling-execution-types.js.map +1 -0
  243. package/lib/models/service-result.d.ts +114 -0
  244. package/lib/models/service-result.js +81 -0
  245. package/lib/models/service-result.js.map +1 -0
  246. package/lib/models/sfdmu-types.d.ts +53 -0
  247. package/lib/models/sfdmu-types.js +23 -0
  248. package/lib/models/sfdmu-types.js.map +1 -0
  249. package/lib/models/status-types.d.ts +38 -0
  250. package/lib/models/status-types.js +12 -0
  251. package/lib/models/status-types.js.map +1 -0
  252. package/lib/models/summary-bulk-types.d.ts +61 -0
  253. package/lib/models/summary-bulk-types.js +23 -0
  254. package/lib/models/summary-bulk-types.js.map +1 -0
  255. package/lib/models/user-details-types.d.ts +163 -0
  256. package/lib/models/user-details-types.js +9 -0
  257. package/lib/models/user-details-types.js.map +1 -0
  258. package/lib/models/year-range.d.ts +78 -0
  259. package/lib/models/year-range.js +153 -0
  260. package/lib/models/year-range.js.map +1 -0
  261. package/lib/operations/CompatibilityCheckOperation.d.ts +62 -0
  262. package/lib/operations/CompatibilityCheckOperation.js +102 -0
  263. package/lib/operations/CompatibilityCheckOperation.js.map +1 -0
  264. package/lib/operations/DefinitionCreateOperation.d.ts +411 -0
  265. package/lib/operations/DefinitionCreateOperation.js +1121 -0
  266. package/lib/operations/DefinitionCreateOperation.js.map +1 -0
  267. package/lib/operations/DefinitionExportOperation.d.ts +155 -0
  268. package/lib/operations/DefinitionExportOperation.js +281 -0
  269. package/lib/operations/DefinitionExportOperation.js.map +1 -0
  270. package/lib/operations/DefinitionImportOperation.d.ts +144 -0
  271. package/lib/operations/DefinitionImportOperation.js +357 -0
  272. package/lib/operations/DefinitionImportOperation.js.map +1 -0
  273. package/lib/operations/DefinitionListOperation.d.ts +66 -0
  274. package/lib/operations/DefinitionListOperation.js +108 -0
  275. package/lib/operations/DefinitionListOperation.js.map +1 -0
  276. package/lib/operations/DefinitionPurgeOperation.d.ts +199 -0
  277. package/lib/operations/DefinitionPurgeOperation.js +465 -0
  278. package/lib/operations/DefinitionPurgeOperation.js.map +1 -0
  279. package/lib/operations/DefinitionUpdateOperation.d.ts +78 -0
  280. package/lib/operations/DefinitionUpdateOperation.js +142 -0
  281. package/lib/operations/DefinitionUpdateOperation.js.map +1 -0
  282. package/lib/operations/OrgDetailsOperation.d.ts +253 -0
  283. package/lib/operations/OrgDetailsOperation.js +456 -0
  284. package/lib/operations/OrgDetailsOperation.js.map +1 -0
  285. package/lib/operations/OrgResetOperation.d.ts +114 -0
  286. package/lib/operations/OrgResetOperation.js +209 -0
  287. package/lib/operations/OrgResetOperation.js.map +1 -0
  288. package/lib/operations/ProfileOperation.d.ts +187 -0
  289. package/lib/operations/ProfileOperation.js +373 -0
  290. package/lib/operations/ProfileOperation.js.map +1 -0
  291. package/lib/operations/ProfileRequestCancelOperation.d.ts +59 -0
  292. package/lib/operations/ProfileRequestCancelOperation.js +137 -0
  293. package/lib/operations/ProfileRequestCancelOperation.js.map +1 -0
  294. package/lib/operations/ProfileRequestDeleteOperation.d.ts +64 -0
  295. package/lib/operations/ProfileRequestDeleteOperation.js +134 -0
  296. package/lib/operations/ProfileRequestDeleteOperation.js.map +1 -0
  297. package/lib/operations/ProfileRequestListOperation.d.ts +39 -0
  298. package/lib/operations/ProfileRequestListOperation.js +61 -0
  299. package/lib/operations/ProfileRequestListOperation.js.map +1 -0
  300. package/lib/operations/SummaryPurgeOperation.d.ts +134 -0
  301. package/lib/operations/SummaryPurgeOperation.js +257 -0
  302. package/lib/operations/SummaryPurgeOperation.js.map +1 -0
  303. package/lib/operations/SummaryReprofileOperation.d.ts +88 -0
  304. package/lib/operations/SummaryReprofileOperation.js +174 -0
  305. package/lib/operations/SummaryReprofileOperation.js.map +1 -0
  306. package/lib/operations/SummaryStopOperation.d.ts +87 -0
  307. package/lib/operations/SummaryStopOperation.js +175 -0
  308. package/lib/operations/SummaryStopOperation.js.map +1 -0
  309. package/lib/services/BulkExecutionService.d.ts +120 -0
  310. package/lib/services/BulkExecutionService.js +535 -0
  311. package/lib/services/BulkExecutionService.js.map +1 -0
  312. package/lib/services/CompatibilityService.d.ts +81 -0
  313. package/lib/services/CompatibilityService.js +118 -0
  314. package/lib/services/CompatibilityService.js.map +1 -0
  315. package/lib/services/ConfigureMode.d.ts +85 -0
  316. package/lib/services/ConfigureMode.js +390 -0
  317. package/lib/services/ConfigureMode.js.map +1 -0
  318. package/lib/services/ContactPointService.d.ts +111 -0
  319. package/lib/services/ContactPointService.js +286 -0
  320. package/lib/services/ContactPointService.js.map +1 -0
  321. package/lib/services/DataAvailabilityService.d.ts +81 -0
  322. package/lib/services/DataAvailabilityService.js +128 -0
  323. package/lib/services/DataAvailabilityService.js.map +1 -0
  324. package/lib/services/DefinitionFieldGenerationService.d.ts +309 -0
  325. package/lib/services/DefinitionFieldGenerationService.js +795 -0
  326. package/lib/services/DefinitionFieldGenerationService.js.map +1 -0
  327. package/lib/services/DefinitionQueryBuilder.d.ts +59 -0
  328. package/lib/services/DefinitionQueryBuilder.js +234 -0
  329. package/lib/services/DefinitionQueryBuilder.js.map +1 -0
  330. package/lib/services/ObjectDescribeService.d.ts +436 -0
  331. package/lib/services/ObjectDescribeService.js +869 -0
  332. package/lib/services/ObjectDescribeService.js.map +1 -0
  333. package/lib/services/ObjectFilteringService.d.ts +400 -0
  334. package/lib/services/ObjectFilteringService.js +878 -0
  335. package/lib/services/ObjectFilteringService.js.map +1 -0
  336. package/lib/services/ObjectListCommandService.d.ts +429 -0
  337. package/lib/services/ObjectListCommandService.js +873 -0
  338. package/lib/services/ObjectListCommandService.js.map +1 -0
  339. package/lib/services/ObjectListService.d.ts +201 -0
  340. package/lib/services/ObjectListService.js +345 -0
  341. package/lib/services/ObjectListService.js.map +1 -0
  342. package/lib/services/OrgInfoService.d.ts +485 -0
  343. package/lib/services/OrgInfoService.js +1122 -0
  344. package/lib/services/OrgInfoService.js.map +1 -0
  345. package/lib/services/PollingService.d.ts +105 -0
  346. package/lib/services/PollingService.js +117 -0
  347. package/lib/services/PollingService.js.map +1 -0
  348. package/lib/services/ProfileRequestService.d.ts +186 -0
  349. package/lib/services/ProfileRequestService.js +555 -0
  350. package/lib/services/ProfileRequestService.js.map +1 -0
  351. package/lib/services/ProfilingDefinitionService.d.ts +535 -0
  352. package/lib/services/ProfilingDefinitionService.js +981 -0
  353. package/lib/services/ProfilingDefinitionService.js.map +1 -0
  354. package/lib/services/ProfilingExecutionService.d.ts +122 -0
  355. package/lib/services/ProfilingExecutionService.js +320 -0
  356. package/lib/services/ProfilingExecutionService.js.map +1 -0
  357. package/lib/services/ProfilingSummaryService.d.ts +292 -0
  358. package/lib/services/ProfilingSummaryService.js +685 -0
  359. package/lib/services/ProfilingSummaryService.js.map +1 -0
  360. package/lib/services/RecordTypeService.d.ts +129 -0
  361. package/lib/services/RecordTypeService.js +284 -0
  362. package/lib/services/RecordTypeService.js.map +1 -0
  363. package/lib/services/SFDMUService.d.ts +133 -0
  364. package/lib/services/SFDMUService.js +295 -0
  365. package/lib/services/SFDMUService.js.map +1 -0
  366. package/lib/services/TabDetectionService.d.ts +105 -0
  367. package/lib/services/TabDetectionService.js +206 -0
  368. package/lib/services/TabDetectionService.js.map +1 -0
  369. package/lib/services/UnconfigureMode.d.ts +74 -0
  370. package/lib/services/UnconfigureMode.js +378 -0
  371. package/lib/services/UnconfigureMode.js.map +1 -0
  372. package/lib/services/UserConfigurationService.d.ts +155 -0
  373. package/lib/services/UserConfigurationService.js +573 -0
  374. package/lib/services/UserConfigurationService.js.map +1 -0
  375. package/lib/services/UserConfigurationTypes.d.ts +181 -0
  376. package/lib/services/UserConfigurationTypes.js +14 -0
  377. package/lib/services/UserConfigurationTypes.js.map +1 -0
  378. package/lib/services/UserReadinessService.d.ts +330 -0
  379. package/lib/services/UserReadinessService.js +831 -0
  380. package/lib/services/UserReadinessService.js.map +1 -0
  381. package/lib/services/constants.d.ts +53 -0
  382. package/lib/services/constants.js +71 -0
  383. package/lib/services/constants.js.map +1 -0
  384. package/lib/services/namespace-constants.d.ts +1 -0
  385. package/lib/services/namespace-constants.js +11 -0
  386. package/lib/services/namespace-constants.js.map +1 -0
  387. package/lib/services/validation.d.ts +47 -0
  388. package/lib/services/validation.js +119 -0
  389. package/lib/services/validation.js.map +1 -0
  390. package/lib/utils/batch-processor.d.ts +13 -0
  391. package/lib/utils/batch-processor.js +39 -0
  392. package/lib/utils/batch-processor.js.map +1 -0
  393. package/lib/utils/formatting/availability-grid.d.ts +81 -0
  394. package/lib/utils/formatting/availability-grid.js +94 -0
  395. package/lib/utils/formatting/availability-grid.js.map +1 -0
  396. package/lib/utils/formatting/business-process-grid.d.ts +51 -0
  397. package/lib/utils/formatting/business-process-grid.js +58 -0
  398. package/lib/utils/formatting/business-process-grid.js.map +1 -0
  399. package/lib/utils/formatting/command-display.d.ts +154 -0
  400. package/lib/utils/formatting/command-display.js +154 -0
  401. package/lib/utils/formatting/command-display.js.map +1 -0
  402. package/lib/utils/formatting/definition-create-display.d.ts +118 -0
  403. package/lib/utils/formatting/definition-create-display.js +231 -0
  404. package/lib/utils/formatting/definition-create-display.js.map +1 -0
  405. package/lib/utils/formatting/empty-states.d.ts +35 -0
  406. package/lib/utils/formatting/empty-states.js +70 -0
  407. package/lib/utils/formatting/empty-states.js.map +1 -0
  408. package/lib/utils/formatting/errors.d.ts +33 -0
  409. package/lib/utils/formatting/errors.js +72 -0
  410. package/lib/utils/formatting/errors.js.map +1 -0
  411. package/lib/utils/formatting/field-types.d.ts +32 -0
  412. package/lib/utils/formatting/field-types.js +88 -0
  413. package/lib/utils/formatting/field-types.js.map +1 -0
  414. package/lib/utils/formatting/index.d.ts +29 -0
  415. package/lib/utils/formatting/index.js +28 -0
  416. package/lib/utils/formatting/index.js.map +1 -0
  417. package/lib/utils/formatting/indicators.d.ts +113 -0
  418. package/lib/utils/formatting/indicators.js +161 -0
  419. package/lib/utils/formatting/indicators.js.map +1 -0
  420. package/lib/utils/formatting/loading-messages.d.ts +37 -0
  421. package/lib/utils/formatting/loading-messages.js +50 -0
  422. package/lib/utils/formatting/loading-messages.js.map +1 -0
  423. package/lib/utils/formatting/namespace-display.d.ts +31 -0
  424. package/lib/utils/formatting/namespace-display.js +64 -0
  425. package/lib/utils/formatting/namespace-display.js.map +1 -0
  426. package/lib/utils/formatting/numbers.d.ts +73 -0
  427. package/lib/utils/formatting/numbers.js +187 -0
  428. package/lib/utils/formatting/numbers.js.map +1 -0
  429. package/lib/utils/formatting/object-describe-display.d.ts +114 -0
  430. package/lib/utils/formatting/object-describe-display.js +440 -0
  431. package/lib/utils/formatting/object-describe-display.js.map +1 -0
  432. package/lib/utils/formatting/object-list-display.d.ts +213 -0
  433. package/lib/utils/formatting/object-list-display.js +672 -0
  434. package/lib/utils/formatting/object-list-display.js.map +1 -0
  435. package/lib/utils/formatting/org-identity.d.ts +15 -0
  436. package/lib/utils/formatting/org-identity.js +28 -0
  437. package/lib/utils/formatting/org-identity.js.map +1 -0
  438. package/lib/utils/formatting/record-age-grid.d.ts +41 -0
  439. package/lib/utils/formatting/record-age-grid.js +56 -0
  440. package/lib/utils/formatting/record-age-grid.js.map +1 -0
  441. package/lib/utils/formatting/sections.d.ts +108 -0
  442. package/lib/utils/formatting/sections.js +150 -0
  443. package/lib/utils/formatting/sections.js.map +1 -0
  444. package/lib/utils/formatting/tables.d.ts +90 -0
  445. package/lib/utils/formatting/tables.js +113 -0
  446. package/lib/utils/formatting/tables.js.map +1 -0
  447. package/lib/utils/formatting/user-details-display.d.ts +101 -0
  448. package/lib/utils/formatting/user-details-display.js +425 -0
  449. package/lib/utils/formatting/user-details-display.js.map +1 -0
  450. package/lib/utils/pagination/index.d.ts +11 -0
  451. package/lib/utils/pagination/index.js +18 -0
  452. package/lib/utils/pagination/index.js.map +1 -0
  453. package/lib/utils/pagination/keypress-reader.d.ts +20 -0
  454. package/lib/utils/pagination/keypress-reader.js +63 -0
  455. package/lib/utils/pagination/keypress-reader.js.map +1 -0
  456. package/lib/utils/pagination/paginate-output.d.ts +48 -0
  457. package/lib/utils/pagination/paginate-output.js +136 -0
  458. package/lib/utils/pagination/paginate-output.js.map +1 -0
  459. package/messages/compatibility.check.md +71 -0
  460. package/messages/cuneiform.access.md +138 -0
  461. package/messages/definition.create.md +511 -0
  462. package/messages/definition.export.md +84 -0
  463. package/messages/definition.get.md +147 -0
  464. package/messages/definition.import.md +65 -0
  465. package/messages/definition.list.md +264 -0
  466. package/messages/definition.purge.md +318 -0
  467. package/messages/definition.update.md +118 -0
  468. package/messages/mcp.serve.md +66 -0
  469. package/messages/object.describe.md +201 -0
  470. package/messages/object.list.md +443 -0
  471. package/messages/org.details.md +386 -0
  472. package/messages/org.reset.md +71 -0
  473. package/messages/profile.md +231 -0
  474. package/messages/profile.request.cancel.md +143 -0
  475. package/messages/profile.request.delete.md +139 -0
  476. package/messages/profile.request.list.md +89 -0
  477. package/messages/summary.purge.md +218 -0
  478. package/messages/summary.reprofile.md +150 -0
  479. package/messages/summary.stop.md +157 -0
  480. package/messages/user.details.md +501 -0
  481. package/oclif.lock +2887 -2149
  482. package/oclif.manifest.json +2813 -31
  483. package/package.json +94 -19
  484. package/lib/commands/cuneiform/about.d.ts +0 -13
  485. package/lib/commands/cuneiform/about.js +0 -26
  486. package/lib/commands/cuneiform/about.js.map +0 -1
  487. package/lib/commands/hello/world.d.ts +0 -14
  488. package/lib/commands/hello/world.js +0 -27
  489. package/lib/commands/hello/world.js.map +0 -1
  490. package/lib/index.d.ts +0 -2
  491. package/lib/index.js +0 -2
  492. package/lib/index.js.map +0 -1
  493. package/messages/cuneiform.about.md +0 -19
  494. package/messages/hello.world.md +0 -29
@@ -0,0 +1,555 @@
1
+ /*
2
+ * Copyright (c) 2026, PeerNova, Inc. All Rights Reserved.
3
+ * PROPRIETARY AND CONFIDENTIAL. Unauthorized copying, modification,
4
+ * or distribution is strictly prohibited. Use is governed by the
5
+ * Master Subscription Agreement (MSA) between PeerNova, Inc. and the
6
+ * licensee. See LICENSE file in the repo root.
7
+ */
8
+ import { createSuccessResult, createFailureResult } from '../models/service-result.js';
9
+ import { ServiceErrorCodes } from '../adapters/errors.js';
10
+ import { CuneiformQueryBuilder } from '../adapters/soql/cuneiform-query-builder.js';
11
+ import { CANCELLABLE_STATUSES, DELETABLE_STATUSES } from '../models/profile-request-types.js';
12
+ import { validateSalesforceId, validatePagination } from './validation.js';
13
+ import { PROFILING_REST_BASE } from './constants.js';
14
+ /**
15
+ * Default pagination limit for profile request queries.
16
+ */
17
+ const DEFAULT_REQUEST_LIMIT = 25;
18
+ /**
19
+ * Maximum pagination limit for profile request queries.
20
+ */
21
+ const MAX_REQUEST_LIMIT = 200;
22
+ /**
23
+ * SOQL fields selected when querying pnova__Profiling_Request__c.
24
+ */
25
+ const REQUEST_QUERY_FIELDS = [
26
+ 'Id',
27
+ 'Name',
28
+ 'pnova__Prop_RequestStatus__c',
29
+ 'pnova__ProfilingDef__c',
30
+ 'pnova__ProfilingDef__r.Name',
31
+ 'pnova__PDef_Label__c',
32
+ 'CreatedDate',
33
+ 'LastModifiedDate',
34
+ 'CreatedBy.Name',
35
+ ];
36
+ /**
37
+ * Service for managing profiling request records (pnova__Profiling_Request__c).
38
+ *
39
+ * Provides operations to list profiling requests with filtering and pagination,
40
+ * and to cancel queued or in-progress requests. All methods return ServiceResult<T>
41
+ * with duration metadata.
42
+ *
43
+ * @design
44
+ * **Query Pattern**: Uses CuneiformQueryBuilder for type-safe SOQL construction
45
+ * with status filtering and pagination support.
46
+ *
47
+ * @design
48
+ * **Cancel Strategy**: Cancellation updates each request's status to 'Canceled'
49
+ * via the REST adapter. Partial failures are tracked and reported with E4905.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const service = new ProfileRequestService({ soqlAdapter, restAdapter });
54
+ * const listResult = await service.listRequests({ status: 'Queued', limit: 10 });
55
+ * const cancelResult = await service.cancelRequests({ all: true, dryRun: true });
56
+ * ```
57
+ */
58
+ export class ProfileRequestService {
59
+ soqlAdapter;
60
+ restAdapter;
61
+ logger;
62
+ constructor(config) {
63
+ this.soqlAdapter = config.soqlAdapter;
64
+ this.restAdapter = config.restAdapter;
65
+ this.logger = config.logger;
66
+ }
67
+ /**
68
+ * Maps a raw Salesforce record to the IProfileRequest domain type.
69
+ *
70
+ * @param record - Raw SOQL query result record
71
+ * @returns Mapped IProfileRequest
72
+ */
73
+ static mapRecord(record) {
74
+ return {
75
+ id: record.Id,
76
+ name: record.Name,
77
+ status: record.pnova__Prop_RequestStatus__c,
78
+ definitionId: record.pnova__ProfilingDef__c,
79
+ definitionName: record.pnova__ProfilingDef__r.Name,
80
+ objectName: record.pnova__PDef_Label__c,
81
+ createdDate: record.CreatedDate,
82
+ lastModifiedDate: record.LastModifiedDate,
83
+ submittedBy: record.CreatedBy.Name,
84
+ };
85
+ }
86
+ /**
87
+ * Builds a SOQL query for profiling requests with optional status filter and pagination.
88
+ *
89
+ * @param options - Filtering and pagination options
90
+ * @returns SOQL query string
91
+ */
92
+ static buildListQuery(options) {
93
+ const builder = CuneiformQueryBuilder.create().select(REQUEST_QUERY_FIELDS).from('pnova__Profiling_Request__c');
94
+ // Apply status filter
95
+ if (options?.status) {
96
+ if (Array.isArray(options.status)) {
97
+ if (options.status.length === 1) {
98
+ builder.where('pnova__Prop_RequestStatus__c', '=', options.status[0]);
99
+ }
100
+ else {
101
+ builder.andWhereIn('pnova__Prop_RequestStatus__c', options.status);
102
+ }
103
+ }
104
+ else {
105
+ builder.where('pnova__Prop_RequestStatus__c', '=', options.status);
106
+ }
107
+ }
108
+ // Apply pagination
109
+ const limit = options?.limit ?? DEFAULT_REQUEST_LIMIT;
110
+ builder.orderBy('CreatedDate', 'DESC').limit(limit).offset(options?.offset);
111
+ return builder.toSOQL();
112
+ }
113
+ /**
114
+ * Builds a SOQL query to find cancellable requests, optionally filtered by IDs.
115
+ *
116
+ * @param requestIds - Optional specific IDs to filter by
117
+ * @returns SOQL query string
118
+ */
119
+ static buildCancellableQuery(requestIds) {
120
+ const builder = CuneiformQueryBuilder.create()
121
+ .select(REQUEST_QUERY_FIELDS)
122
+ .from('pnova__Profiling_Request__c')
123
+ .andWhereIn('pnova__Prop_RequestStatus__c', CANCELLABLE_STATUSES);
124
+ if (requestIds && requestIds.length > 0) {
125
+ builder.andWhereIn('Id', requestIds);
126
+ }
127
+ builder.orderBy('CreatedDate', 'DESC');
128
+ return builder.toSOQL();
129
+ }
130
+ /**
131
+ * Creates an empty cancel result for error/validation responses.
132
+ *
133
+ * @param dryRun - Whether this was a dry run
134
+ * @returns Empty ProfileRequestCancelResult
135
+ */
136
+ static emptyCancelResult(dryRun) {
137
+ return {
138
+ cancelled: [],
139
+ failed: [],
140
+ dryRun,
141
+ totalCancellable: 0,
142
+ };
143
+ }
144
+ /**
145
+ * Validates cancel request options for mutual exclusivity and ID format.
146
+ *
147
+ * @param options - The cancel options to validate
148
+ * @param emptyResult - Empty result for failure responses
149
+ * @param startTime - Operation start time for duration tracking
150
+ * @returns Failure ServiceResult if invalid, undefined if valid
151
+ */
152
+ static validateCancelOptions(options, emptyResult, startTime) {
153
+ if (options.all && options.requestIds && options.requestIds.length > 0) {
154
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, 'Options "all" and "requestIds" are mutually exclusive. Provide one or the other.', { metadata: { duration: Date.now() - startTime } });
155
+ }
156
+ if (!options.all && (!options.requestIds || options.requestIds.length === 0)) {
157
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, 'You must provide either "all: true" or a non-empty "requestIds" array.', { metadata: { duration: Date.now() - startTime } });
158
+ }
159
+ if (options.requestIds) {
160
+ for (const id of options.requestIds) {
161
+ const idError = validateSalesforceId(id);
162
+ if (idError) {
163
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, idError, {
164
+ metadata: { duration: Date.now() - startTime },
165
+ });
166
+ }
167
+ }
168
+ }
169
+ return undefined;
170
+ }
171
+ /**
172
+ * Builds a SOQL query to find deletable requests, optionally filtered by IDs.
173
+ *
174
+ * Deletable requests are those in 'Canceled' or 'Rejected' status.
175
+ * These never produced a summary and are safe to delete.
176
+ *
177
+ * @param requestIds - Optional specific IDs to filter by
178
+ * @returns SOQL query string
179
+ */
180
+ static buildDeletableQuery(requestIds) {
181
+ const builder = CuneiformQueryBuilder.create()
182
+ .select(REQUEST_QUERY_FIELDS)
183
+ .from('pnova__Profiling_Request__c')
184
+ .andWhereIn('pnova__Prop_RequestStatus__c', DELETABLE_STATUSES);
185
+ if (requestIds && requestIds.length > 0) {
186
+ builder.andWhereIn('Id', requestIds);
187
+ }
188
+ builder.orderBy('CreatedDate', 'DESC');
189
+ return builder.toSOQL();
190
+ }
191
+ /**
192
+ * Creates an empty delete result for error/validation responses.
193
+ *
194
+ * @param dryRun - Whether this was a dry run
195
+ * @returns Empty ProfileRequestDeleteResult
196
+ */
197
+ static emptyDeleteResult(dryRun) {
198
+ return {
199
+ deleted: [],
200
+ failed: [],
201
+ dryRun,
202
+ totalDeletable: 0,
203
+ };
204
+ }
205
+ /**
206
+ * Validates delete request options for mutual exclusivity and ID format.
207
+ *
208
+ * @param options - The delete options to validate
209
+ * @param emptyResult - Empty result for failure responses
210
+ * @param startTime - Operation start time for duration tracking
211
+ * @returns Failure ServiceResult if invalid, undefined if valid
212
+ */
213
+ static validateDeleteOptions(options, emptyResult, startTime) {
214
+ if (options.all && options.requestIds && options.requestIds.length > 0) {
215
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, 'Options "all" and "requestIds" are mutually exclusive. Provide one or the other.', { metadata: { duration: Date.now() - startTime } });
216
+ }
217
+ if (!options.all && (!options.requestIds || options.requestIds.length === 0)) {
218
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, 'You must provide either "all: true" or a non-empty "requestIds" array.', { metadata: { duration: Date.now() - startTime } });
219
+ }
220
+ if (options.requestIds) {
221
+ for (const id of options.requestIds) {
222
+ const idError = validateSalesforceId(id);
223
+ if (idError) {
224
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_INVALID_IDS, idError, {
225
+ metadata: { duration: Date.now() - startTime },
226
+ });
227
+ }
228
+ }
229
+ }
230
+ return undefined;
231
+ }
232
+ /**
233
+ * List profiling requests with optional filtering and pagination.
234
+ *
235
+ * Queries pnova__Profiling_Request__c records via SOQL with support for
236
+ * status filtering (single or multiple values) and pagination controls.
237
+ *
238
+ * @param options - Optional filtering and pagination settings
239
+ * @returns ServiceResult containing an array of IProfileRequest
240
+ */
241
+ async listRequests(options) {
242
+ const startTime = Date.now();
243
+ // Validate pagination
244
+ const paginationError = validatePagination(options?.limit, options?.offset, MAX_REQUEST_LIMIT);
245
+ if (paginationError) {
246
+ return createFailureResult([], ServiceErrorCodes.INVALID_PAGINATION, paginationError, {
247
+ metadata: { duration: Date.now() - startTime },
248
+ });
249
+ }
250
+ try {
251
+ this.logger?.log('Listing profiling requests');
252
+ const soql = ProfileRequestService.buildListQuery(options);
253
+ const queryResult = await this.soqlAdapter.query(soql);
254
+ if (!queryResult.success) {
255
+ return createFailureResult([], ServiceErrorCodes.REQUEST_LIST_QUERY_FAILED, queryResult.message ?? 'Profile request query failed', { metadata: { duration: Date.now() - startTime } });
256
+ }
257
+ const requests = queryResult.data.records.map((r) => ProfileRequestService.mapRecord(r));
258
+ const duration = Date.now() - startTime;
259
+ this.logger?.log(`Found ${requests.length} profiling requests`);
260
+ return createSuccessResult(requests, {
261
+ message: `Found ${requests.length} profiling requests`,
262
+ metadata: { duration },
263
+ });
264
+ }
265
+ catch (error) {
266
+ const errorMessage = error instanceof Error ? error.message : String(error);
267
+ this.logger?.log(`Profile request list failed: ${errorMessage}`);
268
+ return createFailureResult([], ServiceErrorCodes.REQUEST_LIST_QUERY_FAILED, errorMessage, {
269
+ metadata: { duration: Date.now() - startTime },
270
+ });
271
+ }
272
+ }
273
+ /**
274
+ * Cancel profiling requests by IDs or all cancellable requests.
275
+ *
276
+ * Supports three modes:
277
+ * 1. `all: true` - Cancel all requests in Queued status
278
+ * 2. `requestIds: [...]` - Cancel specific requests (must be in cancellable status)
279
+ * 3. `dryRun: true` - Preview what would be cancelled without making changes
280
+ *
281
+ * @param options - Cancel options specifying which requests to cancel
282
+ * @returns ServiceResult containing the cancel operation results
283
+ */
284
+ async cancelRequests(options) {
285
+ const startTime = Date.now();
286
+ const dryRun = options.dryRun ?? false;
287
+ const emptyResult = ProfileRequestService.emptyCancelResult(dryRun);
288
+ // Validate options
289
+ const validationError = ProfileRequestService.validateCancelOptions(options, emptyResult, startTime);
290
+ if (validationError) {
291
+ return validationError;
292
+ }
293
+ try {
294
+ const logPrefix = options.all ? 'all cancellable' : `IDs: ${options.requestIds.join(', ')}`;
295
+ this.logger?.log(`Cancelling profiling requests (${logPrefix})`);
296
+ // Query for cancellable requests
297
+ const soql = ProfileRequestService.buildCancellableQuery(options.requestIds);
298
+ const queryResult = await this.soqlAdapter.query(soql);
299
+ if (!queryResult.success) {
300
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_CANCEL_FAILED, queryResult.message ?? 'Failed to query cancellable requests', { metadata: { duration: Date.now() - startTime } });
301
+ }
302
+ const cancellableRecords = queryResult.data.records;
303
+ if (cancellableRecords.length === 0) {
304
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_NO_CANCELLABLE, 'No cancellable requests found matching the specified criteria.', { metadata: { duration: Date.now() - startTime } });
305
+ }
306
+ const mappedRequests = cancellableRecords.map((r) => ProfileRequestService.mapRecord(r));
307
+ // Dry run: return what would be cancelled without updating
308
+ if (dryRun) {
309
+ this.logger?.log(`Dry run: ${mappedRequests.length} requests would be cancelled`);
310
+ return createSuccessResult({
311
+ cancelled: mappedRequests,
312
+ failed: [],
313
+ dryRun: true,
314
+ totalCancellable: mappedRequests.length,
315
+ }, {
316
+ message: `Dry run: ${mappedRequests.length} requests would be cancelled`,
317
+ metadata: { duration: Date.now() - startTime },
318
+ });
319
+ }
320
+ // Execute cancellations and build result
321
+ const { cancelled, failed } = await this.executeCancellations(mappedRequests);
322
+ return this.buildCancelResult(cancelled, failed, mappedRequests.length, Date.now() - startTime);
323
+ }
324
+ catch (error) {
325
+ const errorMessage = error instanceof Error ? error.message : String(error);
326
+ this.logger?.log(`Profile request cancel failed: ${errorMessage}`);
327
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_CANCEL_FAILED, errorMessage, {
328
+ metadata: { duration: Date.now() - startTime },
329
+ });
330
+ }
331
+ }
332
+ /**
333
+ * Delete profiling requests by IDs or all deletable requests.
334
+ *
335
+ * Supports three modes:
336
+ * 1. `all: true` - Delete all requests in Canceled/Rejected status
337
+ * 2. `requestIds: [...]` - Delete specific requests (must be in Canceled/Rejected status)
338
+ * 3. `dryRun: true` - Preview what would be deleted without making changes
339
+ *
340
+ * Uses the ISV bulk REST endpoint (`DELETE /v1/profiling/requests?ids=...`) for
341
+ * the actual deletion. IDs are passed via query params because jsforce strips
342
+ * the body from DELETE requests (RFC 7231 defines no semantics for DELETE payloads).
343
+ *
344
+ * This is an irreversible operation.
345
+ *
346
+ * @param options - Delete options specifying which requests to delete
347
+ * @returns ServiceResult containing the delete operation results
348
+ */
349
+ async deleteRequests(options) {
350
+ const startTime = Date.now();
351
+ const dryRun = options.dryRun ?? false;
352
+ const emptyResult = ProfileRequestService.emptyDeleteResult(dryRun);
353
+ // Validate options
354
+ const validationError = ProfileRequestService.validateDeleteOptions(options, emptyResult, startTime);
355
+ if (validationError) {
356
+ return validationError;
357
+ }
358
+ try {
359
+ const logPrefix = options.all ? 'all deletable' : `IDs: ${options.requestIds.join(', ')}`;
360
+ this.logger?.log(`Deleting profiling requests (${logPrefix})`);
361
+ // Query for deletable requests
362
+ const soql = ProfileRequestService.buildDeletableQuery(options.requestIds);
363
+ const queryResult = await this.soqlAdapter.query(soql);
364
+ if (!queryResult.success) {
365
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_DELETE_FAILED, queryResult.message ?? 'Failed to query deletable requests', { metadata: { duration: Date.now() - startTime } });
366
+ }
367
+ const deletableRecords = queryResult.data.records;
368
+ const mappedRequests = deletableRecords.map((r) => ProfileRequestService.mapRecord(r));
369
+ // Compute which requested IDs were filtered out (not in a deletable state)
370
+ const nonDeletableFailed = [];
371
+ if (options.requestIds && options.requestIds.length > 0) {
372
+ const returnedIds = new Set(mappedRequests.map((r) => r.id));
373
+ for (const id of options.requestIds) {
374
+ if (!returnedIds.has(id)) {
375
+ nonDeletableFailed.push({
376
+ id,
377
+ error: 'Request is not in a deletable state (must be Canceled or Rejected)',
378
+ });
379
+ }
380
+ }
381
+ }
382
+ if (deletableRecords.length === 0) {
383
+ return createFailureResult({ ...emptyResult, failed: nonDeletableFailed }, ServiceErrorCodes.REQUEST_NO_DELETABLE, 'No deletable requests found matching the specified criteria.', { metadata: { duration: Date.now() - startTime } });
384
+ }
385
+ // Dry run: return what would be deleted without calling ISV endpoint
386
+ if (dryRun) {
387
+ this.logger?.log(`Dry run: ${mappedRequests.length} requests would be deleted`);
388
+ return createSuccessResult({
389
+ deleted: mappedRequests,
390
+ failed: nonDeletableFailed,
391
+ dryRun: true,
392
+ totalDeletable: mappedRequests.length,
393
+ }, {
394
+ message: `Dry run: ${mappedRequests.length} requests would be deleted`,
395
+ metadata: { duration: Date.now() - startTime },
396
+ });
397
+ }
398
+ // Execute deletion via ISV bulk REST endpoint
399
+ const requestIds = mappedRequests.map((r) => r.id);
400
+ const deleteResult = await this.executeIsvDelete(requestIds);
401
+ if (!deleteResult.success) {
402
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_DELETE_FAILED, deleteResult.message ?? 'Delete operation failed', { metadata: { duration: Date.now() - startTime } });
403
+ }
404
+ // Map ISV response to rich result with IProfileRequest details
405
+ return this.buildDeleteResult(deleteResult.data, mappedRequests, Date.now() - startTime, nonDeletableFailed);
406
+ }
407
+ catch (error) {
408
+ const errorMessage = error instanceof Error ? error.message : String(error);
409
+ this.logger?.log(`Profile request delete failed: ${errorMessage}`);
410
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_DELETE_FAILED, errorMessage, {
411
+ metadata: { duration: Date.now() - startTime },
412
+ });
413
+ }
414
+ }
415
+ /**
416
+ * Executes cancellation via the Cuneiform REST API cancel-requests action.
417
+ * Direct DML is blocked by a trigger guard on Profiling_Request__c;
418
+ * cancellation must go through GlobalProfilingService.cancelProfilingRequests().
419
+ *
420
+ * @param requests - The mapped requests to cancel
421
+ * @returns Object with cancelled and failed arrays
422
+ */
423
+ async executeCancellations(requests) {
424
+ const requestIds = requests.map((r) => r.id);
425
+ const restResult = await this.restAdapter.request({
426
+ url: `${PROFILING_REST_BASE}/cancel-requests`,
427
+ method: 'POST',
428
+ body: { requestsToCancel: requestIds },
429
+ });
430
+ if (!restResult.success) {
431
+ return {
432
+ cancelled: [],
433
+ failed: requests.map((r) => ({ id: r.id, error: restResult.message ?? 'Cancel REST call failed' })),
434
+ };
435
+ }
436
+ const response = restResult.data;
437
+ if (!response.success) {
438
+ const errorMsg = response.errors?.join('; ') ?? 'Cancel operation failed';
439
+ return {
440
+ cancelled: [],
441
+ failed: requests.map((r) => ({ id: r.id, error: errorMsg })),
442
+ };
443
+ }
444
+ // All requests cancelled successfully via the service
445
+ return { cancelled: requests, failed: [] };
446
+ }
447
+ /**
448
+ * Builds the final cancel result based on update outcomes.
449
+ *
450
+ * @param cancelled - Successfully cancelled requests
451
+ * @param failed - Requests that failed to cancel
452
+ * @param totalCancellable - Total number of cancellable requests found
453
+ * @param duration - Operation duration in milliseconds
454
+ * @returns ServiceResult with appropriate error code for partial/total failure
455
+ */
456
+ buildCancelResult(cancelled, failed, totalCancellable, duration) {
457
+ const resultData = {
458
+ cancelled,
459
+ failed,
460
+ dryRun: false,
461
+ totalCancellable,
462
+ };
463
+ if (cancelled.length === 0) {
464
+ this.logger?.log(`Cancel failed: all ${failed.length} updates failed`);
465
+ return createFailureResult(resultData, ServiceErrorCodes.REQUEST_CANCEL_FAILED, `All ${failed.length} cancel operations failed`, { metadata: { duration } });
466
+ }
467
+ if (failed.length > 0) {
468
+ this.logger?.log(`Cancel partial: ${cancelled.length} succeeded, ${failed.length} failed`);
469
+ return createFailureResult(resultData, ServiceErrorCodes.REQUEST_CANCEL_PARTIAL_FAILURE, `${cancelled.length} of ${totalCancellable} requests cancelled; ${failed.length} failed`, { metadata: { duration } });
470
+ }
471
+ this.logger?.log(`Cancelled ${cancelled.length} profiling requests`);
472
+ return createSuccessResult(resultData, {
473
+ message: `Cancelled ${cancelled.length} profiling requests`,
474
+ metadata: { duration },
475
+ });
476
+ }
477
+ /**
478
+ * Calls the ISV REST endpoint to delete profiling requests in bulk.
479
+ *
480
+ * IDs are passed via query params instead of request body because RFC 7231
481
+ * defines no semantics for DELETE payloads, and jsforce's transport layer
482
+ * strips the body for DELETE requests — causing the call to hang indefinitely.
483
+ *
484
+ * @param requestIds - Array of request IDs to delete (max 200, ISV backend limit)
485
+ * @returns ServiceResult containing the raw ISV API response
486
+ */
487
+ async executeIsvDelete(requestIds) {
488
+ return this.restAdapter.request({
489
+ url: `${PROFILING_REST_BASE}/requests?ids=${encodeURIComponent(requestIds.join(','))}`,
490
+ method: 'DELETE',
491
+ });
492
+ }
493
+ /**
494
+ * Builds the final delete result by correlating ISV API response items
495
+ * with the queried IProfileRequest objects.
496
+ *
497
+ * @param apiResponse - Raw ISV API response
498
+ * @param queriedRequests - Full IProfileRequest objects from SOQL
499
+ * @param duration - Operation duration in milliseconds
500
+ * @returns ServiceResult with rich delete result
501
+ */
502
+ buildDeleteResult(apiResponse, queriedRequests, duration, nonDeletableFailed = []) {
503
+ const emptyResult = ProfileRequestService.emptyDeleteResult(false);
504
+ // Handle top-level API error
505
+ if (!apiResponse.success && apiResponse.errors) {
506
+ const errorMsg = apiResponse.errors.join('; ');
507
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_DELETE_FAILED, errorMsg, {
508
+ metadata: { duration },
509
+ });
510
+ }
511
+ // Handle null results (defensive)
512
+ if (!apiResponse.results) {
513
+ return createFailureResult(emptyResult, ServiceErrorCodes.REQUEST_DELETE_FAILED, 'Delete endpoint returned no results', { metadata: { duration } });
514
+ }
515
+ // Build ID-to-request lookup for rich result mapping
516
+ const requestMap = new Map(queriedRequests.map((r) => [r.id, r]));
517
+ const deleted = [];
518
+ const failed = [...nonDeletableFailed];
519
+ for (const item of apiResponse.results) {
520
+ if (item.success) {
521
+ const request = requestMap.get(item.id);
522
+ if (request) {
523
+ deleted.push(request);
524
+ }
525
+ }
526
+ else {
527
+ failed.push({
528
+ id: item.id,
529
+ error: item.message ?? 'Delete failed',
530
+ });
531
+ }
532
+ }
533
+ const totalDeletable = queriedRequests.length;
534
+ const resultData = {
535
+ deleted,
536
+ failed,
537
+ dryRun: false,
538
+ totalDeletable,
539
+ };
540
+ if (deleted.length === 0) {
541
+ this.logger?.log(`Delete failed: all ${failed.length} operations failed`);
542
+ return createFailureResult(resultData, ServiceErrorCodes.REQUEST_DELETE_FAILED, `All ${failed.length} delete operations failed`, { metadata: { duration } });
543
+ }
544
+ if (failed.length > 0) {
545
+ this.logger?.log(`Delete partial: ${deleted.length} succeeded, ${failed.length} failed`);
546
+ return createFailureResult(resultData, ServiceErrorCodes.REQUEST_DELETE_PARTIAL_FAILURE, `${deleted.length} of ${totalDeletable} requests deleted; ${failed.length} failed`, { metadata: { duration } });
547
+ }
548
+ this.logger?.log(`Deleted ${deleted.length} profiling requests`);
549
+ return createSuccessResult(resultData, {
550
+ message: `Deleted ${deleted.length} profiling requests`,
551
+ metadata: { duration },
552
+ });
553
+ }
554
+ }
555
+ //# sourceMappingURL=ProfileRequestService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileRequestService.js","sourceRoot":"","sources":["../../src/services/ProfileRequestService.ts"],"names":[],"mappings":"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"}