@decaf-ts/integrations 0.11.0 → 0.12.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 (496) 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/comms/email/EmailService.cjs +376 -0
  19. package/lib/cjs/comms/email/EmailService.cjs.map +1 -0
  20. package/lib/cjs/comms/email/index.cjs +29 -0
  21. package/lib/cjs/comms/email/index.cjs.map +1 -0
  22. package/lib/cjs/comms/email/mime.cjs +225 -0
  23. package/lib/cjs/comms/email/mime.cjs.map +1 -0
  24. package/lib/cjs/comms/email/smtp.cjs +204 -0
  25. package/lib/cjs/comms/email/smtp.cjs.map +1 -0
  26. package/lib/cjs/comms/environment.cjs +63 -0
  27. package/lib/cjs/comms/environment.cjs.map +1 -0
  28. package/lib/cjs/comms/gmail/GmailService.cjs +235 -0
  29. package/lib/cjs/comms/gmail/GmailService.cjs.map +1 -0
  30. package/lib/cjs/comms/gmail/index.cjs +24 -0
  31. package/lib/cjs/comms/gmail/index.cjs.map +1 -0
  32. package/lib/cjs/comms/index.cjs +31 -0
  33. package/lib/cjs/comms/index.cjs.map +1 -0
  34. package/lib/cjs/comms/slack/SlackService.cjs +264 -0
  35. package/lib/cjs/comms/slack/SlackService.cjs.map +1 -0
  36. package/lib/cjs/comms/slack/index.cjs +24 -0
  37. package/lib/cjs/comms/slack/index.cjs.map +1 -0
  38. package/lib/cjs/comms/teams/TeamsService.cjs +212 -0
  39. package/lib/cjs/comms/teams/TeamsService.cjs.map +1 -0
  40. package/lib/cjs/comms/teams/index.cjs +24 -0
  41. package/lib/cjs/comms/teams/index.cjs.map +1 -0
  42. package/lib/cjs/comms/telegram/TelegramService.cjs +196 -0
  43. package/lib/cjs/comms/telegram/TelegramService.cjs.map +1 -0
  44. package/lib/cjs/comms/telegram/index.cjs +24 -0
  45. package/lib/cjs/comms/telegram/index.cjs.map +1 -0
  46. package/lib/cjs/devops/environment.cjs +43 -0
  47. package/lib/cjs/devops/environment.cjs.map +1 -0
  48. package/lib/cjs/devops/github/GithubService.cjs +302 -0
  49. package/lib/cjs/devops/github/GithubService.cjs.map +1 -0
  50. package/lib/cjs/devops/github/index.cjs +24 -0
  51. package/lib/cjs/devops/github/index.cjs.map +1 -0
  52. package/lib/cjs/devops/gitlab/GitlabService.cjs +282 -0
  53. package/lib/cjs/devops/gitlab/GitlabService.cjs.map +1 -0
  54. package/lib/cjs/devops/gitlab/index.cjs +24 -0
  55. package/lib/cjs/devops/gitlab/index.cjs.map +1 -0
  56. package/lib/cjs/devops/index.cjs +28 -0
  57. package/lib/cjs/devops/index.cjs.map +1 -0
  58. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -0
  59. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -1
  60. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -0
  61. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -1
  62. package/lib/cjs/index.cjs +3 -3
  63. package/lib/cjs/io/airtable/AirtableService.cjs +266 -0
  64. package/lib/cjs/io/airtable/AirtableService.cjs.map +1 -0
  65. package/lib/cjs/io/airtable/index.cjs +24 -0
  66. package/lib/cjs/io/airtable/index.cjs.map +1 -0
  67. package/lib/cjs/io/environment.cjs +46 -0
  68. package/lib/cjs/io/environment.cjs.map +1 -0
  69. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs +288 -0
  70. package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs.map +1 -0
  71. package/lib/cjs/io/google-sheets/index.cjs +24 -0
  72. package/lib/cjs/io/google-sheets/index.cjs.map +1 -0
  73. package/lib/cjs/io/graphql/GraphqlService.cjs +143 -0
  74. package/lib/cjs/io/graphql/GraphqlService.cjs.map +1 -0
  75. package/lib/cjs/io/graphql/index.cjs +24 -0
  76. package/lib/cjs/io/graphql/index.cjs.map +1 -0
  77. package/lib/cjs/io/index.cjs +30 -0
  78. package/lib/cjs/io/index.cjs.map +1 -0
  79. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs +205 -0
  80. package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs.map +1 -0
  81. package/lib/cjs/io/spreadsheet/index.cjs +25 -0
  82. package/lib/cjs/io/spreadsheet/index.cjs.map +1 -0
  83. package/lib/cjs/namespaces/index.cjs +1 -0
  84. package/lib/cjs/namespaces/index.cjs.map +1 -1
  85. package/lib/cjs/namespaces/models/credential.model.cjs +115 -0
  86. package/lib/cjs/namespaces/models/credential.model.cjs.map +1 -0
  87. package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -0
  88. package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -1
  89. package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -0
  90. package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -1
  91. package/lib/cjs/namespaces/models/group.model.cjs +2 -0
  92. package/lib/cjs/namespaces/models/group.model.cjs.map +1 -1
  93. package/lib/cjs/namespaces/models/index.cjs +1 -0
  94. package/lib/cjs/namespaces/models/index.cjs.map +1 -1
  95. package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -0
  96. package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -1
  97. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -0
  98. package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -1
  99. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -0
  100. package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -1
  101. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -0
  102. package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -1
  103. package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -0
  104. package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -1
  105. package/lib/cjs/namespaces/models/permission.model.cjs +2 -0
  106. package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -1
  107. package/lib/cjs/namespaces/models/principal.model.cjs +2 -0
  108. package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -1
  109. package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -0
  110. package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -1
  111. package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -0
  112. package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -1
  113. package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -0
  114. package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -1
  115. package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -0
  116. package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -1
  117. package/lib/cjs/namespaces/models/role.model.cjs +2 -0
  118. package/lib/cjs/namespaces/models/role.model.cjs.map +1 -1
  119. package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -0
  120. package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -1
  121. package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -0
  122. package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -1
  123. package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -0
  124. package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -1
  125. package/lib/cjs/namespaces/models/tenant.model.cjs +2 -0
  126. package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -1
  127. package/lib/cjs/namespaces/models/user.model.cjs +2 -0
  128. package/lib/cjs/namespaces/models/user.model.cjs.map +1 -1
  129. package/lib/cjs/namespaces/rls/index.cjs +28 -0
  130. package/lib/cjs/namespaces/rls/index.cjs.map +1 -0
  131. package/lib/cjs/namespaces/rls/principal-resolver.cjs +66 -0
  132. package/lib/cjs/namespaces/rls/principal-resolver.cjs.map +1 -0
  133. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs +269 -0
  134. package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs.map +1 -0
  135. package/lib/cjs/namespaces/rls/rls.constants.cjs +79 -0
  136. package/lib/cjs/namespaces/rls/rls.constants.cjs.map +1 -0
  137. package/lib/cjs/namespaces/rls/rls.template.cjs +719 -0
  138. package/lib/cjs/namespaces/rls/rls.template.cjs.map +1 -0
  139. package/lib/cjs/namespaces/rls/rls.types.cjs +4 -0
  140. package/lib/cjs/namespaces/rls/rls.types.cjs.map +1 -0
  141. package/lib/cjs/namespaces/rls/session-binding.cjs +70 -0
  142. package/lib/cjs/namespaces/rls/session-binding.cjs.map +1 -0
  143. package/lib/cjs/namespaces/services/credential.service.cjs +327 -0
  144. package/lib/cjs/namespaces/services/credential.service.cjs.map +1 -0
  145. package/lib/cjs/namespaces/services/index.cjs +1 -0
  146. package/lib/cjs/namespaces/services/index.cjs.map +1 -1
  147. package/lib/cjs/namespaces/types.cjs +6 -1
  148. package/lib/cjs/namespaces/types.cjs.map +1 -1
  149. package/lib/cjs/redis/adapter.cjs +7 -1
  150. package/lib/cjs/redis/adapter.cjs.map +1 -1
  151. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs +80 -0
  152. package/lib/cjs/secrets/InfraCredentialBootstrap.cjs.map +1 -0
  153. package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -15
  154. package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
  155. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -16
  156. package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
  157. package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
  158. package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
  159. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs +28 -0
  160. package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs.map +1 -0
  161. package/lib/cjs/secrets/fs/FsSecretService.cjs +420 -0
  162. package/lib/cjs/secrets/fs/FsSecretService.cjs.map +1 -0
  163. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs +25 -0
  164. package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs.map +1 -0
  165. package/lib/cjs/secrets/fs/index.cjs +27 -0
  166. package/lib/cjs/secrets/fs/index.cjs.map +1 -0
  167. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -16
  168. package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
  169. package/lib/cjs/secrets/index.cjs +2 -0
  170. package/lib/cjs/secrets/index.cjs.map +1 -1
  171. package/lib/cjs/secrets/model/ModelSecretService.cjs +335 -43
  172. package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
  173. package/lib/cjs/secrets/model/Secret.cjs +83 -5
  174. package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
  175. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -16
  176. package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
  177. package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -16
  178. package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
  179. package/lib/cjs/shared/environmentValue.cjs +24 -0
  180. package/lib/cjs/shared/environmentValue.cjs.map +1 -1
  181. package/lib/cjs/shared/http/HttpApiService.cjs +190 -0
  182. package/lib/cjs/shared/http/HttpApiService.cjs.map +1 -0
  183. package/lib/cjs/shared/http/hermeticBoot.cjs +150 -0
  184. package/lib/cjs/shared/http/hermeticBoot.cjs.map +1 -0
  185. package/lib/cjs/shared/http/index.cjs +28 -0
  186. package/lib/cjs/shared/http/index.cjs.map +1 -0
  187. package/lib/esm/blob/azure/AzureBlobStoreService.js +13 -21
  188. package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -1
  189. package/lib/esm/blob/core/BlobStoreService.js +26 -25
  190. package/lib/esm/blob/core/BlobStoreService.js.map +1 -1
  191. package/lib/esm/blob/gcp/GcsBlobStoreService.js +13 -21
  192. package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -1
  193. package/lib/esm/blob/s3/S3BlobStoreService.js +12 -14
  194. package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -1
  195. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js +14 -16
  196. package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js.map +1 -1
  197. package/lib/esm/comms/email/EmailService.js +338 -0
  198. package/lib/esm/comms/email/EmailService.js.map +1 -0
  199. package/lib/esm/comms/email/index.js +12 -0
  200. package/lib/esm/comms/email/index.js.map +1 -0
  201. package/lib/esm/comms/email/mime.js +218 -0
  202. package/lib/esm/comms/email/mime.js.map +1 -0
  203. package/lib/esm/comms/email/smtp.js +166 -0
  204. package/lib/esm/comms/email/smtp.js.map +1 -0
  205. package/lib/esm/comms/environment.js +59 -0
  206. package/lib/esm/comms/environment.js.map +1 -0
  207. package/lib/esm/comms/gmail/GmailService.js +230 -0
  208. package/lib/esm/comms/gmail/GmailService.js.map +1 -0
  209. package/lib/esm/comms/gmail/index.js +7 -0
  210. package/lib/esm/comms/gmail/index.js.map +1 -0
  211. package/lib/esm/comms/index.js +14 -0
  212. package/lib/esm/comms/index.js.map +1 -0
  213. package/lib/esm/comms/slack/SlackService.js +259 -0
  214. package/lib/esm/comms/slack/SlackService.js.map +1 -0
  215. package/lib/esm/comms/slack/index.js +7 -0
  216. package/lib/esm/comms/slack/index.js.map +1 -0
  217. package/lib/esm/comms/teams/TeamsService.js +204 -0
  218. package/lib/esm/comms/teams/TeamsService.js.map +1 -0
  219. package/lib/esm/comms/teams/index.js +7 -0
  220. package/lib/esm/comms/teams/index.js.map +1 -0
  221. package/lib/esm/comms/telegram/TelegramService.js +191 -0
  222. package/lib/esm/comms/telegram/TelegramService.js.map +1 -0
  223. package/lib/esm/comms/telegram/index.js +7 -0
  224. package/lib/esm/comms/telegram/index.js.map +1 -0
  225. package/lib/esm/devops/environment.js +39 -0
  226. package/lib/esm/devops/environment.js.map +1 -0
  227. package/lib/esm/devops/github/GithubService.js +297 -0
  228. package/lib/esm/devops/github/GithubService.js.map +1 -0
  229. package/lib/esm/devops/github/index.js +7 -0
  230. package/lib/esm/devops/github/index.js.map +1 -0
  231. package/lib/esm/devops/gitlab/GitlabService.js +277 -0
  232. package/lib/esm/devops/gitlab/GitlabService.js.map +1 -0
  233. package/lib/esm/devops/gitlab/index.js +7 -0
  234. package/lib/esm/devops/gitlab/index.js.map +1 -0
  235. package/lib/esm/devops/index.js +11 -0
  236. package/lib/esm/devops/index.js.map +1 -0
  237. package/lib/esm/feature-flags/models/FeatureFlag.model.js +2 -0
  238. package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -1
  239. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +2 -0
  240. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -1
  241. package/lib/esm/index.js +3 -3
  242. package/lib/esm/io/airtable/AirtableService.js +261 -0
  243. package/lib/esm/io/airtable/AirtableService.js.map +1 -0
  244. package/lib/esm/io/airtable/index.js +7 -0
  245. package/lib/esm/io/airtable/index.js.map +1 -0
  246. package/lib/esm/io/environment.js +42 -0
  247. package/lib/esm/io/environment.js.map +1 -0
  248. package/lib/esm/io/google-sheets/GoogleSheetsService.js +283 -0
  249. package/lib/esm/io/google-sheets/GoogleSheetsService.js.map +1 -0
  250. package/lib/esm/io/google-sheets/index.js +7 -0
  251. package/lib/esm/io/google-sheets/index.js.map +1 -0
  252. package/lib/esm/io/graphql/GraphqlService.js +138 -0
  253. package/lib/esm/io/graphql/GraphqlService.js.map +1 -0
  254. package/lib/esm/io/graphql/index.js +7 -0
  255. package/lib/esm/io/graphql/index.js.map +1 -0
  256. package/lib/esm/io/index.js +13 -0
  257. package/lib/esm/io/index.js.map +1 -0
  258. package/lib/esm/io/spreadsheet/SpreadsheetService.js +200 -0
  259. package/lib/esm/io/spreadsheet/SpreadsheetService.js.map +1 -0
  260. package/lib/esm/io/spreadsheet/index.js +8 -0
  261. package/lib/esm/io/spreadsheet/index.js.map +1 -0
  262. package/lib/esm/namespaces/index.js +1 -0
  263. package/lib/esm/namespaces/index.js.map +1 -1
  264. package/lib/esm/namespaces/models/credential.model.js +106 -0
  265. package/lib/esm/namespaces/models/credential.model.js.map +1 -0
  266. package/lib/esm/namespaces/models/effective-permission.model.js +2 -0
  267. package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -1
  268. package/lib/esm/namespaces/models/group-membership.model.js +2 -0
  269. package/lib/esm/namespaces/models/group-membership.model.js.map +1 -1
  270. package/lib/esm/namespaces/models/group.model.js +2 -0
  271. package/lib/esm/namespaces/models/group.model.js.map +1 -1
  272. package/lib/esm/namespaces/models/index.js +1 -0
  273. package/lib/esm/namespaces/models/index.js.map +1 -1
  274. package/lib/esm/namespaces/models/inheritance-block.model.js +2 -0
  275. package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -1
  276. package/lib/esm/namespaces/models/org-unit-closure.model.js +2 -0
  277. package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -1
  278. package/lib/esm/namespaces/models/org-unit-membership.model.js +2 -0
  279. package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -1
  280. package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -0
  281. package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -1
  282. package/lib/esm/namespaces/models/org-unit.model.js +2 -0
  283. package/lib/esm/namespaces/models/org-unit.model.js.map +1 -1
  284. package/lib/esm/namespaces/models/permission.model.js +2 -0
  285. package/lib/esm/namespaces/models/permission.model.js.map +1 -1
  286. package/lib/esm/namespaces/models/principal.model.js +2 -0
  287. package/lib/esm/namespaces/models/principal.model.js.map +1 -1
  288. package/lib/esm/namespaces/models/protected-resource.model.js +2 -0
  289. package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -1
  290. package/lib/esm/namespaces/models/resource-grant.model.js +2 -0
  291. package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -1
  292. package/lib/esm/namespaces/models/role-assignment.model.js +2 -0
  293. package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -1
  294. package/lib/esm/namespaces/models/role-permission.model.js +2 -0
  295. package/lib/esm/namespaces/models/role-permission.model.js.map +1 -1
  296. package/lib/esm/namespaces/models/role.model.js +2 -0
  297. package/lib/esm/namespaces/models/role.model.js.map +1 -1
  298. package/lib/esm/namespaces/models/storage-binding.model.js +2 -0
  299. package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -1
  300. package/lib/esm/namespaces/models/tenant-membership.model.js +2 -0
  301. package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -1
  302. package/lib/esm/namespaces/models/tenant-profile.model.js +2 -0
  303. package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -1
  304. package/lib/esm/namespaces/models/tenant.model.js +2 -0
  305. package/lib/esm/namespaces/models/tenant.model.js.map +1 -1
  306. package/lib/esm/namespaces/models/user.model.js +2 -0
  307. package/lib/esm/namespaces/models/user.model.js.map +1 -1
  308. package/lib/esm/namespaces/rls/index.js +11 -0
  309. package/lib/esm/namespaces/rls/index.js.map +1 -0
  310. package/lib/esm/namespaces/rls/principal-resolver.js +61 -0
  311. package/lib/esm/namespaces/rls/principal-resolver.js.map +1 -0
  312. package/lib/esm/namespaces/rls/rls-bootstrap.service.js +261 -0
  313. package/lib/esm/namespaces/rls/rls-bootstrap.service.js.map +1 -0
  314. package/lib/esm/namespaces/rls/rls.constants.js +75 -0
  315. package/lib/esm/namespaces/rls/rls.constants.js.map +1 -0
  316. package/lib/esm/namespaces/rls/rls.template.js +711 -0
  317. package/lib/esm/namespaces/rls/rls.template.js.map +1 -0
  318. package/lib/esm/namespaces/rls/rls.types.js +9 -0
  319. package/lib/esm/namespaces/rls/rls.types.js.map +1 -0
  320. package/lib/esm/namespaces/rls/session-binding.js +65 -0
  321. package/lib/esm/namespaces/rls/session-binding.js.map +1 -0
  322. package/lib/esm/namespaces/services/credential.service.js +322 -0
  323. package/lib/esm/namespaces/services/credential.service.js.map +1 -0
  324. package/lib/esm/namespaces/services/index.js +1 -0
  325. package/lib/esm/namespaces/services/index.js.map +1 -1
  326. package/lib/esm/namespaces/types.js +6 -0
  327. package/lib/esm/namespaces/types.js.map +1 -1
  328. package/lib/esm/redis/adapter.js +7 -1
  329. package/lib/esm/redis/adapter.js.map +1 -1
  330. package/lib/esm/secrets/InfraCredentialBootstrap.js +74 -0
  331. package/lib/esm/secrets/InfraCredentialBootstrap.js.map +1 -0
  332. package/lib/esm/secrets/aws/AwsSecretService.js +3 -13
  333. package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -1
  334. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +2 -13
  335. package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -1
  336. package/lib/esm/secrets/core/SecretReference.js +1 -0
  337. package/lib/esm/secrets/core/SecretReference.js.map +1 -1
  338. package/lib/esm/secrets/fs/FsSecretEnvironment.js +24 -0
  339. package/lib/esm/secrets/fs/FsSecretEnvironment.js.map +1 -0
  340. package/lib/esm/secrets/fs/FsSecretService.js +412 -0
  341. package/lib/esm/secrets/fs/FsSecretService.js.map +1 -0
  342. package/lib/esm/secrets/fs/FsSecretServiceConfig.js +21 -0
  343. package/lib/esm/secrets/fs/FsSecretServiceConfig.js.map +1 -0
  344. package/lib/esm/secrets/fs/index.js +10 -0
  345. package/lib/esm/secrets/fs/index.js.map +1 -0
  346. package/lib/esm/secrets/gcp/GcpSecretManagerService.js +2 -13
  347. package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -1
  348. package/lib/esm/secrets/index.js +2 -0
  349. package/lib/esm/secrets/index.js.map +1 -1
  350. package/lib/esm/secrets/model/ModelSecretService.js +337 -42
  351. package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
  352. package/lib/esm/secrets/model/Secret.js +86 -7
  353. package/lib/esm/secrets/model/Secret.js.map +1 -1
  354. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +2 -13
  355. package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -1
  356. package/lib/esm/secrets/vault/VaultSecretService.js +2 -13
  357. package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -1
  358. package/lib/esm/shared/environmentValue.js +24 -0
  359. package/lib/esm/shared/environmentValue.js.map +1 -1
  360. package/lib/esm/shared/http/HttpApiService.js +181 -0
  361. package/lib/esm/shared/http/HttpApiService.js.map +1 -0
  362. package/lib/esm/shared/http/hermeticBoot.js +146 -0
  363. package/lib/esm/shared/http/hermeticBoot.js.map +1 -0
  364. package/lib/esm/shared/http/index.js +11 -0
  365. package/lib/esm/shared/http/index.js.map +1 -0
  366. package/lib/types/blob/azure/AzureBlobStoreService.d.cts +7 -7
  367. package/lib/types/blob/azure/AzureBlobStoreService.d.mts +7 -7
  368. package/lib/types/blob/core/BlobStoreService.d.cts +28 -27
  369. package/lib/types/blob/core/BlobStoreService.d.mts +28 -27
  370. package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +7 -7
  371. package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +7 -7
  372. package/lib/types/blob/s3/S3BlobStoreService.d.cts +9 -1
  373. package/lib/types/blob/s3/S3BlobStoreService.d.mts +9 -1
  374. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.cts +11 -15
  375. package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.mts +11 -15
  376. package/lib/types/comms/email/EmailService.d.cts +184 -0
  377. package/lib/types/comms/email/EmailService.d.mts +184 -0
  378. package/lib/types/comms/email/index.d.cts +11 -0
  379. package/lib/types/comms/email/index.d.mts +11 -0
  380. package/lib/types/comms/email/mime.d.cts +84 -0
  381. package/lib/types/comms/email/mime.d.mts +84 -0
  382. package/lib/types/comms/email/smtp.d.cts +107 -0
  383. package/lib/types/comms/email/smtp.d.mts +107 -0
  384. package/lib/types/comms/environment.d.cts +84 -0
  385. package/lib/types/comms/environment.d.mts +84 -0
  386. package/lib/types/comms/gmail/GmailService.d.cts +190 -0
  387. package/lib/types/comms/gmail/GmailService.d.mts +190 -0
  388. package/lib/types/comms/gmail/index.d.cts +6 -0
  389. package/lib/types/comms/gmail/index.d.mts +6 -0
  390. package/lib/types/comms/index.d.cts +13 -0
  391. package/lib/types/comms/index.d.mts +13 -0
  392. package/lib/types/comms/slack/SlackService.d.cts +259 -0
  393. package/lib/types/comms/slack/SlackService.d.mts +259 -0
  394. package/lib/types/comms/slack/index.d.cts +6 -0
  395. package/lib/types/comms/slack/index.d.mts +6 -0
  396. package/lib/types/comms/teams/TeamsService.d.cts +172 -0
  397. package/lib/types/comms/teams/TeamsService.d.mts +172 -0
  398. package/lib/types/comms/teams/index.d.cts +6 -0
  399. package/lib/types/comms/teams/index.d.mts +6 -0
  400. package/lib/types/comms/telegram/TelegramService.d.cts +202 -0
  401. package/lib/types/comms/telegram/TelegramService.d.mts +202 -0
  402. package/lib/types/comms/telegram/index.d.cts +6 -0
  403. package/lib/types/comms/telegram/index.d.mts +6 -0
  404. package/lib/types/devops/environment.d.cts +62 -0
  405. package/lib/types/devops/environment.d.mts +62 -0
  406. package/lib/types/devops/github/GithubService.d.cts +287 -0
  407. package/lib/types/devops/github/GithubService.d.mts +287 -0
  408. package/lib/types/devops/github/index.d.cts +6 -0
  409. package/lib/types/devops/github/index.d.mts +6 -0
  410. package/lib/types/devops/gitlab/GitlabService.d.cts +277 -0
  411. package/lib/types/devops/gitlab/GitlabService.d.mts +277 -0
  412. package/lib/types/devops/gitlab/index.d.cts +6 -0
  413. package/lib/types/devops/gitlab/index.d.mts +6 -0
  414. package/lib/types/devops/index.d.cts +10 -0
  415. package/lib/types/devops/index.d.mts +10 -0
  416. package/lib/types/index.d.cts +2 -2
  417. package/lib/types/index.d.mts +2 -2
  418. package/lib/types/io/airtable/AirtableService.d.cts +268 -0
  419. package/lib/types/io/airtable/AirtableService.d.mts +268 -0
  420. package/lib/types/io/airtable/index.d.cts +6 -0
  421. package/lib/types/io/airtable/index.d.mts +6 -0
  422. package/lib/types/io/environment.d.cts +67 -0
  423. package/lib/types/io/environment.d.mts +67 -0
  424. package/lib/types/io/google-sheets/GoogleSheetsService.d.cts +204 -0
  425. package/lib/types/io/google-sheets/GoogleSheetsService.d.mts +204 -0
  426. package/lib/types/io/google-sheets/index.d.cts +6 -0
  427. package/lib/types/io/google-sheets/index.d.mts +6 -0
  428. package/lib/types/io/graphql/GraphqlService.d.cts +173 -0
  429. package/lib/types/io/graphql/GraphqlService.d.mts +173 -0
  430. package/lib/types/io/graphql/index.d.cts +6 -0
  431. package/lib/types/io/graphql/index.d.mts +6 -0
  432. package/lib/types/io/index.d.cts +12 -0
  433. package/lib/types/io/index.d.mts +12 -0
  434. package/lib/types/io/spreadsheet/SpreadsheetService.d.cts +144 -0
  435. package/lib/types/io/spreadsheet/SpreadsheetService.d.mts +144 -0
  436. package/lib/types/io/spreadsheet/index.d.cts +7 -0
  437. package/lib/types/io/spreadsheet/index.d.mts +7 -0
  438. package/lib/types/namespaces/index.d.cts +1 -0
  439. package/lib/types/namespaces/index.d.mts +1 -0
  440. package/lib/types/namespaces/models/credential.model.d.cts +23 -0
  441. package/lib/types/namespaces/models/credential.model.d.mts +23 -0
  442. package/lib/types/namespaces/models/index.d.cts +1 -0
  443. package/lib/types/namespaces/models/index.d.mts +1 -0
  444. package/lib/types/namespaces/rls/index.d.cts +10 -0
  445. package/lib/types/namespaces/rls/index.d.mts +10 -0
  446. package/lib/types/namespaces/rls/principal-resolver.d.cts +47 -0
  447. package/lib/types/namespaces/rls/principal-resolver.d.mts +47 -0
  448. package/lib/types/namespaces/rls/rls-bootstrap.service.d.cts +157 -0
  449. package/lib/types/namespaces/rls/rls-bootstrap.service.d.mts +157 -0
  450. package/lib/types/namespaces/rls/rls.constants.d.cts +52 -0
  451. package/lib/types/namespaces/rls/rls.constants.d.mts +52 -0
  452. package/lib/types/namespaces/rls/rls.template.d.cts +42 -0
  453. package/lib/types/namespaces/rls/rls.template.d.mts +42 -0
  454. package/lib/types/namespaces/rls/rls.types.d.cts +77 -0
  455. package/lib/types/namespaces/rls/rls.types.d.mts +77 -0
  456. package/lib/types/namespaces/rls/session-binding.d.cts +87 -0
  457. package/lib/types/namespaces/rls/session-binding.d.mts +87 -0
  458. package/lib/types/namespaces/services/credential.service.d.cts +175 -0
  459. package/lib/types/namespaces/services/credential.service.d.mts +175 -0
  460. package/lib/types/namespaces/services/index.d.cts +1 -0
  461. package/lib/types/namespaces/services/index.d.mts +1 -0
  462. package/lib/types/namespaces/types.d.cts +37 -0
  463. package/lib/types/namespaces/types.d.mts +37 -0
  464. package/lib/types/redis/adapter.d.cts +2 -0
  465. package/lib/types/redis/adapter.d.mts +2 -0
  466. package/lib/types/redis/types.d.cts +27 -2
  467. package/lib/types/redis/types.d.mts +27 -2
  468. package/lib/types/secrets/InfraCredentialBootstrap.d.cts +100 -0
  469. package/lib/types/secrets/InfraCredentialBootstrap.d.mts +100 -0
  470. package/lib/types/secrets/core/SecretTypes.d.cts +15 -1
  471. package/lib/types/secrets/core/SecretTypes.d.mts +15 -1
  472. package/lib/types/secrets/fs/FsSecretEnvironment.d.cts +42 -0
  473. package/lib/types/secrets/fs/FsSecretEnvironment.d.mts +42 -0
  474. package/lib/types/secrets/fs/FsSecretService.d.cts +207 -0
  475. package/lib/types/secrets/fs/FsSecretService.d.mts +207 -0
  476. package/lib/types/secrets/fs/FsSecretServiceConfig.d.cts +37 -0
  477. package/lib/types/secrets/fs/FsSecretServiceConfig.d.mts +37 -0
  478. package/lib/types/secrets/fs/index.d.cts +9 -0
  479. package/lib/types/secrets/fs/index.d.mts +9 -0
  480. package/lib/types/secrets/index.d.cts +2 -0
  481. package/lib/types/secrets/index.d.mts +2 -0
  482. package/lib/types/secrets/model/ModelSecretService.d.cts +190 -1
  483. package/lib/types/secrets/model/ModelSecretService.d.mts +190 -1
  484. package/lib/types/secrets/model/Secret.d.cts +44 -3
  485. package/lib/types/secrets/model/Secret.d.mts +44 -3
  486. package/lib/types/shared/environmentValue.d.cts +24 -0
  487. package/lib/types/shared/environmentValue.d.mts +24 -0
  488. package/lib/types/shared/http/HttpApiService.d.cts +193 -0
  489. package/lib/types/shared/http/HttpApiService.d.mts +193 -0
  490. package/lib/types/shared/http/hermeticBoot.d.cts +84 -0
  491. package/lib/types/shared/http/hermeticBoot.d.mts +84 -0
  492. package/lib/types/shared/http/index.d.cts +10 -0
  493. package/lib/types/shared/http/index.d.mts +10 -0
  494. package/package.json +180 -3
  495. package/sql/002_rls.sql +660 -15
  496. package/sql/004_credentials.sql +46 -0
