@decaf-ts/integrations 0.11.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (610) hide show
  1. package/README.md +164 -0
  2. package/dist/integrations.cjs +1 -1
  3. package/dist/integrations.cjs.map +1 -1
  4. package/dist/integrations.js +1 -1
  5. package/dist/integrations.js.map +1 -1
  6. package/docker/mailpit-compose.yml +17 -0
  7. package/docker/postgres-compose.yml +26 -0
  8. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +12 -23
  9. package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -1
  10. package/lib/cjs/blob/core/BlobStoreService.cjs +26 -25
  11. package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -1
  12. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +12 -23
  13. package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -1
  14. package/lib/cjs/blob/s3/S3BlobStoreService.cjs +11 -16
  15. package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -1
  16. package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs +14 -16
  17. package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs.map +1 -1
  18. package/lib/cjs/calendar/environment.cjs +48 -0
  19. package/lib/cjs/calendar/environment.cjs.map +1 -0
  20. package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs +338 -0
  21. package/lib/cjs/calendar/google-calendar/GoogleCalendarService.cjs.map +1 -0
  22. package/lib/cjs/calendar/google-calendar/index.cjs +20 -0
  23. package/lib/cjs/calendar/google-calendar/index.cjs.map +1 -0
  24. package/lib/cjs/comms/discord/DiscordService.cjs +318 -0
  25. package/lib/cjs/comms/discord/DiscordService.cjs.map +1 -0
  26. package/lib/cjs/comms/discord/index.cjs +19 -0
  27. package/lib/cjs/comms/discord/index.cjs.map +1 -0
  28. package/lib/cjs/comms/email/EmailService.cjs +376 -0
  29. package/lib/cjs/comms/email/EmailService.cjs.map +1 -0
  30. package/lib/cjs/comms/email/index.cjs +29 -0
  31. package/lib/cjs/comms/email/index.cjs.map +1 -0
  32. package/lib/cjs/comms/email/mime.cjs +225 -0
  33. package/lib/cjs/comms/email/mime.cjs.map +1 -0
  34. package/lib/cjs/comms/email/smtp.cjs +204 -0
  35. package/lib/cjs/comms/email/smtp.cjs.map +1 -0
  36. package/lib/cjs/comms/environment.cjs +79 -0
  37. package/lib/cjs/comms/environment.cjs.map +1 -0
  38. package/lib/cjs/comms/gmail/GmailService.cjs +235 -0
  39. package/lib/cjs/comms/gmail/GmailService.cjs.map +1 -0
  40. package/lib/cjs/comms/gmail/index.cjs +24 -0
  41. package/lib/cjs/comms/gmail/index.cjs.map +1 -0
  42. package/lib/cjs/comms/index.cjs +34 -0
  43. package/lib/cjs/comms/index.cjs.map +1 -0
  44. package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs +325 -0
  45. package/lib/cjs/comms/outlook/MicrosoftOutlookService.cjs.map +1 -0
  46. package/lib/cjs/comms/outlook/index.cjs +19 -0
  47. package/lib/cjs/comms/outlook/index.cjs.map +1 -0
  48. package/lib/cjs/comms/slack/SlackService.cjs +264 -0
  49. package/lib/cjs/comms/slack/SlackService.cjs.map +1 -0
  50. package/lib/cjs/comms/slack/index.cjs +24 -0
  51. package/lib/cjs/comms/slack/index.cjs.map +1 -0
  52. package/lib/cjs/comms/teams/TeamsService.cjs +212 -0
  53. package/lib/cjs/comms/teams/TeamsService.cjs.map +1 -0
  54. package/lib/cjs/comms/teams/index.cjs +24 -0
  55. package/lib/cjs/comms/teams/index.cjs.map +1 -0
  56. package/lib/cjs/comms/telegram/TelegramService.cjs +196 -0
  57. package/lib/cjs/comms/telegram/TelegramService.cjs.map +1 -0
  58. package/lib/cjs/comms/telegram/index.cjs +24 -0
  59. package/lib/cjs/comms/telegram/index.cjs.map +1 -0
  60. package/lib/cjs/comms/whatsapp/WhatsAppService.cjs +274 -0
  61. package/lib/cjs/comms/whatsapp/WhatsAppService.cjs.map +1 -0
  62. package/lib/cjs/comms/whatsapp/index.cjs +19 -0
  63. package/lib/cjs/comms/whatsapp/index.cjs.map +1 -0
  64. package/lib/cjs/devops/environment.cjs +43 -0
  65. package/lib/cjs/devops/environment.cjs.map +1 -0
  66. package/lib/cjs/devops/github/GithubService.cjs +302 -0
  67. package/lib/cjs/devops/github/GithubService.cjs.map +1 -0
  68. package/lib/cjs/devops/github/index.cjs +24 -0
  69. package/lib/cjs/devops/github/index.cjs.map +1 -0
  70. package/lib/cjs/devops/gitlab/GitlabService.cjs +282 -0
  71. package/lib/cjs/devops/gitlab/GitlabService.cjs.map +1 -0
  72. package/lib/cjs/devops/gitlab/index.cjs +24 -0
  73. package/lib/cjs/devops/gitlab/index.cjs.map +1 -0
  74. package/lib/cjs/devops/index.cjs +28 -0
  75. package/lib/cjs/devops/index.cjs.map +1 -0
  76. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -0
  77. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -1
  78. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -0
  79. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -1
  80. package/lib/cjs/index.cjs +3 -3
  81. package/lib/cjs/io/airtable/AirtableService.cjs +266 -0
  82. package/lib/cjs/io/airtable/AirtableService.cjs.map +1 -0
  83. package/lib/cjs/io/airtable/index.cjs +24 -0
  84. package/lib/cjs/io/airtable/index.cjs.map +1 -0
  85. package/lib/cjs/io/confluence/ConfluenceService.cjs +317 -0
  86. package/lib/cjs/io/confluence/ConfluenceService.cjs.map +1 -0
  87. package/lib/cjs/io/confluence/index.cjs +19 -0
  88. package/lib/cjs/io/confluence/index.cjs.map +1 -0
  89. package/lib/cjs/io/environment.cjs +74 -0
  90. package/lib/cjs/io/environment.cjs.map +1 -0
  91. package/lib/cjs/io/google-docs/GoogleDocsService.cjs +275 -0
  92. package/lib/cjs/io/google-docs/GoogleDocsService.cjs.map +1 -0
  93. package/lib/cjs/io/google-docs/index.cjs +19 -0
  94. package/lib/cjs/io/google-docs/index.cjs.map +1 -0
  95. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs +288 -0
  96. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs.map +1 -0
  97. package/lib/cjs/io/google-sheets/index.cjs +24 -0
  98. package/lib/cjs/io/google-sheets/index.cjs.map +1 -0
  99. package/lib/cjs/io/graphql/GraphqlService.cjs +143 -0
  100. package/lib/cjs/io/graphql/GraphqlService.cjs.map +1 -0
  101. package/lib/cjs/io/graphql/index.cjs +24 -0
  102. package/lib/cjs/io/graphql/index.cjs.map +1 -0
  103. package/lib/cjs/io/index.cjs +35 -0
  104. package/lib/cjs/io/index.cjs.map +1 -0
  105. package/lib/cjs/io/jira/JiraService.cjs +354 -0
  106. package/lib/cjs/io/jira/JiraService.cjs.map +1 -0
  107. package/lib/cjs/io/jira/index.cjs +19 -0
  108. package/lib/cjs/io/jira/index.cjs.map +1 -0
  109. package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs +253 -0
  110. package/lib/cjs/io/microsoft-excel/MicrosoftExcelService.cjs.map +1 -0
  111. package/lib/cjs/io/microsoft-excel/index.cjs +19 -0
  112. package/lib/cjs/io/microsoft-excel/index.cjs.map +1 -0
  113. package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs +261 -0
  114. package/lib/cjs/io/microsoft-sharepoint/MicrosoftSharePointService.cjs.map +1 -0
  115. package/lib/cjs/io/microsoft-sharepoint/index.cjs +19 -0
  116. package/lib/cjs/io/microsoft-sharepoint/index.cjs.map +1 -0
  117. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs +205 -0
  118. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs.map +1 -0
  119. package/lib/cjs/io/spreadsheet/index.cjs +25 -0
  120. package/lib/cjs/io/spreadsheet/index.cjs.map +1 -0
  121. package/lib/cjs/namespaces/index.cjs +1 -0
  122. package/lib/cjs/namespaces/index.cjs.map +1 -1
  123. package/lib/cjs/namespaces/models/credential.model.cjs +115 -0
  124. package/lib/cjs/namespaces/models/credential.model.cjs.map +1 -0
  125. package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -0
  126. package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -1
  127. package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -0
  128. package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -1
  129. package/lib/cjs/namespaces/models/group.model.cjs +2 -0
  130. package/lib/cjs/namespaces/models/group.model.cjs.map +1 -1
  131. package/lib/cjs/namespaces/models/index.cjs +1 -0
  132. package/lib/cjs/namespaces/models/index.cjs.map +1 -1
  133. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -0
  134. package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -1
  135. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -0
  136. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -1
  137. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -0
  138. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -1
  139. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -0
  140. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -1
  141. package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -0
  142. package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -1
  143. package/lib/cjs/namespaces/models/permission.model.cjs +2 -0
  144. package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -1
  145. package/lib/cjs/namespaces/models/principal.model.cjs +2 -0
  146. package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -1
  147. package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -0
  148. package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -1
  149. package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -0
  150. package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -1
  151. package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -0
  152. package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -1
  153. package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -0
  154. package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -1
  155. package/lib/cjs/namespaces/models/role.model.cjs +2 -0
  156. package/lib/cjs/namespaces/models/role.model.cjs.map +1 -1
  157. package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -0
  158. package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -1
  159. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -0
  160. package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -1
  161. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -0
  162. package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -1
  163. package/lib/cjs/namespaces/models/tenant.model.cjs +2 -0
  164. package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -1
  165. package/lib/cjs/namespaces/models/user.model.cjs +2 -0
  166. package/lib/cjs/namespaces/models/user.model.cjs.map +1 -1
  167. package/lib/cjs/namespaces/rls/index.cjs +28 -0
  168. package/lib/cjs/namespaces/rls/index.cjs.map +1 -0
  169. package/lib/cjs/namespaces/rls/principal-resolver.cjs +66 -0
  170. package/lib/cjs/namespaces/rls/principal-resolver.cjs.map +1 -0
  171. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs +269 -0
  172. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs.map +1 -0
  173. package/lib/cjs/namespaces/rls/rls.constants.cjs +79 -0
  174. package/lib/cjs/namespaces/rls/rls.constants.cjs.map +1 -0
  175. package/lib/cjs/namespaces/rls/rls.template.cjs +719 -0
  176. package/lib/cjs/namespaces/rls/rls.template.cjs.map +1 -0
  177. package/lib/cjs/namespaces/rls/rls.types.cjs +4 -0
  178. package/lib/cjs/namespaces/rls/rls.types.cjs.map +1 -0
  179. package/lib/cjs/namespaces/rls/session-binding.cjs +70 -0
  180. package/lib/cjs/namespaces/rls/session-binding.cjs.map +1 -0
  181. package/lib/cjs/namespaces/services/credential.service.cjs +327 -0
  182. package/lib/cjs/namespaces/services/credential.service.cjs.map +1 -0
  183. package/lib/cjs/namespaces/services/index.cjs +1 -0
  184. package/lib/cjs/namespaces/services/index.cjs.map +1 -1
  185. package/lib/cjs/namespaces/types.cjs +6 -1
  186. package/lib/cjs/namespaces/types.cjs.map +1 -1
  187. package/lib/cjs/redis/adapter.cjs +7 -1
  188. package/lib/cjs/redis/adapter.cjs.map +1 -1
  189. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs +80 -0
  190. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs.map +1 -0
  191. package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -15
  192. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
  193. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -16
  194. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
  195. package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
  196. package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
  197. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs +28 -0
  198. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs.map +1 -0
  199. package/lib/cjs/secrets/fs/FsSecretService.cjs +420 -0
  200. package/lib/cjs/secrets/fs/FsSecretService.cjs.map +1 -0
  201. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs +25 -0
  202. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs.map +1 -0
  203. package/lib/cjs/secrets/fs/index.cjs +27 -0
  204. package/lib/cjs/secrets/fs/index.cjs.map +1 -0
  205. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -16
  206. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
  207. package/lib/cjs/secrets/index.cjs +2 -0
  208. package/lib/cjs/secrets/index.cjs.map +1 -1
  209. package/lib/cjs/secrets/model/ModelSecretService.cjs +335 -43
  210. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
  211. package/lib/cjs/secrets/model/Secret.cjs +83 -5
  212. package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
  213. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -16
  214. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
  215. package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -16
  216. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
  217. package/lib/cjs/shared/environmentValue.cjs +24 -0
  218. package/lib/cjs/shared/environmentValue.cjs.map +1 -1
  219. package/lib/cjs/shared/http/HttpApiService.cjs +190 -0
  220. package/lib/cjs/shared/http/HttpApiService.cjs.map +1 -0
  221. package/lib/cjs/shared/http/hermeticBoot.cjs +150 -0
  222. package/lib/cjs/shared/http/hermeticBoot.cjs.map +1 -0
  223. package/lib/cjs/shared/http/index.cjs +28 -0
  224. package/lib/cjs/shared/http/index.cjs.map +1 -0
  225. package/lib/esm/blob/azure/AzureBlobStoreService.js +13 -21
  226. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -1
  227. package/lib/esm/blob/core/BlobStoreService.js +26 -25
  228. package/lib/esm/blob/core/BlobStoreService.js.map +1 -1
  229. package/lib/esm/blob/gcp/GcsBlobStoreService.js +13 -21
  230. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -1
  231. package/lib/esm/blob/s3/S3BlobStoreService.js +12 -14
  232. package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -1
  233. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js +14 -16
  234. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js.map +1 -1
  235. package/lib/esm/calendar/environment.js +44 -0
  236. package/lib/esm/calendar/environment.js.map +1 -0
  237. package/lib/esm/calendar/google-calendar/GoogleCalendarService.js +333 -0
  238. package/lib/esm/calendar/google-calendar/GoogleCalendarService.js.map +1 -0
  239. package/lib/esm/calendar/google-calendar/index.js +3 -0
  240. package/lib/esm/calendar/google-calendar/index.js.map +1 -0
  241. package/lib/esm/comms/discord/DiscordService.js +313 -0
  242. package/lib/esm/comms/discord/DiscordService.js.map +1 -0
  243. package/lib/esm/comms/discord/index.js +2 -0
  244. package/lib/esm/comms/discord/index.js.map +1 -0
  245. package/lib/esm/comms/email/EmailService.js +338 -0
  246. package/lib/esm/comms/email/EmailService.js.map +1 -0
  247. package/lib/esm/comms/email/index.js +12 -0
  248. package/lib/esm/comms/email/index.js.map +1 -0
  249. package/lib/esm/comms/email/mime.js +218 -0
  250. package/lib/esm/comms/email/mime.js.map +1 -0
  251. package/lib/esm/comms/email/smtp.js +166 -0
  252. package/lib/esm/comms/email/smtp.js.map +1 -0
  253. package/lib/esm/comms/environment.js +75 -0
  254. package/lib/esm/comms/environment.js.map +1 -0
  255. package/lib/esm/comms/gmail/GmailService.js +230 -0
  256. package/lib/esm/comms/gmail/GmailService.js.map +1 -0
  257. package/lib/esm/comms/gmail/index.js +7 -0
  258. package/lib/esm/comms/gmail/index.js.map +1 -0
  259. package/lib/esm/comms/index.js +17 -0
  260. package/lib/esm/comms/index.js.map +1 -0
  261. package/lib/esm/comms/outlook/MicrosoftOutlookService.js +320 -0
  262. package/lib/esm/comms/outlook/MicrosoftOutlookService.js.map +1 -0
  263. package/lib/esm/comms/outlook/index.js +2 -0
  264. package/lib/esm/comms/outlook/index.js.map +1 -0
  265. package/lib/esm/comms/slack/SlackService.js +259 -0
  266. package/lib/esm/comms/slack/SlackService.js.map +1 -0
  267. package/lib/esm/comms/slack/index.js +7 -0
  268. package/lib/esm/comms/slack/index.js.map +1 -0
  269. package/lib/esm/comms/teams/TeamsService.js +204 -0
  270. package/lib/esm/comms/teams/TeamsService.js.map +1 -0
  271. package/lib/esm/comms/teams/index.js +7 -0
  272. package/lib/esm/comms/teams/index.js.map +1 -0
  273. package/lib/esm/comms/telegram/TelegramService.js +191 -0
  274. package/lib/esm/comms/telegram/TelegramService.js.map +1 -0
  275. package/lib/esm/comms/telegram/index.js +7 -0
  276. package/lib/esm/comms/telegram/index.js.map +1 -0
  277. package/lib/esm/comms/whatsapp/WhatsAppService.js +269 -0
  278. package/lib/esm/comms/whatsapp/WhatsAppService.js.map +1 -0
  279. package/lib/esm/comms/whatsapp/index.js +2 -0
  280. package/lib/esm/comms/whatsapp/index.js.map +1 -0
  281. package/lib/esm/devops/environment.js +39 -0
  282. package/lib/esm/devops/environment.js.map +1 -0
  283. package/lib/esm/devops/github/GithubService.js +297 -0
  284. package/lib/esm/devops/github/GithubService.js.map +1 -0
  285. package/lib/esm/devops/github/index.js +7 -0
  286. package/lib/esm/devops/github/index.js.map +1 -0
  287. package/lib/esm/devops/gitlab/GitlabService.js +277 -0
  288. package/lib/esm/devops/gitlab/GitlabService.js.map +1 -0
  289. package/lib/esm/devops/gitlab/index.js +7 -0
  290. package/lib/esm/devops/gitlab/index.js.map +1 -0
  291. package/lib/esm/devops/index.js +11 -0
  292. package/lib/esm/devops/index.js.map +1 -0
  293. package/lib/esm/feature-flags/models/FeatureFlag.model.js +2 -0
  294. package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -1
  295. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +2 -0
  296. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -1
  297. package/lib/esm/index.js +3 -3
  298. package/lib/esm/io/airtable/AirtableService.js +261 -0
  299. package/lib/esm/io/airtable/AirtableService.js.map +1 -0
  300. package/lib/esm/io/airtable/index.js +7 -0
  301. package/lib/esm/io/airtable/index.js.map +1 -0
  302. package/lib/esm/io/confluence/ConfluenceService.js +312 -0
  303. package/lib/esm/io/confluence/ConfluenceService.js.map +1 -0
  304. package/lib/esm/io/confluence/index.js +2 -0
  305. package/lib/esm/io/confluence/index.js.map +1 -0
  306. package/lib/esm/io/environment.js +70 -0
  307. package/lib/esm/io/environment.js.map +1 -0
  308. package/lib/esm/io/google-docs/GoogleDocsService.js +270 -0
  309. package/lib/esm/io/google-docs/GoogleDocsService.js.map +1 -0
  310. package/lib/esm/io/google-docs/index.js +2 -0
  311. package/lib/esm/io/google-docs/index.js.map +1 -0
  312. package/lib/esm/io/google-sheets/GoogleSheetsService.js +283 -0
  313. package/lib/esm/io/google-sheets/GoogleSheetsService.js.map +1 -0
  314. package/lib/esm/io/google-sheets/index.js +7 -0
  315. package/lib/esm/io/google-sheets/index.js.map +1 -0
  316. package/lib/esm/io/graphql/GraphqlService.js +138 -0
  317. package/lib/esm/io/graphql/GraphqlService.js.map +1 -0
  318. package/lib/esm/io/graphql/index.js +7 -0
  319. package/lib/esm/io/graphql/index.js.map +1 -0
  320. package/lib/esm/io/index.js +18 -0
  321. package/lib/esm/io/index.js.map +1 -0
  322. package/lib/esm/io/jira/JiraService.js +349 -0
  323. package/lib/esm/io/jira/JiraService.js.map +1 -0
  324. package/lib/esm/io/jira/index.js +2 -0
  325. package/lib/esm/io/jira/index.js.map +1 -0
  326. package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js +248 -0
  327. package/lib/esm/io/microsoft-excel/MicrosoftExcelService.js.map +1 -0
  328. package/lib/esm/io/microsoft-excel/index.js +2 -0
  329. package/lib/esm/io/microsoft-excel/index.js.map +1 -0
  330. package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js +256 -0
  331. package/lib/esm/io/microsoft-sharepoint/MicrosoftSharePointService.js.map +1 -0
  332. package/lib/esm/io/microsoft-sharepoint/index.js +2 -0
  333. package/lib/esm/io/microsoft-sharepoint/index.js.map +1 -0
  334. package/lib/esm/io/spreadsheet/SpreadsheetService.js +200 -0
  335. package/lib/esm/io/spreadsheet/SpreadsheetService.js.map +1 -0
  336. package/lib/esm/io/spreadsheet/index.js +8 -0
  337. package/lib/esm/io/spreadsheet/index.js.map +1 -0
  338. package/lib/esm/namespaces/index.js +1 -0
  339. package/lib/esm/namespaces/index.js.map +1 -1
  340. package/lib/esm/namespaces/models/credential.model.js +106 -0
  341. package/lib/esm/namespaces/models/credential.model.js.map +1 -0
  342. package/lib/esm/namespaces/models/effective-permission.model.js +2 -0
  343. package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -1
  344. package/lib/esm/namespaces/models/group-membership.model.js +2 -0
  345. package/lib/esm/namespaces/models/group-membership.model.js.map +1 -1
  346. package/lib/esm/namespaces/models/group.model.js +2 -0
  347. package/lib/esm/namespaces/models/group.model.js.map +1 -1
  348. package/lib/esm/namespaces/models/index.js +1 -0
  349. package/lib/esm/namespaces/models/index.js.map +1 -1
  350. package/lib/esm/namespaces/models/inheritance-block.model.js +2 -0
  351. package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -1
  352. package/lib/esm/namespaces/models/org-unit-closure.model.js +2 -0
  353. package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -1
  354. package/lib/esm/namespaces/models/org-unit-membership.model.js +2 -0
  355. package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -1
  356. package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -0
  357. package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -1
  358. package/lib/esm/namespaces/models/org-unit.model.js +2 -0
  359. package/lib/esm/namespaces/models/org-unit.model.js.map +1 -1
  360. package/lib/esm/namespaces/models/permission.model.js +2 -0
  361. package/lib/esm/namespaces/models/permission.model.js.map +1 -1
  362. package/lib/esm/namespaces/models/principal.model.js +2 -0
  363. package/lib/esm/namespaces/models/principal.model.js.map +1 -1
  364. package/lib/esm/namespaces/models/protected-resource.model.js +2 -0
  365. package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -1
  366. package/lib/esm/namespaces/models/resource-grant.model.js +2 -0
  367. package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -1
  368. package/lib/esm/namespaces/models/role-assignment.model.js +2 -0
  369. package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -1
  370. package/lib/esm/namespaces/models/role-permission.model.js +2 -0
  371. package/lib/esm/namespaces/models/role-permission.model.js.map +1 -1
  372. package/lib/esm/namespaces/models/role.model.js +2 -0
  373. package/lib/esm/namespaces/models/role.model.js.map +1 -1
  374. package/lib/esm/namespaces/models/storage-binding.model.js +2 -0
  375. package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -1
  376. package/lib/esm/namespaces/models/tenant-membership.model.js +2 -0
  377. package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -1
  378. package/lib/esm/namespaces/models/tenant-profile.model.js +2 -0
  379. package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -1
  380. package/lib/esm/namespaces/models/tenant.model.js +2 -0
  381. package/lib/esm/namespaces/models/tenant.model.js.map +1 -1
  382. package/lib/esm/namespaces/models/user.model.js +2 -0
  383. package/lib/esm/namespaces/models/user.model.js.map +1 -1
  384. package/lib/esm/namespaces/rls/index.js +11 -0
  385. package/lib/esm/namespaces/rls/index.js.map +1 -0
  386. package/lib/esm/namespaces/rls/principal-resolver.js +61 -0
  387. package/lib/esm/namespaces/rls/principal-resolver.js.map +1 -0
  388. package/lib/esm/namespaces/rls/rls-bootstrap.service.js +261 -0
  389. package/lib/esm/namespaces/rls/rls-bootstrap.service.js.map +1 -0
  390. package/lib/esm/namespaces/rls/rls.constants.js +75 -0
  391. package/lib/esm/namespaces/rls/rls.constants.js.map +1 -0
  392. package/lib/esm/namespaces/rls/rls.template.js +711 -0
  393. package/lib/esm/namespaces/rls/rls.template.js.map +1 -0
  394. package/lib/esm/namespaces/rls/rls.types.js +9 -0
  395. package/lib/esm/namespaces/rls/rls.types.js.map +1 -0
  396. package/lib/esm/namespaces/rls/session-binding.js +65 -0
  397. package/lib/esm/namespaces/rls/session-binding.js.map +1 -0
  398. package/lib/esm/namespaces/services/credential.service.js +322 -0
  399. package/lib/esm/namespaces/services/credential.service.js.map +1 -0
  400. package/lib/esm/namespaces/services/index.js +1 -0
  401. package/lib/esm/namespaces/services/index.js.map +1 -1
  402. package/lib/esm/namespaces/types.js +6 -0
  403. package/lib/esm/namespaces/types.js.map +1 -1
  404. package/lib/esm/redis/adapter.js +7 -1
  405. package/lib/esm/redis/adapter.js.map +1 -1
  406. package/lib/esm/secrets/InfraCredentialBootstrap.js +74 -0
  407. package/lib/esm/secrets/InfraCredentialBootstrap.js.map +1 -0
  408. package/lib/esm/secrets/aws/AwsSecretService.js +3 -13
  409. package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -1
  410. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +2 -13
  411. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -1
  412. package/lib/esm/secrets/core/SecretReference.js +1 -0
  413. package/lib/esm/secrets/core/SecretReference.js.map +1 -1
  414. package/lib/esm/secrets/fs/FsSecretEnvironment.js +24 -0
  415. package/lib/esm/secrets/fs/FsSecretEnvironment.js.map +1 -0
  416. package/lib/esm/secrets/fs/FsSecretService.js +412 -0
  417. package/lib/esm/secrets/fs/FsSecretService.js.map +1 -0
  418. package/lib/esm/secrets/fs/FsSecretServiceConfig.js +21 -0
  419. package/lib/esm/secrets/fs/FsSecretServiceConfig.js.map +1 -0
  420. package/lib/esm/secrets/fs/index.js +10 -0
  421. package/lib/esm/secrets/fs/index.js.map +1 -0
  422. package/lib/esm/secrets/gcp/GcpSecretManagerService.js +2 -13
  423. package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -1
  424. package/lib/esm/secrets/index.js +2 -0
  425. package/lib/esm/secrets/index.js.map +1 -1
  426. package/lib/esm/secrets/model/ModelSecretService.js +337 -42
  427. package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
  428. package/lib/esm/secrets/model/Secret.js +86 -7
  429. package/lib/esm/secrets/model/Secret.js.map +1 -1
  430. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +2 -13
  431. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -1
  432. package/lib/esm/secrets/vault/VaultSecretService.js +2 -13
  433. package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -1
  434. package/lib/esm/shared/environmentValue.js +24 -0
  435. package/lib/esm/shared/environmentValue.js.map +1 -1
  436. package/lib/esm/shared/http/HttpApiService.js +181 -0
  437. package/lib/esm/shared/http/HttpApiService.js.map +1 -0
  438. package/lib/esm/shared/http/hermeticBoot.js +146 -0
  439. package/lib/esm/shared/http/hermeticBoot.js.map +1 -0
  440. package/lib/esm/shared/http/index.js +11 -0
  441. package/lib/esm/shared/http/index.js.map +1 -0
  442. package/lib/types/blob/azure/AzureBlobStoreService.d.cts +7 -7
  443. package/lib/types/blob/azure/AzureBlobStoreService.d.mts +7 -7
  444. package/lib/types/blob/core/BlobStoreService.d.cts +28 -27
  445. package/lib/types/blob/core/BlobStoreService.d.mts +28 -27
  446. package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +7 -7
  447. package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +7 -7
  448. package/lib/types/blob/s3/S3BlobStoreService.d.cts +9 -1
  449. package/lib/types/blob/s3/S3BlobStoreService.d.mts +9 -1
  450. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.cts +11 -15
  451. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.mts +11 -15
  452. package/lib/types/calendar/environment.d.cts +48 -0
  453. package/lib/types/calendar/environment.d.mts +48 -0
  454. package/lib/types/calendar/google-calendar/GoogleCalendarService.d.cts +316 -0
  455. package/lib/types/calendar/google-calendar/GoogleCalendarService.d.mts +316 -0
  456. package/lib/types/calendar/google-calendar/index.d.cts +2 -0
  457. package/lib/types/calendar/google-calendar/index.d.mts +2 -0
  458. package/lib/types/comms/discord/DiscordService.d.cts +285 -0
  459. package/lib/types/comms/discord/DiscordService.d.mts +285 -0
  460. package/lib/types/comms/discord/index.d.cts +1 -0
  461. package/lib/types/comms/discord/index.d.mts +1 -0
  462. package/lib/types/comms/email/EmailService.d.cts +184 -0
  463. package/lib/types/comms/email/EmailService.d.mts +184 -0
  464. package/lib/types/comms/email/index.d.cts +11 -0
  465. package/lib/types/comms/email/index.d.mts +11 -0
  466. package/lib/types/comms/email/mime.d.cts +84 -0
  467. package/lib/types/comms/email/mime.d.mts +84 -0
  468. package/lib/types/comms/email/smtp.d.cts +107 -0
  469. package/lib/types/comms/email/smtp.d.mts +107 -0
  470. package/lib/types/comms/environment.d.cts +110 -0
  471. package/lib/types/comms/environment.d.mts +110 -0
  472. package/lib/types/comms/gmail/GmailService.d.cts +190 -0
  473. package/lib/types/comms/gmail/GmailService.d.mts +190 -0
  474. package/lib/types/comms/gmail/index.d.cts +6 -0
  475. package/lib/types/comms/gmail/index.d.mts +6 -0
  476. package/lib/types/comms/index.d.cts +16 -0
  477. package/lib/types/comms/index.d.mts +16 -0
  478. package/lib/types/comms/outlook/MicrosoftOutlookService.d.cts +282 -0
  479. package/lib/types/comms/outlook/MicrosoftOutlookService.d.mts +282 -0
  480. package/lib/types/comms/outlook/index.d.cts +1 -0
  481. package/lib/types/comms/outlook/index.d.mts +1 -0
  482. package/lib/types/comms/slack/SlackService.d.cts +259 -0
  483. package/lib/types/comms/slack/SlackService.d.mts +259 -0
  484. package/lib/types/comms/slack/index.d.cts +6 -0
  485. package/lib/types/comms/slack/index.d.mts +6 -0
  486. package/lib/types/comms/teams/TeamsService.d.cts +172 -0
  487. package/lib/types/comms/teams/TeamsService.d.mts +172 -0
  488. package/lib/types/comms/teams/index.d.cts +6 -0
  489. package/lib/types/comms/teams/index.d.mts +6 -0
  490. package/lib/types/comms/telegram/TelegramService.d.cts +202 -0
  491. package/lib/types/comms/telegram/TelegramService.d.mts +202 -0
  492. package/lib/types/comms/telegram/index.d.cts +6 -0
  493. package/lib/types/comms/telegram/index.d.mts +6 -0
  494. package/lib/types/comms/whatsapp/WhatsAppService.d.cts +258 -0
  495. package/lib/types/comms/whatsapp/WhatsAppService.d.mts +258 -0
  496. package/lib/types/comms/whatsapp/index.d.cts +1 -0
  497. package/lib/types/comms/whatsapp/index.d.mts +1 -0
  498. package/lib/types/devops/environment.d.cts +62 -0
  499. package/lib/types/devops/environment.d.mts +62 -0
  500. package/lib/types/devops/github/GithubService.d.cts +287 -0
  501. package/lib/types/devops/github/GithubService.d.mts +287 -0
  502. package/lib/types/devops/github/index.d.cts +6 -0
  503. package/lib/types/devops/github/index.d.mts +6 -0
  504. package/lib/types/devops/gitlab/GitlabService.d.cts +277 -0
  505. package/lib/types/devops/gitlab/GitlabService.d.mts +277 -0
  506. package/lib/types/devops/gitlab/index.d.cts +6 -0
  507. package/lib/types/devops/gitlab/index.d.mts +6 -0
  508. package/lib/types/devops/index.d.cts +10 -0
  509. package/lib/types/devops/index.d.mts +10 -0
  510. package/lib/types/index.d.cts +2 -2
  511. package/lib/types/index.d.mts +2 -2
  512. package/lib/types/io/airtable/AirtableService.d.cts +268 -0
  513. package/lib/types/io/airtable/AirtableService.d.mts +268 -0
  514. package/lib/types/io/airtable/index.d.cts +6 -0
  515. package/lib/types/io/airtable/index.d.mts +6 -0
  516. package/lib/types/io/confluence/ConfluenceService.d.cts +250 -0
  517. package/lib/types/io/confluence/ConfluenceService.d.mts +250 -0
  518. package/lib/types/io/confluence/index.d.cts +1 -0
  519. package/lib/types/io/confluence/index.d.mts +1 -0
  520. package/lib/types/io/environment.d.cts +107 -0
  521. package/lib/types/io/environment.d.mts +107 -0
  522. package/lib/types/io/google-docs/GoogleDocsService.d.cts +188 -0
  523. package/lib/types/io/google-docs/GoogleDocsService.d.mts +188 -0
  524. package/lib/types/io/google-docs/index.d.cts +1 -0
  525. package/lib/types/io/google-docs/index.d.mts +1 -0
  526. package/lib/types/io/google-sheets/GoogleSheetsService.d.cts +204 -0
  527. package/lib/types/io/google-sheets/GoogleSheetsService.d.mts +204 -0
  528. package/lib/types/io/google-sheets/index.d.cts +6 -0
  529. package/lib/types/io/google-sheets/index.d.mts +6 -0
  530. package/lib/types/io/graphql/GraphqlService.d.cts +173 -0
  531. package/lib/types/io/graphql/GraphqlService.d.mts +173 -0
  532. package/lib/types/io/graphql/index.d.cts +6 -0
  533. package/lib/types/io/graphql/index.d.mts +6 -0
  534. package/lib/types/io/index.d.cts +17 -0
  535. package/lib/types/io/index.d.mts +17 -0
  536. package/lib/types/io/jira/JiraService.d.cts +300 -0
  537. package/lib/types/io/jira/JiraService.d.mts +300 -0
  538. package/lib/types/io/jira/index.d.cts +1 -0
  539. package/lib/types/io/jira/index.d.mts +1 -0
  540. package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.cts +230 -0
  541. package/lib/types/io/microsoft-excel/MicrosoftExcelService.d.mts +230 -0
  542. package/lib/types/io/microsoft-excel/index.d.cts +1 -0
  543. package/lib/types/io/microsoft-excel/index.d.mts +1 -0
  544. package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.cts +226 -0
  545. package/lib/types/io/microsoft-sharepoint/MicrosoftSharePointService.d.mts +226 -0
  546. package/lib/types/io/microsoft-sharepoint/index.d.cts +1 -0
  547. package/lib/types/io/microsoft-sharepoint/index.d.mts +1 -0
  548. package/lib/types/io/spreadsheet/SpreadsheetService.d.cts +144 -0
  549. package/lib/types/io/spreadsheet/SpreadsheetService.d.mts +144 -0
  550. package/lib/types/io/spreadsheet/index.d.cts +7 -0
  551. package/lib/types/io/spreadsheet/index.d.mts +7 -0
  552. package/lib/types/namespaces/index.d.cts +1 -0
  553. package/lib/types/namespaces/index.d.mts +1 -0
  554. package/lib/types/namespaces/models/credential.model.d.cts +23 -0
  555. package/lib/types/namespaces/models/credential.model.d.mts +23 -0
  556. package/lib/types/namespaces/models/index.d.cts +1 -0
  557. package/lib/types/namespaces/models/index.d.mts +1 -0
  558. package/lib/types/namespaces/rls/index.d.cts +10 -0
  559. package/lib/types/namespaces/rls/index.d.mts +10 -0
  560. package/lib/types/namespaces/rls/principal-resolver.d.cts +47 -0
  561. package/lib/types/namespaces/rls/principal-resolver.d.mts +47 -0
  562. package/lib/types/namespaces/rls/rls-bootstrap.service.d.cts +157 -0
  563. package/lib/types/namespaces/rls/rls-bootstrap.service.d.mts +157 -0
  564. package/lib/types/namespaces/rls/rls.constants.d.cts +52 -0
  565. package/lib/types/namespaces/rls/rls.constants.d.mts +52 -0
  566. package/lib/types/namespaces/rls/rls.template.d.cts +42 -0
  567. package/lib/types/namespaces/rls/rls.template.d.mts +42 -0
  568. package/lib/types/namespaces/rls/rls.types.d.cts +77 -0
  569. package/lib/types/namespaces/rls/rls.types.d.mts +77 -0
  570. package/lib/types/namespaces/rls/session-binding.d.cts +87 -0
  571. package/lib/types/namespaces/rls/session-binding.d.mts +87 -0
  572. package/lib/types/namespaces/services/credential.service.d.cts +175 -0
  573. package/lib/types/namespaces/services/credential.service.d.mts +175 -0
  574. package/lib/types/namespaces/services/index.d.cts +1 -0
  575. package/lib/types/namespaces/services/index.d.mts +1 -0
  576. package/lib/types/namespaces/types.d.cts +37 -0
  577. package/lib/types/namespaces/types.d.mts +37 -0
  578. package/lib/types/redis/adapter.d.cts +2 -0
  579. package/lib/types/redis/adapter.d.mts +2 -0
  580. package/lib/types/redis/types.d.cts +27 -2
  581. package/lib/types/redis/types.d.mts +27 -2
  582. package/lib/types/secrets/InfraCredentialBootstrap.d.cts +100 -0
  583. package/lib/types/secrets/InfraCredentialBootstrap.d.mts +100 -0
  584. package/lib/types/secrets/core/SecretTypes.d.cts +15 -1
  585. package/lib/types/secrets/core/SecretTypes.d.mts +15 -1
  586. package/lib/types/secrets/fs/FsSecretEnvironment.d.cts +42 -0
  587. package/lib/types/secrets/fs/FsSecretEnvironment.d.mts +42 -0
  588. package/lib/types/secrets/fs/FsSecretService.d.cts +207 -0
  589. package/lib/types/secrets/fs/FsSecretService.d.mts +207 -0
  590. package/lib/types/secrets/fs/FsSecretServiceConfig.d.cts +37 -0
  591. package/lib/types/secrets/fs/FsSecretServiceConfig.d.mts +37 -0
  592. package/lib/types/secrets/fs/index.d.cts +9 -0
  593. package/lib/types/secrets/fs/index.d.mts +9 -0
  594. package/lib/types/secrets/index.d.cts +2 -0
  595. package/lib/types/secrets/index.d.mts +2 -0
  596. package/lib/types/secrets/model/ModelSecretService.d.cts +190 -1
  597. package/lib/types/secrets/model/ModelSecretService.d.mts +190 -1
  598. package/lib/types/secrets/model/Secret.d.cts +44 -3
  599. package/lib/types/secrets/model/Secret.d.mts +44 -3
  600. package/lib/types/shared/environmentValue.d.cts +24 -0
  601. package/lib/types/shared/environmentValue.d.mts +24 -0
  602. package/lib/types/shared/http/HttpApiService.d.cts +193 -0
  603. package/lib/types/shared/http/HttpApiService.d.mts +193 -0
  604. package/lib/types/shared/http/hermeticBoot.d.cts +84 -0
  605. package/lib/types/shared/http/hermeticBoot.d.mts +84 -0
  606. package/lib/types/shared/http/index.d.cts +10 -0
  607. package/lib/types/shared/http/index.d.mts +10 -0
  608. package/package.json +279 -6
  609. package/sql/002_rls.sql +660 -15
  610. package/sql/004_credentials.sql +46 -0
