@breadstone/archipel-mcp 0.0.1

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 (347) hide show
  1. package/README.md +80 -0
  2. package/data/packages/index.md +42 -0
  3. package/data/packages/platform-authentication/api/Class.AnonymousAuthGuard.md +45 -0
  4. package/data/packages/platform-authentication/api/Class.AuthModule.md +72 -0
  5. package/data/packages/platform-authentication/api/Class.AuthSubjectPort.md +100 -0
  6. package/data/packages/platform-authentication/api/Class.AuthTokenService.md +64 -0
  7. package/data/packages/platform-authentication/api/Class.ChallengeService.md +136 -0
  8. package/data/packages/platform-authentication/api/Class.GithubAuthGuard.md +45 -0
  9. package/data/packages/platform-authentication/api/Class.JwtAuthGuard.md +45 -0
  10. package/data/packages/platform-authentication/api/Class.JwtPayloadBase.md +116 -0
  11. package/data/packages/platform-authentication/api/Class.LastActiveMiddleware.md +76 -0
  12. package/data/packages/platform-authentication/api/Class.LocalAuthGuard.md +45 -0
  13. package/data/packages/platform-authentication/api/Class.MfaService.md +257 -0
  14. package/data/packages/platform-authentication/api/Class.MfaSubjectPort.md +75 -0
  15. package/data/packages/platform-authentication/api/Class.RolesGuard.md +65 -0
  16. package/data/packages/platform-authentication/api/Class.SessionMappingProfile.md +65 -0
  17. package/data/packages/platform-authentication/api/Class.SessionPersistencePort.md +170 -0
  18. package/data/packages/platform-authentication/api/Class.SessionResponse.md +157 -0
  19. package/data/packages/platform-authentication/api/Class.SessionService.md +167 -0
  20. package/data/packages/platform-authentication/api/Class.SocialAuthGuard.md +66 -0
  21. package/data/packages/platform-authentication/api/Class.SocialAuthPort.md +53 -0
  22. package/data/packages/platform-authentication/api/Class.TokenEnricherPort.md +52 -0
  23. package/data/packages/platform-authentication/api/Class.VerificationService.md +159 -0
  24. package/data/packages/platform-authentication/api/Class.VerificationSubjectPort.md +121 -0
  25. package/data/packages/platform-authentication/api/Interface.IAuthModuleOptions.md +89 -0
  26. package/data/packages/platform-authentication/api/Interface.IAuthSubject.md +112 -0
  27. package/data/packages/platform-authentication/api/Interface.IMfaChallengePayload.md +87 -0
  28. package/data/packages/platform-authentication/api/Interface.IMfaChallengeState.md +123 -0
  29. package/data/packages/platform-authentication/api/Interface.IMfaConfirmation.md +27 -0
  30. package/data/packages/platform-authentication/api/Interface.IMfaSetup.md +63 -0
  31. package/data/packages/platform-authentication/api/Interface.IMfaSubject.md +136 -0
  32. package/data/packages/platform-authentication/api/Interface.IMfaSubjectUpdate.md +96 -0
  33. package/data/packages/platform-authentication/api/Interface.ISessionRecord.md +165 -0
  34. package/data/packages/platform-authentication/api/Interface.ISignInResult.md +87 -0
  35. package/data/packages/platform-authentication/api/Interface.ISocialProfile.md +63 -0
  36. package/data/packages/platform-authentication/api/Interface.IStoreSessionArgs.md +75 -0
  37. package/data/packages/platform-authentication/api/Interface.IVerifiableSubject.md +76 -0
  38. package/data/packages/platform-authentication/api/_media/ENVIRONMENT_VARIABLES.md +151 -0
  39. package/data/packages/platform-authentication/api/index.md +508 -0
  40. package/data/packages/platform-authentication/index.md +635 -0
  41. package/data/packages/platform-blob-storage/api/Class.BlobHealthIndicator.md +84 -0
  42. package/data/packages/platform-blob-storage/api/Class.BlobModule.md +54 -0
  43. package/data/packages/platform-blob-storage/api/Class.BlobObjectPersistencePort.md +80 -0
  44. package/data/packages/platform-blob-storage/api/Class.BlobService.md +253 -0
  45. package/data/packages/platform-blob-storage/api/Class.BlobVariantPersistencePort.md +56 -0
  46. package/data/packages/platform-blob-storage/api/Class.VercelBlobProvider.md +202 -0
  47. package/data/packages/platform-blob-storage/api/Interface.IBlobDeleteRequest.md +43 -0
  48. package/data/packages/platform-blob-storage/api/Interface.IBlobDownloadRequest.md +53 -0
  49. package/data/packages/platform-blob-storage/api/Interface.IBlobDownloadResult.md +69 -0
  50. package/data/packages/platform-blob-storage/api/Interface.IBlobModuleOptions.md +53 -0
  51. package/data/packages/platform-blob-storage/api/Interface.IBlobObjectMetadata.md +143 -0
  52. package/data/packages/platform-blob-storage/api/Interface.IBlobProvider.md +119 -0
  53. package/data/packages/platform-blob-storage/api/Interface.IBlobSignedUrlRequest.md +53 -0
  54. package/data/packages/platform-blob-storage/api/Interface.IBlobUploadRequest.md +103 -0
  55. package/data/packages/platform-blob-storage/api/Interface.IBlobUploadResult.md +33 -0
  56. package/data/packages/platform-blob-storage/api/Interface.ICustomBlobProviderRegistration.md +33 -0
  57. package/data/packages/platform-blob-storage/api/Interface.IVercelBlobProviderOptions.md +73 -0
  58. package/data/packages/platform-blob-storage/api/Interface.IVercelBlobProviderRegistration.md +33 -0
  59. package/data/packages/platform-blob-storage/api/TypeAlias.BlobDownloadResponseType.md +17 -0
  60. package/data/packages/platform-blob-storage/api/TypeAlias.BlobUploadBody.md +17 -0
  61. package/data/packages/platform-blob-storage/api/TypeAlias.IBlobProviderRegistration.md +17 -0
  62. package/data/packages/platform-blob-storage/api/index.md +111 -0
  63. package/data/packages/platform-blob-storage/index.md +280 -0
  64. package/data/packages/platform-core/api/Class.AppHealthIndicator.md +51 -0
  65. package/data/packages/platform-core/api/Class.BcryptService.md +69 -0
  66. package/data/packages/platform-core/api/Class.BlobResourceStrategy.md +196 -0
  67. package/data/packages/platform-core/api/Class.BooleanUtils.md +83 -0
  68. package/data/packages/platform-core/api/Class.CUIDGenerator.md +121 -0
  69. package/data/packages/platform-core/api/Class.CasingInterceptor.md +84 -0
  70. package/data/packages/platform-core/api/Class.CatchUtils.md +94 -0
  71. package/data/packages/platform-core/api/Class.ConfigModule.md +70 -0
  72. package/data/packages/platform-core/api/Class.ConfigRegistry.md +116 -0
  73. package/data/packages/platform-core/api/Class.ConfigService.md +139 -0
  74. package/data/packages/platform-core/api/Class.ConfigStrategyBase.md +110 -0
  75. package/data/packages/platform-core/api/Class.ContentTemplateEngine.md +64 -0
  76. package/data/packages/platform-core/api/Class.CryptoService.md +50 -0
  77. package/data/packages/platform-core/api/Class.DateTimeUtils.md +102 -0
  78. package/data/packages/platform-core/api/Class.DeviceParserService.md +53 -0
  79. package/data/packages/platform-core/api/Class.EmbeddedResourceStrategy.md +216 -0
  80. package/data/packages/platform-core/api/Class.EnvironmentConfigStrategy.md +144 -0
  81. package/data/packages/platform-core/api/Class.ErrorTemplateService.md +110 -0
  82. package/data/packages/platform-core/api/Class.EventHub.md +164 -0
  83. package/data/packages/platform-core/api/Class.EventModule.md +23 -0
  84. package/data/packages/platform-core/api/Class.FileConfigStrategy.md +150 -0
  85. package/data/packages/platform-core/api/Class.FileResourceStrategy.md +193 -0
  86. package/data/packages/platform-core/api/Class.GUIDGenerator.md +86 -0
  87. package/data/packages/platform-core/api/Class.GlobalExceptionFilter.md +67 -0
  88. package/data/packages/platform-core/api/Class.HealthModule.md +43 -0
  89. package/data/packages/platform-core/api/Class.HealthOrchestrator.md +65 -0
  90. package/data/packages/platform-core/api/Class.HostModule.md +33 -0
  91. package/data/packages/platform-core/api/Class.HostService.md +150 -0
  92. package/data/packages/platform-core/api/Class.HttpLoggerMiddleware.md +60 -0
  93. package/data/packages/platform-core/api/Class.IdGeneratorBase.md +88 -0
  94. package/data/packages/platform-core/api/Class.IdentifierModule.md +41 -0
  95. package/data/packages/platform-core/api/Class.IntelligenceCapabilityRegistrarBase.md +39 -0
  96. package/data/packages/platform-core/api/Class.IntelligenceCapabilityRegistry.md +103 -0
  97. package/data/packages/platform-core/api/Class.IntelligenceModule.md +23 -0
  98. package/data/packages/platform-core/api/Class.IntelligenceTextGenerator.md +82 -0
  99. package/data/packages/platform-core/api/Class.LimitRequestSizeMiddleware.md +60 -0
  100. package/data/packages/platform-core/api/Class.LocalizedTextRequest.md +43 -0
  101. package/data/packages/platform-core/api/Class.LocalizedTextResponse.md +43 -0
  102. package/data/packages/platform-core/api/Class.MappingBuilder.md +111 -0
  103. package/data/packages/platform-core/api/Class.MappingModule.md +47 -0
  104. package/data/packages/platform-core/api/Class.MappingNotRegisteredError.md +57 -0
  105. package/data/packages/platform-core/api/Class.MappingProfileBase.md +53 -0
  106. package/data/packages/platform-core/api/Class.MappingService.md +285 -0
  107. package/data/packages/platform-core/api/Class.MemoryLayeredCache.md +251 -0
  108. package/data/packages/platform-core/api/Class.NoopCacheMetricsRecorder.md +157 -0
  109. package/data/packages/platform-core/api/Class.NormalizedUtils.md +149 -0
  110. package/data/packages/platform-core/api/Class.OtpService.md +106 -0
  111. package/data/packages/platform-core/api/Class.PageableRequest.md +43 -0
  112. package/data/packages/platform-core/api/Class.PageableResponse.md +63 -0
  113. package/data/packages/platform-core/api/Class.ProblemDetailException.md +62 -0
  114. package/data/packages/platform-core/api/Class.ProblemDetailExceptionFilter.md +85 -0
  115. package/data/packages/platform-core/api/Class.QuantityResponse.md +43 -0
  116. package/data/packages/platform-core/api/Class.RedisLayeredCache.md +275 -0
  117. package/data/packages/platform-core/api/Class.ResourceManager.md +566 -0
  118. package/data/packages/platform-core/api/Class.ResourceModule.md +47 -0
  119. package/data/packages/platform-core/api/Class.ResponseReturn.md +504 -0
  120. package/data/packages/platform-core/api/Class.SseHub.md +184 -0
  121. package/data/packages/platform-core/api/Class.SseModule.md +43 -0
  122. package/data/packages/platform-core/api/Class.TimeStampResponse.md +43 -0
  123. package/data/packages/platform-core/api/Class.TypeMappingNotRegisteredError.md +58 -0
  124. package/data/packages/platform-core/api/Class.UUIDGenerator.md +86 -0
  125. package/data/packages/platform-core/api/Class.UserAvatarGeneratorService.md +48 -0
  126. package/data/packages/platform-core/api/Class.UserNameGeneratorService.md +65 -0
  127. package/data/packages/platform-core/api/Interface.IBlobResourceStrategyConfig.md +29 -0
  128. package/data/packages/platform-core/api/Interface.IBlobServiceAdapter.md +41 -0
  129. package/data/packages/platform-core/api/Interface.ICacheMetricsRecorder.md +121 -0
  130. package/data/packages/platform-core/api/Interface.ICacheStats.md +71 -0
  131. package/data/packages/platform-core/api/Interface.IConfigKey.md +64 -0
  132. package/data/packages/platform-core/api/Interface.IConfigModuleOptions.md +41 -0
  133. package/data/packages/platform-core/api/Interface.IConfigRegistryEntry.md +80 -0
  134. package/data/packages/platform-core/api/Interface.IDeviceInfo.md +81 -0
  135. package/data/packages/platform-core/api/Interface.IErrorPageParams.md +154 -0
  136. package/data/packages/platform-core/api/Interface.IEventKey.md +58 -0
  137. package/data/packages/platform-core/api/Interface.IEventMap.md +17 -0
  138. package/data/packages/platform-core/api/Interface.IFileResourceStrategyConfig.md +73 -0
  139. package/data/packages/platform-core/api/Interface.IHealthCheckResult.md +47 -0
  140. package/data/packages/platform-core/api/Interface.IHealthIndicator.md +42 -0
  141. package/data/packages/platform-core/api/Interface.IHostContentParams.md +233 -0
  142. package/data/packages/platform-core/api/Interface.IIdGenerator.md +58 -0
  143. package/data/packages/platform-core/api/Interface.IIntelligenceArtifact.md +31 -0
  144. package/data/packages/platform-core/api/Interface.IIntelligenceCapability.md +62 -0
  145. package/data/packages/platform-core/api/Interface.IIntelligenceCapabilityMetadata.md +61 -0
  146. package/data/packages/platform-core/api/Interface.IIntelligenceCapabilityPayload.md +41 -0
  147. package/data/packages/platform-core/api/Interface.IIntelligenceCapabilityRegistry.md +69 -0
  148. package/data/packages/platform-core/api/Interface.IIntelligenceCapabilityResult.md +41 -0
  149. package/data/packages/platform-core/api/Interface.IIntelligenceCompletionUsage.md +41 -0
  150. package/data/packages/platform-core/api/Interface.IIntelligenceContext.md +63 -0
  151. package/data/packages/platform-core/api/Interface.IIntelligenceContextBuilder.md +32 -0
  152. package/data/packages/platform-core/api/Interface.IIntelligenceConversationMessageSnapshot.md +61 -0
  153. package/data/packages/platform-core/api/Interface.IIntelligenceConversationSnapshot.md +51 -0
  154. package/data/packages/platform-core/api/Interface.IIntelligenceFollowUpQuestion.md +41 -0
  155. package/data/packages/platform-core/api/Interface.IIntelligenceIntent.md +41 -0
  156. package/data/packages/platform-core/api/Interface.IIntelligenceIntentEntity.md +31 -0
  157. package/data/packages/platform-core/api/Interface.IIntelligenceMessageModel.md +61 -0
  158. package/data/packages/platform-core/api/Interface.IIntelligenceMessagePayload.md +31 -0
  159. package/data/packages/platform-core/api/Interface.IIntelligencePrompt.md +31 -0
  160. package/data/packages/platform-core/api/Interface.IIntelligencePromptMessage.md +31 -0
  161. package/data/packages/platform-core/api/Interface.IIntelligenceProviderConfiguration.md +81 -0
  162. package/data/packages/platform-core/api/Interface.IIntelligenceResponseMessage.md +31 -0
  163. package/data/packages/platform-core/api/Interface.IIntelligenceTextCompletion.md +53 -0
  164. package/data/packages/platform-core/api/Interface.IIntelligenceTextGenerationOptions.md +41 -0
  165. package/data/packages/platform-core/api/Interface.IIntelligenceTextGenerator.md +46 -0
  166. package/data/packages/platform-core/api/Interface.ILayeredCache.md +194 -0
  167. package/data/packages/platform-core/api/Interface.ILayeredCacheOptions.md +71 -0
  168. package/data/packages/platform-core/api/Interface.IMappingBuilder.md +77 -0
  169. package/data/packages/platform-core/api/Interface.IMappingKey.md +59 -0
  170. package/data/packages/platform-core/api/Interface.IMappingProfile.md +33 -0
  171. package/data/packages/platform-core/api/Interface.IOtpService.md +78 -0
  172. package/data/packages/platform-core/api/Interface.IOtpUriOptions.md +47 -0
  173. package/data/packages/platform-core/api/Interface.IRedisLayeredCacheOptions.md +108 -0
  174. package/data/packages/platform-core/api/Interface.IResourceManagerConfig.md +72 -0
  175. package/data/packages/platform-core/api/Interface.IResourceMetadata.md +95 -0
  176. package/data/packages/platform-core/api/Interface.IResourceResult.md +35 -0
  177. package/data/packages/platform-core/api/Interface.IResourceStrategy.md +135 -0
  178. package/data/packages/platform-core/api/Interface.ISseEventData.md +37 -0
  179. package/data/packages/platform-core/api/Interface.ISseHub.md +92 -0
  180. package/data/packages/platform-core/api/Namespace.ISseEventData.md +34 -0
  181. package/data/packages/platform-core/api/TypeAlias.CamelCase.md +19 -0
  182. package/data/packages/platform-core/api/TypeAlias.IntelligenceConversationMessageRole.md +16 -0
  183. package/data/packages/platform-core/api/TypeAlias.IntelligenceProviderName.md +15 -0
  184. package/data/packages/platform-core/api/TypeAlias.ProblemDetail.md +29 -0
  185. package/data/packages/platform-core/api/TypeAlias.ProblemDetailTypeUrlResolver.md +26 -0
  186. package/data/packages/platform-core/api/TypeAlias.SetOptional.md +22 -0
  187. package/data/packages/platform-core/api/TypeAlias.StringValue.md +13 -0
  188. package/data/packages/platform-core/api/index.md +645 -0
  189. package/data/packages/platform-core/index.md +483 -0
  190. package/data/packages/platform-database/api/Class.DatabaseHealthIndicator.md +80 -0
  191. package/data/packages/platform-database/api/Class.DatabaseModule.md +75 -0
  192. package/data/packages/platform-database/api/Class.DatabaseService.md +165 -0
  193. package/data/packages/platform-database/api/Class.PrismaService.md +116 -0
  194. package/data/packages/platform-database/api/Class.RepositoryBase.md +526 -0
  195. package/data/packages/platform-database/api/Class.RepositoryExceptionFilter.md +60 -0
  196. package/data/packages/platform-database/api/Interface.IDatabaseModuleConfig.md +27 -0
  197. package/data/packages/platform-database/api/Interface.IPaginateOptions.md +33 -0
  198. package/data/packages/platform-database/api/Interface.IPaginatedResult.md +82 -0
  199. package/data/packages/platform-database/api/Interface.IRepositoryQuery.md +56 -0
  200. package/data/packages/platform-database/api/Interface.ITransactionalRepositoryQuery.md +55 -0
  201. package/data/packages/platform-database/api/TypeAlias.DelegateArgs.md +23 -0
  202. package/data/packages/platform-database/api/TypeAlias.DelegateReturnTypes.md +23 -0
  203. package/data/packages/platform-database/api/TypeAlias.PaginateFunction.md +36 -0
  204. package/data/packages/platform-database/api/TypeAlias.QueryResultType.md +32 -0
  205. package/data/packages/platform-database/api/TypeAlias.TransactionalQueryResultType.md +31 -0
  206. package/data/packages/platform-database/api/index.md +183 -0
  207. package/data/packages/platform-database/index.md +300 -0
  208. package/data/packages/platform-documents/api/Class.BaseDocumentRenderer.md +103 -0
  209. package/data/packages/platform-documents/api/Class.DocumentEngine.md +85 -0
  210. package/data/packages/platform-documents/api/Class.DocumentModule.md +52 -0
  211. package/data/packages/platform-documents/api/Class.SharpImageProcessor.md +136 -0
  212. package/data/packages/platform-documents/api/Interface.IDocumentModuleOptions.md +100 -0
  213. package/data/packages/platform-documents/api/Interface.IDocumentPlaceholderDetail.md +75 -0
  214. package/data/packages/platform-documents/api/Interface.IDocumentProbeReport.md +123 -0
  215. package/data/packages/platform-documents/api/Interface.IDocumentRenderer.md +52 -0
  216. package/data/packages/platform-documents/api/Interface.IImagePayload.md +63 -0
  217. package/data/packages/platform-documents/api/Interface.IImageProcessor.md +100 -0
  218. package/data/packages/platform-documents/api/Interface.IRenderOptions.md +69 -0
  219. package/data/packages/platform-documents/api/Interface.IRenderResult.md +63 -0
  220. package/data/packages/platform-documents/api/TypeAlias.DocumentFormat.md +19 -0
  221. package/data/packages/platform-documents/api/TypeAlias.EngineType.md +19 -0
  222. package/data/packages/platform-documents/api/TypeAlias.ImageMimeType.md +19 -0
  223. package/data/packages/platform-documents/api/TypeAlias.TemplateFormat.md +19 -0
  224. package/data/packages/platform-documents/api/TypeAlias.TemplateType.md +19 -0
  225. package/data/packages/platform-documents/api/index.md +91 -0
  226. package/data/packages/platform-documents/index.md +219 -0
  227. package/data/packages/platform-logging/api/Class.AnalyticsService.md +113 -0
  228. package/data/packages/platform-logging/api/Class.LoggerModule.md +25 -0
  229. package/data/packages/platform-logging/api/index.md +42 -0
  230. package/data/packages/platform-logging/index.md +92 -0
  231. package/data/packages/platform-mailing/api/Class.BlobTemplateFetchStrategy.md +67 -0
  232. package/data/packages/platform-mailing/api/Class.DeliveryStrategyBase.md +55 -0
  233. package/data/packages/platform-mailing/api/Class.FileTemplateFetchStrategy.md +65 -0
  234. package/data/packages/platform-mailing/api/Class.LogDeliveryStrategy.md +82 -0
  235. package/data/packages/platform-mailing/api/Class.MailHealthIndicator.md +83 -0
  236. package/data/packages/platform-mailing/api/Class.MailModule.md +27 -0
  237. package/data/packages/platform-mailing/api/Class.MailService.md +101 -0
  238. package/data/packages/platform-mailing/api/Class.MailTemplateEngine.md +98 -0
  239. package/data/packages/platform-mailing/api/Class.MailVerificationService.md +90 -0
  240. package/data/packages/platform-mailing/api/Class.MailgunDeliveryStrategy.md +82 -0
  241. package/data/packages/platform-mailing/api/Class.PostmarkDeliveryStrategy.md +82 -0
  242. package/data/packages/platform-mailing/api/Class.ResendDeliveryStrategy.md +82 -0
  243. package/data/packages/platform-mailing/api/Class.SendGridDeliveryStrategy.md +82 -0
  244. package/data/packages/platform-mailing/api/Class.SmtpDeliveryStrategy.md +82 -0
  245. package/data/packages/platform-mailing/api/Class.TemplateFetchStrategyBase.md +42 -0
  246. package/data/packages/platform-mailing/api/Interface.IMailEvents.md +71 -0
  247. package/data/packages/platform-mailing/api/Interface.IMailTemplateVariants.md +35 -0
  248. package/data/packages/platform-mailing/api/TypeAlias.MailTemplateFormat.md +19 -0
  249. package/data/packages/platform-mailing/api/index.md +404 -0
  250. package/data/packages/platform-mailing/index.md +335 -0
  251. package/data/packages/platform-mcp/api/Class.McpDiscoveryService.md +65 -0
  252. package/data/packages/platform-mcp/api/Class.McpModule.md +83 -0
  253. package/data/packages/platform-mcp/api/Class.McpRegistryService.md +147 -0
  254. package/data/packages/platform-mcp/api/Class.McpServerService.md +197 -0
  255. package/data/packages/platform-mcp/api/Interface.IMcpHandlerMetadata.md +47 -0
  256. package/data/packages/platform-mcp/api/Interface.IMcpModuleAsyncOptions.md +76 -0
  257. package/data/packages/platform-mcp/api/Interface.IMcpModuleOptions.md +126 -0
  258. package/data/packages/platform-mcp/api/Interface.IMcpModuleOptionsFactory.md +28 -0
  259. package/data/packages/platform-mcp/api/Interface.IMcpPromptMetadata.md +59 -0
  260. package/data/packages/platform-mcp/api/Interface.IMcpResourceMetadata.md +73 -0
  261. package/data/packages/platform-mcp/api/Interface.IMcpToolMetadata.md +83 -0
  262. package/data/packages/platform-mcp/api/Interface.IRegisteredPrompt.md +41 -0
  263. package/data/packages/platform-mcp/api/Interface.IRegisteredResource.md +41 -0
  264. package/data/packages/platform-mcp/api/Interface.IRegisteredTool.md +41 -0
  265. package/data/packages/platform-mcp/api/Interface.ISseTransportOptions.md +23 -0
  266. package/data/packages/platform-mcp/api/Interface.IStreamableHttpTransportOptions.md +39 -0
  267. package/data/packages/platform-mcp/api/index.md +123 -0
  268. package/data/packages/platform-mcp/index.md +299 -0
  269. package/data/packages/platform-openapi/api/Class.SwaggerFeatureDiscovery.md +71 -0
  270. package/data/packages/platform-openapi/api/Class.SwaggerFeatureRegistry.md +104 -0
  271. package/data/packages/platform-openapi/api/Class.SwaggerMultiDocumentService.md +82 -0
  272. package/data/packages/platform-openapi/api/Class.SwaggerTheme.md +51 -0
  273. package/data/packages/platform-openapi/api/Interface.IFeatureSwaggerConfig.md +73 -0
  274. package/data/packages/platform-openapi/api/Interface.ISwaggerFeatureMetadata.md +73 -0
  275. package/data/packages/platform-openapi/api/index.md +209 -0
  276. package/data/packages/platform-openapi/index.md +170 -0
  277. package/data/packages/platform-payments/api/Class.FeatureAccessPort.md +79 -0
  278. package/data/packages/platform-payments/api/Class.FeatureGuard.md +73 -0
  279. package/data/packages/platform-payments/api/Class.FeatureUsageInterceptor.md +74 -0
  280. package/data/packages/platform-payments/api/Class.LemonSqueezyClient.md +168 -0
  281. package/data/packages/platform-payments/api/Class.MollieClient.md +168 -0
  282. package/data/packages/platform-payments/api/Class.PaddleClient.md +168 -0
  283. package/data/packages/platform-payments/api/Class.PaymentClientPort.md +147 -0
  284. package/data/packages/platform-payments/api/Class.PaymentModule.md +53 -0
  285. package/data/packages/platform-payments/api/Class.StripeClient.md +168 -0
  286. package/data/packages/platform-payments/api/Interface.IFeatureAccessResult.md +75 -0
  287. package/data/packages/platform-payments/api/Interface.INormalizedCheckoutSession.md +75 -0
  288. package/data/packages/platform-payments/api/Interface.INormalizedPrice.md +85 -0
  289. package/data/packages/platform-payments/api/Interface.INormalizedSubscription.md +105 -0
  290. package/data/packages/platform-payments/api/Interface.INormalizedWebhookEvent.md +89 -0
  291. package/data/packages/platform-payments/api/Interface.IPaymentModuleOptions.md +65 -0
  292. package/data/packages/platform-payments/api/TypeAlias.SubscriptionStatus.md +27 -0
  293. package/data/packages/platform-payments/api/index.md +243 -0
  294. package/data/packages/platform-payments/index.md +532 -0
  295. package/data/packages/platform-reporting/api/Class.ReportingContributorRegistry.md +57 -0
  296. package/data/packages/platform-reporting/api/Class.ReportingDatasetNotFoundError.md +41 -0
  297. package/data/packages/platform-reporting/api/Class.ReportingFacade.md +85 -0
  298. package/data/packages/platform-reporting/api/Class.ReportingModule.md +23 -0
  299. package/data/packages/platform-reporting/api/Interface.IReportingContributor.md +62 -0
  300. package/data/packages/platform-reporting/api/Interface.IReportingDataset.md +83 -0
  301. package/data/packages/platform-reporting/api/Interface.IReportingDatasetField.md +71 -0
  302. package/data/packages/platform-reporting/api/Interface.IReportingQuery.md +61 -0
  303. package/data/packages/platform-reporting/api/Interface.IReportingQueryFilter.md +41 -0
  304. package/data/packages/platform-reporting/api/Interface.IReportingQueryResult.md +61 -0
  305. package/data/packages/platform-reporting/api/Interface.IReportingQuerySort.md +31 -0
  306. package/data/packages/platform-reporting/api/TypeAlias.ReportingFieldType.md +13 -0
  307. package/data/packages/platform-reporting/api/TypeAlias.ReportingFilterOperator.md +13 -0
  308. package/data/packages/platform-reporting/api/TypeAlias.ReportingQueryResultRow.md +15 -0
  309. package/data/packages/platform-reporting/api/index.md +90 -0
  310. package/data/packages/platform-reporting/index.md +229 -0
  311. package/data/packages/platform-telemetry/api/Class.NoopTelemetryFacade.md +118 -0
  312. package/data/packages/platform-telemetry/api/Class.TelemetryCacheMetricsRecorder.md +180 -0
  313. package/data/packages/platform-telemetry/api/Class.TelemetryFacade.md +132 -0
  314. package/data/packages/platform-telemetry/api/Class.TelemetryLoggerService.md +231 -0
  315. package/data/packages/platform-telemetry/api/Class.TelemetryModule.md +45 -0
  316. package/data/packages/platform-telemetry/api/Class.TelemetryRuleEngine.md +53 -0
  317. package/data/packages/platform-telemetry/api/Interface.ITelemetryFacade.md +90 -0
  318. package/data/packages/platform-telemetry/api/Interface.ITelemetryMetricsOptions.md +43 -0
  319. package/data/packages/platform-telemetry/api/Interface.ITelemetryOptions.md +141 -0
  320. package/data/packages/platform-telemetry/api/Interface.ITelemetryTracesOptions.md +43 -0
  321. package/data/packages/platform-telemetry/api/index.md +81 -0
  322. package/data/packages/platform-telemetry/index.md +234 -0
  323. package/package.json +39 -0
  324. package/src/DocsLoader.d.ts +14 -0
  325. package/src/DocsLoader.js +103 -0
  326. package/src/knowledge/configPattern.d.ts +5 -0
  327. package/src/knowledge/configPattern.js +211 -0
  328. package/src/knowledge/dtoPattern.d.ts +5 -0
  329. package/src/knowledge/dtoPattern.js +286 -0
  330. package/src/knowledge/errorHandlingPattern.d.ts +5 -0
  331. package/src/knowledge/errorHandlingPattern.js +219 -0
  332. package/src/knowledge/guardPattern.d.ts +5 -0
  333. package/src/knowledge/guardPattern.js +256 -0
  334. package/src/knowledge/mappingPattern.d.ts +6 -0
  335. package/src/knowledge/mappingPattern.js +322 -0
  336. package/src/knowledge/modulePattern.d.ts +6 -0
  337. package/src/knowledge/modulePattern.js +283 -0
  338. package/src/knowledge/queryPattern.d.ts +6 -0
  339. package/src/knowledge/queryPattern.js +215 -0
  340. package/src/knowledge/repositoryPattern.d.ts +6 -0
  341. package/src/knowledge/repositoryPattern.js +367 -0
  342. package/src/knowledge/testingPattern.d.ts +5 -0
  343. package/src/knowledge/testingPattern.js +356 -0
  344. package/src/main.d.ts +2 -0
  345. package/src/main.js +226 -0
  346. package/src/models/IPackageDoc.d.ts +19 -0
  347. package/src/models/IPackageDoc.js +3 -0
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * Static knowledge content for the Archipel query pattern.
4
+ * Returned by the get-query-pattern tool.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.QUERY_PATTERN_WITH_MODEL = exports.QUERY_PATTERN_KNOWLEDGE = void 0;
8
+ exports.QUERY_PATTERN_KNOWLEDGE = `# Archipel Query Pattern (v1)
9
+
10
+ ## Overview
11
+
12
+ In Archipel, data access follows the **Repository + Query** pattern. Repositories never expose
13
+ raw Prisma delegate methods to services. Instead, every data operation is wrapped in a
14
+ **query factory function** that returns an \`IRepositoryQuery\` object. Services call
15
+ \`repository.execute(someQuery(...))\` — never \`repository.findFirst(...)\` directly.
16
+
17
+ ## Core Interface
18
+
19
+ \`\`\`typescript
20
+ export interface IRepositoryQuery<TDelegate, TResult> {
21
+ readonly name: string;
22
+ run(model: TDelegate): Promise<TResult>;
23
+ }
24
+ \`\`\`
25
+
26
+ - \`TDelegate\` — the Prisma delegate type (e.g. \`Prisma.UserDelegate\`)
27
+ - \`TResult\` — the query's return type
28
+ - \`name\` — identifier used for logging and debugging
29
+
30
+ ## Factory Function
31
+
32
+ \`\`\`typescript
33
+ import { IRepositoryQuery } from '@breadstone/archipel-platform-database';
34
+
35
+ export function query<TDelegate, TResult>(
36
+ name: string,
37
+ run: (model: TDelegate) => Promise<TResult>,
38
+ ): IRepositoryQuery<TDelegate, TResult> {
39
+ return { name, run };
40
+ }
41
+ \`\`\`
42
+
43
+ ## Type Extraction
44
+
45
+ \`\`\`typescript
46
+ export type QueryResultType<T> = T extends IRepositoryQuery<unknown, infer R> ? R : never;
47
+ \`\`\`
48
+
49
+ Use this to derive the result type from a query factory without duplicating types:
50
+ \`\`\`typescript
51
+ type UserProfileResult = QueryResultType<ReturnType<typeof findUserProfileQuery>>;
52
+ \`\`\`
53
+
54
+ ## How to Write a Query
55
+
56
+ ### Step 1: Define the query factory function
57
+
58
+ Each query is a **named function** that returns an \`IRepositoryQuery\`. The function may accept
59
+ parameters — these become the query's runtime arguments.
60
+
61
+ \`\`\`typescript
62
+ import { Prisma } from '@prisma/client';
63
+ import { query } from '@breadstone/archipel-platform-database';
64
+
65
+ export function findUserByEmailQuery(email: string) {
66
+ return query<Prisma.UserDelegate, { id: string; email: string; name: string } | null>(
67
+ 'findUserByEmail',
68
+ (model) =>
69
+ model.findFirst({
70
+ where: { email },
71
+ select: { id: true, email: true, name: true },
72
+ }),
73
+ );
74
+ }
75
+ \`\`\`
76
+
77
+ ### Step 2: Call from a service via repository.execute()
78
+
79
+ \`\`\`typescript
80
+ // In the service:
81
+ const user = await this._userRepository.execute(findUserByEmailQuery(email));
82
+ \`\`\`
83
+
84
+ ### Step 3: Extract result type if needed for mapping
85
+
86
+ \`\`\`typescript
87
+ type FindUserByEmailResult = QueryResultType<ReturnType<typeof findUserByEmailQuery>>;
88
+ \`\`\`
89
+
90
+ ## Transactional Queries
91
+
92
+ For operations that span multiple models, use \`transactionalQuery\`:
93
+
94
+ \`\`\`typescript
95
+ import { Prisma } from '@prisma/client';
96
+ import { transactionalQuery } from '@breadstone/archipel-platform-database';
97
+
98
+ export function createOrderWithItemsQuery(data: { userId: string; items: Array<{ productId: string; quantity: number }> }) {
99
+ return transactionalQuery<{ orderId: string }>(
100
+ 'createOrderWithItems',
101
+ async (tx: Prisma.TransactionClient) => {
102
+ const order = await tx.order.create({
103
+ data: { userId: data.userId },
104
+ select: { id: true },
105
+ });
106
+
107
+ await tx.orderItem.createMany({
108
+ data: data.items.map((item) => ({
109
+ orderId: order.id,
110
+ productId: item.productId,
111
+ quantity: item.quantity,
112
+ })),
113
+ });
114
+
115
+ return { orderId: order.id };
116
+ },
117
+ );
118
+ }
119
+ \`\`\`
120
+
121
+ Called via:
122
+ \`\`\`typescript
123
+ const result = await this._orderRepository.executeTransactional(
124
+ createOrderWithItemsQuery({ userId, items }),
125
+ );
126
+ \`\`\`
127
+
128
+ ## Rules
129
+
130
+ 1. **Never call Prisma delegate methods directly from services.** Always go through \`execute(query)\`.
131
+ 2. **Always select only the fields you need.** Use \`select\` — never return full records.
132
+ 3. **Query names must be descriptive.** Use the pattern: \`verbModelByConditionQuery\`
133
+ (e.g. \`findUserByEmailQuery\`, \`countOrdersByStatusQuery\`, \`updateUserNameQuery\`).
134
+ 4. **One query per file** for non-trivial queries. Small related queries may share a file.
135
+ 5. **Type the result explicitly.** The second generic parameter of \`query()\` should be an inline
136
+ object type or a dedicated interface matching the \`select\` shape.
137
+ 6. **Each query factory is a standalone function** (not a class method). Import \`query\` from
138
+ \`@breadstone/archipel-platform-database\`.
139
+ `;
140
+ const QUERY_PATTERN_WITH_MODEL = (modelName, fields) => `
141
+ ## Example: Queries for \\"${modelName}\\"
142
+
143
+ Given a Prisma model \`${modelName}\` with fields: ${fields.map((f) => `\`${f}\``).join(', ')}
144
+
145
+ ### findFirst query
146
+ \`\`\`typescript
147
+ import { Prisma } from '@prisma/client';
148
+ import { query } from '@breadstone/archipel-platform-database';
149
+
150
+ export function find${modelName}ByIdQuery(id: string) {
151
+ return query<Prisma.${modelName}Delegate, { ${fields.map((f) => `${f}: ${inferFieldType(f)}`).join('; ')} } | null>(
152
+ 'find${modelName}ById',
153
+ (model) =>
154
+ model.findFirst({
155
+ where: { id },
156
+ select: { ${fields.map((f) => `${f}: true`).join(', ')} },
157
+ }),
158
+ );
159
+ }
160
+ \`\`\`
161
+
162
+ ### findMany query
163
+ \`\`\`typescript
164
+ export function findAll${modelName}sQuery(skip = 0, take = 20) {
165
+ return query<Prisma.${modelName}Delegate, Array<{ ${fields.map((f) => `${f}: ${inferFieldType(f)}`).join('; ')} }>>(
166
+ 'findAll${modelName}s',
167
+ (model) =>
168
+ model.findMany({
169
+ skip,
170
+ take,
171
+ select: { ${fields.map((f) => `${f}: true`).join(', ')} },
172
+ orderBy: { ${fields.includes('createdAt') ? 'createdAt' : fields[0]}: 'desc' },
173
+ }),
174
+ );
175
+ }
176
+ \`\`\`
177
+
178
+ ### count query
179
+ \`\`\`typescript
180
+ export function count${modelName}sQuery() {
181
+ return query<Prisma.${modelName}Delegate, number>(
182
+ 'count${modelName}s',
183
+ (model) => model.count(),
184
+ );
185
+ }
186
+ \`\`\`
187
+
188
+ ### Service usage
189
+ \`\`\`typescript
190
+ // In a service method:
191
+ const item = await this._${lowerFirst(modelName)}Repository.execute(find${modelName}ByIdQuery(id));
192
+ const items = await this._${lowerFirst(modelName)}Repository.execute(findAll${modelName}sQuery(0, 50));
193
+ const total = await this._${lowerFirst(modelName)}Repository.execute(count${modelName}sQuery());
194
+ \`\`\`
195
+ `;
196
+ exports.QUERY_PATTERN_WITH_MODEL = QUERY_PATTERN_WITH_MODEL;
197
+ function inferFieldType(fieldName) {
198
+ if (fieldName === 'id')
199
+ return 'string';
200
+ if (fieldName.endsWith('Id'))
201
+ return 'string';
202
+ if (fieldName.endsWith('At') || fieldName === 'createdAt' || fieldName === 'updatedAt')
203
+ return 'Date';
204
+ if (fieldName.startsWith('is') || fieldName.startsWith('has'))
205
+ return 'boolean';
206
+ if (fieldName === 'count' || fieldName === 'quantity' || fieldName === 'amount' || fieldName === 'order')
207
+ return 'number';
208
+ if (fieldName === 'email' || fieldName === 'name' || fieldName === 'title' || fieldName === 'description')
209
+ return 'string';
210
+ return 'unknown';
211
+ }
212
+ function lowerFirst(str) {
213
+ return str.charAt(0).toLowerCase() + str.slice(1);
214
+ }
215
+ //# sourceMappingURL=queryPattern.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Static knowledge content for the Archipel repository class pattern.
3
+ * Returned by the get-repository-pattern tool.
4
+ */
5
+ export declare const REPOSITORY_PATTERN_KNOWLEDGE = "# Archipel Repository Pattern\n\n## Overview\n\nEvery Prisma model gets a dedicated **Repository class** extending `RepositoryBase`.\nRepositories are the ONLY code that touches Prisma delegates. Services never call\nPrisma directly \u2014 they call `repository.execute(someQuery(...))` or\n`repository.executeTransactional(someTxQuery(...))`.\n\n## RepositoryBase Signature\n\n```typescript\nimport { RepositoryBase } from '@breadstone/archipel-platform-database';\n\nexport abstract class RepositoryBase<\n TDelegate extends Record<RepositoryOperations, (args: any) => Promise<any>>,\n TArgs extends Record<RepositoryOperations, unknown>,\n TReturn extends Record<RepositoryOperations, unknown>,\n TEntity = unknown\n>\n```\n\n### Generic Parameters\n\n| Param | Purpose | Example |\n|-------|---------|---------|\n| `TDelegate` | Prisma delegate type from generated client | `Prisma.UserDelegate` |\n| `TArgs` | Argument shapes for each operation | `Prisma.UserFindManyArgs`, etc. |\n| `TReturn` | Return shapes for each operation | `User`, `User[]`, etc. |\n| `TEntity` | Domain entity interface (optional) | `IUserEntity` |\n\n### Helper Types\n\n```typescript\nimport { DelegateArgs, DelegateReturnTypes } from '@breadstone/archipel-platform-database';\n\n// These extract args and return types from a delegate automatically:\ntype UserArgs = DelegateArgs<Prisma.UserDelegate>;\ntype UserReturns = DelegateReturnTypes<Prisma.UserDelegate>;\n```\n\n## How to Create a Repository\n\n### Step 1: Create the repository class\n\n```typescript\n// repositories/UserRepository.ts\nimport { Injectable } from '@nestjs/common';\nimport { Prisma } from '@prisma/client';\nimport {\n DatabaseService,\n DelegateArgs,\n DelegateReturnTypes,\n RepositoryBase,\n} from '@breadstone/archipel-platform-database';\n\n@Injectable()\nexport class UserRepository extends RepositoryBase<\n Prisma.UserDelegate,\n DelegateArgs<Prisma.UserDelegate>,\n DelegateReturnTypes<Prisma.UserDelegate>,\n IUserEntity\n> {\n\n // #region Ctor\n\n public constructor(db: DatabaseService) {\n super(db, db.client.user);\n }\n\n // #endregion\n\n}\n```\n\nThe constructor receives `DatabaseService` and passes both the service and the\nPrisma delegate (`db.client.user`) to the base class.\n\n### Step 2: Register as a provider in a module\n\n```typescript\n@Module({\n imports: [DatabaseModule.register()],\n providers: [UserRepository, UserService],\n exports: [UserService],\n})\nexport class UserModule {}\n```\n\n### Step 3: Inject into a service\n\n```typescript\n@Injectable()\nexport class UserService {\n\n // #region Fields\n\n private readonly _userRepository: UserRepository;\n\n // #endregion\n\n // #region Ctor\n\n public constructor(userRepository: UserRepository) {\n this._userRepository = userRepository;\n }\n\n // #endregion\n\n // #region Methods\n\n public async findById(id: string): Promise<IUserEntity | null> {\n return this._userRepository.execute(findUserByIdQuery(id));\n }\n\n public async findAll(skip = 0, take = 20): Promise<IUserEntity[]> {\n return this._userRepository.execute(findAllUsersQuery(skip, take));\n }\n\n // #endregion\n\n}\n```\n\n## Key Methods on RepositoryBase\n\n### execute(query)\n\nPrimary method for data access. Delegates to a query object.\n\n```typescript\npublic execute<TResult>(query: IRepositoryQuery<TDelegate, TResult>): Promise<TResult>\n```\n\n### executeTransactional(query)\n\nFor multi-model operations within a transaction.\n\n```typescript\npublic executeTransactional<TResult>(query: ITransactionalRepositoryQuery<TResult>): Promise<TResult>\n```\n\n### Direct Methods (for legacy or internal use only)\n\nThe base class also exposes `findUnique`, `findMany`, `findFirst`, `create`,\n`createMany`, `update`, `updateMany`, `upsert`, `delete`, `deleteMany`,\n`aggregate`, `count`, `groupBy`, `merge`.\n\n**Important:** New code should use `execute(query)` exclusively.\nDirect method calls are available but violate the query pattern convention.\n\n### findMany with Pagination\n\n```typescript\n// Direct method (legacy)\nconst results = await this._repository.findMany(args, { page: 1, perPage: 20 });\n```\n\n## Error Handling\n\nAll Prisma errors are caught by the base class `tryCatch` wrapper and re-thrown\nas `RepositoryError`:\n\n- `PrismaClientKnownRequestError` \u2192 `RepositoryError` with code `'R_KNOWN'`\n- `PrismaClientUnknownRequestError` \u2192 `RepositoryError` with code `'R_UNKNOWN'`\n- Other errors are re-thrown unchanged\n\nThe global `RepositoryExceptionFilter` catches `RepositoryError` and returns\nHTTP 500 with a structured envelope.\n\n## Query Integration\n\nRepositories work with query factories from the query pattern:\n\n```typescript\n// queries/findUserByIdQuery.ts\nimport { Prisma } from '@prisma/client';\nimport { query } from '@breadstone/archipel-platform-database';\n\nexport function findUserByIdQuery(id: string) {\n return query<Prisma.UserDelegate, IUserEntity | null>(\n 'findUserById',\n (model) => model.findFirst({\n where: { id },\n select: { id: true, email: true, name: true, createdAt: true },\n }),\n );\n}\n\n// Service usage:\nconst user = await this._userRepository.execute(findUserByIdQuery(id));\n```\n\n## Rules\n\n1. **One repository per Prisma model** \u2014 e.g. `UserRepository`, `OrderRepository`.\n2. **Constructor receives `DatabaseService`** and passes the delegate via `db.client.<model>`.\n3. **Use `DelegateArgs` and `DelegateReturnTypes`** helper types for the RepositoryBase generics.\n4. **New code uses `execute(query)`** \u2014 never direct calls like `repository.findFirst()` from services.\n5. **Register as provider** in the feature module, import `DatabaseModule.register()`.\n6. **Repositories are `@Injectable()`** \u2014 they participate in NestJS DI.\n7. **Domain entity interface as fourth generic** (`TEntity`) is optional but recommended.\n";
6
+ export declare const REPOSITORY_PATTERN_WITH_MODEL: (modelName: string, fields: string[]) => string;
@@ -0,0 +1,367 @@
1
+ "use strict";
2
+ /**
3
+ * Static knowledge content for the Archipel repository class pattern.
4
+ * Returned by the get-repository-pattern tool.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.REPOSITORY_PATTERN_WITH_MODEL = exports.REPOSITORY_PATTERN_KNOWLEDGE = void 0;
8
+ exports.REPOSITORY_PATTERN_KNOWLEDGE = `# Archipel Repository Pattern
9
+
10
+ ## Overview
11
+
12
+ Every Prisma model gets a dedicated **Repository class** extending \`RepositoryBase\`.
13
+ Repositories are the ONLY code that touches Prisma delegates. Services never call
14
+ Prisma directly — they call \`repository.execute(someQuery(...))\` or
15
+ \`repository.executeTransactional(someTxQuery(...))\`.
16
+
17
+ ## RepositoryBase Signature
18
+
19
+ \`\`\`typescript
20
+ import { RepositoryBase } from '@breadstone/archipel-platform-database';
21
+
22
+ export abstract class RepositoryBase<
23
+ TDelegate extends Record<RepositoryOperations, (args: any) => Promise<any>>,
24
+ TArgs extends Record<RepositoryOperations, unknown>,
25
+ TReturn extends Record<RepositoryOperations, unknown>,
26
+ TEntity = unknown
27
+ >
28
+ \`\`\`
29
+
30
+ ### Generic Parameters
31
+
32
+ | Param | Purpose | Example |
33
+ |-------|---------|---------|
34
+ | \`TDelegate\` | Prisma delegate type from generated client | \`Prisma.UserDelegate\` |
35
+ | \`TArgs\` | Argument shapes for each operation | \`Prisma.UserFindManyArgs\`, etc. |
36
+ | \`TReturn\` | Return shapes for each operation | \`User\`, \`User[]\`, etc. |
37
+ | \`TEntity\` | Domain entity interface (optional) | \`IUserEntity\` |
38
+
39
+ ### Helper Types
40
+
41
+ \`\`\`typescript
42
+ import { DelegateArgs, DelegateReturnTypes } from '@breadstone/archipel-platform-database';
43
+
44
+ // These extract args and return types from a delegate automatically:
45
+ type UserArgs = DelegateArgs<Prisma.UserDelegate>;
46
+ type UserReturns = DelegateReturnTypes<Prisma.UserDelegate>;
47
+ \`\`\`
48
+
49
+ ## How to Create a Repository
50
+
51
+ ### Step 1: Create the repository class
52
+
53
+ \`\`\`typescript
54
+ // repositories/UserRepository.ts
55
+ import { Injectable } from '@nestjs/common';
56
+ import { Prisma } from '@prisma/client';
57
+ import {
58
+ DatabaseService,
59
+ DelegateArgs,
60
+ DelegateReturnTypes,
61
+ RepositoryBase,
62
+ } from '@breadstone/archipel-platform-database';
63
+
64
+ @Injectable()
65
+ export class UserRepository extends RepositoryBase<
66
+ Prisma.UserDelegate,
67
+ DelegateArgs<Prisma.UserDelegate>,
68
+ DelegateReturnTypes<Prisma.UserDelegate>,
69
+ IUserEntity
70
+ > {
71
+
72
+ // #region Ctor
73
+
74
+ public constructor(db: DatabaseService) {
75
+ super(db, db.client.user);
76
+ }
77
+
78
+ // #endregion
79
+
80
+ }
81
+ \`\`\`
82
+
83
+ The constructor receives \`DatabaseService\` and passes both the service and the
84
+ Prisma delegate (\`db.client.user\`) to the base class.
85
+
86
+ ### Step 2: Register as a provider in a module
87
+
88
+ \`\`\`typescript
89
+ @Module({
90
+ imports: [DatabaseModule.register()],
91
+ providers: [UserRepository, UserService],
92
+ exports: [UserService],
93
+ })
94
+ export class UserModule {}
95
+ \`\`\`
96
+
97
+ ### Step 3: Inject into a service
98
+
99
+ \`\`\`typescript
100
+ @Injectable()
101
+ export class UserService {
102
+
103
+ // #region Fields
104
+
105
+ private readonly _userRepository: UserRepository;
106
+
107
+ // #endregion
108
+
109
+ // #region Ctor
110
+
111
+ public constructor(userRepository: UserRepository) {
112
+ this._userRepository = userRepository;
113
+ }
114
+
115
+ // #endregion
116
+
117
+ // #region Methods
118
+
119
+ public async findById(id: string): Promise<IUserEntity | null> {
120
+ return this._userRepository.execute(findUserByIdQuery(id));
121
+ }
122
+
123
+ public async findAll(skip = 0, take = 20): Promise<IUserEntity[]> {
124
+ return this._userRepository.execute(findAllUsersQuery(skip, take));
125
+ }
126
+
127
+ // #endregion
128
+
129
+ }
130
+ \`\`\`
131
+
132
+ ## Key Methods on RepositoryBase
133
+
134
+ ### execute(query)
135
+
136
+ Primary method for data access. Delegates to a query object.
137
+
138
+ \`\`\`typescript
139
+ public execute<TResult>(query: IRepositoryQuery<TDelegate, TResult>): Promise<TResult>
140
+ \`\`\`
141
+
142
+ ### executeTransactional(query)
143
+
144
+ For multi-model operations within a transaction.
145
+
146
+ \`\`\`typescript
147
+ public executeTransactional<TResult>(query: ITransactionalRepositoryQuery<TResult>): Promise<TResult>
148
+ \`\`\`
149
+
150
+ ### Direct Methods (for legacy or internal use only)
151
+
152
+ The base class also exposes \`findUnique\`, \`findMany\`, \`findFirst\`, \`create\`,
153
+ \`createMany\`, \`update\`, \`updateMany\`, \`upsert\`, \`delete\`, \`deleteMany\`,
154
+ \`aggregate\`, \`count\`, \`groupBy\`, \`merge\`.
155
+
156
+ **Important:** New code should use \`execute(query)\` exclusively.
157
+ Direct method calls are available but violate the query pattern convention.
158
+
159
+ ### findMany with Pagination
160
+
161
+ \`\`\`typescript
162
+ // Direct method (legacy)
163
+ const results = await this._repository.findMany(args, { page: 1, perPage: 20 });
164
+ \`\`\`
165
+
166
+ ## Error Handling
167
+
168
+ All Prisma errors are caught by the base class \`tryCatch\` wrapper and re-thrown
169
+ as \`RepositoryError\`:
170
+
171
+ - \`PrismaClientKnownRequestError\` → \`RepositoryError\` with code \`'R_KNOWN'\`
172
+ - \`PrismaClientUnknownRequestError\` → \`RepositoryError\` with code \`'R_UNKNOWN'\`
173
+ - Other errors are re-thrown unchanged
174
+
175
+ The global \`RepositoryExceptionFilter\` catches \`RepositoryError\` and returns
176
+ HTTP 500 with a structured envelope.
177
+
178
+ ## Query Integration
179
+
180
+ Repositories work with query factories from the query pattern:
181
+
182
+ \`\`\`typescript
183
+ // queries/findUserByIdQuery.ts
184
+ import { Prisma } from '@prisma/client';
185
+ import { query } from '@breadstone/archipel-platform-database';
186
+
187
+ export function findUserByIdQuery(id: string) {
188
+ return query<Prisma.UserDelegate, IUserEntity | null>(
189
+ 'findUserById',
190
+ (model) => model.findFirst({
191
+ where: { id },
192
+ select: { id: true, email: true, name: true, createdAt: true },
193
+ }),
194
+ );
195
+ }
196
+
197
+ // Service usage:
198
+ const user = await this._userRepository.execute(findUserByIdQuery(id));
199
+ \`\`\`
200
+
201
+ ## Rules
202
+
203
+ 1. **One repository per Prisma model** — e.g. \`UserRepository\`, \`OrderRepository\`.
204
+ 2. **Constructor receives \`DatabaseService\`** and passes the delegate via \`db.client.<model>\`.
205
+ 3. **Use \`DelegateArgs\` and \`DelegateReturnTypes\`** helper types for the RepositoryBase generics.
206
+ 4. **New code uses \`execute(query)\`** — never direct calls like \`repository.findFirst()\` from services.
207
+ 5. **Register as provider** in the feature module, import \`DatabaseModule.register()\`.
208
+ 6. **Repositories are \`@Injectable()\`** — they participate in NestJS DI.
209
+ 7. **Domain entity interface as fourth generic** (\`TEntity\`) is optional but recommended.
210
+ `;
211
+ const REPOSITORY_PATTERN_WITH_MODEL = (modelName, fields) => `
212
+ ## Example: Repository for "${modelName}"
213
+
214
+ Given a Prisma model \`${modelName}\` with fields: ${fields.map((f) => `\`${f}\``).join(', ')}
215
+
216
+ ### Repository Class
217
+
218
+ \`\`\`typescript
219
+ // repositories/${modelName}Repository.ts
220
+ import { Injectable } from '@nestjs/common';
221
+ import { Prisma } from '@prisma/client';
222
+ import {
223
+ DatabaseService,
224
+ DelegateArgs,
225
+ DelegateReturnTypes,
226
+ RepositoryBase,
227
+ } from '@breadstone/archipel-platform-database';
228
+ import { I${modelName}Entity } from '../models/entities/I${modelName}Entity';
229
+
230
+ @Injectable()
231
+ export class ${modelName}Repository extends RepositoryBase<
232
+ Prisma.${modelName}Delegate,
233
+ DelegateArgs<Prisma.${modelName}Delegate>,
234
+ DelegateReturnTypes<Prisma.${modelName}Delegate>,
235
+ I${modelName}Entity
236
+ > {
237
+
238
+ // #region Ctor
239
+
240
+ public constructor(db: DatabaseService) {
241
+ super(db, db.client.${lowerFirst(modelName)});
242
+ }
243
+
244
+ // #endregion
245
+
246
+ }
247
+ \`\`\`
248
+
249
+ ### Entity Interface
250
+
251
+ \`\`\`typescript
252
+ // models/entities/I${modelName}Entity.ts
253
+ export interface I${modelName}Entity {
254
+ ${fields.map((f) => ` readonly ${f}: ${inferFieldType(f)};`).join('\n')}
255
+ }
256
+ \`\`\`
257
+
258
+ ### Query Factories
259
+
260
+ \`\`\`typescript
261
+ // queries/find${modelName}ByIdQuery.ts
262
+ import { Prisma } from '@prisma/client';
263
+ import { query } from '@breadstone/archipel-platform-database';
264
+ import { I${modelName}Entity } from '../models/entities/I${modelName}Entity';
265
+
266
+ export function find${modelName}ByIdQuery(id: string) {
267
+ return query<Prisma.${modelName}Delegate, I${modelName}Entity | null>(
268
+ 'find${modelName}ById',
269
+ (model) => model.findFirst({
270
+ where: { id },
271
+ select: { ${fields.map((f) => `${f}: true`).join(', ')} },
272
+ }),
273
+ );
274
+ }
275
+
276
+ export function findAll${modelName}sQuery(skip = 0, take = 20) {
277
+ return query<Prisma.${modelName}Delegate, I${modelName}Entity[]>(
278
+ 'findAll${modelName}s',
279
+ (model) => model.findMany({
280
+ skip,
281
+ take,
282
+ select: { ${fields.map((f) => `${f}: true`).join(', ')} },
283
+ orderBy: { ${fields.includes('createdAt') ? 'createdAt' : fields[0]}: 'desc' },
284
+ }),
285
+ );
286
+ }
287
+
288
+ export function count${modelName}sQuery() {
289
+ return query<Prisma.${modelName}Delegate, number>(
290
+ 'count${modelName}s',
291
+ (model) => model.count(),
292
+ );
293
+ }
294
+ \`\`\`
295
+
296
+ ### Module Registration
297
+
298
+ \`\`\`typescript
299
+ import { DatabaseModule } from '@breadstone/archipel-platform-database';
300
+ import { ${modelName}Repository } from './repositories/${modelName}Repository';
301
+ import { ${modelName}Service } from './services/${modelName}Service';
302
+
303
+ @Module({
304
+ imports: [DatabaseModule.register()],
305
+ providers: [${modelName}Repository, ${modelName}Service],
306
+ exports: [${modelName}Service],
307
+ })
308
+ export class ${modelName}Module {}
309
+ \`\`\`
310
+
311
+ ### Service Usage
312
+
313
+ \`\`\`typescript
314
+ @Injectable()
315
+ export class ${modelName}Service {
316
+
317
+ // #region Fields
318
+
319
+ private readonly _${lowerFirst(modelName)}Repository: ${modelName}Repository;
320
+
321
+ // #endregion
322
+
323
+ // #region Ctor
324
+
325
+ public constructor(${lowerFirst(modelName)}Repository: ${modelName}Repository) {
326
+ this._${lowerFirst(modelName)}Repository = ${lowerFirst(modelName)}Repository;
327
+ }
328
+
329
+ // #endregion
330
+
331
+ // #region Methods
332
+
333
+ public async findById(id: string): Promise<I${modelName}Entity | null> {
334
+ return this._${lowerFirst(modelName)}Repository.execute(find${modelName}ByIdQuery(id));
335
+ }
336
+
337
+ public async findAll(skip = 0, take = 20): Promise<I${modelName}Entity[]> {
338
+ return this._${lowerFirst(modelName)}Repository.execute(findAll${modelName}sQuery(skip, take));
339
+ }
340
+
341
+ public async count(): Promise<number> {
342
+ return this._${lowerFirst(modelName)}Repository.execute(count${modelName}sQuery());
343
+ }
344
+
345
+ // #endregion
346
+
347
+ }
348
+ \`\`\`
349
+ `;
350
+ exports.REPOSITORY_PATTERN_WITH_MODEL = REPOSITORY_PATTERN_WITH_MODEL;
351
+ function inferFieldType(fieldName) {
352
+ if (fieldName === 'id')
353
+ return 'string';
354
+ if (fieldName.endsWith('Id'))
355
+ return 'string';
356
+ if (fieldName.endsWith('At') || fieldName === 'createdAt' || fieldName === 'updatedAt')
357
+ return 'Date';
358
+ if (fieldName.startsWith('is') || fieldName.startsWith('has'))
359
+ return 'boolean';
360
+ if (fieldName === 'count' || fieldName === 'quantity' || fieldName === 'amount' || fieldName === 'price')
361
+ return 'number';
362
+ return 'string';
363
+ }
364
+ function lowerFirst(str) {
365
+ return str.charAt(0).toLowerCase() + str.slice(1);
366
+ }
367
+ //# sourceMappingURL=repositoryPattern.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Static knowledge content for the Archipel testing pattern.
3
+ * Returned by the get-testing-pattern tool.
4
+ */
5
+ export declare const TESTING_PATTERN_KNOWLEDGE = "# Archipel Testing Pattern\n\n## Overview\n\nArchipel uses **Vitest** for unit and integration tests with **vi mocking**. Tests follow\nthe Arrange-Act-Assert (AAA) pattern with descriptive `describe`/`it` blocks. Each test\nfile covers a single class or module.\n\n## Test Framework\n\n- **Runner:** Vitest\n- **Mocking:** `vi.fn()`, `vi.mock()`, `vi.spyOn()`\n- **Assertions:** Vitest built-in (`expect`)\n- **E2E:** Supertest against a bootstrapped NestJS app\n\n## File Naming & Location\n\n| Test Type | File Pattern | Location |\n|-----------|-------------|----------|\n| Unit test | `*.spec.ts` | Next to the source file |\n| E2E test | `*.e2e-spec.ts` | `test/` directory |\n\n## Basic Test Structure\n\n```typescript\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\n\ndescribe('UserService', () => {\n\n // #region Fields\n\n let service: UserService;\n let mockRepository: { execute: ReturnType<typeof vi.fn> };\n let mockMappingService: { map: ReturnType<typeof vi.fn> };\n\n // #endregion\n\n // #region Methods\n\n beforeEach(() => {\n vi.restoreAllMocks();\n\n mockRepository = {\n execute: vi.fn(),\n };\n\n mockMappingService = {\n map: vi.fn(),\n };\n\n service = new UserService(\n mockRepository as unknown as UserRepository,\n mockMappingService as unknown as MappingService,\n );\n });\n\n describe('findById', () => {\n it('should return entity when user exists', async () => {\n // arrange\n const mockUser = { id: '1', email: 'test@example.com', name: 'Test' };\n mockRepository.execute.mockResolvedValue(mockUser);\n\n // act\n const result = await service.findById('1');\n\n // assert\n expect(result).toEqual(mockUser);\n expect(mockRepository.execute).toHaveBeenCalledOnce();\n });\n\n it('should throw UserNotFoundError when user does not exist', async () => {\n // arrange\n mockRepository.execute.mockResolvedValue(null);\n\n // act & assert\n await expect(() => service.findById('nonexistent'))\n .rejects.toThrow(UserNotFoundError);\n });\n });\n\n // #endregion\n\n});\n```\n\n## Mocking Patterns\n\n### Mocking Prisma Delegates (for Repository Tests)\n\n```typescript\nvi.mock('@prisma/client/runtime/client', () => ({\n PrismaClientKnownRequestError: class PrismaClientKnownRequestError extends Error {\n public code: string;\n public meta?: Record<string, unknown>;\n public clientVersion: string;\n public constructor(message: string, opts: { code: string; clientVersion: string; meta?: Record<string, unknown> }) {\n super(message);\n this.name = 'PrismaClientKnownRequestError';\n this.code = opts.code;\n this.clientVersion = opts.clientVersion;\n this.meta = opts.meta;\n }\n },\n PrismaClientUnknownRequestError: class PrismaClientUnknownRequestError extends Error {\n public clientVersion: string;\n public constructor(message: string, opts: { clientVersion: string }) {\n super(message);\n this.name = 'PrismaClientUnknownRequestError';\n this.clientVersion = opts.clientVersion;\n }\n },\n}));\n```\n\n### Creating a Mock Delegate\n\n```typescript\ntype MockDelegate = Record<\n | 'aggregate' | 'count' | 'create' | 'createMany' | 'createManyAndReturn'\n | 'delete' | 'deleteMany' | 'findFirst' | 'findFirstOrThrow'\n | 'findMany' | 'findUnique' | 'findUniqueOrThrow'\n | 'groupBy' | 'update' | 'updateMany' | 'upsert',\n ReturnType<typeof vi.fn>\n>;\n\nfunction createMockDelegate(): MockDelegate {\n return {\n findUnique: vi.fn(),\n findFirst: vi.fn(),\n findMany: vi.fn(),\n create: vi.fn(),\n createMany: vi.fn(),\n createManyAndReturn: vi.fn(),\n update: vi.fn(),\n updateMany: vi.fn(),\n upsert: vi.fn(),\n delete: vi.fn(),\n deleteMany: vi.fn(),\n aggregate: vi.fn(),\n count: vi.fn(),\n groupBy: vi.fn(),\n findFirstOrThrow: vi.fn(),\n findUniqueOrThrow: vi.fn(),\n };\n}\n```\n\n### Mocking DatabaseService\n\n```typescript\nconst mockDb = {\n transactionCallback: vi.fn(),\n client: {\n user: createMockDelegate(),\n },\n} as unknown as DatabaseService;\n```\n\n### Mocking a Query\n\n```typescript\nconst mockQuery = {\n name: 'findUserById',\n run: vi.fn().mockResolvedValue({ id: '1', email: 'test@example.com' }),\n};\n```\n\n## Repository Test Pattern\n\n```typescript\nimport { beforeEach, describe, expect, it, vi } from 'vitest';\n\n// Mock Prisma runtime errors BEFORE importing test subject\nvi.mock('@prisma/client/runtime/client', () => ({ /* ... */ }));\nimport { PrismaClientKnownRequestError } from '@prisma/client/runtime/client';\n\ndescribe('UserRepository', () => {\n\n let repository: TestRepository;\n let mockModel: MockDelegate;\n let mockDb: DatabaseService;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockModel = createMockDelegate();\n mockDb = { transactionCallback: vi.fn() } as unknown as DatabaseService;\n repository = new TestRepository(mockDb, mockModel);\n });\n\n describe('execute', () => {\n it('should execute a query against the model', async () => {\n // arrange\n const mockQuery = {\n name: 'testQuery',\n run: vi.fn().mockResolvedValue({ id: '1' }),\n };\n\n // act\n const result = await repository.execute(mockQuery);\n\n // assert\n expect(mockQuery.run).toHaveBeenCalledWith(mockModel);\n expect(result).toEqual({ id: '1' });\n });\n\n it('should wrap PrismaClientKnownRequestError as RepositoryError', async () => {\n // arrange\n const prismaError = new PrismaClientKnownRequestError('Not found', {\n code: 'P2025',\n clientVersion: '6.0.0',\n });\n const mockQuery = {\n name: 'failingQuery',\n run: vi.fn().mockRejectedValue(prismaError),\n };\n\n // act & assert\n await expect(() => repository.execute(mockQuery))\n .rejects.toThrow(RepositoryError);\n });\n });\n\n});\n```\n\n## Service Test Pattern\n\n```typescript\ndescribe('ProductService', () => {\n\n let service: ProductService;\n let mockRepo: { execute: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n mockRepo = { execute: vi.fn() };\n service = new ProductService(mockRepo as unknown as ProductRepository);\n });\n\n describe('findById', () => {\n it('should return entity when found', async () => {\n // arrange\n const expected = { id: '1', name: 'Product A', barcode: '123' };\n mockRepo.execute.mockResolvedValue(expected);\n\n // act\n const result = await service.findById('1');\n\n // assert\n expect(result).toEqual(expected);\n });\n\n it('should throw domain error when not found', async () => {\n // arrange\n mockRepo.execute.mockResolvedValue(null);\n\n // act & assert\n await expect(() => service.findById('unknown'))\n .rejects.toThrow(ProductNotFoundError);\n });\n });\n\n});\n```\n\n## Mapping Profile Test Pattern\n\n```typescript\ndescribe('ProductMappingProfile', () => {\n\n let mappingService: MappingService;\n\n beforeEach(() => {\n mappingService = new MappingService();\n const profile = new ProductMappingProfile();\n mappingService.registerProfile(profile);\n });\n\n it('should map input to response correctly', () => {\n // arrange\n const input: IProductMappingInput = {\n id: '1',\n barcode: '123',\n name: 'Product A',\n categoryId: 'cat-1',\n createdAt: new Date('2026-01-01'),\n };\n\n // act\n const result = mappingService.map(PRODUCT_MAPPING_KEY, input);\n\n // assert\n expect(result).toBeInstanceOf(ProductResponse);\n expect(result.id).toBe('1');\n expect(result.barcode).toBe('123');\n expect(result.name).toBe('Product A');\n });\n\n});\n```\n\n## Test Conventions\n\n### Comments\n\n```typescript\n// Use AAA comments:\n// arrange \u2014 set up test data and mocks\n// act \u2014 call the method under test\n// act & assert \u2014 when the assertion is on the thrown error\n// assert \u2014 verify the outcome\n```\n\n### Regions\n\n```typescript\ndescribe('MyClass', () => {\n\n // #region Fields\n let service: MyService;\n // #endregion\n\n // #region Methods\n beforeEach(() => { ... });\n\n describe('methodName', () => { ... });\n // #endregion\n\n});\n```\n\n### Naming\n\n- `describe` blocks: Class name or method name\n- `it` blocks: `'should <expected behavior> when <condition>'`\n\n## Rules\n\n1. **Every public service method needs at least one happy-path and one failure-path test.**\n2. **Use `vi.restoreAllMocks()` in `beforeEach`** \u2014 prevent mock leakage between tests.\n3. **Mock at the boundary** \u2014 mock repositories in service tests, mock delegates in repository tests.\n4. **AAA pattern** \u2014 clearly separate arrange, act, assert with comments.\n5. **`vi.mock()` for modules must appear before imports** of the mocked module.\n6. **No real database in unit tests** \u2014 use mocks. Use Testcontainers for integration tests.\n7. **Assert on behavior, not implementation** \u2014 verify return values and thrown errors, not internal calls\n (unless the call IS the behavior, e.g., verifying a repository was called).\n8. **Use `mockResolvedValue` / `mockRejectedValue`** for async mocks.\n";