@@ -1,22 +1,211 @@
1
+ /**
2
+ * @module integrations/secrets/model/service
3
+ * @summary Model-backed encrypted secret service.
4
+ * @description Implements the `{@link ModelSecretService}`, an undecorated
5
+ * `ClientBasedSecretService` that
6
+ * persists AES-encrypted payloads as `{@link Secret}` rows through a
7
+ * decaf `Repository` (tenant/org-unit/owner scoping included). Encryption
8
+ * keys derive from a master `keySecret` via `CryptoService`; configuration
9
+ * comes from the `secrets.model` Environment slice or an explicit boot
10
+ * config (see `ModelSecretServiceConfig`).
11
+ */
1
12
  import { ClientBasedSecretService, SecretError, SecretProvider } from "../core/index.d.cts";
2
13
  import { SecretName, SecretPayload, SecretReference, SecretMetadata } from "../core/index.d.cts";
3
- import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions } from "../core/index.d.cts";
14
+ import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions, RotateSecretOptions } from "../core/index.d.cts";
4
15
  import { Secret } from "./Secret.d.cts";
5
16
  import { ContextualArgs, MaybeContextualArg, Repository } from "@decaf-ts/core";
6
17
  import { ModelSecretServiceConfig } from "./ModelSecretServiceConfig.d.cts";