@@ -0,0 +1,313 @@
1
+ /**
2
+ * @module integrations/comms/discord/service
3
+ * @summary Discord Bot API integration service for messages, channels, and reactions.
4
+ * @description Exposes the Discord Bot REST API (v10) as an undecorated
5
+ * client-based service built on {@link HttpApiService}. Configuration comes
6
+ * from an explicit `DiscordServiceConfig` or the `comms.discord` environment
7
+ * slice, and the bot token is sent as `Authorization: Bot <token>` on every
8
+ * call. Credentials are referenced from configuration (and, from as-graph
9
+ * nodes, from the resolved `discord` credential secret) and are never embedded
10
+ * in source. Failures are mapped to decaf errors via {@link httpError}.
11
+ *
12
+ * `core.comms.discord` is a callable messaging service/node. It is distinct
13
+ * from the mastra agent channel kinds `core.agent.trigger.discord` and
14
+ * `core.agent.response.discord`, which receive inbound conversations and post
15
+ * agent replies through host-supplied channel adapters.
16
+ */
17
+ import { InternalError } from "@decaf-ts/db-decorators";
18
+ import { CommsEnvironment } from "./../environment.js";
19
+ import { envNumber, envString } from "./../../shared/environmentValue.js";
20
+ import { HttpApiService, httpError, } from "./../../shared/http/index.js";
21
+ const DEFAULT_CHANNEL_TYPE = 0;
22
+ /**
23
+ * @description Discord Bot API integration service
24
+ * @summary An undecorated HTTP service for channel messages
25
+ * (`sendMessage`, `getMessage`, `listMessages`), channels (`getChannel`,
26
+ * `listChannels`, `createChannel`, `deleteChannel`), and reactions
27
+ * (`addReaction`). Every operation requires a bot token and throws
28
+ * `InternalError` when it is missing or a required identifier is empty;
29
+ * transport failures are mapped to decaf errors via {@link httpError}. This is
30
+ * the callable comms surface (`core.comms.discord`), not the mastra agent
31
+ * trigger/response kinds.
32
+ * @class DiscordService
33
+ * @extends HttpApiService
34
+ * @category Comms
35
+ * @example
36
+ * ```ts
37
+ * import { DiscordService } from "@decaf-ts/integrations/comms/discord";
38
+ *
39
+ * const discord = new DiscordService();
40
+ * await discord.initialize({ token: process.env.GRAPH_CREDENTIAL_DISCORD_TOKEN });
41
+ * await discord.sendMessage({
42
+ * channelId: process.env.DISCORD_CHANNEL_ID ?? "",
43
+ * content: "Deployment finished",
44
+ * });
45
+ * ```
46
+ * @mermaid
47
+ * sequenceDiagram
48
+ * autonumber
49
+ * participant Caller
50
+ * participant Service as DiscordService
51
+ * participant Discord as Discord Bot API
52
+ * Caller->>Service: sendMessage(input)
53
+ * activate Service
54
+ * Service->>Service: requireBotToken()
55
+ * Service->>Discord: POST /channels/{id}/messages
56
+ * activate Discord
57
+ * Discord-->>Service: message payload
58
+ * deactivate Discord
59
+ * Service-->>Caller: message payload
60
+ * deactivate Service
61
+ * @memberOf module:integrations/comms/discord/service
62
+ */
63
+ export class DiscordService extends HttpApiService {
64
+ constructor() {
65
+ super(...arguments);
66
+ /**
67
+ * @description The provider name used in error messages
68
+ */
69
+ this.serviceName = "Discord";
70
+ }
71
+ /**
72
+ * @description The Discord Bot API base URL
73
+ * @summary Used when the resolved config carries no `baseUrl`.
74
+ * @returns {string} `"https://discord.com/api/v10"`.
75
+ */
76
+ defaultBaseUrl() {
77
+ return "https://discord.com/api/v10";
78
+ }
79
+ /**
80
+ * @description Builds the Discord bot authorization header
81
+ * @summary Returns `Authorization: Bot <token>` when the config carries a
82
+ * token, and no headers otherwise.
83
+ * @param {DiscordServiceConfig} config - The resolved service configuration.
84
+ * @returns {Record<string, string>} The authorization headers (empty without a token).
85
+ */
86
+ authHeaders(config) {
87
+ return config.token ? { Authorization: `Bot ${config.token}` } : {};
88
+ }
89
+ /**
90
+ * @description Reads the Discord credentials and defaults from the environment
91
+ * @summary Reads the `comms.discord` environment slice and returns a partial
92
+ * config when a bot token is configured, `undefined` otherwise. Values pass
93
+ * through `envString`/`envNumber` to reject unset-leaf proxies.
94
+ * @returns {Partial<DiscordServiceConfig> | undefined} A partial config, or `undefined` when no Discord token is configured.
95
+ */
96
+ configFromEnvironment() {
97
+ const env = CommsEnvironment.comms.discord;
98
+ const token = envString(env?.token);
99
+ if (!token)
100
+ return undefined;
101
+ return {
102
+ token,
103
+ baseUrl: envString(env.baseUrl),
104
+ timeout: envNumber(env.timeout),
105
+ };
106
+ }
107
+ /**
108
+ * @description Asserts that a Discord bot token is configured
109
+ * @summary Called by every operation before it touches the network.
110
+ * @returns {void}
111
+ * @throws {InternalError} When the resolved config has no `token`.
112
+ */
113
+ requireBotToken() {
114
+ if (!this.config.token) {
115
+ throw new InternalError("Discord requires a bot token");
116
+ }
117
+ }
118
+ /**
119
+ * @description Builds the encoded path for a channel resource
120
+ * @summary Validates the channel ID and URL-encodes it into `/channels/<id>`.
121
+ * @param {string} channelId - The Discord channel ID.
122
+ * @returns {string} The channel API path.
123
+ * @throws {InternalError} When `channelId` is empty.
124
+ */
125
+ channelPath(channelId) {
126
+ if (!channelId) {
127
+ throw new InternalError("Discord requires a channel id");
128
+ }
129
+ return `/channels/${encodeURIComponent(channelId)}`;
130
+ }
131
+ /**
132
+ * @description Sends a message to a Discord channel
133
+ * @summary `POST`s the content (and optional `tts`/`embeds`) to the channel
134
+ * messages endpoint and returns Discord's message payload.
135
+ * @param {DiscordMessageInput} input - The destination channel and message content.
136
+ * @returns {Promise<unknown>} The created message payload.
137
+ * @throws {InternalError} When no bot token is configured.
138
+ * @throws {BadRequestError} When Discord rejects the request.
139
+ * @example
140
+ * ```ts
141
+ * await discord.sendMessage({ channelId: "1234567890", content: "Hello" });
142
+ * ```
143
+ */
144
+ async sendMessage(input) {
145
+ this.requireBotToken();
146
+ try {
147
+ const response = await this.client.post(`${this.channelPath(input.channelId)}/messages`, {
148
+ content: input.content,
149
+ tts: input.tts ?? false,
150
+ ...(input.embeds ? { embeds: input.embeds } : {}),
151
+ });
152
+ return response.data;
153
+ }
154
+ catch (error) {
155
+ throw httpError("Discord", "send message", error);
156
+ }
157
+ }
158
+ /**
159
+ * @description Fetches a single Discord message
160
+ * @summary `GET`s the message by channel and message ID and returns the
161
+ * message payload.
162
+ * @param {string} channelId - The channel containing the message.
163
+ * @param {string} messageId - The message ID to fetch.
164
+ * @returns {Promise<unknown>} The message payload.
165
+ * @throws {InternalError} When no bot token is configured or the message ID is empty.
166
+ * @throws {NotFoundError} When the message does not exist (HTTP 404).
167
+ * @throws {BadRequestError} When Discord rejects the request.
168
+ */
169
+ async getMessage(channelId, messageId) {
170
+ this.requireBotToken();
171
+ if (!messageId) {
172
+ throw new InternalError("Discord requires a message id");
173
+ }
174
+ try {
175
+ const response = await this.client.get(`${this.channelPath(channelId)}/messages/${encodeURIComponent(messageId)}`);
176
+ return response.data;
177
+ }
178
+ catch (error) {
179
+ throw httpError("Discord", "get message", error);
180
+ }
181
+ }
182
+ /**
183
+ * @description Lists messages in a Discord channel
184
+ * @summary `GET`s the channel messages with the optional `limit` and
185
+ * `before` cursor and returns Discord's message page.
186
+ * @param {DiscordMessageListInput} input - The channel and paging options.
187
+ * @returns {Promise<unknown>} The message page payload.
188
+ * @throws {InternalError} When no bot token is configured.
189
+ * @throws {BadRequestError} When Discord rejects the request.
190
+ */
191
+ async listMessages(input) {
192
+ this.requireBotToken();
193
+ try {
194
+ const response = await this.client.get(`${this.channelPath(input.channelId)}/messages`, {
195
+ params: {
196
+ ...(input.limit !== undefined ? { limit: input.limit } : {}),
197
+ ...(input.before ? { before: input.before } : {}),
198
+ },
199
+ });
200
+ return response.data;
201
+ }
202
+ catch (error) {
203
+ throw httpError("Discord", "list messages", error);
204
+ }
205
+ }
206
+ /**
207
+ * @description Fetches a Discord channel
208
+ * @summary `GET`s the channel by ID and returns its payload.
209
+ * @param {string} channelId - The channel ID to fetch.
210
+ * @returns {Promise<unknown>} The channel payload.
211
+ * @throws {InternalError} When no bot token is configured or the channel ID is empty.
212
+ * @throws {NotFoundError} When the channel does not exist (HTTP 404).
213
+ * @throws {BadRequestError} When Discord rejects the request.
214
+ */
215
+ async getChannel(channelId) {
216
+ this.requireBotToken();
217
+ try {
218
+ const response = await this.client.get(this.channelPath(channelId));
219
+ return response.data;
220
+ }
221
+ catch (error) {
222
+ throw httpError("Discord", "get channel", error);
223
+ }
224
+ }
225
+ /**
226
+ * @description Lists every channel in a Discord guild
227
+ * @summary `GET`s `/guilds/<id>/channels` and returns the channel list.
228
+ * @param {string} guildId - The guild whose channels are listed.
229
+ * @returns {Promise<unknown>} The guild channel list payload.
230
+ * @throws {InternalError} When no bot token is configured or the guild ID is empty.
231
+ * @throws {BadRequestError} When Discord rejects the request.
232
+ */
233
+ async listChannels(guildId) {
234
+ this.requireBotToken();
235
+ if (!guildId) {
236
+ throw new InternalError("Discord requires a guild id");
237
+ }
238
+ try {
239
+ const response = await this.client.get(`/guilds/${encodeURIComponent(guildId)}/channels`);
240
+ return response.data;
241
+ }
242
+ catch (error) {
243
+ throw httpError("Discord", "list channels", error);
244
+ }
245
+ }
246
+ /**
247
+ * @description Creates a channel in a Discord guild
248
+ * @summary `POST`s the channel `name`, numeric `type` (default text), and
249
+ * optional `topic`/`parentId` to the guild channels endpoint.
250
+ * @param {DiscordChannelInput} input - The guild and new channel definition.
251
+ * @returns {Promise<unknown>} The created channel payload.
252
+ * @throws {InternalError} When no bot token is configured.
253
+ * @throws {BadRequestError} When Discord rejects the request.
254
+ */
255
+ async createChannel(input) {
256
+ this.requireBotToken();
257
+ try {
258
+ const response = await this.client.post(`/guilds/${encodeURIComponent(input.guildId)}/channels`, {
259
+ name: input.name,
260
+ type: input.type ?? DEFAULT_CHANNEL_TYPE,
261
+ ...(input.topic ? { topic: input.topic } : {}),
262
+ ...(input.parentId ? { parent_id: input.parentId } : {}),
263
+ });
264
+ return response.data;
265
+ }
266
+ catch (error) {
267
+ throw httpError("Discord", "create channel", error);
268
+ }
269
+ }
270
+ /**
271
+ * @description Deletes a Discord channel
272
+ * @summary `DELETE`s the channel and returns the response payload, falling
273
+ * back to `{ deleted: true, channelId }` when Discord returns no body.
274
+ * @param {string} channelId - The channel ID to delete.
275
+ * @returns {Promise<unknown>} The deletion payload.
276
+ * @throws {InternalError} When no bot token is configured or the channel ID is empty.
277
+ * @throws {NotFoundError} When the channel does not exist (HTTP 404).
278
+ * @throws {BadRequestError} When Discord rejects the request.
279
+ */
280
+ async deleteChannel(channelId) {
281
+ this.requireBotToken();
282
+ try {
283
+ const response = await this.client.delete(this.channelPath(channelId));
284
+ return response.data ?? { deleted: true, channelId };
285
+ }
286
+ catch (error) {
287
+ throw httpError("Discord", "delete channel", error);
288
+ }
289
+ }
290
+ /**
291
+ * @description Adds a reaction to a Discord message as the bot
292
+ * @summary `PUT`s the emoji to the message's `@me` reaction endpoint and
293
+ * echoes the channel and message IDs on success.
294
+ * @param {DiscordReactionInput} input - The channel, message, and emoji.
295
+ * @returns {Promise<unknown>} `{ channelId, messageId }` on success.
296
+ * @throws {InternalError} When no bot token is configured, or the message ID or emoji is empty.
297
+ * @throws {BadRequestError} When Discord rejects the request.
298
+ */
299
+ async addReaction(input) {
300
+ this.requireBotToken();
301
+ if (!input.messageId || !input.emoji) {
302
+ throw new InternalError("Discord requires a message id and emoji");
303
+ }
304
+ try {
305
+ await this.client.put(`${this.channelPath(input.channelId)}/messages/${encodeURIComponent(input.messageId)}/reactions/${encodeURIComponent(input.emoji)}/@me`);
306
+ return { channelId: input.channelId, messageId: input.messageId };
307
+ }
308
+ catch (error) {
309
+ throw httpError("Discord", "add reaction", error);
310
+ }
311
+ }
312
+ }
313
+ //# sourceMappingURL=DiscordService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordService.js","sourceRoot":"","sources":["../../../../src/comms/discord/DiscordService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./DiscordService.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/comms/discord/index.ts"],"names":[],"mappings":"AAAA,oCAAiC"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * @module integrations/comms/email/service
3
+ * @summary Email integration service for sending mail and reading inboxes across SMTP, Microsoft Graph, and IMAP.
4
+ * @description Exposes an undecorated client-based service that
5
+ * multiplexes three delivery surfaces behind one config: SMTP delivery through
6
+ * the built-in {@link SmtpClient} (raw MIME built by {@link buildEmail}), and
7
+ * Microsoft Graph (`sendMail`, message listing) through {@link HttpApiService}
8
+ * with a bearer token. `listInbox` reads via Graph while `listImapMessages`
9
+ * dynamically imports the optional `imapflow` package for direct IMAP reads.
10
+ * Configuration comes from an explicit {@link EmailServiceConfig} or the
11
+ * `comms.email` environment slice; failures are mapped to decaf errors via
12
+ * {@link httpError} (Graph) or wrapped `InternalError`s (SMTP).
13
+ */
14
+ import { BadRequestError, InternalError } from "@decaf-ts/db-decorators";
15
+ import { CommsEnvironment } from "./../environment.js";
16
+ import { envBoolean, envNumber, envString, } from "./../../shared/environmentValue.js";
17
+ import { HttpApiService, httpError, } from "./../../shared/http/index.js";
18
+ import { SmtpClient } from "./smtp.js";
19
+ import { buildEmail } from "./mime.js";
20
+ /**
21
+ * ISO 8601 date shapes accepted by the Graph `receivedDateTime` filter.
22
+ * Date-only values and full timestamps (with optional fractional seconds and
23
+ * `Z`/offset) are allowed; anything else is rejected before it can reach
24
+ * `$filter`.
25
+ */
26
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,9})?)?(?:Z|[+-]\d{2}:\d{2})?)?$/;
27
+ /**
28
+ * Validates and returns an ISO 8601 date for a Graph `$filter` literal.
29
+ *
30
+ * @param value - Caller-supplied `since` value.
31
+ * @returns The validated ISO date string.
32
+ * @throws {BadRequestError} when the value is not a parseable ISO 8601 date.
33
+ */
34
+ function assertIsoDate(value) {
35
+ if (!ISO_DATE.test(value) || Number.isNaN(Date.parse(value))) {
36
+ throw new BadRequestError("Email inbox 'since' filter must be an ISO 8601 date");
37
+ }
38
+ return value;
39
+ }
40
+ /**
41
+ * Escapes a value for use inside an OData single-quoted string literal.
42
+ *
43
+ * @param value - Raw filter value.
44
+ * @returns The value with embedded single quotes doubled per OData rules.
45
+ */
46
+ function escapeODataString(value) {
47
+ return value.replace(/'/g, "''");
48
+ }
49
+ /**
50
+ * @description Multi-provider email send/inbox service
51
+ * @summary Resolves the delivery provider from config (`provider`, or inferred
52
+ * from the presence of `host` vs `token`), builds RFC 5322 MIME with
53
+ * UTF-8-encoded headers via {@link buildEmail}, then delivers through SMTP or
54
+ * posts to Graph. Inbox reads go through Graph `messages` (with `$top`,
55
+ * `$filter`, `$orderby`) or the optional `imapflow` package.
56
+ * @category Comms
57
+ * @memberOf module:integrations/comms/email/service
58
+ */
59
+ export class EmailService extends HttpApiService {
60
+ constructor() {
61
+ super(...arguments);
62
+ this.serviceName = "Email";
63
+ }
64
+ /**
65
+ * @description Default Microsoft Graph base URL used when no override is configured
66
+ * @returns The Graph v1.0 endpoint URL
67
+ */
68
+ defaultBaseUrl() {
69
+ return "https://graph.microsoft.com/v1.0";
70
+ }
71
+ /**
72
+ * @description Authorization headers for Graph requests
73
+ * @param config - Resolved service config
74
+ * @returns A bearer-token `Authorization` header map, empty when no `token` is configured
75
+ */
76
+ authHeaders(config) {
77
+ return config.token ? { Authorization: `Bearer ${config.token}` } : {};
78
+ }
79
+ /**
80
+ * @description Pins the SMTP plaintext-AUTH default on top of the base initialization
81
+ * @summary Runs the {@link HttpApiService} initialization (explicit config
82
+ * merged over the `comms.email` environment slice) and then defaults an
83
+ * unresolved `allowPlaintextAuth` to `false`, so credentials are only sent
84
+ * over a TLS-protected session unless the config explicitly opts in. This
85
+ * closes the F1 residual where an environment-only `allowPlaintextAuth`
86
+ * opt-in would otherwise reach a boot whose explicit config omits the key
87
+ * (defense in depth on top of {@link bootWithoutEnvironment}, which disables
88
+ * the environment slice entirely on the node path).
89
+ * @param {...any[]} args - An optional `Partial<EmailServiceConfig>`, optionally followed by a decaf `Context`.
90
+ * @returns {Promise<{config: EmailServiceConfig, client: AxiosInstance}>} The merged configuration, with `allowPlaintextAuth` defaulted to `false` when unset, and the configured Axios instance.
91
+ */
92
+ async initialize(...args) {
93
+ const initialized = await super.initialize(...args);
94
+ initialized.config.allowPlaintextAuth =
95
+ initialized.config.allowPlaintextAuth ?? false;
96
+ return initialized;
97
+ }
98
+ /**
99
+ * @description Builds service config from the `comms.email` environment slice
100
+ * @returns A partial config when either an SMTP `host` or a Graph `token` is present, otherwise `undefined`
101
+ */
102
+ configFromEnvironment() {
103
+ const env = CommsEnvironment.comms.email;
104
+ const host = envString(env?.host);
105
+ const token = envString(env?.token);
106
+ if (!host && !token)
107
+ return undefined;
108
+ const provider = envString(env.provider);
109
+ return {
110
+ provider: provider ?? (host ? "smtp" : "graph"),
111
+ host,
112
+ port: envNumber(env.port),
113
+ secure: envBoolean(env.secure),
114
+ username: envString(env.username),
115
+ password: envString(env.password),
116
+ allowPlaintextAuth: envBoolean(env.allowPlaintextAuth),
117
+ from: envString(env.from),
118
+ token,
119
+ graphBaseUrl: envString(env.graphBaseUrl),
120
+ timeout: envNumber(env.timeout),
121
+ };
122
+ }
123
+ /**
124
+ * @description Selects the delivery provider
125
+ * @summary Prefers an explicit `provider`, then infers `smtp` from a
126
+ * configured `host` and `graph` from a configured `token`.
127
+ * @param config - Resolved service config
128
+ * @returns The resolved provider
129
+ * @throws {InternalError} when neither an SMTP host nor a Graph token is configured
130
+ */
131
+ resolveProvider(config) {
132
+ if (config.provider)
133
+ return config.provider;
134
+ if (config.host)
135
+ return "smtp";
136
+ if (config.token)
137
+ return "graph";
138
+ throw new InternalError("Email requires either an SMTP host or a Microsoft Graph token");
139
+ }
140
+ /**
141
+ * @description Resolves the fallback sender address
142
+ * @summary Uses `from`, then `username`, then the `From` header override.
143
+ * @param config - Resolved service config
144
+ * @returns The resolved sender address
145
+ * @throws {InternalError} when no sender address can be resolved
146
+ */
147
+ resolveFrom(config) {
148
+ const from = config.from ?? config.username ?? config.headers?.["From"] ?? undefined;
149
+ if (!from)
150
+ throw new InternalError("Email requires a sender address");
151
+ return from;
152
+ }
153
+ /**
154
+ * @description Sends an email through the resolved provider
155
+ * @summary Builds the raw MIME message (honouring `input.from`, else the
156
+ * resolved config sender), then delivers via SMTP or Graph. SMTP config
157
+ * passes `allowPlaintextAuth` through unchanged, so the plaintext-AUTH
158
+ * opt-out is inherited from the service config.
159
+ * @param input - Message input (recipients, subject, text/html body, attachments)
160
+ * @returns The send result with the generated `Message-ID` and provider
161
+ * @throws {BadRequestError} when an address, attachment filename, or content type fails validation (via {@link buildEmail})
162
+ * @throws {InternalError} when the provider cannot be resolved, the SMTP host is missing, plaintext AUTH is refused, or SMTP delivery fails
163
+ */
164
+ async send(input) {
165
+ const config = this.config;
166
+ const provider = this.resolveProvider(config);
167
+ const from = input.from || this.resolveFrom(config);
168
+ const built = buildEmail({ ...input, from });
169
+ if (provider === "graph") {
170
+ await this.sendViaGraph(built.raw, from);
171
+ return {
172
+ messageId: built.messageId,
173
+ from,
174
+ recipients: built.recipients,
175
+ provider,
176
+ };
177
+ }
178
+ if (!config.host) {
179
+ throw new InternalError("Email SMTP provider requires a host");
180
+ }
181
+ const client = new SmtpClient({
182
+ host: config.host,
183
+ port: config.port,
184
+ secure: config.secure,
185
+ username: config.username,
186
+ password: config.password,
187
+ timeout: config.timeout,
188
+ allowPlaintextAuth: config.allowPlaintextAuth,
189
+ });
190
+ try {
191
+ await client.connect();
192
+ await client.send(built.from, built.recipients, built.raw);
193
+ return {
194
+ messageId: built.messageId,
195
+ from,
196
+ recipients: built.recipients,
197
+ provider,
198
+ };
199
+ }
200
+ catch (error) {
201
+ if (error instanceof InternalError)
202
+ throw error;
203
+ throw new InternalError(`Email SMTP delivery failed: ${error instanceof Error ? error.message : String(error)}`);
204
+ }
205
+ finally {
206
+ await client.close().catch(() => undefined);
207
+ }
208
+ }
209
+ /**
210
+ * @description Posts a raw MIME message to the Microsoft Graph `sendMail` endpoint
211
+ * @summary Sends the base64-encoded raw message to
212
+ * `/users/<from>/sendMail` (or `/me/sendMail` when no sender is resolved)
213
+ * with the configured `graphBaseUrl`/`baseUrl`.
214
+ * @param raw - Raw RFC 5322 message text
215
+ * @param from - Sender mailbox (UPN) for the Graph path
216
+ * @throws {Error} Graph error mapped through {@link httpError}
217
+ */
218
+ async sendViaGraph(raw, from) {
219
+ const config = this.config;
220
+ this.requireToken(config);
221
+ const baseUrl = config.graphBaseUrl ??
222
+ config.baseUrl ??
223
+ "https://graph.microsoft.com/v1.0";
224
+ const path = from
225
+ ? `/users/${encodeURIComponent(from)}/sendMail`
226
+ : "/me/sendMail";
227
+ try {
228
+ await this.client.post(`${baseUrl}${path}`, Buffer.from(raw, "utf8").toString("base64"), {
229
+ headers: { "Content-Type": "text/plain" },
230
+ });
231
+ }
232
+ catch (error) {
233
+ throw httpError("Microsoft Graph", "sendMail", error);
234
+ }
235
+ }
236
+ /**
237
+ * @description Lists messages from a Graph mailbox
238
+ * @summary Queries `<mailbox>/messages` with `$top`, an optional
239
+ * subject/since `$filter`, and `receivedDateTime desc` ordering. The mailbox
240
+ * is URL-encoded as a single path segment, quotes in the subject are escaped
241
+ * for the OData string literal, and `since` must be an ISO 8601 date.
242
+ * @param query - Inbox filter (mailbox, limit, since, subject)
243
+ * @returns The raw Graph message records
244
+ * @throws {BadRequestError} when `since` is not an ISO 8601 date
245
+ * @throws {InternalError} when no `token` is configured; Graph errors mapped through {@link httpError}
246
+ */
247
+ async listInbox(query = {}) {
248
+ const config = this.config;
249
+ this.requireToken(config);
250
+ const baseUrl = config.graphBaseUrl ??
251
+ config.baseUrl ??
252
+ "https://graph.microsoft.com/v1.0";
253
+ const mailbox = encodeURIComponent(query.mailbox ?? "me");
254
+ const filters = [
255
+ query.subject
256
+ ? `contains(subject,'${escapeODataString(query.subject)}')`
257
+ : undefined,
258
+ query.since
259
+ ? `receivedDateTime ge ${assertIsoDate(query.since)}`
260
+ : undefined,
261
+ ].filter(Boolean);
262
+ try {
263
+ const response = await this.client.get(`${baseUrl}/${mailbox}/messages`, {
264
+ params: {
265
+ $top: query.limit ?? 25,
266
+ $filter: filters.length ? filters.join(" and ") : undefined,
267
+ $orderby: "receivedDateTime desc",
268
+ },
269
+ });
270
+ return response.data.value ?? [];
271
+ }
272
+ catch (error) {
273
+ throw httpError("Microsoft Graph", "list messages", error);
274
+ }
275
+ }
276
+ /**
277
+ * @description Lists messages directly over IMAP
278
+ * @summary Dynamically imports the optional `imapflow` package, connects to
279
+ * `host` (default port 993, implicit TLS), and fetches the newest messages
280
+ * from `INBOX`.
281
+ *
282
+ * R2 direct-library-wrap justification: IMAP is a stateful protocol
283
+ * (mailbox locks, sequence/UID state, IDLE) whose correct implementation is
284
+ * large and security-sensitive. `imapflow` is the maintained n8n-vetted
285
+ * client for exactly this surface, so wrapping it is deliberate; a local
286
+ * reimplementation would add risk without changing the node contract. The
287
+ * package stays optional so SMTP/Graph-only consumers do not install it.
288
+ * @param query - Inbox filter (limit only is honoured by IMAP)
289
+ * @returns The fetched IMAP message records
290
+ * @throws {InternalError} when `imapflow` is not installed, no `host` is configured, or the IMAP session fails
291
+ */
292
+ async listImapMessages(query = {}) {
293
+ let ImapFlow;
294
+ try {
295
+ const moduleName = "imapflow";
296
+ const imported = (await import(moduleName));
297
+ ImapFlow = imported.ImapFlow;
298
+ if (!ImapFlow)
299
+ throw new Error("imapflow did not export ImapFlow");
300
+ }
301
+ catch {
302
+ throw new InternalError("IMAP reads require the optional 'imapflow' package; install it to use this surface");
303
+ }
304
+ const config = this.config;
305
+ if (!config.host)
306
+ throw new InternalError("IMAP requires a host");
307
+ const client = new ImapFlow({
308
+ host: config.host,
309
+ port: config.port ?? 993,
310
+ secure: config.secure ?? true,
311
+ auth: {
312
+ user: config.username,
313
+ pass: config.password,
314
+ },
315
+ });
316
+ const messages = [];
317
+ await client.connect();
318
+ try {
319
+ const lock = await client.getMailboxLock("INBOX");
320
+ try {
321
+ const limit = query.limit ?? 25;
322
+ for await (const message of client.fetch(`${Math.max(1, limit)}:*`, { envelope: true, source: false }, { uid: false })) {
323
+ messages.push(message);
324
+ if (messages.length >= limit)
325
+ break;
326
+ }
327
+ }
328
+ finally {
329
+ lock.release();
330
+ }
331
+ }
332
+ finally {
333
+ await client.logout().catch(() => undefined);
334
+ }
335
+ return messages;
336
+ }
337
+ }
338
+ //# sourceMappingURL=EmailService.js.map