18
+ /**
19
+ * @description Model-backed encrypted secret service
20
+ * @summary Stores each secret as a `{@link Secret}` row (encrypted payload,
21
+ * key id/iv/salt metadata, version, enablement flag, and optional
22
+ * tenant/org-unit/owner scope) through the repository booted as the service
23
+ * client. Names are validated and normalized before persistence;
24
+ * `(name, version)` is unique (enforced by a `SECRET_ALREADY_EXISTS`
25
+ * conflict in `store`/`rotate` and backed by the `uq_secrets_name_version`
26
+ * database index); retrieval only considers enabled rows, supports version
27
+ * pinning, and resolves multiple matches deterministically by `updatedAt
28
+ * DESC`. Delete is soft by default (sets `enabled: false`) unless
29
+ * `options.force` is set. Errors from the repository are translated into
30
+ * typed {@link SecretError}s by `parseError`.
31
+ *
32
+ * Undecorated and Environment-configurable
33
+ * through the `secrets.model` slice; the credential service
34
+ * (`CredentialService`) delegates user/runtime credential storage to this
35
+ * service.
36
+ * @class ModelSecretService
37
+ * @category Secrets
38
+ * @example
39
+ * ```ts
40
+ * import { ModelSecretService } from "@decaf-ts/integrations/secrets";
41
+ *
42
+ * const modelSecrets = await new ModelSecretService().boot({
43
+ * keySecret: "model-master-key",
44
+ * });
45
+ * await modelSecrets.store("my-secret", { value: "s3cr3t" });
46
+ * const payload = await modelSecrets.retrieve<{ value: string }>("my-secret");
47
+ * ```
48
+ */
7
49
  export declare class ModelSecretService extends ClientBasedSecretService<Repository<Secret, any>, ModelSecretServiceConfig> {
8
50
  readonly provider: SecretProvider;
9
51
  private cryptoService;
52
+ constructor();
53
+ /**
54
+ * @description Builds the model secret configuration from the Environment
55
+ * @summary Reads the `secrets.model` Environment slice and returns a
56
+ * `ModelSecretServiceConfig` when a `keySecret` is configured; returns
57
+ * `undefined` otherwise, letting boot fall back to explicit arguments.
58
+ * @returns {ModelSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
59
+ * @override
60
+ */
10
61
  protected configFromEnvironment(): ModelSecretServiceConfig | undefined;
62
+ /**
63
+ * @description Boots the crypto service and resolves the backing repository
64
+ * @summary Accepts the configuration (explicit args, merged with the
65
+ * Environment slice by the base) and an optional `Repository<Secret>` as the
66
+ * second argument; when absent, creates one via `Repository.forModel(Secret)`.
67
+ * Returns the config and repository as the service client.
68
+ * @param {ContextualArgs} args - Configuration and optional `Repository`/`Context` arguments.
69
+ * @returns {Promise<{config: ModelSecretServiceConfig, client: Repository<Secret, any>}>} The resolved config and repository client.
70
+ */
11
71
  initialize(...args: ContextualArgs<any>): Promise<{
12
72
  config: ModelSecretServiceConfig;
13
73
  client: Repository<Secret, any>;
14
74
  }>;
75
+ /**
76
+ * @description Encrypts and persists a secret row
77
+ * @summary Validates and normalizes the name, serializes the payload, and
78
+ * encrypts it with a key derived from the master `keySecret`, embedding the
79
+ * key id/iv/salt in the row's `encryption` metadata. The row carries the
80
+ * optional tenant/org-unit/owner scoping and version. `(name, version)` is
81
+ * unique: an application-level pre-check rejects a duplicate combination
82
+ * with a `SECRET_ALREADY_EXISTS` {@link SecretError} before the insert, and
83
+ * the `uq_secrets_name_version` database index (which treats `NULL`
84
+ * versions as `''`) backstops the same rule against concurrent writers.
85
+ * @template T - The secret payload type.
86
+ * @param {SecretName} name - The secret name (validated and normalized).
87
+ * @param {T} value - The payload to encrypt and store.
88
+ * @param {StoreSecretOptions} [options] - Optional content type, tags, version, and tenant/org/owner scoping.
89
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
90
+ * @returns {Promise<SecretReference>} A reference to the persisted secret.
91
+ * @throws {SecretError} `SECRET_ALREADY_EXISTS` when a row with the same normalized name and version already exists, or `SECRET_NOT_FOUND`/`SECRET_PROVIDER_CONFLICT` when the name is invalid or the repository insert fails.
92
+ */
15
93
  store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
94
+ /**
95
+ * @description Reads, decrypts, and deserializes an enabled secret row
96
+ * @summary Queries the newest matching enabled row (by normalized name and,
97
+ * optionally, version), re-derives the key using the row's salt, and decrypts
98
+ * the payload. Rows are ordered by `updatedAt DESC`, so when several rows
99
+ * share a name the most recently updated enabled row is resolved
100
+ * deterministically. The repository SELECT runs inside a principal-bound
101
+ * transaction (see {@link ModelSecretService.withinPrincipalTransaction}):
102
+ * it joins an in-flight `transactionLock` on the context or begins one,
103
+ * binding the context's principal to `app.principal_id` on TypeORM adapters
104
+ * so namespace RLS applies to the read. Missing rows throw
105
+ * {@link NotFoundError}; decryption and JSON parse failures throw
106
+ * `InternalError`.
107
+ * @template T - The secret payload type.
108
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
109
+ * @param {RetrieveSecretOptions} [options] - Optional version filter.
110
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
111
+ * @returns {Promise<T>} The decrypted payload.
112
+ * @throws {NotFoundError} When no enabled secret matches the name/version.
113
+ */
16
114
  retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
115
+ /**
116
+ * @description Runs a repository operation inside a principal-bound transaction
117
+ * @summary Mirrors core's `@transactional()` proxy for single reads: reuses
118
+ * the `transactionLock` already cached on the context (nested call), or
119
+ * resolves a fresh lock for the service client via `resolveTransactionLock`
120
+ * and calls `begin(context)` - which, on a TypeORM adapter, binds the
121
+ * context's principal to `app.principal_id` for the new transaction.
122
+ * Increments the lock depth for the duration of the operation; on failure,
123
+ * rolls back and zeroes the depth (skipping a redundant rollback when an
124
+ * inner frame already ended the transaction) and rethrows the original
125
+ * error; on success, commits when the outermost frame completes.
126
+ * @template R - The operation result type.
127
+ * @param {Context} context - The request context, carrying any in-flight transaction lock.
128
+ * @param {function(ContextLock): Promise<R>} operation - The repository operation to run, receiving the active lock.
129
+ * @returns {Promise<R>} The operation result.
130
+ * @throws {InternalError} When the final commit fails; operation errors are rethrown after rollback.
131
+ */
132
+ private withinPrincipalTransaction;
133
+ /**
134
+ * @description Deletes (or disables) a secret row
135
+ * @summary Soft-deletes by default: the row is disabled and stamped with a
136
+ * new `updatedAt`. With `options.force`, the row is hard-deleted from the
137
+ * repository. Rows are ordered by `updatedAt DESC`, so the most recently
138
+ * updated matching row is resolved deterministically. A missing secret
139
+ * resolves silently.
140
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
141
+ * @param {DeleteSecretOptions} [options] - Optional version filter and `force` hard-delete flag.
142
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
143
+ * @returns {Promise<void>} Resolves once the row is deleted or disabled.
144
+ */
17
145
  delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
146
+ /**
147
+ * @description Checks whether an enabled secret exists (optionally at a version)
148
+ * @summary Counts enabled rows matching the normalized name (plus any
149
+ * requested version) and returns whether the count is positive.
150
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
151
+ * @param {ExistsSecretOptions} [options] - Optional version filter.
152
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
153
+ * @returns {Promise<boolean>} `true` when at least one enabled row matches.
154
+ */
18
155
  exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
156
+ /**
157
+ * @description Lists secret metadata across stored rows
158
+ * @summary Selects rows filtered by the `enabled` flag (when supplied) and
159
+ * maps them to `SecretMetadata` records (no payloads).
160
+ * @param {ListSecretsOptions} [options] - Optional `enabled` filter.
161
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
162
+ * @returns {Promise<SecretMetadata[]>} Metadata for every matching secret.
163
+ */
19
164
  list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
165
+ /**
166
+ * @description Reads one secret's metadata without its payload
167
+ * @summary Selects the row matching the normalized name (and optional
168
+ * version) and maps it to `SecretMetadata`; tags are included only when
169
+ * `options.includeTags` is set. Rows are ordered by `updatedAt DESC`, so
170
+ * the most recently updated matching row is resolved deterministically.
171
+ * Returns `undefined` when no row matches.
172
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
173
+ * @param {SecretMetadataOptions} [options] - Optional version filter and `includeTags` flag.
174
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
175
+ * @returns {Promise<SecretMetadata | undefined>} The metadata, or `undefined` when absent.
176
+ */
20
177
  metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
178
+ /**
179
+ * @description Re-encrypts an enabled secret row with a new payload
180
+ * @summary Locates the enabled row (optionally pinned to
181
+ * `options.oldVersion`), encrypts the new payload with a freshly derived
182
+ * key (optionally tagged with `options.keyId`), and updates the row's
183
+ * payload, encryption metadata, version (`options.newVersion`), and
184
+ * `updatedAt`. When `options.newVersion` differs from the row's current
185
+ * version, a `(name, version)` duplicate check rejects the rotation with a
186
+ * `SECRET_ALREADY_EXISTS` {@link SecretError}; otherwise the target version
187
+ * is reused and the row is updated in place. Matching rows are ordered by
188
+ * `updatedAt DESC`, so the most recently updated enabled row is resolved
189
+ * deterministically.
190
+ * @template T - The secret payload type.
191
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
192
+ * @param {T} value - The new payload.
193
+ * @param {RotateSecretOptions} [options] - Optional `newVersion`, `oldVersion`, and `keyId`.
194
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
195
+ * @returns {Promise<SecretReference>} A reference reflecting the updated row.
196
+ * @throws {NotFoundError} When no enabled secret matches the name/version.
197
+ * @throws {SecretError} `SECRET_ALREADY_EXISTS` when the target `newVersion` is already held by another row with the same normalized name, or `SECRET_PROVIDER_CONFLICT` when the repository update fails.
198
+ */
199
+ rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
200
+ /**
201
+ * @description Translates repository errors into typed secret errors
202
+ * @summary Inspects the error message for "not found"/404, "already
203
+ * exists"/conflict/409, and decryption-related markers and maps them to
204
+ * `SECRET_NOT_FOUND`, `SECRET_ALREADY_EXISTS`,
205
+ * `SECRET_DECRYPTION_FAILED`, or a generic `SECRET_PROVIDER_CONFLICT`
206
+ * {@link SecretError}.
207
+ * @param {unknown} error - The raw error thrown by the repository.
208
+ * @returns {SecretError} The typed secret error.
209
+ */
21
210
  protected parseError(error: unknown): SecretError;
22
211
  }
@@ -1,22 +1,211 @@
1
+ /**
2
+ * @module integrations/secrets/model/service
3
+ * @summary Model-backed encrypted secret service.
4
+ * @description Implements the `{@link ModelSecretService}`, an undecorated
5
+ * `ClientBasedSecretService` that
6
+ * persists AES-encrypted payloads as `{@link Secret}` rows through a
7
+ * decaf `Repository` (tenant/org-unit/owner scoping included). Encryption
8
+ * keys derive from a master `keySecret` via `CryptoService`; configuration
9
+ * comes from the `secrets.model` Environment slice or an explicit boot
10
+ * config (see `ModelSecretServiceConfig`).
11
+ */
1
12
  import { ClientBasedSecretService, SecretError, SecretProvider } from "../core/index.d.mts";
2
13
  import { SecretName, SecretPayload, SecretReference, SecretMetadata } from "../core/index.d.mts";
3
- import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions } from "../core/index.d.mts";
14
+ import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions, RotateSecretOptions } from "../core/index.d.mts";
4
15
  import { Secret } from "./Secret.d.mts";
5
16
  import { ContextualArgs, MaybeContextualArg, Repository } from "@decaf-ts/core";
6
17
  import { ModelSecretServiceConfig } from "./ModelSecretServiceConfig.d.mts";
18
+ /**
19
+ * @description Model-backed encrypted secret service
20
+ * @summary Stores each secret as a `{@link Secret}` row (encrypted payload,
21
+ * key id/iv/salt metadata, version, enablement flag, and optional
22
+ * tenant/org-unit/owner scope) through the repository booted as the service
23
+ * client. Names are validated and normalized before persistence;
24
+ * `(name, version)` is unique (enforced by a `SECRET_ALREADY_EXISTS`
25
+ * conflict in `store`/`rotate` and backed by the `uq_secrets_name_version`
26
+ * database index); retrieval only considers enabled rows, supports version
27
+ * pinning, and resolves multiple matches deterministically by `updatedAt
28
+ * DESC`. Delete is soft by default (sets `enabled: false`) unless
29
+ * `options.force` is set. Errors from the repository are translated into
30
+ * typed {@link SecretError}s by `parseError`.
31
+ *
32
+ * Undecorated and Environment-configurable
33
+ * through the `secrets.model` slice; the credential service
34
+ * (`CredentialService`) delegates user/runtime credential storage to this
35
+ * service.
36
+ * @class ModelSecretService
37
+ * @category Secrets
38
+ * @example
39
+ * ```ts
40
+ * import { ModelSecretService } from "@decaf-ts/integrations/secrets";
41
+ *
42
+ * const modelSecrets = await new ModelSecretService().boot({
43
+ * keySecret: "model-master-key",
44
+ * });
45
+ * await modelSecrets.store("my-secret", { value: "s3cr3t" });
46
+ * const payload = await modelSecrets.retrieve<{ value: string }>("my-secret");
47
+ * ```
48
+ */
7
49
  export declare class ModelSecretService extends ClientBasedSecretService<Repository<Secret, any>, ModelSecretServiceConfig> {
8
50
  readonly provider: SecretProvider;
9
51
  private cryptoService;
52
+ constructor();
53
+ /**
54
+ * @description Builds the model secret configuration from the Environment
55
+ * @summary Reads the `secrets.model` Environment slice and returns a
56
+ * `ModelSecretServiceConfig` when a `keySecret` is configured; returns
57
+ * `undefined` otherwise, letting boot fall back to explicit arguments.
58
+ * @returns {ModelSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
59
+ * @override
60
+ */
10
61
  protected configFromEnvironment(): ModelSecretServiceConfig | undefined;
62
+ /**
63
+ * @description Boots the crypto service and resolves the backing repository
64
+ * @summary Accepts the configuration (explicit args, merged with the
65
+ * Environment slice by the base) and an optional `Repository<Secret>` as the
66
+ * second argument; when absent, creates one via `Repository.forModel(Secret)`.
67
+ * Returns the config and repository as the service client.
68
+ * @param {ContextualArgs} args - Configuration and optional `Repository`/`Context` arguments.
69
+ * @returns {Promise<{config: ModelSecretServiceConfig, client: Repository<Secret, any>}>} The resolved config and repository client.
70
+ */
11
71
  initialize(...args: ContextualArgs<any>): Promise<{
12
72
  config: ModelSecretServiceConfig;
13
73
  client: Repository<Secret, any>;
14
74
  }>;
75
+ /**
76
+ * @description Encrypts and persists a secret row
77
+ * @summary Validates and normalizes the name, serializes the payload, and
78
+ * encrypts it with a key derived from the master `keySecret`, embedding the
79
+ * key id/iv/salt in the row's `encryption` metadata. The row carries the
80
+ * optional tenant/org-unit/owner scoping and version. `(name, version)` is
81
+ * unique: an application-level pre-check rejects a duplicate combination
82
+ * with a `SECRET_ALREADY_EXISTS` {@link SecretError} before the insert, and
83
+ * the `uq_secrets_name_version` database index (which treats `NULL`
84
+ * versions as `''`) backstops the same rule against concurrent writers.
85
+ * @template T - The secret payload type.
86
+ * @param {SecretName} name - The secret name (validated and normalized).
87
+ * @param {T} value - The payload to encrypt and store.
88
+ * @param {StoreSecretOptions} [options] - Optional content type, tags, version, and tenant/org/owner scoping.
89
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
90
+ * @returns {Promise<SecretReference>} A reference to the persisted secret.
91
+ * @throws {SecretError} `SECRET_ALREADY_EXISTS` when a row with the same normalized name and version already exists, or `SECRET_NOT_FOUND`/`SECRET_PROVIDER_CONFLICT` when the name is invalid or the repository insert fails.
92
+ */
15
93
  store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
94
+ /**
95
+ * @description Reads, decrypts, and deserializes an enabled secret row
96
+ * @summary Queries the newest matching enabled row (by normalized name and,
97
+ * optionally, version), re-derives the key using the row's salt, and decrypts
98
+ * the payload. Rows are ordered by `updatedAt DESC`, so when several rows
99
+ * share a name the most recently updated enabled row is resolved
100
+ * deterministically. The repository SELECT runs inside a principal-bound
101
+ * transaction (see {@link ModelSecretService.withinPrincipalTransaction}):
102
+ * it joins an in-flight `transactionLock` on the context or begins one,
103
+ * binding the context's principal to `app.principal_id` on TypeORM adapters
104
+ * so namespace RLS applies to the read. Missing rows throw
105
+ * {@link NotFoundError}; decryption and JSON parse failures throw
106
+ * `InternalError`.
107
+ * @template T - The secret payload type.
108
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
109
+ * @param {RetrieveSecretOptions} [options] - Optional version filter.
110
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
111
+ * @returns {Promise<T>} The decrypted payload.
112
+ * @throws {NotFoundError} When no enabled secret matches the name/version.
113
+ */
16
114
  retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
115
+ /**
116
+ * @description Runs a repository operation inside a principal-bound transaction
117
+ * @summary Mirrors core's `@transactional()` proxy for single reads: reuses
118
+ * the `transactionLock` already cached on the context (nested call), or
119
+ * resolves a fresh lock for the service client via `resolveTransactionLock`
120
+ * and calls `begin(context)` - which, on a TypeORM adapter, binds the
121
+ * context's principal to `app.principal_id` for the new transaction.
122
+ * Increments the lock depth for the duration of the operation; on failure,
123
+ * rolls back and zeroes the depth (skipping a redundant rollback when an
124
+ * inner frame already ended the transaction) and rethrows the original
125
+ * error; on success, commits when the outermost frame completes.
126
+ * @template R - The operation result type.
127
+ * @param {Context} context - The request context, carrying any in-flight transaction lock.
128
+ * @param {function(ContextLock): Promise<R>} operation - The repository operation to run, receiving the active lock.
129
+ * @returns {Promise<R>} The operation result.
130
+ * @throws {InternalError} When the final commit fails; operation errors are rethrown after rollback.
131
+ */
132
+ private withinPrincipalTransaction;
133
+ /**
134
+ * @description Deletes (or disables) a secret row
135
+ * @summary Soft-deletes by default: the row is disabled and stamped with a
136
+ * new `updatedAt`. With `options.force`, the row is hard-deleted from the
137
+ * repository. Rows are ordered by `updatedAt DESC`, so the most recently
138
+ * updated matching row is resolved deterministically. A missing secret
139
+ * resolves silently.
140
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
141
+ * @param {DeleteSecretOptions} [options] - Optional version filter and `force` hard-delete flag.
142
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
143
+ * @returns {Promise<void>} Resolves once the row is deleted or disabled.
144
+ */
17
145
  delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
146
+ /**
147
+ * @description Checks whether an enabled secret exists (optionally at a version)
148
+ * @summary Counts enabled rows matching the normalized name (plus any
149
+ * requested version) and returns whether the count is positive.
150
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
151
+ * @param {ExistsSecretOptions} [options] - Optional version filter.
152
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
153
+ * @returns {Promise<boolean>} `true` when at least one enabled row matches.
154
+ */
18
155
  exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
156
+ /**
157
+ * @description Lists secret metadata across stored rows
158
+ * @summary Selects rows filtered by the `enabled` flag (when supplied) and
159
+ * maps them to `SecretMetadata` records (no payloads).
160
+ * @param {ListSecretsOptions} [options] - Optional `enabled` filter.
161
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
162
+ * @returns {Promise<SecretMetadata[]>} Metadata for every matching secret.
163
+ */
19
164
  list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
165
+ /**
166
+ * @description Reads one secret's metadata without its payload
167
+ * @summary Selects the row matching the normalized name (and optional
168
+ * version) and maps it to `SecretMetadata`; tags are included only when
169
+ * `options.includeTags` is set. Rows are ordered by `updatedAt DESC`, so
170
+ * the most recently updated matching row is resolved deterministically.
171
+ * Returns `undefined` when no row matches.
172
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
173
+ * @param {SecretMetadataOptions} [options] - Optional version filter and `includeTags` flag.
174
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
175
+ * @returns {Promise<SecretMetadata | undefined>} The metadata, or `undefined` when absent.
176
+ */
20
177
  metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
178
+ /**
179
+ * @description Re-encrypts an enabled secret row with a new payload
180
+ * @summary Locates the enabled row (optionally pinned to
181
+ * `options.oldVersion`), encrypts the new payload with a freshly derived
182
+ * key (optionally tagged with `options.keyId`), and updates the row's
183
+ * payload, encryption metadata, version (`options.newVersion`), and
184
+ * `updatedAt`. When `options.newVersion` differs from the row's current
185
+ * version, a `(name, version)` duplicate check rejects the rotation with a
186
+ * `SECRET_ALREADY_EXISTS` {@link SecretError}; otherwise the target version
187
+ * is reused and the row is updated in place. Matching rows are ordered by
188
+ * `updatedAt DESC`, so the most recently updated enabled row is resolved
189
+ * deterministically.
190
+ * @template T - The secret payload type.
191
+ * @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
192
+ * @param {T} value - The new payload.
193
+ * @param {RotateSecretOptions} [options] - Optional `newVersion`, `oldVersion`, and `keyId`.
194
+ * @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
195
+ * @returns {Promise<SecretReference>} A reference reflecting the updated row.
196
+ * @throws {NotFoundError} When no enabled secret matches the name/version.
197
+ * @throws {SecretError} `SECRET_ALREADY_EXISTS` when the target `newVersion` is already held by another row with the same normalized name, or `SECRET_PROVIDER_CONFLICT` when the repository update fails.
198
+ */
199
+ rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
200
+ /**
201
+ * @description Translates repository errors into typed secret errors
202
+ * @summary Inspects the error message for "not found"/404, "already
203
+ * exists"/conflict/409, and decryption-related markers and maps them to
204
+ * `SECRET_NOT_FOUND`, `SECRET_ALREADY_EXISTS`,
205
+ * `SECRET_DECRYPTION_FAILED`, or a generic `SECRET_PROVIDER_CONFLICT`
206
+ * {@link SecretError}.
207
+ * @param {unknown} error - The raw error thrown by the repository.
208
+ * @returns {SecretError} The typed secret error.
209
+ */
21
210
  protected parseError(error: unknown): SecretError;
22
211
  }
@@ -1,24 +1,65 @@
1
1
  /**
2
- * @module integrations/secrets/model/secret
3
- * @summary Encrypted secret model types.
4
- * @description Model payload and metadata types used by the encrypted-at-rest secret service.
2
+ * @module integrations/secrets/model/model
3
+ * @summary Encrypted-at-rest secret persistence model.
4
+ * @description Defines the `{@link Secret}` model (`secrets` table) persisted
5
+ * by the `{@link ModelSecretService}`: one row per secret, holding the
6
+ * encrypted payload, `keyId`/`iv`/`salt` encryption metadata, versioning and
7
+ * enablement fields, and optional tenant/org-unit/owner scoping columns.
5
8
  */
6
9
  import { BaseModel } from "@decaf-ts/core";
10
+ /**
11
+ * @description Encryption metadata embedded in a secret row
12
+ * @summary `keyId` identifies the key used to encrypt the payload; `iv` and
13
+ * the optional `aad`/`salt` carry the cipher parameters needed to re-derive
14
+ * the key and decrypt the payload.
15
+ */
7
16
  export interface SecretEncryptionMetadata {
17
+ /** @description Identifier of the encryption key used for the payload. */
8
18
  keyId: string;
19
+ /** @description Initialization vector used for the payload encryption. */
9
20
  iv: string;
21
+ /** @description Optional additional authenticated data bound to the cipher. */
10
22
  aad?: string;
23
+ /** @description Optional salt used when deriving the key from the master secret. */
24
+ salt?: string;
11
25
  }
26
+ /**
27
+ * @description Encrypted secret record stored through the model-backed secret service
28
+ * @summary Persisted in the `secrets` table. The `encryptedPayload` column is
29
+ * written only by `{@link ModelSecretService}` (which also fills
30
+ * `encryption`, `version`, and the optional `tenantId`/`orgUnitId`/
31
+ * `ownerPrincipalId` scoping columns); `enabled: false` marks soft-deleted
32
+ * secrets that retrieval filters out.
33
+ * @category Secrets
34
+ */
12
35
  export declare class Secret extends BaseModel {
36
+ /** @description Primary key (UUID). */
37
+ id: string;
38
+ /** @description Normalized secret name. */
13
39
  name: string;
40
+ /** @description Secret provider discriminator that wrote the row. */
14
41
  provider: string;
42
+ /** @description Encrypted, serialized payload. */
15
43
  encryptedPayload: string;
44
+ /** @description Cipher parameters required to decrypt the payload. */
16
45
  encryption: SecretEncryptionMetadata;
46
+ /** @description Optional content type describing the payload. */
17
47
  contentType?: string;
48
+ /** @description Optional free-form tags. */
18
49
  tags?: Record<string, string>;
50
+ /** @description When `false`, the secret is soft-deleted and filtered from retrieval. */
19
51
  enabled: boolean;
52
+ /** @description Optional version label. */
20
53
  version?: string;
54
+ /** @description Optional external identifier linking the secret to a provider record. */
21
55
  externalId?: string;
56
+ /** @description Optional provider URI for externally stored secrets. */
22
57
  uri?: string;
58
+ /** @description Optional tenant scope id. */
59
+ tenantId?: string;
60
+ /** @description Optional organizational unit scope id. */
61
+ orgUnitId?: string;
62
+ /** @description Optional owning principal id. */
63
+ ownerPrincipalId?: string;
23
64
  constructor(data?: Partial<Secret>);
24
65
  }
@@ -1,24 +1,65 @@
1
1
  /**
2
- * @module integrations/secrets/model/secret
3
- * @summary Encrypted secret model types.
4
- * @description Model payload and metadata types used by the encrypted-at-rest secret service.
2
+ * @module integrations/secrets/model/model
3
+ * @summary Encrypted-at-rest secret persistence model.
4
+ * @description Defines the `{@link Secret}` model (`secrets` table) persisted
5
+ * by the `{@link ModelSecretService}`: one row per secret, holding the
6
+ * encrypted payload, `keyId`/`iv`/`salt` encryption metadata, versioning and
7
+ * enablement fields, and optional tenant/org-unit/owner scoping columns.
5
8
  */
6
9
  import { BaseModel } from "@decaf-ts/core";
10
+ /**
11
+ * @description Encryption metadata embedded in a secret row
12
+ * @summary `keyId` identifies the key used to encrypt the payload; `iv` and
13
+ * the optional `aad`/`salt` carry the cipher parameters needed to re-derive
14
+ * the key and decrypt the payload.
15
+ */
7
16
  export interface SecretEncryptionMetadata {
17
+ /** @description Identifier of the encryption key used for the payload. */
8
18
  keyId: string;
19
+ /** @description Initialization vector used for the payload encryption. */
9
20
  iv: string;
21
+ /** @description Optional additional authenticated data bound to the cipher. */
10
22
  aad?: string;
23
+ /** @description Optional salt used when deriving the key from the master secret. */
24
+ salt?: string;
11
25
  }
26
+ /**
27
+ * @description Encrypted secret record stored through the model-backed secret service
28
+ * @summary Persisted in the `secrets` table. The `encryptedPayload` column is
29
+ * written only by `{@link ModelSecretService}` (which also fills
30
+ * `encryption`, `version`, and the optional `tenantId`/`orgUnitId`/
31
+ * `ownerPrincipalId` scoping columns); `enabled: false` marks soft-deleted
32
+ * secrets that retrieval filters out.
33
+ * @category Secrets
34
+ */
12
35
  export declare class Secret extends BaseModel {
36
+ /** @description Primary key (UUID). */
37
+ id: string;
38
+ /** @description Normalized secret name. */
13
39
  name: string;
40
+ /** @description Secret provider discriminator that wrote the row. */
14
41
  provider: string;
42
+ /** @description Encrypted, serialized payload. */
15
43
  encryptedPayload: string;
44
+ /** @description Cipher parameters required to decrypt the payload. */
16
45
  encryption: SecretEncryptionMetadata;
46
+ /** @description Optional content type describing the payload. */
17
47
  contentType?: string;
48
+ /** @description Optional free-form tags. */
18
49
  tags?: Record<string, string>;
50
+ /** @description When `false`, the secret is soft-deleted and filtered from retrieval. */
19
51
  enabled: boolean;
52
+ /** @description Optional version label. */
20
53
  version?: string;
54
+ /** @description Optional external identifier linking the secret to a provider record. */
21
55
  externalId?: string;
56
+ /** @description Optional provider URI for externally stored secrets. */
22
57
  uri?: string;
58
+ /** @description Optional tenant scope id. */
59
+ tenantId?: string;
60
+ /** @description Optional organizational unit scope id. */
61
+ orgUnitId?: string;
62
+ /** @description Optional owning principal id. */
63
+ ownerPrincipalId?: string;
23
64
  constructor(data?: Partial<Secret>);
24
65
  }
@@ -11,6 +11,30 @@
11
11
  * must use these helpers instead of a raw truthiness check, both to decide whether a
12
12
  * field was really configured and to build the config object it returns.
13
13
  */
14
+ /**
15
+ * @description Returns a non-empty string when the value is a usable string
16
+ * @summary Guards against `LoggedEnvironment` unset-leaf proxies: a value is
17
+ * accepted only when it is actually a `string` with positive length, so proxy
18
+ * placeholders and empty strings yield `undefined` instead of leaking into
19
+ * config objects.
20
+ * @param {unknown} value - The raw environment value to test.
21
+ * @returns {string | undefined} The string value, or `undefined` when the value is not a non-empty string.
22
+ */
14
23
  export declare function envString(value: unknown): string | undefined;
24
+ /**
25
+ * @description Returns a finite number when the value is a usable number
26
+ * @summary Accepts only real finite numbers, rejecting proxy placeholders,
27
+ * `NaN`, and `Infinity` so numeric environment leaves produce `undefined`
28
+ * rather than invalid config values.
29
+ * @param {unknown} value - The raw environment value to test.
30
+ * @returns {number | undefined} The numeric value, or `undefined` when the value is not a finite number.
31
+ */
15
32
  export declare function envNumber(value: unknown): number | undefined;
33
+ /**
34
+ * @description Returns a boolean when the value is actually a boolean
35
+ * @summary Accepts only `true`/`false`; any other value (including proxy
36
+ * placeholders and string-encoded flags) yields `undefined`.
37
+ * @param {unknown} value - The raw environment value to test.
38
+ * @returns {boolean | undefined} The boolean value, or `undefined` when the value is not a boolean.
39
+ */
16
40
  export declare function envBoolean(value: unknown): boolean | undefined;
@@ -11,6 +11,30 @@
11
11
  * must use these helpers instead of a raw truthiness check, both to decide whether a
12
12
  * field was really configured and to build the config object it returns.
13
13
  */
14
+ /**
15
+ * @description Returns a non-empty string when the value is a usable string
16
+ * @summary Guards against `LoggedEnvironment` unset-leaf proxies: a value is
17
+ * accepted only when it is actually a `string` with positive length, so proxy
18
+ * placeholders and empty strings yield `undefined` instead of leaking into
19
+ * config objects.
20
+ * @param {unknown} value - The raw environment value to test.
21
+ * @returns {string | undefined} The string value, or `undefined` when the value is not a non-empty string.
22
+ */
14
23
  export declare function envString(value: unknown): string | undefined;
24
+ /**
25
+ * @description Returns a finite number when the value is a usable number
26
+ * @summary Accepts only real finite numbers, rejecting proxy placeholders,
27
+ * `NaN`, and `Infinity` so numeric environment leaves produce `undefined`
28
+ * rather than invalid config values.
29
+ * @param {unknown} value - The raw environment value to test.
30
+ * @returns {number | undefined} The numeric value, or `undefined` when the value is not a finite number.
31
+ */
15
32
  export declare function envNumber(value: unknown): number | undefined;
33
+ /**
34
+ * @description Returns a boolean when the value is actually a boolean
35
+ * @summary Accepts only `true`/`false`; any other value (including proxy
36
+ * placeholders and string-encoded flags) yields `undefined`.
37
+ * @param {unknown} value - The raw environment value to test.
38
+ * @returns {boolean | undefined} The boolean value, or `undefined` when the value is not a boolean.
39
+ */
16
40
  export declare function envBoolean(value: unknown): boolean | undefined;